Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 26 additions & 0 deletions WheelWizard.Test/Features/Settings/SettingsTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,32 @@ public void Set_ReturnsFalse_WhenValidationFails()
Assert.Equal(0, manager.Get<int>(manager.FOCUSED_USER));
}

[Theory]
[InlineData(0.49)]
[InlineData(2.01)]
public void SavedWindowScale_RejectsValuesOutsideBounds(double scale)
{
var manager = CreateManager(new MockFileSystem(), out _, out _, out _);

var result = manager.Set(manager.SAVED_WINDOW_SCALE, scale, skipSave: true);

Assert.False(result);
Assert.Equal(1.0, manager.Get<double>(manager.SAVED_WINDOW_SCALE));
}

[Theory]
[InlineData(0.49)]
[InlineData(2.01)]
public void WindowScalePreview_RejectsValuesOutsideBounds(double scale)
{
var manager = CreateManager(new MockFileSystem(), out _, out _, out _);

var result = manager.Set(manager.WINDOW_SCALE, scale, skipSave: true);

Assert.False(result);
Assert.Equal(1.0, manager.Get<double>(manager.WINDOW_SCALE));
}

[Fact]
public void ValidateCorePathSettings_ReturnsAllExpectedIssues_WhenDefaultsAreInvalid()
{
Expand Down
8 changes: 5 additions & 3 deletions WheelWizard/Features/Settings/SettingsManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ IFileSystem fileSystem

ENABLE_ANIMATIONS = RegisterWhWz("EnableAnimations", true);
TESTING_MODE_ENABLED = RegisterWhWz("TestingModeEnabled", false);
SAVED_WINDOW_SCALE = RegisterWhWz("WindowScale", 1.0, value => (double)(value ?? -1) >= 0.5 && (double)(value ?? -1) <= 2.0);
SAVED_WINDOW_SCALE = RegisterWhWz("WindowScale", 1.0, SettingValues.IsValidWindowScale);
REMOVE_BLUR = RegisterWhWz("REMOVE_BLUR", true);
RR_REGION = RegisterWhWz("RR_Region", MarioKartWiiEnums.Regions.None);
WW_LANGUAGE = RegisterWhWz("WW_Language", "en", value => SettingValues.WhWzLanguages.ContainsKey((string)value!));
Expand Down Expand Up @@ -155,11 +155,13 @@ IFileSystem fileSystem
#endregion

#region Virtual settings
WINDOW_SCALE = new VirtualSetting(
var windowScale = new VirtualSetting(
typeof(double),
value => _internalScale = (double)value!,
() => _internalScale == -1.0 ? SAVED_WINDOW_SCALE.Get() : _internalScale
).SetDependencies(SAVED_WINDOW_SCALE);
);
windowScale.SetValidation(SettingValues.IsValidWindowScale);
WINDOW_SCALE = windowScale.SetDependencies(SAVED_WINDOW_SCALE);

RECOMMENDED_SETTINGS = new VirtualSetting(
typeof(bool),
Expand Down
7 changes: 7 additions & 0 deletions WheelWizard/Features/Settings/Types/SettingConstants.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,16 @@ public static class SettingValues
// you check for this value and replace it with its corresponding value in the language file
public const string NoName = "no name";
public const string NoLicense = "no license";
public const double MinWindowScale = 0.5;
public const double MaxWindowScale = 2.0;

public static readonly double[] WindowScales = [0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.8, 2];

public static bool IsValidWindowScale(object? value)
{
return value is double scale && scale >= MinWindowScale && scale <= MaxWindowScale;
}

public static readonly Dictionary<string, string> GFXRenderers = new() //Display name, value
{
#if WINDOWS
Expand Down
14 changes: 13 additions & 1 deletion WheelWizard/Views/Layout.axaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@ public Layout()
InitializeComponent();
AddLayer();

ClampSavedWindowScaleToCurrentScreen();
OnSettingChanged(SettingsService.SAVED_WINDOW_SCALE);
_settingsSignalSubscription = SettingsSignalBus.Subscribe(OnSettingSignal);
UpdateTestingButtonVisibility();
Expand Down Expand Up @@ -148,7 +149,7 @@ private void OnSettingChanged(Setting setting)
// Note that this method will also be called whenever the setting changes
if (setting == SettingsService.WINDOW_SCALE || setting == SettingsService.SAVED_WINDOW_SCALE)
{
var scaleFactor = (double)setting.Get();
var scaleFactor = GetUsableWindowScale((double)setting.Get());
Height = WindowHeight * scaleFactor;
Width = WindowWidth * scaleFactor;
CompleteGrid.RenderTransform = new ScaleTransform(scaleFactor, scaleFactor);
Expand All @@ -163,6 +164,17 @@ private void OnSettingChanged(Setting setting)
UpdateTestingButtonVisibility();
}

private void ClampSavedWindowScaleToCurrentScreen()
{
var savedScale = SettingsService.Get<double>(SettingsService.SAVED_WINDOW_SCALE);
var usableScale = GetUsableWindowScale(savedScale);
if (!savedScale.Equals(usableScale))
SettingsService.Set(SettingsService.SAVED_WINDOW_SCALE, usableScale);
}

private double GetUsableWindowScale(double requestedScale) =>
ViewUtils.GetUsableWindowScale(requestedScale, new Size(WindowWidth, WindowHeight), this);

private void UpdateModsButtonText()
{
ModsButton.Text = Common.PageTitle_Patches;
Expand Down
12 changes: 11 additions & 1 deletion WheelWizard/Views/Pages/Settings/WhWzSettings.axaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -647,8 +647,18 @@ private async void WindowScaleDropdown_OnSelectionChanged(object sender, Selecti
_editingScale = true;
var selectedScale = WindowScaleDropdown.SelectedItem?.ToString() ?? "1";
var scale = double.Parse(selectedScale.Split(" ").Last().Replace("%", "")) / 100;
scale = ViewUtils.GetUsableWindowScale(scale, new Avalonia.Size(Layout.WindowWidth, Layout.WindowHeight), ViewUtils.GetLayout());
var selectedItemText = ScaleToString(scale);
if (!WindowScaleDropdown.Items.Contains(selectedItemText))
WindowScaleDropdown.Items.Add(selectedItemText);
WindowScaleDropdown.SelectedItem = selectedItemText;

SettingsService.WINDOW_SCALE.Set(scale);
if (!SettingsService.WINDOW_SCALE.Set(scale))
{
WindowScaleDropdown.SelectedItem = ScaleToString((double)SettingsService.WINDOW_SCALE.Get());
_editingScale = false;
return;
}
var seconds = 10;

string ExtraScaleText() =>
Expand Down
3 changes: 2 additions & 1 deletion WheelWizard/Views/Popups/Base/PopupWindow.axaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
using Avalonia.Media;
using WheelWizard.Settings;
using WheelWizard.Shared.DependencyInjection;
using WheelWizard.Views;

namespace WheelWizard.Views.Popups.Base;

Expand Down Expand Up @@ -147,7 +148,7 @@ protected override void OnResized(WindowResizedEventArgs e)

public void SetWindowSize(Size size)
{
var scaleFactor = SettingsService.Get<double>(SettingsService.WINDOW_SCALE);
var scaleFactor = ViewUtils.GetUsableWindowScale(SettingsService.Get<double>(SettingsService.WINDOW_SCALE), size, this);
Width = size.Width * scaleFactor;
Height = size.Height * scaleFactor;
CompleteGrid.RenderTransform = new ScaleTransform(scaleFactor, scaleFactor);
Expand Down
17 changes: 17 additions & 0 deletions WheelWizard/Views/ViewUtils.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
using Avalonia.Controls;
using Avalonia.Media;
using WheelWizard.Services.LiveData;
using WheelWizard.Settings.Types;
using WheelWizard.Utilities.RepeatedTasks;

namespace WheelWizard.Views;
Expand All @@ -26,6 +27,22 @@ public static void OpenLink(string link)

public static Layout GetLayout() => Layout.Instance;

public static double GetUsableWindowScale(double requestedScale, Size unscaledSize, Window window)
{
var maxScale = SettingValues.MaxWindowScale;
var screen = window.Screens.ScreenFromWindow(window) ?? window.Screens.Primary;
if (screen != null)
{
var screenScale = screen.Scaling <= 0 ? 1 : screen.Scaling;
var availableWidth = screen.WorkingArea.Width / screenScale;
var availableHeight = screen.WorkingArea.Height / screenScale;
maxScale = Math.Min(maxScale, Math.Min(availableWidth / unscaledSize.Width, availableHeight / unscaledSize.Height));
}

maxScale = Math.Max(SettingValues.MinWindowScale, maxScale);
return Math.Clamp(requestedScale, SettingValues.MinWindowScale, maxScale);
}

public static void RefreshWindow()
{
// Refresh window opens in the start page again, that is nessesairy
Expand Down
Loading