From 19d264450059ee111e756ae3f4f690ea879b379c Mon Sep 17 00:00:00 2001 From: 0xb00bface <0xboobface@gmail.com> Date: Sun, 3 Jan 2021 13:00:05 +0100 Subject: [PATCH] Ignore menu item action if mouse exited the menu item --- client/src/main/java/ctbrec/ui/UiUtils.java | 15 +++++++++++++++ .../controls/CustomMouseBehaviorContextMenu.java | 14 ++++++++++++++ .../ui/sites/myfreecams/MyFreeCamsTableTab.java | 5 +++-- .../java/ctbrec/ui/tabs/RecordedModelsTab.java | 5 ++--- .../main/java/ctbrec/ui/tabs/RecordingsTab.java | 5 ++--- .../java/ctbrec/ui/tabs/ThumbOverviewTab.java | 11 +++++------ .../java/ctbrec/ui/tabs/logging/LoggingTab.java | 3 ++- 7 files changed, 43 insertions(+), 15 deletions(-) create mode 100644 client/src/main/java/ctbrec/ui/controls/CustomMouseBehaviorContextMenu.java diff --git a/client/src/main/java/ctbrec/ui/UiUtils.java b/client/src/main/java/ctbrec/ui/UiUtils.java index 3edeb2ba..a4e1cb96 100644 --- a/client/src/main/java/ctbrec/ui/UiUtils.java +++ b/client/src/main/java/ctbrec/ui/UiUtils.java @@ -1,5 +1,7 @@ package ctbrec.ui; +import javafx.geometry.Bounds; +import javafx.scene.Node; import javafx.scene.control.ContextMenu; import javafx.scene.input.MouseButton; import javafx.scene.input.MouseEvent; @@ -15,4 +17,17 @@ public class UiUtils { } }); } + + public static void ignoreMouseReleasedIfMouseExited(ContextMenu menu) { + menu.addEventFilter(MouseEvent.MOUSE_RELEASED, evt -> { + if (evt.getTarget() instanceof Node) { + Node target = (Node) evt.getTarget(); + Bounds screenBounds = target.localToScreen(target.getBoundsInLocal()); + boolean releasedOnOriginalMouseItem = screenBounds.contains(evt.getScreenX(), evt.getScreenY()); + if (!releasedOnOriginalMouseItem) { + evt.consume(); + } + } + }); + } } diff --git a/client/src/main/java/ctbrec/ui/controls/CustomMouseBehaviorContextMenu.java b/client/src/main/java/ctbrec/ui/controls/CustomMouseBehaviorContextMenu.java new file mode 100644 index 00000000..8b472c71 --- /dev/null +++ b/client/src/main/java/ctbrec/ui/controls/CustomMouseBehaviorContextMenu.java @@ -0,0 +1,14 @@ +package ctbrec.ui.controls; + +import ctbrec.ui.UiUtils; +import javafx.scene.control.ContextMenu; +import javafx.scene.control.MenuItem; + +public class CustomMouseBehaviorContextMenu extends ContextMenu { + + public CustomMouseBehaviorContextMenu(MenuItem...items) { + super(items); + UiUtils.disableRightClickFor(this); + UiUtils.ignoreMouseReleasedIfMouseExited(this); + } +} diff --git a/client/src/main/java/ctbrec/ui/sites/myfreecams/MyFreeCamsTableTab.java b/client/src/main/java/ctbrec/ui/sites/myfreecams/MyFreeCamsTableTab.java index 9d283491..427a4174 100644 --- a/client/src/main/java/ctbrec/ui/sites/myfreecams/MyFreeCamsTableTab.java +++ b/client/src/main/java/ctbrec/ui/sites/myfreecams/MyFreeCamsTableTab.java @@ -46,6 +46,7 @@ import ctbrec.ui.DesktopIntegration; import ctbrec.ui.action.FollowAction; import ctbrec.ui.action.PlayAction; import ctbrec.ui.action.StartRecordingAction; +import ctbrec.ui.controls.CustomMouseBehaviorContextMenu; import ctbrec.ui.controls.SearchBox; import ctbrec.ui.tabs.TabSelectionListener; import javafx.beans.property.BooleanProperty; @@ -342,7 +343,7 @@ public class MyFreeCamsTableTab extends Tab implements TabSelectionListener { MenuItem follow = new MenuItem("Follow"); follow.setOnAction(e -> new FollowAction(getTabPane(), selectedModels).execute()); - ContextMenu menu = new ContextMenu(); + ContextMenu menu = new CustomMouseBehaviorContextMenu(); menu.getItems().addAll(startRecording, copyUrl, openInPlayer, openInBrowser, follow); if (selectedModels.size() > 1) { @@ -468,7 +469,7 @@ public class MyFreeCamsTableTab extends Tab implements TabSelectionListener { } private void showColumnSelection(ActionEvent evt) { - ContextMenu menu = new ContextMenu(); + ContextMenu menu = new CustomMouseBehaviorContextMenu(); for (TableColumn tc : columns) { CheckMenuItem item = new CheckMenuItem(tc.getText()); item.setSelected(isColumnEnabled(tc)); diff --git a/client/src/main/java/ctbrec/ui/tabs/RecordedModelsTab.java b/client/src/main/java/ctbrec/ui/tabs/RecordedModelsTab.java index a584d319..9c9dbc69 100644 --- a/client/src/main/java/ctbrec/ui/tabs/RecordedModelsTab.java +++ b/client/src/main/java/ctbrec/ui/tabs/RecordedModelsTab.java @@ -39,7 +39,6 @@ import ctbrec.ui.DesktopIntegration; import ctbrec.ui.JavaFxModel; import ctbrec.ui.PreviewPopupHandler; import ctbrec.ui.StreamSourceSelectionDialog; -import ctbrec.ui.UiUtils; import ctbrec.ui.action.CheckModelAccountAction; import ctbrec.ui.action.EditNotesAction; import ctbrec.ui.action.FollowAction; @@ -52,6 +51,7 @@ import ctbrec.ui.action.ResumeAction; import ctbrec.ui.action.SetStopDateAction; import ctbrec.ui.action.StopRecordingAction; import ctbrec.ui.action.ToggleRecordingAction; +import ctbrec.ui.controls.CustomMouseBehaviorContextMenu; import ctbrec.ui.controls.DateTimeCellFactory; import ctbrec.ui.controls.Dialogs; import ctbrec.ui.controls.SearchBox; @@ -675,8 +675,7 @@ public class RecordedModelsTab extends Tab implements TabSelectionListener { MenuItem openRecDir = new MenuItem("Open recording directory"); openRecDir.setOnAction(e -> new OpenRecordingsDir(table, selectedModels.get(0)).execute()); - ContextMenu menu = new ContextMenu(stop); - UiUtils.disableRightClickFor(menu); + ContextMenu menu = new CustomMouseBehaviorContextMenu(stop); if (selectedModels.size() == 1) { menu.getItems().add(selectedModels.get(0).isSuspended() ? resumeRecording : pauseRecording); menu.getItems().add(stopRecordingAt); diff --git a/client/src/main/java/ctbrec/ui/tabs/RecordingsTab.java b/client/src/main/java/ctbrec/ui/tabs/RecordingsTab.java index 11485d5e..612e985e 100644 --- a/client/src/main/java/ctbrec/ui/tabs/RecordingsTab.java +++ b/client/src/main/java/ctbrec/ui/tabs/RecordingsTab.java @@ -46,11 +46,11 @@ import ctbrec.ui.DesktopIntegration; import ctbrec.ui.FileDownload; import ctbrec.ui.JavaFxRecording; import ctbrec.ui.Player; -import ctbrec.ui.UiUtils; import ctbrec.ui.action.FollowAction; import ctbrec.ui.action.PauseAction; import ctbrec.ui.action.PlayAction; import ctbrec.ui.action.StopRecordingAction; +import ctbrec.ui.controls.CustomMouseBehaviorContextMenu; import ctbrec.ui.controls.DateTimeCellFactory; import ctbrec.ui.controls.Dialogs; import ctbrec.ui.controls.Toast; @@ -390,11 +390,10 @@ public class RecordingsTab extends Tab implements TabSelectionListener { } private ContextMenu createContextMenu(List recordings) { - ContextMenu contextMenu = new ContextMenu(); + ContextMenu contextMenu = new CustomMouseBehaviorContextMenu(); contextMenu.setHideOnEscape(true); contextMenu.setAutoHide(true); contextMenu.setAutoFix(true); - UiUtils.disableRightClickFor(contextMenu); JavaFxRecording first = recordings.get(0); MenuItem openInPlayer = new MenuItem("Open in Player"); diff --git a/client/src/main/java/ctbrec/ui/tabs/ThumbOverviewTab.java b/client/src/main/java/ctbrec/ui/tabs/ThumbOverviewTab.java index 4149eceb..c12ffc75 100644 --- a/client/src/main/java/ctbrec/ui/tabs/ThumbOverviewTab.java +++ b/client/src/main/java/ctbrec/ui/tabs/ThumbOverviewTab.java @@ -38,10 +38,10 @@ import ctbrec.ui.DesktopIntegration; import ctbrec.ui.SiteUiFactory; import ctbrec.ui.TipDialog; import ctbrec.ui.TokenLabel; -import ctbrec.ui.UiUtils; import ctbrec.ui.action.IgnoreModelsAction; import ctbrec.ui.action.OpenRecordingsDir; import ctbrec.ui.action.SetStopDateAction; +import ctbrec.ui.controls.CustomMouseBehaviorContextMenu; import ctbrec.ui.controls.FasterVerticalScrollPaneSkin; import ctbrec.ui.controls.SearchBox; import ctbrec.ui.controls.SearchPopover; @@ -477,10 +477,10 @@ public class ThumbOverviewTab extends Tab implements TabSelectionListener { openInPlayer.setOnAction(e -> startPlayer(getSelectedThumbCells(cell))); MenuItem start = new MenuItem("Start Recording"); - start.setOnAction(e -> startStopAction(e, getSelectedThumbCells(cell), true)); + start.setOnAction(e -> startStopAction(getSelectedThumbCells(cell), true)); MenuItem stop = new MenuItem("Stop Recording"); - stop.setOnAction(e -> startStopAction(e, getSelectedThumbCells(cell), false)); + stop.setOnAction(e -> startStopAction(getSelectedThumbCells(cell), false)); MenuItem startStop = recorder.isTracked(cell.getModel()) ? stop : start; MenuItem recordUntil = new MenuItem("Start Recording Until"); @@ -515,12 +515,11 @@ public class ThumbOverviewTab extends Tab implements TabSelectionListener { configureItemsForSelection(cell, openInPlayer, copyUrl, sendTip); - ContextMenu contextMenu = new ContextMenu(); + ContextMenu contextMenu = new CustomMouseBehaviorContextMenu(); contextMenu.setAutoHide(true); contextMenu.setHideOnEscape(true); contextMenu.setAutoFix(true); contextMenu.getItems().addAll(openInPlayer, new SeparatorMenuItem(), startStop); - UiUtils.disableRightClickFor(contextMenu); if(modelIsTrackedByRecorder) { contextMenu.getItems().add(pauseResume); } else { @@ -704,7 +703,7 @@ public class ThumbOverviewTab extends Tab implements TabSelectionListener { return 0; } - private void startStopAction(ActionEvent e, List selection, boolean start) { + private void startStopAction(List selection, boolean start) { for (ThumbCell thumbCell : selection) { thumbCell.startStopAction(start); } diff --git a/client/src/main/java/ctbrec/ui/tabs/logging/LoggingTab.java b/client/src/main/java/ctbrec/ui/tabs/logging/LoggingTab.java index c52b9aa8..ec7fe254 100644 --- a/client/src/main/java/ctbrec/ui/tabs/logging/LoggingTab.java +++ b/client/src/main/java/ctbrec/ui/tabs/logging/LoggingTab.java @@ -18,6 +18,7 @@ import ch.qos.logback.classic.spi.IThrowableProxy; import ch.qos.logback.classic.spi.LoggingEvent; import ch.qos.logback.classic.spi.StackTraceElementProxy; import ctbrec.event.EventBusHolder; +import ctbrec.ui.controls.CustomMouseBehaviorContextMenu; import ctbrec.ui.controls.SearchBox; import javafx.application.Platform; import javafx.beans.property.SimpleStringProperty; @@ -150,7 +151,7 @@ public class LoggingTab extends Tab { }); }); - ContextMenu menu = new ContextMenu(copy); + ContextMenu menu = new CustomMouseBehaviorContextMenu(copy); return menu; }