Sfoglia il codice sorgente

fixed view init on android, tested image scaling and html text panels

Veloe 1 anno fa
parent
commit
591f4dd491
15 ha cambiato i file con 182 aggiunte e 133 eliminazioni
  1. 2 2
      VeloeAvaloniaKemonoPartyApp/VeloeAvaloniaKemonoPartyApp.Android/VeloeAvaloniaKemonoPartyApp.Android.csproj
  2. 2 2
      VeloeAvaloniaKemonoPartyApp/VeloeAvaloniaKemonoPartyApp.Browser/VeloeAvaloniaKemonoPartyApp.Browser.csproj
  3. 2 2
      VeloeAvaloniaKemonoPartyApp/VeloeAvaloniaKemonoPartyApp.Desktop/VeloeAvaloniaKemonoPartyApp.Desktop.csproj
  4. 2 2
      VeloeAvaloniaKemonoPartyApp/VeloeAvaloniaKemonoPartyApp.iOS/VeloeAvaloniaKemonoPartyApp.iOS.csproj
  5. 2 2
      VeloeAvaloniaKemonoPartyApp/VeloeAvaloniaKemonoPartyApp/App.axaml.cs
  6. 3 2
      VeloeAvaloniaKemonoPartyApp/VeloeAvaloniaKemonoPartyApp/VeloeAvaloniaKemonoPartyApp.csproj
  7. 100 0
      VeloeAvaloniaKemonoPartyApp/VeloeAvaloniaKemonoPartyApp/ViewModels/CreatorsViewModel.cs
  8. 18 69
      VeloeAvaloniaKemonoPartyApp/VeloeAvaloniaKemonoPartyApp/ViewModels/MainViewModel.cs
  9. 1 26
      VeloeAvaloniaKemonoPartyApp/VeloeAvaloniaKemonoPartyApp/ViewModels/MainWindowViewModel.cs
  10. 3 1
      VeloeAvaloniaKemonoPartyApp/VeloeAvaloniaKemonoPartyApp/ViewModels/PostViewModel.cs
  11. 29 0
      VeloeAvaloniaKemonoPartyApp/VeloeAvaloniaKemonoPartyApp/Views/CreatorsView.axaml
  12. 13 0
      VeloeAvaloniaKemonoPartyApp/VeloeAvaloniaKemonoPartyApp/Views/CreatorsView.axaml.cs
  13. 1 21
      VeloeAvaloniaKemonoPartyApp/VeloeAvaloniaKemonoPartyApp/Views/MainView.axaml
  14. 2 3
      VeloeAvaloniaKemonoPartyApp/VeloeAvaloniaKemonoPartyApp/Views/MainWindow.axaml
  15. 2 1
      VeloeAvaloniaKemonoPartyApp/VeloeAvaloniaKemonoPartyApp/Views/PostView.axaml

+ 2 - 2
VeloeAvaloniaKemonoPartyApp/VeloeAvaloniaKemonoPartyApp.Android/VeloeAvaloniaKemonoPartyApp.Android.csproj

@@ -9,8 +9,8 @@
     <ApplicationDisplayVersion>1.0</ApplicationDisplayVersion>
     <AndroidPackageFormat>apk</AndroidPackageFormat>
     <AndroidEnableProfiledAot>False</AndroidEnableProfiledAot>
-    <AssemblyVersion>1.0.0.10</AssemblyVersion>
-    <FileVersion>1.0.0.10</FileVersion>
+    <AssemblyVersion>1.0.0.29</AssemblyVersion>
+    <FileVersion>1.0.0.29</FileVersion>
   </PropertyGroup>
 
   <ItemGroup>

+ 2 - 2
VeloeAvaloniaKemonoPartyApp/VeloeAvaloniaKemonoPartyApp.Browser/VeloeAvaloniaKemonoPartyApp.Browser.csproj

@@ -4,8 +4,8 @@
     <RuntimeIdentifier>browser-wasm</RuntimeIdentifier>
     <WasmMainJSPath>AppBundle\main.js</WasmMainJSPath>
     <OutputType>Exe</OutputType>
-    <AssemblyVersion>1.0.0.3</AssemblyVersion>
-    <FileVersion>1.0.0.3</FileVersion>
+    <AssemblyVersion>1.0.0.5</AssemblyVersion>
+    <FileVersion>1.0.0.5</FileVersion>
   </PropertyGroup>
 
   <ItemGroup>

+ 2 - 2
VeloeAvaloniaKemonoPartyApp/VeloeAvaloniaKemonoPartyApp.Desktop/VeloeAvaloniaKemonoPartyApp.Desktop.csproj

@@ -10,8 +10,8 @@
 
   <PropertyGroup>
     <ApplicationManifest>app.manifest</ApplicationManifest>
-    <AssemblyVersion>1.0.0.3</AssemblyVersion>
-    <FileVersion>1.0.0.3</FileVersion>
+    <AssemblyVersion>1.0.0.11</AssemblyVersion>
+    <FileVersion>1.0.0.11</FileVersion>
   </PropertyGroup>
 
   <ItemGroup>

+ 2 - 2
VeloeAvaloniaKemonoPartyApp/VeloeAvaloniaKemonoPartyApp.iOS/VeloeAvaloniaKemonoPartyApp.iOS.csproj

@@ -4,8 +4,8 @@
     <TargetFramework>net7.0-ios</TargetFramework>
     <SupportedOSPlatformVersion>13.0</SupportedOSPlatformVersion>
     <Nullable>enable</Nullable>
-    <AssemblyVersion>1.0.0.3</AssemblyVersion>
-    <FileVersion>1.0.0.3</FileVersion>
+    <AssemblyVersion>1.0.0.5</AssemblyVersion>
+    <FileVersion>1.0.0.5</FileVersion>
   </PropertyGroup>
 
   <ItemGroup>

+ 2 - 2
VeloeAvaloniaKemonoPartyApp/VeloeAvaloniaKemonoPartyApp/App.axaml.cs

@@ -19,14 +19,14 @@ namespace VeloeAvaloniaKemonoPartyApp
             {
                 desktop.MainWindow = new MainWindow
                 {
-                    DataContext = new MainWindowViewModel()
+                    DataContext = new MainViewModel()
                 };
             }
             else if (ApplicationLifetime is ISingleViewApplicationLifetime singleViewPlatform)
             {
                 singleViewPlatform.MainView = new MainView
                 {
-                    DataContext = new MainWindowViewModel()
+                    DataContext = new MainViewModel()
                 };
             }
 

+ 3 - 2
VeloeAvaloniaKemonoPartyApp/VeloeAvaloniaKemonoPartyApp/VeloeAvaloniaKemonoPartyApp.csproj

@@ -4,8 +4,8 @@
     <Nullable>enable</Nullable>
     <LangVersion>latest</LangVersion>
     <AvaloniaUseCompiledBindingsByDefault>true</AvaloniaUseCompiledBindingsByDefault>
-    <AssemblyVersion>1.0.0.6</AssemblyVersion>
-    <FileVersion>1.0.0.6</FileVersion>
+    <AssemblyVersion>1.0.0.30</AssemblyVersion>
+    <FileVersion>1.0.0.30</FileVersion>
   </PropertyGroup>
 
   
@@ -17,6 +17,7 @@
     <PackageReference Include="AsyncImageLoader.Avalonia" Version="3.2.1" />
     <PackageReference Include="Avalonia" Version="11.0.6" />
     <PackageReference Include="Avalonia.Controls.TreeDataGrid" Version="11.0.2" />
+    <PackageReference Include="Avalonia.HtmlRenderer" Version="11.0.0" />
     <PackageReference Include="Avalonia.Themes.Fluent" Version="11.0.6" />
     <PackageReference Include="Avalonia.Fonts.Inter" Version="11.0.6" />
     <PackageReference Include="Avalonia.ReactiveUI" Version="11.0.6" />

+ 100 - 0
VeloeAvaloniaKemonoPartyApp/VeloeAvaloniaKemonoPartyApp/ViewModels/CreatorsViewModel.cs

@@ -0,0 +1,100 @@
+using Avalonia.Controls.ApplicationLifetimes;
+using DynamicData.Binding;
+using ReactiveUI;
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Linq;
+using System.Reactive.Linq;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+using VeloeAvaloniaKemonoPartyApp.Models;
+
+namespace VeloeAvaloniaKemonoPartyApp.ViewModels
+{
+    public class CreatorsViewModel : ViewModelBase
+    {
+        private CancellationTokenSource? _cancellationTokenSource;
+
+        public CreatorsViewModel()
+        {
+            /*
+            BuyMusicCommand = ReactiveCommand.Create(() =>
+            {
+                return SelectedAlbum;
+            });*/
+
+            this.WhenAnyValue(x => x.SearchText)
+                .Throttle(TimeSpan.FromMilliseconds(400))
+                .ObserveOn(RxApp.MainThreadScheduler)
+                .Subscribe(DoSearch!);
+        }
+
+        private string _searchText = string.Empty;
+        private bool _isBusy = false;
+
+        public string SearchText
+        {
+            get => _searchText;
+            set => this.RaiseAndSetIfChanged(ref _searchText, value);
+        }
+
+        public bool IsBusy
+        {
+            get => _isBusy;
+            set => this.RaiseAndSetIfChanged(ref _isBusy, value);
+        }
+
+        private CreatorViewModel _selectedAlbum;
+
+        public ObservableCollection<CreatorViewModel> SearchResults { get; } = new();
+
+        public CreatorViewModel? SelectedAlbum
+        {
+            get => _selectedAlbum;
+            set => this.RaiseAndSetIfChanged(ref _selectedAlbum, value);
+        }
+
+        private async void DoSearch(string s)
+        {
+            _cancellationTokenSource?.Cancel();
+            _cancellationTokenSource = new CancellationTokenSource();
+            var cancellationToken = _cancellationTokenSource.Token;
+
+            IsBusy = true;
+            SearchResults.Clear();
+
+            if (!string.IsNullOrWhiteSpace(s))
+            {
+                var creators = await Creator.SearchAsync(s);
+
+                foreach (var creator in creators)
+                {
+                    var vm = new CreatorViewModel(creator);
+                    SearchResults.Add(vm);
+                }
+
+                if (!cancellationToken.IsCancellationRequested)
+                {
+                    LoadAvatars(cancellationToken);
+                }
+            }
+
+            IsBusy = false;
+        }
+
+        private async void LoadAvatars(CancellationToken cancellationToken)
+        {
+            foreach (var creator in SearchResults.ToList())
+            {
+                await creator.LoadAvatar();
+
+                if (cancellationToken.IsCancellationRequested)
+                {
+                    return;
+                }
+            }
+        }
+    }
+}

+ 18 - 69
VeloeAvaloniaKemonoPartyApp/VeloeAvaloniaKemonoPartyApp/ViewModels/MainViewModel.cs

@@ -1,4 +1,7 @@
-using Avalonia.Controls;
+using Avalonia;
+using Avalonia.Controls;
+using Avalonia.Controls.ApplicationLifetimes;
+using DynamicData.Binding;
 using ReactiveUI;
 using System;
 using System.Collections.Generic;
@@ -10,93 +13,39 @@ using System.Text;
 using System.Threading;
 using System.Threading.Tasks;
 using VeloeAvaloniaKemonoPartyApp.Models;
+using VeloeAvaloniaKemonoPartyApp.Views;
 
 namespace VeloeAvaloniaKemonoPartyApp.ViewModels
 {
     public class MainViewModel : ViewModelBase
     {
-        private CancellationTokenSource? _cancellationTokenSource;
+
+        private ViewModelBase _contentViewModel;
 
         public MainViewModel()
         {
-            /*
-            BuyMusicCommand = ReactiveCommand.Create(() =>
-            {
-                return SelectedAlbum;
-            });*/
+            ActualMainViewModel = new CreatorsViewModel();
+            _contentViewModel = ActualMainViewModel;
 
-            this.WhenAnyValue(x => x.SearchText)
-                .Throttle(TimeSpan.FromMilliseconds(400))
-                .ObserveOn(RxApp.MainThreadScheduler)
-                .Subscribe(DoSearch!);
+            ActualMainViewModel.WhenAnyValue(x => x.SelectedAlbum).Subscribe(AddItem!);
         }
 
-        private string _searchText = string.Empty;
-        private bool _isBusy = false;
+        public CreatorsViewModel ActualMainViewModel { get; }
 
-        public string SearchText
+        public ViewModelBase ContentViewModel
         {
-            get => _searchText;
-            set => this.RaiseAndSetIfChanged(ref _searchText, value);
+            get => _contentViewModel;
+            private set => this.RaiseAndSetIfChanged(ref _contentViewModel, value);
         }
 
-        public bool IsBusy
+        public void AddItem(CreatorViewModel creatorViewModel)
         {
-            get => _isBusy;
-            set => this.RaiseAndSetIfChanged(ref _isBusy, value);
-        }
-
-        private CreatorViewModel _selectedAlbum;
+            if (creatorViewModel == null) return;
 
-        public ObservableCollection<CreatorViewModel> SearchResults { get; } = new();
+            Debug.WriteLine("Call new view");
 
-        public CreatorViewModel? SelectedAlbum
-        {
-            get => _selectedAlbum;
-            set => this.RaiseAndSetIfChanged(ref _selectedAlbum, value);
+            ContentViewModel = new CreatorPostsViewModel(creatorViewModel.Creator);
         }
 
-        private async void DoSearch(string s)
-        {
-            _cancellationTokenSource?.Cancel();
-            _cancellationTokenSource = new CancellationTokenSource();
-            var cancellationToken = _cancellationTokenSource.Token;
-
-          IsBusy = true;
-            SearchResults.Clear();
-
-            if (!string.IsNullOrWhiteSpace(s))
-            {
-                var creators = await Creator.SearchAsync(s);
-
-                foreach (var creator in creators)
-                {
-                    var vm = new CreatorViewModel(creator);
-                    SearchResults.Add(vm);
-                }
-
-                if (!cancellationToken.IsCancellationRequested)
-                {
-                    LoadAvatars(cancellationToken);
-                }
-            }
-
-            IsBusy = false;
-        }
-
-        private async void LoadAvatars(CancellationToken cancellationToken)
-        {
-            foreach (var creator in SearchResults.ToList())
-            {
-                await creator.LoadAvatar();
-
-                if (cancellationToken.IsCancellationRequested)
-                {
-                    return;
-                }
-            }
-        }
-
-
     }
 }

+ 1 - 26
VeloeAvaloniaKemonoPartyApp/VeloeAvaloniaKemonoPartyApp/ViewModels/MainWindowViewModel.cs

@@ -12,31 +12,6 @@ namespace VeloeAvaloniaKemonoPartyApp.ViewModels
 {
     public class MainWindowViewModel : ViewModelBase
     {
-        private ViewModelBase _contentViewModel;
-
-        public MainWindowViewModel()
-        {
-            ActualMainViewModel = new MainViewModel();
-            _contentViewModel = ActualMainViewModel;
-
-            ActualMainViewModel.WhenAnyValue(x => x.SelectedAlbum).Subscribe(AddItem!);
-        }
-
-        public MainViewModel ActualMainViewModel { get; }
-
-        public ViewModelBase ContentViewModel
-        {
-            get => _contentViewModel;
-            private set => this.RaiseAndSetIfChanged(ref _contentViewModel, value);
-        }
-
-        public void AddItem(CreatorViewModel creatorViewModel)
-        {
-            if (creatorViewModel == null) return;
-
-            Debug.WriteLine("Call new view");
-
-            ContentViewModel = new CreatorPostsViewModel(creatorViewModel.Creator);
-        }
+        
     }
 }

+ 3 - 1
VeloeAvaloniaKemonoPartyApp/VeloeAvaloniaKemonoPartyApp/ViewModels/PostViewModel.cs

@@ -1,4 +1,5 @@
-using Avalonia.Media.Imaging;
+using Avalonia.Controls.ApplicationLifetimes;
+using Avalonia.Media.Imaging;
 using ReactiveUI;
 using System;
 using System.Collections.Generic;
@@ -42,6 +43,7 @@ namespace VeloeAvaloniaKemonoPartyApp.ViewModels
                     try
                     {
                         bitmap = new Bitmap(imageStream);
+                        bitmap = bitmap.CreateScaledBitmap(new Avalonia.PixelSize(bitmap.PixelSize.Width / 2, bitmap.PixelSize.Height / 2));
                     }
                     catch (Exception ex)
                     {

+ 29 - 0
VeloeAvaloniaKemonoPartyApp/VeloeAvaloniaKemonoPartyApp/Views/CreatorsView.axaml

@@ -0,0 +1,29 @@
+<UserControl xmlns="https://github.com/avaloniaui"
+             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+			 xmlns:m="using:VeloeAvaloniaKemonoPartyApp.Models"
+			 xmlns:vm="clr-namespace:VeloeAvaloniaKemonoPartyApp.ViewModels"
+             mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
+             x:Class="VeloeAvaloniaKemonoPartyApp.Views.CreatorsView"
+			 x:DataType="vm:CreatorsViewModel">
+	<Design.DataContext>
+		<!-- This only sets the DataContext for the previewer in an IDE,
+         to set the actual DataContext for runtime, set the DataContext property in code (look at App.axaml.cs) -->
+		<vm:CreatorsViewModel />
+	</Design.DataContext>
+	<DockPanel>
+		<StackPanel DockPanel.Dock="Top">
+			<TextBox Watermark="Search for creators..." Text="{Binding SearchText}"/>
+			<ProgressBar IsIndeterminate="True" IsVisible="{Binding IsBusy}"/>
+		</StackPanel>
+		<ListBox ItemsSource="{Binding SearchResults}" SelectedItem="{Binding SelectedAlbum}" SelectionMode="Single"
+				 Background="Transparent" Margin="0 20">
+			<ListBox.ItemsPanel>
+				<ItemsPanelTemplate>
+					<WrapPanel />
+				</ItemsPanelTemplate>
+			</ListBox.ItemsPanel>
+		</ListBox>
+	</DockPanel>
+</UserControl>

+ 13 - 0
VeloeAvaloniaKemonoPartyApp/VeloeAvaloniaKemonoPartyApp/Views/CreatorsView.axaml.cs

@@ -0,0 +1,13 @@
+using Avalonia;
+using Avalonia.Controls;
+using Avalonia.Markup.Xaml;
+
+namespace VeloeAvaloniaKemonoPartyApp.Views;
+
+public partial class CreatorsView : UserControl
+{
+    public CreatorsView()
+    {
+        InitializeComponent();
+    }
+}

+ 1 - 21
VeloeAvaloniaKemonoPartyApp/VeloeAvaloniaKemonoPartyApp/Views/MainView.axaml

@@ -4,28 +4,8 @@
              xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
              xmlns:m="using:VeloeAvaloniaKemonoPartyApp.Models"
 			 xmlns:vm="clr-namespace:VeloeAvaloniaKemonoPartyApp.ViewModels"
-			 xmlns:asyncImageLoader="using:AsyncImageLoader"
 			 mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
              x:Class="VeloeAvaloniaKemonoPartyApp.Views.MainView"
              x:DataType="vm:MainViewModel">
-  <Design.DataContext>
-    <!-- This only sets the DataContext for the previewer in an IDE,
-         to set the actual DataContext for runtime, set the DataContext property in code (look at App.axaml.cs) -->
-    <vm:MainViewModel />
-  </Design.DataContext>
-	<DockPanel>
-		<StackPanel DockPanel.Dock="Top">
-			<TextBox Watermark="Search for creators..." Text="{Binding SearchText}"/>
-			<ProgressBar IsIndeterminate="True" IsVisible="{Binding IsBusy}"/>
-		</StackPanel>
-		<ListBox ItemsSource="{Binding SearchResults}" SelectedItem="{Binding SelectedAlbum}" SelectionMode="Single"
-				 Background="Transparent" Margin="0 20">
-			<ListBox.ItemsPanel>
-				<ItemsPanelTemplate>
-					<WrapPanel />
-				</ItemsPanelTemplate>
-			</ListBox.ItemsPanel>
-		</ListBox>
-	</DockPanel>
-  
+	<ContentControl Content="{Binding ContentViewModel}" />
 </UserControl>

+ 2 - 3
VeloeAvaloniaKemonoPartyApp/VeloeAvaloniaKemonoPartyApp/Views/MainWindow.axaml

@@ -8,7 +8,6 @@
         mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
         x:Class="VeloeAvaloniaKemonoPartyApp.Views.MainWindow"
         Icon="/Assets/avalonia-logo.ico"
-        Title="VeloeAvaloniaKemonoPartyApp"
-		x:DataType="vm:MainWindowViewModel"
-		Content="{Binding ContentViewModel}">
+        Title="VeloeAvaloniaKemonoPartyApp">
+	<views:MainView/>
 </Window>

File diff suppressed because it is too large
+ 2 - 1
VeloeAvaloniaKemonoPartyApp/VeloeAvaloniaKemonoPartyApp/Views/PostView.axaml


Some files were not shown because too many files changed in this diff