]> git.sesse.net Git - nageru/blob - clip_list.h
Hook up some more clip modifications.
[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 };
15
16 class ClipList : public QAbstractTableModel {
17         Q_OBJECT
18
19 public:
20         int rowCount(const QModelIndex &parent) const override;
21         int columnCount(const QModelIndex &parent) const override;
22         QVariant data(const QModelIndex &parent, int role) const override;
23         QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
24
25         void add_clip(const Clip &clip);
26         size_t size() const { return clips.size(); }
27         bool empty() const { return clips.empty(); }
28
29         // Like a smart pointer to a Clip, but emits dataChanged when it goes out of scope.
30         struct ClipProxy {
31         public:
32                 ClipProxy(Clip &clip, ClipList *clip_list, size_t row)
33                         : clip(clip), clip_list(clip_list), row(row) {}
34                 ~ClipProxy() {
35                         if (clip_list != nullptr) {
36                                 clip_list->emit_data_changed(row);
37                         }
38                 }
39                 Clip *operator->() { return &clip; }
40
41         private:
42                 Clip &clip;
43                 ClipList *clip_list;
44                 size_t row;
45         };
46
47         ClipProxy clip(size_t index) { return ClipProxy(clips[index], this, index); }
48         const Clip *clip(size_t index) const { return &clips[index]; }
49
50         ClipProxy back() { return clip(size() - 1); }
51         const Clip *back() const { return clip(size() - 1); }
52
53         void emit_data_changed(size_t row);
54
55 private:
56         std::vector<Clip> clips;
57 };
58
59 #endif  // !defined (_CLIP_LIST_H)