summaryrefslogtreecommitdiff
path: root/gtk2_ardour
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2014-03-20 21:59:37 -0400
committerPaul Davis <paul@linuxaudiosystems.com>2014-03-21 07:02:32 -0400
commit65b4308c84a794f6d69da6d229790757d9e4e0e2 (patch)
treed51638d8aa002024197d1420563411afb0e483ea /gtk2_ardour
parentab44e41dfd8b8247ed5f57a8f3fcbbf4f8457827 (diff)
first pass at quantizing vertical scroll to whole tracks.
Dragging regions vertically does the quantization BUT speed control is lacking and the region ends up on a track that is still invisible ... to be fixed as the sun rises.
Diffstat (limited to 'gtk2_ardour')
-rw-r--r--gtk2_ardour/editor.h2
-rw-r--r--gtk2_ardour/editor_canvas.cc66
-rw-r--r--gtk2_ardour/editor_ops.cc63
-rw-r--r--gtk2_ardour/public_editor.h2
-rw-r--r--gtk2_ardour/time_axis_view.cc4
5 files changed, 91 insertions, 46 deletions
diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h
index bf52948b4b..948b8847f9 100644
--- a/gtk2_ardour/editor.h
+++ b/gtk2_ardour/editor.h
@@ -352,6 +352,8 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
void ensure_time_axis_view_is_visible (const TimeAxisView& tav);
void scroll_tracks_down_line ();
void scroll_tracks_up_line ();
+ bool scroll_up_one_track ();
+ bool scroll_down_one_track ();
void prepare_for_cleanup ();
void finish_cleanup ();
diff --git a/gtk2_ardour/editor_canvas.cc b/gtk2_ardour/editor_canvas.cc
index a4927192fe..69b63ecb7b 100644
--- a/gtk2_ardour/editor_canvas.cc
+++ b/gtk2_ardour/editor_canvas.cc
@@ -477,11 +477,11 @@ Editor::maybe_autoscroll (bool allow_horiz, bool allow_vert, bool from_headers)
XXX this can go away once the two canvases are
unified.
*/
-
- Gdk::Rectangle timebars = time_canvas_event_box.get_allocation ();
- alloc.set_y (timebars.get_y());
- alloc.set_height (alloc.get_height() + timebars.get_height());
-
+
+ // Gdk::Rectangle timebars = _time_bars_canvas_viewport->get_allocation ();
+ //alloc.set_y (timebars.get_y());
+ //alloc.set_height (alloc.get_height() + timebars.get_height());
+
/* if there is no other widget on the right side of
the canvas, reduce the effective width of
the autoscroll boundary so that we start scrolling
@@ -507,11 +507,10 @@ Editor::maybe_autoscroll (bool allow_horiz, bool allow_vert, bool from_headers)
get_window()->get_pointer (x, y, mask);
- if (!autoscroll_boundary.contains (ArdourCanvas::Duple (x, y))) {
- if (!autoscroll_active()) {
- start_canvas_autoscroll (allow_horiz, allow_vert);
- }
- }
+ if ((allow_horiz && (x < autoscroll_boundary.x0 || x >= autoscroll_boundary.x1)) ||
+ (allow_vert && (y < autoscroll_boundary.y0 || y >= autoscroll_boundary.y1))) {
+ start_canvas_autoscroll (allow_horiz, allow_vert);
+ }
}
bool
@@ -526,8 +525,8 @@ Editor::autoscroll_canvas ()
int x, y;
Gdk::ModifierType mask;
frameoffset_t dx = 0;
- double dy = 0;
bool no_stop = false;
+ bool y_motion = false;
get_window()->get_pointer (x, y, mask);
@@ -581,55 +580,34 @@ Editor::autoscroll_canvas ()
const double vertical_pos = vertical_adjustment.get_value();
double new_pixel = vertical_pos;
+ const int speed_factor = 20;
/* vertical */
new_pixel = vertical_pos;
-
+
if (y < autoscroll_boundary.y0) {
/* scroll to make higher tracks visible */
- const int step_size = _visible_canvas_height / 100;
-
- dy = autoscroll_boundary.y0 - y;
- dy += step_size + (step_size * (autoscroll_cnt/10));
-
- if (vertical_pos > dy) {
- new_pixel = vertical_pos - dy;
- } else {
- new_pixel = 0;
+ if (autoscroll_cnt && (autoscroll_cnt % speed_factor == 0)) {
+ y_motion = scroll_up_one_track ();
}
- no_stop = true;
-
} else if (y > autoscroll_boundary.y1) {
- /* scroll to make lower tracks visible */
-
- const int step_size = _visible_canvas_height / 100;
-
- dy = y - autoscroll_boundary.y1;
- dy += step_size + (step_size * (autoscroll_cnt/10));
-
- /* unlike horizontally, we never want to scroll past the lower edge of the full canvas as defined by all visible tracks
- */
- new_pixel = min (_full_canvas_height - _visible_canvas_height, min (_full_canvas_height, vertical_pos + dy));
- /* adjust dy to match */
- dy = vertical_pos - new_pixel;
-
- no_stop = true;
- }
-
- if (new_pixel != vertical_pos) {
- vc.add (VisualChange::YOrigin);
- vc.y_origin = new_pixel;
+ if (autoscroll_cnt && (autoscroll_cnt % speed_factor == 0)) {
+ y_motion = scroll_down_one_track ();
+
+ }
}
+
+ no_stop = true;
}
- if (vc.pending) {
+ if (vc.pending || y_motion) {
- /* change horizontal & vertical position first */
+ /* change horizontal first */
visual_changer (vc);
diff --git a/gtk2_ardour/editor_ops.cc b/gtk2_ardour/editor_ops.cc
index c0d26b7b14..abc90d2f59 100644
--- a/gtk2_ardour/editor_ops.cc
+++ b/gtk2_ardour/editor_ops.cc
@@ -1276,6 +1276,69 @@ Editor::scroll_tracks_up_line ()
reset_y_origin (vertical_adjustment.get_value() - 60);
}
+bool
+Editor::scroll_down_one_track ()
+{
+ double vertical_pos = vertical_adjustment.get_value () + vertical_adjustment.get_page_size() - 1.0;
+
+ TrackViewList::reverse_iterator next = track_views.rend();
+ std::pair<TimeAxisView*,double> res;
+
+ for (TrackViewList::reverse_iterator t = track_views.rbegin(); t != track_views.rend(); ++t) {
+ if ((*t)->hidden()) {
+ continue;
+ }
+
+ res = (*t)->covers_y_position (vertical_pos);
+
+ if (res.first) {
+ break;
+ }
+
+ next = t;
+ }
+
+ /* move to the track below the first one that covers the */
+
+ if (next != track_views.rend()) {
+ ensure_track_visible (*next);
+ return true;
+ }
+
+ return false;
+}
+
+bool
+Editor::scroll_up_one_track ()
+{
+ double vertical_pos = vertical_adjustment.get_value ();
+
+ TrackViewList::iterator prev = track_views.end();
+ std::pair<TimeAxisView*,double> res;
+
+ for (TrackViewList::iterator t = track_views.begin(); t != track_views.end(); ++t) {
+
+ if ((*t)->hidden()) {
+ continue;
+ }
+
+ res = (*t)->covers_y_position(vertical_pos);
+
+ if (res.first) {
+ break;
+ }
+
+ prev = t;
+ }
+
+ if (prev != track_views.end()) {
+ ensure_track_visible (*prev);
+ return true;
+ }
+
+ return false;
+}
+
/* ZOOM */
void
diff --git a/gtk2_ardour/public_editor.h b/gtk2_ardour/public_editor.h
index d2f0f9c49b..47d08af7f1 100644
--- a/gtk2_ardour/public_editor.h
+++ b/gtk2_ardour/public_editor.h
@@ -270,6 +270,8 @@ class PublicEditor : public Gtk::Window, public PBD::StatefulDestructible, publi
virtual void ensure_time_axis_view_is_visible (const TimeAxisView& tav) = 0;
virtual void scroll_tracks_down_line () = 0;
virtual void scroll_tracks_up_line () = 0;
+ virtual bool scroll_down_one_track () = 0;
+ virtual bool scroll_up_one_track () = 0;
virtual void prepare_for_cleanup () = 0;
virtual void finish_cleanup () = 0;
virtual void reset_x_origin (framepos_t frame) = 0;
diff --git a/gtk2_ardour/time_axis_view.cc b/gtk2_ardour/time_axis_view.cc
index d373d3f31b..cbd2b995fe 100644
--- a/gtk2_ardour/time_axis_view.cc
+++ b/gtk2_ardour/time_axis_view.cc
@@ -298,7 +298,7 @@ TimeAxisView::controls_ebox_scroll (GdkEventScroll* ev)
e.stepping_axis_view()->step_height (false);
return true;
} else if (Keyboard::no_modifiers_active (ev->state)) {
- _editor.scroll_tracks_up_line();
+ _editor.scroll_up_one_track();
return true;
}
break;
@@ -313,7 +313,7 @@ TimeAxisView::controls_ebox_scroll (GdkEventScroll* ev)
e.stepping_axis_view()->step_height (true);
return true;
} else if (Keyboard::no_modifiers_active (ev->state)) {
- _editor.scroll_tracks_down_line();
+ _editor.scroll_down_one_track();
return true;
}
break;