diff --git a/.gitignore b/.gitignore
index 4992c1b..a40974d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -198,6 +198,4 @@ FakesAssemblies/
# Generated extensions directory
**/extensions/
-*.slnx
-!src/GeneralUpdate-Samples.slnx
.DS_Store
diff --git a/UI/SemiUrsa/Client.Avalonia/Assets/Semi.svg b/UI/SemiUrsa/Client.Avalonia/Assets/Semi.svg
deleted file mode 100644
index 5b895a0..0000000
--- a/UI/SemiUrsa/Client.Avalonia/Assets/Semi.svg
+++ /dev/null
@@ -1,56 +0,0 @@
-
-
-
-
diff --git a/UI/SemiUrsa/Client.Avalonia/Assets/avalonia-logo.ico b/UI/SemiUrsa/Client.Avalonia/Assets/avalonia-logo.ico
deleted file mode 100644
index da8d49f..0000000
Binary files a/UI/SemiUrsa/Client.Avalonia/Assets/avalonia-logo.ico and /dev/null differ
diff --git a/UI/SemiUrsa/Common.Avalonia/Models/DownloadStatistics.cs b/UI/SemiUrsa/Common.Avalonia/Models/DownloadStatistics.cs
deleted file mode 100644
index 5c94448..0000000
--- a/UI/SemiUrsa/Common.Avalonia/Models/DownloadStatistics.cs
+++ /dev/null
@@ -1,28 +0,0 @@
-using System.ComponentModel;
-using CommunityToolkit.Mvvm.ComponentModel;
-
-namespace Common.Avalonia.Models;
-
-public partial class DownloadStatistics : ObservableObject
-{
- [ObservableProperty] [Description("当前下载版本")]
- private object? _version;
-
- [ObservableProperty] [Description("下载速度")]
- private double _speed;
-
- [ObservableProperty] [Description("剩余下载时间")]
- private TimeSpan _remaining;
-
- [ObservableProperty] [Description("总大小")] [NotifyPropertyChangedFor(nameof(TotalBytesToReceiveInMB))]
- private long _totalBytesToReceive;
-
- [ObservableProperty] [Description("已下载大小")] [NotifyPropertyChangedFor(nameof(BytesReceivedInMB))]
- private long _bytesReceived;
-
- [ObservableProperty] [Description("进度百分比")]
- private double _progressPercentage;
-
- public double BytesReceivedInMB => (double)BytesReceived / 1024 / 1024;
- public double TotalBytesToReceiveInMB => (double)TotalBytesToReceive / 1024 / 1024;
-}
\ No newline at end of file
diff --git a/UI/SemiUrsa/Upgrade.Avalonia.sln b/UI/SemiUrsa/Upgrade.Avalonia.sln
deleted file mode 100644
index 2f38ff2..0000000
--- a/UI/SemiUrsa/Upgrade.Avalonia.sln
+++ /dev/null
@@ -1,33 +0,0 @@
-
-Microsoft Visual Studio Solution File, Format Version 12.00
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Client.Avalonia", "Client.Avalonia\Client.Avalonia.csproj", "{5CA6F846-64BC-4BED-A932-01C8EB090E9F}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Common.Avalonia", "Common.Avalonia\Common.Avalonia.csproj", "{74710D44-81C4-46AC-B066-CE72AB8249F6}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Upgrade.Avalonia", "Upgrade.Avalonia\Upgrade.Avalonia.csproj", "{2AC04D27-3F2F-472A-BFA7-FF7518CCAF9F}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{3DA99C4E-89E3-4049-9C22-0A7EC60D83D8}"
- ProjectSection(SolutionItems) = preProject
- Directory.Packages.props = Directory.Packages.props
- EndProjectSection
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|Any CPU = Debug|Any CPU
- Release|Any CPU = Release|Any CPU
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {5CA6F846-64BC-4BED-A932-01C8EB090E9F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {5CA6F846-64BC-4BED-A932-01C8EB090E9F}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {5CA6F846-64BC-4BED-A932-01C8EB090E9F}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {5CA6F846-64BC-4BED-A932-01C8EB090E9F}.Release|Any CPU.Build.0 = Release|Any CPU
- {74710D44-81C4-46AC-B066-CE72AB8249F6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {74710D44-81C4-46AC-B066-CE72AB8249F6}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {74710D44-81C4-46AC-B066-CE72AB8249F6}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {74710D44-81C4-46AC-B066-CE72AB8249F6}.Release|Any CPU.Build.0 = Release|Any CPU
- {2AC04D27-3F2F-472A-BFA7-FF7518CCAF9F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {2AC04D27-3F2F-472A-BFA7-FF7518CCAF9F}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {2AC04D27-3F2F-472A-BFA7-FF7518CCAF9F}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {2AC04D27-3F2F-472A-BFA7-FF7518CCAF9F}.Release|Any CPU.Build.0 = Release|Any CPU
- EndGlobalSection
-EndGlobal
diff --git a/UI/SemiUrsa/Upgrade.Avalonia/Assets/GeneralUpdate.png b/UI/SemiUrsa/Upgrade.Avalonia/Assets/GeneralUpdate.png
deleted file mode 100644
index 0325b43..0000000
Binary files a/UI/SemiUrsa/Upgrade.Avalonia/Assets/GeneralUpdate.png and /dev/null differ
diff --git a/UI/SemiUrsa/Upgrade.Avalonia/Assets/Ursa.svg b/UI/SemiUrsa/Upgrade.Avalonia/Assets/Ursa.svg
deleted file mode 100644
index 70daaab..0000000
--- a/UI/SemiUrsa/Upgrade.Avalonia/Assets/Ursa.svg
+++ /dev/null
@@ -1,68 +0,0 @@
-
-
-
-
diff --git a/UI/SemiUrsa/Upgrade.Avalonia/Assets/avalonia-logo.ico b/UI/SemiUrsa/Upgrade.Avalonia/Assets/avalonia-logo.ico
deleted file mode 100644
index da8d49f..0000000
Binary files a/UI/SemiUrsa/Upgrade.Avalonia/Assets/avalonia-logo.ico and /dev/null differ
diff --git a/UI/SemiUrsa/Client.Avalonia/App.axaml b/UI/SemiUrsaMafia/Client.Avalonia/App.axaml
similarity index 100%
rename from UI/SemiUrsa/Client.Avalonia/App.axaml
rename to UI/SemiUrsaMafia/Client.Avalonia/App.axaml
diff --git a/UI/SemiUrsa/Client.Avalonia/App.axaml.cs b/UI/SemiUrsaMafia/Client.Avalonia/App.axaml.cs
similarity index 56%
rename from UI/SemiUrsa/Client.Avalonia/App.axaml.cs
rename to UI/SemiUrsaMafia/Client.Avalonia/App.axaml.cs
index 754f1d3..a533140 100644
--- a/UI/SemiUrsa/Client.Avalonia/App.axaml.cs
+++ b/UI/SemiUrsaMafia/Client.Avalonia/App.axaml.cs
@@ -1,8 +1,5 @@
-using System;
-using System.Linq;
using Avalonia;
using Avalonia.Controls.ApplicationLifetimes;
-using Avalonia.Data.Core.Plugins;
using Avalonia.Markup.Xaml;
using Client.Avalonia.ViewModels;
using Client.Avalonia.Views;
@@ -29,25 +26,9 @@ public override void OnFrameworkInitializationCompleted()
if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
{
- // Avoid duplicate validations from both Avalonia and the CommunityToolkit.
- // More info: https://docs.avaloniaui.net/docs/guides/development-guides/data-validation#manage-validationplugins
- DisableAvaloniaDataAnnotationValidation();
desktop.MainWindow = new MainWindow();
}
base.OnFrameworkInitializationCompleted();
}
-
- private void DisableAvaloniaDataAnnotationValidation()
- {
- // Get an array of plugins to remove
- var dataValidationPluginsToRemove =
- BindingPlugins.DataValidators.OfType().ToArray();
-
- // remove each entry found
- foreach (var plugin in dataValidationPluginsToRemove)
- {
- BindingPlugins.DataValidators.Remove(plugin);
- }
- }
}
\ No newline at end of file
diff --git a/UI/SemiUrsa/Client.Avalonia/Client.Avalonia.csproj b/UI/SemiUrsaMafia/Client.Avalonia/Client.Avalonia.csproj
similarity index 88%
rename from UI/SemiUrsa/Client.Avalonia/Client.Avalonia.csproj
rename to UI/SemiUrsaMafia/Client.Avalonia/Client.Avalonia.csproj
index 017c874..47e533a 100644
--- a/UI/SemiUrsa/Client.Avalonia/Client.Avalonia.csproj
+++ b/UI/SemiUrsaMafia/Client.Avalonia/Client.Avalonia.csproj
@@ -12,6 +12,10 @@
+
+
+
+
diff --git a/UI/SemiUrsa/Client.Avalonia/Program.cs b/UI/SemiUrsaMafia/Client.Avalonia/Program.cs
similarity index 100%
rename from UI/SemiUrsa/Client.Avalonia/Program.cs
rename to UI/SemiUrsaMafia/Client.Avalonia/Program.cs
diff --git a/UI/SemiUrsa/Client.Avalonia/ViewLocator.cs b/UI/SemiUrsaMafia/Client.Avalonia/ViewLocator.cs
similarity index 100%
rename from UI/SemiUrsa/Client.Avalonia/ViewLocator.cs
rename to UI/SemiUrsaMafia/Client.Avalonia/ViewLocator.cs
diff --git a/UI/SemiUrsa/Client.Avalonia/ViewModels/MainViewViewModel.cs b/UI/SemiUrsaMafia/Client.Avalonia/ViewModels/MainViewViewModel.cs
similarity index 89%
rename from UI/SemiUrsa/Client.Avalonia/ViewModels/MainViewViewModel.cs
rename to UI/SemiUrsaMafia/Client.Avalonia/ViewModels/MainViewViewModel.cs
index d9dbcf8..6bc8839 100644
--- a/UI/SemiUrsa/Client.Avalonia/ViewModels/MainViewViewModel.cs
+++ b/UI/SemiUrsaMafia/Client.Avalonia/ViewModels/MainViewViewModel.cs
@@ -14,10 +14,11 @@ public partial class MainViewViewModel : ViewModelBase
private readonly IDownloadService _downloadService;
private readonly WindowNotificationManager _notificationManager;
- [ObservableProperty] private DownloadStatistics _statistics;
+ [ObservableProperty] public partial DownloadStatistics Statistics { get; set; }
- [ObservableProperty] [NotifyCanExecuteChangedFor(nameof(StartCommand), nameof(StopCommand))]
- private DownloadStatus _status;
+ [ObservableProperty]
+ [NotifyCanExecuteChangedFor(nameof(StartCommand), nameof(StopCommand))]
+ public partial DownloadStatus Status { get; set; }
public MainViewViewModel(IDownloadService downloadService)
{
diff --git a/UI/SemiUrsa/Client.Avalonia/ViewModels/MainWindowViewModel.cs b/UI/SemiUrsaMafia/Client.Avalonia/ViewModels/MainWindowViewModel.cs
similarity index 100%
rename from UI/SemiUrsa/Client.Avalonia/ViewModels/MainWindowViewModel.cs
rename to UI/SemiUrsaMafia/Client.Avalonia/ViewModels/MainWindowViewModel.cs
diff --git a/UI/SemiUrsa/Client.Avalonia/ViewModels/ViewModelBase.cs b/UI/SemiUrsaMafia/Client.Avalonia/ViewModels/ViewModelBase.cs
similarity index 100%
rename from UI/SemiUrsa/Client.Avalonia/ViewModels/ViewModelBase.cs
rename to UI/SemiUrsaMafia/Client.Avalonia/ViewModels/ViewModelBase.cs
diff --git a/UI/SemiUrsa/Client.Avalonia/Views/MainView.axaml b/UI/SemiUrsaMafia/Client.Avalonia/Views/MainView.axaml
similarity index 94%
rename from UI/SemiUrsa/Client.Avalonia/Views/MainView.axaml
rename to UI/SemiUrsaMafia/Client.Avalonia/Views/MainView.axaml
index bef3cc5..48b9214 100644
--- a/UI/SemiUrsa/Client.Avalonia/Views/MainView.axaml
+++ b/UI/SemiUrsaMafia/Client.Avalonia/Views/MainView.axaml
@@ -6,6 +6,7 @@
xmlns:vm="clr-namespace:Client.Avalonia.ViewModels"
xmlns:services="clr-namespace:Common.Avalonia.Services;assembly=Common.Avalonia"
xmlns:cvt="clr-namespace:Common.Avalonia.Converters;assembly=Common.Avalonia"
+ xmlns:iri="https://irihi.tech/shared"
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
x:Class="Client.Avalonia.Views.MainView"
x:DataType="vm:MainViewViewModel">
@@ -14,17 +15,16 @@
-
+
-
+ Source="avares://Common.Avalonia/Assets/GeneralUpdate.png" />
+
+
-
-
-
-
+
None
All
+
+
+
+
diff --git a/UI/SemiUrsa/Common.Avalonia/Converters/EnumConverter.cs b/UI/SemiUrsaMafia/Common.Avalonia/Converters/EnumConverter.cs
similarity index 100%
rename from UI/SemiUrsa/Common.Avalonia/Converters/EnumConverter.cs
rename to UI/SemiUrsaMafia/Common.Avalonia/Converters/EnumConverter.cs
diff --git a/UI/SemiUrsa/Common.Avalonia/Converters/ProgressConverter.cs b/UI/SemiUrsaMafia/Common.Avalonia/Converters/ProgressConverter.cs
similarity index 100%
rename from UI/SemiUrsa/Common.Avalonia/Converters/ProgressConverter.cs
rename to UI/SemiUrsaMafia/Common.Avalonia/Converters/ProgressConverter.cs
diff --git a/UI/SemiUrsaMafia/Common.Avalonia/Models/DownloadStatistics.cs b/UI/SemiUrsaMafia/Common.Avalonia/Models/DownloadStatistics.cs
new file mode 100644
index 0000000..221eb52
--- /dev/null
+++ b/UI/SemiUrsaMafia/Common.Avalonia/Models/DownloadStatistics.cs
@@ -0,0 +1,36 @@
+using System.ComponentModel;
+using CommunityToolkit.Mvvm.ComponentModel;
+
+namespace Common.Avalonia.Models;
+
+public partial class DownloadStatistics : ObservableObject
+{
+ [ObservableProperty]
+ [Description("当前下载版本")]
+ public partial object? Version { get; set; }
+
+ [ObservableProperty]
+ [Description("下载速度")]
+ public partial double Speed { get; set; }
+
+ [ObservableProperty]
+ [Description("剩余下载时间")]
+ public partial TimeSpan Remaining { get; set; }
+
+ [ObservableProperty]
+ [Description("总大小")]
+ [NotifyPropertyChangedFor(nameof(TotalBytesToReceiveInMB))]
+ public partial long TotalBytesToReceive { get; set; }
+
+ [ObservableProperty]
+ [Description("已下载大小")]
+ [NotifyPropertyChangedFor(nameof(BytesReceivedInMB))]
+ public partial long BytesReceived { get; set; }
+
+ [ObservableProperty]
+ [Description("进度百分比")]
+ public partial double ProgressPercentage { get; set; }
+
+ public double BytesReceivedInMB => (double)BytesReceived / 1024 / 1024;
+ public double TotalBytesToReceiveInMB => (double)TotalBytesToReceive / 1024 / 1024;
+}
\ No newline at end of file
diff --git a/UI/SemiUrsa/Common.Avalonia/Services/IDownloadService.cs b/UI/SemiUrsaMafia/Common.Avalonia/Services/IDownloadService.cs
similarity index 100%
rename from UI/SemiUrsa/Common.Avalonia/Services/IDownloadService.cs
rename to UI/SemiUrsaMafia/Common.Avalonia/Services/IDownloadService.cs
diff --git a/UI/SemiUrsa/Common.Avalonia/Services/MockDownloadService.cs b/UI/SemiUrsaMafia/Common.Avalonia/Services/MockDownloadService.cs
similarity index 98%
rename from UI/SemiUrsa/Common.Avalonia/Services/MockDownloadService.cs
rename to UI/SemiUrsaMafia/Common.Avalonia/Services/MockDownloadService.cs
index 07d9c83..c88c338 100644
--- a/UI/SemiUrsa/Common.Avalonia/Services/MockDownloadService.cs
+++ b/UI/SemiUrsaMafia/Common.Avalonia/Services/MockDownloadService.cs
@@ -19,7 +19,7 @@ public MockDownloadService()
{
CurrentStatistics = new DownloadStatistics
{
- Version = "11.2.6",
+ Version = "12.1.1",
Speed = 0,
Remaining = TimeSpan.Zero,
TotalBytesToReceive = 1024 * 1024 * 10,
diff --git a/UI/SemiUrsa/Common.Avalonia/Themes/Controls/ToggleSwitch.axaml b/UI/SemiUrsaMafia/Common.Avalonia/Themes/Controls/ToggleSwitch.axaml
similarity index 100%
rename from UI/SemiUrsa/Common.Avalonia/Themes/Controls/ToggleSwitch.axaml
rename to UI/SemiUrsaMafia/Common.Avalonia/Themes/Controls/ToggleSwitch.axaml
diff --git a/UI/SemiUrsa/Common.Avalonia/Themes/Controls/_index.axaml b/UI/SemiUrsaMafia/Common.Avalonia/Themes/Controls/_index.axaml
similarity index 100%
rename from UI/SemiUrsa/Common.Avalonia/Themes/Controls/_index.axaml
rename to UI/SemiUrsaMafia/Common.Avalonia/Themes/Controls/_index.axaml
diff --git a/UI/SemiUrsa/Directory.Packages.props b/UI/SemiUrsaMafia/Directory.Packages.props
similarity index 53%
rename from UI/SemiUrsa/Directory.Packages.props
rename to UI/SemiUrsaMafia/Directory.Packages.props
index 7efba84..be87510 100644
--- a/UI/SemiUrsa/Directory.Packages.props
+++ b/UI/SemiUrsaMafia/Directory.Packages.props
@@ -1,19 +1,20 @@
true
- 11.2.6
+ 12.1.1
-
+
-
-
-
-
+
+
+
+
+
-
-
+
+
\ No newline at end of file
diff --git a/UI/SemiUrsaMafia/Mobile.Avalonia/App.axaml b/UI/SemiUrsaMafia/Mobile.Avalonia/App.axaml
new file mode 100644
index 0000000..5d8f021
--- /dev/null
+++ b/UI/SemiUrsaMafia/Mobile.Avalonia/App.axaml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/UI/SemiUrsaMafia/Mobile.Avalonia/App.axaml.cs b/UI/SemiUrsaMafia/Mobile.Avalonia/App.axaml.cs
new file mode 100644
index 0000000..3b906cd
--- /dev/null
+++ b/UI/SemiUrsaMafia/Mobile.Avalonia/App.axaml.cs
@@ -0,0 +1,24 @@
+using Avalonia;
+using Avalonia.Controls.ApplicationLifetimes;
+using Avalonia.Markup.Xaml;
+using Sandbox.Views;
+
+namespace Sandbox;
+
+public partial class App : Application
+{
+ public override void Initialize()
+ {
+ AvaloniaXamlLoader.Load(this);
+ }
+
+ public override void OnFrameworkInitializationCompleted()
+ {
+ if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
+ {
+ desktop.MainWindow = new MainWindow();
+ }
+
+ base.OnFrameworkInitializationCompleted();
+ }
+}
\ No newline at end of file
diff --git a/UI/SemiUrsaMafia/Mobile.Avalonia/Mobile.Avalonia.csproj b/UI/SemiUrsaMafia/Mobile.Avalonia/Mobile.Avalonia.csproj
new file mode 100644
index 0000000..4164a51
--- /dev/null
+++ b/UI/SemiUrsaMafia/Mobile.Avalonia/Mobile.Avalonia.csproj
@@ -0,0 +1,22 @@
+
+
+ WinExe
+ net10.0
+ enable
+ app.manifest
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/UI/SemiUrsaMafia/Mobile.Avalonia/Program.cs b/UI/SemiUrsaMafia/Mobile.Avalonia/Program.cs
new file mode 100644
index 0000000..3026e03
--- /dev/null
+++ b/UI/SemiUrsaMafia/Mobile.Avalonia/Program.cs
@@ -0,0 +1,23 @@
+using Avalonia;
+using System;
+
+namespace Sandbox;
+
+sealed class Program
+{
+ // Initialization code. Don't use any Avalonia, third-party APIs or any
+ // SynchronizationContext-reliant code before AppMain is called: things aren't initialized
+ // yet and stuff might break.
+ [STAThread]
+ public static void Main(string[] args) => BuildAvaloniaApp()
+ .StartWithClassicDesktopLifetime(args);
+
+ // Avalonia configuration, don't remove; also used by visual designer.
+ public static AppBuilder BuildAvaloniaApp()
+ => AppBuilder.Configure()
+ .UsePlatformDetect()
+#if DEBUG
+ .WithDeveloperTools()
+#endif
+ .LogToTrace();
+}
diff --git a/UI/SemiUrsaMafia/Mobile.Avalonia/ViewModels/SettingsPageViewModel.cs b/UI/SemiUrsaMafia/Mobile.Avalonia/ViewModels/SettingsPageViewModel.cs
new file mode 100644
index 0000000..e37119f
--- /dev/null
+++ b/UI/SemiUrsaMafia/Mobile.Avalonia/ViewModels/SettingsPageViewModel.cs
@@ -0,0 +1,102 @@
+using System.Collections.ObjectModel;
+using Avalonia;
+using Avalonia.Styling;
+using Common.Avalonia.Models;
+using Common.Avalonia.Services;
+using CommunityToolkit.Mvvm.ComponentModel;
+using CommunityToolkit.Mvvm.Input;
+
+namespace Sandbox.ViewModels;
+
+public partial class SettingsPageViewModel : ViewModelBase
+{
+ private readonly IDownloadService _downloadService;
+
+ public ObservableCollection ThemeOptions { get; } = ["浅色", "深色", "跟随系统"];
+
+ public string CurrentVersion => "12.1.0";
+
+ [ObservableProperty] public partial int SelectedThemeIndex { get; set; } = GetInitialThemeIndex();
+
+ [ObservableProperty] public partial bool IsCheckUpdatePopupOpen { get; set; }
+
+ [ObservableProperty] public partial bool IsDownloadPopupOpen { get; set; }
+
+ [ObservableProperty] public partial bool IsInstallPopupOpen { get; set; }
+
+ [ObservableProperty] public partial DownloadStatistics Statistics { get; set; }
+
+ public SettingsPageViewModel(IDownloadService downloadService)
+ {
+ _downloadService = downloadService;
+
+ _downloadService.ProgressChanged += stats => Statistics = stats;
+ _downloadService.StatusChanged += status =>
+ {
+ if (status == DownloadStatus.Completed)
+ OnDownloadCompleted();
+ };
+
+ Statistics = _downloadService.CurrentStatistics;
+ }
+
+ partial void OnSelectedThemeIndexChanged(int value)
+ {
+ var app = Application.Current;
+
+ app?.RequestedThemeVariant = value switch
+ {
+ 0 => ThemeVariant.Light,
+ 1 => ThemeVariant.Dark,
+ _ => ThemeVariant.Default,
+ };
+ }
+
+ private static int GetInitialThemeIndex()
+ {
+ var variant = Application.Current?.RequestedThemeVariant;
+ if (variant == ThemeVariant.Light) return 0;
+ if (variant == ThemeVariant.Dark) return 1;
+ return 2;
+ }
+
+ private void OnDownloadCompleted()
+ {
+ IsDownloadPopupOpen = false;
+ IsInstallPopupOpen = true;
+ }
+
+ [RelayCommand]
+ private void CheckUpdate()
+ {
+ IsCheckUpdatePopupOpen = true;
+ }
+
+ [RelayCommand]
+ private void ConfirmUpdate()
+ {
+ IsCheckUpdatePopupOpen = false;
+ IsDownloadPopupOpen = true;
+ _downloadService.Restart();
+ }
+
+ [RelayCommand]
+ private void CancelUpdate()
+ {
+ _downloadService.Stop();
+ IsCheckUpdatePopupOpen = false;
+ IsDownloadPopupOpen = false;
+ }
+
+ [RelayCommand]
+ private void InstallConfirm()
+ {
+ IsInstallPopupOpen = false;
+ }
+
+ [RelayCommand]
+ private void InstallCancel()
+ {
+ IsInstallPopupOpen = false;
+ }
+}
\ No newline at end of file
diff --git a/UI/SemiUrsaMafia/Mobile.Avalonia/ViewModels/ViewModelBase.cs b/UI/SemiUrsaMafia/Mobile.Avalonia/ViewModels/ViewModelBase.cs
new file mode 100644
index 0000000..d35d485
--- /dev/null
+++ b/UI/SemiUrsaMafia/Mobile.Avalonia/ViewModels/ViewModelBase.cs
@@ -0,0 +1,7 @@
+using CommunityToolkit.Mvvm.ComponentModel;
+
+namespace Sandbox.ViewModels;
+
+public abstract class ViewModelBase : ObservableObject
+{
+}
diff --git a/UI/SemiUrsaMafia/Mobile.Avalonia/Views/MainView.axaml b/UI/SemiUrsaMafia/Mobile.Avalonia/Views/MainView.axaml
new file mode 100644
index 0000000..964c01c
--- /dev/null
+++ b/UI/SemiUrsaMafia/Mobile.Avalonia/Views/MainView.axaml
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/UI/SemiUrsaMafia/Mobile.Avalonia/Views/MainView.axaml.cs b/UI/SemiUrsaMafia/Mobile.Avalonia/Views/MainView.axaml.cs
new file mode 100644
index 0000000..e97846d
--- /dev/null
+++ b/UI/SemiUrsaMafia/Mobile.Avalonia/Views/MainView.axaml.cs
@@ -0,0 +1,15 @@
+using Avalonia.Controls;
+using Common.Avalonia.Services;
+using Sandbox.ViewModels;
+
+namespace Sandbox.Views;
+
+public partial class MainView : UserControl
+{
+ public MainView()
+ {
+ InitializeComponent();
+
+ SettingsPageContent.DataContext = new SettingsPageViewModel(new MockDownloadService());
+ }
+}
\ No newline at end of file
diff --git a/UI/SemiUrsaMafia/Mobile.Avalonia/Views/MainWindow.axaml b/UI/SemiUrsaMafia/Mobile.Avalonia/Views/MainWindow.axaml
new file mode 100644
index 0000000..a49d292
--- /dev/null
+++ b/UI/SemiUrsaMafia/Mobile.Avalonia/Views/MainWindow.axaml
@@ -0,0 +1,14 @@
+
+
+
\ No newline at end of file
diff --git a/UI/SemiUrsaMafia/Mobile.Avalonia/Views/MainWindow.axaml.cs b/UI/SemiUrsaMafia/Mobile.Avalonia/Views/MainWindow.axaml.cs
new file mode 100644
index 0000000..d880a6a
--- /dev/null
+++ b/UI/SemiUrsaMafia/Mobile.Avalonia/Views/MainWindow.axaml.cs
@@ -0,0 +1,11 @@
+using Avalonia.Controls;
+
+namespace Sandbox.Views;
+
+public partial class MainWindow : Window
+{
+ public MainWindow()
+ {
+ InitializeComponent();
+ }
+}
diff --git a/UI/SemiUrsaMafia/Mobile.Avalonia/Views/Pages/HomePageView.axaml b/UI/SemiUrsaMafia/Mobile.Avalonia/Views/Pages/HomePageView.axaml
new file mode 100644
index 0000000..7e2089e
--- /dev/null
+++ b/UI/SemiUrsaMafia/Mobile.Avalonia/Views/Pages/HomePageView.axaml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/UI/SemiUrsaMafia/Mobile.Avalonia/Views/Pages/HomePageView.axaml.cs b/UI/SemiUrsaMafia/Mobile.Avalonia/Views/Pages/HomePageView.axaml.cs
new file mode 100644
index 0000000..2ef6203
--- /dev/null
+++ b/UI/SemiUrsaMafia/Mobile.Avalonia/Views/Pages/HomePageView.axaml.cs
@@ -0,0 +1,11 @@
+using Avalonia.Controls;
+
+namespace Sandbox.Views.Pages;
+
+public partial class HomePageView : UserControl
+{
+ public HomePageView()
+ {
+ InitializeComponent();
+ }
+}
diff --git a/UI/SemiUrsaMafia/Mobile.Avalonia/Views/Pages/SettingsPageView.axaml b/UI/SemiUrsaMafia/Mobile.Avalonia/Views/Pages/SettingsPageView.axaml
new file mode 100644
index 0000000..e317858
--- /dev/null
+++ b/UI/SemiUrsaMafia/Mobile.Avalonia/Views/Pages/SettingsPageView.axaml
@@ -0,0 +1,160 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/UI/SemiUrsaMafia/Mobile.Avalonia/Views/Pages/SettingsPageView.axaml.cs b/UI/SemiUrsaMafia/Mobile.Avalonia/Views/Pages/SettingsPageView.axaml.cs
new file mode 100644
index 0000000..244ec2a
--- /dev/null
+++ b/UI/SemiUrsaMafia/Mobile.Avalonia/Views/Pages/SettingsPageView.axaml.cs
@@ -0,0 +1,11 @@
+using Avalonia.Controls;
+
+namespace Sandbox.Views.Pages;
+
+public partial class SettingsPageView : UserControl
+{
+ public SettingsPageView()
+ {
+ InitializeComponent();
+ }
+}
diff --git a/UI/SemiUrsaMafia/Mobile.Avalonia/app.manifest b/UI/SemiUrsaMafia/Mobile.Avalonia/app.manifest
new file mode 100644
index 0000000..e3ab431
--- /dev/null
+++ b/UI/SemiUrsaMafia/Mobile.Avalonia/app.manifest
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/UI/SemiUrsaMafia/Upgrade.Avalonia.slnx b/UI/SemiUrsaMafia/Upgrade.Avalonia.slnx
new file mode 100644
index 0000000..b4fa48e
--- /dev/null
+++ b/UI/SemiUrsaMafia/Upgrade.Avalonia.slnx
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/UI/SemiUrsa/Upgrade.Avalonia/App.axaml b/UI/SemiUrsaMafia/Upgrade.Avalonia/App.axaml
similarity index 82%
rename from UI/SemiUrsa/Upgrade.Avalonia/App.axaml
rename to UI/SemiUrsaMafia/Upgrade.Avalonia/App.axaml
index 7be413f..7452c96 100644
--- a/UI/SemiUrsa/Upgrade.Avalonia/App.axaml
+++ b/UI/SemiUrsaMafia/Upgrade.Avalonia/App.axaml
@@ -2,15 +2,14 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="Upgrade.Avalonia.App"
xmlns:local="using:Upgrade.Avalonia"
- xmlns:semi="https://irihi.tech/semi"
- xmlns:u-semi="https://irihi.tech/ursa/themes/semi">
+ xmlns:semi="https://irihi.tech/semi">
-
+
diff --git a/UI/SemiUrsa/Upgrade.Avalonia/App.axaml.cs b/UI/SemiUrsaMafia/Upgrade.Avalonia/App.axaml.cs
similarity index 57%
rename from UI/SemiUrsa/Upgrade.Avalonia/App.axaml.cs
rename to UI/SemiUrsaMafia/Upgrade.Avalonia/App.axaml.cs
index 024c17a..bc30c24 100644
--- a/UI/SemiUrsa/Upgrade.Avalonia/App.axaml.cs
+++ b/UI/SemiUrsaMafia/Upgrade.Avalonia/App.axaml.cs
@@ -1,8 +1,5 @@
-using System;
-using System.Linq;
using Avalonia;
using Avalonia.Controls.ApplicationLifetimes;
-using Avalonia.Data.Core.Plugins;
using Avalonia.Markup.Xaml;
using Common.Avalonia.Services;
using Microsoft.Extensions.DependencyInjection;
@@ -29,25 +26,9 @@ public override void OnFrameworkInitializationCompleted()
if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
{
- // Avoid duplicate validations from both Avalonia and the CommunityToolkit.
- // More info: https://docs.avaloniaui.net/docs/guides/development-guides/data-validation#manage-validationplugins
- DisableAvaloniaDataAnnotationValidation();
desktop.MainWindow = new MainWindow();
}
base.OnFrameworkInitializationCompleted();
}
-
- private void DisableAvaloniaDataAnnotationValidation()
- {
- // Get an array of plugins to remove
- var dataValidationPluginsToRemove =
- BindingPlugins.DataValidators.OfType().ToArray();
-
- // remove each entry found
- foreach (var plugin in dataValidationPluginsToRemove)
- {
- BindingPlugins.DataValidators.Remove(plugin);
- }
- }
}
\ No newline at end of file
diff --git a/UI/SemiUrsa/Upgrade.Avalonia/Program.cs b/UI/SemiUrsaMafia/Upgrade.Avalonia/Program.cs
similarity index 100%
rename from UI/SemiUrsa/Upgrade.Avalonia/Program.cs
rename to UI/SemiUrsaMafia/Upgrade.Avalonia/Program.cs
diff --git a/UI/SemiUrsa/Upgrade.Avalonia/Upgrade.Avalonia.csproj b/UI/SemiUrsaMafia/Upgrade.Avalonia/Upgrade.Avalonia.csproj
similarity index 93%
rename from UI/SemiUrsa/Upgrade.Avalonia/Upgrade.Avalonia.csproj
rename to UI/SemiUrsaMafia/Upgrade.Avalonia/Upgrade.Avalonia.csproj
index f37c4fd..c50a1ea 100644
--- a/UI/SemiUrsa/Upgrade.Avalonia/Upgrade.Avalonia.csproj
+++ b/UI/SemiUrsaMafia/Upgrade.Avalonia/Upgrade.Avalonia.csproj
@@ -13,6 +13,7 @@
+
diff --git a/UI/SemiUrsa/Upgrade.Avalonia/ViewLocator.cs b/UI/SemiUrsaMafia/Upgrade.Avalonia/ViewLocator.cs
similarity index 100%
rename from UI/SemiUrsa/Upgrade.Avalonia/ViewLocator.cs
rename to UI/SemiUrsaMafia/Upgrade.Avalonia/ViewLocator.cs
diff --git a/UI/SemiUrsa/Upgrade.Avalonia/ViewModels/MainViewViewModel.cs b/UI/SemiUrsaMafia/Upgrade.Avalonia/ViewModels/MainViewViewModel.cs
similarity index 90%
rename from UI/SemiUrsa/Upgrade.Avalonia/ViewModels/MainViewViewModel.cs
rename to UI/SemiUrsaMafia/Upgrade.Avalonia/ViewModels/MainViewViewModel.cs
index c0e4a14..d6d3dae 100644
--- a/UI/SemiUrsa/Upgrade.Avalonia/ViewModels/MainViewViewModel.cs
+++ b/UI/SemiUrsaMafia/Upgrade.Avalonia/ViewModels/MainViewViewModel.cs
@@ -15,10 +15,11 @@ public partial class MainViewViewModel : ViewModelBase
private readonly IDownloadService _downloadService;
private readonly WindowToastManager _notificationManager;
- [ObservableProperty] private DownloadStatistics _statistics;
+ [ObservableProperty] public partial DownloadStatistics Statistics { get; set; }
- [ObservableProperty] [NotifyCanExecuteChangedFor(nameof(StartCommand), nameof(StopCommand))]
- private DownloadStatus _status;
+ [ObservableProperty]
+ [NotifyCanExecuteChangedFor(nameof(StartCommand), nameof(StopCommand))]
+ public partial DownloadStatus Status { get; set; }
public MainViewViewModel(IDownloadService downloadService)
{
diff --git a/UI/SemiUrsa/Upgrade.Avalonia/ViewModels/MainWindowViewModel.cs b/UI/SemiUrsaMafia/Upgrade.Avalonia/ViewModels/MainWindowViewModel.cs
similarity index 100%
rename from UI/SemiUrsa/Upgrade.Avalonia/ViewModels/MainWindowViewModel.cs
rename to UI/SemiUrsaMafia/Upgrade.Avalonia/ViewModels/MainWindowViewModel.cs
diff --git a/UI/SemiUrsa/Upgrade.Avalonia/ViewModels/ViewModelBase.cs b/UI/SemiUrsaMafia/Upgrade.Avalonia/ViewModels/ViewModelBase.cs
similarity index 100%
rename from UI/SemiUrsa/Upgrade.Avalonia/ViewModels/ViewModelBase.cs
rename to UI/SemiUrsaMafia/Upgrade.Avalonia/ViewModels/ViewModelBase.cs
diff --git a/UI/SemiUrsa/Upgrade.Avalonia/Views/MainView.axaml b/UI/SemiUrsaMafia/Upgrade.Avalonia/Views/MainView.axaml
similarity index 98%
rename from UI/SemiUrsa/Upgrade.Avalonia/Views/MainView.axaml
rename to UI/SemiUrsaMafia/Upgrade.Avalonia/Views/MainView.axaml
index ac124d4..3d8baa8 100644
--- a/UI/SemiUrsa/Upgrade.Avalonia/Views/MainView.axaml
+++ b/UI/SemiUrsaMafia/Upgrade.Avalonia/Views/MainView.axaml
@@ -42,7 +42,7 @@
Height="150"
Opacity="{Binding Statistics.ProgressPercentage,
Converter={x:Static cvt:ProgressConverter.ProgressToOpacityConverter}}"
- Source="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/Assets/GeneralUpdate.png">
+ Source="avares://Common.Avalonia/Assets/GeneralUpdate.png">