Przeglądaj źródła

Avalonia updates

Ruben 1 rok temu
rodzic
commit
f0a7d523fb

+ 0 - 15
src/.gitignore

@@ -452,18 +452,3 @@ $RECYCLE.BIN/
 !.vscode/tasks.json
 !.vscode/launch.json
 !.vscode/extensions.json
-*.code-workspace
-
-# Local History for Visual Studio Code
-.history/
-
-# Windows Installer files from build outputs
-*.cab
-*.msi
-*.msix
-*.msm
-*.msp
-
-*.zip
-*.rar
-*.7z

+ 0 - 1
src/PicView.Avalonia.Win32/App.axaml

@@ -6,7 +6,6 @@
     <!--  "Default" ThemeVariant follows system theme variant. "Dark" or "Light" are other available options.  -->
 
     <Application.Styles>
-        <SimpleTheme />
         <StyleInclude Source="avares://PicView.Avalonia/Themes/Dark/DarkTheme.axaml" />
     </Application.Styles>
 </Application>

+ 2 - 4
src/PicView.Avalonia.Win32/App.axaml.cs

@@ -17,10 +17,8 @@ public partial class App : Application
     {
         if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
         {
-            desktop.MainWindow = new MainWindow
-            {
-                DataContext = new MainViewModel()
-            };
+            var w = desktop.MainWindow = new MainWindow();
+            w.DataContext = new MainViewModel();
         }
 
         base.OnFrameworkInitializationCompleted();

+ 5 - 2
src/PicView.Avalonia.Win32/PicView.Avalonia.Win32.csproj

@@ -10,9 +10,9 @@
     <ApplicationIcon>icon.ico</ApplicationIcon>
   </PropertyGroup>
   <ItemGroup>
-    <Content Include="icon.ico">
+    <AvaloniaResource Include="icon.ico">
       <CopyToOutputDirectory>Never</CopyToOutputDirectory>
-    </Content>
+    </AvaloniaResource>
   </ItemGroup>
 
   <ItemGroup>
@@ -32,5 +32,8 @@
     <Compile Update="Views\MainWindow.axaml.cs">
       <DependentUpon>%(Filename)</DependentUpon>
     </Compile>
+    <Compile Update="Views\WinTitleBar.axaml.cs">
+      <DependentUpon>WinTitleBar.axaml</DependentUpon>
+    </Compile>
   </ItemGroup>
 </Project>

+ 3 - 3
src/PicView.Avalonia.Win32/Views/MainWindow.axaml

@@ -5,19 +5,19 @@
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
     xmlns:views="clr-namespace:PicView.Avalonia.Views;assembly=PicView.Avalonia"
+    xmlns:views1="clr-namespace:PicView.Avalonia.Win32.Views"
     xmlns:win32="clr-namespace:PicView.Avalonia.Win32"
     Title="PicView.Avalonia"
-    MinWidth="400"
     d:DesignHeight="450"
     d:DesignWidth="800"
-    Background="Transparent"
     ExtendClientAreaChromeHints="NoChrome"
     ExtendClientAreaTitleBarHeightHint="32"
     ExtendClientAreaToDecorationsHint="True"
+    Icon="/icon.ico"
     mc:Ignorable="d">
     <Border BorderBrush="{StaticResource MainBorderColor}" BorderThickness="1">
         <DockPanel Background="{StaticResource NoisyTexture}">
-            <win32:TitleBar x:Name="TitleBar" DockPanel.Dock="Top" />
+            <views1:WinTitleBar x:Name="TitleBar" DockPanel.Dock="Top" />
             <views:MainView />
         </DockPanel>
     </Border>

+ 1 - 0
src/PicView.Avalonia.Win32/Views/MainWindow.axaml.cs

@@ -1,4 +1,5 @@
 using Avalonia.Controls;
+using Avalonia.Input;
 
 namespace PicView.Avalonia.Win32.Views;
 

+ 0 - 13
src/PicView.Avalonia.Win32/Views/TitleBar.axaml.cs

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

+ 14 - 15
src/PicView.Avalonia.Win32/Views/TitleBar.axaml → src/PicView.Avalonia.Win32/Views/WinTitleBar.axaml

@@ -1,20 +1,28 @@
 <UserControl
-    x:Class="PicView.Avalonia.Win32.TitleBar"
+    x:Class="PicView.Avalonia.Win32.Views.WinTitleBar"
     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:views="clr-namespace:PicView.Avalonia.Views;assembly=PicView.Avalonia"
+    xmlns:vm="clr-namespace:PicView.Avalonia.ViewModels;assembly=PicView.Avalonia"
     Height="32"
     d:DesignHeight="450"
     d:DesignWidth="800"
     mc:Ignorable="d">
+
+    <Design.DataContext>
+        <vm:MainViewModel />
+    </Design.DataContext>
+
     <Border
         Background="{StaticResource MainButtonBackgroundColor}"
         BorderBrush="{StaticResource MainBorderColor}"
-        BorderThickness="0,1,0,1">
+        BorderThickness="0,1,0,1"
+        PointerPressed="MoveWindow">
         <DockPanel LastChildFill="True">
 
-            <Border BorderBrush="#FF3A3A3A" BorderThickness="0,0,1,0">
+            <Border BorderBrush="{StaticResource MainBorderColor}" BorderThickness="0,0,1,0">
                 <Image
                     Width="30"
                     Height="25"
@@ -86,6 +94,7 @@
                 Background="{StaticResource MainButtonBackgroundColor}"
                 BorderBrush="{StaticResource MainBorderColor}"
                 BorderThickness="0,0,1,0"
+                Command="{Binding ExitCommand}"
                 DockPanel.Dock="Right">
                 <Path
                     Width="12"
@@ -115,6 +124,7 @@
                 Background="{StaticResource MainButtonBackgroundColor}"
                 BorderBrush="{StaticResource MainBorderColor}"
                 BorderThickness="1,0,1,0"
+                Command="{Binding MinimizeCommand}"
                 DockPanel.Dock="Right">
                 <Viewbox Width="12" Height="12">
                     <Path
@@ -123,18 +133,7 @@
                         Stretch="Fill" />
                 </Viewbox>
             </Button>
-
-            <TextBlock
-                Height="30"
-                Padding="3,7,3,5"
-                VerticalAlignment="Center"
-                Background="{StaticResource SecondaryBackgroundColor}"
-                FontSize="13"
-                FontWeight="Medium"
-                IsTabStop="False"
-                Text="PicView"
-                TextAlignment="Center"
-                TextTrimming="CharacterEllipsis" />
+            <views:TitleTextBox />
         </DockPanel>
     </Border>
 </UserControl>

+ 20 - 0
src/PicView.Avalonia.Win32/Views/WinTitleBar.axaml.cs

@@ -0,0 +1,20 @@
+using Avalonia.Controls;
+using Avalonia.Input;
+
+namespace PicView.Avalonia.Win32.Views;
+
+public partial class WinTitleBar : UserControl
+{
+    public WinTitleBar()
+    {
+        InitializeComponent();
+    }
+
+    private void MoveWindow(object? sender, PointerPressedEventArgs e)
+    {
+        if (VisualRoot is null) { return; }
+
+        var hostWindow = (Window)VisualRoot;
+        hostWindow?.BeginMoveDrag(e);
+    }
+}

BIN
src/PicView.Avalonia/Assets/icon.ico


BIN
src/PicView.Avalonia/Assets/icon.png


+ 8 - 17
src/PicView.Avalonia/PicView.Avalonia.csproj

@@ -4,7 +4,7 @@
     <Nullable>enable</Nullable>
     <LangVersion>latest</LangVersion>
     <AvaloniaUseCompiledBindingsByDefault>true</AvaloniaUseCompiledBindingsByDefault>
-    <ApplicationIcon>Assets\icon.ico</ApplicationIcon>
+    <ImplicitUsings>enable</ImplicitUsings>
   </PropertyGroup>
 
   
@@ -13,12 +13,6 @@
   </ItemGroup>
 
   
-  <ItemGroup>
-    <AvaloniaResource Remove="Assets\icon.ico" />
-    <AvaloniaResource Remove="Assets\icon.png" />
-  </ItemGroup>
-
-  
   <ItemGroup>
     <None Remove="Assets\Fonts\Roboto-Black.ttf" />
     <None Remove="Assets\Fonts\Roboto-Bold.ttf" />
@@ -33,16 +27,9 @@
     <None Remove="Assets\Fonts\texgyreheros-bold.otf" />
     <None Remove="Assets\Fonts\texgyreheros-italic.otf" />
     <None Remove="Assets\Fonts\texgyreheros-regular.otf" />
-    <None Remove="Assets\icon.ico" />
-    <None Remove="Assets\icon.png" />
     <None Remove="Themes\Dark\noisy-texture-200x200-o4-d31-c-161616-t0.png" />
   </ItemGroup>
 
-  
-  <ItemGroup>
-    <Content Include="Assets\icon.ico" />
-  </ItemGroup>
-
   <ItemGroup>
     <PackageReference Include="Avalonia" Version="11.0.6" />
     <PackageReference Include="Avalonia.ReactiveUI" Version="11.0.6" />
@@ -51,8 +38,12 @@
   </ItemGroup>
 
   <ItemGroup>
-    <Resource Include="Assets\icon.png" />
-    <Resource Include="Assets\icon.ico" />
-    <AvaloniaResource Include="Themes\Dark\noisy-texture-200x200-o4-d31-c-161616-t0.png" />
+    <AvaloniaResource Include="Themes\Dark\Resources\noisy-texture-200x200-o4-d31-c-161616-t0.png" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <Compile Update="Views\TitleTextbox.axaml.cs">
+      <DependentUpon>TitleTextBox.axaml</DependentUpon>
+    </Compile>
   </ItemGroup>
 </Project>

+ 22 - 0
src/PicView.Avalonia/Themes/Controls/Border.axaml

@@ -0,0 +1,22 @@
+<ResourceDictionary xmlns="https://github.com/avaloniaui" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
+    <Design.PreviewWith>
+        <Border />
+    </Design.PreviewWith>
+
+    <ControlTheme x:Key="{x:Type Border}" TargetType="Border">
+
+        <Setter Property="Button.Template">
+            <ControlTemplate TargetType="Border">
+                <ContentPresenter
+                    x:Name="PART_ContentPresenter"
+                    Padding="{TemplateBinding Padding}"
+                    Background="{TemplateBinding Background}"
+                    BorderBrush="{TemplateBinding BorderBrush}"
+                    BorderThickness="{TemplateBinding BorderThickness}"
+                    CornerRadius="{TemplateBinding CornerRadius}"
+                    RecognizesAccessKey="True"
+                    UseLayoutRounding="False" />
+            </ControlTemplate>
+        </Setter>
+    </ControlTheme>
+</ResourceDictionary>

+ 26 - 0
src/PicView.Avalonia/Themes/Controls/Button.axaml

@@ -0,0 +1,26 @@
+<ResourceDictionary xmlns="https://github.com/avaloniaui" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
+    <Design.PreviewWith>
+        <Button />
+    </Design.PreviewWith>
+
+    <ControlTheme x:Key="{x:Type Button}" TargetType="Button">
+
+        <Setter Property="Button.Template">
+            <ControlTemplate TargetType="Button">
+                <ContentPresenter
+                    Name="PART_ContentPresenter"
+                    Padding="{TemplateBinding Padding}"
+                    HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}"
+                    VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}"
+                    Background="{TemplateBinding Background}"
+                    BorderBrush="{TemplateBinding BorderBrush}"
+                    BorderThickness="{TemplateBinding BorderThickness}"
+                    Content="{TemplateBinding Content}"
+                    ContentTemplate="{TemplateBinding ContentTemplate}"
+                    CornerRadius="{TemplateBinding CornerRadius}"
+                    RecognizesAccessKey="True"
+                    TextElement.Foreground="{TemplateBinding Foreground}" />
+            </ControlTemplate>
+        </Setter>
+    </ControlTheme>
+</ResourceDictionary>

+ 18 - 0
src/PicView.Avalonia/Themes/Controls/TextBlock.axaml

@@ -0,0 +1,18 @@
+<ResourceDictionary xmlns="https://github.com/avaloniaui" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
+    <Design.PreviewWith>
+        <Border />
+    </Design.PreviewWith>
+
+    <ControlTheme x:Key="{x:Type TextBlock}" TargetType="TextBlock">
+
+        <Setter Property="Button.Template">
+            <ControlTemplate TargetType="TextBlock">
+                <ContentPresenter
+                    x:Name="PART_ContentPresenter"
+                    Padding="{TemplateBinding Padding}"
+                    RecognizesAccessKey="True"
+                    UseLayoutRounding="False" />
+            </ControlTemplate>
+        </Setter>
+    </ControlTheme>
+</ResourceDictionary>

+ 28 - 0
src/PicView.Avalonia/Themes/Controls/Window.axaml

@@ -0,0 +1,28 @@
+<ResourceDictionary
+    xmlns="https://github.com/avaloniaui"
+    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+    x:CompileBindings="True">
+    <ControlTheme x:Key="{x:Type Window}" TargetType="Window">
+        <Setter Property="Template">
+            <ControlTemplate TargetType="Window">
+                <Panel>
+                    <Border Name="PART_TransparencyFallback" IsHitTestVisible="False" />
+                    <Border Background="{TemplateBinding Background}" IsHitTestVisible="False" />
+                    <Panel Margin="{TemplateBinding WindowDecorationMargin}" Background="Transparent" />
+                    <VisualLayerManager>
+                        <VisualLayerManager.ChromeOverlayLayer>
+                            <TitleBar />
+                        </VisualLayerManager.ChromeOverlayLayer>
+                        <ContentPresenter
+                            Name="PART_ContentPresenter"
+                            Margin="{TemplateBinding Padding}"
+                            HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}"
+                            VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}"
+                            Content="{TemplateBinding Content}"
+                            ContentTemplate="{TemplateBinding ContentTemplate}" />
+                    </VisualLayerManager>
+                </Panel>
+            </ControlTemplate>
+        </Setter>
+    </ControlTheme>
+</ResourceDictionary>

+ 14 - 1
src/PicView.Avalonia/Themes/Dark/DarkTheme.axaml

@@ -21,12 +21,25 @@
                 x:Key="NoisyTexture"
                 DestinationRect="0,0,100,100"
                 Opacity=".9"
-                Source="\Themes\Dark\noisy-texture-200x200-o4-d31-c-161616-t0.png"
+                Source="\Themes\Dark\Resources\noisy-texture-200x200-o4-d31-c-161616-t0.png"
                 SourceRect="0,0,200,200"
                 Stretch="Fill"
                 TileMode="FlipXY" />
+            <ResourceDictionary.MergedDictionaries>
+                <ResourceInclude Source="avares://PicView.Avalonia/Themes/Controls/Button.axaml" />
+                <ResourceInclude Source="avares://PicView.Avalonia/Themes/Controls/Border.axaml" />
+                <ResourceInclude Source="avares://PicView.Avalonia/Themes/Controls/TextBlock.axaml" />
+                <ResourceInclude Source="avares://PicView.Avalonia/Themes/Controls/Window.axaml" />
+            </ResourceDictionary.MergedDictionaries>
         </ResourceDictionary>
     </Styles.Resources>
+    <Style Selector="Window">
+        <Setter Property="Background" Value="Transparent" />
+        <Setter Property="BorderThickness" Value="1" />
+        <Setter Property="BorderBrush" Value="{StaticResource MainBorderColor}" />
+        <Setter Property="MinWidth" Value="400" />
+        <Setter Property="MinHeight" Value="400" />
+    </Style>
     <Style Selector="TextBox, Label, Button">
         <Setter Property="FontSize" Value="12" />
         <Setter Property="FontFamily" Value="avares://PicView.Avalonia/Assets/Fonts#Roboto" />

+ 0 - 0
src/PicView.Avalonia/Themes/Dark/noisy-texture-200x200-o4-d31-c-161616-t0.png → src/PicView.Avalonia/Themes/Dark/Resources/noisy-texture-200x200-o4-d31-c-161616-t0.png


+ 22 - 2
src/PicView.Avalonia/ViewModels/MainViewModel.cs

@@ -1,6 +1,26 @@
-namespace PicView.Avalonia.ViewModels;
+using Avalonia.Controls.ApplicationLifetimes;
+using ReactiveUI;
+using System.Windows.Input;
+using Avalonia;
+using Avalonia.Controls;
+
+namespace PicView.Avalonia.ViewModels;
 
 public class MainViewModel : ViewModelBase
 {
     public string Greeting => "Welcome to Avalonia!";
-}
+    public ICommand? ExitCommand { get; }
+    public ICommand? MinimizeCommand { get; }
+
+    public MainViewModel()
+    {
+        if (Application.Current?.ApplicationLifetime is not IClassicDesktopStyleApplicationLifetime desktop)
+        {
+            return;
+        }
+
+        ExitCommand = ReactiveCommand.Create(desktop.MainWindow.Close);
+        MinimizeCommand = ReactiveCommand.Create(() =>
+            desktop.MainWindow.WindowState = WindowState.Minimized);
+    }
+}

+ 18 - 0
src/PicView.Avalonia/Views/TitleTextBox.axaml

@@ -0,0 +1,18 @@
+<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"
+             mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
+             x:Class="PicView.Avalonia.Views.TitleTextBox">
+            <TextBlock
+                Height="30"
+                Padding="3,7,3,5"
+                VerticalAlignment="Center"
+                Background="{StaticResource SecondaryBackgroundColor}"
+                FontSize="13"
+                FontWeight="Medium"
+                IsTabStop="False"
+                Text="Loading...."
+                TextAlignment="Center"
+                TextTrimming="CharacterEllipsis" />
+</UserControl>

+ 11 - 0
src/PicView.Avalonia/Views/TitleTextbox.axaml.cs

@@ -0,0 +1,11 @@
+using Avalonia.Controls;
+
+namespace PicView.Avalonia.Views;
+
+public partial class TitleTextBox : UserControl
+{
+    public TitleTextBox()
+    {
+        InitializeComponent();
+    }
+}

+ 2 - 2
src/PicView.sln

@@ -15,9 +15,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PicView.Avalonia.Win32", "P
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PicView.Avalonia.MacOS", "PicView.Avalonia.MacOS\PicView.Avalonia.MacOS.csproj", "{79402A1F-0EDE-49C8-970A-E7AC0065FFB4}"
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PicView.Windows", "PicView.Windows\PicView.Windows.csproj", "{D63E2F56-02CC-4E23-AF78-F5218E83B2E6}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PicView.Windows", "PicView.Windows\PicView.Windows.csproj", "{D63E2F56-02CC-4E23-AF78-F5218E83B2E6}"
 EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PicView.MacOS", "PicView.MacOS\PicView.MacOS.csproj", "{FEAC727E-1102-4F11-A747-5A5789FBBF81}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PicView.MacOS", "PicView.MacOS\PicView.MacOS.csproj", "{FEAC727E-1102-4F11-A747-5A5789FBBF81}"
 EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution