diff --git a/client/src/main/java/ctbrec/ui/JavaFxModel.java b/client/src/main/java/ctbrec/ui/JavaFxModel.java index c76bc9ee..c7573adc 100644 --- a/client/src/main/java/ctbrec/ui/JavaFxModel.java +++ b/client/src/main/java/ctbrec/ui/JavaFxModel.java @@ -281,6 +281,16 @@ public class JavaFxModel implements Model { return delegate.getLastRecorded(); } + @Override + public Instant getAddedTimestamp() { + return delegate.getAddedTimestamp(); + } + + @Override + public void setAddedTimestamp(Instant timestamp) { + delegate.setAddedTimestamp(timestamp); + } + @Override public int compareTo(Model o) { return delegate.compareTo(o); diff --git a/client/src/main/java/ctbrec/ui/tabs/recorded/AbstractRecordedModelsTab.java b/client/src/main/java/ctbrec/ui/tabs/recorded/AbstractRecordedModelsTab.java index 59199795..989cff43 100644 --- a/client/src/main/java/ctbrec/ui/tabs/recorded/AbstractRecordedModelsTab.java +++ b/client/src/main/java/ctbrec/ui/tabs/recorded/AbstractRecordedModelsTab.java @@ -3,6 +3,7 @@ package ctbrec.ui.tabs.recorded; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; +import java.time.Instant; import java.util.ArrayList; import java.util.List; import java.util.Objects; @@ -34,6 +35,7 @@ import ctbrec.ui.action.PlayAction; import ctbrec.ui.action.SetPortraitAction; import ctbrec.ui.action.StartRecordingAction; import ctbrec.ui.controls.CustomMouseBehaviorContextMenu; +import ctbrec.ui.controls.DateTimeCellFactory; import ctbrec.ui.controls.Dialogs; import ctbrec.ui.controls.SearchBox; import ctbrec.ui.controls.autocomplete.AutoFillTextField; @@ -129,7 +131,6 @@ public abstract class AbstractRecordedModelsTab extends Tab implements TabSelect } protected void createGui() { - Config config = Config.getInstance(); grid.setPadding(new Insets(5)); grid.setHgap(5); grid.setVgap(5); @@ -265,6 +266,14 @@ public abstract class AbstractRecordedModelsTab extends Tab implements TabSelect url.setEditable(false); } + protected void addAddedTimestampColumn(int columnIdx) { + TableColumn<JavaFxModel, Instant> tc = addTableColumn("addedTimestamp", "added at", columnIdx, 400); + tc.setCellFactory(new DateTimeCellFactory<>()); + tc.setCellValueFactory(param -> new SimpleObjectProperty<>(param.getValue().getAddedTimestamp())); + tc.setPrefWidth(150); + tc.setEditable(false); + } + protected void addNotesColumn(int columnIdx) { TableColumn<JavaFxModel, String> notes = addTableColumn("notes", "Notes", columnIdx, 400); notes.setCellValueFactory(cdf -> { diff --git a/client/src/main/java/ctbrec/ui/tabs/recorded/RecordLaterTab.java b/client/src/main/java/ctbrec/ui/tabs/recorded/RecordLaterTab.java index f66e8d1d..20427e1b 100644 --- a/client/src/main/java/ctbrec/ui/tabs/recorded/RecordLaterTab.java +++ b/client/src/main/java/ctbrec/ui/tabs/recorded/RecordLaterTab.java @@ -54,6 +54,7 @@ public class RecordLaterTab extends AbstractRecordedModelsTab implements TabSele addPortraitColumn(columnIdx++); addModelColumn(columnIdx++); addUrlColumn(columnIdx++); + addAddedTimestampColumn(columnIdx++); addNotesColumn(columnIdx); var root = new BorderPane(); 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 d6785c5d..21eb33bb 100644 --- a/client/src/main/java/ctbrec/ui/tabs/recorded/RecordedModelsTab.java +++ b/client/src/main/java/ctbrec/ui/tabs/recorded/RecordedModelsTab.java @@ -151,6 +151,7 @@ public class RecordedModelsTab extends AbstractRecordedModelsTab implements TabS columns.add(lastRecorded); addTableColumnIfEnabled(lastRecorded); + addAddedTimestampColumn(idx++); addNotesColumn(idx); addModelBox.getChildren().add(3, pauseAll); @@ -190,8 +191,8 @@ public class RecordedModelsTab extends AbstractRecordedModelsTab implements TabS private void updatePriority(JavaFxModel model, int priority) { try { - if (priority < 0 || priority > 1000) { - var msg = "Priority has to be between 0 and 1000"; + if (priority < 0 || priority > Model.MAX_PRIO) { + var msg = "Priority has to be between 0 and " + Model.MAX_PRIO; Dialogs.showError(table.getScene(), "Invalid value", msg, null); } else { model.setPriority(priority); @@ -396,7 +397,7 @@ public class RecordedModelsTab extends AbstractRecordedModelsTab implements TabS } else { prio++; } - prio = Math.min(Math.max(0, prio), 100); + prio = Math.min(Math.max(0, prio), Model.MAX_PRIO); m.setPriority(prio); updatePriority(m, prio); } diff --git a/common/src/main/java/ctbrec/AbstractModel.java b/common/src/main/java/ctbrec/AbstractModel.java index 6a09805d..c21b3f03 100644 --- a/common/src/main/java/ctbrec/AbstractModel.java +++ b/common/src/main/java/ctbrec/AbstractModel.java @@ -41,6 +41,7 @@ public abstract class AbstractModel implements Model { private Instant lastSeen; private Instant lastRecorded; private Instant recordUntil; + private Instant addedTimestamp = Instant.EPOCH; private SubsequentAction recordUntilSubsequentAction; @Override @@ -253,6 +254,16 @@ public abstract class AbstractModel implements Model { this.lastRecorded = lastRecorded; } + @Override + public Instant getAddedTimestamp() { + return addedTimestamp; + } + + @Override + public void setAddedTimestamp(Instant timestamp) { + this.addedTimestamp = timestamp; + } + @Override public boolean isRecordingTimeLimited() { return !getRecordUntil().equals(Instant.ofEpochMilli(RECORD_INDEFINITELY)); diff --git a/common/src/main/java/ctbrec/Model.java b/common/src/main/java/ctbrec/Model.java index 0cb9ab1e..a60362a3 100644 --- a/common/src/main/java/ctbrec/Model.java +++ b/common/src/main/java/ctbrec/Model.java @@ -21,6 +21,7 @@ import ctbrec.sites.Site; public interface Model extends Comparable<Model>, Serializable { public static final long RECORD_INDEFINITELY = 9000000000000000000l; + public static final int MAX_PRIO = 10_000; public enum State { ONLINE("online"), @@ -103,6 +104,10 @@ public interface Model extends Comparable<Model>, Serializable { public Instant getLastRecorded(); + public void setAddedTimestamp(Instant timestamp); + + public Instant getAddedTimestamp(); + /** * Determines the stream resolution for this model * diff --git a/common/src/main/java/ctbrec/io/ModelJsonAdapter.java b/common/src/main/java/ctbrec/io/ModelJsonAdapter.java index 7f585968..3198c356 100644 --- a/common/src/main/java/ctbrec/io/ModelJsonAdapter.java +++ b/common/src/main/java/ctbrec/io/ModelJsonAdapter.java @@ -65,6 +65,8 @@ public class ModelJsonAdapter extends JsonAdapter<Model> { model.setLastSeen(Instant.ofEpochMilli(reader.nextLong())); } else if (key.equals("lastRecorded")) { model.setLastRecorded(Instant.ofEpochMilli(reader.nextLong())); + } else if (key.equals("addedTimestamp")) { + model.setAddedTimestamp(Instant.ofEpochMilli(reader.nextLong())); } else if (key.equals("recordUntil")) { model.setRecordUntil(Instant.ofEpochMilli(reader.nextLong())); } else if (key.equals("recordUntilSubsequentAction")) { @@ -112,6 +114,7 @@ public class ModelJsonAdapter extends JsonAdapter<Model> { writer.name("markedForLater").value(model.isMarkedForLaterRecording()); writer.name("lastSeen").value(model.getLastSeen().toEpochMilli()); writer.name("lastRecorded").value(model.getLastRecorded().toEpochMilli()); + writer.name("addedTimestamp").value(model.getAddedTimestamp().toEpochMilli()); writer.name("recordUntil").value(model.getRecordUntil().toEpochMilli()); writer.name("recordUntilSubsequentAction").value(model.getRecordUntilSubsequentAction().name()); writer.name("siteSpecific"); diff --git a/common/src/main/java/ctbrec/recorder/NextGenLocalRecorder.java b/common/src/main/java/ctbrec/recorder/NextGenLocalRecorder.java index 8d7656cd..beca0eef 100644 --- a/common/src/main/java/ctbrec/recorder/NextGenLocalRecorder.java +++ b/common/src/main/java/ctbrec/recorder/NextGenLocalRecorder.java @@ -271,6 +271,7 @@ public class NextGenLocalRecorder implements Recorder { recorderLock.lock(); try { models.add(model); + model.setAddedTimestamp(Instant.now()); config.getSettings().models.add(model); config.save(); } catch (IOException e) {