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 options = new List(); 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 { "Exclusive Fullscreen", "Borderless Window", "Maximized Window", "Windowed" }); } private void PopulateMonitorDropdown() { monitorDropdown.ClearOptions(); List displays = new List(); Screen.GetDisplayLayout(displays); List options = new List(); 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); } } }