Fix broken logic and possible NULL pointer dereference for Bundle XML.
[ardour.git] / libs / canvas / ruler.cc
index aa48b52e92db2b8e1e99345fe08da531c17eec84..b11793cb7fa1d1a524049cfc1ea1f5d3375bdf9e 100644 (file)
 using namespace std;
 using namespace ArdourCanvas;
 
-Ruler::Ruler (Group *p, const Metric& m)
-       : Item (p)
-       , Rectangle (p)
-       , _metric (m)
+Ruler::Ruler (Canvas* c, const Metric& m)
+       : Rectangle (c)
+       , _metric (&m)
        , _lower (0)
        , _upper (0)
        , _need_marks (true)
 {
 }
 
-Ruler::Ruler (Group *p, const Metric& m, Rect const& r)
-       : Item (p)
-       , Rectangle (p, r)
-       , _metric (m)
+Ruler::Ruler (Canvas* c, const Metric& m, Rect const& r)
+       : Rectangle (c, r)
+       , _metric (&m)
+       , _lower (0)
+       , _upper (0)
+       , _need_marks (true)
+{
+}
+
+Ruler::Ruler (Item* parent, const Metric& m)
+       : Rectangle (parent)
+       , _metric (&m)
+       , _lower (0)
+       , _upper (0)
+       , _need_marks (true)
+{
+}
+
+Ruler::Ruler (Item* parent, const Metric& m, Rect const& r)
+       : Rectangle (parent, r)
+       , _metric (&m)
        , _lower (0)
        , _upper (0)
        , _need_marks (true)
@@ -90,7 +106,7 @@ Ruler::render (Rect const & area, Cairo::RefPtr<Cairo::Context> cr) const
 
        if (_need_marks) {
                marks.clear ();
-               _metric.get_marks (marks, _lower, _upper, 50);
+               _metric->get_marks (marks, _lower, _upper, 50);
                _need_marks = false;
        }
 
@@ -126,7 +142,7 @@ Ruler::render (Rect const & area, Cairo::RefPtr<Cairo::Context> cr) const
        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) {
@@ -164,3 +180,11 @@ Ruler::render (Rect const & area, Cairo::RefPtr<Cairo::Context> cr) const
 
        /* done! */
 }
+
+void
+Ruler::set_metric (const Metric& m)
+{
+        _metric = &m;
+        _need_marks = true;
+        redraw ();
+}