]> git.sesse.net Git - nageru/blob - clip_list.h
Make an enum for the view columns.
[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         enum Column {
21                 IN,
22                 OUT,
23                 DURATION,
24                 CAMERA_1,
25                 CAMERA_2,
26                 CAMERA_3,
27                 CAMERA_4,
28                 NUM_COLUMNS
29         };
30
31         int rowCount(const QModelIndex &parent) const override;
32         int columnCount(const QModelIndex &parent) const override;
33         QVariant data(const QModelIndex &parent, int role) const override;
34         QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;
35
36         void add_clip(const Clip &clip);
37         size_t size() const { return clips.size(); }
38         bool empty() const { return clips.empty(); }
39
40         // Like a smart pointer to a Clip, but emits dataChanged when it goes out of scope.
41         struct ClipProxy {
42         public:
43                 ClipProxy(Clip &clip, ClipList *clip_list, size_t row)
44                         : clip(clip), clip_list(clip_list), row(row) {}
45                 ~ClipProxy() {
46                         if (clip_list != nullptr) {
47                                 clip_list->emit_data_changed(row);
48                         }
49                 }
50                 Clip *operator->() { return &clip; }
51                 Clip &operator*() { return clip; }
52
53         private:
54                 Clip &clip;
55                 ClipList *clip_list;
56                 size_t row;
57         };
58
59         ClipProxy clip(size_t index) { return ClipProxy(clips[index], this, index); }
60         const Clip *clip(size_t index) const { return &clips[index]; }
61
62         ClipProxy back() { return clip(size() - 1); }
63         const Clip *back() const { return clip(size() - 1); }
64
65         void emit_data_changed(size_t row);
66
67 private:
68         std::vector<Clip> clips;
69 };
70
71 #endif  // !defined (_CLIP_LIST_H)