diff options
author | Sebastian Kügler <sebas@kde.org> | 2016-01-13 03:05:06 +0100 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2016-01-13 16:27:41 -0800 |
commit | 53024ca76dda71ad1a3447d8ec9e15fe70c69c9f (patch) | |
tree | 7826afdd1674eb62479addfc73392018b8aaf787 /qt-mobile | |
parent | 8199c13f42a9469a8293803ec888654f3a0f1e33 (diff) | |
download | subsurface-53024ca76dda71ad1a3447d8ec9e15fe70c69c9f.tar.gz |
try to fix profile scaling
Different approach here:
- profile gets a bit higher, this was requested on the mailinglist, and
seems to behave much better with the painted profile, we'd otherwise
get it magically clipped on the right hand side.
- Make the scaling dpi aware, this fixes scaling for me on the Nexus7, I
haven't been able to test it properly on other devices, so this needs
some more testing. The result is visually quite close to what we can
do, although I'm still getting a somewhat larger margin on the right.
To get at the devicePixelRatio without too much custom code, I've
added a property to the QMLProfile to retrieve it from the theme engine.
Signed-off-by: Sebastian Kügler <sebas@kde.org>
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
Diffstat (limited to 'qt-mobile')
-rw-r--r-- | qt-mobile/qml/DiveDetailsView.qml | 7 | ||||
-rw-r--r-- | qt-mobile/qmlprofile.cpp | 35 | ||||
-rw-r--r-- | qt-mobile/qmlprofile.h | 7 |
3 files changed, 37 insertions, 12 deletions
diff --git a/qt-mobile/qml/DiveDetailsView.qml b/qt-mobile/qml/DiveDetailsView.qml index 519bd7a65..7fdbc2a2e 100644 --- a/qt-mobile/qml/DiveDetailsView.qml +++ b/qt-mobile/qml/DiveDetailsView.qml @@ -28,7 +28,6 @@ Item { GridLayout { id: mainLayout anchors { - //fill: parent top: parent.top left: parent.left right: parent.right @@ -118,9 +117,11 @@ Item { QMLProfile { id: qmlProfile Layout.fillWidth: true - Layout.minimumHeight: Layout.preferredHeight - Layout.preferredHeight: width * 0.66 + Layout.preferredHeight: Layout.minimumHeight + Layout.minimumHeight: width * 0.75 Layout.columnSpan: 4 + clip: false + devicePixelRatio: MobileComponents.Units.devicePixelRatio Rectangle { color: "transparent" opacity: 0.6 diff --git a/qt-mobile/qmlprofile.cpp b/qt-mobile/qmlprofile.cpp index 9c1fd32a9..2c50bad3e 100644 --- a/qt-mobile/qmlprofile.cpp +++ b/qt-mobile/qmlprofile.cpp @@ -40,21 +40,30 @@ void QMLProfile::setDiveId(const QString &diveId) static bool firstRun = true; static QTransform profileTransform; m_diveId = diveId; - double marginFactor = 0.013; // margin as proportion of profile display width struct dive *d = get_dive_by_uniq_id(m_diveId.toInt()); if (m_diveId.toInt() < 1) return; if (!d) return; - - qDebug() << "setDiveId called with pos/size" << x() << y() << width() << height(); + //qDebug() << "setDiveId called with pos/size" << x() << y() << width() << height(); // set the profile widget's geometry and scale the viewport so // the scene fills it, then plot the dive on that widget + // the profile widget doesn't handle subsequent geometry changes well, + // so only do it once, then scale the image to the item's dimension. if (firstRun) { firstRun = false; m_profileWidget->setGeometry(QRect(x(), y(), width(), height())); - profileTransform.scale(width() / 100, height() / 100); } + // scale the profile widget's image to devicePixelRatio and a magic number + qreal dpr = (80 * (m_devicePixelRatio > 2 ? m_devicePixelRatio : 1.0)); + qreal sx = width() / dpr; + qreal sy = height() / dpr; + // don't forget to reset, otherwise we're + // scaling scaled items, growing it bigger and bigger with every pass + profileTransform.reset(); + profileTransform.scale(sx, sy); + //qDebug() << "scale:" << sx << sy; + m_profileWidget->setTransform(profileTransform); qDebug() << "effective transformation:" << m_profileWidget->transform().m11() << @@ -66,10 +75,18 @@ void QMLProfile::setDiveId(const QString &diveId) m_profileWidget->transform().m31() << m_profileWidget->transform().m32() << m_profileWidget->transform().m33(); - m_profileWidget->plotDive(d); - // scale the profile to create a margin - // the profile height is ~2/3 the width, so to create an even margin, - // the scale reduction for height should be 3/2 the reduction for width - m_profileWidget->scale(1 - 2 * marginFactor, 1 - 3 * marginFactor); +} + +qreal QMLProfile::devicePixelRatio() const +{ + return m_devicePixelRatio; +} + +void QMLProfile::setDevicePixelRatio(qreal dpr) +{ + if (dpr != m_devicePixelRatio) { + m_devicePixelRatio = dpr; + emit devicePixelRatioChanged(); + } } diff --git a/qt-mobile/qmlprofile.h b/qt-mobile/qmlprofile.h index 8a1c63fe6..35332ce8d 100644 --- a/qt-mobile/qmlprofile.h +++ b/qt-mobile/qmlprofile.h @@ -9,6 +9,8 @@ class QMLProfile : public QQuickPaintedItem { Q_OBJECT Q_PROPERTY(QString diveId READ diveId WRITE setDiveId NOTIFY diveIdChanged) + Q_PROPERTY(qreal devicePixelRatio READ devicePixelRatio WRITE setDevicePixelRatio NOTIFY devicePixelRatioChanged) + public: explicit QMLProfile(QQuickItem *parent = 0); virtual ~QMLProfile(); @@ -17,15 +19,20 @@ public: QString diveId() const; void setDiveId(const QString &diveId); + qreal devicePixelRatio() const; + void setDevicePixelRatio(qreal dpr); + public slots: void setMargin(int margin); private: QString m_diveId; + qreal m_devicePixelRatio; int m_margin; ProfileWidget2 *m_profileWidget; signals: void rightAlignedChanged(); void diveIdChanged(); + void devicePixelRatioChanged(); }; #endif // QMLPROFILE_H |