QmlMaterial 0.1.0
Loading...
Searching...
No Matches
time_state.hpp
1#pragma once
2
3#include <QLocale>
4#include <QProperty>
5#include <QValidator>
6#include <QPointer>
7#include <QtQml/qqmlregistration.h>
8#include "qml_material/export.hpp"
9
10namespace qml_material
11{
13class QML_MATERIAL_API TimeState : public QObject {
14 Q_OBJECT
15 QML_ELEMENT
16 Q_PROPERTY(int value READ value WRITE setValue NOTIFY changed FINAL)
17 Q_PROPERTY(int hour READ hour WRITE setHour NOTIFY changed FINAL)
18 Q_PROPERTY(int minute READ minute WRITE setMinute NOTIFY changed FINAL)
19 Q_PROPERTY(QLocale locale READ locale WRITE setLocale NOTIFY changed FINAL)
20 Q_PROPERTY(HourFormat hourFormat READ hourFormat WRITE setHourFormat NOTIFY changed FINAL)
21 Q_PROPERTY(bool is24Hour READ is24Hour NOTIFY changed FINAL)
22 Q_PROPERTY(Selection selection READ selection WRITE setSelection NOTIFY changed FINAL)
23 Q_PROPERTY(DisplayMode displayMode READ displayMode WRITE setDisplayMode NOTIFY changed FINAL)
24 Q_PROPERTY(int period READ period WRITE setPeriod NOTIFY changed FINAL)
25 Q_PROPERTY(QString hourText READ hourText NOTIFY changed FINAL)
26 Q_PROPERTY(QString minuteText READ minuteText NOTIFY changed FINAL)
27 Q_PROPERTY(bool hourAcceptable READ hourAcceptable NOTIFY changed FINAL)
28 Q_PROPERTY(bool minuteAcceptable READ minuteAcceptable NOTIFY changed FINAL)
29 Q_PROPERTY(bool acceptableInput READ acceptableInput NOTIFY changed FINAL)
30 Q_PROPERTY(QString displayText READ displayText NOTIFY changed FINAL)
31 Q_PROPERTY(QString inputFormat READ inputFormat NOTIFY changed FINAL)
32 Q_PROPERTY(QString amText READ amText NOTIFY changed FINAL)
33 Q_PROPERTY(QString pmText READ pmText NOTIFY changed FINAL)
34public:
35 enum HourFormat
36 {
37 LocaleFormat,
38 Hour12,
39 Hour24
40 };
41 Q_ENUM(HourFormat)
42 enum Selection
43 {
44 Hours,
45 Minutes
46 };
47 Q_ENUM(Selection)
48 enum DisplayMode
49 {
50 Clock,
51 Input
52 };
53 Q_ENUM(DisplayMode)
54 explicit TimeState(QObject* parent = nullptr);
55 int value() const { return m_data.value().value; }
56 int hour() const { return value() / 60; }
57 int minute() const { return value() % 60; }
58 void setValue(int);
59 void setHour(int);
60 void setMinute(int);
61 QLocale locale() const { return m_data.value().locale; }
62 void setLocale(const QLocale&);
63 HourFormat hourFormat() const { return m_data.value().format; }
64 void setHourFormat(HourFormat);
65 bool is24Hour() const;
66 Selection selection() const { return m_data.value().selection; }
67 void setSelection(Selection);
68 DisplayMode displayMode() const { return m_data.value().mode; }
69 void setDisplayMode(DisplayMode);
70 int period() const { return hour() >= 12 ? 1 : 0; }
71 void setPeriod(int);
72 QString hourText() const { return m_data.value().hourText; }
73 QString minuteText() const { return m_data.value().minuteText; }
74 bool hourAcceptable() const { return m_data.value().draftHour >= 0; }
75 bool minuteAcceptable() const { return m_data.value().draftMinute >= 0; }
76 bool acceptableInput() const { return hourAcceptable() && minuteAcceptable(); }
77 QString displayText() const { return formatTime(value()); }
78 QString inputFormat() const;
79 QString amText() const { return locale().amText(); }
80 QString pmText() const { return locale().pmText(); }
81 Q_INVOKABLE bool setTime(int hour, int minute);
82 Q_INVOKABLE void editHour(const QString&);
83 Q_INVOKABLE void editMinute(const QString&);
84 Q_INVOKABLE void discardInput();
85 Q_INVOKABLE bool commitInput();
86 Q_INVOKABLE void selectDial(int value, bool complete = false);
87 Q_INVOKABLE void step(int delta);
88 Q_INVOKABLE QString number(int value, bool padded = false) const;
89 Q_INVOKABLE QString formatTime(int value) const;
90 Q_INVOKABLE int parseText(const QString&) const;
91 Q_SIGNAL void changed();
92 Q_SIGNAL void modified(int value);
93
94private:
95 struct Data {
96 int value = 0;
97 QLocale locale;
98 HourFormat format = LocaleFormat;
99 Selection selection = Hours;
100 DisplayMode mode = Clock;
101 QString hourText, minuteText;
102 int draftHour = 0, draftMinute = 0;
103 bool operator==(const Data&) const = default;
104 };
105 static bool uses24Hour(const Data&);
106 static void formatInput(Data&);
107 void edit(const QString&, bool hour);
108 void publish(Data, bool user = false);
109 QProperty<Data> m_data;
110};
111
112class QML_MATERIAL_API TimeValidator : public QValidator {
113 Q_OBJECT
114 QML_ELEMENT
115 Q_PROPERTY(qml_material::TimeState* time READ time WRITE setTime NOTIFY timeChanged FINAL)
116public:
117 explicit TimeValidator(QObject* parent = nullptr): QValidator(parent) {}
118 TimeState* time() const { return m_time; }
119 void setTime(TimeState*);
120 State validate(QString&, int&) const override;
121 Q_INVOKABLE int parse(const QString&) const;
122 Q_SIGNAL void timeChanged();
123
124private:
125 QPointer<TimeState> m_time;
126 QMetaObject::Connection m_changed, m_destroyed;
127 mutable QString m_text;
128 mutable int m_value = -1;
129 mutable bool m_cached = false;
130};
131} // namespace qml_material
Definition time_state.hpp:13