sourcegit/src/Views/Launcher.axaml.cs

204 lines
6.6 KiB
C#
Raw Normal View History

using System;
using Avalonia;
using Avalonia.Controls;
using Avalonia.Input;
using Avalonia.Interactivity;
namespace SourceGit.Views
{
public partial class Launcher : ChromelessWindow
{
public Launcher()
{
InitializeComponent();
}
protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change)
{
base.OnPropertyChanged(change);
if (change.Property == WindowStateProperty)
{
var state = (WindowState)change.NewValue;
if (state == WindowState.Maximized)
MainLayout.RowDefinitions[0].Height = new GridLength(OperatingSystem.IsMacOS() ? 34 : 30);
else
MainLayout.RowDefinitions[0].Height = new GridLength(38);
}
}
protected override void OnKeyDown(KeyEventArgs e)
{
var vm = DataContext as ViewModels.Launcher;
// Ctrl+Shift+P opens preference dialog (macOS use hotkeys in system menu bar)
if (!OperatingSystem.IsMacOS() && e.KeyModifiers == (KeyModifiers.Control | KeyModifiers.Shift) && e.Key == Key.P)
{
App.OpenPreferenceCommand.Execute(null);
e.Handled = true;
return;
}
if ((OperatingSystem.IsMacOS() && e.KeyModifiers.HasFlag(KeyModifiers.Meta)) ||
(!OperatingSystem.IsMacOS() && e.KeyModifiers.HasFlag(KeyModifiers.Control)))
{
if (e.Key == Key.W)
{
vm.CloseTab(null);
e.Handled = true;
return;
}
else if (e.Key == Key.T)
{
vm.AddNewTab();
e.Handled = true;
return;
}
else if ((OperatingSystem.IsMacOS() && e.KeyModifiers.HasFlag(KeyModifiers.Alt) && e.Key == Key.Right) ||
(!OperatingSystem.IsMacOS() && !e.KeyModifiers.HasFlag(KeyModifiers.Shift) && e.Key == Key.Tab))
{
vm.GotoNextTab();
e.Handled = true;
return;
}
else if ((OperatingSystem.IsMacOS() && e.KeyModifiers.HasFlag(KeyModifiers.Alt) && e.Key == Key.Left) ||
(!OperatingSystem.IsMacOS() && e.KeyModifiers.HasFlag(KeyModifiers.Shift) && e.Key == Key.Tab))
{
vm.GotoPrevTab();
e.Handled = true;
return;
}
else if (vm.ActivePage.Data is ViewModels.Repository repo)
{
if (e.Key == Key.D1 || e.Key == Key.NumPad1)
{
repo.SelectedViewIndex = 0;
e.Handled = true;
return;
}
else if (e.Key == Key.D2 || e.Key == Key.NumPad2)
{
repo.SelectedViewIndex = 1;
e.Handled = true;
return;
}
else if (e.Key == Key.D3 || e.Key == Key.NumPad3)
{
repo.SelectedViewIndex = 2;
e.Handled = true;
return;
}
else if (e.Key == Key.F)
{
repo.IsSearching = true;
e.Handled = true;
return;
}
else if (e.Key == Key.H && e.KeyModifiers.HasFlag(KeyModifiers.Shift))
{
repo.IsSearching = false;
e.Handled = true;
return;
}
}
}
else if (e.Key == Key.Escape)
{
vm.ActivePage.CancelPopup();
e.Handled = true;
return;
}
else if (e.Key == Key.F5)
{
if (vm.ActivePage.Data is ViewModels.Repository repo)
{
repo.RefreshAll();
e.Handled = true;
return;
}
}
base.OnKeyDown(e);
}
protected override void OnClosing(WindowClosingEventArgs e)
{
var vm = DataContext as ViewModels.Launcher;
vm.Quit();
base.OnClosing(e);
}
private void OnTitleBarDoubleTapped(object sender, TappedEventArgs e)
{
_pressedTitleBar = false;
if (WindowState == WindowState.Maximized)
WindowState = WindowState.Normal;
else
WindowState = WindowState.Maximized;
e.Handled = true;
}
private void BeginMoveWindow(object sender, PointerPressedEventArgs e)
{
if (e.ClickCount != 2)
_pressedTitleBar = true;
}
private void MoveWindow(object sender, PointerEventArgs e)
{
if (!_pressedTitleBar)
return;
var visual = (Visual)e.Source;
BeginMoveDrag(new PointerPressedEventArgs(
2024-06-13 18:46:30 -07:00
e.Source,
e.Pointer,
2024-06-13 18:46:30 -07:00
visual,
e.GetPosition(visual),
e.Timestamp,
new PointerPointProperties(RawInputModifiers.None, PointerUpdateKind.LeftButtonPressed),
e.KeyModifiers));
}
private void EndMoveWindow(object sender, PointerReleasedEventArgs e)
{
_pressedTitleBar = false;
}
private void OnPopupSure(object sender, RoutedEventArgs e)
{
if (DataContext is ViewModels.Launcher vm)
vm.ActivePage.ProcessPopup();
e.Handled = true;
}
private void OnPopupCancel(object sender, RoutedEventArgs e)
{
if (DataContext is ViewModels.Launcher vm)
vm.ActivePage.CancelPopup();
e.Handled = true;
}
private void OnPopupCancelByClickMask(object sender, PointerPressedEventArgs e)
{
OnPopupCancel(sender, e);
}
private void OnDismissNotification(object sender, RoutedEventArgs e)
{
if (sender is Button btn && DataContext is ViewModels.Launcher vm)
vm.DismissNotification(btn.DataContext as ViewModels.Notification);
e.Handled = true;
}
private bool _pressedTitleBar = false;
}
}