X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fcanvas%2Fscroll_group.cc;h=df51df9ebb0d0b62fa2d224b4f3080d5df7e33cc;hb=73357c1923eec79b98f8237d2d6e1de654f45d22;hp=94ea869971d18b321da474a03140a81a82324cdc;hpb=22e72527294a0de6b93c7a4028f485d9b59552f6;p=ardour.git diff --git a/libs/canvas/scroll_group.cc b/libs/canvas/scroll_group.cc index 94ea869971..df51df9ebb 100644 --- a/libs/canvas/scroll_group.cc +++ b/libs/canvas/scroll_group.cc @@ -17,46 +17,89 @@ */ #include + +#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) +ScrollGroup::ScrollGroup (Canvas* c, ScrollSensitivity s) + : Container (c) , _scroll_sensitivity (s) { } -ScrollGroup::ScrollGroup (Group* parent, Duple position, ScrollSensitivity s) - : Group (parent, position) - , _scroll_sensitivity (s) +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 context) const { - /* get the nominal position of the group without scroll being in effect + /* clip the draw to the area that this scroll group nominally occupies + * WITHOUT scroll offsets in effect */ - Duple base_pos (_position.translate (_scroll_offset)); + boost::optional r = bounding_box(); - /* compute a new position given our sensitivity to h- and v-scrolling - */ + if (!r) { + return; + } + Rect self (_position.x, _position.y, _position.x + r.get().width(), _position.y + r.get().height()); + + 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; } +} - /* move there */ +bool +ScrollGroup::covers_canvas (Duple const& d) const +{ + boost::optional r = bounding_box (); + + if (!r) { + return false; + } - set_position (base_pos); + return r->contains (d); } +bool +ScrollGroup::covers_window (Duple const& d) const +{ + boost::optional r = bounding_box (); + + if (!r) { + return false; + } + + Rect w = r->translate (-_scroll_offset); + + return w.contains (d); +}