Files
FileTime/src/GuiApp/FileTime.Avalonia/Views/MainWindow.axaml.cs
2022-02-23 22:52:03 +01:00

147 lines
4.5 KiB
C#

using Avalonia;
using Avalonia.Controls;
using Avalonia.Input;
using Avalonia.Interactivity;
using Avalonia.Markup.Xaml;
using FileTime.App.Core.Models;
using FileTime.Avalonia.Misc;
using FileTime.Avalonia.Models;
using FileTime.Avalonia.ViewModels;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using System;
using System.Linq;
namespace FileTime.Avalonia.Views
{
public partial class MainWindow : Window
{
private readonly ILogger<MainWindow>? _logger;
public MainPageViewModel? ViewModel
{
get => DataContext as MainPageViewModel;
set
{
if (value != DataContext)
{
DataContext = value;
}
}
}
private InputElementWrapper? _inputElementWrapper;
public MainWindow()
{
_logger = App.ServiceProvider.GetService<ILogger<MainWindow>>();
_logger?.LogInformation($"Starting {nameof(MainWindow)} initialization...");
InitializeComponent();
#if DEBUG
this.AttachDevTools();
#endif
}
private void InitializeComponent()
{
AvaloniaXamlLoader.Load(this);
}
public void OnKeyDown(object sender, KeyEventArgs e)
{
if (_inputElementWrapper == null)
{
ViewModel!.ProcessKeyDown(e.Key, e.KeyModifiers, h => e.Handled = h);
}
}
private void InputText_KeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Enter && _inputElementWrapper == ViewModel!.AppState.Inputs.Last())
{
ViewModel.ProcessInputs();
_inputElementWrapper = null;
e.Handled = true;
}
else if (e.Key == Key.Escape && _inputElementWrapper == ViewModel!.AppState.Inputs.Last())
{
ViewModel.CancelInputs();
_inputElementWrapper = null;
e.Handled = true;
}
}
private void InputText_GotFocus(object sender, GotFocusEventArgs e)
{
if (sender is TextBox inputText && inputText.DataContext is InputElementWrapper inputElementWrapper)
{
_inputElementWrapper = inputElementWrapper;
}
}
private void InputText_LostFocus(object sender, RoutedEventArgs e)
{
if (sender is TextBox inputText && inputText.DataContext is InputElementWrapper)
{
_inputElementWrapper = null;
}
}
private void InputText_AttachedToVisualTree(object? sender, VisualTreeAttachmentEventArgs e)
{
if (sender is TextBox inputText && inputText.IsVisible && inputText.DataContext is InputElementWrapper inputElementWrapper && inputElementWrapper == ViewModel!.AppState.Inputs[0])
{
inputText.Focus();
}
}
private void OnHasContainerPointerPressed(object sender, PointerPressedEventArgs e)
{
if (!e.Handled
&& ViewModel != null
&& e.GetCurrentPoint(this).Properties.IsLeftButtonPressed
&& sender is StyledElement control
&& control.DataContext is IHaveContainer hasContainer)
{
ViewModel.CommandHandlerService.OpenContainer(hasContainer.Container);
e.Handled = true;
}
}
private void OnWindowClosed(object sender, EventArgs e)
{
try
{
ViewModel?.StatePersistence.SaveStates();
}
catch { }
}
private void OnWindowOpened(object sender, EventArgs e)
{
if (ViewModel is not MainPageViewModel)
{
_logger?.LogInformation($"{nameof(MainWindow)} opened, starting {nameof(MainPageViewModel)} initialization...");
ViewModel = App.ServiceProvider.GetService<MainPageViewModel>();
}
}
private void HeaderPointerPressed(object sender, PointerPressedEventArgs e)
{
if (e.ClickCount == 2)
{
if (WindowState == WindowState.Maximized)
{
WindowState = WindowState.Normal;
}
else
{
WindowState = WindowState.Maximized;
}
}
else
{
BeginMoveDrag(e);
}
}
}
}