QmlMaterial 0.1.0
Loading...
Searching...
No Matches
container.hpp
1#pragma once
2
3#include <QQmlListProperty>
4#include <QHash>
5#include "qml_material/control/control.hpp"
6
7namespace qml_material
8{
9class ContainerAttached;
10
14class QML_MATERIAL_API Container : public Control {
15 Q_OBJECT
16 QML_NAMED_ELEMENT(ContainerBase)
17 QML_ATTACHED(ContainerAttached)
18 Q_CLASSINFO("DefaultProperty", "contentData")
19 Q_PROPERTY(QQmlListProperty<QObject> contentData READ contentData FINAL)
20 Q_PROPERTY(QQmlListProperty<QQuickItem> contentChildren READ contentChildren NOTIFY
21 contentChildrenChanged FINAL)
22 Q_PROPERTY(QQuickItem* contentHost READ contentHost CONSTANT FINAL)
23 Q_PROPERTY(int count READ count NOTIFY countChanged FINAL)
24 Q_PROPERTY(
25 int currentIndex READ currentIndex WRITE setCurrentIndex NOTIFY currentIndexChanged FINAL)
26 Q_PROPERTY(QQuickItem* currentItem READ currentItem NOTIFY currentItemChanged)
27 Q_PROPERTY(qreal contentWidth READ contentWidth WRITE setContentWidth RESET resetContentWidth
28 NOTIFY contentWidthChanged FINAL)
29 Q_PROPERTY(qreal contentHeight READ contentHeight WRITE setContentHeight RESET
30 resetContentHeight NOTIFY contentHeightChanged FINAL)
31public:
32 explicit Container(QQuickItem* parent = nullptr);
33 ~Container() override;
34 static ContainerAttached* qmlAttachedProperties(QObject*);
35 QQmlListProperty<QObject> contentData();
36 QQmlListProperty<QQuickItem> contentChildren();
37 QQuickItem* contentHost() const { return m_host; }
38 int count() const { return m_items.size(); }
39 int currentIndex() const { return m_index; }
40 QQuickItem* currentItem() const { return m_current; }
41 Q_INVOKABLE void setCurrentIndex(int);
42 Q_INVOKABLE QQuickItem* itemAt(int) const;
43 Q_INVOKABLE int indexOf(QQuickItem*) const;
44 Q_INVOKABLE void addItem(QQuickItem*);
45 Q_INVOKABLE void insertItem(int, QQuickItem*);
46 Q_INVOKABLE void moveItem(int, int);
47 // removeItem schedules deletion; takeItem detaches without destroying the item.
48 Q_INVOKABLE void removeItem(QQuickItem*);
49 Q_INVOKABLE QQuickItem* takeItem(int);
50 Q_INVOKABLE virtual void incrementCurrentIndex();
51 Q_INVOKABLE virtual void decrementCurrentIndex();
52 qreal contentWidth() const;
53 qreal contentHeight() const;
54 void setContentWidth(qreal);
55 void setContentHeight(qreal);
56 void resetContentWidth();
57 void resetContentHeight();
58 Q_SIGNAL void countChanged();
59 Q_SIGNAL void currentIndexChanged();
60 Q_SIGNAL void currentItemChanged();
61 Q_SIGNAL void contentChildrenChanged();
62 Q_SIGNAL void contentWidthChanged();
63 Q_SIGNAL void contentHeightChanged();
64
65protected:
66 virtual bool isContent(QQuickItem*) const;
67 virtual void itemAdded(QQuickItem*) {}
68 virtual void itemRemoved(QQuickItem*) {}
69 virtual void itemsChanged() {}
70 virtual void currentItemChange() {}
71 virtual int initialIndex() const;
72 void componentComplete() override;
73 void updatePolish() override;
74 QSizeF measureImplicitContent() const override;
75 const QList<QPointer<QQuickItem>>& items() const { return m_items; }
76 quint64 revision() const { return m_revision; }
77 void refreshItems();
78 void setImplicitContentSize(const QSizeF&);
79 void beginTeardown();
80 void setPresentationHost(QQuickItem*, QQuickItem*);
81 QQuickItem* presentationItem(QQuickItem*) const;
82
83private:
84 void updateContentSize();
85 QQuickItem* m_host;
86 QHash<QQuickItem*, QPointer<QQuickItem>> m_presentation_hosts;
87 QList<QPointer<QQuickItem>> m_items;
88 QList<QPointer<QQuickItem>> m_observed;
89 QList<QMetaObject::Connection> m_connections;
90 QList<QMetaObject::Connection> m_measure_connections;
91 QPointer<QQuickItem> m_current;
92 QQuickItem* m_current_identity = nullptr;
93 int m_index = -1;
94 bool m_explicit_index = false;
95 bool m_refreshing = false;
96 bool m_refresh_again = false;
97 bool m_destroying = false;
98 quint64 m_revision = 0;
99 std::optional<QSizeF> m_implicit_content;
100 QSizeF m_content_size { 0, 0 };
101 std::optional<qreal> m_content_width;
102 std::optional<qreal> m_content_height;
103};
104
105class QML_MATERIAL_API MaterialContainer : public Container {
106 Q_OBJECT
107 QML_NAMED_ELEMENT(Container)
108 QML_ATTACHED(ContainerAttached)
109public:
110 using Container::Container;
111};
112
113class QML_MATERIAL_API ContainerAttached : public QObject {
114 Q_OBJECT
115 Q_PROPERTY(Container* container READ container NOTIFY containerChanged FINAL)
116 Q_PROPERTY(int index READ index NOTIFY indexChanged FINAL)
117 Q_PROPERTY(bool managed READ isManaged WRITE setManaged NOTIFY managedChanged FINAL)
118public:
119 explicit ContainerAttached(QObject* parent): QObject(parent) {}
120 Container* container() const { return m_container; }
121 int index() const { return m_index; }
122 bool isManaged() const { return m_managed; }
123 void setManaged(bool);
124 Q_SIGNAL void containerChanged();
125 Q_SIGNAL void indexChanged();
126 Q_SIGNAL void managedChanged();
127
128private:
129 friend class Container;
130 void update(Container*, int);
131 QPointer<Container> m_container;
132 int m_index = -1;
133 bool m_managed = true;
134};
135} // namespace qml_material
136QML_DECLARE_TYPEINFO(qml_material::Container, QML_HAS_ATTACHED_PROPERTIES)
137QML_DECLARE_TYPEINFO(qml_material::MaterialContainer, QML_HAS_ATTACHED_PROPERTIES)
Definition container.hpp:14