#include "canvas/ruler.h"
#include "canvas/types.h"
#include "canvas/debug.h"
-#include "canvas/utils.h"
#include "canvas/canvas.h"
using namespace std;
Ruler::Ruler (Canvas* c, const Metric& m)
: Rectangle (c)
- , _metric (m)
+ , _metric (&m)
, _lower (0)
, _upper (0)
+ , _divide_height (-1.0)
+ , _font_description (0)
, _need_marks (true)
{
}
Ruler::Ruler (Canvas* c, const Metric& m, Rect const& r)
: Rectangle (c, r)
- , _metric (m)
+ , _metric (&m)
, _lower (0)
, _upper (0)
+ , _divide_height (-1.0)
+ , _font_description (0)
, _need_marks (true)
{
}
Ruler::Ruler (Item* parent, const Metric& m)
: Rectangle (parent)
- , _metric (m)
+ , _metric (&m)
, _lower (0)
, _upper (0)
+ , _divide_height (-1.0)
+ , _font_description (0)
, _need_marks (true)
{
}
Ruler::Ruler (Item* parent, const Metric& m, Rect const& r)
: Rectangle (parent, r)
- , _metric (m)
+ , _metric (&m)
, _lower (0)
, _upper (0)
+ , _divide_height (-1.0)
+ , _font_description (0)
, _need_marks (true)
{
}
Ruler::set_font_description (Pango::FontDescription fd)
{
begin_visual_change ();
+ delete _font_description;
_font_description = new Pango::FontDescription (fd);
end_visual_change ();
}
}
Rect self (item_to_window (get()));
- boost::optional<Rect> i = self.intersection (area);
+ Rect i = self.intersection (area);
if (!i) {
return;
}
- Rect intersection (i.get());
+ Rect intersection (i);
Distance height = self.height();
if (_need_marks) {
marks.clear ();
- _metric.get_marks (marks, _lower, _upper, 50);
+ _metric->get_marks (marks, _lower, _upper, 50);
_need_marks = false;
}
cr->stroke ();
/* draw ticks + text */
-
+
Glib::RefPtr<Pango::Layout> layout = Pango::Layout::create (cr);
if (_font_description) {
layout->set_font_description (*_font_description);
for (vector<Mark>::const_iterator m = marks.begin(); m != marks.end(); ++m) {
Duple pos;
- pos.x = floor ((m->position - _lower) / _metric.units_per_pixel);
+ pos.x = floor ((m->position - _lower) / _metric->units_per_pixel);
pos.y = self.y1; /* bottom edge */
if (_outline_width == 1.0) {
} else {
cr->move_to (pos.x, pos.y);
}
-
+
switch (m->style) {
- case Mark::Major:
- cr->rel_line_to (0, -height);
- break;
- case Mark::Minor:
- cr->rel_line_to (0, -height/2.0);
- break;
- case Mark::Micro:
- cr->rel_line_to (0, -height/4.0);
- break;
+ case Mark::Major:
+ if (_divide_height >= 0) {
+ cr->rel_line_to (0, -_divide_height);
+ } else {
+ cr->rel_line_to (0, -height);
+ }
+ break;
+ case Mark::Minor:
+ cr->rel_line_to (0, -height/3.0);
+ break;
+ case Mark::Micro:
+ cr->rel_line_to (0, -height/5.0);
+ break;
}
cr->stroke ();
layout->set_text (m->label);
logical = layout->get_pixel_logical_extents ();
-
- cr->move_to (pos.x + 2.0, self.y0 + logical.get_y());
+
+ if (_divide_height >= 0) {
+ cr->move_to (pos.x + 2.0, self.y0 + _divide_height + logical.get_y() + 2.0); /* 2 pixel padding below divider */
+ } else {
+ cr->move_to (pos.x + 2.0, self.y0 + logical.get_y() + .5 * (height - logical.get_height()));
+ }
layout->show_in_cairo_context (cr);
}
}
+ if (_divide_height >= 0.0) {
+
+ cr->set_line_width (1.0);
+
+ Gtkmm2ext::set_source_rgba (cr, _divider_color_top);
+ cr->move_to (self.x0, self.y0 + _divide_height-1.0+0.5);
+ cr->line_to (self.x1, self.y0 + _divide_height-1.0+0.5);
+ cr->stroke ();
+
+ Gtkmm2ext::set_source_rgba (cr, _divider_color_bottom);
+ cr->move_to (self.x0, self.y0 + _divide_height+0.5);
+ cr->line_to (self.x1, self.y0 + _divide_height+0.5);
+ cr->stroke ();
+
+
+ }
+
/* done! */
}
+
+void
+Ruler::set_divide_height (double h)
+{
+ _divide_height = h;
+}
+
+void
+Ruler::set_divide_colors (Gtkmm2ext::Color t, Gtkmm2ext::Color b)
+{
+ _divider_color_bottom = b;
+ _divider_color_top = t;
+}
+
+void
+Ruler::set_metric (const Metric& m)
+{
+ _metric = &m;
+ _need_marks = true;
+ redraw ();
+}