Unify the canvases by moving groups around rather than using set_scrolling_region...
[ardour.git] / gtk2_ardour / time_axis_view.cc
index 325fc6c217df177573e72bd32dc89607e1614858..04d7c805332875b0e0387e0b24716cd95dd56214 100644 (file)
@@ -79,7 +79,7 @@ TimeAxisView::TimeAxisView (ARDOUR::Session& sess, PublicEditor& ed, TimeAxisVie
                need_size_info = false;
        }
 
-       canvas_display = new Group (*canvas.root(), 0.0, 0.0);
+       canvas_display = new Group (*ed.get_trackview_group (), 0.0, 0.0);
        
        selection_group = new Group (*canvas_display);
        selection_group->hide();
@@ -96,7 +96,6 @@ TimeAxisView::TimeAxisView (ARDOUR::Session& sess, PublicEditor& ed, TimeAxisVie
        last_name_entry_key_press_event = 0;
        name_packing = NamePackingBits (0);
        resize_drag_start = -1;
-       resize_idle_id = -1;
 
        /*
          Create the standard LHS Controls
@@ -133,6 +132,7 @@ TimeAxisView::TimeAxisView (ARDOUR::Session& sess, PublicEditor& ed, TimeAxisVie
        controls_table.set_no_show_all ();
 
        resizer.set_size_request (10, 10);
+       resizer.set_name ("ResizeHandle");
        resizer.signal_expose_event().connect (mem_fun (*this, &TimeAxisView::resizer_expose));
        resizer.signal_button_press_event().connect (mem_fun (*this, &TimeAxisView::resizer_button_press));
        resizer.signal_button_release_event().connect (mem_fun (*this, &TimeAxisView::resizer_button_release));
@@ -229,6 +229,7 @@ TimeAxisView::show_at (double y, int& nth, VBox *parent)
        */
 
        canvas_display->get_bounds (ix1, iy1, ix2, iy2);
+       iy1 += editor.get_trackview_group_vertical_offset ();
        Group* pg = canvas_display->property_parent();
        pg->i2w (ix1, iy1);
 
@@ -272,6 +273,9 @@ TimeAxisView::controls_ebox_scroll (GdkEventScroll* ev)
                if (Keyboard::modifier_state_equals (ev->state, Keyboard::TertiaryModifier)) {
                        step_height (true);
                        return true;
+               } else if (Keyboard::no_modifiers_active (ev->state)) {
+                       editor.scroll_tracks_up_line();
+                       return true;
                }
                break;
                
@@ -279,6 +283,9 @@ TimeAxisView::controls_ebox_scroll (GdkEventScroll* ev)
                if (Keyboard::modifier_state_equals (ev->state, Keyboard::TertiaryModifier)) {
                        step_height (false);
                        return true;
+               } else if (Keyboard::no_modifiers_active (ev->state)) {
+                       editor.scroll_tracks_down_line();
+                       return true;
                }
                break;
 
@@ -343,11 +350,13 @@ TimeAxisView::hide ()
 void
 TimeAxisView::step_height (bool bigger)
 {
+       static const uint32_t step = 20;
+
        if (bigger) {
-               set_height (height + 4);
+               set_height (height + step);
        } else {
-               if (height > 4) {
-                       set_height (std::max (height - 4, hSmall));
+               if (height > step) {
+                       set_height (std::max (height - step, hSmall));
                } else if (height != hSmall) {
                        set_height (hSmall);
                }
@@ -375,7 +384,8 @@ TimeAxisView::set_height(uint32_t h)
                /* resize the selection rect */
                show_selection (editor.get_selection().time);
        }
-       
+
+       reshow_feature_lines ();
 }
 
 bool
@@ -594,6 +604,8 @@ TimeAxisView::set_selected (bool yn)
                        (*i)->set_selected (false);
                }
        }
+
+       resizer.queue_draw ();
 }
 
 void
@@ -1155,8 +1167,6 @@ TimeAxisView::reshow_feature_lines ()
        while (feature_lines.size()< analysis_features.size()) {
                ArdourCanvas::SimpleLine* l = new ArdourCanvas::SimpleLine (*canvas_display);
                l->property_color_rgba() = (guint) ARDOUR_UI::config()->canvasvar_ZeroLine.get();
-               l->property_y1() = 0;
-               l->property_y2() = current_height();
                feature_lines.push_back (l);
        }
 
@@ -1172,6 +1182,8 @@ TimeAxisView::reshow_feature_lines ()
        for (i = analysis_features.begin(), l = feature_lines.begin(); i != analysis_features.end() && l != feature_lines.end(); ++i, ++l) {
                (*l)->property_x1() = editor.frame_to_pixel (*i);
                (*l)->property_x2() = editor.frame_to_pixel (*i);
+               (*l)->property_y1() = 0;
+               (*l)->property_y2() = current_height();
                (*l)->show ();
        }
 }
@@ -1193,18 +1205,10 @@ TimeAxisView::resizer_button_release (GdkEventButton* ev)
        return true;
 }
 
-static gboolean
-_idle_resizer (gpointer arg)
-{
-       return ((TimeAxisView*)arg)->idle_resize ();
-}
-
-bool
-TimeAxisView::idle_resize ()
+void
+TimeAxisView::idle_resize (uint32_t h)
 {
-       set_height (resize_idle_target);
-       resize_idle_id = -1;
-       return false;
+       set_height (h);
 }
 
 bool
@@ -1215,20 +1219,10 @@ TimeAxisView::resizer_motion (GdkEventMotion* ev)
        }
 
        int32_t delta = (int32_t) floor (resize_drag_start - ev->y_root);
-       int xroot, yroot;
-       Glib::RefPtr<Gdk::Window> win (resizer.get_window());
-
-       if (win) {
-               win->get_origin (xroot, yroot);
-               editor.queue_draw_resize_line (yroot + ev->y);
-       }
 
        resize_idle_target = std::max (resize_idle_target - delta, (int) hSmall);
-
-       if (resize_idle_id < 0) {
-               // resize_idle_id = g_idle_add (_idle_resizer, this);
-       }
-
+       editor.add_to_idle_resize (this, resize_idle_target);
+       
        resize_drag_start = ev->y_root;
 
        return true;
@@ -1237,12 +1231,41 @@ TimeAxisView::resizer_motion (GdkEventMotion* ev)
 bool
 TimeAxisView::resizer_expose (GdkEventExpose* event)
 {
-       resizer.get_window()->draw_rectangle (resizer.get_style()->get_fg_gc(STATE_ACTIVE),
-                                             true,
-                                             event->area.x,
-                                             event->area.y,
-                                             event->area.width,
-                                             event->area.height);
+       int w, h, x, y, d;
+       Glib::RefPtr<Gdk::Window> win (resizer.get_window());
+       Glib::RefPtr<Gdk::GC> dark (resizer.get_style()->get_fg_gc (STATE_NORMAL));
+       Glib::RefPtr<Gdk::GC> light (resizer.get_style()->get_bg_gc (STATE_NORMAL));
+
+       win->draw_rectangle (controls_ebox.get_style()->get_bg_gc(STATE_NORMAL),
+                            true,
+                            event->area.x,
+                            event->area.y,
+                            event->area.width,
+                            event->area.height);
+
+       win->get_geometry (x, y, w, h, d);
+
+       /* handle/line #1 */
+       
+       win->draw_line (dark, 0, 0, w - 2, 0);
+       win->draw_point (dark, 0, 1);
+       win->draw_line (light, 1, 1, w - 1, 1);
+       win->draw_point (light, w - 1, 0);
+
+       /* handle/line #2 */
+
+       win->draw_line (dark, 0, 4, w - 2, 4);
+       win->draw_point (dark, 0, 5);
+       win->draw_line (light, 1, 5, w - 1, 5);
+       win->draw_point (light, w - 1, 4);
+
+       /* handle/line #3 */
+
+       win->draw_line (dark, 0, 8, w - 2, 8);
+       win->draw_point (dark, 0, 9);
+       win->draw_line (light, 1, 9, w - 1, 9);
+       win->draw_point (light, w - 1, 8);
+
        return true;
 }