115 lines
4.4 KiB
C#
115 lines
4.4 KiB
C#
using System.Collections.Generic;
|
||
using TMPro;
|
||
using UnityEngine;
|
||
using UnityEngine.UI;
|
||
|
||
namespace Ashwild.Settings
|
||
{
|
||
public class DisplaySettingsSubPanel : SettingsSubPanel
|
||
{
|
||
[Header("Controls")]
|
||
[SerializeField] private TMP_Dropdown resolutionDropdown;
|
||
[SerializeField] private TMP_Dropdown fullscreenDropdown;
|
||
[SerializeField] private TMP_Dropdown monitorDropdown;
|
||
[SerializeField] private Slider brightnessSlider;
|
||
[SerializeField] private TMP_Text brightnessLabel;
|
||
|
||
private bool wiring;
|
||
|
||
private void Awake()
|
||
{
|
||
resolutionDropdown.onValueChanged.AddListener(OnResolutionChanged);
|
||
fullscreenDropdown.onValueChanged.AddListener(OnFullscreenChanged);
|
||
monitorDropdown.onValueChanged.AddListener(OnMonitorChanged);
|
||
brightnessSlider.onValueChanged.AddListener(OnBrightnessChanged);
|
||
}
|
||
|
||
public override void Refresh()
|
||
{
|
||
SettingsManager s = SettingsManager.Instance;
|
||
if (s == null) return;
|
||
|
||
wiring = true;
|
||
|
||
PopulateResolutionDropdown();
|
||
resolutionDropdown.value = Mathf.Clamp(s.ResolutionIndex, 0, resolutionDropdown.options.Count - 1);
|
||
resolutionDropdown.RefreshShownValue();
|
||
|
||
PopulateFullscreenDropdown();
|
||
fullscreenDropdown.value = FullscreenModeToIndex(s.FullscreenMode);
|
||
fullscreenDropdown.RefreshShownValue();
|
||
|
||
PopulateMonitorDropdown();
|
||
monitorDropdown.value = Mathf.Clamp(s.MonitorIndex, 0, monitorDropdown.options.Count - 1);
|
||
monitorDropdown.RefreshShownValue();
|
||
|
||
brightnessSlider.SetValueWithoutNotify(s.Brightness);
|
||
if (brightnessLabel != null) brightnessLabel.text = $"{Mathf.RoundToInt(s.Brightness * 100f)}%";
|
||
|
||
wiring = false;
|
||
}
|
||
|
||
private void PopulateResolutionDropdown()
|
||
{
|
||
resolutionDropdown.ClearOptions();
|
||
List<string> options = new List<string>();
|
||
foreach (Resolution r in Screen.resolutions)
|
||
options.Add($"{r.width}×{r.height} @{Mathf.RoundToInt((float)r.refreshRateRatio.value)}Hz");
|
||
resolutionDropdown.AddOptions(options);
|
||
}
|
||
|
||
private void PopulateFullscreenDropdown()
|
||
{
|
||
fullscreenDropdown.ClearOptions();
|
||
fullscreenDropdown.AddOptions(new List<string>
|
||
{
|
||
"Exclusive Fullscreen",
|
||
"Borderless Window",
|
||
"Maximized Window",
|
||
"Windowed"
|
||
});
|
||
}
|
||
|
||
private void PopulateMonitorDropdown()
|
||
{
|
||
monitorDropdown.ClearOptions();
|
||
List<DisplayInfo> displays = new List<DisplayInfo>();
|
||
Screen.GetDisplayLayout(displays);
|
||
List<string> options = new List<string>();
|
||
for (int i = 0; i < displays.Count; i++)
|
||
{
|
||
string name = string.IsNullOrEmpty(displays[i].name) ? $"Monitor {i + 1}" : displays[i].name;
|
||
options.Add($"{name} ({displays[i].width}×{displays[i].height})");
|
||
}
|
||
monitorDropdown.AddOptions(options);
|
||
}
|
||
|
||
private static int FullscreenModeToIndex(FullScreenMode mode) => mode switch
|
||
{
|
||
FullScreenMode.ExclusiveFullScreen => 0,
|
||
FullScreenMode.FullScreenWindow => 1,
|
||
FullScreenMode.MaximizedWindow => 2,
|
||
FullScreenMode.Windowed => 3,
|
||
_ => 1
|
||
};
|
||
|
||
private static FullScreenMode IndexToFullscreenMode(int index) => index switch
|
||
{
|
||
0 => FullScreenMode.ExclusiveFullScreen,
|
||
1 => FullScreenMode.FullScreenWindow,
|
||
2 => FullScreenMode.MaximizedWindow,
|
||
3 => FullScreenMode.Windowed,
|
||
_ => FullScreenMode.FullScreenWindow
|
||
};
|
||
|
||
private void OnResolutionChanged(int v) { if (!wiring) SettingsManager.Instance.SetResolution(v); }
|
||
private void OnFullscreenChanged(int v) { if (!wiring) SettingsManager.Instance.SetFullscreenMode(IndexToFullscreenMode(v)); }
|
||
private void OnMonitorChanged(int v) { if (!wiring) SettingsManager.Instance.SetMonitor(v); }
|
||
private void OnBrightnessChanged(float v)
|
||
{
|
||
if (brightnessLabel != null) brightnessLabel.text = $"{Mathf.RoundToInt(v * 100f)}%";
|
||
if (!wiring) SettingsManager.Instance.SetBrightness(v);
|
||
}
|
||
}
|
||
}
|