X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=clip_list.h;h=126d1d5bc340e2fb1b04b85ee26361ab5f328acb;hb=1f51d2000d5ce3a1f83ebd3a8a24bfbee5b37d5e;hp=ddb4a4a7d862f24e2f91c91a7d078e225675df3e;hpb=d357bff359e00a9ad8e5a1d7ec70d0653db46398;p=nageru diff --git a/clip_list.h b/clip_list.h index ddb4a4a..126d1d5 100644 --- a/clip_list.h +++ b/clip_list.h @@ -8,24 +8,45 @@ #include #include +#include "defs.h" + struct Clip { - int64_t pts_in = -1, pts_out = -1; - std::vector descriptions; // One per camera. + 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. }; -// FIXME: This should be split into a separate clip list and play list model. -class ClipList : public QAbstractTableModel { +class DataChangedReceiver { +public: + virtual void emit_data_changed(size_t row) = 0; +}; + +// Like a smart pointer to a Clip, but emits dataChanged when it goes out of scope. +struct ClipProxy { +public: + ClipProxy(Clip &clip, DataChangedReceiver *clip_list, size_t row) + : clip(clip), clip_list(clip_list), row(row) {} + ~ClipProxy() { + if (clip_list != nullptr) { + clip_list->emit_data_changed(row); + } + } + Clip *operator->() { return &clip; } + Clip &operator*() { return clip; } + +private: + Clip &clip; + DataChangedReceiver *clip_list; + size_t row; +}; + +class ClipList : public QAbstractTableModel, public DataChangedReceiver { Q_OBJECT public: - enum class ListDisplay { - CLIP_LIST, - PLAY_LIST - }; - ClipList(ListDisplay display_type) : display_type(display_type) {} + ClipList() {} - enum class ClipListColumn { + enum class Column { IN, OUT, DURATION, @@ -35,7 +56,38 @@ public: CAMERA_4, NUM_COLUMNS }; - enum class PlayListColumn { + + int rowCount(const QModelIndex &parent) const override; + int columnCount(const QModelIndex &parent) const override; + QVariant data(const QModelIndex &parent, int role) const override; + QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; + Qt::ItemFlags flags(const QModelIndex &index) const override; + bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override; + + void add_clip(const Clip &clip); + size_t size() const { return clips.size(); } + bool empty() const { return clips.empty(); } + + ClipProxy 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); } + const Clip *back() const { return clip(size() - 1); } + + void emit_data_changed(size_t row) override; + +private: + std::vector clips; +}; + +class PlayList : public QAbstractTableModel, public DataChangedReceiver { + Q_OBJECT + +public: + PlayList() {} + + enum class Column { + PLAYING, IN, OUT, DURATION, @@ -48,29 +100,19 @@ public: int columnCount(const QModelIndex &parent) const override; QVariant data(const QModelIndex &parent, int role) const override; QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override; + Qt::ItemFlags flags(const QModelIndex &index) const override; + bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override; void add_clip(const Clip &clip); - size_t size() const { return clips.size(); } - bool empty() const { return clips.empty(); } - // Like a smart pointer to a Clip, but emits dataChanged when it goes out of scope. - struct ClipProxy { - public: - ClipProxy(Clip &clip, ClipList *clip_list, size_t row) - : clip(clip), clip_list(clip_list), row(row) {} - ~ClipProxy() { - if (clip_list != nullptr) { - clip_list->emit_data_changed(row); - } - } - Clip *operator->() { return &clip; } - Clip &operator*() { return 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); - private: - Clip &clip; - ClipList *clip_list; - size_t row; - }; + size_t size() const { return clips.size(); } + bool empty() const { return clips.empty(); } ClipProxy clip(size_t index) { return ClipProxy(clips[index], this, index); } const Clip *clip(size_t index) const { return &clips[index]; } @@ -78,11 +120,14 @@ public: ClipProxy back() { return clip(size() - 1); } const Clip *back() const { return clip(size() - 1); } - void emit_data_changed(size_t row); + void set_currently_playing(int index); // -1 = none. + int get_currently_playing() const { return currently_playing_index; } + + void emit_data_changed(size_t row) override; private: std::vector clips; - ListDisplay display_type; + int currently_playing_index = -1; }; #endif // !defined (_CLIP_LIST_H)