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 Avalonia.Media;
using LiveChartsCore.Measure;
namespace GSS2.UI.Core.ViewModels; namespace GSS2.UI.Core.ViewModels;
public partial class CameraViewModel : ViewModelBase, IDisposable public partial class CameraViewModel : ViewModelBase, IDisposable
@@ -21,7 +19,7 @@ public partial class CameraViewModel : ViewModelBase, IDisposable
public event EventHandler? RenderReqested; public event EventHandler? RenderReqested;
[ObservableProperty] private Color _backgroundColor = Colors.Transparent; [ObservableProperty] private Color _background = Colors.Transparent;
[ObservableProperty] private Stretch _stretchMode = Stretch.Uniform; [ObservableProperty] private Stretch _stretchMode = Stretch.Uniform;
[ObservableProperty] private TileMode _tileMode = TileMode.None; [ObservableProperty] private TileMode _tileMode = TileMode.None;
+4 -1
View File
@@ -6,5 +6,8 @@
x:DataType="vm:CameraViewModel" x:DataType="vm:CameraViewModel"
x:Class="GSS2.UI.Core.Views.CameraView" x:Class="GSS2.UI.Core.Views.CameraView"
HorizontalAlignment="Stretch" HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"> VerticalAlignment="Stretch"
Background="{Binding Background}"
StretchMode="{Binding StretchMode}"
TileMode="{Binding TileMode}">
</Control> </Control>
+24 -6
View File
@@ -13,7 +13,7 @@ using Avalonia.Threading;
using Avalonia.Input; using Avalonia.Input;
using GSS2.UI.Core.ViewModels; using GSS2.UI.Core.ViewModels;
using System.ComponentModel; using Avalonia.Markup.Xaml;
namespace GSS2.UI.Core.Views; namespace GSS2.UI.Core.Views;
@@ -196,9 +196,29 @@ public partial class CameraView : OpenGlControlBase
private float _panX = 0; private float _panX = 0;
private float _panY = 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) public CameraView(ILogger<CameraView> logger)
{ {
_logger = logger; _logger = logger;
AvaloniaXamlLoader.Load(this);
_logger.LogInformation("{} initialized", nameof(CameraView)); _logger.LogInformation("{} initialized", nameof(CameraView));
} }
@@ -219,7 +239,6 @@ public partial class CameraView : OpenGlControlBase
} }
else else
_logger.LogCritical("Cannot start view finder, data context is null or not camera view model"); _logger.LogCritical("Cannot start view finder, data context is null or not camera view model");
base.OnAttachedToVisualTree(ea); base.OnAttachedToVisualTree(ea);
} }
protected override void OnDetachedFromLogicalTree(LogicalTreeAttachmentEventArgs ea) protected override void OnDetachedFromLogicalTree(LogicalTreeAttachmentEventArgs ea)
@@ -339,8 +358,7 @@ public partial class CameraView : OpenGlControlBase
public override void Render(DrawingContext context) public override void Render(DrawingContext context)
{ {
var backgroundColor = (DataContext as CameraViewModel)?.BackgroundColor ?? Colors.Transparent; context.FillRectangle(new SolidColorBrush(Background), new Rect(0, 0, Bounds.Width, Bounds.Height));
context.FillRectangle(new SolidColorBrush(backgroundColor), new Rect(0, 0, Bounds.Width, Bounds.Height));
base.Render(context); base.Render(context);
} }
private void RenderReqested(object? sender, EventArgs ea) => Dispatcher.UIThread.Invoke(() => RequestNextFrameRendering()); private void RenderReqested(object? sender, EventArgs ea) => Dispatcher.UIThread.Invoke(() => RequestNextFrameRendering());
@@ -425,8 +443,8 @@ public partial class CameraView : OpenGlControlBase
return; return;
} }
var stretchMode = (DataContext as CameraViewModel)?.StretchMode ?? Stretch.Uniform; var stretchMode = StretchMode;
var tileMode = (DataContext as CameraViewModel)?.TileMode ?? TileMode.None; var tileMode = TileMode;
// 1. Очищаем экран // 1. Очищаем экран
gl.Viewport(0, 0, (int)Bounds.Width, (int)Bounds.Height); gl.Viewport(0, 0, (int)Bounds.Width, (int)Bounds.Height);