subsurface/qt-mobile/qmlprofile.cpp
Dirk Hohndel c0ac953242 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>
2015-12-01 15:32:16 -08:00

48 lines
1 KiB
C++

#include "qmlprofile.h"
#include "profile-widget/profilewidget2.h"
#include "subsurface-core/dive.h"
#include <QTransform>
QMLProfile::QMLProfile(QQuickItem *parent) :
QQuickPaintedItem(parent)
{
m_profileWidget = new ProfileWidget2(0);
m_profileWidget->setProfileState();
m_profileWidget->setToolTipVisibile(false);
//m_profileWidget->setGeometry(this->geometry());
}
QMLProfile::~QMLProfile()
{
m_profileWidget->deleteLater();
}
void QMLProfile::paint(QPainter *painter)
{
QTransform profileTransform;
profileTransform.scale(width() / 100, height() / 100);
m_profileWidget->setTransform(profileTransform);
m_profileWidget->render(painter);
}
QString QMLProfile::diveId() const
{
return m_diveId;
}
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);
}