diff --git a/client/src/main/java/ctbrec/ui/tabs/recorded/RecordLaterTab.java b/client/src/main/java/ctbrec/ui/tabs/recorded/RecordLaterTab.java index 3844acff..258c0bf9 100644 --- a/client/src/main/java/ctbrec/ui/tabs/recorded/RecordLaterTab.java +++ b/client/src/main/java/ctbrec/ui/tabs/recorded/RecordLaterTab.java @@ -3,7 +3,6 @@ package ctbrec.ui.tabs.recorded; import java.io.IOException; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; -import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Objects; @@ -22,20 +21,17 @@ import ctbrec.StringUtil; import ctbrec.recorder.Recorder; import ctbrec.sites.Site; import ctbrec.ui.AutosizeAlert; -import ctbrec.ui.DesktopIntegration; import ctbrec.ui.JavaFxModel; import ctbrec.ui.PreviewPopupHandler; import ctbrec.ui.action.CheckModelAccountAction; -import ctbrec.ui.action.FollowAction; -import ctbrec.ui.action.IgnoreModelsAction; import ctbrec.ui.action.PlayAction; -import ctbrec.ui.action.ResumeAction; import ctbrec.ui.action.StopRecordingAction; import ctbrec.ui.controls.CustomMouseBehaviorContextMenu; import ctbrec.ui.controls.Dialogs; import ctbrec.ui.controls.SearchBox; import ctbrec.ui.controls.autocomplete.AutoFillTextField; import ctbrec.ui.controls.autocomplete.ObservableListSuggester; +import ctbrec.ui.menu.ModelMenuContributor; import ctbrec.ui.tabs.TabSelectionListener; import ctbrec.ui.tabs.recorded.RecordedModelsTab.ModelName; import javafx.application.Platform; @@ -50,11 +46,11 @@ import javafx.concurrent.WorkerStateEvent; import javafx.event.ActionEvent; import javafx.geometry.Insets; import javafx.geometry.Pos; +import javafx.scene.Cursor; import javafx.scene.control.Alert; import javafx.scene.control.Button; import javafx.scene.control.ContextMenu; import javafx.scene.control.Label; -import javafx.scene.control.MenuItem; import javafx.scene.control.ScrollPane; import javafx.scene.control.SelectionMode; import javafx.scene.control.Tab; @@ -66,8 +62,6 @@ import javafx.scene.control.TableView; import javafx.scene.control.TextField; import javafx.scene.control.Tooltip; import javafx.scene.control.cell.PropertyValueFactory; -import javafx.scene.input.Clipboard; -import javafx.scene.input.ClipboardContent; import javafx.scene.input.ContextMenuEvent; import javafx.scene.input.KeyCode; import javafx.scene.input.KeyEvent; @@ -474,61 +468,21 @@ public class RecordLaterTab extends Tab implements TabSelectionListener { } private ContextMenu createContextMenu() { - ObservableList selectedModels = table.getSelectionModel().getSelectedItems(); + List selectedModels = table.getSelectionModel().getSelectedItems().stream().map(JavaFxModel::getDelegate).collect(Collectors.toList()); if (selectedModels.isEmpty()) { return null; } - var start = new MenuItem("Start Recording"); - start.setOnAction(e -> startAction(selectedModels)); - var stop = new MenuItem("Remove Model"); - stop.setOnAction(e -> stopAction(selectedModels)); - var copyUrl = new MenuItem("Copy URL"); - copyUrl.setOnAction(e -> { - Model selected = selectedModels.get(0); - final var content = new ClipboardContent(); - content.putString(selected.getUrl()); - Clipboard.getSystemClipboard().setContent(content); - }); + ContextMenu menu = new CustomMouseBehaviorContextMenu(); - var openInBrowser = new MenuItem("Open in Browser"); - openInBrowser.setOnAction(e -> DesktopIntegration.open(selectedModels.get(0).getUrl())); - var openInPlayer = new MenuItem("Open in Player"); - openInPlayer.setOnAction(e -> openInPlayer(selectedModels.get(0))); - var follow = new MenuItem("Follow"); - follow.setOnAction(e -> follow(selectedModels)); - follow.setDisable(!selectedModels.stream().allMatch(m -> m.getSite().supportsFollow() && m.getSite().credentialsAvailable())); - var ignore = new MenuItem("Ignore"); - ignore.setOnAction(e -> ignore(selectedModels)); - - ContextMenu menu = new CustomMouseBehaviorContextMenu(start, stop, copyUrl, openInPlayer, openInBrowser, follow, ignore); - - if (selectedModels.size() > 1) { - copyUrl.setDisable(true); - openInPlayer.setDisable(true); - openInBrowser.setDisable(true); - } + ModelMenuContributor.newContributor(getTabPane(), Config.getInstance(), recorder) // + .withStartStopCallback(m -> getTabPane().setCursor(Cursor.DEFAULT)) // + .afterwards(table::refresh) + .contributeToMenu(selectedModels, menu); return menu; } - private void ignore(ObservableList selectedModels) { - new IgnoreModelsAction(table, selectedModels, recorder, true).execute(); - } - - private void follow(ObservableList selectedModels) { - new FollowAction(getTabPane(), new ArrayList<>(selectedModels)).execute(); - } - - private void openInPlayer(JavaFxModel selectedModel) { - new PlayAction(getTabPane(), selectedModel).execute(); - } - - private void startAction(List selectedModels) { - List models = selectedModels.stream().map(JavaFxModel::getDelegate).collect(Collectors.toList()); - new ResumeAction(table, models, recorder).execute(); - } - private void stopAction(List selectedModels) { var confirmed = true; if (Config.getInstance().getSettings().confirmationForDangerousActions) {