diff --git a/client/src/main/java/ctbrec/ui/action/MarkForLaterRecordingAction.java b/client/src/main/java/ctbrec/ui/action/MarkForLaterRecordingAction.java new file mode 100644 index 00000000..2aa0b3b0 --- /dev/null +++ b/client/src/main/java/ctbrec/ui/action/MarkForLaterRecordingAction.java @@ -0,0 +1,24 @@ +package ctbrec.ui.action; + +import java.util.List; + +import ctbrec.Model; +import ctbrec.recorder.Recorder; +import ctbrec.ui.controls.Dialogs; +import javafx.application.Platform; +import javafx.scene.Node; + +public class MarkForLaterRecordingAction extends ModelMassEditAction { + + public MarkForLaterRecordingAction(Node source, List models, boolean recordLater, Recorder recorder) { + super(source, models); + action = m -> { + try { + recorder.markForLaterRecording(m, recordLater); + } catch(Exception e) { + Platform.runLater(() -> + Dialogs.showError(source.getScene(), "Couldn't resume recording of model", "Resuming recording of " + m.getName() + " failed", e)); + } + }; + } +} diff --git a/client/src/main/java/ctbrec/ui/menu/ModelMenuContributor.java b/client/src/main/java/ctbrec/ui/menu/ModelMenuContributor.java index 5610f81e..36679130 100644 --- a/client/src/main/java/ctbrec/ui/menu/ModelMenuContributor.java +++ b/client/src/main/java/ctbrec/ui/menu/ModelMenuContributor.java @@ -24,6 +24,7 @@ import ctbrec.ui.StreamSourceSelectionDialog; import ctbrec.ui.action.AddToGroupAction; import ctbrec.ui.action.EditNotesAction; import ctbrec.ui.action.IgnoreModelsAction; +import ctbrec.ui.action.MarkForLaterRecordingAction; import ctbrec.ui.action.OpenRecordingsDir; import ctbrec.ui.action.PauseAction; import ctbrec.ui.action.PlayAction; @@ -335,9 +336,9 @@ public class ModelMenuContributor { LOG.debug(first.toString()); if (recorder.isTracked(first)) { var pause = new MenuItem("Pause Recording"); - pause.setOnAction(e -> new PauseAction(source, selectedModels, recorder).execute()); + pause.setOnAction(e -> new PauseAction(source, selectedModels, recorder).execute(m -> executeCallback())); var resume = new MenuItem("Resume Recording"); - resume.setOnAction(e -> new ResumeAction(source, selectedModels, recorder).execute()); + resume.setOnAction(e -> new ResumeAction(source, selectedModels, recorder).execute(m -> executeCallback())); var pauseResume = recorder.isSuspended(first) ? resume : pause; menu.getItems().add(pauseResume); } @@ -359,8 +360,7 @@ public class ModelMenuContributor { private void recordLater(List selectedModels, boolean recordLater) { selectedModels.forEach(m -> m.setMarkedForLaterRecording(recordLater)); - startStopAction(selectedModels, false); - startStopAction(selectedModels, true); + new MarkForLaterRecordingAction(source, selectedModels, recordLater, recorder).execute(m -> executeCallback()); } private void addStartPaused(ContextMenu menu, List selectedModels) { @@ -383,6 +383,10 @@ public class ModelMenuContributor { var start = new MenuItem(text); menu.getItems().add(start); start.setOnAction(e -> { + selectedModels.forEach(m -> { + m.setMarkedForLaterRecording(false); + m.setSuspended(false); + }); startStopAction(selectedModels, true); selectedModels.forEach(m -> new SetStopDateAction(source, m, recorder).execute() // .thenAccept(b -> executeCallback())); diff --git a/client/src/main/java/ctbrec/ui/tabs/ThumbOverviewTab.java b/client/src/main/java/ctbrec/ui/tabs/ThumbOverviewTab.java index 6de06e3e..2325332e 100644 --- a/client/src/main/java/ctbrec/ui/tabs/ThumbOverviewTab.java +++ b/client/src/main/java/ctbrec/ui/tabs/ThumbOverviewTab.java @@ -476,6 +476,7 @@ public class ThumbOverviewTab extends Tab implements TabSelectionListener { grid.getChildren().remove(thumbCell); selectedThumbCells.remove(thumbCell); })) + .afterwards(() -> selectedModels.forEach(m -> getThumbCell(m).ifPresent(ThumbCell::update))) .contributeToMenu(selectedModels, contextMenu); var refresh = new MenuItem("Refresh Overview"); diff --git a/common/src/main/java/ctbrec/recorder/NextGenLocalRecorder.java b/common/src/main/java/ctbrec/recorder/NextGenLocalRecorder.java index 4d61ea04..97f477bc 100644 --- a/common/src/main/java/ctbrec/recorder/NextGenLocalRecorder.java +++ b/common/src/main/java/ctbrec/recorder/NextGenLocalRecorder.java @@ -567,6 +567,30 @@ public class NextGenLocalRecorder implements Recorder { return findModel(model).map(Model::isMarkedForLaterRecording).orElse(false); } + @Override + public void markForLaterRecording(Model model, boolean mark) throws InvalidKeyException, NoSuchAlgorithmException, IOException { + Optional existingModel = findModel(model); + if (existingModel.isPresent()) { + Model m = existingModel.get(); + LOG.debug("Mark. Model found: {}", m); + m.setMarkedForLaterRecording(mark); + if (mark && getCurrentlyRecording().contains(m)) { + LOG.debug("Stopping recording of {}", m); + stopRecordingProcess(m); + } + if (!mark) { + LOG.debug("Removing model: {}", m); + stopRecording(model); + } + } else { + LOG.debug("Model {} not found to mark for later recording", model); + if (mark) { + model.setMarkedForLaterRecording(true); + addModel(model); + } + } + } + private Optional findModel(Model m) { recorderLock.lock(); try { diff --git a/common/src/main/java/ctbrec/recorder/Recorder.java b/common/src/main/java/ctbrec/recorder/Recorder.java index 70cba4a4..f4cc2969 100644 --- a/common/src/main/java/ctbrec/recorder/Recorder.java +++ b/common/src/main/java/ctbrec/recorder/Recorder.java @@ -63,6 +63,7 @@ public interface Recorder { public boolean isSuspended(Model model); public boolean isMarkedForLaterRecording(Model model); + public void markForLaterRecording(Model model, boolean mark) throws InvalidKeyException, NoSuchAlgorithmException, IOException; /** * Returns only the models from getModels(), which are online diff --git a/common/src/main/java/ctbrec/recorder/RemoteRecorder.java b/common/src/main/java/ctbrec/recorder/RemoteRecorder.java index e06ce716..1930b0b9 100644 --- a/common/src/main/java/ctbrec/recorder/RemoteRecorder.java +++ b/common/src/main/java/ctbrec/recorder/RemoteRecorder.java @@ -703,4 +703,20 @@ public class RemoteRecorder implements Recorder { public void deleteModelGroup(ModelGroup group) throws InvalidKeyException, NoSuchAlgorithmException, IOException { sendRequest("deleteModelGroup", group); } + + @Override + public void markForLaterRecording(Model model, boolean mark) throws InvalidKeyException, NoSuchAlgorithmException, IOException { + if (mark) { + sendRequest("markForLater", model); + } else { + sendRequest("unmarkForLater", model); + } + model.setMarkedForLaterRecording(mark); + // update cached model + int index = models.indexOf(model); + if (index >= 0) { + Model m = models.get(index); + m.setSuspended(mark); + } + } } diff --git a/server/src/main/java/ctbrec/recorder/server/RecorderServlet.java b/server/src/main/java/ctbrec/recorder/server/RecorderServlet.java index 805577d9..c7ffc8d5 100644 --- a/server/src/main/java/ctbrec/recorder/server/RecorderServlet.java +++ b/server/src/main/java/ctbrec/recorder/server/RecorderServlet.java @@ -252,6 +252,18 @@ public class RecorderServlet extends AbstractCtbrecServlet { case "listModelGroups": sendModelGroups(resp, recorder.getModelGroups()); break; + case "markForLater": + LOG.debug("Mark model {} for later recording", request.model.getName()); + response = "{\"status\": \"success\", \"msg\": \"Model marked for later recording\"}"; + responseWriter.write(response); + recorder.markForLaterRecording(request.model, true); + break; + case "unmarkForLater": + LOG.debug("Unmark model {} for later recording", request.model.getName()); + response = "{\"status\": \"success\", \"msg\": \"Model has been unmarked\"}"; + responseWriter.write(response); + recorder.markForLaterRecording(request.model, false); + break; default: sendError(resp, SC_BAD_REQUEST, "{\"status\": \"error\", \"msg\": \"Unknown action [" + request.action + "]\"}"); break;