Files
GSS2Rework/GSS2/Views/TextKeyboardView.axaml.cs
amkovkov 72ae26eee7 comprehensive update
1) remove unused components: camera view (due it causes segmentation faults), compute resources and all related, illuminator controller (due in useless without camera view), image storage service, temperature and humidity service
2) database schema - reduce tables references, features storing in records themselves in compressed form, add records creation and editing date and time, add separator comment column
3) analysis - rework of pipeline and ui, now database storing only raw data and all display values calculated from it
4) lights service - add reconnection if disconnected
5) add width and height command line arguments
6) fix some typos and other issues
2026-06-29 15:13:29 +03:00

173 lines
5.4 KiB
C#

using System.Text;
using Avalonia;
using Avalonia.Controls;
using Avalonia.Controls.Presenters;
using Avalonia.Interactivity;
namespace GSS2.Views;
public partial class TextKeyboardView : UserControl
{
public static readonly StyledProperty<string?> ValueProperty = AvaloniaProperty.Register<NumericKeyboardView, string?>(nameof(Value));
public string? Value
{
get => GetValue(ValueProperty);
set => SetValue(ValueProperty, value);
}
public static readonly StyledProperty<bool> IsMultilineProperty = AvaloniaProperty.Register<NumericKeyboardView, bool>(nameof(IsMultiline), defaultValue: false);
public bool IsMultiline
{
get => GetValue(IsMultilineProperty);
set => SetValue(IsMultilineProperty, value);
}
public static readonly RoutedEvent<RoutedEventArgs> ClosedEvent = RoutedEvent.Register<NumericKeyboardView, RoutedEventArgs>(nameof(KeyboardClosed), RoutingStrategies.Bubble);
public event EventHandler<RoutedEventArgs> KeyboardClosed
{
add => AddHandler(ClosedEvent, value);
remove => RemoveHandler(ClosedEvent, value);
}
private readonly TextPresenter? _presenter;
private StringBuilder _text = new();
private bool _changingValue = false;
private int _cursor = 0;
private bool _isUppercase = false;
private bool _isEnglish = false;
public TextKeyboardView(string? value = null)
{
InitializeComponent();
ValueProperty.Changed.AddClassHandler<TextKeyboardView>((sender, value) =>
{
if (sender != this)
return;
if (_changingValue)
return;
if (value.NewValue is not string strValue)
{
_changingValue = true;
_text = new();
_cursor = _text.Length;
_changingValue = false;
UpdateDisplay();
return;
}
_changingValue = true;
_text.Clear();
_text.Insert(0, strValue);
_cursor = _text.Length;
_changingValue = false;
UpdateDisplay();
});
IsMultilineProperty.Changed.AddClassHandler<TextKeyboardView>((sender, value) =>
{
if (sender != this)
return;
if (value.NewValue is not bool boolValue)
return;
EnterRussianLowercase.IsVisible = boolValue;
EnterRussianUppercase.IsVisible = boolValue;
EnterEnglishLowercase.IsVisible = boolValue;
EnterEnglishUppercase.IsVisible = boolValue;
});
_presenter = this.FindControl<TextPresenter>("Text");
if (!string.IsNullOrEmpty(value))
_text.Append(value);
_cursor = _text.Length;
_presenter?.ShowCaret();
UpdateDisplay();
RussianLowercase.IsVisible = !_isUppercase && !_isEnglish;
RussianUppercase.IsVisible = _isUppercase && !_isEnglish;
EnglishLowercase.IsVisible = !_isUppercase && _isEnglish;
EnglishUppercase.IsVisible = _isUppercase && _isEnglish;
EnterRussianLowercase.IsVisible = IsMultiline;
EnterRussianUppercase.IsVisible = IsMultiline;
EnterEnglishLowercase.IsVisible = IsMultiline;
EnterEnglishUppercase.IsVisible = IsMultiline;
}
private void KeyPressed(object? sender, RoutedEventArgs e)
{
if (sender is not Button btn || btn.Content is not string symbol) return;
_text.Insert(_cursor, symbol);
_cursor++;
UpdateDisplay();
}
private void EnterKeyPressed(object? sender, RoutedEventArgs e)
{
_text.Insert(_cursor, "\n");
_cursor++;
UpdateDisplay();
}
private void Backspace(object? sender, RoutedEventArgs e)
{
if (_cursor > 0)
{
_cursor--;
_text.Remove(_cursor, 1);
UpdateDisplay();
}
}
private void SwitchCase(object? sender, RoutedEventArgs e)
{
_isUppercase = !_isUppercase;
RussianLowercase.IsVisible = !_isUppercase && !_isEnglish;
RussianUppercase.IsVisible = _isUppercase && !_isEnglish;
EnglishLowercase.IsVisible = !_isUppercase && _isEnglish;
EnglishUppercase.IsVisible = _isUppercase && _isEnglish;
}
private void SwitchLagnuage(object? sender, RoutedEventArgs e)
{
_isEnglish = !_isEnglish;
RussianLowercase.IsVisible = !_isUppercase && !_isEnglish;
RussianUppercase.IsVisible = _isUppercase && !_isEnglish;
EnglishLowercase.IsVisible = !_isUppercase && _isEnglish;
EnglishUppercase.IsVisible = _isUppercase && _isEnglish;
}
private void MoveCursorLeft(object? sender, RoutedEventArgs e)
{
_cursor = Math.Max(0, _cursor - 1);
UpdateDisplay();
}
private void MoveCursorRight(object? sender, RoutedEventArgs e)
{
_cursor = Math.Min(_text.Length, _cursor + 1);
UpdateDisplay();
}
private void Accept(object? sender, RoutedEventArgs e)
{
Value = _text.ToString();
}
private void Cancel(object? sender, RoutedEventArgs e) => Value = null;
private void UpdateDisplay()
{
if (_presenter is null)
return;
_presenter.Text = _text.ToString();
_presenter.CaretIndex = _cursor;
_presenter.InvalidateVisual();
Value = _text.ToString();
}
}