From 623305965bb645529f31778e3b1f04edb28e0fb4 Mon Sep 17 00:00:00 2001 From: James Turner Date: Fri, 3 Nov 2017 15:31:57 +0000 Subject: [PATCH] Fix canvas sizing + scaling --- utils/fgqcanvas/canvasconnection.cpp | 17 ++++++++--------- utils/fgqcanvas/canvasconnection.h | 12 +++++------- utils/fgqcanvas/canvasdisplay.cpp | 10 +++------- utils/fgqcanvas/fgcanvasgroup.cpp | 16 +++++++++++++--- utils/fgqcanvas/fgcanvasgroup.h | 1 + utils/fgqcanvas/fgqcanvasimage.cpp | 2 +- utils/fgqcanvas/qml/CanvasFrame.qml | 28 ++++++++++++---------------- 7 files changed, 43 insertions(+), 43 deletions(-) diff --git a/utils/fgqcanvas/canvasconnection.cpp b/utils/fgqcanvas/canvasconnection.cpp index d9a99a6f1..159504481 100644 --- a/utils/fgqcanvas/canvasconnection.cpp +++ b/utils/fgqcanvas/canvasconnection.cpp @@ -81,8 +81,7 @@ bool CanvasConnection::restoreState(QJsonObject state) m_destRect = QRectF(rect[0].toDouble(), rect[1].toDouble(), rect[2].toDouble(), rect[3].toDouble()); - emit sizeChanged(m_destRect.size()); - emit centerChanged(m_destRect.center()); + emit geometryChanged(); emit rootPathChanged(); emit webSocketUrlChanged(); @@ -100,13 +99,13 @@ void CanvasConnection::showDebugTree() qWarning() << Q_FUNC_INFO << "implement me!"; } -void CanvasConnection::setCenter(QPointF c) +void CanvasConnection::setOrigin(QPointF c) { - if (center() == c) + if (m_destRect.topLeft() == c) return; - m_destRect.moveCenter(c); - emit centerChanged(c); + m_destRect.moveTopLeft(c); + emit geometryChanged(); } void CanvasConnection::setSize(QSizeF sz) @@ -115,7 +114,7 @@ void CanvasConnection::setSize(QSizeF sz) return; m_destRect.setSize(sz); - emit sizeChanged(sz); + emit geometryChanged(); } void CanvasConnection::connectWebSocket(QByteArray hostName, int port) @@ -133,9 +132,9 @@ void CanvasConnection::connectWebSocket(QByteArray hostName, int port) setStatus(Connecting); } -QPointF CanvasConnection::center() const +QPointF CanvasConnection::origin() const { - return m_destRect.center(); + return m_destRect.topLeft(); } QSizeF CanvasConnection::size() const diff --git a/utils/fgqcanvas/canvasconnection.h b/utils/fgqcanvas/canvasconnection.h index 4ec43ba3a..a12d21c48 100644 --- a/utils/fgqcanvas/canvasconnection.h +++ b/utils/fgqcanvas/canvasconnection.h @@ -40,8 +40,8 @@ class CanvasConnection : public QObject Q_PROPERTY(Status status READ status NOTIFY statusChanged) // QML exposed versions of the destination rect - Q_PROPERTY(QPointF center READ center WRITE setCenter NOTIFY centerChanged) - Q_PROPERTY(QSizeF size READ size WRITE setSize NOTIFY sizeChanged) + Q_PROPERTY(QPointF origin READ origin WRITE setOrigin NOTIFY geometryChanged) + Q_PROPERTY(QSizeF size READ size WRITE setSize NOTIFY geometryChanged) Q_PROPERTY(QUrl webSocketUrl READ webSocketUrl NOTIFY webSocketUrlChanged) Q_PROPERTY(QString rootPath READ rootPath NOTIFY rootPathChanged) @@ -71,7 +71,7 @@ public: bool restoreState(QJsonObject state); void connectWebSocket(QByteArray hostName, int port); - QPointF center() const; + QPointF origin() const; QSizeF size() const; @@ -97,16 +97,14 @@ public Q_SLOTS: // not on iOS / Android - requires widgets void showDebugTree(); - void setCenter(QPointF center); + void setOrigin(QPointF center); void setSize(QSizeF size); signals: void statusChanged(Status status); - void centerChanged(QPointF center); - - void sizeChanged(QSizeF size); + void geometryChanged(); void rootPathChanged(); diff --git a/utils/fgqcanvas/canvasdisplay.cpp b/utils/fgqcanvas/canvasdisplay.cpp index ef44eff46..2effe7abe 100644 --- a/utils/fgqcanvas/canvasdisplay.cpp +++ b/utils/fgqcanvas/canvasdisplay.cpp @@ -123,16 +123,12 @@ void CanvasDisplay::onCanvasSizeChanged() { m_sourceSize = QSizeF(m_connection->propertyRoot()->value("size", 400).toDouble(), m_connection->propertyRoot()->value("size[1]", 400).toDouble()); - recomputeScaling(); } void CanvasDisplay::recomputeScaling() { - double xScaleFactor = width() / m_sourceSize.width(); - double yScaleFactor = height() / m_sourceSize.height(); - - double finalScaleFactor = std::min(xScaleFactor, yScaleFactor); - - setScale(finalScaleFactor); + const double xScaleFactor = width() / m_sourceSize.width(); + const double yScaleFactor = height() / m_sourceSize.height(); + setScale(std::min(xScaleFactor, yScaleFactor)); } diff --git a/utils/fgqcanvas/fgcanvasgroup.cpp b/utils/fgqcanvas/fgcanvasgroup.cpp index 895d81d5a..c4158264a 100644 --- a/utils/fgqcanvas/fgcanvasgroup.cpp +++ b/utils/fgqcanvas/fgcanvasgroup.cpp @@ -93,8 +93,7 @@ void FGCanvasGroup::doPolish() if (_zIndicesDirty) { std::sort(_children.begin(), _children.end(), ChildOrderingFunction()); _zIndicesDirty = false; - - qWarning() << Q_FUNC_INFO << "adjust z order of quick items"; + resetChildQuickItemZValues(); } for (FGCanvasElement* element : _children) { @@ -102,9 +101,20 @@ void FGCanvasGroup::doPolish() } } +void FGCanvasGroup::resetChildQuickItemZValues() +{ + int counter = 0; + for (auto e : _children) { + auto qq = e->quickItem(); + if (qq) { + qq->setZ(counter++); + } + } +} + bool FGCanvasGroup::onChildAdded(LocalProp *prop) { - const bool isRootGroup = (parent() == nullptr); + const bool isRootGroup = (_parent == nullptr); int newChildCount = 0; if (FGCanvasElement::onChildAdded(prop)) { diff --git a/utils/fgqcanvas/fgcanvasgroup.h b/utils/fgqcanvas/fgcanvasgroup.h index cdba1d0a1..8b7b39492 100644 --- a/utils/fgqcanvas/fgcanvasgroup.h +++ b/utils/fgqcanvas/fgcanvasgroup.h @@ -42,6 +42,7 @@ protected: private: void markCachedSymbolDirty(); int indexOfChildWithProp(LocalProp *prop) const; + void resetChildQuickItemZValues(); private: mutable FGCanvasElementVec _children; diff --git a/utils/fgqcanvas/fgqcanvasimage.cpp b/utils/fgqcanvas/fgqcanvasimage.cpp index 7f22a73cc..6b4bf37eb 100644 --- a/utils/fgqcanvas/fgqcanvasimage.cpp +++ b/utils/fgqcanvas/fgqcanvasimage.cpp @@ -37,7 +37,7 @@ FGQCanvasImage::FGQCanvasImage(FGCanvasGroup* pr, LocalProp* prop) : void FGQCanvasImage::setEngine(QQmlEngine *engine) { - static_imageComponent = new QQmlComponent(engine, QUrl("image.qml")); + static_imageComponent = new QQmlComponent(engine, QUrl("qrc:///qml/image.qml")); if (!static_imageComponent || !static_imageComponent->errors().empty()) { qWarning() << static_imageComponent->errorString(); } diff --git a/utils/fgqcanvas/qml/CanvasFrame.qml b/utils/fgqcanvas/qml/CanvasFrame.qml index 32a9ac7d2..454210ed2 100644 --- a/utils/fgqcanvas/qml/CanvasFrame.qml +++ b/utils/fgqcanvas/qml/CanvasFrame.qml @@ -6,23 +6,21 @@ Item { property bool showDecorations: true property alias canvas: canvasDisplay.canvas - readonly property var centerPoint: Qt.point(width / 2, height / 2) - - clip: true; + //clip: true; Component.onCompleted: { if (canvas) { width = canvas.size.width height = canvas.size.height - x = canvas.center.x - (width / 2) - y = canvas.center.y - (height / 2) + x = canvas.origin.x + y = canvas.origin.y } } function saveGeometry() { - canvas.center = Qt.point(x + (width / 2), y + (height / 2)) - canvas.size = Qt.size(root.width / 2, root.height / 2); + canvas.origin = Qt.point(x, y ) + canvas.size = Qt.size(root.width, root.height); } FG.CanvasDisplay { @@ -33,9 +31,8 @@ Item { if (canvas) { root.width = canvas.size.width root.height = canvas.size.height - - root.x = canvas.center.x - (root.width / 2) - root.y = canvas.center.y - (root.height / 2) + root.x = canvas.origin.x + root.y = canvas.origin.y } } } @@ -73,13 +70,11 @@ Item { onPositionChanged: { var rootPos = mapToItem(root, mouse.x, mouse.y); - var rootDiff = Qt.point(rootPos.x - root.centerPoint.x, - rootPos.y - root.centerPoint.y); + // var rootDiff = Qt.point(rootPos.x - root.x, + // rootPos.y - root.y); - root.width = rootDiff.x * 2; - root.height = rootDiff.y * 2; - root.x = canvas.center.x - (root.width / 2) - root.y = canvas.center.y - (root.height / 2) + root.width = rootPos.x; + root.height = rootPos.y; } onReleased: { @@ -104,6 +99,7 @@ Item { case FG.CanvasConnection.NotConnected: return "Not connected"; case FG.CanvasConnection.Connecting: return "Connecting"; case FG.CanvasConnection.Connected: return "Connected"; + case FG.CanvasConnection.Closed: return "Closed"; case FG.CanvasConnection.Reconnecting: return "Re-connecting"; case FG.CanvasConnection.Error: return "Error"; }