private void DoInspectorModifierGUI(NodeGUI node)
{
EditorGUILayout.HelpBox("Modifier: Modify asset settings.", MessageType.Info);
UpdateNodeName(node);
GUILayout.Space(10f);
using (new EditorGUILayout.VerticalScope(GUI.skin.box)) {
Type incomingType = FindIncomingAssetType(node.Data.InputPoints[0]);
if(incomingType == null) {
// if there is no asset input to determine incomingType,
// retrieve from assigned Modifier.
incomingType = ModifierUtility.GetModifierTargetType(node.Data.ScriptClassName);
if(incomingType == null) {
EditorGUILayout.HelpBox("Modifier needs a single type of incoming assets.", MessageType.Info);
return;
}
}
var map = ModifierUtility.GetAttributeClassNameMap(incomingType);
if(map.Count > 0) {
using(new GUILayout.HorizontalScope()) {
GUILayout.Label("Modifier");
var guiName = ModifierUtility.GetModifierGUIName(node.Data.ScriptClassName);
if (GUILayout.Button(guiName, "Popup", GUILayout.MinWidth(150f))) {
var builders = map.Keys.ToList();
if(builders.Count > 0) {
NodeGUI.ShowTypeNamesMenu(guiName, builders, (string selectedGUIName) =>
{
using(new RecordUndoScope("Change Modifier class", node, true)) {
m_modifier = ModifierUtility.CreateModifier(selectedGUIName, incomingType);
if(m_modifier != null) {
node.Data.ScriptClassName = ModifierUtility.GUINameToClassName(selectedGUIName, incomingType);
node.Data.InstanceData[currentEditingGroup] = m_modifier.Serialize();
}
}
}
);
}
}
}
} else {
string[] menuNames = AssetBundleGraphSettings.GUI_TEXT_MENU_GENERATE_MODIFIER.Split('/');
EditorGUILayout.HelpBox(
string.Format(
"No CustomModifier found for {3} type. \n" +
"You need to create at least one Modifier script to select script for Modifier. " +
"To start, select {0}>{1}>{2} menu and create a new script.",
menuNames[1],menuNames[2], menuNames[3], incomingType.FullName
), MessageType.Info);
}
GUILayout.Space(10f);
if(DrawPlatformSelector(node)) {
// if platform tab is changed, renew modifierModifierInstance for that tab.
m_modifier = null;
}
using (new EditorGUILayout.VerticalScope()) {
var disabledScope = DrawOverrideTargetToggle(node, node.Data.InstanceData.ContainsValueOf(currentEditingGroup), (bool enabled) => {
if(enabled) {
node.Data.InstanceData[currentEditingGroup] = node.Data.InstanceData.DefaultValue;
} else {
node.Data.InstanceData.Remove(currentEditingGroup);
}
m_modifier = null;
});
using (disabledScope) {
//reload modifierModifier instance from saved modifierModifier data.
if (m_modifier == null) {
m_modifier = ModifierUtility.CreateModifier(node.Data, currentEditingGroup);
if(m_modifier != null) {
node.Data.ScriptClassName = m_modifier.GetType().FullName;
if(node.Data.InstanceData.ContainsValueOf(currentEditingGroup)) {
node.Data.InstanceData[currentEditingGroup] = m_modifier.Serialize();
}
}
}
if (m_modifier != null) {
Action onChangedAction = () => {
using(new RecordUndoScope("Change Modifier Setting", node)) {
node.Data.ScriptClassName = m_modifier.GetType().FullName;
if(node.Data.InstanceData.ContainsValueOf(currentEditingGroup)) {
node.Data.InstanceData[currentEditingGroup] = m_modifier.Serialize();
}
}
};
m_modifier.OnInspectorGUI(onChangedAction);
}
}
}
}
}