Skip to content

Commit d33065a

Browse files
authored
Continue Avalonia Port: Add Missing Pages, Windows Settings Cleanup, and UI Fixes (#4536)
* Added about view * Added shortcut view * completed the settings views * added log page * Added the help webview * Added releaseNotes page * added the uniget logo for the macOS dock * added the title bar login button * Some small UI Fixes * hide some settings for macOS * Added the different InfoBar
1 parent f84e9e6 commit d33065a

99 files changed

Lines changed: 5295 additions & 351 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/build-release.yml

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -308,10 +308,62 @@ jobs:
308308
run: |
309309
Remove-Item "unigetui_bin" -Recurse -Force -ErrorAction SilentlyContinue
310310
311+
build-avalonia:
312+
name: Build Avalonia (${{ matrix.platform }})
313+
runs-on: macos-latest
314+
needs: [preflight]
315+
environment: ${{ needs.preflight.outputs.package-env }}
316+
permissions:
317+
contents: read
318+
env:
319+
UNIGETUI_GITHUB_CLIENT_ID: ${{ secrets.UNIGETUI_GITHUB_CLIENT_ID }}
320+
UNIGETUI_GITHUB_CLIENT_SECRET: ${{ secrets.UNIGETUI_GITHUB_CLIENT_SECRET }}
321+
NUGET_PACKAGES: ${{ github.workspace }}/.nuget/packages
322+
strategy:
323+
fail-fast: false
324+
matrix:
325+
platform: [arm64, x64]
326+
327+
steps:
328+
- name: Checkout
329+
uses: actions/checkout@v6
330+
331+
- name: Install .NET
332+
uses: actions/setup-dotnet@v5
333+
with:
334+
global-json-file: global.json
335+
336+
- name: Cache NuGet packages
337+
uses: actions/cache@v5
338+
with:
339+
path: ${{ env.NUGET_PACKAGES }}
340+
key: ${{ runner.os }}-nuget-${{ hashFiles('global.json', 'src/**/*.csproj', 'src/**/*.props', 'src/**/*.targets', 'src/**/*.sln') }}
341+
restore-keys: |
342+
${{ runner.os }}-nuget-
343+
344+
- name: Restore dependencies
345+
working-directory: src
346+
run: dotnet restore UniGetUI.Avalonia/UniGetUI.Avalonia.csproj
347+
348+
- name: Publish
349+
working-directory: src
350+
run: |
351+
dotnet publish UniGetUI.Avalonia/UniGetUI.Avalonia.csproj \
352+
--configuration Release \
353+
--runtime osx-${{ matrix.platform }} \
354+
--self-contained true \
355+
--output ../avalonia_bin/${{ matrix.platform }}
356+
357+
- name: Upload artifacts
358+
uses: actions/upload-artifact@v7
359+
with:
360+
name: UniGetUI-Avalonia-${{ matrix.platform }}
361+
path: avalonia_bin/${{ matrix.platform }}/*
362+
311363
publish:
312364
name: Publish GitHub Release
313365
runs-on: ubuntu-latest
314-
needs: [preflight, build]
366+
needs: [preflight, build, build-avalonia]
315367
if: ${{ fromJSON(needs.preflight.outputs.skip-publish) == false }}
316368
environment: ${{ needs.preflight.outputs.package-env }}
317369
permissions:

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ src/UniGetUI/choco-cli/extensions/chocolatey-dotnetfx/
8080

8181
*.user
8282
/src/UniGetUI/Generated Files
83+
/src/UniGetUI.Avalonia/Infrastructure/Generated Files
8384
/InstallerExtras/MsiCreator/.vs/MsiInstallerWrapper/CopilotIndices
8485
/InstallerExtras/MsiCreator/.vs
8586
InstallerExtras/MsiCreator/setup.exe
@@ -93,3 +94,4 @@ src/UniGetUI.v3.ncrunchsolution
9394

9495
# macOS Finder metadata
9596
.DS_Store
97+
/src/UniGetUI.Avalonia/Generated Files
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
{
2+
"configurations": [
3+
{
4+
"name": "UniGetUI.Avalonia (Debug)",
5+
"type": "coreclr",
6+
"request": "launch",
7+
"preLaunchTask": "build UniGetUI.Avalonia (Debug)",
8+
"program": "${workspaceFolder}/bin/arm64/Debug/net10.0/UniGetUI.Avalonia",
9+
"args": [],
10+
"cwd": "${workspaceFolder}/bin/arm64/Debug/net10.0/",
11+
"console": "integratedTerminal",
12+
"stopAtEntry": false,
13+
"env": {
14+
"UNIGETUI_GITHUB_CLIENT_ID": "",
15+
"UNIGETUI_GITHUB_CLIENT_SECRET": ""
16+
}
17+
}
18+
]
19+
}

src/UniGetUI.Avalonia/App.axaml.cs

Lines changed: 11 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
using System.Diagnostics;
22
using Avalonia;
33
using Avalonia.Controls.ApplicationLifetimes;
4-
using Avalonia.Data.Core.Plugins;
54
using Avalonia.Markup.Xaml;
65
using Avalonia.Markup.Xaml.Styling;
6+
using Avalonia.Platform;
77
using Avalonia.Styling;
8+
using UniGetUI.Avalonia.Infrastructure;
89
using UniGetUI.Avalonia.Views;
910
using UniGetUI.PackageEngine;
1011
using CoreSettings = global::UniGetUI.Core.SettingsEngine.Settings;
@@ -16,6 +17,9 @@ public partial class App : Application
1617
public override void Initialize()
1718
{
1819
AvaloniaXamlLoader.Load(this);
20+
#if AVALONIA_DIAGNOSTICS_ENABLED
21+
this.AttachDeveloperTools();
22+
#endif
1923

2024
string platform = OperatingSystem.IsWindows() ? "Windows"
2125
: OperatingSystem.IsMacOS() ? "macOS"
@@ -31,17 +35,17 @@ public override void OnFrameworkInitializationCompleted()
3135
{
3236
if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
3337
{
34-
// Avoid duplicate validations from both Avalonia and the CommunityToolkit.
35-
// More info: https://docs.avaloniaui.net/docs/guides/development-guides/data-validation#manage-validationplugins
36-
DisableAvaloniaDataAnnotationValidation();
3738
if (OperatingSystem.IsMacOS())
39+
{
3840
ExpandMacOSPath();
41+
using var stream = AssetLoader.Open(new Uri("avares://UniGetUI.Avalonia/Assets/icon.png"));
42+
using var ms = new MemoryStream();
43+
stream.CopyTo(ms);
44+
MacOsNotificationBridge.SetDockIcon(ms.ToArray());
45+
}
3946
PEInterface.LoadLoaders();
4047
ApplyTheme(CoreSettings.GetValue(CoreSettings.K.PreferredTheme));
4148
var mainWindow = new MainWindow();
42-
#if DEBUG
43-
mainWindow.AttachDevTools();
44-
#endif
4549
desktop.MainWindow = mainWindow;
4650
_ = Task.Run(PEInterface.LoadManagers);
4751
}
@@ -86,16 +90,4 @@ public static void ApplyTheme(string value)
8690
};
8791
}
8892

89-
private static void DisableAvaloniaDataAnnotationValidation()
90-
{
91-
// Get an array of plugins to remove
92-
var dataValidationPluginsToRemove =
93-
BindingPlugins.DataValidators.OfType<DataAnnotationsValidationPlugin>().ToArray();
94-
95-
// remove each entry found
96-
foreach (var plugin in dataValidationPluginsToRemove)
97-
{
98-
BindingPlugins.DataValidators.Remove(plugin);
99-
}
100-
}
10193
}

src/UniGetUI.Avalonia/Assets/Styles/Styles.Common.axaml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,13 @@
2727
<Setter Property="Margin" Value="40,4,40,0"/>
2828
</Style>
2929

30+
<!-- Hyperlink-style text (blue accent, underline) -->
31+
<Style Selector="TextBlock.hyperlink">
32+
<Setter Property="Foreground" Value="{DynamicResource SystemControlHighlightAccentBrush}"/>
33+
<Setter Property="TextDecorations" Value="Underline"/>
34+
<Setter Property="Cursor" Value="Hand"/>
35+
</Style>
36+
3037
<!-- SvgIcon: inherit the Fluent foreground so icons match text colour in both themes -->
3138
<Style Selector="controls|SvgIcon">
3239
<Setter Property="Foreground" Value="{DynamicResource SystemControlForegroundBaseHighBrush}"/>

src/UniGetUI.Avalonia/Assets/Styles/Styles.Linux.axaml

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,16 @@
2626
<SolidColorBrush x:Key="WarningBannerIconBackground" Color="#f0a500"/>
2727
<SolidColorBrush x:Key="WarningBannerIconForeground" Color="#1a1000"/>
2828
<SolidColorBrush x:Key="WarningBannerSubtext" Color="#ffe082"/>
29+
<!-- Status banners (success / error / info) -->
30+
<SolidColorBrush x:Key="StatusSuccessBackground" Color="#1a3d1a"/>
31+
<SolidColorBrush x:Key="StatusSuccessBorderBrush" Color="#2e6b2e"/>
32+
<SolidColorBrush x:Key="StatusSuccessForeground" Color="#66bb6a"/>
33+
<SolidColorBrush x:Key="StatusErrorBackground" Color="#3d1a1a"/>
34+
<SolidColorBrush x:Key="StatusErrorBorderBrush" Color="#6b2e2e"/>
35+
<SolidColorBrush x:Key="StatusErrorForeground" Color="#ef9a9a"/>
36+
<SolidColorBrush x:Key="StatusWarningForeground" Color="#ffe082"/>
37+
<SolidColorBrush x:Key="StatusInfoBackground" Color="#1a2035"/>
38+
<SolidColorBrush x:Key="StatusInfoBorderBrush" Color="#2e3a60"/>
2939
<!-- Setting warning subtext -->
3040
<SolidColorBrush x:Key="SettingWarningTextForeground" Color="#ffc107"/>
3141
</ResourceDictionary>
@@ -52,6 +62,16 @@
5262
<SolidColorBrush x:Key="WarningBannerIconBackground" Color="#f0a500"/>
5363
<SolidColorBrush x:Key="WarningBannerIconForeground" Color="#1a1000"/>
5464
<SolidColorBrush x:Key="WarningBannerSubtext" Color="#7a4f00"/>
65+
<!-- Status banners (success / error / info) -->
66+
<SolidColorBrush x:Key="StatusSuccessBackground" Color="#e8f5e9"/>
67+
<SolidColorBrush x:Key="StatusSuccessBorderBrush" Color="#4caf50"/>
68+
<SolidColorBrush x:Key="StatusSuccessForeground" Color="#2e7d32"/>
69+
<SolidColorBrush x:Key="StatusErrorBackground" Color="#ffebee"/>
70+
<SolidColorBrush x:Key="StatusErrorBorderBrush" Color="#f44336"/>
71+
<SolidColorBrush x:Key="StatusErrorForeground" Color="#c62828"/>
72+
<SolidColorBrush x:Key="StatusWarningForeground" Color="#7a4f00"/>
73+
<SolidColorBrush x:Key="StatusInfoBackground" Color="#e3f2fd"/>
74+
<SolidColorBrush x:Key="StatusInfoBorderBrush" Color="#1976d2"/>
5575
<!-- Setting warning subtext -->
5676
<SolidColorBrush x:Key="SettingWarningTextForeground" Color="#a05c00"/>
5777
</ResourceDictionary>

src/UniGetUI.Avalonia/Assets/Styles/Styles.Windows.axaml

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,17 @@
2626
<SolidColorBrush x:Key="WarningBannerIconBackground" Color="#f0a500"/>
2727
<SolidColorBrush x:Key="WarningBannerIconForeground" Color="#1a1000"/>
2828
<SolidColorBrush x:Key="WarningBannerSubtext" Color="#ffe082"/>
29+
<!-- Status banners (success / error / info) -->
30+
<SolidColorBrush x:Key="StatusSuccessBackground" Color="#1a3d1a"/>
31+
<SolidColorBrush x:Key="StatusSuccessBorderBrush" Color="#2e6b2e"/>
32+
<SolidColorBrush x:Key="StatusErrorBackground" Color="#3d1a1a"/>
33+
<SolidColorBrush x:Key="StatusErrorBorderBrush" Color="#6b2e2e"/>
34+
<SolidColorBrush x:Key="StatusInfoBackground" Color="#1a2035"/>
35+
<SolidColorBrush x:Key="StatusInfoBorderBrush" Color="#2e3a60"/>
36+
<!-- Status badge foreground -->
37+
<SolidColorBrush x:Key="StatusSuccessForeground" Color="#66bb6a"/>
38+
<SolidColorBrush x:Key="StatusWarningForeground" Color="#ffe082"/>
39+
<SolidColorBrush x:Key="StatusErrorForeground" Color="#ef9a9a"/>
2940
<!-- Setting warning subtext -->
3041
<SolidColorBrush x:Key="SettingWarningTextForeground" Color="#ffc107"/>
3142
</ResourceDictionary>
@@ -52,6 +63,17 @@
5263
<SolidColorBrush x:Key="WarningBannerIconBackground" Color="#f0a500"/>
5364
<SolidColorBrush x:Key="WarningBannerIconForeground" Color="#1a1000"/>
5465
<SolidColorBrush x:Key="WarningBannerSubtext" Color="#7a4f00"/>
66+
<!-- Status banners (success / error / info) -->
67+
<SolidColorBrush x:Key="StatusSuccessBackground" Color="#e8f5e9"/>
68+
<SolidColorBrush x:Key="StatusSuccessBorderBrush" Color="#4caf50"/>
69+
<SolidColorBrush x:Key="StatusErrorBackground" Color="#ffebee"/>
70+
<SolidColorBrush x:Key="StatusErrorBorderBrush" Color="#f44336"/>
71+
<SolidColorBrush x:Key="StatusInfoBackground" Color="#e3f2fd"/>
72+
<SolidColorBrush x:Key="StatusInfoBorderBrush" Color="#1976d2"/>
73+
<!-- Status badge foreground -->
74+
<SolidColorBrush x:Key="StatusSuccessForeground" Color="#2e7d32"/>
75+
<SolidColorBrush x:Key="StatusWarningForeground" Color="#7a4f00"/>
76+
<SolidColorBrush x:Key="StatusErrorForeground" Color="#c62828"/>
5577
<!-- Setting warning subtext -->
5678
<SolidColorBrush x:Key="SettingWarningTextForeground" Color="#a05c00"/>
5779
</ResourceDictionary>

src/UniGetUI.Avalonia/Assets/Styles/Styles.macOS.axaml

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,17 @@
2626
<SolidColorBrush x:Key="WarningBannerIconBackground" Color="#f0a500"/>
2727
<SolidColorBrush x:Key="WarningBannerIconForeground" Color="#1a1000"/>
2828
<SolidColorBrush x:Key="WarningBannerSubtext" Color="#ffe082"/>
29+
<!-- Status banners (success / error / info) -->
30+
<SolidColorBrush x:Key="StatusSuccessBackground" Color="#1a3d1a"/>
31+
<SolidColorBrush x:Key="StatusSuccessBorderBrush" Color="#2e6b2e"/>
32+
<SolidColorBrush x:Key="StatusErrorBackground" Color="#3d1a1a"/>
33+
<SolidColorBrush x:Key="StatusErrorBorderBrush" Color="#6b2e2e"/>
34+
<SolidColorBrush x:Key="StatusInfoBackground" Color="#1a2035"/>
35+
<SolidColorBrush x:Key="StatusInfoBorderBrush" Color="#2e3a60"/>
36+
<!-- Status badge foreground -->
37+
<SolidColorBrush x:Key="StatusSuccessForeground" Color="#66bb6a"/>
38+
<SolidColorBrush x:Key="StatusWarningForeground" Color="#ffe082"/>
39+
<SolidColorBrush x:Key="StatusErrorForeground" Color="#ef9a9a"/>
2940
<!-- Setting warning subtext -->
3041
<SolidColorBrush x:Key="SettingWarningTextForeground" Color="#ffc107"/>
3142
</ResourceDictionary>
@@ -52,6 +63,17 @@
5263
<SolidColorBrush x:Key="WarningBannerIconBackground" Color="#f0a500"/>
5364
<SolidColorBrush x:Key="WarningBannerIconForeground" Color="#1a1000"/>
5465
<SolidColorBrush x:Key="WarningBannerSubtext" Color="#7a4f00"/>
66+
<!-- Status banners (success / error / info) -->
67+
<SolidColorBrush x:Key="StatusSuccessBackground" Color="#e8f5e9"/>
68+
<SolidColorBrush x:Key="StatusSuccessBorderBrush" Color="#4caf50"/>
69+
<SolidColorBrush x:Key="StatusErrorBackground" Color="#ffebee"/>
70+
<SolidColorBrush x:Key="StatusErrorBorderBrush" Color="#f44336"/>
71+
<SolidColorBrush x:Key="StatusInfoBackground" Color="#e3f2fd"/>
72+
<SolidColorBrush x:Key="StatusInfoBorderBrush" Color="#1976d2"/>
73+
<!-- Status badge foreground -->
74+
<SolidColorBrush x:Key="StatusSuccessForeground" Color="#2e7d32"/>
75+
<SolidColorBrush x:Key="StatusWarningForeground" Color="#7a4f00"/>
76+
<SolidColorBrush x:Key="StatusErrorForeground" Color="#c62828"/>
5577
<!-- Setting warning subtext -->
5678
<SolidColorBrush x:Key="SettingWarningTextForeground" Color="#a05c00"/>
5779
</ResourceDictionary>

src/UniGetUI.Avalonia/Infrastructure/AvaloniaBootstrapper.cs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ private static async Task InitializeBackgroundApiAsync()
101101
_backgroundApi.OnOpenUpdatesPage += (_, _) =>
102102
Dispatcher.UIThread.Post(() =>
103103
{
104-
MainWindow.Instance?.NavigateShell(ShellPageType.Updates);
104+
MainWindow.Instance?.Navigate(PageType.Updates);
105105
MainWindow.Instance?.ShowFromTray();
106106
});
107107

@@ -110,10 +110,7 @@ private static async Task InitializeBackgroundApiAsync()
110110
{
111111
Logger.Info($"BackgroundApi: ShowSharedPackage {pkg.Key}/{pkg.Value}");
112112
MainWindow.Instance?.ShowFromTray();
113-
if (MainWindow.Instance?.Content is Views.MainShellView shell)
114-
{
115-
shell.OpenSharedPackage(pkg.Key, pkg.Value);
116-
}
113+
MainWindow.Instance?.OpenSharedPackage(pkg.Key, pkg.Value);
117114
});
118115

119116
_backgroundApi.OnUpgradeAll += (_, _) =>

0 commit comments

Comments
 (0)