mirror of
https://github.com/ppy/osu.git
synced 2025-02-19 07:04:15 +08:00
Rewrite to not suck
This commit is contained in:
parent
46b6601cbf
commit
581da108fc
@ -19,13 +19,11 @@ namespace osu.Game.Overlays.Settings.Sections.Graphics
|
|||||||
|
|
||||||
private Bindable<bool> letterboxing;
|
private Bindable<bool> letterboxing;
|
||||||
private Bindable<Size> sizeFullscreen;
|
private Bindable<Size> sizeFullscreen;
|
||||||
private readonly BindableInt resolutionDropdownBindable = new BindableInt();
|
|
||||||
|
|
||||||
private OsuGameBase game;
|
private OsuGameBase game;
|
||||||
private SettingsDropdown<int> resolutionDropdown;
|
private SettingsDropdown<Size> resolutionDropdown;
|
||||||
private SettingsEnumDropdown<WindowMode> windowModeDropdown;
|
private SettingsEnumDropdown<WindowMode> windowModeDropdown;
|
||||||
|
|
||||||
|
|
||||||
private const int transition_duration = 400;
|
private const int transition_duration = 400;
|
||||||
|
|
||||||
[BackgroundDependencyLoader]
|
[BackgroundDependencyLoader]
|
||||||
@ -36,25 +34,6 @@ namespace osu.Game.Overlays.Settings.Sections.Graphics
|
|||||||
letterboxing = config.GetBindable<bool>(FrameworkSetting.Letterboxing);
|
letterboxing = config.GetBindable<bool>(FrameworkSetting.Letterboxing);
|
||||||
sizeFullscreen = config.GetBindable<Size>(FrameworkSetting.SizeFullscreen);
|
sizeFullscreen = config.GetBindable<Size>(FrameworkSetting.SizeFullscreen);
|
||||||
|
|
||||||
sizeFullscreen.ValueChanged += size =>
|
|
||||||
{
|
|
||||||
KeyValuePair<string, int> valuePair = getResolutions().FirstOrDefault(r => r.Key.StartsWith($"{size.Width}x{size.Height}"));
|
|
||||||
|
|
||||||
resolutionDropdownBindable.Value = valuePair.Value;
|
|
||||||
};
|
|
||||||
|
|
||||||
resolutionDropdownBindable.ValueChanged += resolution =>
|
|
||||||
{
|
|
||||||
var newSelection = getResolutions().First(r => r.Value == resolution);
|
|
||||||
var newSelectionParts = newSelection.Key.Split('x');
|
|
||||||
|
|
||||||
var newSelectionWidth = int.Parse(newSelectionParts.First());
|
|
||||||
var newSelectionHeight = int.Parse(newSelectionParts.Last());
|
|
||||||
|
|
||||||
if (sizeFullscreen.Value.Width != newSelectionWidth || sizeFullscreen.Value.Height != newSelectionHeight)
|
|
||||||
sizeFullscreen.Value = new Size(newSelectionWidth, newSelectionHeight);
|
|
||||||
};
|
|
||||||
|
|
||||||
Children = new Drawable[]
|
Children = new Drawable[]
|
||||||
{
|
{
|
||||||
windowModeDropdown = new SettingsEnumDropdown<WindowMode>
|
windowModeDropdown = new SettingsEnumDropdown<WindowMode>
|
||||||
@ -62,11 +41,12 @@ namespace osu.Game.Overlays.Settings.Sections.Graphics
|
|||||||
LabelText = "Screen mode",
|
LabelText = "Screen mode",
|
||||||
Bindable = config.GetBindable<WindowMode>(FrameworkSetting.WindowMode),
|
Bindable = config.GetBindable<WindowMode>(FrameworkSetting.WindowMode),
|
||||||
},
|
},
|
||||||
resolutionDropdown = new SettingsDropdown<int>
|
resolutionDropdown = new SettingsDropdown<Size>
|
||||||
{
|
{
|
||||||
LabelText = "Resolution",
|
LabelText = "Resolution",
|
||||||
|
ShowsDefaultIndicator = false,
|
||||||
Items = getResolutions(),
|
Items = getResolutions(),
|
||||||
Bindable = resolutionDropdownBindable
|
Bindable = sizeFullscreen
|
||||||
},
|
},
|
||||||
new SettingsCheckbox
|
new SettingsCheckbox
|
||||||
{
|
{
|
||||||
@ -100,7 +80,7 @@ namespace osu.Game.Overlays.Settings.Sections.Graphics
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
windowModeDropdown.Bindable.ValueChanged += windowMode =>
|
windowModeDropdown.Bindable.BindValueChanged(windowMode =>
|
||||||
{
|
{
|
||||||
if (windowMode == WindowMode.Fullscreen)
|
if (windowMode == WindowMode.Fullscreen)
|
||||||
{
|
{
|
||||||
@ -109,31 +89,30 @@ namespace osu.Game.Overlays.Settings.Sections.Graphics
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
resolutionDropdown.Hide();
|
resolutionDropdown.Hide();
|
||||||
};
|
}, true);
|
||||||
windowModeDropdown.Bindable.TriggerChange();
|
|
||||||
|
|
||||||
letterboxing.ValueChanged += isVisible =>
|
letterboxing.BindValueChanged(isVisible =>
|
||||||
{
|
{
|
||||||
letterboxSettings.ClearTransforms();
|
letterboxSettings.ClearTransforms();
|
||||||
letterboxSettings.AutoSizeAxes = isVisible ? Axes.Y : Axes.None;
|
letterboxSettings.AutoSizeAxes = isVisible ? Axes.Y : Axes.None;
|
||||||
|
|
||||||
if (!isVisible)
|
if (!isVisible)
|
||||||
letterboxSettings.ResizeHeightTo(0, transition_duration, Easing.OutQuint);
|
letterboxSettings.ResizeHeightTo(0, transition_duration, Easing.OutQuint);
|
||||||
};
|
}, true);
|
||||||
letterboxing.TriggerChange();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<KeyValuePair<string, int>> getResolutions()
|
private List<KeyValuePair<string, Size>> getResolutions()
|
||||||
{
|
{
|
||||||
var availableDisplayResolutions = game.Window?.GetCurrentDisplay().AvailableResolutions
|
if (game.Window == null)
|
||||||
.Where(r => r.Width >= 800 && r.Height >= 600)
|
return new List<KeyValuePair<string, Size>>();
|
||||||
.OrderByDescending(r => r.Width).ThenByDescending(r => r.Height);
|
|
||||||
|
|
||||||
if (availableDisplayResolutions == null)
|
return game.Window?.AvailableResolutions
|
||||||
return new List<KeyValuePair<string, int>>();
|
.Where(r => r.Width >= 800 && r.Height >= 600)
|
||||||
|
.OrderByDescending(r => r.Width)
|
||||||
var availableDisplayResolutionsStr = availableDisplayResolutions.Select(r => $"{r.Width}x{r.Height}").Distinct();
|
.ThenByDescending(r => r.Height)
|
||||||
return availableDisplayResolutionsStr.Select((t, i) => new KeyValuePair<string, int>(t, i)).ToList();
|
.Select(res => new KeyValuePair<string, Size>($"{res.Width}x{res.Height}", new Size(res.Width, res.Height)))
|
||||||
|
.Distinct()
|
||||||
|
.ToList();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user