mirror of
https://github.com/subsurface/subsurface.git
synced 2025-02-19 22:16:15 +00:00
Cartesian Axis, based on the Ruler class on the Dive Planner.
This is the same class as the Ruler, but uses the DiveLineItem and DiveTextItem classes created to make it animateable. The next few commits will work on that part. The Ruler was a very bad name for a class that's actually an Axis, that's why I depreceated the later. Signed-off-by: Tomaz Canabrava <tcanabrava@kde.org> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This commit is contained in:
parent
ca07f45561
commit
49f4052c67
3 changed files with 210 additions and 2 deletions
160
qt-ui/profile/divecartesianaxis.cpp
Normal file
160
qt-ui/profile/divecartesianaxis.cpp
Normal file
|
@ -0,0 +1,160 @@
|
|||
#include "divecartesianaxis.h"
|
||||
#include "divelineitem.h"
|
||||
#include "divetextitem.h"
|
||||
#include "helpers.h"
|
||||
|
||||
#include <QPen>
|
||||
#include <QGraphicsScene>
|
||||
#include <QDebug>
|
||||
#include <QPropertyAnimation>
|
||||
#include <QGraphicsView>
|
||||
#include <QStyleOption>
|
||||
|
||||
void DiveCartesianAxis::setMaximum(double maximum)
|
||||
{
|
||||
max = maximum;
|
||||
}
|
||||
|
||||
void DiveCartesianAxis::setMinimum(double minimum)
|
||||
{
|
||||
min = minimum;
|
||||
}
|
||||
|
||||
void DiveCartesianAxis::setTextColor(const QColor& color)
|
||||
{
|
||||
textColor = color;
|
||||
}
|
||||
|
||||
DiveCartesianAxis::DiveCartesianAxis() : orientation(Qt::Horizontal)
|
||||
{
|
||||
}
|
||||
|
||||
DiveCartesianAxis::~DiveCartesianAxis()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void DiveCartesianAxis::setOrientation(Qt::Orientation o)
|
||||
{
|
||||
orientation = o;
|
||||
// position the elements on the screen.
|
||||
setMinimum(minimum());
|
||||
setMaximum(maximum());
|
||||
}
|
||||
|
||||
void DiveCartesianAxis::updateTicks()
|
||||
{
|
||||
qDeleteAll(ticks);
|
||||
ticks.clear();
|
||||
qDeleteAll(labels);
|
||||
labels.clear();
|
||||
|
||||
QLineF m = line();
|
||||
DiveLineItem *item = NULL;
|
||||
DiveTextItem *label = NULL;
|
||||
|
||||
double steps = (max - min) / interval;
|
||||
qreal pos;
|
||||
double currValue = min;
|
||||
|
||||
if (orientation == Qt::Horizontal) {
|
||||
double stepSize = (m.x2() - m.x1()) / steps;
|
||||
for (pos = m.x1(); pos <= m.x2(); pos += stepSize, currValue += interval) {
|
||||
item = new DiveLineItem(this);
|
||||
item->setLine(pos, m.y1(), pos, m.y1() + tickSize);
|
||||
item->setPen(pen());
|
||||
ticks.push_back(item);
|
||||
|
||||
label = new DiveTextItem(this);
|
||||
label->setText(QString::number(currValue));
|
||||
label->setBrush(QBrush(textColor));
|
||||
label->setFlag(ItemIgnoresTransformations);
|
||||
label->setPos(pos - label->boundingRect().width()/2, m.y1() + tickSize + 5);
|
||||
labels.push_back(label);
|
||||
}
|
||||
} else {
|
||||
double stepSize = (m.y2() - m.y1()) / steps;
|
||||
for (pos = m.y1(); pos <= m.y2(); pos += stepSize, currValue += interval) {
|
||||
item = new DiveLineItem(this);
|
||||
item->setLine(m.x1(), pos, m.x1() - tickSize, pos);
|
||||
item->setPen(pen());
|
||||
ticks.push_back(item);
|
||||
|
||||
label = new DiveTextItem(this);
|
||||
label->setText(get_depth_string(currValue, false, false));
|
||||
label->setBrush(QBrush(textColor));
|
||||
label->setFlag(ItemIgnoresTransformations);
|
||||
label->setPos(m.x2() - 80, pos);
|
||||
labels.push_back(label);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
QString DiveCartesianAxis::textForValue(double value)
|
||||
{
|
||||
return QString::number(value);
|
||||
}
|
||||
|
||||
void DiveCartesianAxis::setTickSize(qreal size)
|
||||
{
|
||||
tickSize = size;
|
||||
}
|
||||
|
||||
void DiveCartesianAxis::setTickInterval(double i)
|
||||
{
|
||||
interval = i;
|
||||
}
|
||||
|
||||
qreal DiveCartesianAxis::valueAt(const QPointF& p)
|
||||
{
|
||||
QLineF m = line();
|
||||
double retValue = orientation == Qt::Horizontal ?
|
||||
max * (p.x() - m.x1()) / (m.x2() - m.x1()) :
|
||||
max * (p.y() - m.y1()) / (m.y2() - m.y1());
|
||||
return retValue;
|
||||
}
|
||||
|
||||
qreal DiveCartesianAxis::posAtValue(qreal value)
|
||||
{
|
||||
QLineF m = line();
|
||||
QPointF p = pos();
|
||||
|
||||
double size = max - min;
|
||||
double percent = value / size;
|
||||
double realSize = orientation == Qt::Horizontal ?
|
||||
m.x2() - m.x1() :
|
||||
m.y2() - m.y1();
|
||||
double retValue = realSize * percent;
|
||||
retValue = (orientation == Qt::Horizontal) ?
|
||||
retValue + m.x1() + p.x():
|
||||
retValue + m.y1() + p.y();
|
||||
return retValue;
|
||||
}
|
||||
|
||||
qreal DiveCartesianAxis::percentAt(const QPointF& p)
|
||||
{
|
||||
qreal value = valueAt(p);
|
||||
double size = max - min;
|
||||
double percent = value / size;
|
||||
return percent;
|
||||
}
|
||||
|
||||
double DiveCartesianAxis::maximum() const
|
||||
{
|
||||
return max;
|
||||
}
|
||||
|
||||
double DiveCartesianAxis::minimum() const
|
||||
{
|
||||
return min;
|
||||
}
|
||||
|
||||
void DiveCartesianAxis::setColor(const QColor& color)
|
||||
{
|
||||
QPen defaultPen(color);
|
||||
defaultPen.setJoinStyle(Qt::RoundJoin);
|
||||
defaultPen.setCapStyle(Qt::RoundCap);
|
||||
defaultPen.setWidth(2);
|
||||
defaultPen.setCosmetic(true);
|
||||
setPen(defaultPen);
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue