From 410302560bb4589f1f6a7c8cfd69162294af6b86 Mon Sep 17 00:00:00 2001 From: XxInvictus <3955293+XxInvictus@users.noreply.github.com> Date: Fri, 24 Nov 2023 01:38:10 +1030 Subject: [PATCH] Add ForcePriority Overlay Icon, Fix Highlighting in Recorded Models tab - Added an icon to show a model has ForcePriority enabled in the Site Tabs (Lightning Bolt over Record icon) - Fixed issue where Highlighting in Recorded Models would not refresh when ForcePriority was enabled via Site Tab context-menu --- client/src/main/java/ctbrec/ui/Icon.java | 3 ++- client/src/main/java/ctbrec/ui/JavaFxModel.java | 6 ++++++ .../src/main/java/ctbrec/ui/tabs/ThumbCell.java | 11 +++++++++-- .../ui/tabs/recorded/RecordedModelsTab.java | 2 ++ .../src/main/resources/16/media-force-record.png | Bin 0 -> 3301 bytes .../java/ctbrec/recorder/RemoteRecorder.java | 1 + .../ctbrec/recorder/SimplifiedLocalRecorder.java | 1 + .../ctbrec/recorder/server/RecorderServlet.java | 1 + 8 files changed, 22 insertions(+), 3 deletions(-) create mode 100644 client/src/main/resources/16/media-force-record.png diff --git a/client/src/main/java/ctbrec/ui/Icon.java b/client/src/main/java/ctbrec/ui/Icon.java index 42051ff8..4686af09 100644 --- a/client/src/main/java/ctbrec/ui/Icon.java +++ b/client/src/main/java/ctbrec/ui/Icon.java @@ -8,7 +8,8 @@ public enum Icon { CLOCK_16(Icon.class.getResource("/16/clock.png").toExternalForm()), GROUP_16(Icon.class.getResource("/16/users.png").toExternalForm()), MEDIA_PLAYBACK_PAUSE_16(Icon.class.getResource("/16/media-playback-pause.png").toExternalForm()), - MEDIA_RECORD_16(Icon.class.getResource("/16/media-record.png").toExternalForm()); + MEDIA_RECORD_16(Icon.class.getResource("/16/media-record.png").toExternalForm()), + MEDIA_FORCE_RECORD_16(Icon.class.getResource("/16/media-force-record.png").toExternalForm()); private String url; diff --git a/client/src/main/java/ctbrec/ui/JavaFxModel.java b/client/src/main/java/ctbrec/ui/JavaFxModel.java index d1db9d20..02021f35 100644 --- a/client/src/main/java/ctbrec/ui/JavaFxModel.java +++ b/client/src/main/java/ctbrec/ui/JavaFxModel.java @@ -27,6 +27,7 @@ public class JavaFxModel implements Model { private final transient BooleanProperty onlineProperty = new SimpleBooleanProperty(); private final transient BooleanProperty recordingProperty = new SimpleBooleanProperty(); private final transient BooleanProperty pausedProperty = new SimpleBooleanProperty(); + private final transient BooleanProperty forcePriorityProperty = new SimpleBooleanProperty(); private final transient SimpleIntegerProperty priorityProperty = new SimpleIntegerProperty(); private final transient SimpleObjectProperty lastSeenProperty = new SimpleObjectProperty<>(); private final transient SimpleObjectProperty lastRecordedProperty = new SimpleObjectProperty<>(); @@ -119,6 +120,10 @@ public class JavaFxModel implements Model { public BooleanProperty getPausedProperty() { return pausedProperty; } + + public BooleanProperty getForcePriorityProperty() { + return forcePriorityProperty; + } public SimpleIntegerProperty getPriorityProperty() { return priorityProperty; @@ -267,6 +272,7 @@ public class JavaFxModel implements Model { @Override public void setForcePriority(boolean forcePriority) { delegate.setForcePriority(forcePriority); + forcePriorityProperty.set(forcePriority); } public SimpleObjectProperty lastSeenProperty() { diff --git a/client/src/main/java/ctbrec/ui/tabs/ThumbCell.java b/client/src/main/java/ctbrec/ui/tabs/ThumbCell.java index 39b4b5f9..47e55d08 100644 --- a/client/src/main/java/ctbrec/ui/tabs/ThumbCell.java +++ b/client/src/main/java/ctbrec/ui/tabs/ThumbCell.java @@ -73,6 +73,7 @@ public class ThumbCell extends StackPane { private static final Duration ANIMATION_DURATION = new Duration(250); private static final Image imgRecordIndicator = new Image(MEDIA_RECORD_16.url()); + private static final Image imgForceRecordIndicator = new Image(MEDIA_FORCE_RECORD_16.url()); private static final Image imgPauseIndicator = new Image(MEDIA_PLAYBACK_PAUSE_16.url()); private static final Image imgBookmarkIndicator = new Image(BOOKMARK_16.url()); private static final Image imgGroupIndicator = new Image(Icon.GROUP_16.url()); @@ -122,6 +123,7 @@ public class ThumbCell extends StackPane { this.imgAspectRatio = aspectRatio; recording = recorder.isTracked(model); model.setSuspended(recorder.isSuspended(model)); + model.setForcePriority(recorder.isForcePriority(model)); this.setStyle("-fx-background-color: -fx-base"); streamPreview = new StreamPreview(); @@ -497,8 +499,13 @@ public class ThumbCell extends StackPane { recordingIndicatorTooltip.setText("Resume Recording"); } else { modelRecordingState = ModelRecordingState.RECORDING; - recordingIndicator.setImage(imgRecordIndicator); - recordingIndicatorTooltip.setText("Pause Recording"); + if (model.isForcePriority()) { + recordingIndicator.setImage(imgForceRecordIndicator); + recordingIndicatorTooltip.setText("Pause Recording (Resets Forced)"); + } else { + recordingIndicator.setImage(imgRecordIndicator); + recordingIndicatorTooltip.setText("Pause Recording"); + } } } else { if (model.isMarkedForLaterRecording()) { diff --git a/client/src/main/java/ctbrec/ui/tabs/recorded/RecordedModelsTab.java b/client/src/main/java/ctbrec/ui/tabs/recorded/RecordedModelsTab.java index b8566f82..5613ee2b 100644 --- a/client/src/main/java/ctbrec/ui/tabs/recorded/RecordedModelsTab.java +++ b/client/src/main/java/ctbrec/ui/tabs/recorded/RecordedModelsTab.java @@ -257,10 +257,12 @@ public class RecordedModelsTab extends AbstractRecordedModelsTab implements TabS if (index == -1) { observableModels.add(updatedModel); updatedModel.getPausedProperty().addListener(createPauseListener(updatedModel)); + updatedModel.getForcePriorityProperty().addListener(createForcePriorityListener(updatedModel)); } else { // make sure to update the JavaFX online property, so that the table cell is updated JavaFxModel oldModel = observableModels.get(index); oldModel.setSuspended(updatedModel.isSuspended()); + oldModel.setForcePriority(updatedModel.isForcePriority()); oldModel.getOnlineProperty().set(updatedModel.getOnlineProperty().get()); oldModel.getRecordingProperty().set(updatedModel.getRecordingProperty().get()); oldModel.lastRecordedProperty().set(updatedModel.lastRecordedProperty().get()); diff --git a/client/src/main/resources/16/media-force-record.png b/client/src/main/resources/16/media-force-record.png new file mode 100644 index 0000000000000000000000000000000000000000..d73004e2b6ce33a14464b901711b7e957456ff69 GIT binary patch literal 3301 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 j5IX~fqwDK+zn%X8N_VMIe=p { cachedModel.setSuspended(model.isSuspended()); + cachedModel.setForcePriority(model.isForcePriority()); cachedModel.setMarkedForLaterRecording(model.isMarkedForLaterRecording()); cachedModel.setRecordUntil(model.getRecordUntil()); cachedModel.setRecordUntilSubsequentAction(model.getRecordUntilSubsequentAction()); diff --git a/common/src/main/java/ctbrec/recorder/SimplifiedLocalRecorder.java b/common/src/main/java/ctbrec/recorder/SimplifiedLocalRecorder.java index 20f7e503..52e80cfc 100644 --- a/common/src/main/java/ctbrec/recorder/SimplifiedLocalRecorder.java +++ b/common/src/main/java/ctbrec/recorder/SimplifiedLocalRecorder.java @@ -345,6 +345,7 @@ public class SimplifiedLocalRecorder implements Recorder { private void copyModelProperties(Model src, Model existing) { existing.setSuspended(src.isSuspended()); + existing.setForcePriority(src.isForcePriority()); existing.setMarkedForLaterRecording(src.isMarkedForLaterRecording()); existing.setPriority(src.getPriority()); existing.setRecordUntil(src.getRecordUntil()); diff --git a/server/src/main/java/ctbrec/recorder/server/RecorderServlet.java b/server/src/main/java/ctbrec/recorder/server/RecorderServlet.java index ef3f41c8..55bd7fb5 100644 --- a/server/src/main/java/ctbrec/recorder/server/RecorderServlet.java +++ b/server/src/main/java/ctbrec/recorder/server/RecorderServlet.java @@ -87,6 +87,7 @@ public class RecorderServlet extends AbstractCtbrecServlet { log.debug("Starting recording for model {} - {}", model.getName(), model.getUrl()); log.trace("Model marked: {}", model.isMarkedForLaterRecording()); log.trace("Model paused: {}", model.isSuspended()); + log.trace("Model forced: {}", model.isForcePriority()); log.trace("Model until: {}", model.getRecordUntil().equals(Instant.ofEpochMilli(Model.RECORD_INDEFINITELY)) ? "no limit" : model.getRecordUntil()); log.trace("Model after: {}", model.getRecordUntilSubsequentAction()); recorder.addModel(model);