private void OnEnable() { // catch refrences appliedSeachFilters = new EditorFilters(); MyData = new SessionData(); // Reload Profiles capturedControllerObj = RuleSystemUtil.CollectRuleSytemObjects(); }
/// <summary> /// Creates a searchbar that recognizes <see cref="EditorFilter"/> and returns updated <see cref="EditorFilters"/>. /// </summary> /// <param name="filters"> Object containing filters for searchbar</param> /// <param name="skin">Custom editor skin</param> /// <returns>updated filters</returns> private static EditorFilters DrawFilterableSearchbar(EditorFilters filters, Filter[] availableFilters, GUISkin skin) { GUILayout.BeginHorizontal(GUILayout.Height(25)); GUILayout.Label("", skin.GetStyle("Search"), GUILayout.Width(25)); filters.Search = GUILayout.TextField(filters.Search, skin.textField, GUILayout.Width(150)); if (GUILayout.Button("", skin.GetStyle("FilterManager"), GUILayout.Width(20), GUILayout.Height(25))) { EditorLabelManager window = EditorWindow.GetWindow <EditorLabelManager>(); window.ShowUtility(); } GUILayout.EndHorizontal(); if (filters.Search != string.Empty) { foreach (Filter filter in availableFilters) { if (filter.Name.ToUpper().Contains(filters.Search.ToUpper())) { var prevBg = GUI.backgroundColor; GUI.backgroundColor = filter.Color; Vector2 textDimension = skin.GetStyle("Filter").CalcSize(new GUIContent(filter.Name)); GUILayout.Label("Found Filters: "); if (GUILayout.Button(filter.Name, skin.GetStyle("Filter"), GUILayout.Width(150), GUILayout.Width(textDimension.x))) { filters.Filters.Add(filter); filters.Search = string.Empty; } GUI.backgroundColor = prevBg; } } } if (filters.Filters.Count > 0) { GUILayout.Label("Filters:"); GUILayout.BeginHorizontal(GUILayout.MaxWidth(150)); foreach (Filter appliedFilter in filters.Filters) { Vector2 textDimension = skin.GetStyle("Filter").CalcSize(new GUIContent(appliedFilter.Name)); var prevBg = GUI.backgroundColor; GUI.backgroundColor = appliedFilter.Color; if (GUILayout.Button(appliedFilter.Name, skin.GetStyle("Filter"), GUILayout.Width(textDimension.x))) { filters.Filters.Remove(appliedFilter); break; } GUI.backgroundColor = prevBg; } GUILayout.EndHorizontal(); } filters.Search.Trim(); return(filters); }
/// <summary> /// Draw's button list of objects with a <see cref="RuleController"/> in defined area. /// </summary> /// <param name="controllerObjs">Array of controllers that should be drawn.</param> /// <param name="layoutArea">Designated area where controllers are drawn into.</param> /// <param name="appliedFilters">Search filters applied to Library.</param> /// <param name="skin"><see cref="GUISkin"/> style for GUI elements.</param> /// <returns>Serialized controller if user selects one. Else null is returned.</returns> public static SerializedObject DrawControllerLayout(SerializedObject[] controllerObjs, Rect layoutArea, ref SessionData data, ref EditorFilters appliedFilters, GUISkin skin) { List <SerializedObject> controllersToDraw = new List <SerializedObject>(); GUILayout.BeginArea(layoutArea, skin.window); // Draw Searchbar appliedFilters = DrawFilterableSearchbar(appliedFilters, RuleEditorSettings.Instance.ProfileFilters, skin); // apply filters controllersToDraw = FilterControllers(controllerObjs, appliedFilters); GUILayout.Space(15); // Draw controllers. foreach (TypeFilter controllerType in Enum.GetValues(typeof(TypeFilter))) { List <SerializedObject> controllersByType = new List <SerializedObject>(); foreach (SerializedObject controller in controllersToDraw) { if ((controller.targetObject as RuleController).Profile.MyFilters.Type == controllerType) { controllersByType.Add(controller); } } if (controllersByType.Count > 0) { if (!data.isProfileTypeToggled.ContainsKey(controllerType)) { data.isProfileTypeToggled.Add(controllerType, false); } data.isProfileTypeToggled[controllerType] = GUILayout.Toggle(data.isProfileTypeToggled[controllerType], controllerType.ToString(), skin.toggle, GUILayout.Height(20)); GUILayout.Label("", skin.GetStyle("HorizontalDivider")); if (data.isProfileTypeToggled[controllerType]) { foreach (SerializedObject controller in controllersByType) { var prevBG = GUI.backgroundColor; if (data.selectedController != null && data.selectedController.targetObject == controller.targetObject) { GUI.backgroundColor = Color.green; } skin.button.normal.textColor = (PrefabUtility.GetPrefabParent(controller.targetObject) == null) ? Color.cyan : Color.white; if (GUILayout.Button(controller.targetObject.name, skin.button, GUILayout.Height(25))) { return(controller); } skin.button.normal.textColor = Color.white; GUI.backgroundColor = prevBG; } } } } GUILayout.EndArea(); return(null); }
/// <summary> /// Creates a <see cref="SerializedObject"/> list of controllers when <see cref="EditorFilters"/> are applied. /// </summary> /// <param name="controllerPool">Pool of controllers that should be filtered.</param> /// <param name="filters"></param> /// <returns>Filtered List.</returns> private static List <SerializedObject> FilterControllers(SerializedObject[] controllerPool, EditorFilters filters) { List <SerializedObject> filteredControllers = new List <SerializedObject>(); List <SerializedObject> searchedControllers = new List <SerializedObject>(); if (filters.Filters.Count > 0) { foreach (SerializedObject controller in controllerPool) { var objFilters = (controller.targetObject as RuleController).Profile.MyFilters; foreach (Filter appliedFilter in filters.Filters) { if (objFilters.Filters.Contains(appliedFilter)) { filteredControllers.Add(controller); break; } } } } if (filters.Search.Length > 0) { List <SerializedObject> controllersToSearch = new List <SerializedObject>(); // if no filter. then search through all controllers if (filteredControllers.Count == 0) { controllersToSearch.AddRange(controllerPool); } else { controllersToSearch.AddRange(filteredControllers); filteredControllers.Clear(); } foreach (SerializedObject controller in controllersToSearch) { if (controller.targetObject.name.ToUpper().Contains(filters.Search.ToUpper())) { searchedControllers.Add(controller); } } } if (filteredControllers.Count > 0) { return(filteredControllers); } if (searchedControllers.Count > 0) { return(searchedControllers); } else if (filters.Filters.Count > 0 || filters.Search.Length > 0) { return(new List <SerializedObject>()); } else { return(new List <SerializedObject>(controllerPool)); } }