private void SearchGUI() { { RootMode nextMode = (RootMode)EnumGUILayout.EnumField("Mode", m_Params.RootMode); if (nextMode != m_Params.RootMode) { m_SelfUndoTarget.MarkDirty("Switched mode"); m_Params.RootMode = nextMode; m_SearchQueued = true; } } EditorGUILayout.Space(); switch (m_Params.RootMode) { case RootMode.Entity: EntityParamsGUI(); break; case RootMode.Table: TableParamsGUI(); break; } GUILayout.FlexibleSpace(); if (Event.current.isKey && Event.current.keyCode == KeyCode.F5) { m_SearchQueued = true; } if (GUILayout.Button("Perform Search (F5)")) { m_SearchQueued = true; } }
static private void DoResolvableValueData(UndoTarget inUndo, GUIContent inLabel, RSResolvableValueData ioValue, RSTypeInfo inExpectedType, RSValue inDefaultValue, RSValidationFlags inFlags, RSValidationContext inContext) { EditorGUILayout.BeginVertical(); bool bDisallowDirectValue = (inExpectedType == null || inExpectedType == RSBuiltInTypes.Any || inFlags.Has(RSValidationFlags.DisallowDirectValue)); ResolvableValueMode nextMode = ListGUILayout.Popup(inLabel, ioValue.Mode, RSEditorUtility.GetResolvableValueModes(inExpectedType, inFlags, inContext)); if (nextMode != ioValue.Mode) { inUndo.MarkDirty("Changed Resolvable Value Mode"); ioValue.Mode = nextMode; switch (nextMode) { case ResolvableValueMode.Argument: RSResolvableValueData.SetAsArgument(ref ioValue); break; case ResolvableValueMode.Query: RSResolvableValueData.SetAsQuery(ref ioValue, new EntityScopedIdentifier(EntityScopeData.Self(), 0)); break; case ResolvableValueMode.Value: RSResolvableValueData.SetAsValue(ref ioValue, inDefaultValue); break; case ResolvableValueMode.Register: RSResolvableValueData.SetAsRegister(ref ioValue, RegisterIndex.Register0); break; } } using (new EditorGUI.IndentLevelScope()) { switch (ioValue.Mode) { case ResolvableValueMode.Argument: { if (inContext.Trigger == null) { EditorGUILayout.HelpBox("No parameter available: No Trigger", MessageType.Error); } else if (inContext.Trigger.ParameterType == null) { EditorGUILayout.HelpBox(string.Format("No parameter available - Trigger {0} has no parameter", inContext.Trigger.Name), MessageType.Error); } else if (inExpectedType != null && !inContext.Trigger.ParameterType.Type.CanConvert(inExpectedType)) { EditorGUILayout.HelpBox(string.Format("No parameter available - Trigger {0} has incompatible parameter type {1}, which cannot convert to {2}", inContext.Trigger.Name, inContext.Trigger.ParameterType.Type, inExpectedType), MessageType.Error); } break; } case ResolvableValueMode.Value: { if (bDisallowDirectValue) { EditorGUILayout.HelpBox("Cannot specify a value in this context", MessageType.Error); } else { RSValue nextValue = ValueGUILayout.RSValueField(EditorGUIUtility.TrTempContent(inExpectedType.FriendlyName), ioValue.Value, inExpectedType, inFlags, inContext); if (nextValue != ioValue.Value) { inUndo.MarkDirty("Changed Resolvable Value Value"); ioValue.Value = nextValue; } } break; } case ResolvableValueMode.Register: { RegisterIndex nextRegister = (RegisterIndex)EnumGUILayout.EnumField(Content.ResolvableValueRegisterLabel, ioValue.Register); if (nextRegister != ioValue.Register) { inUndo.MarkDirty("Changed Resolvable Value Register"); ioValue.Register = nextRegister; } break; } case ResolvableValueMode.Query: { EntityScopedIdentifier query = ValueGUILayout.QueryField(Content.ResolvableValueQueryLabel, ioValue.Query, inExpectedType, inFlags.ForMethod(true), inContext); RSQueryInfo queryInfo = inContext.Library.GetQuery(query.Id); if (query != ioValue.Query) { bool bChangedId = query.Id != ioValue.Query.Id; inUndo.MarkDirty("Changed Resolvable Value Query", true); ioValue.Query = query; if (bChangedId) { if (queryInfo == null) { ioValue.QueryArguments = null; } else { queryInfo.PopulateDefaultArguments(ioValue); } } } int currentArgsLength = 0; if (ioValue.QueryArguments != null) { currentArgsLength = ioValue.QueryArguments.Length; } int desiredArgsLength = 0; if (queryInfo != null && queryInfo.Parameters != null) { desiredArgsLength = queryInfo.Parameters.Length; } if (desiredArgsLength == 0 && ioValue.QueryArguments != null) { inUndo.MarkDirtyWithoutUndo("Resizing Arguments", true); ioValue.QueryArguments = null; } else if (desiredArgsLength > 0 && currentArgsLength != desiredArgsLength) { inUndo.MarkDirtyWithoutUndo("Resizing Arguments", true); queryInfo.PopulateDefaultArguments(ioValue, currentArgsLength); } if (ioValue.QueryArguments != null && ioValue.QueryArguments.Length > 0) { using (new EditorGUI.IndentLevelScope()) { EditorGUILayout.Space(); EditorGUILayout.LabelField(Content.ResolvableValueQueryArgsLabel, RSGUIStyles.SubHeaderStyle); for (int i = 0; i < ioValue.QueryArguments.Length && i < queryInfo.Parameters.Length; ++i) { NestedValue nextValue = ValueGUILayout.NestedParameterField(queryInfo.Parameters[i], ioValue.QueryArguments[i], inFlags, inContext); if (nextValue != ioValue.QueryArguments[i]) { inUndo.MarkDirty("Changed Resolvable Value Query Argument"); ioValue.QueryArguments[i] = nextValue; } } } } break; } } } EditorGUILayout.EndVertical(); }
static private EntityScopeData DoEntityScopeField(GUIContent inLabel, EntityScopeData inScope, RSValidationFlags inFlags, RSValidationContext inContext) { bool bForceFirst = inFlags.Has(RSValidationFlags.RequireSingleEntity); EditorGUILayout.BeginVertical(); EntityScopeType currentType = inScope.Type; EntityScopeType nextType = ListGUILayout.Popup(inLabel, inScope.Type, RSEditorUtility.s_EntityScopeTypes); RSEntityId entityId = RSEntityId.Null; RSGroupId groupId = RSGroupId.Null; string search = string.Empty; bool useFirst = bForceFirst; string links = string.Empty; bool useFirstLinks = bForceFirst; RegisterIndex register = RegisterIndex.Register0; using (new EditorGUI.IndentLevelScope()) { switch (currentType) { case EntityScopeType.ObjectById: { entityId = RSEditorUtility.EditorPlugin.EntityIdGUIField(Content.EntityScopeEntityIdLabel, inScope.IdArg, inContext.Manager); if (entityId == RSEntityId.Null && !inFlags.Has(RSValidationFlags.AllowNullEntity)) { EditorGUILayout.HelpBox("Null entity not allowed in this context", MessageType.Error); } break; } case EntityScopeType.ObjectInRegister: { if (inFlags.Has(RSValidationFlags.DisallowRegisters)) { EditorGUILayout.HelpBox("Local vars not allowed in this context", MessageType.Error); } else { register = inScope.RegisterArg; register = (RegisterIndex)EnumGUILayout.EnumField(Content.EntityScopeRegisterLabel, register); } break; } case EntityScopeType.ObjectsWithGroup: { groupId = inScope.GroupArg; useFirst = bForceFirst || inScope.UseFirst; using (new EditorGUILayout.HorizontalScope()) { groupId = LibraryGUILayout.GroupSelector(Content.EntityScopeGroupLabel, groupId, inContext.Library); using (new EditorGUI.DisabledScope(bForceFirst)) using (new RSGUI.LabelWidthScope(100)) { useFirst = EditorGUILayout.Toggle(Content.EntityScopeGroupLabel, useFirst, GUILayout.Width(120)); } } break; } case EntityScopeType.ObjectsWithName: case EntityScopeType.ObjectsWithPrefab: { search = inScope.SearchArg; useFirst = bForceFirst || inScope.UseFirst; using (new EditorGUILayout.HorizontalScope()) { search = EditorGUILayout.TextField(currentType == EntityScopeType.ObjectsWithName ? Content.EntityScopeNameLabel : Content.EntityScopePrefabLabel, search); using (new EditorGUI.DisabledScope(bForceFirst)) using (new RSGUI.LabelWidthScope(100)) { useFirst = EditorGUILayout.Toggle(Content.EntityScopeUseFirstLabel, useFirst, GUILayout.Width(120)); } } break; } case EntityScopeType.Null: { if (!inFlags.Has(RSValidationFlags.AllowNullEntity)) { EditorGUILayout.HelpBox("Null entity not allowed in this context", MessageType.Error); } break; } case EntityScopeType.Invalid: { EditorGUILayout.HelpBox("Missing entity not allowed", MessageType.Error); break; } case EntityScopeType.Global: { if (!inFlags.Has(RSValidationFlags.AllowGlobalEntity)) { EditorGUILayout.HelpBox("Global entity not allowed in this context", MessageType.Error); } break; } case EntityScopeType.Argument: { if (inContext.Trigger == null) { EditorGUILayout.HelpBox("No argument available: No Trigger", MessageType.Error); } else if (inContext.Trigger.ParameterType == null) { EditorGUILayout.HelpBox(string.Format("No argument available: Trigger {0} has no argument", inContext.Trigger.Name), MessageType.Error); } else if (!inContext.Trigger.ParameterType.Type.CanConvert(RSBuiltInTypes.Entity)) { EditorGUILayout.HelpBox(string.Format("No argument available: Trigger {0} has incompatible argument type {1}, which cannot convert to an Entity", inContext.Trigger.Name, inContext.Trigger.ParameterType.Type), MessageType.Error); } break; } } if (inScope.SupportsLinks()) { links = inScope.LinksArg; useFirstLinks = bForceFirst || inScope.UseFirstLink; using (new EditorGUILayout.HorizontalScope()) { links = EditorGUILayout.TextField(Content.EntityScopeLinksLabel, links); using (new EditorGUI.DisabledScope(bForceFirst)) using (new RSGUI.LabelWidthScope(100)) { useFirstLinks = EditorGUILayout.Toggle(Content.EntityScopeUseFirstLinkLabel, useFirstLinks, GUILayout.Width(120)); } } } } EditorGUILayout.EndVertical(); switch (nextType) { case EntityScopeType.Self: return(EntityScopeData.Self().WithLinks(links, useFirstLinks)); case EntityScopeType.Argument: return(EntityScopeData.Argument().WithLinks(links, useFirstLinks)); case EntityScopeType.Global: return(EntityScopeData.Global()); case EntityScopeType.ObjectById: return(EntityScopeData.Entity(entityId).WithLinks(links, useFirstLinks)); case EntityScopeType.ObjectInRegister: return(EntityScopeData.Register(register).WithLinks(links, useFirstLinks)); case EntityScopeType.ObjectsWithGroup: return(EntityScopeData.WithGroup(groupId, useFirst).WithLinks(links, useFirstLinks)); case EntityScopeType.ObjectsWithName: return(EntityScopeData.WithName(search, useFirst).WithLinks(links, useFirstLinks)); case EntityScopeType.ObjectsWithPrefab: return(EntityScopeData.WithPrefab(search, useFirst).WithLinks(links, useFirstLinks)); case EntityScopeType.Invalid: return(EntityScopeData.Invalid()); case EntityScopeType.Null: default: return(EntityScopeData.Null()); } }
static private NestedValue DoNestedValueField(GUIContent inLabel, NestedValue inValue, RSTypeInfo inExpectedType, RSValue inDefaultValue, RSValidationFlags inFlags, RSValidationContext inContext) { EditorGUILayout.BeginVertical(); ResolvableValueMode nextType = ListGUILayout.Popup(inLabel, inValue.Mode, RSEditorUtility.GetResolvableValueModes(inExpectedType, inFlags, inContext)); RSValue value = inDefaultValue; EntityScopedIdentifier query = new EntityScopedIdentifier(EntityScopeData.Self(), 0); RegisterIndex register = RegisterIndex.Register0; using (new EditorGUI.IndentLevelScope()) { switch (inValue.Mode) { case ResolvableValueMode.Argument: { if (inContext.Trigger == null) { EditorGUILayout.HelpBox("No parameter available: No Trigger", MessageType.Error); } else if (inContext.Trigger.ParameterType == null) { EditorGUILayout.HelpBox(string.Format("No parameter available - Trigger {0} has no parameter", inContext.Trigger.Name), MessageType.Error); } else if (inExpectedType != null && !inContext.Trigger.ParameterType.Type.CanConvert(inExpectedType)) { EditorGUILayout.HelpBox(string.Format("No parameter available - Trigger {0} has incompatible parameter type {1}, which cannot convert to {2}", inContext.Trigger.Name, inContext.Trigger.ParameterType.Type, inExpectedType), MessageType.Error); } break; } case ResolvableValueMode.Value: { if (inExpectedType == null || inExpectedType == RSBuiltInTypes.Any || inFlags.Has(RSValidationFlags.DisallowDirectValue)) { EditorGUILayout.HelpBox("Cannot specify a value in this context", MessageType.Error); } else { value = RSValueField(EditorGUIUtility.TrTempContent(inExpectedType.FriendlyName), inValue.Value, inExpectedType, inFlags, inContext); } break; } case ResolvableValueMode.Query: { query = ValueGUILayout.QueryField(RuleGUILayout.Content.ResolvableValueQueryLabel, inValue.Query, inExpectedType, inFlags.ForMethod(false), inContext); break; } case ResolvableValueMode.Register: { register = (RegisterIndex)EnumGUILayout.EnumField(RuleGUILayout.Content.ResolvableValueRegisterLabel, inValue.Register); break; } } } EditorGUILayout.EndVertical(); switch (nextType) { case ResolvableValueMode.Argument: return(NestedValue.FromArgument()); case ResolvableValueMode.Query: return(NestedValue.FromQuery(query)); case ResolvableValueMode.Register: return(NestedValue.FromRegister(register)); case ResolvableValueMode.Value: default: return(NestedValue.FromValue(value)); } }
static private RSValue DoRSValueField(GUIContent inLabel, RSValue inValue, RSTypeInfo inExpectedType, RSValidationFlags inFlags, RSValidationContext inContext) { Type systemType = inExpectedType.SystemType; if (systemType.IsEnum) { Enum currentValue; try { currentValue = inValue.AsEnum(); } catch (Exception e) { Debug.LogException(e); currentValue = inExpectedType.DefaultValue.AsEnum(); } Enum nextValue = EnumGUILayout.EnumField(inLabel, currentValue); return(RSValue.FromEnum(nextValue)); } if (inExpectedType == RSBuiltInTypes.Int) { int currentValue = inValue.AsInt; int nextValue = EditorGUILayout.DelayedIntField(inLabel, currentValue); return(RSValue.FromInt(nextValue)); } else if (inExpectedType == RSBuiltInTypes.Float) { float currentValue = inValue.AsFloat; float nextValue = EditorGUILayout.DelayedFloatField(inLabel, currentValue); return(RSValue.FromFloat(nextValue)); } else if (inExpectedType == RSBuiltInTypes.Bool) { bool currentValue = inValue.AsBool; bool nextValue = EditorGUILayout.Toggle(inLabel, currentValue); return(RSValue.FromBool(nextValue)); } else if (inExpectedType == RSBuiltInTypes.Color) { Color currentValue = inValue.AsColor; Color nextValue = EditorGUILayout.ColorField(inLabel, currentValue); return(RSValue.FromColor(nextValue)); } else if (inExpectedType == RSBuiltInTypes.String) { string currentValue = inValue.AsString; string nextValue = EditorGUILayout.TextField(inLabel, currentValue); return(RSValue.FromString(nextValue)); } else if (inExpectedType == RSBuiltInTypes.Vector2) { Vector2 currentValue = inValue.AsVector2; Vector2 nextValue = EditorGUILayout.Vector2Field(inLabel, currentValue); return(RSValue.FromVector2(nextValue)); } else if (inExpectedType == RSBuiltInTypes.Vector3) { Vector3 currentValue = inValue.AsVector3; Vector3 nextValue = EditorGUILayout.Vector3Field(inLabel, currentValue); return(RSValue.FromVector3(nextValue)); } else if (inExpectedType == RSBuiltInTypes.Vector4) { Vector4 currentValue = inValue.AsVector4; Vector4 nextValue = EditorGUILayout.Vector4Field(inLabel, currentValue); return(RSValue.FromVector4(nextValue)); } else if (inExpectedType == RSBuiltInTypes.Entity) { EntityScopeData currentValue = inValue.AsEntity; EntityScopeData nextValue = EntityScopeField(inLabel, currentValue, inFlags.ForEntityValue(), inContext); return(RSValue.FromEntity(nextValue)); } else if (inExpectedType == RSBuiltInTypes.GroupId) { RSGroupId currentValue = inValue.AsGroupId; RSGroupId nextValue = LibraryGUILayout.GroupSelector(inLabel, currentValue, inContext.Library); return(RSValue.FromGroupId(nextValue)); } else if (inExpectedType == RSBuiltInTypes.TriggerId) { RSTriggerId currentValue = inValue.AsTriggerId; RSTypeInfo restrictTriggerType = inContext.Parameter?.TriggerParameterType; RSTriggerId nextValue; if (restrictTriggerType != null) { nextValue = LibraryGUILayout.TriggerSelector(inLabel, currentValue, restrictTriggerType, inContext.Library); } else { nextValue = LibraryGUILayout.TriggerSelector(inLabel, currentValue, inContext.Library); } return(RSValue.FromTriggerId(nextValue)); } else { EditorGUILayout.HelpBox(string.Format("Unable to display editor for type {0}", inExpectedType), MessageType.Error); } return(inValue); }
private void TableParamsGUI() { { TableMode nextMode = (TableMode)EnumGUILayout.EnumField("Search Type", m_Params.TableParams.Mode); if (nextMode != m_Params.TableParams.Mode) { m_SelfUndoTarget.MarkDirty("Switched entity search mode"); m_Params.TableParams.Mode = nextMode; m_Params.TableParams.Clear(); m_SearchQueued = true; } } switch (m_Params.TableParams.Mode) { case TableMode.Action: { int nextAction = LibraryGUILayout.ActionSelector(s_ActionLabel, m_Params.TableParams.ElementSearchId, m_Library); if (nextAction != m_Params.TableParams.ElementSearchId) { m_SelfUndoTarget.MarkDirty("Changed action id"); m_Params.TableParams.ElementSearchId = nextAction; m_SearchQueued = true; } break; } case TableMode.Query: { int nextQuery = LibraryGUILayout.QuerySelector(s_QueryLabel, m_Params.TableParams.ElementSearchId, false, m_Library); if (nextQuery != m_Params.TableParams.ElementSearchId) { m_SelfUndoTarget.MarkDirty("Changed query id"); m_Params.TableParams.ElementSearchId = nextQuery; m_SearchQueued = true; } break; } case TableMode.Trigger: { int nextTrigger = (int)LibraryGUILayout.TriggerSelector(s_TriggerLabel, new RSTriggerId(m_Params.TableParams.ElementSearchId), m_Library); if (nextTrigger != m_Params.TableParams.ElementSearchId) { m_SelfUndoTarget.MarkDirty("Changed trigger id"); m_Params.TableParams.ElementSearchId = nextTrigger; m_SearchQueued = true; } break; } case TableMode.Entity: { RSEntityId entityId = RSEditorUtility.EditorPlugin.EntityIdGUIField(s_EntityLabel, m_Params.TableParams.EntitySearch, m_EntityMgr); if (entityId != m_Params.TableParams.EntitySearch) { m_SelfUndoTarget.MarkDirty("Changed entity search"); m_Params.TableParams.EntitySearch = entityId; m_SearchQueued = true; } break; } case TableMode.String: { string nextString = EditorGUILayout.TextField("Search", m_Params.TableParams.StringSearch); if (nextString != m_Params.TableParams.StringSearch) { m_SelfUndoTarget.MarkDirty("Changed string search"); m_Params.TableParams.StringSearch = nextString; m_SearchQueued = true; } break; } } }
private void EntityParamsGUI() { { EntityMode nextMode = (EntityMode)EnumGUILayout.EnumField("Search Type", m_Params.EntityParams.Mode); if (nextMode != m_Params.EntityParams.Mode) { m_SelfUndoTarget.MarkDirty("Switched entity search mode"); m_Params.EntityParams.Mode = nextMode; m_Params.EntityParams.Clear(); m_SearchQueued = true; } } switch (m_Params.EntityParams.Mode) { case EntityMode.Id: { int nextId = EditorGUILayout.IntField("Entity Id", m_Params.EntityParams.EntityIdSearch); if (nextId != m_Params.EntityParams.EntityIdSearch) { m_SelfUndoTarget.MarkDirty("Switched entity id search"); m_Params.EntityParams.EntityIdSearch = nextId; m_SearchQueued = true; } break; } case EntityMode.LinkId: { string nextLink = EditorGUILayout.TextField("Link Id", m_Params.EntityParams.StringSearch); if (nextLink != m_Params.EntityParams.StringSearch) { m_SelfUndoTarget.MarkDirty("Switched link search"); m_Params.EntityParams.StringSearch = nextLink; m_SearchQueued = true; } break; } case EntityMode.LinkEntity: { RSEntityId entityId = RSEditorUtility.EditorPlugin.EntityIdGUIField(s_EntityLabel, m_Params.EntityParams.EntityRefSearch, m_EntityMgr); if (entityId != m_Params.EntityParams.EntityRefSearch) { m_SelfUndoTarget.MarkDirty("Changed entity search"); m_Params.EntityParams.EntityRefSearch = entityId; m_SearchQueued = true; } break; } case EntityMode.Name: { string nextName = EditorGUILayout.TextField("Name", m_Params.EntityParams.StringSearch); if (nextName != m_Params.EntityParams.StringSearch) { m_SelfUndoTarget.MarkDirty("Switched name search"); m_Params.EntityParams.StringSearch = nextName; m_SearchQueued = true; } break; } case EntityMode.PrefabName: { string nextPrefab = EditorGUILayout.TextField("Prefab Name", m_Params.EntityParams.StringSearch); if (nextPrefab != m_Params.EntityParams.StringSearch) { m_SelfUndoTarget.MarkDirty("Switched prefab name search"); m_Params.EntityParams.StringSearch = nextPrefab; m_SearchQueued = true; } break; } case EntityMode.Table: { EditorGUILayout.HelpBox("Not yet implemented", MessageType.Warning); break; } } }