From 469cb3484051f526330e27ff71a27aff7e2d4368 Mon Sep 17 00:00:00 2001 From: Gabriel Dufresne Date: Tue, 31 Mar 2026 13:40:32 -0400 Subject: [PATCH 1/7] Fixed the build for linux and fixed issue with the title bar --- src/UniGetUI.Avalonia.slnx | 6 ++ src/UniGetUI.Avalonia/Views/MainWindow.axaml | 92 +++++++++++++++---- .../Views/MainWindow.axaml.cs | 50 ++++++++++ .../SoftwarePages/AbstractPackagesPage.axaml | 2 +- 4 files changed, 132 insertions(+), 18 deletions(-) diff --git a/src/UniGetUI.Avalonia.slnx b/src/UniGetUI.Avalonia.slnx index f56b39c19..dfd391425 100644 --- a/src/UniGetUI.Avalonia.slnx +++ b/src/UniGetUI.Avalonia.slnx @@ -165,6 +165,12 @@ + + + + + + diff --git a/src/UniGetUI.Avalonia/Views/MainWindow.axaml b/src/UniGetUI.Avalonia/Views/MainWindow.axaml index 7cefffcd1..25d95cef5 100644 --- a/src/UniGetUI.Avalonia/Views/MainWindow.axaml +++ b/src/UniGetUI.Avalonia/Views/MainWindow.axaml @@ -9,14 +9,14 @@ mc:Ignorable="d" d:DesignWidth="1200" d:DesignHeight="750" x:Class="UniGetUI.Avalonia.Views.MainWindow" x:DataType="vm:MainWindowViewModel" + Title="UniGetUI" Width="1450" MinWidth="700" - MinHeight="500" - ExtendClientAreaToDecorationsHint="True" - ExtendClientAreaTitleBarHeightHint="-1"> + MinHeight="500"> - @@ -204,17 +204,28 @@ - + - + - - + - + @@ -264,12 +273,61 @@ - - + + + + + + + + + + + + + + diff --git a/src/UniGetUI.Avalonia/Views/MainWindow.axaml.cs b/src/UniGetUI.Avalonia/Views/MainWindow.axaml.cs index 9bc2da9b9..2bd228eee 100644 --- a/src/UniGetUI.Avalonia/Views/MainWindow.axaml.cs +++ b/src/UniGetUI.Avalonia/Views/MainWindow.axaml.cs @@ -1,6 +1,9 @@ +using Avalonia; using Avalonia.Controls; using Avalonia.Controls.ApplicationLifetimes; using Avalonia.Input; +using Avalonia.Interactivity; +using Avalonia.Media; using UniGetUI.Avalonia.ViewModels; using UniGetUI.Avalonia.Views.Pages; using UniGetUI.Core.Logging; @@ -44,6 +47,7 @@ public MainWindow() Instance = this; DataContext = new MainWindowViewModel(); InitializeComponent(); + SetupTitleBar(); KeyDown += Window_KeyDown; } @@ -81,6 +85,52 @@ private void Window_KeyDown(object? sender, KeyEventArgs e) } } + private void SetupTitleBar() + { + if (OperatingSystem.IsMacOS()) + { + // macOS: extend into the native title bar area. + // WindowDecorationMargin.Top drives TitleBarGrid.Height via binding. + // Traffic lights sit on the left → keep the 65 px HamburgerPanel margin. + // Avatar can be a bit taller to fill the deeper title bar. + ExtendClientAreaToDecorationsHint = true; + ExtendClientAreaTitleBarHeightHint = -1; + AvatarControl.Height = 36; + } + else if (OperatingSystem.IsLinux()) + { + // Linux: remove the native title bar entirely; our toolbar is the + // only chrome. Custom min/max/close buttons appear on the right. + WindowDecorations = WindowDecorations.None; + TitleBarGrid.ClearValue(HeightProperty); + TitleBarGrid.Height = 44; + HamburgerPanel.Margin = new Thickness(10, 0, 8, 0); + AvatarControl.Height = 32; + LinuxWindowButtons.IsVisible = true; + MainContentGrid.Margin = new Thickness(0, 44, 0, 0); + // Keep maximize icon in sync with window state + this.GetObservable(WindowStateProperty).Subscribe(state => + { + MaximizeIcon.Data = Geometry.Parse( + state == WindowState.Maximized + ? "M2,0 H10 V8 H2 Z M0,2 H8 V10 H0 Z" // restore: two overlapping squares + : "M0,0 H10 V10 H0 Z"); // maximise: single square + ToolTip.SetTip(MaximizeButton, state == WindowState.Maximized ? "Restore" : "Maximize"); + }); + } + } + + private void MinimizeButton_Click(object? sender, RoutedEventArgs e) + => WindowState = WindowState.Minimized; + + private void MaximizeButton_Click(object? sender, RoutedEventArgs e) + => WindowState = WindowState == WindowState.Maximized + ? WindowState.Normal + : WindowState.Maximized; + + private void CloseButton_Click(object? sender, RoutedEventArgs e) + => Close(); + private void TitleBar_PointerPressed(object? sender, PointerPressedEventArgs e) { if (e.GetCurrentPoint(this).Properties.IsLeftButtonPressed) diff --git a/src/UniGetUI.Avalonia/Views/SoftwarePages/AbstractPackagesPage.axaml b/src/UniGetUI.Avalonia/Views/SoftwarePages/AbstractPackagesPage.axaml index 22ae3eefd..e01e65c72 100644 --- a/src/UniGetUI.Avalonia/Views/SoftwarePages/AbstractPackagesPage.axaml +++ b/src/UniGetUI.Avalonia/Views/SoftwarePages/AbstractPackagesPage.axaml @@ -632,7 +632,7 @@ Date: Tue, 31 Mar 2026 14:29:28 -0400 Subject: [PATCH 2/7] Fixed margin --- src/UniGetUI.Avalonia/Views/MainWindow.axaml | 14 +++++--------- .../Views/SoftwarePages/AbstractPackagesPage.axaml | 3 ++- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/src/UniGetUI.Avalonia/Views/MainWindow.axaml b/src/UniGetUI.Avalonia/Views/MainWindow.axaml index 25d95cef5..db478b1af 100644 --- a/src/UniGetUI.Avalonia/Views/MainWindow.axaml +++ b/src/UniGetUI.Avalonia/Views/MainWindow.axaml @@ -204,14 +204,6 @@ - @@ -277,7 +271,9 @@ + VerticalAlignment="Center" + Height="50" + Margin="0,10,0,0"/> Date: Tue, 31 Mar 2026 15:30:22 -0400 Subject: [PATCH 3/7] Added a few svg Icon that was missing --- .../Views/Controls/Settings/SettingsPageButton.cs | 1 + src/UniGetUI.Avalonia/Views/Controls/SvgIcon.cs | 14 ++++++++++++++ .../Pages/SettingsPages/SettingsHomepage.axaml | 2 +- src/UniGetUI.Avalonia/Views/SidebarView.axaml | 8 ++++---- .../Views/SoftwarePages/AbstractPackagesPage.axaml | 6 +++--- .../Views/SoftwarePages/DiscoverSoftwarePage.cs | 2 +- .../Views/SoftwarePages/InstalledPackagesPage.cs | 2 +- .../Views/SoftwarePages/PackageBundlesPage.cs | 2 +- src/UniGetUI/Assets/Symbols/DiscoverPackage.svg | 12 ++++++++++++ src/UniGetUI/Assets/Symbols/Filter.svg | 11 +++++++++++ src/UniGetUI/Assets/Symbols/InstalledPackages.svg | 10 ++++++++++ src/UniGetUI/Assets/Symbols/PackagesBundle.svg | 12 ++++++++++++ src/UniGetUI/Assets/Symbols/Sources.svg | 12 ++++++++++++ 13 files changed, 83 insertions(+), 11 deletions(-) create mode 100644 src/UniGetUI/Assets/Symbols/DiscoverPackage.svg create mode 100644 src/UniGetUI/Assets/Symbols/Filter.svg create mode 100644 src/UniGetUI/Assets/Symbols/InstalledPackages.svg create mode 100644 src/UniGetUI/Assets/Symbols/PackagesBundle.svg create mode 100644 src/UniGetUI/Assets/Symbols/Sources.svg diff --git a/src/UniGetUI.Avalonia/Views/Controls/Settings/SettingsPageButton.cs b/src/UniGetUI.Avalonia/Views/Controls/Settings/SettingsPageButton.cs index 0f7345e01..fa65be12d 100644 --- a/src/UniGetUI.Avalonia/Views/Controls/Settings/SettingsPageButton.cs +++ b/src/UniGetUI.Avalonia/Views/Controls/Settings/SettingsPageButton.cs @@ -46,6 +46,7 @@ public SettingsPageButton() IconType.SaveAs => "save_as", IconType.OpenFolder => "open_folder", IconType.Experimental => "experimental", + IconType.ClipboardList => "clipboard_list", _ => icon.ToString().ToLower(), }; } diff --git a/src/UniGetUI.Avalonia/Views/Controls/SvgIcon.cs b/src/UniGetUI.Avalonia/Views/Controls/SvgIcon.cs index a225cc6c2..001b3bc0d 100644 --- a/src/UniGetUI.Avalonia/Views/Controls/SvgIcon.cs +++ b/src/UniGetUI.Avalonia/Views/Controls/SvgIcon.cs @@ -104,6 +104,20 @@ private void LoadSvg(string? uri) catch { /* skip malformed path data */ } } } + foreach (XElement el in doc.Descendants(ns + "ellipse")) + { + if (double.TryParse(el.Attribute("cx")?.Value, System.Globalization.NumberStyles.Any, + System.Globalization.CultureInfo.InvariantCulture, out double cx) && + double.TryParse(el.Attribute("cy")?.Value, System.Globalization.NumberStyles.Any, + System.Globalization.CultureInfo.InvariantCulture, out double cy) && + double.TryParse(el.Attribute("rx")?.Value, System.Globalization.NumberStyles.Any, + System.Globalization.CultureInfo.InvariantCulture, out double rx) && + double.TryParse(el.Attribute("ry")?.Value, System.Globalization.NumberStyles.Any, + System.Globalization.CultureInfo.InvariantCulture, out double ry)) + { + _geometries.Add(new EllipseGeometry(new Rect(cx - rx, cy - ry, rx * 2, ry * 2))); + } + } } catch { diff --git a/src/UniGetUI.Avalonia/Views/Pages/SettingsPages/SettingsHomepage.axaml b/src/UniGetUI.Avalonia/Views/Pages/SettingsPages/SettingsHomepage.axaml index bb1fd43b5..a389c504a 100644 --- a/src/UniGetUI.Avalonia/Views/Pages/SettingsPages/SettingsHomepage.axaml +++ b/src/UniGetUI.Avalonia/Views/Pages/SettingsPages/SettingsHomepage.axaml @@ -71,7 +71,7 @@ diff --git a/src/UniGetUI.Avalonia/Views/SidebarView.axaml b/src/UniGetUI.Avalonia/Views/SidebarView.axaml index 5c7dba381..899c1af73 100644 --- a/src/UniGetUI.Avalonia/Views/SidebarView.axaml +++ b/src/UniGetUI.Avalonia/Views/SidebarView.axaml @@ -26,7 +26,7 @@ ToolTip.Tip="{t:Translate Discover Packages}"> - + - + - + - + diff --git a/src/UniGetUI.Avalonia/Views/SoftwarePages/AbstractPackagesPage.axaml b/src/UniGetUI.Avalonia/Views/SoftwarePages/AbstractPackagesPage.axaml index a471b7495..fd222103e 100644 --- a/src/UniGetUI.Avalonia/Views/SoftwarePages/AbstractPackagesPage.axaml +++ b/src/UniGetUI.Avalonia/Views/SoftwarePages/AbstractPackagesPage.axaml @@ -186,7 +186,7 @@ CornerRadius="4" IsChecked="{Binding IsFilterPaneOpen, Mode=TwoWay}"> - + @@ -258,7 +258,7 @@ Background="{DynamicResource SettingsCardBackground}"> - + @@ -325,7 +325,7 @@ Background="{DynamicResource SettingsCardBackground}"> - + diff --git a/src/UniGetUI.Avalonia/Views/SoftwarePages/DiscoverSoftwarePage.cs b/src/UniGetUI.Avalonia/Views/SoftwarePages/DiscoverSoftwarePage.cs index 4a739d995..f9a0f0bf3 100644 --- a/src/UniGetUI.Avalonia/Views/SoftwarePages/DiscoverSoftwarePage.cs +++ b/src/UniGetUI.Avalonia/Views/SoftwarePages/DiscoverSoftwarePage.cs @@ -27,7 +27,7 @@ public DiscoverSoftwarePage() : base(new PackagesPageData { PageName = "SoftwarePages.DiscoverSoftwarePage", PageTitle = CoreTools.Translate("Discover Packages"), - IconName = "ms_store", + IconName = "DiscoverPackage", PageRole = OperationType.Install, Loader = DiscoverablePackagesLoader.Instance ?? new DiscoverablePackagesLoader([]), MegaQueryBlockEnabled = true, diff --git a/src/UniGetUI.Avalonia/Views/SoftwarePages/InstalledPackagesPage.cs b/src/UniGetUI.Avalonia/Views/SoftwarePages/InstalledPackagesPage.cs index 367f7ac86..3855d829c 100644 --- a/src/UniGetUI.Avalonia/Views/SoftwarePages/InstalledPackagesPage.cs +++ b/src/UniGetUI.Avalonia/Views/SoftwarePages/InstalledPackagesPage.cs @@ -37,7 +37,7 @@ public InstalledPackagesPage() : base(new PackagesPageData { PageName = "SoftwarePages.InstalledPackagesPage", PageTitle = CoreTools.Translate("Installed Packages"), - IconName = "local_pc", + IconName = "InstalledPackages", PageRole = OperationType.Uninstall, Loader = InstalledPackagesLoader.Instance ?? new InstalledPackagesLoader([]), MegaQueryBlockEnabled = false, diff --git a/src/UniGetUI.Avalonia/Views/SoftwarePages/PackageBundlesPage.cs b/src/UniGetUI.Avalonia/Views/SoftwarePages/PackageBundlesPage.cs index 6dbf24c7f..71da3e924 100644 --- a/src/UniGetUI.Avalonia/Views/SoftwarePages/PackageBundlesPage.cs +++ b/src/UniGetUI.Avalonia/Views/SoftwarePages/PackageBundlesPage.cs @@ -55,7 +55,7 @@ public PackageBundlesPage() : base(new PackagesPageData { PageName = "SoftwarePages.PackageBundlesPage", PageTitle = CoreTools.Translate("Package Bundles"), - IconName = "save_as", + IconName = "PackagesBundle", PageRole = OperationType.Install, Loader = PackageBundlesLoader.Instance!, MegaQueryBlockEnabled = false, diff --git a/src/UniGetUI/Assets/Symbols/DiscoverPackage.svg b/src/UniGetUI/Assets/Symbols/DiscoverPackage.svg new file mode 100644 index 000000000..d6e93662b --- /dev/null +++ b/src/UniGetUI/Assets/Symbols/DiscoverPackage.svg @@ -0,0 +1,12 @@ + + + + + + + + \ No newline at end of file diff --git a/src/UniGetUI/Assets/Symbols/Filter.svg b/src/UniGetUI/Assets/Symbols/Filter.svg new file mode 100644 index 000000000..149af0245 --- /dev/null +++ b/src/UniGetUI/Assets/Symbols/Filter.svg @@ -0,0 +1,11 @@ + + + + + + + diff --git a/src/UniGetUI/Assets/Symbols/InstalledPackages.svg b/src/UniGetUI/Assets/Symbols/InstalledPackages.svg new file mode 100644 index 000000000..cdae590c0 --- /dev/null +++ b/src/UniGetUI/Assets/Symbols/InstalledPackages.svg @@ -0,0 +1,10 @@ + + + + + + diff --git a/src/UniGetUI/Assets/Symbols/PackagesBundle.svg b/src/UniGetUI/Assets/Symbols/PackagesBundle.svg new file mode 100644 index 000000000..d43e65961 --- /dev/null +++ b/src/UniGetUI/Assets/Symbols/PackagesBundle.svg @@ -0,0 +1,12 @@ + + + + + + + + \ No newline at end of file diff --git a/src/UniGetUI/Assets/Symbols/Sources.svg b/src/UniGetUI/Assets/Symbols/Sources.svg new file mode 100644 index 000000000..ba3717395 --- /dev/null +++ b/src/UniGetUI/Assets/Symbols/Sources.svg @@ -0,0 +1,12 @@ + + + + + + + + \ No newline at end of file From 14c18ee346aa49857684392c9e1109476f166505 Mon Sep 17 00:00:00 2001 From: Gabriel Dufresne <78387669+GabrielDuf@users.noreply.github.com> Date: Tue, 31 Mar 2026 15:48:03 -0400 Subject: [PATCH 4/7] Update src/UniGetUI.Avalonia/Views/MainWindow.axaml Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/UniGetUI.Avalonia/Views/MainWindow.axaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/UniGetUI.Avalonia/Views/MainWindow.axaml b/src/UniGetUI.Avalonia/Views/MainWindow.axaml index db478b1af..64eb7e2dd 100644 --- a/src/UniGetUI.Avalonia/Views/MainWindow.axaml +++ b/src/UniGetUI.Avalonia/Views/MainWindow.axaml @@ -313,7 +313,7 @@