QmlMaterial 0.1.0
Loading...
Searching...
No Matches
item_proxy.hpp
1#pragma once
2
3#include <QPointer>
4#include <QQuickItem>
5#include <qqmlregistration.h>
6#include <optional>
7#include "qml_material/export.hpp"
8
9namespace qml_material
10{
11class QML_MATERIAL_API ItemProxy : public QQuickItem {
12 Q_OBJECT
13 QML_ELEMENT
14
15 Q_PROPERTY(QQuickItem* target READ target WRITE setTarget NOTIFY targetChanged FINAL)
16 Q_PROPERTY(bool active READ active WRITE setActive NOTIFY activeChanged FINAL)
17 Q_PROPERTY(bool controlling READ controlling NOTIFY controllingChanged FINAL)
18public:
19 explicit ItemProxy(QQuickItem* parent = nullptr);
20 ~ItemProxy() override;
21 QQuickItem* target() const { return m_target; }
22 bool active() const { return m_active; }
23 bool controlling() const { return m_controlling; }
24 QString acquisitionError(QQuickItem* target, const ItemProxy* releasing = nullptr) const;
25 struct Geometry {
26 QRectF rect;
27 qreal scale = 1;
28 };
29 std::optional<Geometry> geometryIn(QQuickItem* coordinateItem) const;
30 bool takeFrom(ItemProxy* source);
31 void setTarget(QQuickItem*);
32 void setActive(bool);
33 Q_SIGNAL void targetChanged();
34 Q_SIGNAL void activeChanged();
35 Q_SIGNAL void controllingChanged();
36
37protected:
38 void geometryChange(const QRectF&, const QRectF&) override;
39 void componentComplete() override;
40
41private:
42 void acquire();
43 void release();
44 void syncGeometry();
45 void syncImplicitSize();
46 QPointer<QQuickItem> m_target;
47 QList<QMetaObject::Connection> m_connections;
48 quint64 m_revision = 0;
49 bool m_active = false;
50 bool m_controlling = false;
51 bool m_destroying = false;
52};
53
54} // namespace qml_material