Browse Source

Made flow direction work

Krzysztof Krysiński 1 year ago
parent
commit
e2ccb4fe91

+ 0 - 47
src/PixiEditor.AvaloniaUI/Helpers/MarkupExtensions/LocalizationExtension.cs

@@ -1,47 +0,0 @@
-using Avalonia.Data;
-using Avalonia.Markup.Xaml;
-using Avalonia.Media;
-
-namespace PixiEditor.AvaloniaUI.Helpers.MarkupExtensions;
-
-public class LocalizationExtension : MarkupExtension
-{
-    private LocalizationExtensionToProvide toProvide;
-    private static Binding flowDirectionBinding;
-
-    public LocalizationExtension(LocalizationExtensionToProvide toProvide)
-    {
-
-    }
-
-    public override object ProvideValue(IServiceProvider serviceProvider)
-    {
-        switch (toProvide)
-        {
-            case LocalizationExtensionToProvide.FlowDirection:
-                return GetFlowDirectionBinding(serviceProvider);
-        }
-
-        throw new NotImplementedException();
-    }
-
-    private object GetFlowDirectionBinding(IServiceProvider serviceProvider)
-    {
-        //TODO: Fix this
-        /*flowDirectionBinding = new Binding("CurrentLanguage.FlowDirection");
-        flowDirectionBinding.Source = ViewModelMain.Current.LocalizationProvider;
-        flowDirectionBinding.Mode = BindingMode.OneWay;
-
-        var expression = (BindingExpression)flowDirectionBinding.ProvideValue(serviceProvider);
-
-        ViewModelMain.Current.LocalizationProvider.OnLanguageChanged += _ => expression.UpdateTarget();
-
-        return expression;*/
-        return FlowDirection.LeftToRight;
-    }
-}
-
-public enum LocalizationExtensionToProvide
-{
-    FlowDirection
-}

+ 4 - 0
src/PixiEditor.AvaloniaUI/PixiEditor.AvaloniaUI.csproj

@@ -78,6 +78,10 @@
         <DependentUpon>Viewport.axaml</DependentUpon>
         <SubType>Code</SubType>
       </Compile>
+      <Compile Update="Views\Dialogs\Debug\Localization\LocalizationDebugWindow.axaml.cs">
+        <DependentUpon>LocalizationDebugWindow.axaml</DependentUpon>
+        <SubType>Code</SubType>
+      </Compile>
     </ItemGroup>
   
     <ItemGroup>

+ 4 - 1
src/PixiEditor.AvaloniaUI/Styles/PixiEditorPopupTemplate.axaml

@@ -1,7 +1,9 @@
 <Styles xmlns="https://github.com/avaloniaui"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:controls="using:PixiEditor.AvaloniaUI.Views.Dialogs"
-        xmlns:behaviours="clr-namespace:PixiEditor.AvaloniaUI.Helpers.Behaviours">
+        xmlns:behaviours="clr-namespace:PixiEditor.AvaloniaUI.Helpers.Behaviours"
+        xmlns:markupExtensions="clr-namespace:PixiEditor.AvaloniaUI.Helpers.MarkupExtensions"
+        xmlns:ui="clr-namespace:PixiEditor.Extensions.UI;assembly=PixiEditor.Extensions">
     <Design.PreviewWith>
         <controls:PixiEditorPopup Width="400" Height="400" SizeToContent="Manual"/>
     </Design.PreviewWith>
@@ -17,6 +19,7 @@
         <Setter Property="Foreground" Value="{DynamicResource ThemeForegroundBrush}" />
         <Setter Property="FontSize" Value="{DynamicResource FontSizeNormal}" />
         <Setter Property="ShowInTaskbar" Value="{TemplateBinding CanMinimize}"/>
+        <Setter Property="ui:Translator.UseLanguageFlowDirection" Value="True"></Setter>
         <Setter Property="Template">
             <ControlTemplate>
                 <Panel>

+ 3 - 3
src/PixiEditor.AvaloniaUI/ViewModels/SubViewModels/DebugViewModel.cs

@@ -13,6 +13,7 @@ using PixiEditor.AvaloniaUI.Models.Commands.Attributes.Commands;
 using PixiEditor.AvaloniaUI.Models.Commands.Templates.Providers.Parsers;
 using PixiEditor.AvaloniaUI.Models.Dialogs;
 using PixiEditor.AvaloniaUI.Views;
+using PixiEditor.AvaloniaUI.Views.Dialogs.Debug.Localization;
 using PixiEditor.Extensions.Common.Localization;
 using PixiEditor.Extensions.Common.UserPreferences;
 using PixiEditor.OperatingSystem;
@@ -226,10 +227,9 @@ internal class DebugViewModel : SubViewModel<ViewModelMain>
     {
         if (Application.Current.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
         {
-            //TODO: Implement LocalizationDebugWindow
-            /*var window = desktop.Windows.OfType<LocalizationDebugWindow>().FirstOrDefault(new LocalizationDebugWindow());
+            var window = desktop.Windows.OfType<LocalizationDebugWindow>().FirstOrDefault(new LocalizationDebugWindow());
             window.Show();
-            window.Activate();*/
+            window.Activate();
         }
 
     }

+ 2 - 0
src/PixiEditor.AvaloniaUI/Views/MainWindow.axaml

@@ -3,6 +3,7 @@
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
         xmlns:views1="clr-namespace:PixiEditor.AvaloniaUI.Views"
+        xmlns:ui="clr-namespace:PixiEditor.Extensions.UI;assembly=PixiEditor.Extensions"
         Height="1000"
         Width="1600"
         mc:Ignorable="d" d:DesignWidth="1600" d:DesignHeight="1000"
@@ -11,6 +12,7 @@
         WindowState="Maximized"
         Name="Window"
         Icon="/Images/favicon.ico"
+        ui:Translator.UseLanguageFlowDirection="True"
         Title="PixiEditor">
     <views1:MainView />
 </Window>

+ 1 - 1
src/PixiEditor.AvaloniaUI/Views/Palettes/ColorReplacer.axaml

@@ -32,7 +32,7 @@
                                                ui:Translator.TooltipKey="REPLACER_TOOLTIP"
                                                ui1:DragDropEvents.Drop="PaletteColorControl_OnDrop"
                                                DragDrop.AllowDrop="True" />
-                    <Image Source="/Images/Arrow-right.png" Height="20" Width="20" Margin="10 0" FlowDirection="{markupExtensions:Localization FlowDirection}"/>
+                    <Image Source="/Images/Arrow-right.png" Height="20" Width="20" Margin="10 0" ui:Translator.UseLanguageFlowDirection="True"/>
                     <colorPicker:PortableColorPicker
                         UseHintColor="True"
                         SelectedColor="{Binding ElementName=uc, Path=NewColor, Mode=TwoWay}"

+ 1 - 1
src/PixiEditor.AvaloniaUI/Views/Shortcuts/ImportShortcutTemplatePopup.axaml

@@ -17,7 +17,7 @@
     SizeToContent="WidthAndHeight"
     Background="{DynamicResource AccentColor}"
     Name="window"
-    FlowDirection="{markupExtensions:Localization FlowDirection}"
+    ui:Translator.UseLanguageFlowDirection="True"
     ui:Translator.Key="IMPORT_FROM_TEMPLATE">
 
     

+ 2 - 0
src/PixiEditor.Extensions/Common/Localization/ILocalizationProvider.cs

@@ -9,6 +9,7 @@ public interface ILocalizationProvider
     public LanguageData SelectedLanguage { get; }
     public LanguageData FollowSystem { get; }
     public event Action<Language> OnLanguageChanged;
+    public static event Action<ILocalizationProvider> OnLocalizationProviderChanged;
 
     /// <summary>
     ///     Loads the localization data from the specified file.
@@ -22,5 +23,6 @@ public interface ILocalizationProvider
     protected static void SetAsCurrent(ILocalizationProvider provider)
     {
         Current = provider;
+        OnLocalizationProviderChanged?.Invoke(provider);
     }
 }

+ 29 - 0
src/PixiEditor.Extensions/UI/Translator.cs

@@ -4,6 +4,7 @@ using Avalonia.Controls.Documents;
 using Avalonia.Controls.Primitives;
 using Avalonia.Data;
 using Avalonia.Data.Core;
+using Avalonia.Media;
 using Avalonia.Reactive;
 using PixiEditor.Extensions.Common.Localization;
 using PixiEditor.Extensions.Helpers;
@@ -33,6 +34,12 @@ public class Translator : Control
     public static readonly AttachedProperty<LocalizedString> TooltipLocalizedStringProperty =
         AvaloniaProperty.RegisterAttached<Translator, Control, LocalizedString>("TooltipLocalizedString");
 
+    public static readonly AttachedProperty<bool> UseLanguageFlowDirectionProperty =
+        AvaloniaProperty.RegisterAttached<Translator, Control, bool>("UseLanguageFlowDirection");
+
+    public static void SetUseLanguageFlowDirection(Control obj, bool value) => obj.SetValue(UseLanguageFlowDirectionProperty, value);
+    public static bool GetUseLanguageFlowDirection(Control obj) => obj.GetValue(UseLanguageFlowDirectionProperty);
+
     static Translator()
     {
         IObserver<AvaloniaPropertyChangedEventArgs<string>> keyObserver = new AnonymousObserver<AvaloniaPropertyChangedEventArgs<string>>(KeyPropertyChanged);
@@ -49,6 +56,28 @@ public class Translator : Control
 
         IObserver<AvaloniaPropertyChangedEventArgs<LocalizedString>> tooltipLocalizedStringObserver = new AnonymousObserver<AvaloniaPropertyChangedEventArgs<LocalizedString>>(TooltipLocalizedStringPropertyChanged);
         TooltipLocalizedStringProperty.Changed.Subscribe(tooltipLocalizedStringObserver);
+
+        IObserver<AvaloniaPropertyChangedEventArgs<bool>> useLanguageFlowDirectionObserver = new AnonymousObserver<AvaloniaPropertyChangedEventArgs<bool>>(UseLanguageFlowDirectionPropertyChanged);
+        UseLanguageFlowDirectionProperty.Changed.Subscribe(useLanguageFlowDirectionObserver);
+    }
+
+    private static void UseLanguageFlowDirectionPropertyChanged(AvaloniaPropertyChangedEventArgs<bool> obj)
+    {
+        if (!obj.NewValue.Value)
+        {
+            obj.Sender.SetValue(Control.FlowDirectionProperty, FlowDirection.LeftToRight);
+            ILocalizationProvider.Current.OnLanguageChanged -= (lang) => OnLanguageChangedFlowDirection(obj.Sender);
+        }
+        else
+        {
+            OnLanguageChangedFlowDirection(obj.Sender);
+            ILocalizationProvider.Current.OnLanguageChanged += (lang) => OnLanguageChangedFlowDirection(obj.Sender);
+        }
+    }
+
+    private static void OnLanguageChangedFlowDirection(AvaloniaObject objSender)
+    {
+        objSender.SetValue(Control.FlowDirectionProperty, ILocalizationProvider.Current.CurrentLanguage.FlowDirection);
     }
 
     private static void TooltipLocalizedStringPropertyChanged(AvaloniaPropertyChangedEventArgs<LocalizedString> e)

+ 1 - 0
src/PixiEditor.OperatingSystem/IProcessUtility.cs

@@ -6,4 +6,5 @@ public interface IProcessUtility
 {
     public Process RunAsAdmin(string path);
     public bool IsRunningAsAdministrator();
+    public void ShellExecute(string toExecute);
 }

+ 5 - 0
src/PixiEditor.Windows/WindowsProcessUtility.cs

@@ -32,6 +32,11 @@ public class WindowsProcessUtility : IProcessUtility
         });
     }
 
+    void IProcessUtility.ShellExecute(string url)
+    {
+        ShellExecute(url);
+    }
+
     public static void ShellExecute(string url, string args)
     {
         Process.Start(new ProcessStartInfo