// マウスジェスチャ ホールドクリック時 private void MouseGestureHoldClick(object sender, EventArgs e) { MouseGestureInput gestureInput = new MouseGestureInput(mouseGesture.StartingButton, mouseGesture.Stroke); if (gestureInput.Stroke.Length > 0) { CommandMap commandMap; ICommand cmd = GetCommandFromMouseGestureInput(gestureInput, out commandMap); if (cmd != null && commandMap != null) { // コマンドがマッチした場合 MainWindow.Current.NotificationBlock.Hide(NotificationType.GesturePreview); // 現在のストロークから、最後のクリックストロークを削除(ボタンをホールドしたまま、別のボタンのコマンドも押せるように) mouseGesture.RemoveLastClickStroke(); // 削除後のストロークを保持。マウスジェスチャ完了時に被るならば、コマンド発行させない strokeOfLastExecutedCommand = mouseGesture.Stroke; Debug.WriteLine("strokeOfLastExecutedCommand: " + mouseGesture.Stroke); // コマンド実行 ExecuteCommand(cmd, commandMap.CommandValue, commandMap.CommandStrValue); } return; } }
/* ---------------------------------------------------- */ // EventHandler (マウスジェスチャ) /* ---------------------------------------------------- */ private void MouseGestureStrokeChanged(object sender, EventArgs e) { // 1つでもジェスチャがあれば、開始ボタンによるMouseUp時のコマンドは無効化 mouseButtonStateSet.CommandExecuted(mouseGesture.StartingButton); // 長押しクリック判定解除 StopLongClick(); // 現在のストロークと、一致するコマンドを通知ブロックに表示 MouseGestureInput gestureInput = new MouseGestureInput(mouseGesture.StartingButton, mouseGesture.Stroke); string notification = gestureInput.ToString(); CommandMap commandMap; ICommand cmd = GetCommandFromMouseGestureInput(gestureInput, out commandMap); if (cmd != null) { // マウスホイールの場合は、即HoldClickイベントでコマンドが実行されるので、通知表示しない if (gestureInput.Stroke.EndsWith("[WU]") || gestureInput.Stroke.EndsWith("[WD]")) { return; } if (cmd.EnableValue) { cmd.Value = commandMap.CommandValue; } if (cmd.EnableStrValue) { cmd.StrValue = commandMap.CommandStrValue; } notification += " [" + cmd.GetDetail() + "]"; } MainWindow.Current.NotificationBlock.Show(notification, NotificationPriority.Normal, NotificationTime.Eternally, NotificationType.GesturePreview); }
/// <summary> /// マウスジェスチャから、コマンド取得 /// </summary> /// <param name="stroke"></param> /// <returns>コマンド</returns> private ICommand GetCommandFromMouseGestureInput(MouseGestureInput gestureInput, out CommandMap _commandMap) { Scene currentScene = GetCurrentScene(); foreach (CommandMap commandMap in shortcutSetting.CommandMap) { if (commandMap.MouseGestureInput == null) { continue; } if (commandMap.MouseGestureInput.Equals(gestureInput)) { ICommand cmd = GetCommand(commandMap.CommandID); if (cmd == null) { continue; } if (cmd.Scene == Scene.All || cmd.Scene == currentScene) { _commandMap = commandMap; return(cmd); } } } _commandMap = null; return(null); }
// マウスジェスチャ 完了時 private void MouseGestureFinished(object sender, EventArgs e) { MouseGestureInput gestureInput = new MouseGestureInput(mouseGesture.StartingButton, mouseGesture.Stroke); MainWindow.Current.NotificationBlock.Hide(NotificationType.GesturePreview); if (gestureInput.Stroke.Length > 0 && gestureInput.Stroke != strokeOfLastExecutedCommand) { DispatchMouseGestureInput(gestureInput); return; } }
/// <summary> /// マウスジェスチャのストロークから、コマンド実行 /// </summary> /// <param name="stroke"></param> /// <returns>コマンドを実行したかどうか</returns> private bool DispatchMouseGestureInput(MouseGestureInput gestureInput) { CommandMap commandMap; ICommand cmd = GetCommandFromMouseGestureInput(gestureInput, out commandMap); if (cmd != null) { ExecuteCommand(cmd, commandMap.CommandValue, commandMap.CommandStrValue); return(true); } return(false); }