From bf7b35388b245f894c4ef739d5231a82ef1448dc Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Wed, 21 May 2014 19:14:40 -0400 Subject: rationalize and centralize computation of positional offset and scroll offset for canvas items --- libs/canvas/item.cc | 73 ++++++++++++++++++++++++----------------------------- 1 file changed, 33 insertions(+), 40 deletions(-) (limited to 'libs/canvas/item.cc') 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 (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 */ -- cgit v1.2.3