projects
/
pulseview.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Draw numbers off the end of the ruler
[pulseview.git]
/
pv
/
view
/
ruler.cpp
diff --git
a/pv/view/ruler.cpp
b/pv/view/ruler.cpp
index c043aacf2b160d926a557915e2bafe95c397329a..9e639383942ed1149702f9e369b16452a46eba1f 100644
(file)
--- a/
pv/view/ruler.cpp
+++ b/
pv/view/ruler.cpp
@@
-28,6
+28,7
@@
#include <assert.h>
#include <math.h>
#include <assert.h>
#include <math.h>
+#include <limits.h>
#include <QMouseEvent>
#include <QPainter>
#include <QMouseEvent>
#include <QPainter>
@@
-58,37
+59,68
@@
Ruler::Ruler(View &parent) :
this, SLOT(hover_point_changed()));
}
this, SLOT(hover_point_changed()));
}
-void Ruler::paintEvent(QPaintEvent *event)
+QString Ruler::format_time(double t, unsigned int prefix,
+ unsigned int precision)
{
{
- QPainter p(this);
- p.setRenderHint(QPainter::Antialiasing);
+ const double multiplier = pow(10.0,
+ - prefix * 3 - FirstSIPrefixPower);
+
+ QString s;
+ QTextStream ts(&s);
+ ts.setRealNumberPrecision(precision);
+ ts << fixed << forcesign << (t * multiplier) <<
+ SIPrefixes[prefix] << "s";
+ return s;
+}
- const double MinSpacing = 80;
+void Ruler::paintEvent(QPaintEvent*)
+{
+ using namespace Qt;
- const double min_period = _view.scale() * MinSpacing;
+ const double SpacingIncrement = 32.0f;
+ const double MinValueSpacing = 32.0f;
+ const int ValueMargin = 3;
-
const int order = (int)floorf(log10f(min_period)
);
-
const double order_decimal = pow(10, order
);
+
QPainter p(this
);
+
p.setRenderHint(QPainter::Antialiasing
);
- unsigned int unit = 0;
- double tick_period = 0.0f;
+ double min_width = SpacingIncrement, typical_width;
+ double tick_period;
+ unsigned int prefix;
+ // Find tick spacing, and number formatting that does not cause
+ // value to collide.
do
{
do
{
- tick_period = order_decimal * ScaleUnits[unit++];
- } while (tick_period < min_period && unit < countof(ScaleUnits));
+ const double min_period = _view.scale() * min_width;
+
+ const int order = (int)floorf(log10f(min_period));
+ const double order_decimal = pow(10, order);
+
+ unsigned int unit = 0;
+
+ do
+ {
+ tick_period = order_decimal * ScaleUnits[unit++];
+ } while (tick_period < min_period && unit < countof(ScaleUnits));
- const unsigned int prefix = (order - FirstSIPrefixPower) / 3;
- assert(prefix >= 0);
- assert(prefix < countof(SIPrefixes));
+ prefix = (order - FirstSIPrefixPower) / 3;
+ assert(prefix < countof(SIPrefixes));
- const double multiplier = pow(10.0, - prefix * 3 - FirstSIPrefixPower);
+
+ typical_width = p.boundingRect(0, 0, INT_MAX, INT_MAX,
+ AlignLeft | AlignTop, format_time(_view.offset(),
+ prefix)).width() + MinValueSpacing;
+
+ min_width += SpacingIncrement;
+
+ } while(typical_width > tick_period / _view.scale());
const int text_height = p.boundingRect(0, 0, INT_MAX, INT_MAX,
const int text_height = p.boundingRect(0, 0, INT_MAX, INT_MAX,
-
Qt::AlignLeft | Qt::
AlignTop, "8").height();
+
AlignLeft |
AlignTop, "8").height();
// Draw the tick marks
// Draw the tick marks
- p.setPen(
Qt::black
);
+ p.setPen(
palette().color(foregroundRole())
);
const double minor_tick_period = tick_period / MinorTickSubdivision;
const double first_major_division =
const double minor_tick_period = tick_period / MinorTickSubdivision;
const double first_major_division =
@@
-98,38
+130,40
@@
void Ruler::paintEvent(QPaintEvent *event)
const double t0 = first_major_division * tick_period;
int division = (int)round(first_minor_division -
const double t0 = first_major_division * tick_period;
int division = (int)round(first_minor_division -
- first_major_division * MinorTickSubdivision);
- while (1)
- {
- const double t = t0 + division * minor_tick_period;
- const double x = (t - _view.offset()) / _view.scale();
+ first_major_division * MinorTickSubdivision) - 1;
- if (x >= width())
- break;
+ const int major_tick_y1 = text_height + ValueMargin * 2;
+ const int tick_y2 = height();
+ const int minor_tick_y1 = (major_tick_y1 + tick_y2) / 2;
+
+ double x;
+
+ do {
+ const double t = t0 + division * minor_tick_period;
+ x = (t - _view.offset()) / _view.scale();
if (division % MinorTickSubdivision == 0)
{
// Draw a major tick
if (division % MinorTickSubdivision == 0)
{
// Draw a major tick
- QString s;
- QTextStream ts(&s);
- ts << (t * multiplier) << SIPrefixes[prefix] << "s";
- p.drawText(x, 0, 0, text_height, Qt::AlignCenter |
- Qt::AlignTop | Qt::TextDontClip, s);
- p.drawLine(QPointF(x, text_height),
- QPointF(x, height()));
+ p.drawText(x, ValueMargin, 0, text_height,
+ AlignCenter | AlignTop | TextDontClip,
+ format_time(t, prefix));
+ p.drawLine(QPointF(x, major_tick_y1),
+ QPointF(x, tick_y2));
}
else
{
// Draw a minor tick
}
else
{
// Draw a minor tick
- p.drawLine(QPointF(x,
(text_height + height()) / 2
),
- QPointF(x,
height()
));
+ p.drawLine(QPointF(x,
minor_tick_y1
),
+ QPointF(x,
tick_y2
));
}
division++;
}
division++;
- }
+
+ } while (x < width());
// Draw the cursors
// Draw the cursors
- draw_cursors(p);
+ draw_cursors(p
, prefix
);
// Draw the hover mark
draw_hover_mark(p);
// Draw the hover mark
draw_hover_mark(p);
@@
-169,15
+203,15
@@
void Ruler::mouseReleaseEvent(QMouseEvent *)
_grabbed_marker = NULL;
}
_grabbed_marker = NULL;
}
-void Ruler::draw_cursors(QPainter &p)
+void Ruler::draw_cursors(QPainter &p
, unsigned int prefix
)
{
if (!_view.cursors_shown())
return;
const QRect r = rect();
pair<Cursor, Cursor> &cursors = _view.cursors();
{
if (!_view.cursors_shown())
return;
const QRect r = rect();
pair<Cursor, Cursor> &cursors = _view.cursors();
- cursors.first.paint_label(p, r);
- cursors.second.paint_label(p, r);
+ cursors.first.paint_label(p, r
, prefix
);
+ cursors.second.paint_label(p, r
, prefix
);
}
void Ruler::draw_hover_mark(QPainter &p)
}
void Ruler::draw_hover_mark(QPainter &p)
@@
-188,7
+222,7
@@
void Ruler::draw_hover_mark(QPainter &p)
return;
p.setPen(QPen(Qt::NoPen));
return;
p.setPen(QPen(Qt::NoPen));
- p.setBrush(QBrush(
QColor(Qt::black
)));
+ p.setBrush(QBrush(
palette().color(foregroundRole()
)));
const int b = height() - 1;
const QPointF points[] = {
const int b = height() - 1;
const QPointF points[] = {