From 72f77d7769124e49851049cf5e20b48abdafdf09 Mon Sep 17 00:00:00 2001 From: getdn Date: Wed, 22 May 2024 10:31:35 +0700 Subject: [PATCH] Improve stability and codebase, and add bypass MinSize setting --- UnitedSets/App.xaml.cs | 32 +------- UnitedSets/{ => App}/UnitedSetsApp.cs | 11 ++- UnitedSets/App/UnitedSetsAppConfiguration.cs | 28 +++++++ .../UnitedSetsAppSettings.cs} | 28 ++++--- UnitedSets/Classes/PreservedDataClasses.cs | 5 +- UnitedSets/Classes/USConfig.cs | 6 +- UnitedSets/Constants.cs | 3 + UnitedSets/Properties/launchSettings.json | 2 +- .../Services/PreservedTabDataService.cs | 74 +++++++++--------- UnitedSets/Tabs/TabBase.Static.Loop.cs | 2 +- UnitedSets/Tabs/TabBase.Static.cs | 7 +- UnitedSets/UI/AppWindows/MainWindow.xaml | 5 -- .../MainWindow.xaml.API.Implementation.cs | 4 +- ...Window.xaml.EventHandler.Implementation.cs | 11 +-- .../AppWindows/MainWindow.xaml.Properties.cs | 5 ++ .../UI/AppWindows/MainWindow.xaml.Setup.cs | 78 ++++--------------- UnitedSets/UI/AppWindows/MainWindow.xaml.cs | 2 +- UnitedSets/UI/AppWindows/MicaWindow.cs | 75 ------------------ UnitedSets/UI/AppWindows/OOBEWindow.xaml | 5 +- UnitedSets/UI/AppWindows/OOBEWindow.xaml.cs | 7 +- .../UI/AppWindows/SettingsWindow.xaml.cs | 4 +- .../MainWindowMenuFlyoutModule.xaml.cs | 2 +- UnitedSets/UI/Popups/AddTabPopup.xaml | 4 +- UnitedSets/UI/Popups/AddTabPopup.xaml.cs | 6 +- WindowHoster/RegisteredWindow.cs | 18 +++-- WindowHoster/RegisteredWindowController.cs | 8 +- WindowHoster/WindowHost.cs | 15 +++- 27 files changed, 190 insertions(+), 257 deletions(-) rename UnitedSets/{ => App}/UnitedSetsApp.cs (84%) create mode 100644 UnitedSets/App/UnitedSetsAppConfiguration.cs rename UnitedSets/{MVVM/Services/SettingsService.cs => App/UnitedSetsAppSettings.cs} (82%) delete mode 100644 UnitedSets/UI/AppWindows/MicaWindow.cs diff --git a/UnitedSets/App.xaml.cs b/UnitedSets/App.xaml.cs index b832071..2bc13a3 100644 --- a/UnitedSets/App.xaml.cs +++ b/UnitedSets/App.xaml.cs @@ -1,54 +1,30 @@ -using CommunityToolkit.Mvvm.Input; -using CommunityToolkit.WinUI.Helpers; -using Microsoft.Extensions.DependencyInjection; using Microsoft.UI.Xaml; -using Microsoft.UI.Xaml.Controls; using System; -using System.Collections.ObjectModel; using System.Diagnostics; using System.IO; using System.Runtime.ExceptionServices; using System.Threading.Tasks; using UnitedSets.Classes; -using UnitedSets.Helpers; -using UnitedSets.Mvvm.Services; -using UnitedSets.Services; using UnitedSets.UI.AppWindows; -using Windows.Storage; -using WinRT; -using WinUIEx; namespace UnitedSets; -/// -/// Provides application-specific behavior to supplement the default Application class. -/// public partial class App : Application { - public static SettingsService SettingsService { get; } = SettingsService.Settings; - - /// - /// Initializes the singleton application object. This is the first line of authored code - /// executed, and as such is the logical equivalent of main() or WinMain(). - /// public App() { Directory.CreateDirectory(USConfig.AppDataPath); InitializeComponent(); - - cfg = new(); - if (!cfg.LoadPreviousSessionData()) - cfg.LoadInitialSettingsAndTheme(); + // Ensure initialized + UnitedSetsApp app = UnitedSetsApp.Current; #if DEBUG RequestAttachDebugger(); #else - UnhandledException += OnUnhandledException; TaskScheduler.UnobservedTaskException += OnUnobservedException; AppDomain.CurrentDomain.FirstChanceException += CurrentDomain_FirstChanceException; #endif } - private PreservedTabDataService cfg; async static void RequestAttachDebugger() { @@ -60,7 +36,7 @@ protected override void OnLaunched(LaunchActivatedEventArgs args) { //DebugRedir.Listen(); //if (Constants.IsFirstRun) - //LaunchNewOOBE(); + // LaunchNewOOBE(); //else LaunchNewMain(); } @@ -74,7 +50,7 @@ void LaunchNewOOBE() public void LaunchNewMain() { - var window = new MainWindow(cfg); + var window = new MainWindow(); window.Activate(); } diff --git a/UnitedSets/UnitedSetsApp.cs b/UnitedSets/App/UnitedSetsApp.cs similarity index 84% rename from UnitedSets/UnitedSetsApp.cs rename to UnitedSets/App/UnitedSetsApp.cs index efd51a0..ec24e45 100644 --- a/UnitedSets/UnitedSetsApp.cs +++ b/UnitedSets/App/UnitedSetsApp.cs @@ -11,13 +11,21 @@ using System.Diagnostics.CodeAnalysis; using System.Diagnostics; using System.Threading.Tasks; +using UnitedSets.Services; +using UnitedSets.Classes; +using UnitedSets.Mvvm.Services; namespace UnitedSets; partial class UnitedSetsApp : INotifyPropertyChanged { // singleton setup - private UnitedSetsApp() { } + private UnitedSetsApp() { + Settings = new(); + Configuration = new(); + } + public UnitedSetsAppSettings Settings { get; } = new(); + public UnitedSetsAppConfiguration Configuration { get; } = new(); public static UnitedSetsApp Current { get; } = new(); readonly List _allWindows = []; @@ -42,7 +50,6 @@ public void RegisterUnitedSetsWindow(MainWindow window) { return Tabs.ToArray().FirstOrDefault(tab => tab.Windows.Contains(window)); } - [DoesNotReturn] public async Task Suicide() { diff --git a/UnitedSets/App/UnitedSetsAppConfiguration.cs b/UnitedSets/App/UnitedSetsAppConfiguration.cs new file mode 100644 index 0000000..4fd2315 --- /dev/null +++ b/UnitedSets/App/UnitedSetsAppConfiguration.cs @@ -0,0 +1,28 @@ +using System.Threading.Tasks; +using UnitedSets.Classes; +using UnitedSets.Services; + +namespace UnitedSets; + +class UnitedSetsAppConfiguration +{ + public UnitedSetsAppConfiguration() + { + PersistantService = new(); + if (!PersistantService.LoadPreviousSessionData(out var cfg)) + PersistantService.LoadInitialSettingsAndTheme(out cfg); + MainConfiguration = cfg; + } + public PreservedTabDataService PersistantService { get; } + public USConfig MainConfiguration { get; private set; } = null!; + public void SaveCurSettingsAsDefault() => PersistantService.ExportSettings(USConfig.DefaultConfigFile, true, true);//don't give user any choice as to what for now so will exclude current tabs + public async Task ResetSettingsToDefault() + { + await PersistantService.ResetSettings(); + SaveCurSettingsAsDefault(); + } + public void SaveCurrentSession() + { + PersistantService.ExportSettings(USConfig.SessionSaveConfigFile, true, ExcludeTabs: false); + } +} diff --git a/UnitedSets/MVVM/Services/SettingsService.cs b/UnitedSets/App/UnitedSetsAppSettings.cs similarity index 82% rename from UnitedSets/MVVM/Services/SettingsService.cs rename to UnitedSets/App/UnitedSetsAppSettings.cs index 0a55e34..32f5810 100644 --- a/UnitedSets/MVVM/Services/SettingsService.cs +++ b/UnitedSets/App/UnitedSetsAppSettings.cs @@ -3,9 +3,7 @@ using System.Runtime.InteropServices; using System.Diagnostics.CodeAnalysis; using UnitedSets.Settings; -using Cube.UI.Icons; using System.Collections.Generic; -using System.Collections.ObjectModel; using System; using Microsoft.UI.Xaml.Media; using Microsoft.UI.Composition.SystemBackdrops; @@ -17,15 +15,14 @@ namespace UnitedSets.Mvvm.Services; -public partial class SettingsService +public partial class UnitedSetsAppSettings { - public static SettingsService Settings { get; } = new(); - public USConfig cfg { get; set; } = null!; - private SettingsService() + private static USConfig Configuration => UnitedSetsApp.Current.Configuration.PersistantService.MainConfiguration; + public UnitedSetsAppSettings() { AllSettings = [ CloseWindowOnCloseTab = new( - () => cfg.CloseWindowOnCloseTab, x => cfg.CloseWindowOnCloseTab = x + () => Configuration.CloseWindowOnCloseTab, x => Configuration.CloseWindowOnCloseTab = x ) { Title = "Closing tab closes window", @@ -41,15 +38,23 @@ private SettingsService() // Icon = SymbolEx.PPSOneLandscape, // RequiresRestart = true //}, + BypassMinimumSize = new(() => Configuration.BypassMinSize, x => Configuration.BypassMinSize = x) { + Title = "Bypass Minimum Size", + Description = $"Allows resizing the window down to { + Constants.BypassMinWidth}x{Constants.BypassMinHeight + } (Normal minimum size is { + Constants.MinWidth}x{Constants.MinHeight})", + Icon = SymbolEx.ResizeMouseSmall + }, BackdropMode = new( - () => cfg.Design!.Backdrop, x => cfg.Design!.Backdrop = x, Enums.GetValues() + () => Configuration.Design!.Backdrop, x => Configuration.Design!.Backdrop = x, Enums.GetValues() ) { Title = "Window Background", Description = "Select the Window Background (NOTE: Changing to Transparent requires restart)", Icon = SymbolEx.Color }, WindowTitlePrefix = new( - () => cfg.TitlePrefix ?? "", x => cfg.TitlePrefix = x + () => Configuration.TitlePrefix ?? "", x => Configuration.TitlePrefix = x ) { Title = "Window Title Prefix", @@ -58,7 +63,7 @@ private SettingsService() PlaceholderText = "None - Normal Title Mode" }, Theme = new( - () => cfg.Design.Theme ?? ElementTheme.Default, x => cfg.Design.Theme = x, + () => Configuration.Design!.Theme ?? ElementTheme.Default, x => Configuration.Design!.Theme = x, Enums.GetValues() ) { @@ -72,7 +77,8 @@ private SettingsService() public IReadOnlyList AllSettings { get; } public OnOffSetting CloseWindowOnCloseTab { get; } - public OnOffSetting TransculentWindow { get; } + public OnOffSetting BypassMinimumSize { get; } + //public OnOffSetting TransculentWindow { get; } public TextSetting WindowTitlePrefix { get; } public SelectSetting Theme { get; } diff --git a/UnitedSets/Classes/PreservedDataClasses.cs b/UnitedSets/Classes/PreservedDataClasses.cs index c570c04..113d5aa 100644 --- a/UnitedSets/Classes/PreservedDataClasses.cs +++ b/UnitedSets/Classes/PreservedDataClasses.cs @@ -76,7 +76,10 @@ protected SavedInstanceData _CloneWithoutTabs() { [AutoNotifyProperty] public bool _CloseWindowOnCloseTab; - public event PropertyChangedEventHandler? PropertyChanged; + [AutoNotifyProperty] + public bool _BypassMinSize; + + public event PropertyChangedEventHandler? PropertyChanged; public SavedTabData[]? Tabs { get; set; } public SavedTabData? DefaultTabData { get; set; } diff --git a/UnitedSets/Classes/USConfig.cs b/UnitedSets/Classes/USConfig.cs index c22758f..6f4b338 100644 --- a/UnitedSets/Classes/USConfig.cs +++ b/UnitedSets/Classes/USConfig.cs @@ -16,7 +16,7 @@ public class USConfig : SavedInstanceData { public USConfig CloneWithoutTabs() { return (USConfig)_CloneWithoutTabs(); } - public static bool FLAGS_THEME_CHOICE_ENABLED = true;// ughz https://github.com/microsoft/WindowsAppSDK/issues/3487 https://github.com/microsoft/microsoft-ui-xaml/issues/8249 although even setting it at the app level doesnt work + public static bool FLAGS_THEME_CHOICE_ENABLED { get; } = true;// ughz https://github.com/microsoft/WindowsAppSDK/issues/3487 https://github.com/microsoft/microsoft-ui-xaml/issues/8249 although even setting it at the app level doesnt work public static string BaseProfileFolder => Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "UnitedSets"); public static string DefaultConfigFile => Path.Combine(BaseProfileFolder, "default.json"); public static string AppDataPath => Path.Combine( @@ -35,11 +35,11 @@ public USConfig CloneWithoutTabs() { WindowsOG.ApplicationModel.Package.Current.InstalledLocation.Path; #endif - public static USConfig def_config { get; private set; } + public static USConfig DefaultConfiguration { get; private set; } internal static void LoadDefaultConfig() { if (!Directory.Exists(BaseProfileFolder)) Directory.CreateDirectory(BaseProfileFolder); - def_config = new() { + DefaultConfiguration = new() { TitlePrefix = "", TaskbarIco = "Assets/UnitedSets.ico", Tabs = [], Design = new() { BorderCorner = new(15, 5, 15, 5), BorderGradiant1 = "#9987C7FF", BorderGradiant2 = "#9900008B", BorderThickness = new(10), MainMargin = new(8, 0, 8, 8), PrimaryBackgroundLightTheme = "#DDFFFFFF", PrimaryBackgroundDarkTheme = "#DD000000", PrimaryBackgroundNonTranslucent = "White", diff --git a/UnitedSets/Constants.cs b/UnitedSets/Constants.cs index 740b7d5..a7072d1 100644 --- a/UnitedSets/Constants.cs +++ b/UnitedSets/Constants.cs @@ -13,6 +13,9 @@ static class Constants public static readonly WindowMessages UnitedSetCommunicationChangeWindowOwnership = WindowMessagesHelper.Register(nameof(UnitedSetCommunicationChangeWindowOwnership)); + public const int MinWidth = 600, MinHeight = 500; + public const int BypassMinWidth = 100, BypassMinHeight = 100; + static readonly Lazy _IsFirstRun = new(delegate { var isFirstRun = false; diff --git a/UnitedSets/Properties/launchSettings.json b/UnitedSets/Properties/launchSettings.json index 83ed77d..b3c8810 100644 --- a/UnitedSets/Properties/launchSettings.json +++ b/UnitedSets/Properties/launchSettings.json @@ -2,7 +2,7 @@ "profiles": { "UnitedSets (Packaged)": { "commandName": "MsixPackage", - "nativeDebugging": false + "nativeDebugging": true }, "AddNotepad (Packaged)": { "commandName": "MsixPackage", diff --git a/UnitedSets/Services/PreservedTabDataService.cs b/UnitedSets/Services/PreservedTabDataService.cs index 7b7a20d..c35a13b 100644 --- a/UnitedSets/Services/PreservedTabDataService.cs +++ b/UnitedSets/Services/PreservedTabDataService.cs @@ -25,6 +25,7 @@ using UnitedSets.UI.FlyoutModules; using UnitedSets.UI.AppWindows; using System.Reflection; +using System.Diagnostics.CodeAnalysis; #pragma warning disable CS8625 #pragma warning disable CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable. #pragma warning disable CS8604 // Possible null reference argument. @@ -35,11 +36,9 @@ namespace UnitedSets.Services { public class PreservedTabDataService { - public void init(MainWindow wind, MainWindow.CfgElements main_ui_elems) { - this.MainWind = wind; + public void init(MainWindow.CfgElements main_ui_elems) { this.main_ui_elems = main_ui_elems; } - private MainWindow MainWind; private MainWindow.CfgElements main_ui_elems; @@ -48,42 +47,42 @@ public void SetPrimaryDesignProperties() { return; - var mainBg = cfg.Design.PrimaryBackgroundNonTranslucent; - if (cfg.Design.UseTranslucentWindow == true) { + var mainBg = MainConfiguration.Design.PrimaryBackgroundNonTranslucent; + if (MainConfiguration.Design.UseTranslucentWindow == true) { if (App.Current.RequestedTheme == ApplicationTheme.Dark) - mainBg = cfg.Design.PrimaryBackgroundDarkTheme; + mainBg = MainConfiguration.Design.PrimaryBackgroundDarkTheme; else - mainBg = cfg.Design.PrimaryBackgroundLightTheme; + mainBg = MainConfiguration.Design.PrimaryBackgroundLightTheme; } //main_ui_elems.MainAreaBorder.Background = ColorStrToBrush(mainBg); - main_ui_elems.WindowBorder.BorderThickness = RectToThick(cfg.Design.BorderThickness); + main_ui_elems.WindowBorder.BorderThickness = RectToThick(MainConfiguration.Design.BorderThickness); main_ui_elems.WindowBorder.Background = ColorStrToBrush(mainBg); ; - main_ui_elems.WindowBorder.CornerRadius = RectToCornerRadius(cfg.Design.BorderCorner); + main_ui_elems.WindowBorder.CornerRadius = RectToCornerRadius(MainConfiguration.Design.BorderCorner); main_ui_elems.WindowBorder.HorizontalAlignment = HorizontalAlignment.Stretch; main_ui_elems.WindowBorder.VerticalAlignment = VerticalAlignment.Stretch; var stops = (main_ui_elems.WindowBorder.BorderBrush as LinearGradientBrush)!.GradientStops; - stops.First().Color = ConvertToColor(cfg.Design.BorderGradiant1); - stops.Last().Color = ConvertToColor(cfg.Design.BorderGradiant2); - main_ui_elems.MainAreaBorder.Margin = RectToThick(cfg.Design.MainMargin); + stops.First().Color = ConvertToColor(MainConfiguration.Design.BorderGradiant1); + stops.Last().Color = ConvertToColor(MainConfiguration.Design.BorderGradiant2); + main_ui_elems.MainAreaBorder.Margin = RectToThick(MainConfiguration.Design.MainMargin); //may want to look into a way to use _ImportSettings here but stop it from doing any tab loads etc just the design data. } //Right now almost all settings are applied in real time as changed. This function is called at startup (for initial settings) and in theory might be called after something major like a theme change. - private USConfig def_config => USConfig.def_config; - public bool LoadPreviousSessionData() + private static USConfig DefaultConfiguration => USConfig.DefaultConfiguration; + public bool LoadPreviousSessionData([NotNullWhen(true)] out USConfig? MainConfig) { if (File.Exists(USConfig.SessionSaveConfigFile)) { USConfig.LoadDefaultConfig(); - LoadInitialSettingsAndTheme(); + LoadInitialSettingsAndTheme(out MainConfig); var text = File.ReadAllText(USConfig.SessionSaveConfigFile); if (!string.IsNullOrWhiteSpace(text)) { try { var loaded = Deserialize(text); - PropHelper.CopyNotNullPropertiesTo(loaded, SettingsService.Settings.cfg, true); - //File.Delete(USConfig.SessionSaveConfigFile); - } + PropHelper.CopyNotNullPropertiesTo(loaded, MainConfig, true); + File.Delete(USConfig.SessionSaveConfigFile); + } catch (Exception e) { Debug.WriteLine($"Should have better error handling for config load failtures err was: {e}"); @@ -91,13 +90,14 @@ public bool LoadPreviousSessionData() } return true; } + MainConfig = null; return false; } public Task FinalizeLoadAsync() { - return _ImportSettings(SettingsService.Settings.cfg); + return _ImportSettings(MainConfiguration); } - public void LoadInitialSettingsAndTheme() { + public void LoadInitialSettingsAndTheme(out USConfig MainConfig) { USConfig.LoadDefaultConfig(); if (File.Exists(USConfig.DefaultConfigFile)) { @@ -108,21 +108,21 @@ public void LoadInitialSettingsAndTheme() { //PropHelper.CopyNotNullPropertiesTo(loaded.Design, def_config.Design); //loaded.Design = null; loaded.Tabs = null; - PropHelper.CopyNotNullPropertiesTo(loaded, def_config, true); + PropHelper.CopyNotNullPropertiesTo(loaded, DefaultConfiguration, true); } catch (Exception e) { Debug.WriteLine($"Should have better error handling for config load failtures err was: {e}"); } } } - var cfg = def_config.CloneWithoutTabs(); - SettingsService.Settings.cfg = cfg; + var cfg = DefaultConfiguration.CloneWithoutTabs(); + MainConfig = cfg; cfg.PropertyChanged += Cfg_PropertyChanged; if (cfg.Design.Theme != ElementTheme.Default && USConfig.FLAGS_THEME_CHOICE_ENABLED) Application.Current.RequestedTheme = cfg.Design.Theme == ElementTheme.Dark ? ApplicationTheme.Dark : ApplicationTheme.Light; } - + public USConfig MainConfiguration => UnitedSetsApp.Current.Configuration.MainConfiguration; private void Cfg_PropertyChanged(object? sender, PropertyChangedEventArgs e) { if (e.PropertyName == nameof(USConfig.TitlePrefix)) main_ui_elems?.TitleUpdate(); @@ -214,8 +214,7 @@ public async Task ApplyFinalStartData(StartingResults starts, StartingResults.St } if (isCell && wind != null) { var win = wind.Value; - start_arg.hwndHost = RegisteredWindow.Register(win); - win.IsVisible = false; + start_arg.hwndHost = RegisteredWindow.Register(win, shouldBeHidden: true); start_arg.cell.RegisterWindow(start_arg.hwndHost); } @@ -237,7 +236,7 @@ private async Task _ImportSettings(USConfig data) { } } catch (Exception e) { - _ = MainWind.ShowMessageDialogAsync($"Unable to apply config due to exception: {e}"); + _ = UnitedSetsApp.Current.MainWindow.ShowMessageDialogAsync($"Unable to apply config due to exception: {e}"); LogCfgError("Outer exception catch for config load", e); } } @@ -270,22 +269,22 @@ private static async Task LaunchAndWaitForProccesses(StartingResults starts) { } private void ApplyGlobalWindowData(USConfig data, out SavedTabData[]? tabs, out StartingResults starts) { - PropHelper.CopyNotNullPropertiesTo(data.Design, cfg.Design); + PropHelper.CopyNotNullPropertiesTo(data.Design, MainConfiguration.Design); tabs = data.Tabs; var design = data.Design; data.Design = null; data.Tabs = null; - PropHelper.CopyNotNullPropertiesTo(data, cfg, true); + PropHelper.CopyNotNullPropertiesTo(data, MainConfiguration, true); data.Design = design; data.Tabs = tabs; starts = new(); OnNotNull.Get(data.TitlePrefix)?.Action((_) => main_ui_elems.TitleUpdate()); if (data.TaskbarIco is not null) { - var x = Path.IsPathRooted(data.TaskbarIco) ? cfg.TaskbarIco : Path.Combine(USConfig.RootLocation, data.TaskbarIco); + var x = Path.IsPathRooted(data.TaskbarIco) ? MainConfiguration.TaskbarIco : Path.Combine(USConfig.RootLocation, data.TaskbarIco); OnNotNull.Get(x)? .IfFailException((msg) => new FileNotFoundException(msg + ": " + data.TaskbarIco))? - .MustBeTrue(File.Exists)?.Convert(Icon.FromFile)?.Action((res) => MainWind.SetTaskBarIcon(res.result)); + .MustBeTrue(File.Exists)?.Convert(Icon.FromFile)?.Action((res) => UnitedSetsApp.Current.MainWindow.SetTaskBarIcon(res.result)); } if (data.Design != null) { @@ -295,7 +294,7 @@ private void ApplyGlobalWindowData(USConfig data, out SavedTabData[]? tabs, out OnNotNull.Get(desdata.BorderGradiant1)?.Convert(ConvertToColor)?.Action(res => stops.Last().Color = res.result); OnNotNull.Get(desdata.BorderThickness)?.Convert(RectToThick)?.Action(res => main_ui_elems.WindowBorder.BorderThickness = res.result); OnNotNull.Get(desdata.MainMargin)?.Convert(RectToThick)?.Action(res => main_ui_elems.MainAreaBorder.Margin = res.result); - OnNotNull.Get(desdata.WindowSize)?.MustBeTrue((val) => val.Width > 0 && val.Height > 0)?.Action(val => MainWind.SetWindowSize(val.Width, val.Height)); + OnNotNull.Get(desdata.WindowSize)?.MustBeTrue((val) => val.Width > 0 && val.Height > 0)?.Action(val => UnitedSetsApp.Current.MainWindow.SetWindowSize(val.Width, val.Height)); //DoOrThrow(desdata.UseTranslucentWindow, (val) => (val ? TranslucentEnable : (Action)TranslucentDisable).Invoke()); } @@ -411,14 +410,13 @@ private void ApplyNewProc(StartingResults starts, SavedCellData data) { } #endregion - private USConfig cfg => SettingsService.Settings.cfg; public async Task ResetSettings() { - await _ImportSettings(def_config.CloneWithoutTabs()); + await _ImportSettings(DefaultConfiguration.CloneWithoutTabs()); //def_config } public void ExportSettings(string filename, bool OnlyNonDefault, bool ExcludeTabs = false) { try { - var exported = cfg.CloneWithoutTabs(); + var exported = MainConfiguration.CloneWithoutTabs(); var allTabs = UnitedSetsApp.Current.Tabs.ToArray(); if (ExcludeTabs) allTabs = []; @@ -439,16 +437,16 @@ public void ExportSettings(string filename, bool OnlyNonDefault, bool ExcludeTab exp.Split = ExportSplit(allDataCells, cTab._MainCell, cTab.CustomTitle); } if (OnlyNonDefault) - PropHelper.UnsetDstPropertiesEqualToSrcOrEmptyCollections(def_config.DefaultTabData, exp, true); + PropHelper.UnsetDstPropertiesEqualToSrcOrEmptyCollections(DefaultConfiguration.DefaultTabData, exp, true); tabsExported.Add(exp);//should probably check some property is actually set here could have it count and do allDataCells before hand to take care of them as well } foreach (var cell in allDataCells) - PropHelper.UnsetDstPropertiesEqualToSrcOrEmptyCollections(def_config.DefaultCellData, cell, true); + PropHelper.UnsetDstPropertiesEqualToSrcOrEmptyCollections(DefaultConfiguration.DefaultCellData, cell, true); exported.Tabs = tabsExported.ToArray(); if (OnlyNonDefault) - PropHelper.UnsetDstPropertiesEqualToSrcOrEmptyCollections(def_config, exported, true); + PropHelper.UnsetDstPropertiesEqualToSrcOrEmptyCollections(DefaultConfiguration, exported, true); diff --git a/UnitedSets/Tabs/TabBase.Static.Loop.cs b/UnitedSets/Tabs/TabBase.Static.Loop.cs index 8db32db..0c9bf8f 100644 --- a/UnitedSets/Tabs/TabBase.Static.Loop.cs +++ b/UnitedSets/Tabs/TabBase.Static.Loop.cs @@ -14,7 +14,7 @@ static void StaticUpdateStatusThreadLoop() { do Thread.Sleep(500); - while (!MainWindows.Any(x => x.IsVisible)); + while (!(UnitedSetsApp.Current.MainWindow?.Win32Window.IsVisible ?? false)); try { diff --git a/UnitedSets/Tabs/TabBase.Static.cs b/UnitedSets/Tabs/TabBase.Static.cs index e3a5611..858bcf9 100644 --- a/UnitedSets/Tabs/TabBase.Static.cs +++ b/UnitedSets/Tabs/TabBase.Static.cs @@ -11,13 +11,12 @@ namespace UnitedSets.Tabs; partial class TabBase { - public readonly static List MainWindows = new(); public static event Action? OnUpdateStatusLoopComplete; - static readonly SynchronizedCollection AllTabs = new(); + static readonly SynchronizedCollection AllTabs = []; //static readonly WindowClass UnitedSetsSwitcherWindowClass; - static readonly SettingsService Settings - = App.SettingsService; + static readonly UnitedSetsAppSettings Settings + = UnitedSetsApp.Current.Settings; static TabBase() { diff --git a/UnitedSets/UI/AppWindows/MainWindow.xaml b/UnitedSets/UI/AppWindows/MainWindow.xaml index 3fbba96..ce35c21 100644 --- a/UnitedSets/UI/AppWindows/MainWindow.xaml +++ b/UnitedSets/UI/AppWindows/MainWindow.xaml @@ -2,21 +2,16 @@ x:Class="UnitedSets.UI.AppWindows.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" - xmlns:local="using:UnitedSets" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" - xmlns:class="using:UnitedSets.Classes" xmlns:templates="using:UnitedSets.Templates" xmlns:winUIEx="using:WinUIEx" xmlns:tabs="using:UnitedSets.Tabs" xmlns:icons="using:Cube.UI.Icons" - xmlns:getxaml="using:Get.XAMLTools" - xmlns:windows="using:UnitedSets.UI.AppWindows" xmlns:module="using:UnitedSets.UI.FlyoutModules" xmlns:us="using:UnitedSets" xmlns:controls="using:UnitedSets.UI.Controls" xmlns:guics="using:Get.UI.Controls" - MinHeight="300" MinWidth="800" mc:Ignorable="d"> diff --git a/UnitedSets/UI/AppWindows/MainWindow.xaml.API.Implementation.cs b/UnitedSets/UI/AppWindows/MainWindow.xaml.API.Implementation.cs index 206f6dd..7949dd2 100644 --- a/UnitedSets/UI/AppWindows/MainWindow.xaml.API.Implementation.cs +++ b/UnitedSets/UI/AppWindows/MainWindow.xaml.API.Implementation.cs @@ -22,10 +22,10 @@ private partial async Task TimerStop() OnUIThreadTimerLoop(); await Task.Delay(100); } - public void SaveCurSettingsAsDefault() => persistantService.ExportSettings(USConfig.DefaultConfigFile, true, true);//don't give user any choice as to what for now so will exclude current tabs + public void SaveCurSettingsAsDefault() => UnitedSetsApp.Current.Configuration.PersistantService.ExportSettings(USConfig.DefaultConfigFile, true, true);//don't give user any choice as to what for now so will exclude current tabs public async Task ResetSettingsToDefault() { - await persistantService.ResetSettings(); + await UnitedSetsApp.Current.Configuration.PersistantService.ResetSettings(); SaveCurSettingsAsDefault(); } } diff --git a/UnitedSets/UI/AppWindows/MainWindow.xaml.EventHandler.Implementation.cs b/UnitedSets/UI/AppWindows/MainWindow.xaml.EventHandler.Implementation.cs index 88c911a..f2e8945 100644 --- a/UnitedSets/UI/AppWindows/MainWindow.xaml.EventHandler.Implementation.cs +++ b/UnitedSets/UI/AppWindows/MainWindow.xaml.EventHandler.Implementation.cs @@ -29,6 +29,7 @@ using UnitedSets.Windows; using static System.Windows.Forms.VisualStyles.VisualStyleElement; using CommunityToolkit.Mvvm.Input; +using WinWrapper.Windowing; namespace UnitedSets.UI.AppWindows; @@ -73,7 +74,7 @@ public async Task ExportData() var res = await ExportImportInputPage.ShowExportImport(true, this); if (res == null) return; - persistantService.ExportSettings(res.FullFilename, res.OnlyExportNonDefault); + UnitedSetsApp.Current.Configuration.PersistantService.ExportSettings(res.FullFilename, res.OnlyExportNonDefault); } [CommunityToolkit.Mvvm.Input.RelayCommand] public async Task ImportData() @@ -82,7 +83,7 @@ public async Task ImportData() var res = await ExportImportInputPage.ShowExportImport(false, this); if (res == null) return; - persistantService.ImportSettings(res.FullFilename); + UnitedSetsApp.Current.Configuration.PersistantService.ImportSettings(res.FullFilename); } private void CloseMainFlyout() { } //=> MenuFlyout?.Hide(); @@ -202,7 +203,7 @@ public async Task RequestCloseAsync(CloseMode closeMode) await UnitedSetsApp.Current.Suicide(); return; case CloseMode.SaveCloseWindow: - persistantService.ExportSettings(USConfig.SessionSaveConfigFile, true, ExcludeTabs: false); + UnitedSetsApp.Current.Configuration.SaveCurrentSession(); goto case CloseMode.CloseWindow; default: throw new ArgumentOutOfRangeException(nameof(closeMode)); @@ -228,8 +229,8 @@ private partial void CellWindowDropped(Cell cell, nint HwndId) } private partial void OnWindowMessageReceived(WindowMessageEventArgs e) { - var id = e.Message.MessageId; - if (id == (uint)Constants.UnitedSetCommunicationChangeWindowOwnership) + var id = (WindowMessages)e.Message.MessageId; + if (id == Constants.UnitedSetCommunicationChangeWindowOwnership) { var winPtr = e.Message.LParam; if (UnitedSetsApp.Current.Tabs.ToArray().FirstOrDefault(x => x.Windows.Any(y => y == winPtr)) is TabBase Tab) diff --git a/UnitedSets/UI/AppWindows/MainWindow.xaml.Properties.cs b/UnitedSets/UI/AppWindows/MainWindow.xaml.Properties.cs index 9a1acaa..fae5ea5 100644 --- a/UnitedSets/UI/AppWindows/MainWindow.xaml.Properties.cs +++ b/UnitedSets/UI/AppWindows/MainWindow.xaml.Properties.cs @@ -17,5 +17,10 @@ void ThreadLoopDetectAndUpdateHasOwnerChange() cacheHasOwner = _new; NotifyPropertyChangedOnUIThread(nameof(HasOwner)); + + IsResizable = !_new; + IsTitleBarVisible = !_new; + IsMinimizable = !_new; + IsMaximizable = !_new; } } \ No newline at end of file diff --git a/UnitedSets/UI/AppWindows/MainWindow.xaml.Setup.cs b/UnitedSets/UI/AppWindows/MainWindow.xaml.Setup.cs index eefd438..8e0dfd4 100644 --- a/UnitedSets/UI/AppWindows/MainWindow.xaml.Setup.cs +++ b/UnitedSets/UI/AppWindows/MainWindow.xaml.Setup.cs @@ -14,12 +14,10 @@ using Windows.Foundation; using System.Runtime.CompilerServices; using Icon = WinWrapper.Icon; -using UnitedSets.Services; using Microsoft.UI.Xaml.Controls; using System.IO; using System.Threading.Tasks; using UnitedSets.Mvvm.Services; -using WindowHoster; namespace UnitedSets.UI.AppWindows; @@ -27,49 +25,37 @@ partial class MainWindow { // To Merge: - public MainWindow(PreservedTabDataService persistantService) + public MainWindow() { Win32Window = Window.FromWindowHandle(WindowNative.GetWindowHandle(this)); UnitedSetsApp.Current.RegisterUnitedSetsWindow(this); - // To Merge: - this.persistantService = persistantService; - - if (cfg.Design.Theme != null && cfg.Design.Theme != ElementTheme.Default && USConfig.FLAGS_THEME_CHOICE_ENABLED) - { - (this.Content as FrameworkElement).RequestedTheme = cfg.Design.Theme.Value; - ///not sure why settng the requested theme doesnt seem to work - //MainAreaBorder.RequestedTheme = this.RootGrid.RequestedTheme = swapChainPanel.RequestedTheme = cfg.Design.Theme.Value; - } InitializeComponent(); ui_configs = new() { TitleUpdate = UpdateTitle, WindowBorder = WindowBorderOnTransparent, MainAreaBorder = MainAreaBorder }; //, swapChain = this.swapChainPanel - persistantService.init(this, ui_configs); - - //if (cfg.Design.UseDXBorderTransparency == true) - // TransparentSetup(); + UnitedSetsApp.Current.Configuration.PersistantService.init(ui_configs); SetupBasicWindow(); - //TransparentMode = FeatureFlags.UseTransparentWindow; - //if (TransparentMode) - // SetupTransparent(out trans_mgr); - void UpdateBackdrop(USBackdrop x) { - //var IsTransparent = x is USBackdrop.Transparent; - //WindowBorderOnTransparent.Visibility = IsTransparent ? Visibility.Visible : Visibility.Collapsed; - //TransparentMode = IsTransparent; SystemBackdrop = x.GetSystemBackdrop(); } Settings.BackdropMode.PropertyChanged += (_, _) => UpdateBackdrop(Settings.BackdropMode.Value); UpdateBackdrop(Settings.BackdropMode.Value); + + void UpdateMinSize(bool bypass) + { + MinWidth = bypass ? Constants.BypassMinWidth : Constants.MinWidth; + MinHeight = bypass ? Constants.BypassMinHeight : Constants.MinHeight; + } + Settings.BypassMinimumSize.PropertyChanged += (_, _) => UpdateMinSize(Settings.BypassMinimumSize.Value); + UpdateMinSize(Settings.BypassMinimumSize.Value); + ((OverlappedPresenter)AppWindow.Presenter).SetBorderAndTitleBar(true, true); SetupNative(out WindowMessageMonitor); - RegisterWindow(); - SetupEvent(); SetupUIThreadLoopTimer(out timer); @@ -78,40 +64,12 @@ void UpdateBackdrop(USBackdrop x) // Implementation [MethodImpl(MethodImplOptions.AggressiveInlining)] - void RegisterWindow() - { - TabBase.MainWindows.Add(Win32Window); - } - [MethodImpl(MethodImplOptions.AggressiveInlining)] void SetupBasicWindow() { Title = "UnitedSets"; - MinWidth = 100; ExtendsContentIntoTitleBar = true; SetTitleBar(CustomDragRegion); } - //[MethodImpl(MethodImplOptions.AggressiveInlining)] - //void SetupTransparent(out TransparentWindowManager trans_mgr) - //{ - // WindowBorderOnTransparent.Visibility = Visibility.Visible; - // MainAreaBorder.Margin = new(8, 0, 8, 8); - // var presenter = (OverlappedPresenter)AppWindow.Presenter; - // //RootGrid.Children.Insert(0, border); - // //trans_mgr = new(this, swapChainPanel, FeatureFlags.EntireWindowDraggable); - // //trans_mgr.AfterInitialize(); - // trans_mgr = null!; - // ui_configs.WindowBorder = new Border() { HorizontalAlignment = HorizontalAlignment.Stretch, VerticalAlignment = VerticalAlignment.Stretch }; - // ui_configs.WindowBorder.BorderBrush = new LinearGradientBrush(new GradientStopCollection { new GradientStop { Offset = 1 }, new GradientStop { Offset = 0 } }, 45); - // //ui_configs.WindowBorder.RequestedTheme = MainAreaBorder.RequestedTheme; - // Grid.SetColumnSpan(ui_configs.WindowBorder, 50); - // Grid.SetRowSpan(ui_configs.WindowBorder, 50); - // Canvas.SetZIndex(ui_configs.WindowBorder, -5); - // ui_configs.MainAreaBorder = MainAreaBorder; - // RootGrid.Children.Insert(0, ui_configs.WindowBorder); - // persistantService.SetPrimaryDesignProperties(); - // trans_mgr = new(this, swapChainPanel, cfg.DragAnywhere == true); - // trans_mgr.AfterInitialize(); - //} [MethodImpl(MethodImplOptions.AggressiveInlining)] void SetupEvent() { @@ -126,7 +84,6 @@ void SetupNative(out WindowMessageMonitor WindowMessageMonitor) { WindowMessageMonitor = new WindowMessageMonitor(Win32Window); } - } public class CfgElements @@ -141,28 +98,27 @@ public class CfgElements private void UpdateTitle() { - var prefix = cfg.TitlePrefix; + var prefix = Configuration.TitlePrefix; if (UnitedSetsApp.Current.SelectedTab is { } tab) prefix = $"{prefix} {tab.Title} (+{UnitedSetsApp.Current.Tabs.Count - 1} Tabs) - "; Title = $"{prefix}United Sets"; } - public USConfig cfg => Settings.cfg; + public USConfig Configuration => UnitedSetsApp.Current.Configuration.MainConfiguration; - private PreservedTabDataService persistantService; [Event(typeof(TypedEventHandler))] void FirstRun() { Activated -= FirstRun; - var icoFile = Path.IsPathRooted(cfg.TaskbarIco) ? cfg.TaskbarIco : Path.Combine(USConfig.RootLocation, cfg.TaskbarIco!); + var icoFile = Path.IsPathRooted(Configuration.TaskbarIco) ? Configuration.TaskbarIco : Path.Combine(USConfig.RootLocation, Configuration.TaskbarIco!); var icon = Icon.Load(icoFile); Win32Window.SmallIcon = Win32Window.LargeIcon = icon; if (Keyboard.IsShiftDown) Win32Window.SetAppId($"UnitedSets {Win32Window.Handle}"); HandleCLICmds(); - _ = persistantService.FinalizeLoadAsync(); + UnitedSetsApp.Current.Configuration.PersistantService.FinalizeLoadAsync(); } async void HandleCLICmds() { @@ -170,7 +126,7 @@ async void HandleCLICmds() var editLastAddedWindow = CLI.GetFlag("edit-last-added"); //LeftFlyout.NoAutoClose = CLI.GetFlag("edit-no-autoclose"); var profile = CLI.GetVal("profile"); - if (!String.IsNullOrWhiteSpace(profile)) + if (!string.IsNullOrWhiteSpace(profile)) { if (Path.HasExtension(profile) == false) profile += ".json"; @@ -179,7 +135,7 @@ async void HandleCLICmds() if (File.Exists(profile)) { await Task.Delay(1500); - await persistantService.ImportSettings(profile); + await UnitedSetsApp.Current.Configuration.PersistantService.ImportSettings(profile); } } diff --git a/UnitedSets/UI/AppWindows/MainWindow.xaml.cs b/UnitedSets/UI/AppWindows/MainWindow.xaml.cs index 354315d..26206cc 100644 --- a/UnitedSets/UI/AppWindows/MainWindow.xaml.cs +++ b/UnitedSets/UI/AppWindows/MainWindow.xaml.cs @@ -13,7 +13,7 @@ public sealed partial class MainWindow : WinUIEx.WindowEx public readonly WindowEx Win32Window; // Singleton - readonly SettingsService Settings = App.SettingsService; + readonly UnitedSetsAppSettings Settings = UnitedSetsApp.Current.Settings; // Readonly readonly DispatcherQueueTimer timer; diff --git a/UnitedSets/UI/AppWindows/MicaWindow.cs b/UnitedSets/UI/AppWindows/MicaWindow.cs deleted file mode 100644 index c0bbe9e..0000000 --- a/UnitedSets/UI/AppWindows/MicaWindow.cs +++ /dev/null @@ -1,75 +0,0 @@ -// Reference: winui3gallery://item/SystemBackdrops -using WinRT; -using Microsoft.UI.Xaml; -using Microsoft.UI.Composition.SystemBackdrops; -using WinUIEx; -using UnitedSets.Helpers; -using Windows.Foundation; -using Get.EasyCSharp; - -namespace UnitedSets.UI.AppWindows; - -public partial class MicaWindow : WindowEx -{ - readonly bool IsMicaInfinite; - MicaController? m_micaController; - SystemBackdropConfiguration? m_configurationSource; - - public MicaWindow(bool IsMicaInfinite) - { - this.IsMicaInfinite = IsMicaInfinite; - TrySetMicaBackdrop(); - } - bool TrySetMicaBackdrop() - { - if (MicaController.IsSupported()) - { - WindowsSystemDispatcherQueueHelper.EnsureWindowsSystemDispatcherQueueController(); - - // Hooking up the policy object - m_configurationSource = new SystemBackdropConfiguration(); - - - // Initial configuration state. - m_configurationSource.IsInputActive = true; - - m_micaController = new MicaController(); - - // Enable the system backdrop. - // Note: Be sure to have "using WinRT;" to support the Window.As<...>() call. - m_micaController.AddSystemBackdropTarget(this.As()); - m_micaController.SetSystemBackdropConfiguration(m_configurationSource); - - Activated += OnActivatedChange; - Closed += OnWindowClosed; - return true; // succeeded - } - - return false; // Mica is not supported on this system - } - - [Event(typeof(TypedEventHandler))] - private void OnActivatedChange(WindowActivatedEventArgs args) - { - if (m_configurationSource == null) return; - bool IsInputActive = args.WindowActivationState != WindowActivationState.Deactivated; - if (IsInputActive) - m_configurationSource.IsInputActive = true; - else if (!IsMicaInfinite) - m_configurationSource.IsInputActive = false; - } - - [Event(typeof(TypedEventHandler))] - private void OnWindowClosed() - { - // Make sure any Mica/Acrylic controller is disposed so it doesn't try to - // use this closed window. - if (m_micaController != null) - { - m_micaController.Dispose(); - m_micaController = null; - } - Activated -= OnActivatedChange; - m_configurationSource = null; - } -} \ No newline at end of file diff --git a/UnitedSets/UI/AppWindows/OOBEWindow.xaml b/UnitedSets/UI/AppWindows/OOBEWindow.xaml index 9ed2f63..2aa15b6 100644 --- a/UnitedSets/UI/AppWindows/OOBEWindow.xaml +++ b/UnitedSets/UI/AppWindows/OOBEWindow.xaml @@ -1,10 +1,11 @@ - - \ No newline at end of file + \ No newline at end of file diff --git a/UnitedSets/UI/AppWindows/OOBEWindow.xaml.cs b/UnitedSets/UI/AppWindows/OOBEWindow.xaml.cs index 0c7867e..f11c0ee 100644 --- a/UnitedSets/UI/AppWindows/OOBEWindow.xaml.cs +++ b/UnitedSets/UI/AppWindows/OOBEWindow.xaml.cs @@ -11,11 +11,11 @@ namespace UnitedSets.UI.AppWindows; -public sealed partial class OOBEWindow : MicaWindow +public sealed partial class OOBEWindow : WinUIEx.WindowEx { - public SettingsService Settings => SettingsService.Settings; + public UnitedSetsAppSettings Settings => UnitedSetsApp.Current.Settings; readonly bool IsInitialized = false; - public OOBEWindow() : base(IsMicaInfinite: false) + public OOBEWindow() { InitializeComponent(); ExtendsContentIntoTitleBar = true; @@ -23,6 +23,7 @@ public OOBEWindow() : base(IsMicaInfinite: false) IsInitialized = true; AppWindow.Changed += WindowChanged; Page.Loaded += OOBEPageSetup; + SystemBackdrop = new MicaBackdrop(); } Storyboard LoadingAnimation => (Storyboard)Page.Resources[nameof(LoadingAnimation)]; diff --git a/UnitedSets/UI/AppWindows/SettingsWindow.xaml.cs b/UnitedSets/UI/AppWindows/SettingsWindow.xaml.cs index 650cc77..1026c8d 100644 --- a/UnitedSets/UI/AppWindows/SettingsWindow.xaml.cs +++ b/UnitedSets/UI/AppWindows/SettingsWindow.xaml.cs @@ -9,9 +9,9 @@ namespace UnitedSets.UI.AppWindows; public sealed partial class SettingsWindow : WindowEx { - public SettingsService Settings; + public UnitedSetsAppSettings Settings; - public SettingsWindow(SettingsService Settings, MainWindow mainWindow) + public SettingsWindow(UnitedSetsAppSettings Settings, MainWindow mainWindow) { this.Settings = Settings; this.mainWindow = mainWindow; diff --git a/UnitedSets/UI/FlyoutModules/MainWindowMenuFlyoutModule.xaml.cs b/UnitedSets/UI/FlyoutModules/MainWindowMenuFlyoutModule.xaml.cs index 6160b74..9f77947 100644 --- a/UnitedSets/UI/FlyoutModules/MainWindowMenuFlyoutModule.xaml.cs +++ b/UnitedSets/UI/FlyoutModules/MainWindowMenuFlyoutModule.xaml.cs @@ -18,7 +18,7 @@ namespace UnitedSets.UI.FlyoutModules; public sealed partial class MainWindowMenuFlyoutModule : Grid, INotifyPropertyChanged { // Singleton - readonly SettingsService Settings = App.SettingsService; + readonly UnitedSetsAppSettings Settings = UnitedSetsApp.Current.Settings; [AutoNotifyProperty] MainWindow? _MainWindow; #pragma warning disable CS0067 diff --git a/UnitedSets/UI/Popups/AddTabPopup.xaml b/UnitedSets/UI/Popups/AddTabPopup.xaml index a7a69db..8f4b236 100644 --- a/UnitedSets/UI/Popups/AddTabPopup.xaml +++ b/UnitedSets/UI/Popups/AddTabPopup.xaml @@ -1,4 +1,4 @@ -