summaryrefslogtreecommitdiffstats
path: root/qt-ui
diff options
context:
space:
mode:
authorGravatar Tomaz Canabrava <tcanabrava@kde.org>2014-01-14 17:17:17 -0200
committerGravatar Dirk Hohndel <dirk@hohndel.org>2014-01-16 10:12:30 +0700
commit581faa598e07f87de2f1dd23b383faad9cb18a51 (patch)
treecdfc7dec6e8f71160f7898dab423f46682db5567 /qt-ui
parent7d5cf325016925f4072aa31b92beaae4f9a59695 (diff)
downloadsubsurface-581faa598e07f87de2f1dd23b383faad9cb18a51.tar.gz
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 <tcanabrava@kde.org> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
Diffstat (limited to 'qt-ui')
-rw-r--r--qt-ui/profile/diveprofileitem.cpp93
-rw-r--r--qt-ui/profile/diveprofileitem.h48
2 files changed, 141 insertions, 0 deletions
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 <QPen>
+#include <QPainter>
+#include <QLinearGradient>
+
+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<QColor>()));
+ 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 <QObject>
+#include <QGraphicsPolygonItem>
+
+/* 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