FiE-Game/Assets/Control Mapper/Extras/ControlMapper/Scripts/ThemeSettings.cs
2023-07-27 18:02:29 +05:00

478 lines
19 KiB
C#

// Copyright (c) 2015 Augie R. Maddox, Guavaman Enterprises. All rights reserved.
#pragma warning disable 0219
#pragma warning disable 0618
#pragma warning disable 0649
namespace Rewired.UI.ControlMapper {
using UnityEngine;
using UnityEngine.UI;
[System.Serializable]
public class ThemeSettings : ScriptableObject {
[SerializeField]
private ImageSettings _mainWindowBackground;
[SerializeField]
private ImageSettings _popupWindowBackground;
[SerializeField]
private ImageSettings _areaBackground;
[SerializeField]
private SelectableSettings _selectableSettings;
[SerializeField]
private SelectableSettings _buttonSettings;
[SerializeField]
private SelectableSettings _inputGridFieldSettings;
[SerializeField]
private ScrollbarSettings _scrollbarSettings;
[SerializeField]
private SliderSettings _sliderSettings;
[SerializeField]
private ImageSettings _invertToggle;
[SerializeField]
private Color _invertToggleDisabledColor;
[SerializeField]
private ImageSettings _calibrationValueMarker;
[SerializeField]
private ImageSettings _calibrationRawValueMarker;
[SerializeField]
private TextSettings _textSettings;
[SerializeField]
private TextSettings _buttonTextSettings;
[SerializeField]
private TextSettings _inputGridFieldTextSettings;
public void Apply(ThemedElement.ElementInfo[] elementInfo) {
if(elementInfo == null) return;
for(int i = 0; i < elementInfo.Length; i++) {
if(elementInfo[i] == null) continue;
Apply(elementInfo[i].themeClass, elementInfo[i].component);
}
}
private void Apply(string themeClass, Component component) {
if(component as Selectable != null) {
Apply(themeClass, (Selectable)component);
return;
}
if(component as Image != null) {
Apply(themeClass, (Image)component);
return;
}
if(component as Text != null) {
Apply(themeClass, (Text)component);
return;
}
if(component as UIImageHelper != null) {
Apply(themeClass, (UIImageHelper)component);
return;
}
}
private void Apply(string themeClass, Selectable item) {
if(item == null) return;
SelectableSettings_Base settings;
if(item as Button != null) {
switch(themeClass) {
case "inputGridField":
settings = _inputGridFieldSettings;
break;
default:
settings = _buttonSettings;
break;
}
} else if(item as Scrollbar != null) settings = _scrollbarSettings;
else if(item as Slider != null) settings = _sliderSettings;
else if(item as Toggle != null) {
switch(themeClass) {
case "button":
settings = _buttonSettings;
break;
default:
settings = _selectableSettings;
break;
}
} else settings = _selectableSettings;
settings.Apply(item);
}
private void Apply(string themeClass, Image item) {
if(item == null) return;
switch(themeClass) {
case "area":
_areaBackground.CopyTo(item);
break;
case "popupWindow":
_popupWindowBackground.CopyTo(item);
break;
case "mainWindow":
_mainWindowBackground.CopyTo(item);
break;
case "calibrationValueMarker":
_calibrationValueMarker.CopyTo(item);
break;
case "calibrationRawValueMarker":
_calibrationRawValueMarker.CopyTo(item);
break;
case "invertToggle":
_invertToggle.CopyTo(item);
break;
case "invertToggleBackground":
_inputGridFieldSettings.imageSettings.CopyTo(item);
break;
case "invertToggleButtonBackground":
_buttonSettings.imageSettings.CopyTo(item);
break;
}
}
private void Apply(string themeClass, Text item) {
if(item == null) return;
TextSettings settings;
switch(themeClass) {
case "button":
settings = _buttonTextSettings;
break;
case "inputGridField":
settings = _inputGridFieldTextSettings;
break;
default:
settings = _textSettings;
break;
}
if(settings.font != null) item.font = settings.font;
item.color = settings.color;
item.lineSpacing = settings.lineSpacing;
if(settings.sizeMultiplier != 1.0f) {
item.fontSize = (int)(item.fontSize * settings.sizeMultiplier);
item.resizeTextMaxSize = (int)(item.resizeTextMaxSize * settings.sizeMultiplier);
item.resizeTextMinSize = (int)(item.resizeTextMinSize * settings.sizeMultiplier);
}
if(settings.style != FontStyleOverride.Default) {
item.fontStyle = (FontStyle)((int)settings.style - 1);
}
}
private void Apply(string themeClass, UIImageHelper item) {
if(item == null) return;
item.SetEnabledStateColor(_invertToggle.color);
item.SetDisabledStateColor(_invertToggleDisabledColor);
item.Refresh();
}
[System.Serializable]
private abstract class SelectableSettings_Base {
[SerializeField]
protected Selectable.Transition _transition;
[SerializeField]
protected CustomColorBlock _colors;
[SerializeField]
protected CustomSpriteState _spriteState;
[SerializeField]
protected CustomAnimationTriggers _animationTriggers;
public Selectable.Transition transition => _transition;
public CustomColorBlock selectableColors => _colors;
public CustomSpriteState spriteState => _spriteState;
public CustomAnimationTriggers animationTriggers => _animationTriggers;
public virtual void Apply(Selectable item) {
Selectable.Transition transition = _transition;
bool transitionChanged = item.transition != transition;
item.transition = transition;
ICustomSelectable customSel = item as ICustomSelectable;
if(transition == Selectable.Transition.ColorTint) {
// Two-step color change to get around delay bug due to fade duration
CustomColorBlock cb = _colors;
cb.fadeDuration = 0.0f;
item.colors = cb;
cb.fadeDuration = _colors.fadeDuration;
item.colors = cb;
if(customSel != null) customSel.disabledHighlightedColor = cb.disabledHighlightedColor;
} else if(transition == Selectable.Transition.SpriteSwap) {
item.spriteState = _spriteState;
if(customSel != null) customSel.disabledHighlightedSprite = _spriteState.disabledHighlightedSprite;
} else if(transition == Selectable.Transition.Animation) {
item.animationTriggers.disabledTrigger = _animationTriggers.disabledTrigger;
item.animationTriggers.highlightedTrigger = _animationTriggers.highlightedTrigger;
item.animationTriggers.normalTrigger = _animationTriggers.normalTrigger;
item.animationTriggers.pressedTrigger = _animationTriggers.pressedTrigger;
if(customSel != null) customSel.disabledHighlightedTrigger = _animationTriggers.disabledHighlightedTrigger;
}
if(transitionChanged) item.targetGraphic.CrossFadeColor(item.targetGraphic.color, 0.0f, true, true); // force color to revert to default or it will be left with color tint
}
}
[System.Serializable]
private class SelectableSettings : SelectableSettings_Base {
[SerializeField]
private ImageSettings _imageSettings;
public ImageSettings imageSettings => _imageSettings;
public override void Apply(Selectable item) {
if(item == null) return;
base.Apply(item);
if(_imageSettings != null) _imageSettings.CopyTo(item.targetGraphic as Image);
}
}
[System.Serializable]
private class SliderSettings : SelectableSettings_Base {
[SerializeField]
private ImageSettings _handleImageSettings;
[SerializeField]
private ImageSettings _fillImageSettings;
[SerializeField]
private ImageSettings _backgroundImageSettings;
public ImageSettings handleImageSettings => _handleImageSettings;
public ImageSettings fillImageSettings => _fillImageSettings;
public ImageSettings backgroundImageSettings => _backgroundImageSettings;
private void Apply(Slider item) {
if(item == null) return;
if(_handleImageSettings != null) _handleImageSettings.CopyTo(item.targetGraphic as Image);
if(_fillImageSettings != null) {
RectTransform rt = item.fillRect;
if(rt != null) _fillImageSettings.CopyTo(rt.GetComponent<Image>());
}
if(_backgroundImageSettings != null) {
Transform t = item.transform.Find("Background");
if(t != null) {
_backgroundImageSettings.CopyTo(t.GetComponent<Image>());
}
}
}
public override void Apply(Selectable item) {
base.Apply(item);
Apply(item as Slider);
}
}
[System.Serializable]
private class ScrollbarSettings : SelectableSettings_Base {
[SerializeField]
private ImageSettings _handleImageSettings;
[SerializeField]
private ImageSettings _backgroundImageSettings;
public ImageSettings handle => _handleImageSettings;
public ImageSettings background => _backgroundImageSettings;
private void Apply(Scrollbar item) {
if(item == null) return;
if(_handleImageSettings != null) _handleImageSettings.CopyTo(item.targetGraphic as Image);
if(_backgroundImageSettings != null) _backgroundImageSettings.CopyTo(item.GetComponent<Image>());
}
public override void Apply(Selectable item) {
base.Apply(item);
Apply(item as Scrollbar);
}
}
[System.Serializable]
private class ImageSettings {
[SerializeField]
private Color _color = Color.white;
[SerializeField]
private Sprite _sprite;
[SerializeField]
private Material _materal;
[SerializeField]
private Image.Type _type;
[SerializeField]
private bool _preserveAspect;
[SerializeField]
private bool _fillCenter;
[SerializeField]
private Image.FillMethod _fillMethod;
[SerializeField]
private float _fillAmout;
[SerializeField]
private bool _fillClockwise;
[SerializeField]
private int _fillOrigin;
public Color color => _color;
public Sprite sprite => _sprite;
public Material materal => _materal;
public Image.Type type => _type;
public bool preserveAspect => _preserveAspect;
public bool fillCenter => _fillCenter;
public Image.FillMethod fillMethod => _fillMethod;
public float fillAmout => _fillAmout;
public bool fillClockwise => _fillClockwise;
public int fillOrigin => _fillOrigin;
public virtual void CopyTo(Image image) {
if(image == null) return;
image.color = _color;
image.sprite = _sprite;
image.material = _materal;
image.type = _type;
image.preserveAspect = _preserveAspect;
image.fillCenter = _fillCenter;
image.fillMethod = _fillMethod;
image.fillAmount = _fillAmout;
image.fillClockwise = _fillClockwise;
image.fillOrigin = _fillOrigin;
}
}
[System.Serializable]
private struct CustomColorBlock {
[SerializeField]
private float m_ColorMultiplier;
[SerializeField]
private Color m_DisabledColor;
[SerializeField]
private float m_FadeDuration;
[SerializeField]
private Color m_HighlightedColor;
[SerializeField]
private Color m_NormalColor;
[SerializeField]
private Color m_PressedColor;
[SerializeField]
private Color m_DisabledHighlightedColor;
public float colorMultiplier { get { return m_ColorMultiplier; } set { m_ColorMultiplier = value; } }
public Color disabledColor { get { return m_DisabledColor; } set { m_DisabledColor = value; } }
public float fadeDuration { get { return m_FadeDuration; } set { m_FadeDuration = value; } }
public Color highlightedColor { get { return m_HighlightedColor; } set { m_HighlightedColor = value; } }
public Color normalColor { get { return m_NormalColor; } set { m_NormalColor = value; } }
public Color pressedColor { get { return m_PressedColor; } set { m_PressedColor = value; } }
public Color disabledHighlightedColor { get { return m_DisabledHighlightedColor; } set { m_DisabledHighlightedColor = value; } }
public static implicit operator ColorBlock(CustomColorBlock item) {
return new ColorBlock() {
colorMultiplier = item.m_ColorMultiplier,
disabledColor = item.m_DisabledColor,
fadeDuration = item.m_FadeDuration,
highlightedColor = item.m_HighlightedColor,
normalColor = item.m_NormalColor,
pressedColor = item.m_PressedColor
};
}
}
[System.Serializable]
private struct CustomSpriteState {
public Sprite disabledSprite { get { return m_DisabledSprite; } set { m_DisabledSprite = value; } }
public Sprite highlightedSprite { get { return m_HighlightedSprite; } set { m_HighlightedSprite = value; } }
public Sprite pressedSprite { get { return m_PressedSprite; } set { m_PressedSprite = value; } }
public Sprite disabledHighlightedSprite { get { return m_DisabledHighlightedSprite; } set { m_DisabledHighlightedSprite = value; } }
[SerializeField]
private Sprite m_DisabledSprite;
[SerializeField]
private Sprite m_HighlightedSprite;
[SerializeField]
private Sprite m_PressedSprite;
[SerializeField]
private Sprite m_DisabledHighlightedSprite;
public static implicit operator SpriteState(CustomSpriteState item) {
return new SpriteState() {
disabledSprite = item.m_DisabledSprite,
highlightedSprite = item.m_HighlightedSprite,
pressedSprite = item.m_PressedSprite
};
}
}
[System.Serializable]
private class CustomAnimationTriggers {
public CustomAnimationTriggers() {
m_DisabledTrigger = string.Empty;
m_HighlightedTrigger = string.Empty;
m_NormalTrigger = string.Empty;
m_PressedTrigger = string.Empty;
m_DisabledHighlightedTrigger = string.Empty;
}
public string disabledTrigger { get { return m_DisabledTrigger; } set { m_DisabledTrigger = value; } }
public string highlightedTrigger { get { return m_HighlightedTrigger; } set { m_HighlightedTrigger = value; } }
public string normalTrigger { get { return m_NormalTrigger; } set { m_NormalTrigger = value; } }
public string pressedTrigger { get { return m_PressedTrigger; } set { m_PressedTrigger = value; } }
public string disabledHighlightedTrigger { get { return m_DisabledHighlightedTrigger; } set { m_DisabledHighlightedTrigger = value; } }
[SerializeField]
private string m_DisabledTrigger;
[SerializeField]
private string m_HighlightedTrigger;
[SerializeField]
private string m_NormalTrigger;
[SerializeField]
private string m_PressedTrigger;
[SerializeField]
private string m_DisabledHighlightedTrigger;
public static implicit operator AnimationTriggers(CustomAnimationTriggers item) {
return new AnimationTriggers() {
disabledTrigger = item.m_DisabledTrigger,
highlightedTrigger = item.m_HighlightedTrigger,
normalTrigger = item.m_NormalTrigger,
pressedTrigger = item.m_PressedTrigger
};
}
}
[System.Serializable]
private class TextSettings {
[SerializeField]
private Color _color = Color.white;
[SerializeField]
private Font _font;
[SerializeField]
private FontStyleOverride _style = FontStyleOverride.Default;
[SerializeField]
private float _lineSpacing = 1.0f;
[SerializeField]
private float _sizeMultiplier = 1.0f;
public Color color => _color;
public Font font => _font;
public FontStyleOverride style => _style;
public float lineSpacing => _lineSpacing;
public float sizeMultiplier => _sizeMultiplier;
}
private enum FontStyleOverride {
Default = 0,
Normal = 1,
Bold = 2,
Italic = 3,
BoldAndItalic = 4,
}
}
}