X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=clip_list.h;h=8dead831106e74783704ad5fab8ea6b9eb9eb675;hb=3795723be95f2fe82f3c8b8b45b1a905b2c811fd;hp=64d06cd29f19633da0b82c1f9355442c49bcb44f;hpb=7d9f083a4b4e816350d9e88f94e7b8656a2111ce;p=nageru diff --git a/clip_list.h b/clip_list.h index 64d06cd..8dead83 100644 --- a/clip_list.h +++ b/clip_list.h @@ -1,23 +1,25 @@ #ifndef _CLIP_LIST_H #define _CLIP_LIST_H 1 -#include +#include "defs.h" +#include "state.pb.h" +#include #include - -#include +#include #include - -#include "defs.h" +#include struct Clip { int64_t pts_in = -1, pts_out = -1; // pts_in is inclusive, pts_out is exclusive. std::string descriptions[NUM_CAMERAS]; unsigned stream_idx = 0; // For the playlist only. + double fade_time_seconds = 0.5; // For the playlist only. }; class DataChangedReceiver { public: + virtual ~DataChangedReceiver() {} virtual void emit_data_changed(size_t row) = 0; }; @@ -26,7 +28,8 @@ struct ClipProxy { public: ClipProxy(Clip &clip, DataChangedReceiver *clip_list, size_t row) : clip(clip), clip_list(clip_list), row(row) {} - ~ClipProxy() { + ~ClipProxy() + { if (clip_list != nullptr) { clip_list->emit_data_changed(row); } @@ -44,7 +47,7 @@ class ClipList : public QAbstractTableModel, public DataChangedReceiver { Q_OBJECT public: - ClipList() {} + explicit ClipList(const ClipListProto &serialized); enum class Column { IN, @@ -68,14 +71,19 @@ public: size_t size() const { return clips.size(); } bool empty() const { return clips.empty(); } - ClipProxy clip(size_t index) { return ClipProxy(clips[index], this, index); } + ClipProxy mutable_clip(size_t index) { return ClipProxy(clips[index], this, index); } const Clip *clip(size_t index) const { return &clips[index]; } - ClipProxy back() { return clip(size() - 1); } + ClipProxy mutable_back() { return mutable_clip(size() - 1); } const Clip *back() const { return clip(size() - 1); } + ClipListProto serialize() const; + void emit_data_changed(size_t row) override; +signals: + void any_content_changed(); + private: std::vector clips; }; @@ -84,7 +92,7 @@ class PlayList : public QAbstractTableModel, public DataChangedReceiver { Q_OBJECT public: - PlayList() {} + explicit PlayList(const ClipListProto &serialized); enum class Column { PLAYING, @@ -93,6 +101,7 @@ public: DURATION, CAMERA, DESCRIPTION, + FADE_TIME, NUM_COLUMNS }; @@ -104,23 +113,40 @@ public: bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override; void add_clip(const Clip &clip); + + // is inclusive in all of these. + void duplicate_clips(size_t first, size_t last); + void erase_clips(size_t first, size_t last); + // is -1 to move upwards, +1 to move downwards. + void move_clips(size_t first, size_t last, int delta); + size_t size() const { return clips.size(); } bool empty() const { return clips.empty(); } - ClipProxy clip(size_t index) { return ClipProxy(clips[index], this, index); } + ClipProxy mutable_clip(size_t index) { return ClipProxy(clips[index], this, index); } const Clip *clip(size_t index) const { return &clips[index]; } - ClipProxy back() { return clip(size() - 1); } + ClipProxy mutable_back() { return mutable_clip(size() - 1); } const Clip *back() const { return clip(size() - 1); } - void set_currently_playing(int index); // -1 = none. + // TODO: Move these out of PlayList. + void set_currently_playing(int index, double progress); // -1 = none. int get_currently_playing() const { return currently_playing_index; } + void set_progress(const std::map &progress); + + ClipListProto serialize() const; + void emit_data_changed(size_t row) override; +signals: + void any_content_changed(); + private: std::vector clips; int currently_playing_index = -1; + double play_progress = 0.0; + std::map current_progress; }; #endif // !defined (_CLIP_LIST_H)