From 53024ca76dda71ad1a3447d8ec9e15fe70c69c9f Mon Sep 17 00:00:00 2001 From: Sebastian Kügler Date: Wed, 13 Jan 2016 03:05:06 +0100 Subject: try to fix profile scaling MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Signed-off-by: Dirk Hohndel --- qt-mobile/qmlprofile.cpp | 35 ++++++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 9 deletions(-) (limited to 'qt-mobile/qmlprofile.cpp') 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(); + } } -- cgit v1.2.3-70-g09d2