1 // generic helper module for general-use static functions
2 #ifndef HELPERS_H
3 #define HELPERS_H
4 #include <QObject>
5 #include <QCoreApplication>
6 #include <QWidget>
7 #include <QSet>
8 #include <QList>
9 #include <QUrl>
10 #include <QUuid>
11 #include <QOpenGLWidget>
12 #include <QDate>
13 #include <QTime>
14 #include <QDir>
15 
16 class QPushButton;
17 class QFileDialog;
18 class QLocalServer;
19 class QLocalSocket;
20 class QOpenGLTexture;
21 
22 namespace Helpers {
23     enum DisabledTrack { NothingDisabled, DisabledAudio, DisabledVideo };
24     enum Subtitles { NoSubtitles, SubtitlesPresent, SubtitlesDisabled, };
25     enum FileType { AudioFile, VideoFile };
26     enum ScreenshotRender { VideoRender, SubsRender, WindowRender };
27     enum TitlePrefix { PrefixFullPath, PrefixFileName, NoPrefix };
28     enum MpvWidgetType { NullWidget, EmbedWidget, GlCbWidget, VulkanCbWidget,
29                          CustomWidget };
30     enum ControlHiding { NeverShown, ShowWhenMoving, ShowWhenHovering,
31                          AlwaysShow };
32     enum AfterPlayback { DoNothingAfter, RepeatAfter, PlayNextAfter,
33                          ExitAfter, StandByAfter, HibernateAfter,
34                          ShutdownAfter, LogOffAfter, LockAfter };
35 
36     enum TimeFormat { LongFormat, ShortFormat,
37                       LongHourFormat, ShortHourFormat };
38 
39     extern QSet<QString> fileExtensions;
40     extern QSet<QString> subsExtensions;
41 
42     QString fileSizeToString(int64_t bytes);
43     QString toDateFormat(double time);
44     QString toDateFormatFixed(double time, TimeFormat format);
45     QDate dateFromCFormat(const char date[]);
46     QTime timeFromCFormat(const char time[]);
47     QString parseFormat(QString fmt, QString fileName, DisabledTrack disabled,
48                         Subtitles subtitles, double timeNav, double timeBegin,
49                         double timeEnd);
50     QString parseFormatEx(QString fmt, QUrl sourceUrl, QString filePath,
51                           QString fileExt, DisabledTrack disabled,
52                           Subtitles subtitles, double timeNav,
53                           double timeBegin, double timeEnd);
54     QString fileOpenFilter();
55     QString subsOpenFilter();
56     bool urlSurvivesFilter(const QUrl &url);
57     QList<QUrl> filterUrls(const QList<QUrl> &urls);
58     QRect vmapToRect(const QVariantMap &m);
59     QVariantMap rectToVmap(const QRect &r);
60     bool sizeFromString(QSize &size, const QString &text);
61     bool pointFromString(QPoint &point, const QString &text);
62     QRect availableGeometryFromPoint(const QPoint &point);
63 }
64 
65 class IconThemer : public QObject {
66     Q_OBJECT
67 public:
68     class IconData {
69     public:
70         QPushButton *button; QString iconNormal; QString iconChecked;
71     };
72     enum FolderMode { FallbackFolder, CustomFolder, SystemFolder };
73     explicit IconThemer(QObject *parent = nullptr);
74     void addIconData(const IconData &data);
75     QIcon fetchIcon(const QString &name);
76     void updateButton(const IconData &data);
77 
78 public slots:
79     void setIconFolders(IconThemer::FolderMode folderMode, const QString &fallbackFolder, const QString &customFolder);
80 
81 private:
82     QList<IconData> iconDataList;
83     FolderMode mode;
84     QString fallback;
85     QString custom;
86 };
87 
88 class DisplayNode;
89 class DisplayParser {
90 public:
91     DisplayParser();
92     ~DisplayParser();
93 
94     void takeFormatString(QString fmt);
95     QString parseMetadata(QVariantMap metaData, QString displayString,
96                           Helpers::FileType fileType);
97 private:
98     DisplayNode *node = nullptr;
99 };
100 
101 class TrackInfo {
102 public:
TrackInfo()103     TrackInfo() {}
104     TrackInfo(const QUrl &url, const QUuid &list, const QUuid &item, QString text, double length, double position);
105     QUrl url;
106     QUuid list;
107     QUuid item;
108     QString text;
109     double length;
110     double position;
111     QVariantMap toVMap() const;
112     void fromVMap(const QVariantMap &map);
113     bool operator ==(const TrackInfo &track) const;
114 
115     static QVariantList tracksToVList(const QList<TrackInfo> &list);
116     static QList<TrackInfo> tracksFromVList(const QVariantList &list);
117 };
118 
119 class MouseState {
120     Q_DECLARE_TR_FUNCTIONS(MouseState)
121 public:
122     enum MouseButtons { None, Wheel, Left, Right, Middle, Back,
123         Forward, Task, XButton4, XButton5, XButton6, XButton7,
124         XButton8, XButton9, XButton10, XButton11, XButton12,
125         XButton13, XButton14, XButton15, XButton16, XButton17,
126         XButton18, XButton19,XButton20, XButton21, XButton22,
127         XButton23, XButton24 };
128     enum MousePress { MouseDown, MouseUp, PressTwice };
129 
130     MouseState();
131     MouseState(const MouseState &m);
132     MouseState(int button, int mod, MousePress press);
133     MouseState operator =(const MouseState &other);
134 
135     // Components
136     int button;
137     int mod;
138     MousePress press;
139 
140     // to Qt notation functions
141     Qt::MouseButtons mouseButtons() const;
142     Qt::KeyboardModifiers keyModifiers() const;
143     bool isPress();
144     bool isTwice();
145     bool isWheel();
146 
147     // I/O functions
148     QString toString() const;
149     QVariantMap toVMap() const;
150     void fromVMap(const QVariantMap &map);
151 
152     // Hashing-related functions
153     uint mouseHash() const;
154     bool operator ==(const MouseState &other) const;
155     bool operator !() const;        // le saef bull eyediom faec
156 
157     // Conversion functions
158     static MouseState fromWheelEvent(QWheelEvent *event);
159     static MouseState fromMouseEvent(QMouseEvent *event, MousePress press);
160 
161     // Display mapping vars
162     static QString buttonToText(int index);
163     static int     buttonToTextCount();
164     static QString modToText(int index);
165     static int     modToTextCount();
166     static QString multiModToText(int index);
167     static int     multiModToTextCount();
168     static QString pressToText(int index);
169     static int     pressToTextCount();
170 };
171 
qHash(const MouseState & m,uint seed)172 inline uint qHash(const MouseState &m, uint seed) {
173     Q_UNUSED(seed)
174     return m.mouseHash();
175 }
176 
177 typedef QHash<MouseState, QAction*> MouseStateMap;
178 
179 class Command {
180 public:
181     Command();
182     Command(QAction *a, MouseState mf, MouseState mw);
183 
184     // Components
185     QAction *action = nullptr;
186     QKeySequence keys;      // taken from the QAction in constructor
187     MouseState mouseFullscreen;
188     MouseState mouseWindowed;
189 
190     // I/O functions
191     QString toString() const;
192     QVariantMap toVMap() const;
193     void fromVMap(const QVariantMap &map);
194 
195     // Conversion functions
196     void fromAction(QAction *a);
197 };
198 
199 
200 
201 class AudioDevice {
202 public:
203     AudioDevice();
204     AudioDevice(const QVariantMap &m);
205     void setFromVMap(const QVariantMap &m);
206 
207     bool operator ==(const AudioDevice &other) const;
208     QString displayString() const;
209     QString deviceName() const;
210 
211     static QList<AudioDevice> listFromVList(const QVariantList &list);
212 
213 private:
214     QString displayString_;
215     QString deviceName_;
216 };
217 
218 
219 
220 
221 #endif // HELPERS_H
222