Started the code for a grid that knows how to handle itself.

The code for this item is a bit too big to be just the grid
of the dives and I know that, don't bully me. :)
The main idea of this grid is that it knows when it should be
updated. this is a bit different than the old code where all
the painting happened on the same method. This is bad because
it's more code, but it's better because if I break the grid,
only the grid will be broken, and it's easyer to spot the breakage.

in the old code if I did the wrong thing with the graphics context,
the whole graph gots messed out.

Signed-off-by: Tomaz Canabrava <tcanabrava@kde.org>
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This commit is contained in:
Tomaz Canabrava 2014-01-16 12:32:45 -02:00 committed by Dirk Hohndel
parent 793879b6fa
commit 9cb5ea45d8
4 changed files with 119 additions and 2 deletions

View file

@ -13,11 +13,13 @@
void DiveCartesianAxis::setMaximum(double maximum)
{
max = maximum;
emit sizeChanged();
}
void DiveCartesianAxis::setMinimum(double minimum)
{
min = minimum;
emit sizeChanged();
}
void DiveCartesianAxis::setTextColor(const QColor& color)
@ -189,3 +191,84 @@ QString TimeAxis::textForValue(double value)
{
return QString::number(value / 60);
}
void DiveCartesianPlane::setLeftAxis(DiveCartesianAxis* axis)
{
leftAxis = axis;
connect(leftAxis, SIGNAL(sizeChanged()), this, SLOT(setup()));
if (bottomAxis)
setup();
}
void DiveCartesianPlane::setBottomAxis(DiveCartesianAxis* axis)
{
bottomAxis = axis;
connect(bottomAxis, SIGNAL(sizeChanged()), this, SLOT(setup()));
if (leftAxis)
setup();
}
QLineF DiveCartesianPlane::horizontalLine() const
{
return (bottomAxis) ? bottomAxis->line() : QLineF() ;
}
void DiveCartesianPlane::setHorizontalLine(QLineF line)
{
if ( horizontalSize == line.length())
return;
horizontalSize = line.length();
setup();
}
void DiveCartesianPlane::setVerticalLine(QLineF line)
{
if (verticalSize == line.length())
return;
verticalSize = line.length();
setup();
}
QLineF DiveCartesianPlane::verticalLine() const
{
return (leftAxis) ? leftAxis->line() : QLineF() ;
}
void DiveCartesianPlane::setup()
{
if (!leftAxis || !bottomAxis || !scene())
return;
// This creates a Grid around the axis, creating the cartesian plane.
const int top = leftAxis->posAtValue(leftAxis->minimum());
const int bottom = leftAxis->posAtValue(leftAxis->maximum());
const int left = bottomAxis->posAtValue(bottomAxis->minimum());
const int right = bottomAxis->posAtValue(bottomAxis->maximum());
setRect(0, 0, horizontalSize, verticalSize);
setPos(left, top);
qDeleteAll(horizontalLines);
qDeleteAll(verticalLines);
horizontalLines.clear();
verticalLines.clear();
// DEPTH is M_OR_FEET(10,30), Minutes are 600, per line.
for (int i = leftAxis->minimum(), max = leftAxis->maximum(); i < max; i += M_OR_FT(10,30)) {
DiveLineItem *line = new DiveLineItem();
line->setLine(0, 0, horizontalSize, 0);
line->setPos(left,leftAxis->posAtValue(i));
line->setZValue(-1);
horizontalLines.push_back(line);
scene()->addItem(line);
}
for (int i = bottomAxis->minimum(), max = bottomAxis->maximum(); i < max; i += 600) { // increments by 10 minutes.
DiveLineItem *line = new DiveLineItem();
line->setLine(0, 0, 0, verticalSize);
line->setPos(bottomAxis->posAtValue(i), top);
line->setZValue(-1);
verticalLines.push_back(line);
scene()->addItem(line);
}
}

View file

@ -29,7 +29,8 @@ public:
void setColor(const QColor& color);
void setTextColor(const QColor& color);
int unitSystem;
signals:
void sizeChanged();
protected:
virtual QString textForValue(double value);
@ -52,4 +53,28 @@ class TimeAxis : public DiveCartesianAxis {
protected:
QString textForValue(double value);
};
// This is a try. Maybe the CartesianPlane should have the X and Y
// axis and handle things internally?
class DiveCartesianPlane :public QObject, public QGraphicsRectItem{
Q_OBJECT
Q_PROPERTY(QLineF verticalLine READ verticalLine WRITE setVerticalLine)
Q_PROPERTY(QLineF horizontalLine READ horizontalLine WRITE setHorizontalLine)
public:
void setLeftAxis(DiveCartesianAxis *axis);
void setBottomAxis(DiveCartesianAxis *axis);
void setHorizontalLine(QLineF line);
void setVerticalLine(QLineF line);
QLineF horizontalLine() const;
QLineF verticalLine() const;
public slots:
void setup();
private:
DiveCartesianAxis *leftAxis;
DiveCartesianAxis *bottomAxis;
QList<DiveLineItem*> verticalLines;
QList<DiveLineItem*> horizontalLines;
qreal verticalSize;
qreal horizontalSize;
};
#endif

View file

@ -29,7 +29,8 @@ ProfileWidget2::ProfileWidget2(QWidget *parent) :
timeAxis(new TimeAxis()),
depthController(new DiveRectItem()),
timeController(new DiveRectItem()),
diveProfileItem(new DiveProfileItem())
diveProfileItem(new DiveProfileItem()),
cartesianPlane(new DiveCartesianPlane())
{
setScene(new QGraphicsScene());
scene()->setSceneRect(0, 0, 100, 100);
@ -64,6 +65,10 @@ ProfileWidget2::ProfileWidget2(QWidget *parent) :
timeController->setRect(0, 0, 10, 5);
timeController->setX(sceneRect().width() - timeController->boundingRect().width()); // Position it on the right spot.
cartesianPlane->setBottomAxis(timeAxis);
cartesianPlane->setLeftAxis(profileYAxis);
scene()->addItem(cartesianPlane);
// insert in the same way it's declared on the Enum. This is needed so we don't use an map.
QList<QGraphicsItem*> stateItems; stateItems << background << profileYAxis << gasYAxis <<
timeAxis << depthController << timeController;
@ -156,6 +161,8 @@ ProfileWidget2::ProfileWidget2(QWidget *parent) :
profileState->assignProperty(timeAxis, "y", timeAxisOnCanvas);
profileState->assignProperty(depthController, "y", depthControllerOffCanvas);
profileState->assignProperty(timeController, "y", timeControllerOffCanvas);
profileState->assignProperty(cartesianPlane, "verticalLine", profileYAxisExpanded);
profileState->assignProperty(cartesianPlane, "horizontalLine", timeAxis->line());
// Edit, everything but the background and gasYAxis are shown.
editState->assignProperty(this, "backgroundBrush", QBrush(Qt::darkGray));

View file

@ -23,6 +23,7 @@ struct DiveProfileItem;
struct TimeAxis;
struct dive;
struct QStateMachine;
struct DiveCartesianPlane;
class ProfileWidget2 : public QGraphicsView {
Q_OBJECT
@ -62,6 +63,7 @@ private:
DiveRectItem *depthController;
DiveRectItem *timeController;
DiveProfileItem *diveProfileItem;
DiveCartesianPlane *cartesianPlane;
};
#endif