Use XMLNode::get/set_property API in ARDOUR::MidiTrack class
[ardour.git] / libs / canvas / scroll_group.cc
index bda6911ca71cf52e0b650a77f27d7f3966968ffc..64b5bee1c9a9ba963437d4c45a9d6f773cd6bef5 100644 (file)
 */
 
 #include <iostream>
+
+#include "pbd/compose.h"
+
+#include "canvas/canvas.h"
+#include "canvas/debug.h"
 #include "canvas/scroll_group.h"
 
 using namespace std;
 using namespace ArdourCanvas;
 
-ScrollGroup::ScrollGroup (Group* parent, ScrollSensitivity s)
-       : Group (parent)
-       , _scroll_sensitivity (s)       
+ScrollGroup::ScrollGroup (Canvas* c, ScrollSensitivity s)
+       : Container (c)
+       , _scroll_sensitivity (s)
 {
 }
 
-ScrollGroup::ScrollGroup (Group* parent, Duple position, ScrollSensitivity s)
-       : Group (parent, position)
+ScrollGroup::ScrollGroup (Item* parent, ScrollSensitivity s)
+       : Container (parent)
        , _scroll_sensitivity (s)
 {
 }
 
 void
-ScrollGroup::scroll_to (Duple const& d)
+ScrollGroup::render (Rect const & area, Cairo::RefPtr<Cairo::Context> context) const
 {
-       Duple base_pos (position().translate (_scroll_offset));
+       /* clip the draw to the area that this scroll group nominally occupies
+        * WITHOUT scroll offsets in effect
+        */
+
+       Rect r = bounding_box();
+
+       if (!r) {
+               return;
+       }
 
+       Rect self (_position.x + r.x0,
+                  _position.y + r.y0,
+                  _position.x + r.x1,
+                  _position.y + r.y1);
+
+       self.x1 = min (_position.x + _canvas->width(), self.x1);
+       self.y1 = min (_position.y + _canvas->height(), self.y1);
+
+       context->save ();
+       context->rectangle (self.x0, self.y0, self.width(), self.height());
+       context->clip ();
+
+       Container::render (area, context);
+
+       context->restore ();
+}
+
+void
+ScrollGroup::scroll_to (Duple const& d)
+{
        if (_scroll_sensitivity & ScrollsHorizontally) {
-               base_pos.x -= d.x;
                _scroll_offset.x = d.x;
-       } 
+       }
 
        if (_scroll_sensitivity & ScrollsVertically) {
-               base_pos.y -= d.y;
                _scroll_offset.y = d.y;
        }
+}
 
-       set_position (base_pos);
+bool
+ScrollGroup::covers_canvas (Duple const& d) const
+{
+        Rect r = bounding_box ();
+
+       if (!r) {
+               return false;
+       }
+
+        /* Bounding box is in item coordinates, but we need
+           to consider the position of the bounding box
+           within the canvas.
+        */
+
+       return r.translate (position()).contains (d);
 }
 
-Duple
-ScrollGroup::canvas_position() const
+bool
+ScrollGroup::covers_window (Duple const& d) const
 {
-       /* return the normal "base" position of this item
-          rather its position as affected by any scroll
-          offset.
-       */
-       return _position.translate (_scroll_offset);
+       Rect r = bounding_box ();
+
+       if (!r) {
+               return false;
+       }
+
+        /* Bounding box is in item coordinates, but we need
+           to consider the position of the bounding box
+           within the canvas.
+        */
+
+       return r.translate (position()).contains (d);
 }