Bonus question: Would you happen to know how to re-implement this in C++? I tried my best but I don't think my best is good enough haha:
#pragma once
#include <QQuickItem>
#include <qproperty.h>
// Item that tracks when its window-local position is changed at any point
class PositionTrackingItem : public QQuickItem {
Q_OBJECT
QML_ELEMENT
Q_PROPERTY(QPointF globalPosition READ getGlobalPosition NOTIFY globalPositionChanged BINDABLE bindableGlobalPosition)
public:
PositionTrackingItem(QQuickItem* parent = nullptr);
inline QPointF getGlobalPosition() const { return globalPosition; }
QBindable<QPointF> bindableGlobalPosition() { return &globalPosition; }
signals:
void globalPositionChanged();
private:
Q_OBJECT_BINDABLE_PROPERTY(PositionTrackingItem, QPointF, globalPosition, &PositionTrackingItem::globalPositionChanged)
};
#include "PositionTrackingItem.h"
#include <qproperty.h>
// https://forum.qt.io/post/833294
PositionTrackingItem::PositionTrackingItem(QQuickItem* parent) : QQuickItem(parent) {
globalPosition.setBinding([&]() {
QPointF pos = QPointF(property("x").toFloat(), property("y").toFloat());
for (QQuickItem* item = property("parent").value<QQuickItem*>(); item != nullptr; item = item->property("parent").value<QQuickItem*>())
pos += QPointF(item->property("x").toFloat(), item->property("y").toFloat());
return pos;
});
}