Files
2026-06-22 16:18:34 +02:00

115 lines
4.4 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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);
}
}
}