Browse Source

misc: Move StatusBarSeparator into Controls namespace, rename to MiniVerticalSeparator
add bulk property change event method
give each markup extension its own property name

Evan Husted 1 year ago
parent
commit
0ca4d6e921

+ 2 - 2
src/Ryujinx/Common/LocaleManager.cs

@@ -109,7 +109,7 @@ namespace Ryujinx.Ava.Common.Locale
         {
         {
             _dynamicValues[key] = values;
             _dynamicValues[key] = values;
 
 
-            OnPropertyChanged("Item");
+            OnPropertyChanged("Translation");
 
 
             return this[key];
             return this[key];
         }
         }
@@ -138,7 +138,7 @@ namespace Ryujinx.Ava.Common.Locale
                 _localeStrings[key] = val;
                 _localeStrings[key] = val;
             }
             }
 
 
-            OnPropertyChanged("Item");
+            OnPropertyChanged("Translation");
 
 
             LocaleChanged?.Invoke();
             LocaleChanged?.Invoke();
         }
         }

+ 1 - 1
src/Ryujinx/Common/Markup/BasicMarkupExtension.cs

@@ -14,7 +14,7 @@ namespace Ryujinx.Ava.Common.Markup
 {
 {
     internal abstract class BasicMarkupExtension<T> : MarkupExtension
     internal abstract class BasicMarkupExtension<T> : MarkupExtension
     {
     {
-        public virtual string Name => "Item";
+        public abstract string Name { get; }
         public virtual Action<object, T?>? Setter => null;
         public virtual Action<object, T?>? Setter => null;
 
 
         protected abstract T? Value { get; }
         protected abstract T? Value { get; }

+ 3 - 0
src/Ryujinx/Common/Markup/MarkupExtensions.cs

@@ -6,16 +6,19 @@ namespace Ryujinx.Ava.Common.Markup
 {
 {
     internal class IconExtension(string iconString) : BasicMarkupExtension<Icon>
     internal class IconExtension(string iconString) : BasicMarkupExtension<Icon>
     {
     {
+        public override string Name => "Icon";
         protected override Icon Value => new() { Value = iconString };
         protected override Icon Value => new() { Value = iconString };
     }
     }
     
     
     internal class SpinningIconExtension(string iconString) : BasicMarkupExtension<Icon>
     internal class SpinningIconExtension(string iconString) : BasicMarkupExtension<Icon>
     {
     {
+        public override string Name => "SIcon";
         protected override Icon Value => new() { Value = iconString, Animation = IconAnimation.Spin };
         protected override Icon Value => new() { Value = iconString, Animation = IconAnimation.Spin };
     }
     }
     
     
     internal class LocaleExtension(LocaleKeys key) : BasicMarkupExtension<string>
     internal class LocaleExtension(LocaleKeys key) : BasicMarkupExtension<string>
     {
     {
+        public override string Name => "Translation";
         protected override string Value => LocaleManager.Instance[key];
         protected override string Value => LocaleManager.Instance[key];
 
 
         protected override void ConfigureBindingExtension(CompiledBindingExtension bindingExtension) 
         protected override void ConfigureBindingExtension(CompiledBindingExtension bindingExtension) 

+ 0 - 0
src/Ryujinx/UI/Controls/SliderScroll.axaml.cs → src/Ryujinx/UI/Controls/SliderScroll.cs


+ 19 - 0
src/Ryujinx/UI/Controls/StatusBarSeparator.cs

@@ -0,0 +1,19 @@
+using Avalonia;
+using Avalonia.Controls;
+using Avalonia.Media;
+
+namespace Ryujinx.Ava.UI.Controls
+{
+    public class MiniVerticalSeparator : Border
+    {
+        public MiniVerticalSeparator()
+        {
+            Width = 2;
+            Height = 12;
+            Margin = new Thickness();
+            BorderBrush = Brushes.Gray;
+            Background = Brushes.Gray;
+            BorderThickness = new Thickness(1);
+        }
+    }
+}

+ 9 - 0
src/Ryujinx/UI/ViewModels/BaseModel.cs

@@ -1,3 +1,4 @@
+using System;
 using System.ComponentModel;
 using System.ComponentModel;
 using System.Runtime.CompilerServices;
 using System.Runtime.CompilerServices;
 
 
@@ -11,5 +12,13 @@ namespace Ryujinx.Ava.UI.ViewModels
         {
         {
             PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
             PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
         }
         }
+        
+        protected void OnPropertiesChanged(params ReadOnlySpan<string> propertyNames)
+        {
+            foreach (var propertyName in propertyNames)
+            {
+                OnPropertyChanged(propertyName);
+            }
+        }
     }
     }
 }
 }

+ 8 - 7
src/Ryujinx/UI/ViewModels/SettingsViewModel.cs

@@ -71,8 +71,7 @@ namespace Ryujinx.Ava.UI.ViewModels
             {
             {
                 _resolutionScale = value;
                 _resolutionScale = value;
 
 
-                OnPropertyChanged(nameof(CustomResolutionScale));
-                OnPropertyChanged(nameof(IsCustomResolutionScaleActive));
+                OnPropertiesChanged(nameof(CustomResolutionScale), nameof(IsCustomResolutionScaleActive));
             }
             }
         }
         }
 
 
@@ -181,8 +180,9 @@ namespace Ryujinx.Ava.UI.ViewModels
                 int newInterval = (int)((value / 100f) * 60);
                 int newInterval = (int)((value / 100f) * 60);
                 _customVSyncInterval = newInterval;
                 _customVSyncInterval = newInterval;
                 _customVSyncIntervalPercentageProxy = value;
                 _customVSyncIntervalPercentageProxy = value;
-                OnPropertyChanged((nameof(CustomVSyncInterval)));
-                OnPropertyChanged((nameof(CustomVSyncIntervalPercentageText)));
+                OnPropertiesChanged(
+                    nameof(CustomVSyncInterval), 
+                    nameof(CustomVSyncIntervalPercentageText));
             }
             }
         }
         }
 
 
@@ -190,7 +190,7 @@ namespace Ryujinx.Ava.UI.ViewModels
         {
         {
             get
             get
             {
             {
-                string text = CustomVSyncIntervalPercentageProxy.ToString() + "%";
+                string text = CustomVSyncIntervalPercentageProxy + "%";
                 return text;
                 return text;
             }
             }
         }
         }
@@ -221,8 +221,9 @@ namespace Ryujinx.Ava.UI.ViewModels
                 _customVSyncInterval = value;
                 _customVSyncInterval = value;
                 int newPercent = (int)((value / 60f) * 100);
                 int newPercent = (int)((value / 60f) * 100);
                 _customVSyncIntervalPercentageProxy = newPercent;
                 _customVSyncIntervalPercentageProxy = newPercent;
-                OnPropertyChanged(nameof(CustomVSyncIntervalPercentageProxy));
-                OnPropertyChanged(nameof(CustomVSyncIntervalPercentageText));
+                OnPropertiesChanged(
+                    nameof(CustomVSyncIntervalPercentageProxy), 
+                    nameof(CustomVSyncIntervalPercentageText));
                 OnPropertyChanged();
                 OnPropertyChanged();
             }
             }
         }
         }

+ 27 - 23
src/Ryujinx/UI/ViewModels/XCITrimmerViewModel.cs

@@ -91,39 +91,42 @@ namespace Ryujinx.Ava.UI.ViewModels
 
 
         private void SortingChanged()
         private void SortingChanged()
         {
         {
-            OnPropertyChanged(nameof(IsSortedByName));
-            OnPropertyChanged(nameof(IsSortedBySaved));
-            OnPropertyChanged(nameof(SortingAscending));
-            OnPropertyChanged(nameof(SortingField));
-            OnPropertyChanged(nameof(SortingFieldName));
+            OnPropertiesChanged(
+                nameof(IsSortedByName), 
+                nameof(IsSortedBySaved), 
+                nameof(SortingAscending), 
+                nameof(SortingField), 
+                nameof(SortingFieldName));
+            
             SortAndFilter();
             SortAndFilter();
         }
         }
 
 
         private void DisplayedChanged()
         private void DisplayedChanged()
         {
         {
-            OnPropertyChanged(nameof(Status));
-            OnPropertyChanged(nameof(DisplayedXCIFiles));
-            OnPropertyChanged(nameof(SelectedDisplayedXCIFiles));
+            OnPropertiesChanged(nameof(Status), nameof(DisplayedXCIFiles), nameof(SelectedDisplayedXCIFiles));
         }
         }
 
 
         private void ApplicationsChanged()
         private void ApplicationsChanged()
         {
         {
-            OnPropertyChanged(nameof(AllXCIFiles));
-            OnPropertyChanged(nameof(Status));
-            OnPropertyChanged(nameof(PotentialSavings));
-            OnPropertyChanged(nameof(ActualSavings));
-            OnPropertyChanged(nameof(CanTrim));
-            OnPropertyChanged(nameof(CanUntrim));
+            OnPropertiesChanged(
+                nameof(AllXCIFiles), 
+                nameof(Status), 
+                nameof(PotentialSavings), 
+                nameof(ActualSavings), 
+                nameof(CanTrim), 
+                nameof(CanUntrim));
+            
             DisplayedChanged();
             DisplayedChanged();
             SortAndFilter();
             SortAndFilter();
         }
         }
 
 
         private void SelectionChanged(bool displayedChanged = true)
         private void SelectionChanged(bool displayedChanged = true)
         {
         {
-            OnPropertyChanged(nameof(Status));
-            OnPropertyChanged(nameof(CanTrim));
-            OnPropertyChanged(nameof(CanUntrim));
-            OnPropertyChanged(nameof(SelectedXCIFiles));
+            OnPropertiesChanged(
+                nameof(Status), 
+                nameof(CanTrim), 
+                nameof(CanUntrim), 
+                nameof(SelectedXCIFiles));
 
 
             if (displayedChanged)
             if (displayedChanged)
                 OnPropertyChanged(nameof(SelectedDisplayedXCIFiles));
                 OnPropertyChanged(nameof(SelectedDisplayedXCIFiles));
@@ -131,11 +134,12 @@ namespace Ryujinx.Ava.UI.ViewModels
 
 
         private void ProcessingChanged()
         private void ProcessingChanged()
         {
         {
-            OnPropertyChanged(nameof(Processing));
-            OnPropertyChanged(nameof(Cancel));
-            OnPropertyChanged(nameof(Status));
-            OnPropertyChanged(nameof(CanTrim));
-            OnPropertyChanged(nameof(CanUntrim));
+            OnPropertiesChanged(
+                nameof(Processing), 
+                nameof(Cancel), 
+                nameof(Status), 
+                nameof(CanTrim), 
+                nameof(CanUntrim));
         }
         }
 
 
         private IEnumerable<XCITrimmerFileModel> GetSelectedDisplayedXCIFiles()
         private IEnumerable<XCITrimmerFileModel> GetSelectedDisplayedXCIFiles()

+ 8 - 8
src/Ryujinx/UI/Views/Main/MainStatusBarView.axaml

@@ -133,7 +133,7 @@
                         </Flyout>
                         </Flyout>
                     </Button.Flyout>
                     </Button.Flyout>
                 </Button>
                 </Button>
-            <local:StatusBarSeparator IsVisible="{Binding !ShowLoadProgress}" />
+            <controls:MiniVerticalSeparator IsVisible="{Binding !ShowLoadProgress}" />
             <TextBlock
             <TextBlock
                 Name="DockedStatus"
                 Name="DockedStatus"
                 Margin="5,0,5,0"
                 Margin="5,0,5,0"
@@ -143,7 +143,7 @@
                 PointerReleased="DockedStatus_PointerReleased"
                 PointerReleased="DockedStatus_PointerReleased"
                 Text="{Binding DockedStatusText}"
                 Text="{Binding DockedStatusText}"
                 TextAlignment="Start" />
                 TextAlignment="Start" />
-            <local:StatusBarSeparator IsVisible="{Binding !ShowLoadProgress}" />
+            <controls:MiniVerticalSeparator IsVisible="{Binding !ShowLoadProgress}" />
             <SplitButton
             <SplitButton
                 Name="AspectRatioStatus"
                 Name="AspectRatioStatus"
                 Padding="5,0,5,0"
                 Padding="5,0,5,0"
@@ -190,7 +190,7 @@
                     </MenuFlyout>
                     </MenuFlyout>
                 </SplitButton.Flyout>
                 </SplitButton.Flyout>
             </SplitButton>
             </SplitButton>
-            <local:StatusBarSeparator IsVisible="{Binding !ShowLoadProgress}" />
+            <controls:MiniVerticalSeparator IsVisible="{Binding !ShowLoadProgress}" />
             <ToggleSplitButton
             <ToggleSplitButton
                 Name="VolumeStatus"
                 Name="VolumeStatus"
                 Padding="5,0,5,0"
                 Padding="5,0,5,0"
@@ -234,7 +234,7 @@
                     </Flyout>
                     </Flyout>
                 </ToggleSplitButton.Flyout>
                 </ToggleSplitButton.Flyout>
             </ToggleSplitButton>
             </ToggleSplitButton>
-            <local:StatusBarSeparator IsVisible="{Binding !ShowLoadProgress}" />
+            <controls:MiniVerticalSeparator IsVisible="{Binding !ShowLoadProgress}" />
             <TextBlock
             <TextBlock
                 Margin="5,0,5,0"
                 Margin="5,0,5,0"
                 HorizontalAlignment="Left"
                 HorizontalAlignment="Left"
@@ -242,7 +242,7 @@
                 IsVisible="{Binding !ShowLoadProgress}"
                 IsVisible="{Binding !ShowLoadProgress}"
                 Text="{Binding GameStatusText}"
                 Text="{Binding GameStatusText}"
                 TextAlignment="Start" />
                 TextAlignment="Start" />
-            <local:StatusBarSeparator IsVisible="{Binding !ShowLoadProgress}" />
+            <controls:MiniVerticalSeparator IsVisible="{Binding !ShowLoadProgress}" />
             <TextBlock
             <TextBlock
                 Margin="5,0,5,0"
                 Margin="5,0,5,0"
                 HorizontalAlignment="Left"
                 HorizontalAlignment="Left"
@@ -264,7 +264,7 @@
                 VerticalAlignment="Center"
                 VerticalAlignment="Center"
                 IsVisible="{Binding ShowShaderCompilationHint}"
                 IsVisible="{Binding ShowShaderCompilationHint}"
                 Text="{Binding ShaderCountText}" />
                 Text="{Binding ShaderCountText}" />
-            <local:StatusBarSeparator IsVisible="{Binding ShowShaderCompilationHint}" />
+            <controls:MiniVerticalSeparator IsVisible="{Binding ShowShaderCompilationHint}" />
             <TextBlock
             <TextBlock
                 Margin="5,0,5,0"
                 Margin="5,0,5,0"
                 HorizontalAlignment="Left"
                 HorizontalAlignment="Left"
@@ -272,7 +272,7 @@
                 IsVisible="{Binding !ShowLoadProgress}"
                 IsVisible="{Binding !ShowLoadProgress}"
                 Text="{Binding BackendText}"
                 Text="{Binding BackendText}"
                 TextAlignment="Start" />
                 TextAlignment="Start" />
-            <local:StatusBarSeparator IsVisible="{Binding !ShowLoadProgress}" />
+            <controls:MiniVerticalSeparator IsVisible="{Binding !ShowLoadProgress}" />
             <TextBlock
             <TextBlock
                 Margin="5,0,0,0"
                 Margin="5,0,0,0"
                 HorizontalAlignment="Left"
                 HorizontalAlignment="Left"
@@ -287,7 +287,7 @@
             VerticalAlignment="Center"
             VerticalAlignment="Center"
             IsVisible="{Binding ShowFirmwareStatus}"
             IsVisible="{Binding ShowFirmwareStatus}"
             Orientation="Horizontal">
             Orientation="Horizontal">
-            <local:StatusBarSeparator IsVisible="{Binding IsGameRunning}" />
+            <controls:MiniVerticalSeparator IsVisible="{Binding IsGameRunning}" />
             <TextBlock
             <TextBlock
                 Name="FirmwareStatus"
                 Name="FirmwareStatus"
                 Margin="5, 0, 0, 0"
                 Margin="5, 0, 0, 0"

+ 1 - 20
src/Ryujinx/UI/Views/Main/MainStatusBarView.axaml.cs

@@ -2,7 +2,6 @@ using Avalonia;
 using Avalonia.Controls;
 using Avalonia.Controls;
 using Avalonia.Input;
 using Avalonia.Input;
 using Avalonia.Interactivity;
 using Avalonia.Interactivity;
-using Avalonia.Media;
 using Avalonia.Threading;
 using Avalonia.Threading;
 using Ryujinx.Ava.Common.Locale;
 using Ryujinx.Ava.Common.Locale;
 using Ryujinx.Ava.UI.Windows;
 using Ryujinx.Ava.UI.Windows;
@@ -63,27 +62,9 @@ namespace Ryujinx.Ava.UI.Views.Main
             // Change the volume by 5% at a time
             // Change the volume by 5% at a time
             float newValue = Window.ViewModel.Volume + (float)e.Delta.Y * 0.05f;
             float newValue = Window.ViewModel.Volume + (float)e.Delta.Y * 0.05f;
 
 
-            Window.ViewModel.Volume = newValue switch
-            {
-                < 0 => 0,
-                > 1 => 1,
-                _ => newValue,
-            };
+            Window.ViewModel.Volume = Math.Clamp(newValue, 0, 1);
 
 
             e.Handled = true;
             e.Handled = true;
         }
         }
     }
     }
-
-    public class StatusBarSeparator : Border
-    {
-        public StatusBarSeparator()
-        {
-            Width = 2;
-            Height = 12;
-            Margin = new Thickness();
-            BorderBrush = Brushes.Gray;
-            Background = Brushes.Gray;
-            BorderThickness = new Thickness(1);
-        }
-    }
 }
 }