Krzysztof Krysiński před 5 měsíci
rodič
revize
d65c254501

+ 5 - 1
src/PixiEditor/Data/Localization/Languages/en.json

@@ -1018,8 +1018,12 @@
   "ONB_NEXT_BTN": "Next",
   "ONB_BACK_BTN": "Previous",
   "ONB_ANALYTICS": "Anonymous Analytics",
+  "ONB_ALL_SET": "You are all set!",
+  "ONB_ALL_SET_BTN": "Start creating",
   "ANALYTICS_INFO_DETAILED": "PixiEditor collects anonymous usage data to improve the app. The data does not contain any personal information. Among other things, PixiEditor tracks the following:\n- Which and how the tools are used\n- How long you've used the app for\n- Which commands are used\n- Performance data\n\n You can opt out of analytics at any time in the settings.",
   "PRIVACY_POLICY": "Privacy Policy",
   "ONB_SHORTCUTS": "Select Your Shortcuts",
-  "GRAPH_STATE_UNABLE_TO_CREATE_MEMBER": "Current Node Graph setup disallows creation of a new layer next to the selected one."
+  "GRAPH_STATE_UNABLE_TO_CREATE_MEMBER": "Current Node Graph setup disallows creation of a new layer next to the selected one.",
+  "PRIMARY_TOOLSET": "Primary Toolset",
+  "OPEN_ONBOARDING_WINDOW": "Open onboarding window"
 }

+ 6 - 1
src/PixiEditor/ViewModels/SubViewModels/FileViewModel.cs

@@ -150,7 +150,12 @@ internal class FileViewModel : SubViewModel<ViewModelMain>
         }
         else if (!args.Contains("--crash") && !args.Contains("--openedInExisting"))
         {
-            if (preferences!.GetPreference("ShowStartupWindow", true))
+            if(preferences.GetLocalPreference("OnboardingShown", false) == false)
+            {
+                preferences.UpdateLocalPreference("OnboardingShown", true);
+                Owner.WindowSubViewModel.OpenOnboardingWindow();
+            }
+            else if (preferences!.GetPreference("ShowStartupWindow", true))
             {
                 OpenHelloTherePopup();
             }

+ 31 - 0
src/PixiEditor/ViewModels/SubViewModels/ToolsViewModel.cs

@@ -18,6 +18,7 @@ using PixiEditor.Models.Controllers;
 using PixiEditor.Models.Events;
 using PixiEditor.Models.Handlers;
 using Drawie.Numerics;
+using PixiEditor.Extensions.CommonApi.UserPreferences.Settings;
 using PixiEditor.Models.Handlers.Toolbars;
 using PixiEditor.ViewModels.Document;
 using PixiEditor.ViewModels.Tools;
@@ -95,6 +96,7 @@ internal class ToolsViewModel : SubViewModel<ViewModelMain>, IToolsHandler
     ICollection<IToolSetHandler> IToolsHandler.AllToolSets => AllToolSets;
 
     public ObservableCollection<IToolSetHandler> AllToolSets { get; } = new();
+    public List<string> AllToolSetNames => AllToolSets.Select(x => x.Name).ToList();
 
     public event EventHandler<SelectedToolEventArgs>? SelectedToolChanged;
 
@@ -106,12 +108,39 @@ internal class ToolsViewModel : SubViewModel<ViewModelMain>, IToolsHandler
     private ToolViewModel _preTransientTool;
 
     private List<IToolHandler> allTools = new();
+    private List<ToolSetConfig> originalToolSets = new();
     private IToolSetHandler? _activeToolSet;
 
     public ToolsViewModel(ViewModelMain owner)
         : base(owner)
     {
         owner.DocumentManagerSubViewModel.ActiveDocumentChanged += ActiveDocumentChanged;
+        PixiEditorSettings.Tools.PrimaryToolset.ValueChanged += PrimaryToolsetOnValueChanged;
+    }
+
+    private void PrimaryToolsetOnValueChanged(Setting<string> setting, string? newPrimaryToolset)
+    {
+        var toolset = AllToolSets.FirstOrDefault(x => x.Name == newPrimaryToolset);
+
+        if (toolset is not null)
+        {
+            var orderedToolSetConfig = originalToolSets
+                .OrderByDescending(toolSet => toolSet.Name == newPrimaryToolset)
+                .ToList();
+            var toolsets = new List<IToolSetHandler>(AllToolSets);
+            AllToolSets.Clear();
+
+            foreach (var toolSetConfig in orderedToolSetConfig)
+            {
+                var foundToolSet = toolsets.FirstOrDefault(x => x.Name == toolSetConfig.Name);
+                if (foundToolSet is not null)
+                {
+                   AllToolSets.Add(foundToolSet);
+                }
+            }
+
+            SetActiveToolSet(toolset);
+        }
     }
 
     public void SetupTools(IServiceProvider services, ToolSetsConfig toolSetConfig)
@@ -477,6 +506,8 @@ internal class ToolsViewModel : SubViewModel<ViewModelMain>, IToolsHandler
             primaryToolSet = toolSetConfig.First().Name;
         }
 
+        originalToolSets = toolSetConfig.ToList();
+
         var orderedToolSetConfig = toolSetConfig
             .OrderByDescending(toolSet => toolSet.Name == primaryToolSet)
             .ToList();

+ 1 - 1
src/PixiEditor/ViewModels/SubViewModels/WindowViewModel.cs

@@ -237,7 +237,7 @@ internal class WindowViewModel : SubViewModel<ViewModelMain>, IWindowHandler
     }
 
     [Command.Basic("PixiEditor.Window.OpenOnboardingWindow", "OPEN_ONBOARDING_WINDOW", "OPEN_ONBOARDING_WINDOW",
-        Icon = PixiPerfectIcons.Home, MenuItemPath = "VIEW/OPEN_ONBOARDING_WINDOW",
+        Icon = PixiPerfectIcons.Compass, MenuItemPath = "VIEW/OPEN_ONBOARDING_WINDOW", MenuItemOrder = 2,
         AnalyticsTrack = true)]
     public void OpenOnboardingWindow()
     {

+ 6 - 0
src/PixiEditor/ViewModels/UserPreferences/OnboardingViewModel.cs

@@ -125,6 +125,7 @@ internal class OnboardingViewModel : PixiObservableObject
         ToolSets = new ObservableCollection<SelectionCard<IToolSetHandler>>(
             ViewModelMain.Current.ToolsSubViewModel.AllToolSets.Select(x =>
                 new SelectionCard<IToolSetHandler>(x, SelectToolsetCommand)));
+
         var firstToolSet = ToolSets.FirstOrDefault();
         if (firstToolSet != null)
         {
@@ -167,6 +168,11 @@ internal class OnboardingViewModel : PixiObservableObject
     {
         Page--;
     }
+
+    public void OnFinish()
+    {
+        ViewModelMain.Current.WindowSubViewModel.OpenHelloThereWindow();
+    }
 }
 
 public class FormStep : ObservableObject

+ 19 - 2
src/PixiEditor/Views/Dialogs/OnboardingDialog.axaml

@@ -46,11 +46,13 @@
                         Margin="0, 24, 0, 0" Orientation="Horizontal">
                 <Button ui:Translator.Key="ONBOARDING_SKIP_BTN"
                         Padding="8, 4"
+                        Focusable="False"
                         Command="{Binding Close, RelativeSource={RelativeSource AncestorType=dialogs:OnboardingDialog, Mode=FindAncestor}}"
                         HorizontalAlignment="Center" VerticalAlignment="Center" />
 
                 <Button Background="{DynamicResource ThemeAccentBrush}"
                         ui:Translator.Key="ONBOARDING_ACTION_BTN"
+                        Focusable="False"
                         Command="{Binding NextPage}"
                         HorizontalAlignment="Center" VerticalAlignment="Center" />
             </StackPanel>
@@ -133,7 +135,8 @@
                         </DataTemplate>
                     </ComboBox.ItemTemplate>
                 </ComboBox>
-                <TextBlock DockPanel.Dock="Bottom" Classes="subtext" ui:Translator.Key="LANGUAGE_INFO" />
+                <TextBlock DockPanel.Dock="Bottom" ui:Hyperlink.Url="https://discord.gg/qSRMYmq"
+                           ui:Translator.Key="LANGUAGE_INFO" />
             </StackPanel>
             <StackPanel Grid.Row="1"
                         IsVisible="{Binding FormStep.Step, Converter={converters:IsEqualConverter}, ConverterParameter=2}"
@@ -227,7 +230,21 @@
                     </DataTemplate>
                 </ItemsControl.ItemTemplate>
             </ItemsControl>
-
         </DockPanel>
+
+        <StackPanel
+            IsVisible="{Binding Page, Converter={converters:IsEqualConverter}, ConverterParameter=2}"
+            HorizontalAlignment="Center" VerticalAlignment="Center" Spacing="32" Orientation="Vertical">
+
+            <TextBlock HorizontalAlignment="Center" ui:Translator.Key="ONB_ALL_SET" Classes="h3"/>
+            <TextBlock HorizontalAlignment="Center" Text="{DynamicResource icon-check}" Classes="pixi-icon"
+                       Foreground="{DynamicResource ThemeBorderHighBrush}"
+                       FontSize="72"/>
+            <Button
+                ui:Translator.Key="ONB_ALL_SET_BTN"
+                Background="{DynamicResource ThemeAccentBrush}"
+                Command="{Binding Finish, RelativeSource={RelativeSource AncestorType=dialogs:OnboardingDialog, Mode=FindAncestor}}"
+                HorizontalAlignment="Center" VerticalAlignment="Center" />
+        </StackPanel>
     </Panel>
 </Window>

+ 11 - 0
src/PixiEditor/Views/Dialogs/OnboardingDialog.axaml.cs

@@ -1,5 +1,6 @@
 using Avalonia.Controls;
 using Avalonia.Input;
+using PixiEditor.ViewModels.UserPreferences;
 
 namespace PixiEditor.Views.Dialogs;
 
@@ -9,5 +10,15 @@ public partial class OnboardingDialog : Window
     {
         InitializeComponent();
     }
+
+    public void Finish()
+    {
+        if (DataContext is OnboardingViewModel vm)
+        {
+            vm.OnFinish();
+        }
+
+        Close();
+    }
 }
 

+ 21 - 2
src/PixiEditor/Views/Windows/Settings/SettingsWindow.axaml

@@ -169,6 +169,25 @@
                                 <!--Styles="{StaticResource TranslatedEnum}"-->
                             </StackPanel>
 
+                            <StackPanel Orientation="Horizontal" Classes="leftOffset">
+                                <Label Target="primaryToolsetComboBox" ui:Translator.Key="PRIMARY_TOOLSET"
+                                       VerticalAlignment="Center" />
+                                <ComboBox
+                                    SelectedItem="{Binding SettingsSubViewModel.Tools.PrimaryToolset, Mode=TwoWay}"
+                                    Name="primaryToolsetComboBox"
+                                    ItemsSource="{Binding Path=AllToolSetNames, Source={vm:MainVM ToolsSVM}}"
+                                    Width="160"
+                                    VerticalAlignment="Center">
+                                    <ComboBox.ItemTemplate>
+                                        <DataTemplate>
+                                            <TextBlock
+                                                ui:Translator.Key="{Binding }" />
+                                        </DataTemplate>
+                                    </ComboBox.ItemTemplate>
+                                </ComboBox>
+                                <!--Styles="{StaticResource TranslatedEnum}"-->
+                            </StackPanel>
+
                             <CheckBox Classes="leftOffset"
                                       IsChecked="{Binding SettingsSubViewModel.Tools.EnableSharedToolbar}"
                                       ui:Translator.Key="ENABLE_SHARED_TOOLBAR" />
@@ -208,12 +227,12 @@
                                       IsChecked="{Binding SettingsSubViewModel.General.IsDebugModeEnabled}"
                                       ui:Translator.Key="ENABLE_DEBUG_MODE" d:Content="Enable Debug Mode" />
 
-                            <TextBlock ui:Translator.Key="MISC"/>
+                            <TextBlock ui:Translator.Key="MISC" />
 
                             <CheckBox Classes="leftOffset"
                                       IsChecked="{Binding SettingsSubViewModel.General.AnalyticsEnabled, Mode=TwoWay}"
                                       ui:Translator.Key="ENABLE_ANALYTICS" d:Content="Enable Analytics" />
-                            <TextBlock ui:Translator.Key="ANALYTICS_INFO" Classes="leftOffset subtext"/>
+                            <TextBlock ui:Translator.Key="ANALYTICS_INFO" Classes="leftOffset subtext" />
                             <!--<Label Classes="{StaticResource SettingsText}" VerticalAlignment="Center">
                             <ui1:Hyperlink Command="{cmds:Command PixiEditor.Debug.OpenCrashReportsDirectory}" Style="{StaticResource SettingsLink}">
                                 <Run ui:Translator.Key="OPEN_CRASH_REPORTS_DIR" d:Text="Open crash reports directory"/>