]> git.sesse.net Git - nageru/blob - clip_list.h
Split ClipList and PlayList.
[nageru] / clip_list.h
1 #ifndef _CLIP_LIST_H
2 #define _CLIP_LIST_H 1
3
4 #include <QAbstractTableModel>
5
6 #include <stdint.h>
7
8 #include <vector>
9 #include <string>
10
11 struct Clip {
12         int64_t pts_in = -1, pts_out = -1;
13         std::vector<std::string> descriptions;  // One per camera.
14         unsigned stream_idx = 0;  // For the playlist only.
15 };
16
17 class DataChangedReceiver {
18 public:
19         virtual void emit_data_changed(size_t row) = 0;
20 };
21
22 // Like a smart pointer to a Clip, but emits dataChanged when it goes out of scope.
23 struct ClipProxy {
24 public:
25         ClipProxy(Clip &clip, DataChangedReceiver *clip_list, size_t row)
26                 : clip(clip), clip_list(clip_list), row(row) {}
27         ~ClipProxy() {
28                 if (clip_list != nullptr) {
29                         clip_list->emit_data_changed(row);
30                 }
31         }
32         Clip *operator->() { return &clip; }
33         Clip &operator*() { return clip; }
34
35 private:
36         Clip &clip;
37         DataChangedReceiver *clip_list;
38         size_t row;
39 };
40
41 class ClipList : public QAbstractTableModel, public DataChangedReceiver {
42         Q_OBJECT
43
44 public:
45         ClipList() {}
46
47         enum class Column {
48                 IN,
49                 OUT,
50                 DURATION,
51                 CAMERA_1,
52                 CAMERA_2,
53                 CAMERA_3,
54                 CAMERA_4,
55                 NUM_COLUMNS
56         };
57
58         int rowCount(const QModelIndex &parent) const override;
59         int columnCount(const QModelIndex &parent) const override;
60         QVariant data(const QModelIndex &parent, int role) const override;
61         QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
62
63         void add_clip(const Clip &clip);
64         size_t size() const { return clips.size(); }
65         bool empty() const { return clips.empty(); }
66
67         ClipProxy clip(size_t index) { return ClipProxy(clips[index], this, index); }
68         const Clip *clip(size_t index) const { return &clips[index]; }
69
70         ClipProxy back() { return clip(size() - 1); }
71         const Clip *back() const { return clip(size() - 1); }
72
73         void emit_data_changed(size_t row) override;
74
75 private:
76         std::vector<Clip> clips;
77 };
78
79 class PlayList : public QAbstractTableModel, public DataChangedReceiver {
80         Q_OBJECT
81
82 public:
83         PlayList() {}
84
85         enum class Column {
86                 PLAYING,
87                 IN,
88                 OUT,
89                 DURATION,
90                 CAMERA,
91                 DESCRIPTION,
92                 NUM_COLUMNS
93         };
94
95         int rowCount(const QModelIndex &parent) const override;
96         int columnCount(const QModelIndex &parent) const override;
97         QVariant data(const QModelIndex &parent, int role) const override;
98         QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
99
100         void add_clip(const Clip &clip);
101         size_t size() const { return clips.size(); }
102         bool empty() const { return clips.empty(); }
103
104         ClipProxy clip(size_t index) { return ClipProxy(clips[index], this, index); }
105         const Clip *clip(size_t index) const { return &clips[index]; }
106
107         ClipProxy back() { return clip(size() - 1); }
108         const Clip *back() const { return clip(size() - 1); }
109
110         void set_currently_playing(int index);  // -1 = none.
111         int get_currently_playing() const { return currently_playing_index; }
112
113         void emit_data_changed(size_t row) override;
114
115 private:
116         std::vector<Clip> clips;
117         int currently_playing_index = -1;
118 };
119
120 #endif  // !defined (_CLIP_LIST_H)