feat: CameraView control properties

This commit is contained in:
2026-02-04 21:32:33 +03:00
parent 5a728dbdd9
commit c0336a55fd
3 changed files with 29 additions and 10 deletions
+1 -3
View File
@@ -8,8 +8,6 @@ using CommunityToolkit.Mvvm.ComponentModel;
using Avalonia.Media;
using LiveChartsCore.Measure;
namespace GSS2.UI.Core.ViewModels;
public partial class CameraViewModel : ViewModelBase, IDisposable
@@ -21,7 +19,7 @@ public partial class CameraViewModel : ViewModelBase, IDisposable
public event EventHandler? RenderReqested;
[ObservableProperty] private Color _backgroundColor = Colors.Transparent;
[ObservableProperty] private Color _background = Colors.Transparent;
[ObservableProperty] private Stretch _stretchMode = Stretch.Uniform;
[ObservableProperty] private TileMode _tileMode = TileMode.None;
+4 -1
View File
@@ -6,5 +6,8 @@
x:DataType="vm:CameraViewModel"
x:Class="GSS2.UI.Core.Views.CameraView"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch">
VerticalAlignment="Stretch"
Background="{Binding Background}"
StretchMode="{Binding StretchMode}"
TileMode="{Binding TileMode}">
</Control>
+24 -6
View File
@@ -13,7 +13,7 @@ using Avalonia.Threading;
using Avalonia.Input;
using GSS2.UI.Core.ViewModels;
using System.ComponentModel;
using Avalonia.Markup.Xaml;
namespace GSS2.UI.Core.Views;
@@ -196,9 +196,29 @@ public partial class CameraView : OpenGlControlBase
private float _panX = 0;
private float _panY = 0;
public static readonly StyledProperty<Color> BackgroundProperty = AvaloniaProperty.Register<CameraView, Color>(nameof(Background), defaultValue: Colors.Transparent);
public Color Background
{
get => GetValue(BackgroundProperty);
set => SetValue(BackgroundProperty, value);
}
public static readonly StyledProperty<Stretch> StretchModeProperty = AvaloniaProperty.Register<CameraView, Stretch>(nameof(StretchMode), defaultValue: Stretch.Uniform);
public Stretch StretchMode
{
get => GetValue(StretchModeProperty);
set => SetValue(StretchModeProperty, value);
}
public static readonly StyledProperty<TileMode> TileModeProperty = AvaloniaProperty.Register<CameraView, TileMode>(nameof(TileMode), defaultValue: TileMode.None);
public TileMode TileMode
{
get => GetValue(TileModeProperty);
set => SetValue(TileModeProperty, value);
}
public CameraView(ILogger<CameraView> logger)
{
_logger = logger;
AvaloniaXamlLoader.Load(this);
_logger.LogInformation("{} initialized", nameof(CameraView));
}
@@ -219,7 +239,6 @@ public partial class CameraView : OpenGlControlBase
}
else
_logger.LogCritical("Cannot start view finder, data context is null or not camera view model");
base.OnAttachedToVisualTree(ea);
}
protected override void OnDetachedFromLogicalTree(LogicalTreeAttachmentEventArgs ea)
@@ -339,8 +358,7 @@ public partial class CameraView : OpenGlControlBase
public override void Render(DrawingContext context)
{
var backgroundColor = (DataContext as CameraViewModel)?.BackgroundColor ?? Colors.Transparent;
context.FillRectangle(new SolidColorBrush(backgroundColor), new Rect(0, 0, Bounds.Width, Bounds.Height));
context.FillRectangle(new SolidColorBrush(Background), new Rect(0, 0, Bounds.Width, Bounds.Height));
base.Render(context);
}
private void RenderReqested(object? sender, EventArgs ea) => Dispatcher.UIThread.Invoke(() => RequestNextFrameRendering());
@@ -425,8 +443,8 @@ public partial class CameraView : OpenGlControlBase
return;
}
var stretchMode = (DataContext as CameraViewModel)?.StretchMode ?? Stretch.Uniform;
var tileMode = (DataContext as CameraViewModel)?.TileMode ?? TileMode.None;
var stretchMode = StretchMode;
var tileMode = TileMode;
// 1. Очищаем экран
gl.Viewport(0, 0, (int)Bounds.Width, (int)Bounds.Height);