dwelling acts 1 & 3
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

129 lines
4.4 KiB

1 year ago
using System;
using UnityEditor;
using UnityEditorInternal;
using UnityEngine;
namespace FullscreenEditor {
/// <summary>Helper class for saving preferences.</summary>
/// <typeparam name="T">The type you want to save, must be marked as <see cref="SerializableAttribute"/></typeparam>
[Serializable]
public sealed class PrefItem<T> {
[SerializeField]
private T savedValue;
/// <summary>The key for saving the value.</summary>
public string Key { get; private set; }
/// <summary>The default value to use when there's none saved.</summary>
public T DefaultValue { get; private set; }
/// <summary>A label and an explanation of what this item is for.</summary>
public GUIContent Content { get; private set; }
/// <summary>Callback called whenever the saved value changes.</summary>
public Action<T> OnValueSaved { get; set; }
/// <summary>The value saved by this instance.</summary>
public T Value {
get { return savedValue; }
set {
if (!savedValue.Equals(value)) {
savedValue = value;
SaveValue();
}
}
}
public PrefItem(string key, T defaultValue, string text, string tooltip) {
Key = "Fullscreen." + key;
FullscreenPreferences.onLoadDefaults += DeleteValue;
Content = new GUIContent(text, tooltip);
FullscreenPreferences.contents.Add(Content);
DefaultValue = savedValue = defaultValue;
LoadValue();
}
private void LoadValue() {
try {
if (EditorPrefs.HasKey(Key))
JsonUtility.FromJsonOverwrite(EditorPrefs.GetString(Key), this);
} catch (Exception e) {
Logger.Warning("Failed to load {0}, using default value: {1}", Key, e);
savedValue = DefaultValue;
SaveValue();
}
}
public void SaveValue() {
try {
EditorPrefs.SetString(Key, JsonUtility.ToJson(this));
Logger.Debug("Saved value to key {0}:\n{1}", Key, EditorPrefs.GetString(Key));
if (OnValueSaved != null)
OnValueSaved.Invoke(Value);
InternalEditorUtility.RepaintAllViews();
} catch (Exception e) {
Logger.Warning("Failed to save {0}: {1}", Key, e);
}
}
public void DeleteValue() {
EditorPrefs.DeleteKey(Key);
savedValue = DefaultValue;
if (OnValueSaved != null)
OnValueSaved.Invoke(savedValue);
}
public static implicit operator T(PrefItem<T> pb) { return pb.Value; }
public static implicit operator GUIContent(PrefItem<T> pb) { return pb.Content; }
}
/// <summary>Helper class for drawing the <see cref="PrefItem{T}"/> in the <see cref="PreferencesWindow"/>.</summary>
public static class PrefItemGUI {
public static void DoGUI(this PrefItem<int> pref) {
pref.Value = EditorGUILayout.IntField(pref.Content, pref.Value);
}
public static void DoGUI(this PrefItem<float> pref) {
pref.Value = EditorGUILayout.FloatField(pref.Content, pref.Value);
}
public static void DoGUI(this PrefItem<int> pref, int min, int max) {
pref.Value = EditorGUILayout.IntSlider(pref.Content, pref.Value, min, max);
}
public static void DoGUI(this PrefItem<float> pref, float min, float max) {
pref.Value = EditorGUILayout.Slider(pref.Content, pref.Value, min, max);
}
public static void DoGUI(this PrefItem<bool> pref) {
pref.Value = EditorGUILayout.Toggle(pref.Content, pref.Value);
}
public static void DoGUI(this PrefItem<string> pref) {
pref.Value = EditorGUILayout.TextField(pref.Content, pref.Value);
}
public static void DoGUI(this PrefItem<Color> pref) {
pref.Value = EditorGUILayout.ColorField(pref.Content, pref.Value);
}
public static void DoGUI(this PrefItem<Rect> pref) {
pref.Value = EditorGUILayout.RectField(pref.Content, pref.Value);
}
public static void DoGUI(this PrefItem<RectSourceMode> pref) {
pref.Value = (RectSourceMode)EditorGUILayout.EnumPopup(pref.Content, pref.Value);
}
}
}