Unify the canvases by moving groups around rather than using set_scrolling_region...
[ardour.git] / gtk2_ardour / time_axis_view.cc
index 69a057bcf9cfe340dea27600d1fc6b88a31f1a37..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();
@@ -132,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));
@@ -228,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);
 
@@ -382,7 +384,8 @@ TimeAxisView::set_height(uint32_t h)
                /* resize the selection rect */
                show_selection (editor.get_selection().time);
        }
-       
+
+       reshow_feature_lines ();
 }
 
 bool
@@ -601,6 +604,8 @@ TimeAxisView::set_selected (bool yn)
                        (*i)->set_selected (false);
                }
        }
+
+       resizer.queue_draw ();
 }
 
 void
@@ -1162,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);
        }
 
@@ -1179,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 ();
        }
 }
@@ -1214,16 +1219,8 @@ 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);
-
        editor.add_to_idle_resize (this, resize_idle_target);
        
        resize_drag_start = ev->y_root;
@@ -1234,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;
 }