X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Ftime_axis_view.cc;h=a5d91c7bc269f8cd9577a4e3286feb69f5f598d1;hb=fe9f2b15b13ce1e8216305f4c3916582ab65f8df;hp=8aa3e53639bd29427b6fccb8b3a306746cd2573d;hpb=5d6c986748d77ca9f0cda698113dd19a10ba8fd0;p=ardour.git diff --git a/gtk2_ardour/time_axis_view.cc b/gtk2_ardour/time_axis_view.cc index 8aa3e53639..a5d91c7bc2 100644 --- a/gtk2_ardour/time_axis_view.cc +++ b/gtk2_ardour/time_axis_view.cc @@ -26,11 +26,13 @@ #include "pbd/error.h" #include "pbd/convert.h" +#include "pbd/stacktrace.h" #include #include #include +#include "canvas/canvas.h" #include "canvas/rectangle.h" #include "canvas/debug.h" @@ -56,6 +58,7 @@ using namespace std; using namespace Gtk; using namespace Gdk; using namespace ARDOUR; +using namespace ARDOUR_UI_UTILS; using namespace PBD; using namespace Editing; using namespace ArdourCanvas; @@ -75,6 +78,7 @@ TimeAxisView::TimeAxisView (ARDOUR::Session* sess, PublicEditor& ed, TimeAxisVie , display_menu (0) , parent (rent) , selection_group (0) + , _ghost_group (0) , _hidden (false) , in_destructor (false) , _size_menu (0) @@ -88,21 +92,23 @@ TimeAxisView::TimeAxisView (ARDOUR::Session* sess, PublicEditor& ed, TimeAxisVie , _resize_drag_start (-1) , _preresize_cursor (0) , _have_preresize_cursor (false) - , _ghost_group (0) , _ebox_release_can_act (true) { if (extra_height == 0) { compute_heights (); } - _canvas_display = new Group (ed.get_trackview_group (), ArdourCanvas::Duple (0.0, 0.0)); + _canvas_display = new ArdourCanvas::Container (ed.get_trackview_group (), ArdourCanvas::Duple (0.0, 0.0)); + CANVAS_DEBUG_NAME (_canvas_display, "main for TAV"); _canvas_display->hide(); // reveal as needed - selection_group = new Group (_canvas_display); + selection_group = new ArdourCanvas::Container (_canvas_display); + CANVAS_DEBUG_NAME (selection_group, "selection for TAV"); selection_group->set_data (X_("timeselection"), (void *) 1); selection_group->hide(); - - _ghost_group = new Group (_canvas_display); + + _ghost_group = new ArdourCanvas::Container (_canvas_display); + CANVAS_DEBUG_NAME (_ghost_group, "ghost for TAV"); _ghost_group->lower_to_bottom(); _ghost_group->show(); @@ -131,12 +137,18 @@ TimeAxisView::TimeAxisView (ARDOUR::Session* sess, PublicEditor& ed, TimeAxisVie controls_table.set_no_show_all (); HSeparator* separator = manage (new HSeparator()); + separator->set_name("TrackSeparator"); + separator->set_size_request(-1, 1); + separator->show(); controls_vbox.pack_start (controls_table, false, false); controls_vbox.show (); + controls_hbox.pack_start (controls_vbox, true, true); + controls_hbox.show (); + //controls_ebox.set_name ("TimeAxisViewControlsBaseUnselected"); - controls_ebox.add (controls_vbox); + controls_ebox.add (controls_hbox); controls_ebox.add_events (Gdk::BUTTON_PRESS_MASK| Gdk::BUTTON_RELEASE_MASK| Gdk::POINTER_MOTION_MASK| @@ -153,10 +165,7 @@ TimeAxisView::TimeAxisView (ARDOUR::Session* sess, PublicEditor& ed, TimeAxisVie controls_ebox.signal_leave_notify_event().connect (sigc::mem_fun (*this, &TimeAxisView::controls_ebox_leave)); controls_ebox.show (); - controls_hbox.pack_start (controls_ebox, true, true); - controls_hbox.show (); - - time_axis_vbox.pack_start (controls_hbox, true, true); + time_axis_vbox.pack_start (controls_ebox, true, true, 0); time_axis_vbox.pack_end (*separator, false, false); time_axis_vbox.show(); @@ -174,7 +183,7 @@ TimeAxisView::~TimeAxisView() } for (list::iterator i = free_selection_rects.begin(); i != free_selection_rects.end(); ++i) { - delete (*i)->rect; + delete (*i)->rect; delete (*i)->start_trim; delete (*i)->end_trim; @@ -289,10 +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(); - return true; - } + } break; case GDK_SCROLL_DOWN: @@ -304,10 +310,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(); - return true; - } + } break; default: @@ -315,7 +318,14 @@ TimeAxisView::controls_ebox_scroll (GdkEventScroll* ev) break; } - return false; + /* Just forward to the normal canvas scroll method. The coordinate + systems are different but since the canvas is always larger than the + track headers, and aligned with the trackview area, this will work. + + In the not too distant future this layout is going away anyway and + headers will be on the canvas. + */ + return _editor.canvas_scroll_event (ev, false); } bool @@ -357,19 +367,16 @@ bool TimeAxisView::controls_ebox_motion (GdkEventMotion* ev) { if (_resize_drag_start >= 0) { - /* (ab)use the DragManager to do autoscrolling; adjust the event coordinates - into the world coordinate space that DragManager::motion_handler is expecting, - and then fake a DragManager motion event so that when maybe_autoscroll - asks DragManager for the current pointer position it will get the correct - answers. + + /* (ab)use the DragManager to do autoscrolling - basically we + * are pretending that the drag is taking place over the canvas + * (which perhaps in the glorious future, when track headers + * and the canvas are unified, will actually be true.) */ - int tx, ty; - controls_ebox.translate_coordinates (*control_parent, ev->x, ev->y, tx, ty); - ev->y = ty; - _editor.drags()->motion_handler ((GdkEvent *) ev, false); - _editor.maybe_autoscroll (false, true, false, ev->y_root < _resize_drag_start); - /* now do the actual TAV resize */ + _editor.maybe_autoscroll (false, true, true); + + /* now schedule the actual TAV resize */ int32_t const delta = (int32_t) floor (ev->y_root - _resize_drag_start); _editor.add_to_idle_resize (this, delta); _resize_drag_start = ev->y_root; @@ -378,6 +385,7 @@ TimeAxisView::controls_ebox_motion (GdkEventMotion* ev) maybe_set_cursor (ev->y); } + gdk_event_request_motions(ev); return true; } @@ -518,6 +526,8 @@ TimeAxisView::set_height (uint32_t h) /* resize the selection rect */ show_selection (_editor.get_selection().time); } + + _editor.override_visible_track_count (); } bool @@ -665,7 +675,7 @@ TimeAxisView::end_name_edit (int response) } if ((i != allviews.end()) && (*i != this) && !(*i)->hidden()) { - _editor.ensure_time_axis_view_is_visible (**i); + _editor.ensure_time_axis_view_is_visible (**i, false); (*i)->begin_name_edit (); } @@ -696,7 +706,7 @@ TimeAxisView::end_name_edit (int response) } if ((i != allviews.end()) && (*i != this) && !(*i)->hidden()) { - _editor.ensure_time_axis_view_is_visible (**i); + _editor.ensure_time_axis_view_is_visible (**i, false); (*i)->begin_name_edit (); } } @@ -837,9 +847,9 @@ TimeAxisView::show_selection (TimeSelection& ts) x1 = _editor.sample_to_pixel (start); x2 = _editor.sample_to_pixel (start + cnt - 1); - y2 = current_height(); + y2 = current_height() - 1; - rect->rect->set (ArdourCanvas::Rect (x1, 1, x2, y2)); + rect->rect->set (ArdourCanvas::Rect (x1, 0, x2, y2)); // trim boxes are at the top for selections @@ -946,12 +956,12 @@ TimeAxisView::get_selection_rect (uint32_t id) rect->rect->set_fill_color (ARDOUR_UI::config()->get_canvasvar_SelectionRect()); rect->start_trim = new ArdourCanvas::Rectangle (selection_group); - CANVAS_DEBUG_NAME (rect->rect, "selection rect start trim"); + CANVAS_DEBUG_NAME (rect->start_trim, "selection rect start trim"); rect->start_trim->set_outline (false); rect->start_trim->set_fill (false); rect->end_trim = new ArdourCanvas::Rectangle (selection_group); - CANVAS_DEBUG_NAME (rect->rect, "selection rect end trim"); + CANVAS_DEBUG_NAME (rect->end_trim, "selection rect end trim"); rect->end_trim->set_outline (false); rect->end_trim->set_fill (false); @@ -1143,14 +1153,17 @@ TimeAxisView::color_handler () } /** @return Pair: TimeAxisView, layer index. - * TimeAxisView is non-0 if this object covers y, or one of its children does. + * TimeAxisView is non-0 if this object covers @param y, or one of its children + * does. @param y is an offset from the top of the trackview area. + * * If the covering object is a child axis, then the child is returned. * TimeAxisView is 0 otherwise. + * * Layer index is the layer number (possibly fractional) if the TimeAxisView is valid * and is in stacked or expanded * region display mode, otherwise 0. */ std::pair -TimeAxisView::covers_y_position (double y) +TimeAxisView::covers_y_position (double y) const { if (hidden()) { return std::make_pair ((TimeAxisView *) 0, 0); @@ -1185,7 +1198,7 @@ TimeAxisView::covers_y_position (double y) break; } - return std::make_pair (this, l); + return std::make_pair (const_cast(this), l); } for (Children::const_iterator i = children.begin(); i != children.end(); ++i) { @@ -1199,6 +1212,30 @@ TimeAxisView::covers_y_position (double y) return std::make_pair ((TimeAxisView *) 0, 0); } +bool +TimeAxisView::covered_by_y_range (double y0, double y1) const +{ + if (hidden()) { + return false; + } + + /* if either the top or bottom of the axisview is in the vertical + * range, we cover it. + */ + + if ((y0 < _y_position && y1 < _y_position) || + (y0 >= _y_position + height && y1 >= _y_position + height)) { + return false; + } + + for (Children::const_iterator i = children.begin(); i != children.end(); ++i) { + if ((*i)->covered_by_y_range (y0, y1)) { + return true; + } + } + + return true; +} uint32_t TimeAxisView::preset_height (Height h)