public void AssignColorsToSelection(GameObject gameObject, ColorSet colorSet) { recursiveLevel++; if (gameObject.GetComponent <UnityEngine.UI.Button>()) { UnityEngine.UI.Button button = gameObject.GetComponent <UnityEngine.UI.Button>(); SetColorBlock(button, colorSet); SetDetailColor(gameObject, colorSet); EditorUtility.SetDirty(button); } else if (gameObject.GetComponent <UnityEngine.UI.InputField>()) { UnityEngine.UI.InputField input = gameObject.GetComponent <UnityEngine.UI.InputField>(); SetColorBlock(input, colorSet); input.selectionColor = colorSet.highlighted; Undo.RecordObject(input.textComponent, "Change Text color"); input.textComponent.color = colorSet.pressed; Undo.RecordObject(input.placeholder, "Change Placeholder color"); input.placeholder.color = colorSet.highlighted; EditorUtility.SetDirty(input); EditorUtility.SetDirty(input.textComponent); EditorUtility.SetDirty(input.placeholder); } else if (gameObject.GetComponent <UnityEngine.UI.Scrollbar>()) { UnityEngine.UI.Scrollbar sb = gameObject.GetComponent <UnityEngine.UI.Scrollbar>(); SetColorBlock(sb, colorSet); Undo.RecordObject(gameObject.GetComponent <UnityEngine.UI.Image>(), "Change Image color"); gameObject.GetComponent <UnityEngine.UI.Image>().color = colorSet.disabled; EditorUtility.SetDirty(sb); EditorUtility.SetDirty(gameObject.GetComponent <UnityEngine.UI.Image>()); } else if (gameObject.GetComponent <UnityEngine.UI.Slider>()) { UnityEngine.UI.Slider slider = gameObject.GetComponent <UnityEngine.UI.Slider>(); SetColorBlock(slider, colorSet); Undo.RecordObject(slider.fillRect.gameObject.GetComponent <UnityEngine.UI.Image>(), "Change Image color"); slider.fillRect.gameObject.GetComponent <UnityEngine.UI.Image>().color = colorSet.normal; SetTextColorRecursive(gameObject, colorSet); EditorUtility.SetDirty(slider); EditorUtility.SetDirty(slider.fillRect.gameObject.GetComponent <UnityEngine.UI.Image>()); } else if (gameObject.GetComponent <UnityEngine.UI.Toggle>()) { UnityEngine.UI.Toggle toggle = gameObject.GetComponent <UnityEngine.UI.Toggle>(); SetColorBlock(toggle, colorSet); Undo.RecordObject(toggle.graphic, "Change Image color"); toggle.graphic.color = colorSet.normal; SetTextColorRecursive(gameObject, colorSet); EditorUtility.SetDirty(toggle); EditorUtility.SetDirty(toggle.graphic); } else if (gameObject.transform.childCount > 0) // Recursive search for components { for (int i = 0; i < gameObject.transform.childCount; i++) { AssignColorsToSelection(gameObject.transform.GetChild(i).gameObject, colorSet); } } else if (recursiveLevel == 1) { if (gameObject.GetComponent <UnityEngine.UI.Image>()) { UnityEngine.UI.Image image = gameObject.GetComponent <UnityEngine.UI.Image>(); Undo.RecordObject(image, "Change color"); image.color = colorSet.normal; EditorUtility.SetDirty(image); } else if (gameObject.GetComponent <UnityEngine.UI.Text>()) { UnityEngine.UI.Text text = gameObject.GetComponent <UnityEngine.UI.Text>(); Undo.RecordObject(text, "Change color"); text.color = colorSet.normal; EditorUtility.SetDirty(text); } } }
void OnGUI() { if (theme == null) { FindTheme(); } //Checks if there is any style not initialized SetStyles(); scrollPos = EditorGUILayout.BeginScrollView(scrollPos); EditorGUI.BeginChangeCheck(); Undo.RecordObject(theme, "Content change in theme"); GUILayout.BeginHorizontal(); GamestrapTheme newTheme = (GamestrapTheme)EditorGUILayout.ObjectField(theme, typeof(GamestrapTheme), false); if (theme != newTheme) { string assetPathAndName = AssetDatabase.GetAssetPath(newTheme); EditorPrefs.SetString(prefsKey, assetPathAndName); } theme = newTheme; //Save as button UI Logic SaveAs(); GUILayout.EndHorizontal(); #region Palette GUI GUILayout.Label("Palette", titleStyle); GUILayout.Label("Right click to assign color to selection"); EditorGUILayout.BeginVertical("Box"); EditorGUILayout.BeginHorizontal(); int counter = 0; foreach (ColorSet colorSet in theme.palette) { GUI.backgroundColor = colorSet.normal; // Sets the button color if (GUILayout.Button("", (colorSet == selectedColorSet) ? btnSelectedStyle : btnStyle, GUILayout.Width((position.width - 35f) / rowCount), GUILayout.Height(40))) { // To remove focus from any input field which might lead to errors GUI.FocusControl("Null"); if (Event.current.button == 1) { AssignColorsToSelection(colorSet); } else if (Event.current.button == 0) { if (colorSet == selectedColorSet) { selectedColorSet = null; } else { selectedColorSet = colorSet; } } } counter++; if (counter % rowCount == 0) { GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); } } GUI.backgroundColor = Color.white; if (GUILayout.Button("Add", btnStyle, GUILayout.Width((position.width - 20f) / rowCount), GUILayout.Height(40))) { GUI.FocusControl("Null"); Color[] baseColor = colors[UnityEngine.Random.Range(0, colors.Count - 1)]; selectedColorSet = new ColorSet(baseColor); theme.palette.Add(selectedColorSet); } GUI.backgroundColor = defaultBg; GUILayout.EndHorizontal(); if (selectedColorSet != null) { GUILayout.Box("", new GUILayoutOption[] { GUILayout.ExpandWidth(true), GUILayout.Height(1) }); GUILayout.BeginHorizontal(); GUILayout.Label("Color Details", subtitleStyle); GUI.backgroundColor = deleteColor; if (GUILayout.Button("Delete", btnStyleWhiteFont, GUILayout.Width(50f))) { theme.palette.Remove(selectedColorSet); selectedColorSet = null; } GUI.backgroundColor = defaultBg; if (GUILayout.Button("X", GUILayout.Width(20))) { selectedColorSet = null; } GUILayout.EndHorizontal(); if (selectedColorSet != null) { EditorGUILayout.BeginHorizontal(); GUILayout.Label("Name", GUILayout.Width(100)); selectedColorSet.name = EditorGUILayout.TextField(selectedColorSet.name); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); GUILayout.Label("Tag", GUILayout.Width(100)); selectedColorSet.tag = EditorGUILayout.TagField(selectedColorSet.tag); EditorGUILayout.EndHorizontal(); selectedColorSet.normal = EditorGUILayout.ColorField("Normal", selectedColorSet.normal); selectedColorSet.highlighted = EditorGUILayout.ColorField("Highlighted", selectedColorSet.highlighted); selectedColorSet.pressed = EditorGUILayout.ColorField("Pressed", selectedColorSet.pressed); selectedColorSet.disabled = EditorGUILayout.ColorField("Disabled", selectedColorSet.disabled); selectedColorSet.detail = EditorGUILayout.ColorField("Detail", selectedColorSet.detail); GUILayout.BeginHorizontal(); GUILayout.Label("Apply ColorSet to:", GUILayout.Width(125)); GUI.backgroundColor = applyColor; if (GUILayout.Button("Selected", btnStyleWhiteFont)) { AssignColorsToSelection(selectedColorSet); } GUI.backgroundColor = defaultBg; GUI.enabled = selectedColorSet.tag.Length > 0 && selectedColorSet.tag != "Untagged"; if (GUILayout.Button("Tag")) { ApplyColorSetTag(selectedColorSet); } GUI.enabled = true; GUILayout.EndHorizontal(); #region Helper color selection GUILayout.BeginHorizontal(); bool lastShowSceneColors = showSceneColors; showColors = GUILayout.Toggle(showColors, "Suggestions", "Button"); showSuggestions = GUILayout.Toggle(showSuggestions, "Schemes", "Button"); showSceneColors = GUILayout.Toggle(showSceneColors, "Scene Colors", "Button"); // If the toggle was activated, refresh and search for the new colors in scene if (showSceneColors != lastShowSceneColors && showSceneColors) { SearchSceneColors(); } GUILayout.EndHorizontal(); if (showSceneColors) { GUILayout.Label("Scene Colors", EditorStyles.boldLabel); GUI.backgroundColor = Color.black; GUILayout.BeginVertical(bgStyle); GUILayout.BeginHorizontal(); counter = 0; foreach (Color color in sceneColors) { GUI.backgroundColor = color; // Sets the button color if (GUILayout.Button("", btnStyle)) { SetColors(GetColorDefault(color)); selectedColor = color; } counter++; if (counter % 5 == 0) { // Start a new row each 5 GUILayout.EndHorizontal(); GUI.backgroundColor = Color.black; GUILayout.BeginHorizontal(); } } GUILayout.EndHorizontal(); GUI.backgroundColor = defaultBg; // Resets the color background GUILayout.EndVertical(); } if (showSuggestions) { GUILayout.Label("Color Scheme Generator", EditorStyles.boldLabel); paletteType = (SchemeType)EditorGUILayout.EnumPopup("Scheme: ", paletteType); selectedColor = EditorGUILayout.ColorField("Base:", selectedColor); GUI.backgroundColor = Color.black; GUILayout.BeginVertical(bgStyle); GUI.backgroundColor = selectedColor; // Sets the button color if (GUILayout.Button("", btnStyle)) { SetColors(GetColorDefault(selectedColor)); } Color[] paletteColors = GamestrapHelper.GetColorPalette(selectedColor, paletteType); GUILayout.BeginHorizontal(); for (int i = 0; i < paletteColors.Length; i++) { GUI.backgroundColor = paletteColors[i]; // Sets the button color if (GUILayout.Button("", btnStyle)) { SetColors(GetColorDefault(paletteColors[i])); } } GUI.backgroundColor = defaultBg; // Resets the color background GUILayout.EndHorizontal(); GUILayout.EndVertical(); } if (showColors) { GUILayout.Label("Color Suggestions", EditorStyles.boldLabel); GUI.backgroundColor = Color.black; GUILayout.BeginVertical(bgStyle); GUILayout.BeginHorizontal(); counter = 0; foreach (Color[] color in colors) { GUI.backgroundColor = color[0]; // Sets the button color if (GUILayout.Button("", btnStyle) && color.Length >= 5) { SetColors(color); selectedColor = color[0]; } counter++; if (counter % 5 == 0) { // Start a new row each 5 GUILayout.EndHorizontal(); GUI.backgroundColor = Color.black; GUILayout.BeginHorizontal(); } } GUILayout.EndHorizontal(); GUI.backgroundColor = defaultBg; // Resets the color background GUILayout.EndVertical(); } #endregion } } EditorGUILayout.EndVertical(); #endregion #region Effects GUILayout.Label("Effects", titleStyle); EditorGUILayout.BeginVertical("Box"); Color effectBackground = new Color(0.6f, 0.6f, 0.6f); for (int i = 0; i < theme.effectSets.Count; i++) { EffectSet set = theme.effectSets[i]; bool pressed = (set == selectedEffectSet); GUI.backgroundColor = effectBackground; bool newPressed = GUILayout.Toggle(pressed, set.name, "Button"); GUI.backgroundColor = defaultBg; if (pressed != newPressed) { // To remove focus from any input field which might lead to errors GUI.FocusControl("Null"); if (newPressed) { if (Event.current.button == 1) { ActivateEffects(set); } else if (Event.current.button == 0) { selectedEffectSet = set; } } else if (Event.current.button == 0) { selectedEffectSet = null; } } if (selectedEffectSet != null && set == selectedEffectSet) { GUILayout.Box("", new GUILayoutOption[] { GUILayout.ExpandWidth(true), GUILayout.Height(1) }); GUILayout.BeginHorizontal(); GUILayout.Label("Effect Details", subtitleStyle); GUI.backgroundColor = deleteColor; if (GUILayout.Button("Delete", btnStyleWhiteFont, GUILayout.Width(50f))) { theme.effectSets.Remove(selectedEffectSet); selectedEffectSet = null; i--; } GUI.backgroundColor = defaultBg; if (GUILayout.Button("X", GUILayout.Width(20))) { selectedEffectSet = null; } GUILayout.EndHorizontal(); if (selectedEffectSet != null) { EditorGUILayout.BeginHorizontal(); GUILayout.Label("Name", GUILayout.Width(75)); selectedEffectSet.name = EditorGUILayout.TextField(selectedEffectSet.name); EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); GUILayout.Label("Tag", GUILayout.Width(75)); selectedEffectSet.tag = EditorGUILayout.TagField(selectedEffectSet.tag); EditorGUILayout.EndHorizontal(); selectedEffectSet.shadow = EditorGUILayout.ToggleLeft("Shadow", selectedEffectSet.shadow); if (selectedEffectSet.shadow) { selectedEffectSet.shadowColor = EditorGUILayout.ColorField("Color", selectedEffectSet.shadowColor); selectedEffectSet.shadowOffset = EditorGUILayout.Vector2Field("Effect Distance", selectedEffectSet.shadowOffset); } selectedEffectSet.gradient = EditorGUILayout.ToggleLeft("Gradient", selectedEffectSet.gradient); if (selectedEffectSet.gradient) { selectedEffectSet.gradientTop = EditorGUILayout.ColorField("Color Top", selectedEffectSet.gradientTop); selectedEffectSet.gradientBottom = EditorGUILayout.ColorField("Color Bottom", selectedEffectSet.gradientBottom); } GUILayout.BeginHorizontal(); GUILayout.Label("Apply EffectSet to:", GUILayout.Width(125)); GUI.backgroundColor = applyColor; if (GUILayout.Button("Selection", btnStyleWhiteFont)) { ActivateEffects(selectedEffectSet); } GUI.backgroundColor = defaultBg; GUI.enabled = selectedEffectSet.tag.Length > 0 && selectedEffectSet.tag != "Untagged"; if (GUILayout.Button("Tag")) { ApplyEffectSetTag(selectedEffectSet); } GUI.enabled = true; GUILayout.EndHorizontal(); } } } if (GUILayout.Button("Add Effect Set", GUILayout.Height(35))) { GUI.FocusControl("Null"); selectedEffectSet = new EffectSet(); selectedEffectSet.name = "New Effect"; theme.effectSets.Add(selectedEffectSet); } EditorGUILayout.EndVertical(); #endregion #region Font GUILayout.Label("Font", titleStyle); GUILayout.BeginHorizontal(); font = (Font)EditorGUILayout.ObjectField(font, typeof(Font), false); if (GUILayout.Button("Apply")) { AssignFontToSelection(); } GUILayout.EndHorizontal(); #endregion #region Additional Options showGlobalAction = EditorGUILayout.Foldout(showGlobalAction, "Additional Options"); if (showGlobalAction) { GUI.backgroundColor = applyColor; if (GUILayout.Button("Apply theme to Tags in scene", btnStyleWhiteFont)) { foreach (ColorSet set in theme.palette) { ApplyColorSetTag(set); } foreach (EffectSet set in theme.effectSets) { ApplyEffectSetTag(set); } } GUI.backgroundColor = defaultBg; if (GUILayout.Button("Generate Palette From Scene")) { GetSceneColors(); foreach (Color c in sceneColors) { ColorSet cs = new ColorSet(); Color[] colors = GetColorDefault(c); cs.normal = colors[0]; cs.highlighted = colors[1]; cs.pressed = colors[2]; cs.disabled = colors[3]; cs.detail = colors[4]; theme.palette.Add(cs); } } GUI.backgroundColor = deleteColor; if (GUILayout.Button("Clear palette and effects", btnStyleWhiteFont)) { theme.palette.Clear(); theme.effectSets.Clear(); } GUI.backgroundColor = defaultBg; } #endregion if (EditorGUI.EndChangeCheck()) { EditorUtility.SetDirty(theme); } EditorGUILayout.EndScrollView(); }