forked from j62/ctbrec
Add stop, pause and follow actions to context menu
This commit is contained in:
parent
3db5d16bb5
commit
69e13a7f37
|
@ -23,11 +23,13 @@ import java.util.concurrent.Executors;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
import java.util.concurrent.locks.Lock;
|
import java.util.concurrent.locks.Lock;
|
||||||
import java.util.concurrent.locks.ReentrantLock;
|
import java.util.concurrent.locks.ReentrantLock;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import ctbrec.Config;
|
import ctbrec.Config;
|
||||||
|
import ctbrec.Model;
|
||||||
import ctbrec.Recording;
|
import ctbrec.Recording;
|
||||||
import ctbrec.Recording.State;
|
import ctbrec.Recording.State;
|
||||||
import ctbrec.StringUtil;
|
import ctbrec.StringUtil;
|
||||||
|
@ -45,6 +47,9 @@ 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.action.FollowAction;
|
||||||
|
import ctbrec.ui.action.PauseAction;
|
||||||
|
import ctbrec.ui.action.StopRecordingAction;
|
||||||
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;
|
||||||
|
@ -191,25 +196,23 @@ public class RecordingsTab extends Tab implements TabSelectionListener {
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isDownloadRunning() {
|
public boolean isDownloadRunning() {
|
||||||
return observableRecordings.stream()
|
return observableRecordings.stream().map(Recording::getStatus).anyMatch(s -> s == DOWNLOADING);
|
||||||
.map(Recording::getStatus)
|
|
||||||
.anyMatch(s -> s == DOWNLOADING);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private TableCell<JavaFxRecording, Number> createSizeCell() {
|
private TableCell<JavaFxRecording, Number> createSizeCell() {
|
||||||
TableCell<JavaFxRecording, Number> cell = new TableCell<JavaFxRecording, Number>() {
|
TableCell<JavaFxRecording, Number> cell = new TableCell<JavaFxRecording, Number>() {
|
||||||
@Override
|
@Override
|
||||||
protected void updateItem(Number sizeInByte, boolean empty) {
|
protected void updateItem(Number sizeInByte, boolean empty) {
|
||||||
if(empty || sizeInByte == null) {
|
if (empty || sizeInByte == null) {
|
||||||
setText(null);
|
setText(null);
|
||||||
setStyle(null);
|
setStyle(null);
|
||||||
} else {
|
} else {
|
||||||
setText(StringUtil.formatSize(sizeInByte));
|
setText(StringUtil.formatSize(sizeInByte));
|
||||||
setStyle("-fx-alignment: CENTER-RIGHT;");
|
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();
|
int row = this.getTableRow().getIndex();
|
||||||
JavaFxRecording rec = tableViewProperty().get().getItems().get(row);
|
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");
|
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) {
|
private void onMousePressed(MouseEvent event) {
|
||||||
if(popup != null) {
|
if (popup != null) {
|
||||||
popup.hide();
|
popup.hide();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void onMouseClicked(MouseEvent event) {
|
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();
|
Recording recording = table.getSelectionModel().getSelectedItem();
|
||||||
if(recording != null) {
|
if (recording != null) {
|
||||||
play(recording);
|
play(recording);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void onKeyPressed( KeyEvent event ) {
|
private void onKeyPressed(KeyEvent event) {
|
||||||
List<JavaFxRecording> recordings = table.getSelectionModel().getSelectedItems();
|
List<JavaFxRecording> recordings = table.getSelectionModel().getSelectedItems();
|
||||||
if (recordings != null && !recordings.isEmpty()) {
|
if (recordings != null && !recordings.isEmpty()) {
|
||||||
State status = recordings.get(0).getStatus();
|
State status = recordings.get(0).getStatus();
|
||||||
if (event.getCode() == KeyCode.DELETE) {
|
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);
|
delete(recordings);
|
||||||
}
|
}
|
||||||
} else if (event.getCode() == KeyCode.ENTER && status == FINISHED) {
|
} else if (event.getCode() == KeyCode.ENTER && status == FINISHED) {
|
||||||
|
@ -279,8 +282,8 @@ public class RecordingsTab extends Tab implements TabSelectionListener {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateFreeSpaceDisplay() {
|
private void updateFreeSpaceDisplay() {
|
||||||
if(spaceTotal != -1 && spaceFree != -1) {
|
if (spaceTotal != -1 && spaceFree != -1) {
|
||||||
double free = ((double)spaceFree) / spaceTotal;
|
double free = ((double) spaceFree) / spaceTotal;
|
||||||
spaceLeft.setProgress(free);
|
spaceLeft.setProgress(free);
|
||||||
double totalGiB = ((double) spaceTotal) / 1024 / 1024 / 1024;
|
double totalGiB = ((double) spaceTotal) / 1024 / 1024 / 1024;
|
||||||
double freeGiB = ((double) spaceFree) / 1024 / 1024 / 1024;
|
double freeGiB = ((double) spaceFree) / 1024 / 1024 / 1024;
|
||||||
|
@ -324,7 +327,7 @@ public class RecordingsTab extends Tab implements TabSelectionListener {
|
||||||
}
|
}
|
||||||
|
|
||||||
private ScheduledService<List<JavaFxRecording>> createUpdateService() {
|
private ScheduledService<List<JavaFxRecording>> createUpdateService() {
|
||||||
ScheduledService<List<JavaFxRecording>> service = new ScheduledService<List<JavaFxRecording>>() {
|
ScheduledService<List<JavaFxRecording>> service = new ScheduledService<List<JavaFxRecording>>() {
|
||||||
@Override
|
@Override
|
||||||
protected Task<List<JavaFxRecording>> createTask() {
|
protected Task<List<JavaFxRecording>> createTask() {
|
||||||
return new Task<List<JavaFxRecording>>() {
|
return new Task<List<JavaFxRecording>>() {
|
||||||
|
@ -388,7 +391,7 @@ public class RecordingsTab extends Tab implements TabSelectionListener {
|
||||||
JavaFxRecording first = recordings.get(0);
|
JavaFxRecording first = recordings.get(0);
|
||||||
MenuItem openInPlayer = new MenuItem("Open in Player");
|
MenuItem openInPlayer = new MenuItem("Open in Player");
|
||||||
openInPlayer.setOnAction(e -> play(first));
|
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);
|
contextMenu.getItems().add(openInPlayer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -397,30 +400,33 @@ public class RecordingsTab extends Tab implements TabSelectionListener {
|
||||||
openContactSheet.setDisable(first.getContactSheet().isEmpty());
|
openContactSheet.setDisable(first.getContactSheet().isEmpty());
|
||||||
contextMenu.getItems().add(openContactSheet);
|
contextMenu.getItems().add(openContactSheet);
|
||||||
|
|
||||||
// TODO find a way to reenable this
|
MenuItem stopRecording = new MenuItem("Stop Recording");
|
||||||
// MenuItem stopRecording = new MenuItem("Stop recording");
|
stopRecording.setOnAction(e -> stopRecording(recordings.stream().map(r -> r.getModel()).collect(Collectors.toList())));
|
||||||
// stopRecording.setOnAction((e) -> {
|
if (recordings.stream().anyMatch(r -> r.getStatus() == RECORDING)) {
|
||||||
// Model m = site.createModel(recording.getModelName());
|
contextMenu.getItems().add(stopRecording);
|
||||||
// try {
|
}
|
||||||
// recorder.stopRecording(m);
|
|
||||||
// } catch (Exception e1) {
|
MenuItem pauseRecording = new MenuItem("Pause Recording");
|
||||||
// showErrorDialog("Stop recording", "Couldn't stop recording of model " + m.getName(), e1);
|
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);
|
||||||
// if(recording.getStatus() == STATUS.RECORDING) {
|
}
|
||||||
// contextMenu.getItems().add(stopRecording);
|
|
||||||
// }
|
|
||||||
|
|
||||||
MenuItem deleteRecording = new MenuItem("Delete");
|
MenuItem deleteRecording = new MenuItem("Delete");
|
||||||
deleteRecording.setOnAction(e -> delete(recordings));
|
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);
|
contextMenu.getItems().add(deleteRecording);
|
||||||
deleteRecording.setDisable(recordings.stream().allMatch(Recording::isPinned));
|
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");
|
MenuItem openDir = new MenuItem("Open directory");
|
||||||
openDir.setOnAction(e -> onOpenDirectory(first));
|
openDir.setOnAction(e -> onOpenDirectory(first));
|
||||||
if(Config.getInstance().getSettings().localRecording) {
|
if (Config.getInstance().getSettings().localRecording) {
|
||||||
contextMenu.getItems().add(openDir);
|
contextMenu.getItems().add(openDir);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -449,7 +455,7 @@ public class RecordingsTab extends Tab implements TabSelectionListener {
|
||||||
contextMenu.getItems().add(rerunPostProcessing);
|
contextMenu.getItems().add(rerunPostProcessing);
|
||||||
rerunPostProcessing.setDisable(!recordings.stream().allMatch(Recording::canBePostProcessed));
|
rerunPostProcessing.setDisable(!recordings.stream().allMatch(Recording::canBePostProcessed));
|
||||||
|
|
||||||
if(recordings.size() > 1) {
|
if (recordings.size() > 1) {
|
||||||
openInPlayer.setDisable(true);
|
openInPlayer.setDisable(true);
|
||||||
openDir.setDisable(true);
|
openDir.setDisable(true);
|
||||||
}
|
}
|
||||||
|
@ -457,6 +463,18 @@ public class RecordingsTab extends Tab implements TabSelectionListener {
|
||||||
return contextMenu;
|
return contextMenu;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void follow(List<Model> selectedModels) {
|
||||||
|
new FollowAction(getTabPane(), selectedModels).execute();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void stopRecording(List<Model> selectedModels) {
|
||||||
|
new StopRecordingAction(getTabPane(), selectedModels, recorder).execute();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void pauseRecording(List<Model> selectedModels) {
|
||||||
|
new PauseAction(getTabPane(), selectedModels, recorder).execute();
|
||||||
|
}
|
||||||
|
|
||||||
private void openContactSheet(JavaFxRecording recording) {
|
private void openContactSheet(JavaFxRecording recording) {
|
||||||
if (config.getSettings().localRecording) {
|
if (config.getSettings().localRecording) {
|
||||||
recording.getContactSheet().ifPresent(f -> new Thread(() -> DesktopIntegration.open(f)).start());
|
recording.getContactSheet().ifPresent(f -> new Thread(() -> DesktopIntegration.open(f)).start());
|
||||||
|
@ -487,7 +505,7 @@ public class RecordingsTab extends Tab implements TabSelectionListener {
|
||||||
Node source = getTabPane();
|
Node source = getTabPane();
|
||||||
String notes = recording.getNote();
|
String notes = recording.getNote();
|
||||||
Optional<String> newNote = Dialogs.showTextInput(source.getScene(), "Recording Notes", "", notes);
|
Optional<String> newNote = Dialogs.showTextInput(source.getScene(), "Recording Notes", "", notes);
|
||||||
if(newNote.isPresent()) {
|
if (newNote.isPresent()) {
|
||||||
table.setCursor(Cursor.WAIT);
|
table.setCursor(Cursor.WAIT);
|
||||||
Thread backgroundThread = new Thread(() -> {
|
Thread backgroundThread = new Thread(() -> {
|
||||||
List<Exception> exceptions = new ArrayList<>();
|
List<Exception> exceptions = new ArrayList<>();
|
||||||
|
@ -630,7 +648,7 @@ public class RecordingsTab extends Tab implements TabSelectionListener {
|
||||||
}
|
}
|
||||||
|
|
||||||
private String proposeTargetFilename(Recording recording) {
|
private String proposeTargetFilename(Recording recording) {
|
||||||
if(recording.isSingleFile()) {
|
if (recording.isSingleFile()) {
|
||||||
return recording.getPostProcessedFile().getName();
|
return recording.getPostProcessedFile().getName();
|
||||||
} else {
|
} else {
|
||||||
String downloadFilename = config.getSettings().downloadFilename;
|
String downloadFilename = config.getSettings().downloadFilename;
|
||||||
|
@ -665,7 +683,8 @@ public class RecordingsTab extends Tab implements TabSelectionListener {
|
||||||
Platform.runLater(() -> {
|
Platform.runLater(() -> {
|
||||||
recording.setStatus(FINISHED);
|
recording.setStatus(FINISHED);
|
||||||
recording.setProgress(-1);
|
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);
|
EventBusHolder.BUS.post(evt);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -711,7 +730,7 @@ public class RecordingsTab extends Tab implements TabSelectionListener {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
boolean started = Player.play(recording);
|
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));
|
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<JavaFxRecording> recordings) {
|
private void delete(List<JavaFxRecording> recordings) {
|
||||||
table.setCursor(Cursor.WAIT);
|
table.setCursor(Cursor.WAIT);
|
||||||
String msg;
|
String msg;
|
||||||
if(recordings.size() > 1) {
|
if (recordings.size() > 1) {
|
||||||
msg = "Delete " + recordings.size() + " recordings for good?";
|
msg = "Delete " + recordings.size() + " recordings for good?";
|
||||||
} else {
|
} else {
|
||||||
Recording r = recordings.get(0);
|
Recording r = recordings.get(0);
|
||||||
|
@ -746,7 +765,7 @@ public class RecordingsTab extends Tab implements TabSelectionListener {
|
||||||
List<Recording> deleted = new ArrayList<>();
|
List<Recording> deleted = new ArrayList<>();
|
||||||
List<Exception> exceptions = new ArrayList<>();
|
List<Exception> exceptions = new ArrayList<>();
|
||||||
for (Iterator<JavaFxRecording> iterator = recordings.iterator(); iterator.hasNext();) {
|
for (Iterator<JavaFxRecording> iterator = recordings.iterator(); iterator.hasNext();) {
|
||||||
JavaFxRecording r = iterator.next();
|
JavaFxRecording r = iterator.next();
|
||||||
if (r.getStatus() != FINISHED && r.getStatus() != FAILED && r.getStatus() != WAITING) {
|
if (r.getStatus() != FINISHED && r.getStatus() != FAILED && r.getStatus() != WAITING) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -771,7 +790,7 @@ public class RecordingsTab extends Tab implements TabSelectionListener {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void saveState() {
|
public void saveState() {
|
||||||
if(!table.getSortOrder().isEmpty()) {
|
if (!table.getSortOrder().isEmpty()) {
|
||||||
TableColumn<JavaFxRecording, ?> col = table.getSortOrder().get(0);
|
TableColumn<JavaFxRecording, ?> col = table.getSortOrder().get(0);
|
||||||
Config.getInstance().getSettings().recordingsSortColumn = col.getText();
|
Config.getInstance().getSettings().recordingsSortColumn = col.getText();
|
||||||
Config.getInstance().getSettings().recordingsSortType = col.getSortType().toString();
|
Config.getInstance().getSettings().recordingsSortType = col.getSortType().toString();
|
||||||
|
@ -795,9 +814,9 @@ public class RecordingsTab extends Tab implements TabSelectionListener {
|
||||||
|
|
||||||
private void restoreSorting() {
|
private void restoreSorting() {
|
||||||
String sortCol = Config.getInstance().getSettings().recordingsSortColumn;
|
String sortCol = Config.getInstance().getSettings().recordingsSortColumn;
|
||||||
if(StringUtil.isNotBlank(sortCol)) {
|
if (StringUtil.isNotBlank(sortCol)) {
|
||||||
for (TableColumn<JavaFxRecording, ?> col : table.getColumns()) {
|
for (TableColumn<JavaFxRecording, ?> col : table.getColumns()) {
|
||||||
if(Objects.equals(sortCol, col.getText())) {
|
if (Objects.equals(sortCol, col.getText())) {
|
||||||
col.setSortType(SortType.valueOf(Config.getInstance().getSettings().recordingsSortType));
|
col.setSortType(SortType.valueOf(Config.getInstance().getSettings().recordingsSortType));
|
||||||
table.getSortOrder().clear();
|
table.getSortOrder().clear();
|
||||||
table.getSortOrder().add(col);
|
table.getSortOrder().add(col);
|
||||||
|
@ -809,10 +828,10 @@ public class RecordingsTab extends Tab implements TabSelectionListener {
|
||||||
|
|
||||||
private void restoreColumnOrder() {
|
private void restoreColumnOrder() {
|
||||||
String[] columnIds = Config.getInstance().getSettings().recordingsColumnIds;
|
String[] columnIds = Config.getInstance().getSettings().recordingsColumnIds;
|
||||||
ObservableList<TableColumn<JavaFxRecording,?>> columns = table.getColumns();
|
ObservableList<TableColumn<JavaFxRecording, ?>> columns = table.getColumns();
|
||||||
for (int i = 0; i < columnIds.length; i++) {
|
for (int i = 0; i < columnIds.length; i++) {
|
||||||
for (int j = 0; j < table.getColumns().size(); j++) {
|
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<JavaFxRecording, ?> col = columns.get(j);
|
TableColumn<JavaFxRecording, ?> col = columns.get(j);
|
||||||
columns.remove(j); // NOSONAR
|
columns.remove(j); // NOSONAR
|
||||||
columns.add(i, col);
|
columns.add(i, col);
|
||||||
|
@ -823,7 +842,7 @@ public class RecordingsTab extends Tab implements TabSelectionListener {
|
||||||
|
|
||||||
private void restoreColumnWidths() {
|
private void restoreColumnWidths() {
|
||||||
double[] columnWidths = Config.getInstance().getSettings().recordingsColumnWidths;
|
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++) {
|
for (int i = 0; i < columnWidths.length; i++) {
|
||||||
table.getColumns().get(i).setPrefWidth(columnWidths[i]);
|
table.getColumns().get(i).setPrefWidth(columnWidths[i]);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue