mirror of
https://github.com/subsurface/subsurface.git
synced 2024-11-30 22:20:21 +00:00
2f9c0c04b5
There were two somewhat redundant flags for the axes: the position (left, right, bottom) and the orientation (up-down, left-right, etc). Replace the latter by an inverted flag: if true, the axis is up-down or right-left, i.e. the opposite of what one would expect for a normal graph. Set the flag in the constructor and remove the setOrientation() function. Sadly, the code is a bit complex, because screen coordinates are top-to-bottom. Who thought that would be a good idea? Note: this also fixes the placement of the ticks of the time axis. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
82 lines
2.5 KiB
C++
82 lines
2.5 KiB
C++
// SPDX-License-Identifier: GPL-2.0
|
|
#ifndef DIVECARTESIANAXIS_H
|
|
#define DIVECARTESIANAXIS_H
|
|
|
|
#include <QObject>
|
|
#include <QGraphicsLineItem>
|
|
#include <QPen>
|
|
#include "core/color.h"
|
|
#include "core/units.h"
|
|
|
|
class ProfileScene;
|
|
class QPropertyAnimation;
|
|
class DiveTextItem;
|
|
class DiveLineItem;
|
|
class DivePlotDataModel;
|
|
|
|
class DiveCartesianAxis : public QObject, public QGraphicsLineItem {
|
|
Q_OBJECT
|
|
Q_PROPERTY(QLineF line WRITE setLine READ line)
|
|
Q_PROPERTY(QPointF pos WRITE setPos READ pos)
|
|
Q_PROPERTY(qreal x WRITE setX READ x)
|
|
Q_PROPERTY(qreal y WRITE setY READ y)
|
|
private:
|
|
bool printMode;
|
|
public:
|
|
enum class Position {
|
|
Left, Right, Bottom
|
|
};
|
|
|
|
DiveCartesianAxis(Position position, bool inverted, int integralDigits, int fractionalDigits, color_index_t gridColor,
|
|
QColor textColor, bool textVisible, bool linesVisible,
|
|
double dpr, double labelScale, bool printMode, bool isGrayscale, ProfileScene &scene);
|
|
~DiveCartesianAxis();
|
|
void setBounds(double min, double max);
|
|
void setTransform(double a, double b = 0.0);
|
|
double minimum() const;
|
|
double maximum() const;
|
|
std::pair<double, double> screenMinMax() const;
|
|
qreal valueAt(const QPointF &p) const;
|
|
qreal posAtValue(qreal value) const;
|
|
void setPosition(const QRectF &rect);
|
|
void setTextVisible(bool arg1);
|
|
void setLinesVisible(bool arg1);
|
|
void updateTicks(int animSpeed);
|
|
double width() const; // only for vertical axes
|
|
double height() const; // only for horizontal axes
|
|
|
|
private:
|
|
Position position;
|
|
bool inverted; // Top-to-bottom or right-to-left axis.
|
|
int fractionalDigits;
|
|
QRectF rect; // Rectangle to fill with grid lines
|
|
QPen gridPen;
|
|
QColor textColor;
|
|
ProfileScene &scene;
|
|
QString textForValue(double value) const;
|
|
QList<DiveTextItem *> labels;
|
|
QList<DiveLineItem *> lines;
|
|
double dataMin, dataMax;
|
|
double min, max;
|
|
bool textVisibility;
|
|
bool lineVisibility;
|
|
double labelScale;
|
|
bool changed;
|
|
double dpr;
|
|
double labelWidth, labelHeight; // maximum expected sizes of label width and height
|
|
|
|
// To format the labels and choose the label positions, the
|
|
// axis has to be aware of the displayed values. Thankfully,
|
|
// the conversion between internal data (eg. mm) and displayed
|
|
// data (e.g. ft) can be represented by an affine map ax+b.
|
|
struct Transform {
|
|
double a, b;
|
|
double to(double x) const;
|
|
double from(double y) const;
|
|
} transform;
|
|
|
|
void updateLabels(int numTicks, double firstPosScreen, double firstValue, double stepScreen, double stepValue, int animSpeed);
|
|
void updateLines(int numTicks, double firstPosScreen, double stepScreen, int animSpeed);
|
|
};
|
|
|
|
#endif // DIVECARTESIANAXIS_H
|