void ScaleDraw
::drawTick(QPainter *painter,
double value,
int len
) const { if (m_tickDirection == outwards)
if ( len <= 0 )
return;
int pw2 = qMin((int)painter->pen().width(), len) / 2;
if ( !metricsMap.isIdentity() )
{
/*
The perfect position of the ticks is important.
To avoid rounding errors we have to use
device coordinates.
*/
pos = metricsMap.layoutToDevice(pos);
if ( orientation() == Qt::Vertical )
{
scaleMap.setPaintInterval(
metricsMap.layoutToDeviceY((int)scaleMap.p1()),
metricsMap.layoutToDeviceY((int)scaleMap.p2())
);
len = metricsMap.layoutToDeviceX(len);
}
else
{
scaleMap.setPaintInterval(
metricsMap.layoutToDeviceX((int)scaleMap.p1()),
metricsMap.layoutToDeviceX((int)scaleMap.p2())
);
len = metricsMap.layoutToDeviceY(len);
}
}
const int tval = scaleMap.transform(value);
switch(alignment())
{
case LeftScale:
{
QwtPainter::drawLine(painter, pos.
x() - pw2
- majTickLength
(), tval,
pos.x() + len - majTickLength(), tval);
break;
}
case RightScale:
{
QwtPainter::drawLine(painter, pos.
x() + pw2
+ majTickLength
(), tval,
pos.x() - len + majTickLength(), tval);
break;
}
case BottomScale:
{
QwtPainter::drawLine(painter, tval, pos.
y() + pw2
+ majTickLength
(),
tval, pos.y() - len + majTickLength());
break;
}
case TopScale:
{
QwtPainter::drawLine(painter, tval, pos.
y() - pw2
- majTickLength
(),
tval, pos.y() - majTickLength() + len);
break;
}
}
QwtPainter::setMetricsMap(metricsMap
);
// restore metrics map }
/*!
Draws the baseline of the scale
\param painter Painter
\sa drawTick(), drawLabel()
*/
void ScaleDraw
::drawBackbone(QPainter *painter
) const {
if (m_tickDirection == outwards)
const int bw2 = painter->pen().width() / 2;
const QPoint &pos
= this
->pos
();
const int len = length() - 1;
switch(alignment())
{
case LeftScale: {
double leftShift = majTickLength();
QwtPainter::drawLine(painter, pos.
x() - bw2
- leftShift,
pos.y(), pos.x() - bw2 - leftShift, pos.y() + len );
break;
}
case RightScale: {
double rightShift = majTickLength();
QwtPainter::drawLine(painter, pos.
x() + bw2
+ rightShift,
pos.y(), pos.x() + bw2 + rightShift, pos.y() + len);
break;
}
case TopScale: {
double upShift = majTickLength();
QwtPainter::drawLine(painter, pos.
x(), pos.
y() - bw2
- upShift,
pos.x() + len, pos.y() - bw2 - upShift);
break;
}
case BottomScale: {
double downShift = majTickLength();
QwtPainter::drawLine(painter, pos.
x(), pos.
y() + bw2
+ downShift,
pos.x() + len, pos.y() + bw2 + downShift);
break;
}
}
}
void ScaleDraw::drawTick(QPainter *painter, double value, int len) const {
if (m_tickDirection == outwards)
return QwtScaleDraw::drawTick(painter, value, len);
if ( len <= 0 )
return;
int pw2 = qMin((int)painter->pen().width(), len) / 2;
QwtScaleMap scaleMap = map();
const QwtMetricsMap metricsMap = QwtPainter::metricsMap();
QPoint pos = this->pos();
if ( !metricsMap.isIdentity() )
{
/*
The perfect position of the ticks is important.
To avoid rounding errors we have to use
device coordinates.
*/
QwtPainter::resetMetricsMap();
pos = metricsMap.layoutToDevice(pos);
if ( orientation() == Qt::Vertical )
{
scaleMap.setPaintInterval(
metricsMap.layoutToDeviceY((int)scaleMap.p1()),
metricsMap.layoutToDeviceY((int)scaleMap.p2())
);
len = metricsMap.layoutToDeviceX(len);
}
else
{
scaleMap.setPaintInterval(
metricsMap.layoutToDeviceX((int)scaleMap.p1()),
metricsMap.layoutToDeviceX((int)scaleMap.p2())
);
len = metricsMap.layoutToDeviceY(len);
}
}
const int tval = scaleMap.transform(value);
switch(alignment())
{
case LeftScale:
{
QwtPainter::drawLine(painter, pos.x() - pw2 - majTickLength(), tval,
pos.x() + len - majTickLength(), tval);
break;
}
case RightScale:
{
QwtPainter::drawLine(painter, pos.x() + pw2 + majTickLength(), tval,
pos.x() - len + majTickLength(), tval);
break;
}
case BottomScale:
{
QwtPainter::drawLine(painter, tval, pos.y() + pw2 + majTickLength(),
tval, pos.y() - len + majTickLength());
break;
}
case TopScale:
{
QwtPainter::drawLine(painter, tval, pos.y() - pw2 - majTickLength(),
tval, pos.y() - majTickLength() + len);
break;
}
}
QwtPainter::setMetricsMap(metricsMap); // restore metrics map
}
/*!
Draws the baseline of the scale
\param painter Painter
\sa drawTick(), drawLabel()
*/
void ScaleDraw::drawBackbone(QPainter *painter) const
{
if (m_tickDirection == outwards)
return QwtScaleDraw::drawBackbone(painter);
const int bw2 = painter->pen().width() / 2;
const QPoint &pos = this->pos();
const int len = length() - 1;
switch(alignment())
{
case LeftScale: {
double leftShift = majTickLength();
QwtPainter::drawLine(painter, pos.x() - bw2 - leftShift,
pos.y(), pos.x() - bw2 - leftShift, pos.y() + len );
break;
}
case RightScale: {
double rightShift = majTickLength();
QwtPainter::drawLine(painter, pos.x() + bw2 + rightShift,
pos.y(), pos.x() + bw2 + rightShift, pos.y() + len);
break;
}
case TopScale: {
double upShift = majTickLength();
QwtPainter::drawLine(painter, pos.x(), pos.y() - bw2 - upShift,
pos.x() + len, pos.y() - bw2 - upShift);
break;
}
case BottomScale: {
double downShift = majTickLength();
QwtPainter::drawLine(painter, pos.x(), pos.y() + bw2 + downShift,
pos.x() + len, pos.y() + bw2 + downShift);
break;
}
}
}
To copy to clipboard, switch view to plain text mode
Bookmarks