+ MarginWidget(parent)
+{
+ setMouseTracking(true);
+
+ connect(&view_, SIGNAL(hover_point_changed()),
+ this, SLOT(hover_point_changed()));
+ connect(&view_, SIGNAL(offset_changed()),
+ this, SLOT(invalidate_tick_position_cache()));
+ connect(&view_, SIGNAL(scale_changed()),
+ this, SLOT(invalidate_tick_position_cache()));
+ connect(&view_, SIGNAL(tick_prefix_changed()),
+ this, SLOT(invalidate_tick_position_cache()));
+ connect(&view_, SIGNAL(tick_precision_changed()),
+ this, SLOT(invalidate_tick_position_cache()));
+ connect(&view_, SIGNAL(tick_period_changed()),
+ this, SLOT(invalidate_tick_position_cache()));
+ connect(&view_, SIGNAL(time_unit_changed()),
+ this, SLOT(invalidate_tick_position_cache()));
+}
+
+QSize Ruler::sizeHint() const
+{
+ const int text_height = calculate_text_height();
+ return QSize(0, RulerHeight * text_height);
+}
+
+QSize Ruler::extended_size_hint() const
+{
+ QRectF max_rect;
+ std::vector< std::shared_ptr<TimeItem> > items(view_.time_items());
+ for (auto &i : items)
+ max_rect = max_rect.united(i->label_rect(QRect()));
+ return QSize(0, sizeHint().height() - max_rect.top() / 2 +
+ ViewItem::HighlightRadius);
+}
+
+vector< shared_ptr<ViewItem> > Ruler::items()
+{
+ const vector< shared_ptr<TimeItem> > time_items(view_.time_items());
+ return vector< shared_ptr<ViewItem> >(
+ time_items.begin(), time_items.end());
+}
+
+shared_ptr<ViewItem> Ruler::get_mouse_over_item(const QPoint &pt)