mirror of
https://github.com/subsurface/subsurface.git
synced 2025-02-19 22:16:15 +00:00
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>
This commit is contained in:
parent
7d5cf32501
commit
581faa598e
3 changed files with 145 additions and 2 deletions
93
qt-ui/profile/diveprofileitem.cpp
Normal file
93
qt-ui/profile/diveprofileitem.cpp
Normal file
|
@ -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]);
|
||||||
|
}
|
||||||
|
}
|
48
qt-ui/profile/diveprofileitem.h
Normal file
48
qt-ui/profile/diveprofileitem.h
Normal file
|
@ -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
|
|
@ -70,7 +70,8 @@ HEADERS = \
|
||||||
qt-ui/profile/divetextitem.h \
|
qt-ui/profile/divetextitem.h \
|
||||||
qt-ui/profile/animationfunctions.h \
|
qt-ui/profile/animationfunctions.h \
|
||||||
qt-ui/profile/divecartesianaxis.h \
|
qt-ui/profile/divecartesianaxis.h \
|
||||||
qt-ui/profile/diveplotdatamodel.h
|
qt-ui/profile/diveplotdatamodel.h \
|
||||||
|
qt-ui/profile/diveprofileitem.h
|
||||||
|
|
||||||
SOURCES = \
|
SOURCES = \
|
||||||
deco.c \
|
deco.c \
|
||||||
|
@ -128,7 +129,8 @@ SOURCES = \
|
||||||
qt-ui/profile/divetextitem.cpp \
|
qt-ui/profile/divetextitem.cpp \
|
||||||
qt-ui/profile/animationfunctions.cpp \
|
qt-ui/profile/animationfunctions.cpp \
|
||||||
qt-ui/profile/divecartesianaxis.cpp \
|
qt-ui/profile/divecartesianaxis.cpp \
|
||||||
qt-ui/profile/diveplotdatamodel.cpp
|
qt-ui/profile/diveplotdatamodel.cpp \
|
||||||
|
qt-ui/profile/diveprofileitem.cpp
|
||||||
|
|
||||||
linux*: SOURCES += linux.c
|
linux*: SOURCES += linux.c
|
||||||
mac: SOURCES += macos.c
|
mac: SOURCES += macos.c
|
||||||
|
|
Loading…
Add table
Reference in a new issue