persistent waveform shape setting.
[ardour.git] / gtk2_ardour / time_axis_view.cc
index fa181476cf58d6c3ef4338019c0303889510908e..f67ca6a3cea5e70c0eda4861612a17912732b588 100644 (file)
@@ -26,6 +26,7 @@
 
 #include "pbd/error.h"
 #include "pbd/convert.h"
+#include "pbd/stacktrace.h"
 
 #include <gtkmm2ext/doi.h>
 #include <gtkmm2ext/utils.h>
@@ -76,6 +77,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)
@@ -89,7 +91,6 @@ 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) {
@@ -97,13 +98,16 @@ TimeAxisView::TimeAxisView (ARDOUR::Session* sess, PublicEditor& ed, TimeAxisVie
        }
 
        _canvas_display = new Group (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);
+       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);
+       CANVAS_DEBUG_NAME (_ghost_group, "ghost for TAV");
        _ghost_group->lower_to_bottom();
        _ghost_group->show();
 
@@ -178,7 +182,7 @@ TimeAxisView::~TimeAxisView()
        }
 
        for (list<SelectionRect*>::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;
 
@@ -294,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;
@@ -309,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;
@@ -366,32 +370,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;
@@ -541,6 +524,8 @@ TimeAxisView::set_height (uint32_t h)
                /* resize the selection rect */
                show_selection (_editor.get_selection().time);
        }
+
+       _editor.override_visible_track_count ();
 }
 
 bool
@@ -1173,7 +1158,7 @@ TimeAxisView::color_handler ()
  * and is in stacked or expanded * region display mode, otherwise 0.
  */
 std::pair<TimeAxisView*, double>
-TimeAxisView::covers_y_position (double y)
+TimeAxisView::covers_y_position (double y) const
 {
        if (hidden()) {
                return std::make_pair ((TimeAxisView *) 0, 0);
@@ -1208,7 +1193,7 @@ TimeAxisView::covers_y_position (double y)
                        break;
                }
 
-               return std::make_pair (this, l);
+               return std::make_pair (const_cast<TimeAxisView*>(this), l);
        }
 
        for (Children::const_iterator i = children.begin(); i != children.end(); ++i) {
@@ -1222,6 +1207,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)