23 #include <QApplication>
24 #include <QFontMetrics>
25 #include <QMouseEvent>
32 using std::shared_ptr;
38 const float Ruler::RulerHeight = 2.5f;
39 const int Ruler::MinorTickSubdivision = 4;
41 const float Ruler::HoverArrowSize = 0.5f;
43 Ruler::Ruler(
View &parent) :
46 setMouseTracking(
true);
50 connect(&
view_, SIGNAL(offset_changed()),
52 connect(&
view_, SIGNAL(scale_changed()),
54 connect(&
view_, SIGNAL(tick_prefix_changed()),
56 connect(&
view_, SIGNAL(tick_precision_changed()),
58 connect(&
view_, SIGNAL(tick_period_changed()),
60 connect(&
view_, SIGNAL(time_unit_changed()),
75 max_rect = max_rect.united(i->label_rect(QRect()));
76 return QSize(0,
sizeHint().height() - max_rect.top() / 2 +
88 const unsigned limit = 60;
99 if ((precision == 0) && (distance >= limit))
115 return vector< shared_ptr<ViewItem> >(
116 time_items.begin(), time_items.end());
122 for (
auto i =
items.rbegin(); i !=
items.rend(); i++)
123 if ((*i)->enabled() && (*i)->label_rect(rect()).contains(pt))
148 const int ValueMargin = 3;
151 const int ruler_height =
RulerHeight * text_height;
152 const int major_tick_y1 = text_height + ValueMargin * 2;
153 const int minor_tick_y1 = (major_tick_y1 + ruler_height) / 2;
158 p.setPen(palette().color(foregroundRole()));
161 p.drawText(tick.first, ValueMargin, 0, text_height,
162 AlignCenter | AlignTop | TextDontClip, tick.second);
163 p.drawLine(QPointF(tick.first, major_tick_y1),
164 QPointF(tick.first, ruler_height));
168 p.drawLine(QPointF(tick, minor_tick_y1),
169 QPointF(tick, ruler_height));
175 p.setRenderHint(QPainter::Antialiasing);
184 for (
auto &i :
items) {
187 i->paint_label(p, r, highlight);
205 int division = (round(first_minor_division -
212 x = ((t - offset) / scale).convert_to<
double>();
214 if (division % MinorTickSubdivision == 0) {
216 t = t0 + division / MinorTickSubdivision * major_period;
217 tp.
major.emplace_back(x, format_function(t));
219 tp.
minor.emplace_back(x);
240 p.setPen(QPen(Qt::NoPen));
241 p.setBrush(QBrush(palette().color(foregroundRole())));
245 const QPointF points[] = {
247 QPointF(x - hover_arrow_size, b - hover_arrow_size),
248 QPointF(x + hover_arrow_size, b - hover_arrow_size)
250 p.drawPolygon(points,
countof(points));
255 return QFontMetrics(font()).ascent();
void invalidate_tick_position_cache()
static const int MinorTickSubdivision
int calculate_text_height() const
std::shared_ptr< pv::view::ViewItem > get_mouse_over_item(const QPoint &pt)
pv::util::SIPrefix tick_prefix() const
static const float RulerHeight
Height of the ruler in multipes of the text height.
unsigned int tick_precision() const
boost::optional< TickPositions > tick_position_cache_
QString format_time_si_adjusted(const Timestamp &t, SIPrefix prefix, unsigned precision, QString unit, bool sign)
void paintEvent(QPaintEvent *event)
static QString format_time_with_distance(const pv::util::Timestamp &distance, const pv::util::Timestamp &t, pv::util::SIPrefix prefix=pv::util::SIPrefix::unspecified, pv::util::TimeUnit unit=pv::util::TimeUnit::Time, unsigned precision=0, bool sign=true)
void resizeEvent(QResizeEvent *) override
util::TimeUnit time_unit() const
QSize extended_size_hint() const
static const int HighlightRadius
const QPoint & hover_point() const
QString format_time_minutes(const Timestamp &t, signed precision, bool sign)
static TickPositions calculate_tick_positions(const pv::util::Timestamp &major_period, const pv::util::Timestamp &offset, const double scale, const int width, std::function< QString(const pv::util::Timestamp &)> format_function)
std::vector< std::shared_ptr< TimeItem > > time_items() const
void draw_hover_mark(QPainter &p, int text_height)
std::vector< double > minor
std::vector< std::shared_ptr< pv::view::ViewItem > > items()
static const float HoverArrowSize
Height of the hover arrow in multiples of the text height.
void mouseDoubleClickEvent(QMouseEvent *e)
const pv::util::Timestamp & offset() const
boost::multiprecision::number< boost::multiprecision::cpp_dec_float< 24 >, boost::multiprecision::et_off > Timestamp
Timestamp type providing yoctosecond resolution.
const pv::util::Timestamp & tick_period() const
void add_flag(const pv::util::Timestamp &time)
std::vector< std::pair< double, QString > > major
void hover_point_changed()