From 581faa598e07f87de2f1dd23b383faad9cb18a51 Mon Sep 17 00:00:00 2001 From: Tomaz Canabrava Date: Tue, 14 Jan 2014 17:17:17 -0200 Subject: Added the DiveProfileItem that uses the DiveProfileModel to diplay data. I've used the paint() method on it ( even if it's not necessary on a QGraphicsView ) to reduce absurdely the number of items that are inserted on the QGraphicsScene ( each small line of the profile should be an item if it was not for this, it's like that on the old profile. ) and thus reducing the memory consumption, speed and so on. Signed-off-by: Tomaz Canabrava Signed-off-by: Dirk Hohndel --- qt-ui/profile/diveprofileitem.cpp | 93 +++++++++++++++++++++++++++++++++++++++ qt-ui/profile/diveprofileitem.h | 48 ++++++++++++++++++++ 2 files changed, 141 insertions(+) create mode 100644 qt-ui/profile/diveprofileitem.cpp create mode 100644 qt-ui/profile/diveprofileitem.h (limited to 'qt-ui') diff --git a/qt-ui/profile/diveprofileitem.cpp b/qt-ui/profile/diveprofileitem.cpp new file mode 100644 index 000000000..dbdddbb8b --- /dev/null +++ b/qt-ui/profile/diveprofileitem.cpp @@ -0,0 +1,93 @@ +#include "diveprofileitem.h" +#include "diveplotdatamodel.h" +#include "divecartesianaxis.h" +#include "graphicsview-common.h" + +#include +#include +#include + +DiveProfileItem::DiveProfileItem(): QObject(), QGraphicsPolygonItem(), + hAxis(NULL), hDataColumn(-1), dataModel(NULL), vAxis(NULL), vDataColumn(-1) +{ +} + +void DiveProfileItem::setHorizontalAxis(DiveCartesianAxis* horizontal) +{ + hAxis = horizontal; + modelDataChanged(); +} + +void DiveProfileItem::setHorizontalDataColumn(int column) +{ + hDataColumn = column; + modelDataChanged(); +} + +void DiveProfileItem::setModel(QAbstractTableModel* model) +{ + dataModel = model; + modelDataChanged(); +} + +void DiveProfileItem::setVerticalAxis(DiveCartesianAxis* vertical) +{ + vAxis = vertical; + modelDataChanged(); +} + +void DiveProfileItem::setVerticalDataColumn(int column) +{ + vDataColumn = column; + modelDataChanged(); +} + +void DiveProfileItem::modelDataChanged() +{ + // We don't have enougth data to calculate things, quit. + if (!hAxis || !vAxis || !dataModel || hDataColumn == -1 || vDataColumn == -1) + return; + + // Calculate the polygon. This is the polygon that will be painted on screen + // on the ::paint method. Here we calculate the correct position of the points + // regarting our cartesian plane ( made by the hAxis and vAxis ), the QPolygonF + // is an array of QPointF's, so we basically get the point from the model, convert + // to our coordinates, store. no painting is done here. + QPolygonF poly; + for(int i = 0, modelDataCount = dataModel->rowCount(); i < modelDataCount; i++){ + qreal horizontalValue = dataModel->index(i, hDataColumn).data().toReal(); + qreal verticalValue = dataModel->index(i, vDataColumn).data().toReal(); + QPointF point( hAxis->posAtValue(horizontalValue), vAxis->posAtValue(verticalValue)); + poly.append(point); + } + setPolygon(poly); + + // This is the blueish gradient that the Depth Profile should have. + // It's a simple QLinearGradient with 2 stops, starting from top to bottom. + QLinearGradient pat(0, poly.boundingRect().top(), 0, poly.boundingRect().bottom()); + pat.setColorAt(1, getColor(DEPTH_BOTTOM)); + pat.setColorAt(0, getColor(DEPTH_TOP)); + setBrush(QBrush(pat)); +} + +void DiveProfileItem::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget){ + Q_UNUSED(widget); + + // This paints the Polygon + Background. I'm setting the pen to QPen() so we don't get a black line here, + // after all we need to plot the correct velocities colors later. + setPen(QPen()); + QGraphicsPolygonItem::paint(painter, option, widget); + + // Here we actually paint the boundaries of the Polygon using the colors that the model provides. + // Those are the speed colors of the dives. + QPen pen; + pen.setCosmetic(true); + pen.setWidth(2); + // This paints the colors of the velocities. + for(int i = 1, count = dataModel->rowCount(); i < count; i++){ + QModelIndex colorIndex = dataModel->index(i, DivePlotDataModel::COLOR); + pen.setBrush(QBrush(colorIndex.data(Qt::BackgroundRole).value())); + painter->setPen(pen); + painter->drawLine(polygon()[i-1],polygon()[i]); + } +} diff --git a/qt-ui/profile/diveprofileitem.h b/qt-ui/profile/diveprofileitem.h new file mode 100644 index 000000000..1e8c0b296 --- /dev/null +++ b/qt-ui/profile/diveprofileitem.h @@ -0,0 +1,48 @@ +#ifndef DIVEPROFILEITEM_H +#define DIVEPROFILEITEM_H + +#include +#include + +/* This is the Profile Item, it should be used for quite a lot of things + on the profile view. The usage should be pretty simple: + + DiveProfileItem *profile = new DiveProfileItem(); + profile->setVerticalAxis( profileYAxis ); + profile->setHorizontalAxis( timeAxis ); + profile->setModel( DiveDataModel ); + profile->setHorizontalDataColumn( DiveDataModel::TIME ); + profile->setVerticalDataColumn( DiveDataModel::DEPTH ); + scene()->addItem(profile); + + This is a generically item and should be used as a base for others, I think... +*/ + +class DiveCartesianAxis; +class QAbstractTableModel; + +class DiveProfileItem : public QObject, public QGraphicsPolygonItem{ + Q_OBJECT + Q_PROPERTY(QPointF pos WRITE setPos READ pos) + Q_PROPERTY(qreal x WRITE setX READ x) + Q_PROPERTY(qreal y WRITE setY READ y) +public: + DiveProfileItem(); + void setVerticalAxis(DiveCartesianAxis *vertical); + void setHorizontalAxis(DiveCartesianAxis *horizontal); + void setModel(QAbstractTableModel *model); + void setHorizontalDataColumn(int column); + void setVerticalDataColumn(int column); + virtual void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget = 0); +public slots: + void modelDataChanged(); +private: + DiveCartesianAxis *hAxis; + DiveCartesianAxis *vAxis; + QAbstractTableModel *dataModel; + int hDataColumn; + int vDataColumn; +}; + + +#endif \ No newline at end of file -- cgit v1.2.3-70-g09d2