Added Button to save - updated SplitView functionality - updated SplitViewOpenButton

This commit is contained in:
Ano-sys
2025-02-21 17:17:34 +01:00
parent 1177efcc58
commit b2ef3b03c4
4 changed files with 95 additions and 13 deletions
+1
View File
@@ -75,6 +75,7 @@ public class MainWindowViewModel : ViewModelBase
private void ChangeSelectedColor(SolidColorBrush color) private void ChangeSelectedColor(SolidColorBrush color)
{ {
Brush = color; Brush = color;
SelectedColor = color.Color.ToString();
} }
private void OnCanvasPointerPressed(PointerPressedEventArgs? e) private void OnCanvasPointerPressed(PointerPressedEventArgs? e)
+16 -1
View File
@@ -1,11 +1,19 @@
using System; using System;
using System.Collections.ObjectModel; using System.Collections.ObjectModel;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.IO;
using System.Threading.Tasks;
using Avalonia;
using Avalonia.Controls;
using Avalonia.Input; using Avalonia.Input;
using Avalonia.Media; using Avalonia.Media;
using Avalonia.Media.Imaging;
using Avalonia.Platform;
using Avalonia.Platform.Storage;
using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input; using CommunityToolkit.Mvvm.Input;
using SimpleDraw.Models; using SimpleDraw.Models;
using SimpleDraw.Views;
namespace SimpleDraw.ViewModels; namespace SimpleDraw.ViewModels;
@@ -13,7 +21,6 @@ public class ViewModelBase : ObservableObject
{ {
public int WindowWidth { get; set; } = 1200; public int WindowWidth { get; set; } = 1200;
public int WindowHeight { get; set; } = 800; public int WindowHeight { get; set; } = 800;
public ObservableCollection<ColorPickerButton>? ColorPalette { get; set; } public ObservableCollection<ColorPickerButton>? ColorPalette { get; set; }
public IRelayCommand<PointerPressedEventArgs>? CanvasPointerPressedCommand { get; set; } public IRelayCommand<PointerPressedEventArgs>? CanvasPointerPressedCommand { get; set; }
public IRelayCommand<PointerEventArgs>? CanvasPointerMovedCommand { get; set; } public IRelayCommand<PointerEventArgs>? CanvasPointerMovedCommand { get; set; }
@@ -23,6 +30,14 @@ public class ViewModelBase : ObservableObject
protected bool IsDrawing { get; set; } protected bool IsDrawing { get; set; }
private string _selectedColor = "Black";
public string SelectedColor
{
get => _selectedColor;
set => SetProperty(ref _selectedColor, value);
}
private Brush _brush = new SolidColorBrush(new Color(a: 255, r: 0, g: 0, b: 0)); private Brush _brush = new SolidColorBrush(new Color(a: 255, r: 0, g: 0, b: 0));
private double _brushThickness = 2.0; private double _brushThickness = 2.0;
+33 -9
View File
@@ -33,9 +33,9 @@
</Design.DataContext> </Design.DataContext>
<Panel Background="Transparent"> <Panel Background="Transparent">
<SplitView Background="Transparent" IsPaneOpen="{Binding IsSplitOpen, Mode=TwoWay}" DisplayMode="Overlay" OpenPaneLength="250"> <SplitView Background="Transparent" IsPaneOpen="{Binding IsSplitOpen, Mode=TwoWay}" DisplayMode="Overlay" OpenPaneLength="250" ClipToBounds="False">
<SplitView.Pane> <SplitView.Pane>
<Border Background="Transparent" BorderBrush="Gray" BorderThickness="2"> <Border Background="Transparent" BorderBrush="Gray" BorderThickness="2" BoxShadow="50 0 10 10 DarkGray" CornerRadius="0, 12.5,12.5,0" >
<Grid Background="Transparent"> <Grid Background="Transparent">
<Grid Background="Transparent"> <Grid Background="Transparent">
<Grid.RowDefinitions> <Grid.RowDefinitions>
@@ -56,6 +56,7 @@
<MenuItem Header="Paste"/> <MenuItem Header="Paste"/>
</MenuItem> </MenuItem>
</Menu> </Menu>
<Button DockPanel.Dock="Top" HorizontalAlignment="Right">X</Button>
</DockPanel> </DockPanel>
<StackPanel Grid.Row="1"> <StackPanel Grid.Row="1">
@@ -91,7 +92,7 @@
</Grid> </Grid>
</Border> </Border>
</SplitView.Pane> </SplitView.Pane>
<Canvas Grid.Column="1" Background="White" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> <Canvas x:Name="Canvas" Background="White" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<i:Interaction.Behaviors> <i:Interaction.Behaviors>
<behaviors:EventTriggerBehavior EventName="PointerPressed"> <behaviors:EventTriggerBehavior EventName="PointerPressed">
<behaviors:InvokeCommandAction <behaviors:InvokeCommandAction
@@ -128,12 +129,35 @@
</ItemsControl> </ItemsControl>
</Canvas> </Canvas>
</SplitView> </SplitView>
<Button Content="≡" Command="{Binding DisplaySplitEvent}" HorizontalAlignment="Left" VerticalAlignment="Top"> <StackPanel Width="30" HorizontalAlignment="Left" IsVisible="{Binding !IsSplitOpen}" Background="#d4d4fc">
<Button.RenderTransform> <Button Content="≡" Command="{Binding DisplaySplitEvent}" HorizontalAlignment="Center" VerticalAlignment="Top">
<TranslateTransform X="{Binding ButtonOffset}" /> <Button.RenderTransform>
</Button.RenderTransform> <TranslateTransform X="{Binding ButtonOffset}" />
<Button.Transitions> </Button.RenderTransform>
</Button.Transitions> </Button>
<Button HorizontalAlignment="Center"
Margin="0,5,0,0"
BorderBrush="DimGray"
BorderThickness="2"
CornerRadius="12.5"
Background="{Binding SelectedColor}"
Width="20"
Height="20"
/>
</StackPanel>
<Button HorizontalAlignment="Right"
VerticalAlignment="Bottom"
Margin="0,0,7.5,7.5"
CornerRadius="5"
Background="#d4d4ff"
FontSize="18"
Width="35"
Height="35"
HorizontalContentAlignment="Center"
VerticalContentAlignment="Center"
Click="SaveFileButton_Clicked"
>
🖫
</Button> </Button>
</Panel> </Panel>
</Window> </Window>
+42
View File
@@ -1,5 +1,12 @@
using System;
using System.IO;
using System.Threading.Tasks;
using Avalonia;
using Avalonia.Controls; using Avalonia.Controls;
using Avalonia.Input; using Avalonia.Input;
using Avalonia.Interactivity;
using Avalonia.Media.Imaging;
using Avalonia.Platform.Storage;
using SimpleDraw.ViewModels; using SimpleDraw.ViewModels;
namespace SimpleDraw.Views; namespace SimpleDraw.Views;
@@ -13,4 +20,39 @@ public partial class MainWindow : Window
Topmost = true; Topmost = true;
Topmost = false; Topmost = false;
} }
private async void SaveFileButton_Clicked(object sender, RoutedEventArgs args)
{
TopLevel? topLevel = TopLevel.GetTopLevel(this);
if(topLevel == null) return;
var file = await topLevel.StorageProvider.SaveFilePickerAsync(new FilePickerSaveOptions
{
Title = "Save Drawing",
DefaultExtension = ".png",
SuggestedFileName = "unnamed",
SuggestedStartLocation = await topLevel.StorageProvider.TryGetFolderFromPathAsync(Environment.GetFolderPath(Environment.SpecialFolder.MyPictures)),
});
if (file is not null)
{
SaveCanvasAsPngAsync(Canvas, file.Path.AbsolutePath);
}
}
public async Task SaveCanvasAsPngAsync(Canvas canvas, string filePath)
{
Rect bounds = canvas.Bounds;
PixelSize pixelSize = new PixelSize((int)bounds.Width, (int)bounds.Height);
Vector dpi = new Vector(96, 96);
RenderTargetBitmap renderBitmap = new RenderTargetBitmap(pixelSize, dpi);
renderBitmap.Render(canvas);
await using (FileStream stream = File.OpenWrite(filePath))
{
renderBitmap.Save(stream);
}
}
} }