From 6019f06bdf919e1d95dd0912116cdec0834af8db Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Tue, 20 May 2014 23:08:15 -0400 Subject: different approach to independent scrolling, involving ArdourCanvas::ScrollGroup The idea now is that a scroll group item can be added to the canvas which will causes its children to scroll in either or both directions (horizontal or vertical). There are few complications: the position() of the ScrollGroup is ambiguous depending on whether you want it with scroll taken into account or not, so Item::canvas_position() was added, which defaults to the same value as Item::position() but is overridden by ScrollGroup to return the position independent of scrolling. This method is used when translating between item/canvas/window coordinate systems. Note that the basic idea is that we MOVE the scroll group when a scroll happens. This mirrors what happens in the GnomeCanvas, where Nick Mainsbridge came up with a great idea that allowed unification of the time bar and track canvases. --- libs/canvas/scroll_group.cc | 63 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 libs/canvas/scroll_group.cc (limited to 'libs/canvas/scroll_group.cc') diff --git a/libs/canvas/scroll_group.cc b/libs/canvas/scroll_group.cc new file mode 100644 index 0000000000..bda6911ca7 --- /dev/null +++ b/libs/canvas/scroll_group.cc @@ -0,0 +1,63 @@ +/* + Copyright (C) 2014 Paul Davis + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include +#include "canvas/scroll_group.h" + +using namespace std; +using namespace ArdourCanvas; + +ScrollGroup::ScrollGroup (Group* parent, ScrollSensitivity s) + : Group (parent) + , _scroll_sensitivity (s) +{ +} + +ScrollGroup::ScrollGroup (Group* parent, Duple position, ScrollSensitivity s) + : Group (parent, position) + , _scroll_sensitivity (s) +{ +} + +void +ScrollGroup::scroll_to (Duple const& d) +{ + Duple base_pos (position().translate (_scroll_offset)); + + 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); +} + +Duple +ScrollGroup::canvas_position() const +{ + /* return the normal "base" position of this item + rather its position as affected by any scroll + offset. + */ + return _position.translate (_scroll_offset); +} -- cgit v1.2.3