diff options
author | Tomaz Canabrava <tcanabrava@kde.org> | 2014-01-16 12:32:45 -0200 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2014-01-17 06:16:47 +0700 |
commit | 9cb5ea45d886c15b26b196bc292b7a4bbf359b20 (patch) | |
tree | 6b04a501325e065fad9364eb0be86ed7533f0874 /qt-ui | |
parent | 793879b6fab658c19bce92bebe0e193a900a2cc5 (diff) | |
download | subsurface-9cb5ea45d886c15b26b196bc292b7a4bbf359b20.tar.gz |
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>
Diffstat (limited to 'qt-ui')
-rw-r--r-- | qt-ui/profile/divecartesianaxis.cpp | 83 | ||||
-rw-r--r-- | qt-ui/profile/divecartesianaxis.h | 27 | ||||
-rw-r--r-- | qt-ui/profile/profilewidget2.cpp | 9 | ||||
-rw-r--r-- | qt-ui/profile/profilewidget2.h | 2 |
4 files changed, 119 insertions, 2 deletions
diff --git a/qt-ui/profile/divecartesianaxis.cpp b/qt-ui/profile/divecartesianaxis.cpp index 6022c576f..08138408e 100644 --- a/qt-ui/profile/divecartesianaxis.cpp +++ b/qt-ui/profile/divecartesianaxis.cpp @@ -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); + } +}
\ No newline at end of file diff --git a/qt-ui/profile/divecartesianaxis.h b/qt-ui/profile/divecartesianaxis.h index d6a60d3ce..eb50c1f92 100644 --- a/qt-ui/profile/divecartesianaxis.h +++ b/qt-ui/profile/divecartesianaxis.h @@ -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
\ No newline at end of file diff --git a/qt-ui/profile/profilewidget2.cpp b/qt-ui/profile/profilewidget2.cpp index 49dca4c68..89f20eb9b 100644 --- a/qt-ui/profile/profilewidget2.cpp +++ b/qt-ui/profile/profilewidget2.cpp @@ -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)); diff --git a/qt-ui/profile/profilewidget2.h b/qt-ui/profile/profilewidget2.h index eaad66f73..bea433fef 100644 --- a/qt-ui/profile/profilewidget2.h +++ b/qt-ui/profile/profilewidget2.h @@ -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
\ No newline at end of file |