From 69e13a7f378b8342c1aab045b59f93d8db46326d Mon Sep 17 00:00:00 2001 From: 0xb00bface <0xboobface@gmail.com> Date: Sat, 21 Nov 2020 18:45:30 +0100 Subject: [PATCH] Add stop, pause and follow actions to context menu --- .../java/ctbrec/ui/tabs/RecordingsTab.java | 105 +++++++++++------- 1 file changed, 62 insertions(+), 43 deletions(-) diff --git a/client/src/main/java/ctbrec/ui/tabs/RecordingsTab.java b/client/src/main/java/ctbrec/ui/tabs/RecordingsTab.java index 1a1e9f06..668c4a3a 100644 --- a/client/src/main/java/ctbrec/ui/tabs/RecordingsTab.java +++ b/client/src/main/java/ctbrec/ui/tabs/RecordingsTab.java @@ -23,11 +23,13 @@ import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; +import java.util.stream.Collectors; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ctbrec.Config; +import ctbrec.Model; import ctbrec.Recording; import ctbrec.Recording.State; import ctbrec.StringUtil; @@ -45,6 +47,9 @@ import ctbrec.ui.DesktopIntegration; import ctbrec.ui.FileDownload; import ctbrec.ui.JavaFxRecording; import ctbrec.ui.Player; +import ctbrec.ui.action.FollowAction; +import ctbrec.ui.action.PauseAction; +import ctbrec.ui.action.StopRecordingAction; import ctbrec.ui.controls.DateTimeCellFactory; import ctbrec.ui.controls.Dialogs; import ctbrec.ui.controls.Toast; @@ -191,25 +196,23 @@ public class RecordingsTab extends Tab implements TabSelectionListener { } public boolean isDownloadRunning() { - return observableRecordings.stream() - .map(Recording::getStatus) - .anyMatch(s -> s == DOWNLOADING); + return observableRecordings.stream().map(Recording::getStatus).anyMatch(s -> s == DOWNLOADING); } private TableCell createSizeCell() { TableCell cell = new TableCell() { @Override protected void updateItem(Number sizeInByte, boolean empty) { - if(empty || sizeInByte == null) { + if (empty || sizeInByte == null) { setText(null); setStyle(null); } else { setText(StringUtil.formatSize(sizeInByte)); setStyle("-fx-alignment: CENTER-RIGHT;"); - if(Objects.equals(System.getenv("CTBREC_DEV"), "1")) { + if (Objects.equals(System.getenv("CTBREC_DEV"), "1")) { int row = this.getTableRow().getIndex(); JavaFxRecording rec = tableViewProperty().get().getItems().get(row); - if(!rec.valueChanged() && rec.getStatus() == RECORDING) { + if (!rec.valueChanged() && rec.getStatus() == RECORDING) { setStyle("-fx-alignment: CENTER-RIGHT; -fx-background-color: red"); } } @@ -231,26 +234,26 @@ public class RecordingsTab extends Tab implements TabSelectionListener { } private void onMousePressed(MouseEvent event) { - if(popup != null) { + if (popup != null) { popup.hide(); } } private void onMouseClicked(MouseEvent event) { - if(event.getButton() == MouseButton.PRIMARY && event.getClickCount() == 2) { + if (event.getButton() == MouseButton.PRIMARY && event.getClickCount() == 2) { Recording recording = table.getSelectionModel().getSelectedItem(); - if(recording != null) { + if (recording != null) { play(recording); } } } - private void onKeyPressed( KeyEvent event ) { + private void onKeyPressed(KeyEvent event) { List recordings = table.getSelectionModel().getSelectedItems(); if (recordings != null && !recordings.isEmpty()) { State status = recordings.get(0).getStatus(); if (event.getCode() == KeyCode.DELETE) { - if(recordings.size() > 1 || status == FINISHED || status == FAILED || status == WAITING) { + if (recordings.size() > 1 || status == FINISHED || status == FAILED || status == WAITING) { delete(recordings); } } else if (event.getCode() == KeyCode.ENTER && status == FINISHED) { @@ -279,8 +282,8 @@ public class RecordingsTab extends Tab implements TabSelectionListener { } private void updateFreeSpaceDisplay() { - if(spaceTotal != -1 && spaceFree != -1) { - double free = ((double)spaceFree) / spaceTotal; + if (spaceTotal != -1 && spaceFree != -1) { + double free = ((double) spaceFree) / spaceTotal; spaceLeft.setProgress(free); double totalGiB = ((double) spaceTotal) / 1024 / 1024 / 1024; double freeGiB = ((double) spaceFree) / 1024 / 1024 / 1024; @@ -324,7 +327,7 @@ public class RecordingsTab extends Tab implements TabSelectionListener { } private ScheduledService> createUpdateService() { - ScheduledService> service = new ScheduledService>() { + ScheduledService> service = new ScheduledService>() { @Override protected Task> createTask() { return new Task>() { @@ -388,7 +391,7 @@ public class RecordingsTab extends Tab implements TabSelectionListener { JavaFxRecording first = recordings.get(0); MenuItem openInPlayer = new MenuItem("Open in Player"); openInPlayer.setOnAction(e -> play(first)); - if(first.getStatus() == FINISHED || Config.getInstance().getSettings().localRecording) { + if (first.getStatus() == FINISHED || Config.getInstance().getSettings().localRecording) { contextMenu.getItems().add(openInPlayer); } @@ -397,30 +400,33 @@ public class RecordingsTab extends Tab implements TabSelectionListener { openContactSheet.setDisable(first.getContactSheet().isEmpty()); contextMenu.getItems().add(openContactSheet); - // TODO find a way to reenable this - // MenuItem stopRecording = new MenuItem("Stop recording"); - // stopRecording.setOnAction((e) -> { - // Model m = site.createModel(recording.getModelName()); - // try { - // recorder.stopRecording(m); - // } catch (Exception e1) { - // showErrorDialog("Stop recording", "Couldn't stop recording of model " + m.getName(), e1); - // } - // }); - // if(recording.getStatus() == STATUS.RECORDING) { - // contextMenu.getItems().add(stopRecording); - // } + MenuItem stopRecording = new MenuItem("Stop Recording"); + stopRecording.setOnAction(e -> stopRecording(recordings.stream().map(r -> r.getModel()).collect(Collectors.toList()))); + if (recordings.stream().anyMatch(r -> r.getStatus() == RECORDING)) { + contextMenu.getItems().add(stopRecording); + } + + MenuItem pauseRecording = new MenuItem("Pause Recording"); + pauseRecording.setOnAction(e -> pauseRecording(recordings.stream().map(r -> r.getModel()).collect(Collectors.toList()))); + if (recordings.stream().anyMatch(r -> r.getStatus() == RECORDING)) { + contextMenu.getItems().add(pauseRecording); + } MenuItem deleteRecording = new MenuItem("Delete"); deleteRecording.setOnAction(e -> delete(recordings)); - if(first.getStatus() == FINISHED || first.getStatus() == WAITING || first.getStatus() == FAILED || recordings.size() > 1) { + if (first.getStatus() == FINISHED || first.getStatus() == WAITING || first.getStatus() == FAILED || recordings.size() > 1) { contextMenu.getItems().add(deleteRecording); deleteRecording.setDisable(recordings.stream().allMatch(Recording::isPinned)); } + MenuItem followModels = new MenuItem("Follow Model"); + followModels.setOnAction(e -> follow(recordings.stream().map(r -> r.getModel()).collect(Collectors.toList()))); + followModels.setDisable(!recordings.stream().map(r -> r.getModel()).allMatch(m -> m.getSite().supportsFollow() && m.getSite().credentialsAvailable())); + contextMenu.getItems().add(followModels); + MenuItem openDir = new MenuItem("Open directory"); openDir.setOnAction(e -> onOpenDirectory(first)); - if(Config.getInstance().getSettings().localRecording) { + if (Config.getInstance().getSettings().localRecording) { contextMenu.getItems().add(openDir); } @@ -449,7 +455,7 @@ public class RecordingsTab extends Tab implements TabSelectionListener { contextMenu.getItems().add(rerunPostProcessing); rerunPostProcessing.setDisable(!recordings.stream().allMatch(Recording::canBePostProcessed)); - if(recordings.size() > 1) { + if (recordings.size() > 1) { openInPlayer.setDisable(true); openDir.setDisable(true); } @@ -457,6 +463,18 @@ public class RecordingsTab extends Tab implements TabSelectionListener { return contextMenu; } + private void follow(List selectedModels) { + new FollowAction(getTabPane(), selectedModels).execute(); + } + + private void stopRecording(List selectedModels) { + new StopRecordingAction(getTabPane(), selectedModels, recorder).execute(); + } + + private void pauseRecording(List selectedModels) { + new PauseAction(getTabPane(), selectedModels, recorder).execute(); + } + private void openContactSheet(JavaFxRecording recording) { if (config.getSettings().localRecording) { recording.getContactSheet().ifPresent(f -> new Thread(() -> DesktopIntegration.open(f)).start()); @@ -487,7 +505,7 @@ public class RecordingsTab extends Tab implements TabSelectionListener { Node source = getTabPane(); String notes = recording.getNote(); Optional newNote = Dialogs.showTextInput(source.getScene(), "Recording Notes", "", notes); - if(newNote.isPresent()) { + if (newNote.isPresent()) { table.setCursor(Cursor.WAIT); Thread backgroundThread = new Thread(() -> { List exceptions = new ArrayList<>(); @@ -630,7 +648,7 @@ public class RecordingsTab extends Tab implements TabSelectionListener { } private String proposeTargetFilename(Recording recording) { - if(recording.isSingleFile()) { + if (recording.isSingleFile()) { return recording.getPostProcessedFile().getName(); } else { String downloadFilename = config.getSettings().downloadFilename; @@ -665,7 +683,8 @@ public class RecordingsTab extends Tab implements TabSelectionListener { Platform.runLater(() -> { recording.setStatus(FINISHED); recording.setProgress(-1); - RecordingStateChangedEvent evt = new RecordingStateChangedEvent(target, recording.getStatus(), recording.getModel(), recording.getStartDate()); + RecordingStateChangedEvent evt = new RecordingStateChangedEvent(target, recording.getStatus(), recording.getModel(), + recording.getStartDate()); EventBusHolder.BUS.post(evt); }); } @@ -711,7 +730,7 @@ public class RecordingsTab extends Tab implements TabSelectionListener { @Override public void run() { boolean started = Player.play(recording); - if(started && Config.getInstance().getSettings().showPlayerStarting) { + if (started && Config.getInstance().getSettings().showPlayerStarting) { Platform.runLater(() -> Toast.makeText(getTabPane().getScene(), "Starting Player", 2000, 500, 500)); } } @@ -721,7 +740,7 @@ public class RecordingsTab extends Tab implements TabSelectionListener { private void delete(List recordings) { table.setCursor(Cursor.WAIT); String msg; - if(recordings.size() > 1) { + if (recordings.size() > 1) { msg = "Delete " + recordings.size() + " recordings for good?"; } else { Recording r = recordings.get(0); @@ -746,7 +765,7 @@ public class RecordingsTab extends Tab implements TabSelectionListener { List deleted = new ArrayList<>(); List exceptions = new ArrayList<>(); for (Iterator iterator = recordings.iterator(); iterator.hasNext();) { - JavaFxRecording r = iterator.next(); + JavaFxRecording r = iterator.next(); if (r.getStatus() != FINISHED && r.getStatus() != FAILED && r.getStatus() != WAITING) { continue; } @@ -771,7 +790,7 @@ public class RecordingsTab extends Tab implements TabSelectionListener { } public void saveState() { - if(!table.getSortOrder().isEmpty()) { + if (!table.getSortOrder().isEmpty()) { TableColumn col = table.getSortOrder().get(0); Config.getInstance().getSettings().recordingsSortColumn = col.getText(); Config.getInstance().getSettings().recordingsSortType = col.getSortType().toString(); @@ -795,9 +814,9 @@ public class RecordingsTab extends Tab implements TabSelectionListener { private void restoreSorting() { String sortCol = Config.getInstance().getSettings().recordingsSortColumn; - if(StringUtil.isNotBlank(sortCol)) { + if (StringUtil.isNotBlank(sortCol)) { for (TableColumn col : table.getColumns()) { - if(Objects.equals(sortCol, col.getText())) { + if (Objects.equals(sortCol, col.getText())) { col.setSortType(SortType.valueOf(Config.getInstance().getSettings().recordingsSortType)); table.getSortOrder().clear(); table.getSortOrder().add(col); @@ -809,10 +828,10 @@ public class RecordingsTab extends Tab implements TabSelectionListener { private void restoreColumnOrder() { String[] columnIds = Config.getInstance().getSettings().recordingsColumnIds; - ObservableList> columns = table.getColumns(); + ObservableList> columns = table.getColumns(); for (int i = 0; i < columnIds.length; i++) { for (int j = 0; j < table.getColumns().size(); j++) { - if(Objects.equals(columnIds[i], columns.get(j).getId())) { + if (Objects.equals(columnIds[i], columns.get(j).getId())) { TableColumn col = columns.get(j); columns.remove(j); // NOSONAR columns.add(i, col); @@ -823,7 +842,7 @@ public class RecordingsTab extends Tab implements TabSelectionListener { private void restoreColumnWidths() { double[] columnWidths = Config.getInstance().getSettings().recordingsColumnWidths; - if(columnWidths != null && columnWidths.length == table.getColumns().size()) { + if (columnWidths != null && columnWidths.length == table.getColumns().size()) { for (int i = 0; i < columnWidths.length; i++) { table.getColumns().get(i).setPrefWidth(columnWidths[i]); }