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 <dirk@hohndel.org>
This commit is contained in:
Dirk Hohndel 2015-12-01 15:22:38 -08:00
parent 9dd26a00e8
commit c0ac953242
2 changed files with 14 additions and 15 deletions

View file

@ -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);
}

View file

@ -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) {