diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2014-05-20 23:08:15 -0400 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2014-06-03 16:10:27 -0400 |
commit | 6019f06bdf919e1d95dd0912116cdec0834af8db (patch) | |
tree | be8d2e41e692c2e8a572f531b546efde67b1503f /libs/canvas/scroll_group.cc | |
parent | fc9e6651dd804672822e06cbd4092c043dc8406d (diff) |
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.
Diffstat (limited to 'libs/canvas/scroll_group.cc')
-rw-r--r-- | libs/canvas/scroll_group.cc | 63 |
1 files changed, 63 insertions, 0 deletions
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 <iostream> +#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); +} |