Skip to content

Commit c91ae85

Browse files
authored
Avalonia: Fix Linux build, title bar layout, and missing SVG icons
1 parent 4b82636 commit c91ae85

File tree

16 files changed

+213
-27
lines changed

16 files changed

+213
-27
lines changed

src/UniGetUI.Avalonia.slnx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,12 @@
165165
<Platform Solution="*|x64" Project="x64" />
166166
</Project>
167167
</Folder>
168+
<Folder Name="/UniGetUI.PackageEngine.Managers.Homebrew/">
169+
<Project Path="UniGetUI.PackageEngine.Managers.Homebrew/UniGetUI.PackageEngine.Managers.Homebrew.csproj">
170+
<Platform Solution="*|arm64" Project="arm64" />
171+
<Platform Solution="*|x64" Project="x64" />
172+
</Project>
173+
</Folder>
168174
<Folder Name="/UniGetUI.PackageEngine.Managers.Vcpkg/">
169175
<Project Path="UniGetUI.PackageEngine.Managers.Vcpkg/UniGetUI.PackageEngine.Managers.Vcpkg.csproj">
170176
<Platform Solution="*|arm64" Project="arm64" />

src/UniGetUI.Avalonia/Views/Controls/Settings/SettingsPageButton.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ public SettingsPageButton()
4646
IconType.SaveAs => "save_as",
4747
IconType.OpenFolder => "open_folder",
4848
IconType.Experimental => "experimental",
49+
IconType.ClipboardList => "clipboard_list",
4950
_ => icon.ToString().ToLower(),
5051
};
5152
}

src/UniGetUI.Avalonia/Views/Controls/SvgIcon.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,20 @@ private void LoadSvg(string? uri)
104104
catch { /* skip malformed path data */ }
105105
}
106106
}
107+
foreach (XElement el in doc.Descendants(ns + "ellipse"))
108+
{
109+
if (double.TryParse(el.Attribute("cx")?.Value, System.Globalization.NumberStyles.Any,
110+
System.Globalization.CultureInfo.InvariantCulture, out double cx) &&
111+
double.TryParse(el.Attribute("cy")?.Value, System.Globalization.NumberStyles.Any,
112+
System.Globalization.CultureInfo.InvariantCulture, out double cy) &&
113+
double.TryParse(el.Attribute("rx")?.Value, System.Globalization.NumberStyles.Any,
114+
System.Globalization.CultureInfo.InvariantCulture, out double rx) &&
115+
double.TryParse(el.Attribute("ry")?.Value, System.Globalization.NumberStyles.Any,
116+
System.Globalization.CultureInfo.InvariantCulture, out double ry))
117+
{
118+
_geometries.Add(new EllipseGeometry(new Rect(cx - rx, cy - ry, rx * 2, ry * 2)));
119+
}
120+
}
107121
}
108122
catch
109123
{

src/UniGetUI.Avalonia/Views/MainWindow.axaml

Lines changed: 69 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,14 @@
99
mc:Ignorable="d" d:DesignWidth="1200" d:DesignHeight="750"
1010
x:Class="UniGetUI.Avalonia.Views.MainWindow"
1111
x:DataType="vm:MainWindowViewModel"
12+
Title="UniGetUI"
1213
Width="1450"
1314
MinWidth="700"
14-
MinHeight="500"
15-
ExtendClientAreaToDecorationsHint="True"
16-
ExtendClientAreaTitleBarHeightHint="-1">
15+
MinHeight="500">
1716
<Panel>
1817
<!-- Main content pushed below the native title bar -->
19-
<Grid ColumnDefinitions="Auto,*"
18+
<Grid x:Name="MainContentGrid"
19+
ColumnDefinitions="Auto,*"
2020
RowDefinitions="*,4,Auto"
2121
Background="{DynamicResource AppWindowBackground}"
2222
Margin="{Binding $parent[Window].WindowDecorationMargin}">
@@ -204,17 +204,20 @@
204204
</Grid>
205205

206206
<!-- ── Title bar: drag area + search box ── -->
207-
<Grid Height="{Binding $parent[Window].WindowDecorationMargin.Top}"
207+
<Grid x:Name="TitleBarGrid"
208+
Height="{Binding $parent[Window].WindowDecorationMargin.Top}"
208209
VerticalAlignment="Top"
209210
ColumnDefinitions="*,Auto,*">
210211

211-
<!-- Drag area fills the whole title bar -->
212+
<!-- Drag area — sits behind everything so interactive controls still work -->
212213
<Border Grid.Column="0" Grid.ColumnSpan="3"
213214
Background="{DynamicResource AppTitleBarBackground}"
215+
IsHitTestVisible="True"
214216
PointerPressed="TitleBar_PointerPressed"/>
215217

216-
<!-- Left: hamburger toggle button + app name -->
217-
<StackPanel Grid.Column="0"
218+
<!-- Left: hamburger + app name -->
219+
<StackPanel x:Name="HamburgerPanel"
220+
Grid.Column="0"
218221
HorizontalAlignment="Left"
219222
VerticalAlignment="Center"
220223
Orientation="Horizontal"
@@ -236,7 +239,7 @@
236239
VerticalAlignment="Center"/>
237240
</StackPanel>
238241

239-
<!-- Centre: global search box (Auto column → truly centred in the window) -->
242+
<!-- Centre: search box — vertically centred, no platform-specific margin -->
240243
<StackPanel Grid.Column="1"
241244
VerticalAlignment="Center"
242245
Orientation="Horizontal"
@@ -264,12 +267,63 @@
264267
</Button>
265268
</StackPanel>
266269

267-
<!-- Right: GitHub account avatar (centred in the right * column) -->
268-
<controls:UserAvatarControl Grid.Column="2"
269-
HorizontalAlignment="Center"
270-
VerticalAlignment="Center"
271-
Height="50"
272-
Margin="0,10,0,0"/>
270+
<!-- Right column: avatar centred + Linux window buttons on the far right -->
271+
<Panel Grid.Column="2">
272+
<controls:UserAvatarControl x:Name="AvatarControl"
273+
HorizontalAlignment="Center"
274+
VerticalAlignment="Center"
275+
Height="50"
276+
Margin="0,10,0,0"/>
277+
278+
<!-- Linux only: min / max / close (IsVisible set in code-behind) -->
279+
<StackPanel x:Name="LinuxWindowButtons"
280+
Orientation="Horizontal"
281+
HorizontalAlignment="Right"
282+
VerticalAlignment="Center"
283+
Margin="0,0,4,0"
284+
Spacing="0"
285+
IsVisible="False">
286+
<!-- Minimize: horizontal line -->
287+
<Button Width="46" Height="32" Padding="0"
288+
Background="Transparent" BorderThickness="0" CornerRadius="0"
289+
ToolTip.Tip="{t:Translate Minimize}"
290+
Click="MinimizeButton_Click">
291+
<Path Stroke="{DynamicResource SystemBaseHighColor}"
292+
StrokeThickness="1.5"
293+
StrokeLineCap="Round"
294+
Data="M2,0 H10"
295+
Width="12" Height="2"
296+
HorizontalAlignment="Center" VerticalAlignment="Center"/>
297+
</Button>
298+
<!-- Maximize / Restore: square outline, geometry swapped in code-behind -->
299+
<Button x:Name="MaximizeButton"
300+
Width="46" Height="32" Padding="0"
301+
Background="Transparent" BorderThickness="0" CornerRadius="0"
302+
ToolTip.Tip="{t:Translate Maximize}"
303+
Click="MaximizeButton_Click">
304+
<Path x:Name="MaximizeIcon"
305+
Stroke="{DynamicResource SystemBaseHighColor}"
306+
StrokeThickness="1.5"
307+
StrokeLineCap="Round"
308+
309+
Data="M0,0 H10 V10 H0 Z"
310+
Width="12" Height="12"
311+
HorizontalAlignment="Center" VerticalAlignment="Center"/>
312+
</Button>
313+
<!-- Close: X -->
314+
<Button Width="46" Height="32" Padding="0"
315+
Background="Transparent" BorderThickness="0" CornerRadius="0"
316+
ToolTip.Tip="{t:Translate Close}"
317+
Click="CloseButton_Click">
318+
<Path Stroke="{DynamicResource SystemBaseHighColor}"
319+
StrokeThickness="1.5"
320+
StrokeLineCap="Round"
321+
Data="M0,0 L10,10 M10,0 L0,10"
322+
Width="12" Height="12"
323+
HorizontalAlignment="Center" VerticalAlignment="Center"/>
324+
</Button>
325+
</StackPanel>
326+
</Panel>
273327
</Grid>
274328
</Panel>
275329
</Window>

src/UniGetUI.Avalonia/Views/MainWindow.axaml.cs

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
1+
using Avalonia;
12
using Avalonia.Controls;
23
using Avalonia.Controls.ApplicationLifetimes;
34
using Avalonia.Input;
5+
using Avalonia.Interactivity;
6+
using Avalonia.Media;
47
using UniGetUI.Avalonia.ViewModels;
58
using UniGetUI.Avalonia.Views.Pages;
69
using UniGetUI.Core.Logging;
710
using UniGetUI.Core.SettingsEngine;
11+
using UniGetUI.Core.Tools;
812

913
namespace UniGetUI.Avalonia.Views;
1014

@@ -44,6 +48,7 @@ public MainWindow()
4448
Instance = this;
4549
DataContext = new MainWindowViewModel();
4650
InitializeComponent();
51+
SetupTitleBar();
4752

4853
KeyDown += Window_KeyDown;
4954
}
@@ -81,6 +86,54 @@ private void Window_KeyDown(object? sender, KeyEventArgs e)
8186
}
8287
}
8388

89+
private void SetupTitleBar()
90+
{
91+
if (OperatingSystem.IsMacOS())
92+
{
93+
// macOS: extend into the native title bar area.
94+
// WindowDecorationMargin.Top drives TitleBarGrid.Height via binding.
95+
// Traffic lights sit on the left → keep the 65 px HamburgerPanel margin.
96+
// Avatar can be a bit taller to fill the deeper title bar.
97+
ExtendClientAreaToDecorationsHint = true;
98+
ExtendClientAreaTitleBarHeightHint = -1;
99+
AvatarControl.Height = 36;
100+
}
101+
else if (OperatingSystem.IsLinux())
102+
{
103+
// Linux: remove the native title bar entirely; our toolbar is the
104+
// only chrome. Custom min/max/close buttons appear on the right.
105+
WindowDecorations = WindowDecorations.None;
106+
TitleBarGrid.ClearValue(HeightProperty);
107+
TitleBarGrid.Height = 44;
108+
HamburgerPanel.Margin = new Thickness(10, 0, 8, 0);
109+
AvatarControl.Height = 32;
110+
LinuxWindowButtons.IsVisible = true;
111+
MainContentGrid.Margin = new Thickness(0, 44, 0, 0);
112+
// Keep maximize icon in sync with window state
113+
this.GetObservable(WindowStateProperty).Subscribe(state =>
114+
{
115+
MaximizeIcon.Data = Geometry.Parse(
116+
state == WindowState.Maximized
117+
? "M2,0 H10 V8 H2 Z M0,2 H8 V10 H0 Z" // restore: two overlapping squares
118+
: "M0,0 H10 V10 H0 Z"); // maximise: single square
119+
ToolTip.SetTip(
120+
MaximizeButton,
121+
CoreTools.Translate(state == WindowState.Maximized ? "Restore" : "Maximize"));
122+
});
123+
}
124+
}
125+
126+
private void MinimizeButton_Click(object? sender, RoutedEventArgs e)
127+
=> WindowState = WindowState.Minimized;
128+
129+
private void MaximizeButton_Click(object? sender, RoutedEventArgs e)
130+
=> WindowState = WindowState == WindowState.Maximized
131+
? WindowState.Normal
132+
: WindowState.Maximized;
133+
134+
private void CloseButton_Click(object? sender, RoutedEventArgs e)
135+
=> Close();
136+
84137
private void TitleBar_PointerPressed(object? sender, PointerPressedEventArgs e)
85138
{
86139
if (e.GetCurrentPoint(this).Properties.IsLeftButtonPressed)

src/UniGetUI.Avalonia/Views/Pages/SettingsPages/SettingsHomepage.axaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@
7171

7272
<!-- ── Managers ───────────────────────────────────────────── -->
7373
<settings:SettingsPageButton CornerRadius="8"
74-
Icon="Search"
74+
Icon="ClipboardList"
7575
Text="{t:Translate Package manager preferences}"
7676
UnderText="{t:Translate Text='Enable and disable package managers, change default install options, etc.'}"
7777
Command="{Binding NavigateToManagersCommand}"/>

src/UniGetUI.Avalonia/Views/SidebarView.axaml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
ToolTip.Tip="{t:Translate Discover Packages}">
2727
<Panel>
2828
<StackPanel Orientation="Horizontal" Spacing="12" Margin="8,6">
29-
<controls:SvgIcon Path="avares://UniGetUI.Avalonia/Assets/Symbols/ms_store.svg" Width="24" Height="24" VerticalAlignment="Center" />
29+
<controls:SvgIcon Path="avares://UniGetUI.Avalonia/Assets/Symbols/DiscoverPackage.svg" Width="24" Height="24" VerticalAlignment="Center" />
3030
<TextBlock Text="{t:Translate Discover Packages}"
3131
FontSize="16"
3232
FontWeight="SemiBold"
@@ -94,7 +94,7 @@
9494
ToolTip.Tip="{t:Translate Installed Packages}">
9595
<Panel>
9696
<StackPanel Orientation="Horizontal" Spacing="12" Margin="8,6">
97-
<controls:SvgIcon Path="avares://UniGetUI.Avalonia/Assets/Symbols/local_pc.svg" Width="24" Height="24" VerticalAlignment="Center"/>
97+
<controls:SvgIcon Path="avares://UniGetUI.Avalonia/Assets/Symbols/InstalledPackages.svg" Width="24" Height="24" VerticalAlignment="Center"/>
9898
<TextBlock Text="{t:Translate Installed Packages}"
9999
FontSize="16"
100100
FontWeight="SemiBold"
@@ -114,7 +114,7 @@
114114
ToolTip.Tip="{t:Translate Package Bundles}">
115115
<Panel>
116116
<StackPanel Orientation="Horizontal" Spacing="12" Margin="8,6">
117-
<controls:SvgIcon Path="avares://UniGetUI.Avalonia/Assets/Symbols/save_as.svg" Width="24" Height="24" VerticalAlignment="Center"/>
117+
<controls:SvgIcon Path="avares://UniGetUI.Avalonia/Assets/Symbols/PackagesBundle.svg" Width="24" Height="24" VerticalAlignment="Center"/>
118118
<TextBlock Text="{t:Translate Package Bundles}"
119119
FontSize="16"
120120
FontWeight="SemiBold"
@@ -192,7 +192,7 @@
192192
CornerRadius="6"
193193
ToolTip.Tip="{t:Translate More}">
194194
<StackPanel Orientation="Horizontal" Spacing="12">
195-
<controls:SvgIcon Path="avares://UniGetUI.Avalonia/Assets/Symbols/options.svg" Width="24" Height="24" VerticalAlignment="Center"/>
195+
<TextBlock Text="···" FontSize="20" Width="24" HorizontalAlignment="Center" VerticalAlignment="Center" TextAlignment="Center"/>
196196
<TextBlock Text="{t:Translate More}" FontSize="16" VerticalAlignment="Center"
197197
IsVisible="{Binding IsPaneOpen}"/>
198198
</StackPanel>

src/UniGetUI.Avalonia/Views/SoftwarePages/AbstractPackagesPage.axaml

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@
186186
CornerRadius="4"
187187
IsChecked="{Binding IsFilterPaneOpen, Mode=TwoWay}">
188188
<StackPanel Orientation="Horizontal" Spacing="8">
189-
<controls:SvgIcon Path="avares://UniGetUI.Avalonia/Assets/Symbols/options.svg" Width="16" Height="16" VerticalAlignment="Center"/>
189+
<controls:SvgIcon Path="avares://UniGetUI.Avalonia/Assets/Symbols/Filter.svg" Width="16" Height="16" VerticalAlignment="Center"/>
190190
<TextBlock Text="{t:Translate Filters}" FontSize="12" FontWeight="Medium" VerticalAlignment="Center"/>
191191
</StackPanel>
192192
</ToggleButton>
@@ -258,7 +258,7 @@
258258
Background="{DynamicResource SettingsCardBackground}">
259259
<Expander.Header>
260260
<StackPanel Orientation="Horizontal" Spacing="8">
261-
<controls:SvgIcon Path="avares://UniGetUI.Avalonia/Assets/Symbols/local_pc.svg" Width="16" Height="16" VerticalAlignment="Center"/>
261+
<controls:SvgIcon Path="avares://UniGetUI.Avalonia/Assets/Symbols/Sources.svg" Width="16" Height="16" VerticalAlignment="Center"/>
262262
<TextBlock Text="{t:Translate Sources}" FontWeight="SemiBold" VerticalAlignment="Center"/>
263263
</StackPanel>
264264
</Expander.Header>
@@ -325,7 +325,7 @@
325325
Background="{DynamicResource SettingsCardBackground}">
326326
<Expander.Header>
327327
<StackPanel Orientation="Horizontal" Spacing="8">
328-
<controls:SvgIcon Path="avares://UniGetUI.Avalonia/Assets/Symbols/options.svg" Width="16" Height="16" VerticalAlignment="Center"/>
328+
<controls:SvgIcon Path="avares://UniGetUI.Avalonia/Assets/Symbols/Filter.svg" Width="16" Height="16" VerticalAlignment="Center"/>
329329
<TextBlock Text="{t:Translate Filters}" FontWeight="SemiBold" VerticalAlignment="Center"/>
330330
</StackPanel>
331331
</Expander.Header>
@@ -632,7 +632,8 @@
632632
<TextBox x:Name="MegaQueryBlock"
633633
Grid.Row="1"
634634
Grid.Column="1"
635-
Padding="16,12,10,08"
635+
Padding="16,0,10,0"
636+
VerticalContentAlignment="Center"
636637
CornerRadius="8,0,0,8"
637638
FontSize="40"
638639
Watermark="{t:Translate Search for packages}"

src/UniGetUI.Avalonia/Views/SoftwarePages/DiscoverSoftwarePage.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public DiscoverSoftwarePage() : base(new PackagesPageData
2727
{
2828
PageName = "SoftwarePages.DiscoverSoftwarePage",
2929
PageTitle = CoreTools.Translate("Discover Packages"),
30-
IconName = "ms_store",
30+
IconName = "DiscoverPackage",
3131
PageRole = OperationType.Install,
3232
Loader = DiscoverablePackagesLoader.Instance ?? new DiscoverablePackagesLoader([]),
3333
MegaQueryBlockEnabled = true,

src/UniGetUI.Avalonia/Views/SoftwarePages/InstalledPackagesPage.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ public InstalledPackagesPage() : base(new PackagesPageData
3737
{
3838
PageName = "SoftwarePages.InstalledPackagesPage",
3939
PageTitle = CoreTools.Translate("Installed Packages"),
40-
IconName = "local_pc",
40+
IconName = "InstalledPackages",
4141
PageRole = OperationType.Uninstall,
4242
Loader = InstalledPackagesLoader.Instance ?? new InstalledPackagesLoader([]),
4343
MegaQueryBlockEnabled = false,

0 commit comments

Comments
 (0)