QmlMaterial 0.1.0
Loading...
Searching...
No Matches
adaptive_presenter.hpp
1#pragma once
2
3#include <QPointer>
4#include <QQuickItem>
5#include <qqmlregistration.h>
6#include "qml_material/control/popup.hpp"
7#include "qml_material/item/item_proxy.hpp"
8
9namespace qml_material
10{
11class PresentationSite;
12
13class QML_MATERIAL_API AdaptivePresenter : public QObject {
14 Q_OBJECT
15 QML_ELEMENT
16 Q_PROPERTY(QQuickItem* content READ content WRITE setContent NOTIFY contentChanged FINAL)
17 Q_PROPERTY(PresentationSite* destination READ destination WRITE setDestination NOTIFY
18 destinationChanged FINAL)
19 Q_PROPERTY(bool enabled READ enabled WRITE setEnabled NOTIFY enabledChanged FINAL)
20 Q_PROPERTY(PresentationSite* currentSite READ currentSite NOTIFY currentSiteChanged FINAL)
21 Q_PROPERTY(Status status READ status NOTIFY statusChanged FINAL)
22 Q_PROPERTY(QString errorString READ errorString NOTIFY errorStringChanged FINAL)
23public:
24 enum Status
25 {
26 Inactive,
27 Mounted,
28 Opening,
29 Open,
30 Closing,
31 Switching,
32 Error
33 };
34 Q_ENUM(Status)
35 explicit AdaptivePresenter(QObject* parent = nullptr);
36 ~AdaptivePresenter() override;
37 QQuickItem* content() const { return m_content; }
38 PresentationSite* destination() const;
39 PresentationSite* currentSite() const;
40 bool enabled() const { return m_enabled; }
41 Status status() const { return m_status; }
42 QString errorString() const { return m_error; }
43 void setContent(QQuickItem*);
44 void setDestination(PresentationSite*);
45 void setEnabled(bool);
46 Q_INVOKABLE void present();
47 Q_INVOKABLE void dismiss();
48 Q_SIGNAL void contentChanged();
49 Q_SIGNAL void destinationChanged();
50 Q_SIGNAL void enabledChanged();
51 Q_SIGNAL void currentSiteChanged();
52 Q_SIGNAL void statusChanged();
53 Q_SIGNAL void errorStringChanged();
54 Q_SIGNAL void dismissed();
55 Q_SIGNAL void aboutToRelocate(PresentationSite* from, PresentationSite* to);
56
57private:
58 friend class PresentationSite;
59 void schedule();
60 void reconcile(bool activationRequest = false);
61 QString siteError(PresentationSite*) const;
62 void detach();
63 void siteChanging(PresentationSite*);
64 void observePopup();
65 void updateStatus();
66 void setStatus(Status);
67 void setError(const QString&);
68 void completeDismiss(quint64);
69 void finishReturn();
70 QPointer<QQuickItem> m_content;
71 QPointer<PresentationSite> m_destination, m_current;
72 QPointer<Popup> m_popup;
73 QList<QPointer<PresentationSite>> m_sites;
74 QList<QMetaObject::Connection> m_contentConnections, m_popupConnections;
75 QMetaObject::Connection m_destinationConnection;
76 Status m_status = Inactive;
77 QString m_error;
78 quint64 m_generation = 0, m_closeGeneration = 0;
79 bool m_enabled = true, m_queued = false, m_destroying = false, m_relocating = false;
80 bool m_suppressed = false, m_lostControl = false;
81 bool m_openRequested = false, m_dismissRequested = false;
82 bool m_session = false, m_explicit = false, m_reachedOpen = false;
83};
84
85class QML_MATERIAL_API PresentationSite : public QQuickItem {
86 Q_OBJECT
87 QML_ELEMENT
88 Q_PROPERTY(AdaptivePresenter* presenter READ presenter WRITE setPresenter NOTIFY
89 presenterChanged FINAL)
90 Q_PROPERTY(Popup* popup READ popup WRITE setPopup NOTIFY popupChanged FINAL)
91 Q_PROPERTY(PresentationSite* originSite READ originSite WRITE setOriginSite NOTIFY
92 originSiteChanged FINAL)
93 Q_PROPERTY(bool autoOpen READ autoOpen WRITE setAutoOpen NOTIFY autoOpenChanged FINAL)
94 Q_PROPERTY(bool current READ current NOTIFY currentChanged FINAL)
95 Q_PROPERTY(bool activationEnabled READ activationEnabled WRITE setActivationEnabled NOTIFY
96 activationEnabledChanged FINAL)
97public:
98 explicit PresentationSite(QQuickItem* parent = nullptr);
99 ~PresentationSite() override;
100 AdaptivePresenter* presenter() const { return m_presenter; }
101 Popup* popup() const { return m_popup; }
102 PresentationSite* originSite() const { return m_origin; }
103 void setOriginSite(PresentationSite*);
104 Q_SIGNAL void originSiteChanged();
105 bool autoOpen() const { return m_autoOpen; }
106 bool current() const { return m_proxy->controlling(); }
107 bool activationEnabled() const { return m_activationEnabled; }
108 void setPresenter(AdaptivePresenter*);
109 void setPopup(Popup*);
110 void setAutoOpen(bool);
111 void setActivationEnabled(bool);
112 Q_SIGNAL void presenterChanged();
113 Q_SIGNAL void popupChanged();
114 Q_SIGNAL void autoOpenChanged();
115 Q_SIGNAL void currentChanged();
116 Q_SIGNAL void activationEnabledChanged();
117 Q_SIGNAL void activationRequested();
118
119protected:
120 void geometryChange(const QRectF&, const QRectF&) override;
121 void componentComplete() override;
122
123private:
124 friend class AdaptivePresenter;
125 void changed();
126 void observePopupParent();
127 bool acquirePopup();
128 ItemProxy* m_proxy;
129 QPointer<AdaptivePresenter> m_presenter;
130 QPointer<Popup> m_popup;
131 QPointer<PresentationSite> m_origin;
132 QMetaObject::Connection m_originConnection;
133 bool m_originRequired = false;
134 QList<QMetaObject::Connection> m_popupConnections;
135 QMetaObject::Connection m_windowConnection;
136 bool m_autoOpen = true, m_popupRequired = false, m_destroying = false;
137 bool m_activationEnabled = false;
138};
139} // namespace qml_material