Add action to mark models for later recording

This commit is contained in:
0xb00bface 2021-08-01 18:38:45 +02:00
parent d509dca6a1
commit df54d1f3ec
7 changed files with 86 additions and 4 deletions

View File

@ -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<? extends Model> 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));
}
};
}
}

View File

@ -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<Model> 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<Model> 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()));

View File

@ -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");

View File

@ -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<Model> 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<Model> findModel(Model m) {
recorderLock.lock();
try {

View File

@ -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

View File

@ -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);
}
}
}

View File

@ -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;