mirror of
https://github.com/microsoft/PowerToys.git
synced 2024-12-14 11:39:16 +08:00
dc9908eac1
1. Remove ItemDropEvent 2. Remove ShowContextMenus from API 3. Fix context menu item can't be opened ( #535 ), bug introduced from PR #494 (commit 45dbb50) 4. Move open result command and load context menu command back to MainViewModel 5. unify load context menu logic 6. other performance enhancement and potential bug fixed
381 lines
13 KiB
C#
381 lines
13 KiB
C#
using System;
|
|
using System.ComponentModel;
|
|
using System.Windows;
|
|
using System.Windows.Forms;
|
|
using System.Windows.Input;
|
|
using System.Windows.Media.Animation;
|
|
using System.Windows.Controls;
|
|
using Wox.Core.Plugin;
|
|
using Wox.Core.Resource;
|
|
using Wox.Core.Updater;
|
|
using Wox.Core.UserSettings;
|
|
using Wox.Helper;
|
|
using Wox.Infrastructure.Hotkey;
|
|
using Wox.ViewModel;
|
|
using DataFormats = System.Windows.DataFormats;
|
|
using DragEventArgs = System.Windows.DragEventArgs;
|
|
using KeyEventArgs = System.Windows.Input.KeyEventArgs;
|
|
using MessageBox = System.Windows.MessageBox;
|
|
|
|
namespace Wox
|
|
{
|
|
public partial class MainWindow
|
|
{
|
|
|
|
#region Private Fields
|
|
|
|
private readonly Storyboard _progressBarStoryboard = new Storyboard();
|
|
|
|
#endregion
|
|
|
|
public MainWindow()
|
|
{
|
|
InitializeComponent();
|
|
}
|
|
|
|
private void OnClosing(object sender, CancelEventArgs e)
|
|
{
|
|
|
|
UserSettingStorage.Instance.WindowLeft = Left;
|
|
UserSettingStorage.Instance.WindowTop = Top;
|
|
UserSettingStorage.Instance.Save();
|
|
|
|
e.Cancel = true;
|
|
}
|
|
|
|
private void OnLoaded(object sender, RoutedEventArgs _)
|
|
{
|
|
CheckUpdate();
|
|
|
|
ThemeManager.Theme.ChangeTheme(UserSettingStorage.Instance.Theme);
|
|
InternationalizationManager.Instance.ChangeLanguage(UserSettingStorage.Instance.Language);
|
|
|
|
InitProgressbarAnimation();
|
|
WindowIntelopHelper.DisableControlBox(this);
|
|
|
|
var vm = (MainViewModel)DataContext;
|
|
vm.TextBoxSelected += (o, e) => QueryTextBox.SelectAll();
|
|
vm.CursorMovedToEnd += (o, e) =>
|
|
{
|
|
QueryTextBox.Focus();
|
|
QueryTextBox.CaretIndex = QueryTextBox.Text.Length;
|
|
};
|
|
vm.MainWindowVisibilityChanged += (o, e) =>
|
|
{
|
|
if (vm.MainWindowVisibility.IsVisible())
|
|
{
|
|
Activate();
|
|
QueryTextBox.Focus();
|
|
Left = GetWindowsLeft();
|
|
Top = GetWindowsTop();
|
|
UserSettingStorage.Instance.IncreaseActivateTimes();
|
|
}
|
|
else
|
|
{
|
|
UserSettingStorage.Instance.WindowLeft = Left;
|
|
UserSettingStorage.Instance.WindowTop = Top;
|
|
UserSettingStorage.Instance.Save();
|
|
}
|
|
};
|
|
|
|
// happlebao todo delete
|
|
vm.Left = GetWindowsLeft();
|
|
vm.Top = GetWindowsTop();
|
|
vm.MainWindowVisibility = Visibility.Visible;
|
|
}
|
|
|
|
private double GetWindowsLeft()
|
|
{
|
|
if (UserSettingStorage.Instance.RememberLastLaunchLocation)
|
|
{
|
|
return UserSettingStorage.Instance.WindowLeft;
|
|
}
|
|
|
|
var screen = Screen.FromPoint(System.Windows.Forms.Cursor.Position);
|
|
var dip1 = WindowIntelopHelper.TransformPixelsToDIP(this, screen.WorkingArea.X, 0);
|
|
var dip2 = WindowIntelopHelper.TransformPixelsToDIP(this, screen.WorkingArea.Width, 0);
|
|
var left = (dip2.X - ActualWidth) / 2 + dip1.X;
|
|
return left;
|
|
}
|
|
|
|
private double GetWindowsTop()
|
|
{
|
|
if (UserSettingStorage.Instance.RememberLastLaunchLocation)
|
|
{
|
|
return UserSettingStorage.Instance.WindowTop;
|
|
}
|
|
|
|
var screen = Screen.FromPoint(System.Windows.Forms.Cursor.Position);
|
|
var dip1 = WindowIntelopHelper.TransformPixelsToDIP(this, 0, screen.WorkingArea.Y);
|
|
var dip2 = WindowIntelopHelper.TransformPixelsToDIP(this, 0, screen.WorkingArea.Height);
|
|
var top = (dip2.Y - ActualHeight) / 4 + dip1.Y;
|
|
return top;
|
|
}
|
|
|
|
private void CheckUpdate()
|
|
{
|
|
UpdaterManager.Instance.PrepareUpdateReady += OnPrepareUpdateReady;
|
|
UpdaterManager.Instance.UpdateError += OnUpdateError;
|
|
UpdaterManager.Instance.CheckUpdate();
|
|
}
|
|
|
|
void OnUpdateError(object sender, EventArgs e)
|
|
{
|
|
string updateError = InternationalizationManager.Instance.GetTranslation("update_wox_update_error");
|
|
MessageBox.Show(updateError);
|
|
}
|
|
|
|
private void OnPrepareUpdateReady(object sender, EventArgs e)
|
|
{
|
|
Dispatcher.Invoke(() =>
|
|
{
|
|
new WoxUpdate().ShowDialog();
|
|
});
|
|
}
|
|
|
|
private void InitProgressbarAnimation()
|
|
{
|
|
var da = new DoubleAnimation(progressBar.X2, ActualWidth + 100, new Duration(new TimeSpan(0, 0, 0, 0, 1600)));
|
|
var da1 = new DoubleAnimation(progressBar.X1, ActualWidth, new Duration(new TimeSpan(0, 0, 0, 0, 1600)));
|
|
Storyboard.SetTargetProperty(da, new PropertyPath("(Line.X2)"));
|
|
Storyboard.SetTargetProperty(da1, new PropertyPath("(Line.X1)"));
|
|
_progressBarStoryboard.Children.Add(da);
|
|
_progressBarStoryboard.Children.Add(da1);
|
|
_progressBarStoryboard.RepeatBehavior = RepeatBehavior.Forever;
|
|
progressBar.Visibility = Visibility.Hidden;
|
|
progressBar.BeginStoryboard(_progressBarStoryboard);
|
|
}
|
|
|
|
private void OnMouseDown(object sender, MouseButtonEventArgs e)
|
|
{
|
|
if (e.ChangedButton == MouseButton.Left) DragMove();
|
|
}
|
|
|
|
private void OnDeactivated(object sender, EventArgs e)
|
|
{
|
|
if (UserSettingStorage.Instance.HideWhenDeactive)
|
|
{
|
|
App.API.HideApp();
|
|
}
|
|
}
|
|
|
|
private void OnPreviewKeyDown(object sender, KeyEventArgs e)
|
|
{
|
|
var vm = DataContext as MainViewModel;
|
|
if (null == vm) return;
|
|
//when alt is pressed, the real key should be e.SystemKey
|
|
var key = (e.Key == Key.System ? e.SystemKey : e.Key);
|
|
switch (key)
|
|
{
|
|
case Key.Escape:
|
|
vm.EscCommand.Execute(null);
|
|
e.Handled = true;
|
|
break;
|
|
|
|
case Key.Tab:
|
|
if (GlobalHotkey.Instance.CheckModifiers().ShiftPressed)
|
|
{
|
|
vm.SelectPrevItemCommand.Execute(null);
|
|
}
|
|
else
|
|
{
|
|
vm.SelectNextItemCommand.Execute(null);
|
|
}
|
|
e.Handled = true;
|
|
break;
|
|
|
|
case Key.N:
|
|
case Key.J:
|
|
if (GlobalHotkey.Instance.CheckModifiers().CtrlPressed)
|
|
{
|
|
vm.SelectNextItemCommand.Execute(null);
|
|
}
|
|
break;
|
|
|
|
case Key.P:
|
|
case Key.K:
|
|
if (GlobalHotkey.Instance.CheckModifiers().CtrlPressed)
|
|
{
|
|
vm.SelectPrevItemCommand.Execute(null);
|
|
}
|
|
break;
|
|
|
|
case Key.O:
|
|
if (GlobalHotkey.Instance.CheckModifiers().CtrlPressed)
|
|
{
|
|
vm.LoadContextMenuCommand.Execute(null);
|
|
}
|
|
break;
|
|
|
|
case Key.Enter:
|
|
if (GlobalHotkey.Instance.CheckModifiers().ShiftPressed)
|
|
{
|
|
vm.LoadContextMenuCommand.Execute(null);
|
|
}
|
|
else
|
|
{
|
|
vm.OpenResultCommand.Execute(null);
|
|
}
|
|
e.Handled = true;
|
|
break;
|
|
|
|
case Key.Down:
|
|
if (GlobalHotkey.Instance.CheckModifiers().CtrlPressed)
|
|
{
|
|
vm.DisplayNextQueryCommand.Execute(null);
|
|
}
|
|
else
|
|
{
|
|
vm.SelectNextItemCommand.Execute(null);
|
|
}
|
|
e.Handled = true;
|
|
break;
|
|
|
|
case Key.Up:
|
|
if (GlobalHotkey.Instance.CheckModifiers().CtrlPressed)
|
|
{
|
|
vm.DisplayPrevQueryCommand.Execute(null);
|
|
}
|
|
else
|
|
{
|
|
vm.SelectPrevItemCommand.Execute(null);
|
|
}
|
|
e.Handled = true;
|
|
break;
|
|
|
|
case Key.D:
|
|
if (GlobalHotkey.Instance.CheckModifiers().CtrlPressed)
|
|
{
|
|
vm.SelectNextPageCommand.Execute(null);
|
|
}
|
|
break;
|
|
|
|
case Key.PageDown:
|
|
vm.SelectNextPageCommand.Execute(null);
|
|
e.Handled = true;
|
|
break;
|
|
|
|
case Key.U:
|
|
if (GlobalHotkey.Instance.CheckModifiers().CtrlPressed)
|
|
{
|
|
vm.SelectPrevPageCommand.Execute(null);
|
|
}
|
|
break;
|
|
|
|
case Key.PageUp:
|
|
vm.SelectPrevPageCommand.Execute(null);
|
|
e.Handled = true;
|
|
break;
|
|
|
|
case Key.Back:
|
|
vm.BackCommand.Execute(e);
|
|
break;
|
|
|
|
case Key.F1:
|
|
vm.StartHelpCommand.Execute(null);
|
|
break;
|
|
|
|
case Key.D1:
|
|
|
|
if (GlobalHotkey.Instance.CheckModifiers().AltPressed)
|
|
{
|
|
vm.OpenResultCommand.Execute(0);
|
|
}
|
|
break;
|
|
|
|
case Key.D2:
|
|
if (GlobalHotkey.Instance.CheckModifiers().AltPressed)
|
|
{
|
|
vm.OpenResultCommand.Execute(1);
|
|
}
|
|
break;
|
|
|
|
case Key.D3:
|
|
if (GlobalHotkey.Instance.CheckModifiers().AltPressed)
|
|
{
|
|
vm.OpenResultCommand.Execute(2);
|
|
}
|
|
break;
|
|
|
|
case Key.D4:
|
|
if (GlobalHotkey.Instance.CheckModifiers().AltPressed)
|
|
{
|
|
vm.OpenResultCommand.Execute(3);
|
|
}
|
|
break;
|
|
|
|
case Key.D5:
|
|
if (GlobalHotkey.Instance.CheckModifiers().AltPressed)
|
|
{
|
|
vm.OpenResultCommand.Execute(4);
|
|
}
|
|
break;
|
|
case Key.D6:
|
|
if (GlobalHotkey.Instance.CheckModifiers().AltPressed)
|
|
{
|
|
vm.OpenResultCommand.Execute(5);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
private void OnPreviewMouseButtonDown(object sender, MouseButtonEventArgs e)
|
|
{
|
|
if (sender != null && e.OriginalSource != null)
|
|
{
|
|
var r = (ResultListBox)sender;
|
|
var d = (DependencyObject)e.OriginalSource;
|
|
var item = ItemsControl.ContainerFromElement(r, d) as ListBoxItem;
|
|
var result = (ResultViewModel)item?.DataContext;
|
|
if (result != null)
|
|
{
|
|
var vm = DataContext as MainViewModel;
|
|
if (vm != null)
|
|
{
|
|
if (vm.ContextMenuVisibility.IsVisible())
|
|
{
|
|
vm.ContextMenu.SelectResult(result);
|
|
}
|
|
else
|
|
{
|
|
vm.Results.SelectResult(result);
|
|
}
|
|
|
|
if (e.ChangedButton == MouseButton.Left)
|
|
{
|
|
vm.OpenResultCommand.Execute(null);
|
|
}
|
|
else if (e.ChangedButton == MouseButton.Right)
|
|
{
|
|
vm.LoadContextMenuCommand.Execute(null);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
private void OnDrop(object sender, DragEventArgs e)
|
|
{
|
|
if (e.Data.GetDataPresent(DataFormats.FileDrop))
|
|
{
|
|
// Note that you can have more than one file.
|
|
string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
|
|
if (files[0].ToLower().EndsWith(".wox"))
|
|
{
|
|
PluginManager.InstallPlugin(files[0]);
|
|
}
|
|
else
|
|
{
|
|
MessageBox.Show(InternationalizationManager.Instance.GetTranslation("invalidWoxPluginFileFormat"));
|
|
}
|
|
}
|
|
e.Handled = false;
|
|
}
|
|
|
|
private void OnPreviewDragOver(object sender, DragEventArgs e)
|
|
{
|
|
e.Handled = true;
|
|
}
|
|
}
|
|
} |