Ignore menu item action if mouse exited the menu item

This commit is contained in:
0xb00bface 2021-01-03 13:00:05 +01:00
parent 0df02b8c9d
commit 19d2644500
7 changed files with 43 additions and 15 deletions

View File

@ -1,5 +1,7 @@
package ctbrec.ui; package ctbrec.ui;
import javafx.geometry.Bounds;
import javafx.scene.Node;
import javafx.scene.control.ContextMenu; import javafx.scene.control.ContextMenu;
import javafx.scene.input.MouseButton; import javafx.scene.input.MouseButton;
import javafx.scene.input.MouseEvent; 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();
}
}
});
}
} }

View File

@ -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);
}
}

View File

@ -46,6 +46,7 @@ import ctbrec.ui.DesktopIntegration;
import ctbrec.ui.action.FollowAction; import ctbrec.ui.action.FollowAction;
import ctbrec.ui.action.PlayAction; import ctbrec.ui.action.PlayAction;
import ctbrec.ui.action.StartRecordingAction; import ctbrec.ui.action.StartRecordingAction;
import ctbrec.ui.controls.CustomMouseBehaviorContextMenu;
import ctbrec.ui.controls.SearchBox; import ctbrec.ui.controls.SearchBox;
import ctbrec.ui.tabs.TabSelectionListener; import ctbrec.ui.tabs.TabSelectionListener;
import javafx.beans.property.BooleanProperty; import javafx.beans.property.BooleanProperty;
@ -342,7 +343,7 @@ public class MyFreeCamsTableTab extends Tab implements TabSelectionListener {
MenuItem follow = new MenuItem("Follow"); MenuItem follow = new MenuItem("Follow");
follow.setOnAction(e -> new FollowAction(getTabPane(), selectedModels).execute()); follow.setOnAction(e -> new FollowAction(getTabPane(), selectedModels).execute());
ContextMenu menu = new ContextMenu(); ContextMenu menu = new CustomMouseBehaviorContextMenu();
menu.getItems().addAll(startRecording, copyUrl, openInPlayer, openInBrowser, follow); menu.getItems().addAll(startRecording, copyUrl, openInPlayer, openInBrowser, follow);
if (selectedModels.size() > 1) { if (selectedModels.size() > 1) {
@ -468,7 +469,7 @@ public class MyFreeCamsTableTab extends Tab implements TabSelectionListener {
} }
private void showColumnSelection(ActionEvent evt) { private void showColumnSelection(ActionEvent evt) {
ContextMenu menu = new ContextMenu(); ContextMenu menu = new CustomMouseBehaviorContextMenu();
for (TableColumn<ModelTableRow, ?> tc : columns) { for (TableColumn<ModelTableRow, ?> tc : columns) {
CheckMenuItem item = new CheckMenuItem(tc.getText()); CheckMenuItem item = new CheckMenuItem(tc.getText());
item.setSelected(isColumnEnabled(tc)); item.setSelected(isColumnEnabled(tc));

View File

@ -39,7 +39,6 @@ import ctbrec.ui.DesktopIntegration;
import ctbrec.ui.JavaFxModel; import ctbrec.ui.JavaFxModel;
import ctbrec.ui.PreviewPopupHandler; import ctbrec.ui.PreviewPopupHandler;
import ctbrec.ui.StreamSourceSelectionDialog; import ctbrec.ui.StreamSourceSelectionDialog;
import ctbrec.ui.UiUtils;
import ctbrec.ui.action.CheckModelAccountAction; import ctbrec.ui.action.CheckModelAccountAction;
import ctbrec.ui.action.EditNotesAction; import ctbrec.ui.action.EditNotesAction;
import ctbrec.ui.action.FollowAction; import ctbrec.ui.action.FollowAction;
@ -52,6 +51,7 @@ import ctbrec.ui.action.ResumeAction;
import ctbrec.ui.action.SetStopDateAction; import ctbrec.ui.action.SetStopDateAction;
import ctbrec.ui.action.StopRecordingAction; import ctbrec.ui.action.StopRecordingAction;
import ctbrec.ui.action.ToggleRecordingAction; import ctbrec.ui.action.ToggleRecordingAction;
import ctbrec.ui.controls.CustomMouseBehaviorContextMenu;
import ctbrec.ui.controls.DateTimeCellFactory; import ctbrec.ui.controls.DateTimeCellFactory;
import ctbrec.ui.controls.Dialogs; import ctbrec.ui.controls.Dialogs;
import ctbrec.ui.controls.SearchBox; import ctbrec.ui.controls.SearchBox;
@ -675,8 +675,7 @@ public class RecordedModelsTab extends Tab implements TabSelectionListener {
MenuItem openRecDir = new MenuItem("Open recording directory"); MenuItem openRecDir = new MenuItem("Open recording directory");
openRecDir.setOnAction(e -> new OpenRecordingsDir(table, selectedModels.get(0)).execute()); openRecDir.setOnAction(e -> new OpenRecordingsDir(table, selectedModels.get(0)).execute());
ContextMenu menu = new ContextMenu(stop); ContextMenu menu = new CustomMouseBehaviorContextMenu(stop);
UiUtils.disableRightClickFor(menu);
if (selectedModels.size() == 1) { if (selectedModels.size() == 1) {
menu.getItems().add(selectedModels.get(0).isSuspended() ? resumeRecording : pauseRecording); menu.getItems().add(selectedModels.get(0).isSuspended() ? resumeRecording : pauseRecording);
menu.getItems().add(stopRecordingAt); menu.getItems().add(stopRecordingAt);

View File

@ -46,11 +46,11 @@ import ctbrec.ui.DesktopIntegration;
import ctbrec.ui.FileDownload; import ctbrec.ui.FileDownload;
import ctbrec.ui.JavaFxRecording; import ctbrec.ui.JavaFxRecording;
import ctbrec.ui.Player; import ctbrec.ui.Player;
import ctbrec.ui.UiUtils;
import ctbrec.ui.action.FollowAction; import ctbrec.ui.action.FollowAction;
import ctbrec.ui.action.PauseAction; import ctbrec.ui.action.PauseAction;
import ctbrec.ui.action.PlayAction; import ctbrec.ui.action.PlayAction;
import ctbrec.ui.action.StopRecordingAction; import ctbrec.ui.action.StopRecordingAction;
import ctbrec.ui.controls.CustomMouseBehaviorContextMenu;
import ctbrec.ui.controls.DateTimeCellFactory; import ctbrec.ui.controls.DateTimeCellFactory;
import ctbrec.ui.controls.Dialogs; import ctbrec.ui.controls.Dialogs;
import ctbrec.ui.controls.Toast; import ctbrec.ui.controls.Toast;
@ -390,11 +390,10 @@ public class RecordingsTab extends Tab implements TabSelectionListener {
} }
private ContextMenu createContextMenu(List<JavaFxRecording> recordings) { private ContextMenu createContextMenu(List<JavaFxRecording> recordings) {
ContextMenu contextMenu = new ContextMenu(); ContextMenu contextMenu = new CustomMouseBehaviorContextMenu();
contextMenu.setHideOnEscape(true); contextMenu.setHideOnEscape(true);
contextMenu.setAutoHide(true); contextMenu.setAutoHide(true);
contextMenu.setAutoFix(true); contextMenu.setAutoFix(true);
UiUtils.disableRightClickFor(contextMenu);
JavaFxRecording first = recordings.get(0); JavaFxRecording first = recordings.get(0);
MenuItem openInPlayer = new MenuItem("Open in Player"); MenuItem openInPlayer = new MenuItem("Open in Player");

View File

@ -38,10 +38,10 @@ import ctbrec.ui.DesktopIntegration;
import ctbrec.ui.SiteUiFactory; import ctbrec.ui.SiteUiFactory;
import ctbrec.ui.TipDialog; import ctbrec.ui.TipDialog;
import ctbrec.ui.TokenLabel; import ctbrec.ui.TokenLabel;
import ctbrec.ui.UiUtils;
import ctbrec.ui.action.IgnoreModelsAction; import ctbrec.ui.action.IgnoreModelsAction;
import ctbrec.ui.action.OpenRecordingsDir; import ctbrec.ui.action.OpenRecordingsDir;
import ctbrec.ui.action.SetStopDateAction; import ctbrec.ui.action.SetStopDateAction;
import ctbrec.ui.controls.CustomMouseBehaviorContextMenu;
import ctbrec.ui.controls.FasterVerticalScrollPaneSkin; import ctbrec.ui.controls.FasterVerticalScrollPaneSkin;
import ctbrec.ui.controls.SearchBox; import ctbrec.ui.controls.SearchBox;
import ctbrec.ui.controls.SearchPopover; import ctbrec.ui.controls.SearchPopover;
@ -477,10 +477,10 @@ public class ThumbOverviewTab extends Tab implements TabSelectionListener {
openInPlayer.setOnAction(e -> startPlayer(getSelectedThumbCells(cell))); openInPlayer.setOnAction(e -> startPlayer(getSelectedThumbCells(cell)));
MenuItem start = new MenuItem("Start Recording"); 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"); 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 startStop = recorder.isTracked(cell.getModel()) ? stop : start;
MenuItem recordUntil = new MenuItem("Start Recording Until"); MenuItem recordUntil = new MenuItem("Start Recording Until");
@ -515,12 +515,11 @@ public class ThumbOverviewTab extends Tab implements TabSelectionListener {
configureItemsForSelection(cell, openInPlayer, copyUrl, sendTip); configureItemsForSelection(cell, openInPlayer, copyUrl, sendTip);
ContextMenu contextMenu = new ContextMenu(); ContextMenu contextMenu = new CustomMouseBehaviorContextMenu();
contextMenu.setAutoHide(true); contextMenu.setAutoHide(true);
contextMenu.setHideOnEscape(true); contextMenu.setHideOnEscape(true);
contextMenu.setAutoFix(true); contextMenu.setAutoFix(true);
contextMenu.getItems().addAll(openInPlayer, new SeparatorMenuItem(), startStop); contextMenu.getItems().addAll(openInPlayer, new SeparatorMenuItem(), startStop);
UiUtils.disableRightClickFor(contextMenu);
if(modelIsTrackedByRecorder) { if(modelIsTrackedByRecorder) {
contextMenu.getItems().add(pauseResume); contextMenu.getItems().add(pauseResume);
} else { } else {
@ -704,7 +703,7 @@ public class ThumbOverviewTab extends Tab implements TabSelectionListener {
return 0; return 0;
} }
private void startStopAction(ActionEvent e, List<ThumbCell> selection, boolean start) { private void startStopAction(List<ThumbCell> selection, boolean start) {
for (ThumbCell thumbCell : selection) { for (ThumbCell thumbCell : selection) {
thumbCell.startStopAction(start); thumbCell.startStopAction(start);
} }

View File

@ -18,6 +18,7 @@ import ch.qos.logback.classic.spi.IThrowableProxy;
import ch.qos.logback.classic.spi.LoggingEvent; import ch.qos.logback.classic.spi.LoggingEvent;
import ch.qos.logback.classic.spi.StackTraceElementProxy; import ch.qos.logback.classic.spi.StackTraceElementProxy;
import ctbrec.event.EventBusHolder; import ctbrec.event.EventBusHolder;
import ctbrec.ui.controls.CustomMouseBehaviorContextMenu;
import ctbrec.ui.controls.SearchBox; import ctbrec.ui.controls.SearchBox;
import javafx.application.Platform; import javafx.application.Platform;
import javafx.beans.property.SimpleStringProperty; 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; return menu;
} }