summaryrefslogtreecommitdiff
path: root/libs/canvas/item.cc
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2014-05-21 19:14:40 -0400
committerPaul Davis <paul@linuxaudiosystems.com>2014-06-03 16:11:24 -0400
commitbf7b35388b245f894c4ef739d5231a82ef1448dc (patch)
tree365e46cd7846603b3d46f6c7f01af3a99a15dd5d /libs/canvas/item.cc
parentee8fb7758aa01a2b64e9547f866360a4e245a80a (diff)
rationalize and centralize computation of positional offset and scroll offset for canvas items
Diffstat (limited to 'libs/canvas/item.cc')
-rw-r--r--libs/canvas/item.cc73
1 files changed, 33 insertions, 40 deletions
diff --git a/libs/canvas/item.cc b/libs/canvas/item.cc
index c6652f9d3a..3ca73bbf9f 100644
--- a/libs/canvas/item.cc
+++ b/libs/canvas/item.cc
@@ -23,10 +23,11 @@
#include "ardour/utils.h"
-#include "canvas/group.h"
-#include "canvas/item.h"
#include "canvas/canvas.h"
#include "canvas/debug.h"
+#include "canvas/group.h"
+#include "canvas/item.h"
+#include "canvas/scroll_group.h"
using namespace std;
using namespace PBD;
@@ -85,22 +86,25 @@ Item::item_to_parent (ArdourCanvas::Rect const & r) const
return r.translate (_position);
}
-ArdourCanvas::Rect
-Item::item_to_canvas (ArdourCanvas::Rect const & r) const
+Duple
+Item::scroll_offset () const
{
Item const * i = this;
Duple offset;
while (i) {
- offset = offset.translate (i->canvas_position());
+ ScrollGroup const * sg = dynamic_cast<ScrollGroup const *> (i);
+ if (sg) {
+ offset = offset.translate (sg->scroll_offset());
+ }
i = i->parent();
}
- return r.translate (offset);
+ return offset;
}
-ArdourCanvas::Duple
-Item::item_to_canvas (ArdourCanvas::Duple const & d) const
+Duple
+Item::position_offset() const
{
Item const * i = this;
Duple offset;
@@ -110,35 +114,31 @@ Item::item_to_canvas (ArdourCanvas::Duple const & d) const
i = i->parent();
}
- return d.translate (offset);
+ return offset;
}
-ArdourCanvas::Duple
-Item::canvas_to_item (ArdourCanvas::Duple const & d) const
+ArdourCanvas::Rect
+Item::item_to_canvas (ArdourCanvas::Rect const & r) const
{
- Item const * i = this;
- Duple offset;
+ return r.translate (position_offset());
+}
- while (i) {
- offset = offset.translate (-(i->canvas_position()));
- i = i->parent();
- }
+ArdourCanvas::Duple
+Item::item_to_canvas (ArdourCanvas::Duple const & d) const
+{
+ return d.translate (position_offset());
+}
- return d.translate (offset);
+ArdourCanvas::Duple
+Item::canvas_to_item (ArdourCanvas::Duple const & r) const
+{
+ return r.translate (-position_offset());
}
ArdourCanvas::Rect
-Item::canvas_to_item (ArdourCanvas::Rect const & d) const
+Item::canvas_to_item (ArdourCanvas::Rect const & r) const
{
- Item const * i = this;
- Duple offset;
-
- while (i) {
- offset = offset.translate (-(i->canvas_position()));
- i = i->parent();
- }
-
- return d.translate (offset);
+ return r.translate (-position_offset());
}
void
@@ -159,36 +159,29 @@ Item::canvas_to_item (Coord& x, Coord& y) const
y = d.y;
}
+
Duple
Item::item_to_window (ArdourCanvas::Duple const & d, bool rounded) const
{
- Item const * i = this;
- Duple offset;
-
- while (i) {
- offset = offset.translate (i->scroll_offset());
- i = i->parent();
- }
-
- return _canvas->canvas_to_window (d.translate (offset), rounded);
+ return item_to_canvas (d).translate (-scroll_offset());
}
Duple
Item::window_to_item (ArdourCanvas::Duple const & d) const
{
- return canvas_to_item (_canvas->window_to_canvas (d));
+ return canvas_to_item (d.translate (scroll_offset()));
}
ArdourCanvas::Rect
Item::item_to_window (ArdourCanvas::Rect const & r) const
{
- return _canvas->canvas_to_window (item_to_canvas (r));
+ return item_to_canvas (r).translate (-scroll_offset());
}
ArdourCanvas::Rect
Item::window_to_item (ArdourCanvas::Rect const & r) const
{
- return canvas_to_item (_canvas->window_to_canvas (r));
+ return canvas_to_item (r.translate (scroll_offset()));
}
/** Set the position of this item in the parent's coordinates */