From c0ac9532427dee713c8ba96a1ceb10ee78b2bfc8 Mon Sep 17 00:00:00 2001 From: Dirk Hohndel Date: Tue, 1 Dec 2015 15:22:38 -0800 Subject: QML UI: call plot dive when we set the dive The asynchronous nature of the profile bites us here. plotDive() signals that it changes model data and expects the rest of the data structures to respond to that. Very neat and it seems to work perfectly well on the desktop, but on Android calling render() right after plotDive() resulted in paint() functions being called before all the elements had been calculated as a result of the signals being emitted in the model change. That's why so often the profile was missing parts. Now admittedly this makes me nervous. Do we now know that all calculations have finished by the time render() gets called? Not really. It just seems that in my testing we tend to get lucky and things work out. But that does not feel like a sane architecture to me. Messing around with the animation speed is silly as we render the profile into a pixmap, so let's turn this off globally. Also, the scaling of the pixmap is still completely bogus. Signed-off-by: Dirk Hohndel --- qt-mobile/qmlprofile.cpp | 28 +++++++++++++--------------- subsurface-mobile-main.cpp | 1 + 2 files changed, 14 insertions(+), 15 deletions(-) diff --git a/qt-mobile/qmlprofile.cpp b/qt-mobile/qmlprofile.cpp index a4ff8a9d6..a55bf8d32 100644 --- a/qt-mobile/qmlprofile.cpp +++ b/qt-mobile/qmlprofile.cpp @@ -19,24 +19,10 @@ QMLProfile::~QMLProfile() void QMLProfile::paint(QPainter *painter) { - if (m_diveId.toInt() < 1) - return; - - struct dive *d; - d = get_dive_by_uniq_id(m_diveId.toInt()); - if (!d) - return; - - int old_animation_speed = prefs.animation_speed; - prefs.animation_speed = 0; // no animations while rendering the QGraphicsView - - m_profileWidget->setGeometry(QRect(x(), y(), width(), height())); - m_profileWidget->plotDive(d); QTransform profileTransform; - profileTransform.scale(this->height() / 100, this->height() / 100); + profileTransform.scale(width() / 100, height() / 100); m_profileWidget->setTransform(profileTransform); m_profileWidget->render(painter); - prefs.animation_speed = old_animation_speed; } QString QMLProfile::diveId() const @@ -47,4 +33,16 @@ QString QMLProfile::diveId() const void QMLProfile::setDiveId(const QString &diveId) { m_diveId = diveId; + int no = -1; + struct dive *d = get_dive_by_uniq_id(m_diveId.toInt()); + if (d) + no = d->number; + if (m_diveId.toInt() < 1) + return; + + if (!d) + return; + + m_profileWidget->setGeometry(QRect(x(), y(), width(), height())); + m_profileWidget->plotDive(d); } diff --git a/subsurface-mobile-main.cpp b/subsurface-mobile-main.cpp index 079dbcc0a..279255ace 100644 --- a/subsurface-mobile-main.cpp +++ b/subsurface-mobile-main.cpp @@ -58,6 +58,7 @@ int main(int argc, char **argv) taglist_init_global(); init_ui(); loadPreferences(); + prefs.animation_speed = 0; init_proxy(); if (no_filenames) { if (prefs.default_file_behavior == LOCAL_DEFAULT_FILE) { -- cgit v1.2.3-70-g09d2