From 40b3b78e5289a20741fa45e2341ea09ae61a869b Mon Sep 17 00:00:00 2001 From: 0xboobface <0xboobface@gmail.com> Date: Fri, 30 Nov 2018 15:21:01 +0100 Subject: [PATCH] Implement multi-selection for Recordings table --- .../main/java/ctbrec/ui/RecordingsTab.java | 75 ++++++++++++------- 1 file changed, 48 insertions(+), 27 deletions(-) diff --git a/client/src/main/java/ctbrec/ui/RecordingsTab.java b/client/src/main/java/ctbrec/ui/RecordingsTab.java index 439cd5e4..44a43e9d 100644 --- a/client/src/main/java/ctbrec/ui/RecordingsTab.java +++ b/client/src/main/java/ctbrec/ui/RecordingsTab.java @@ -53,6 +53,7 @@ import javafx.scene.control.Label; import javafx.scene.control.MenuItem; import javafx.scene.control.ProgressBar; import javafx.scene.control.ScrollPane; +import javafx.scene.control.SelectionMode; import javafx.scene.control.Tab; import javafx.scene.control.TableCell; import javafx.scene.control.TableColumn; @@ -115,6 +116,7 @@ public class RecordingsTab extends Tab implements TabSelectionListener { BorderPane.setMargin(scrollPane, new Insets(5)); table.setEditable(false); + table.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE); TableColumn name = new TableColumn<>("Model"); name.setPrefWidth(200); name.setCellValueFactory(new PropertyValueFactory("modelName")); @@ -183,9 +185,9 @@ public class RecordingsTab extends Tab implements TabSelectionListener { table.getColumns().addAll(name, date, status, progress, size); table.setItems(observableRecordings); table.addEventHandler(ContextMenuEvent.CONTEXT_MENU_REQUESTED, event -> { - Recording recording = table.getSelectionModel().getSelectedItem(); - if(recording != null) { - popup = createContextMenu(recording); + List recordings = table.getSelectionModel().getSelectedItems(); + if(recordings != null && !recordings.isEmpty()) { + popup = createContextMenu(recordings); if(!popup.getItems().isEmpty()) { popup.show(table, event.getScreenX(), event.getScreenY()); } @@ -206,13 +208,15 @@ public class RecordingsTab extends Tab implements TabSelectionListener { } }); table.addEventFilter(KeyEvent.KEY_PRESSED, event -> { - JavaFxRecording recording = table.getSelectionModel().getSelectedItem(); - if (recording != null) { + List recordings = table.getSelectionModel().getSelectedItems(); + if (recordings != null && !recordings.isEmpty()) { if (event.getCode() == KeyCode.DELETE) { - delete(recording); + if(recordings.size() > 1 || recordings.get(0).getStatus() == STATUS.FINISHED) { + delete(recordings); + } } else if (event.getCode() == KeyCode.ENTER) { - if(recording.getStatus() == STATUS.FINISHED) { - play(recording); + if(recordings.get(0).getStatus() == STATUS.FINISHED) { + play(recordings.get(0)); } } } @@ -356,7 +360,7 @@ public class RecordingsTab extends Tab implements TabSelectionListener { } } - private ContextMenu createContextMenu(Recording recording) { + private ContextMenu createContextMenu(List recordings) { ContextMenu contextMenu = new ContextMenu(); contextMenu.setHideOnEscape(true); contextMenu.setAutoHide(true); @@ -364,9 +368,9 @@ public class RecordingsTab extends Tab implements TabSelectionListener { MenuItem openInPlayer = new MenuItem("Open in Player"); openInPlayer.setOnAction((e) -> { - play(recording); + play(recordings.get(0)); }); - if(recording.getStatus() == STATUS.FINISHED || Config.getInstance().getSettings().localRecording) { + if(recordings.get(0).getStatus() == STATUS.FINISHED || Config.getInstance().getSettings().localRecording) { contextMenu.getItems().add(openInPlayer); } @@ -386,16 +390,16 @@ public class RecordingsTab extends Tab implements TabSelectionListener { MenuItem deleteRecording = new MenuItem("Delete"); deleteRecording.setOnAction((e) -> { - delete(recording); + delete(recordings); }); - if(recording.getStatus() == STATUS.FINISHED) { + if(recordings.get(0).getStatus() == STATUS.FINISHED || recordings.size() > 1) { contextMenu.getItems().add(deleteRecording); } MenuItem openDir = new MenuItem("Open directory"); openDir.setOnAction((e) -> { String recordingsDir = Config.getInstance().getSettings().recordingsDir; - String path = recording.getPath(); + String path = recordings.get(0).getPath(); File tsFile = new File(recordingsDir, path); new Thread(() -> { DesktopIntegration.open(tsFile.getParent()); @@ -408,16 +412,22 @@ public class RecordingsTab extends Tab implements TabSelectionListener { MenuItem downloadRecording = new MenuItem("Download"); downloadRecording.setOnAction((e) -> { try { - download(recording); + download(recordings.get(0)); } catch (IOException | ParseException | PlaylistException e1) { showErrorDialog("Error while downloading recording", "The recording could not be downloaded", e1); LOG.error("Error while downloading recording", e1); } }); - if (!Config.getInstance().getSettings().localRecording && recording.getStatus() == STATUS.FINISHED) { + if (!Config.getInstance().getSettings().localRecording && recordings.get(0).getStatus() == STATUS.FINISHED) { contextMenu.getItems().add(downloadRecording); } + if(recordings.size() > 1) { + openInPlayer.setDisable(true); + openDir.setDisable(true); + downloadRecording.setDisable(true); + } + return contextMenu; } @@ -523,12 +533,16 @@ public class RecordingsTab extends Tab implements TabSelectionListener { } - private void delete(Recording r) { - if(r.getStatus() != STATUS.FINISHED) { - return; - } + private void delete(List recordings) { table.setCursor(Cursor.WAIT); - String msg = "Delete " + r.getModelName() + "/" + r.getStartDate() + " for good?"; + + String msg; + if(recordings.size() > 1) { + msg = "Delete " + recordings.size() + " recordings for good?"; + } else { + Recording r = recordings.get(0); + msg = "Delete " + r.getModelName() + "/" + r.getStartDate() + " for good?"; + } AutosizeAlert confirm = new AutosizeAlert(AlertType.CONFIRMATION, msg, YES, NO); confirm.setTitle("Delete recording?"); confirm.setHeaderText(msg); @@ -539,13 +553,20 @@ public class RecordingsTab extends Tab implements TabSelectionListener { @Override public void run() { try { - recorder.delete(r); - Platform.runLater(() -> observableRecordings.remove(r)); - } catch (IOException | InvalidKeyException | NoSuchAlgorithmException | IllegalStateException e1) { - LOG.error("Error while deleting recording", e1); - showErrorDialog("Error while deleting recording", "Recording not deleted", e1); + for (JavaFxRecording r : recordings) { + if(r.getStatus() != STATUS.FINISHED) { + continue; + } + try { + recorder.delete(r); + Platform.runLater(() -> observableRecordings.remove(r)); + } catch (IOException | InvalidKeyException | NoSuchAlgorithmException | IllegalStateException e1) { + LOG.error("Error while deleting recording", e1); + showErrorDialog("Error while deleting recording", "Recording not deleted", e1); + } + } } finally { - table.setCursor(Cursor.DEFAULT); + Platform.runLater(() -> table.setCursor(Cursor.DEFAULT)); } } };