summaryrefslogtreecommitdiffstats
path: root/qt-mobile
diff options
context:
space:
mode:
authorGravatar Sebastian Kügler <sebas@kde.org>2016-01-13 03:05:06 +0100
committerGravatar Dirk Hohndel <dirk@hohndel.org>2016-01-13 16:27:41 -0800
commit53024ca76dda71ad1a3447d8ec9e15fe70c69c9f (patch)
tree7826afdd1674eb62479addfc73392018b8aaf787 /qt-mobile
parent8199c13f42a9469a8293803ec888654f3a0f1e33 (diff)
downloadsubsurface-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.qml7
-rw-r--r--qt-mobile/qmlprofile.cpp35
-rw-r--r--qt-mobile/qmlprofile.h7
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