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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +