X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Ftime_axis_view.cc;h=a5d91c7bc269f8cd9577a4e3286feb69f5f598d1;hb=fe9f2b15b13ce1e8216305f4c3916582ab65f8df;hp=c45887cb7ee9ed740907a862f4ea5335f616c2d6;hpb=84f55440a3c6317dd2ab5d7e3d638016609e4d03;p=ardour.git diff --git a/gtk2_ardour/time_axis_view.cc b/gtk2_ardour/time_axis_view.cc index c45887cb7e..a5d91c7bc2 100644 --- a/gtk2_ardour/time_axis_view.cc +++ b/gtk2_ardour/time_axis_view.cc @@ -58,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; @@ -97,16 +98,16 @@ TimeAxisView::TimeAxisView (ARDOUR::Session* sess, PublicEditor& ed, TimeAxisVie 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(); @@ -182,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; @@ -297,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: @@ -312,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: @@ -323,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 @@ -370,32 +372,11 @@ TimeAxisView::controls_ebox_motion (GdkEventMotion* ev) * 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.) - * - * First, translate the event coordinates into the canvas - * coordinate space that DragManager::motion_handler is - * expecting (this requires translation into the *window* - * coordinates for the track canvas window, and then conversion - * from window to canvas coordinate spaces). - * - * Then fake a DragManager motion event so that when - * maybe_autoscroll asks DragManager for the current pointer - * position it will get the correct answers. - */ - - int tx, ty; - controls_ebox.translate_coordinates (*_editor.get_track_canvas(), ev->x, ev->y, tx, ty); - - /* x-axis of track headers is not shared with the canvas, but - the y-axis is, so we we can get a valid translation here. */ - Duple canvas_coord = _editor.get_track_canvas()->canvas()->window_to_canvas (Duple (tx, ty)); - ev->y = (int) floor (canvas_coord.y); + _editor.maybe_autoscroll (false, true, true); - _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 */ + /* 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; @@ -545,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 @@ -692,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 (); } @@ -723,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 (); } } @@ -864,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 @@ -973,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); @@ -1170,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); @@ -1212,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) { @@ -1226,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)