Put some up/down buttons to the right of the summary. Might help with #3786.
[ardour.git] / gtk2_ardour / editor_canvas.cc
index beace83c3fbad2d9c89cb963847ec1a06c245a0b..24d3f6110b02eac7c3b1fab6cf2f5f198a110fab 100644 (file)
@@ -31,6 +31,7 @@
 
 #include "ardour_ui.h"
 #include "editor.h"
+#include "global_signals.h"
 #include "waveview.h"
 #include "simplerect.h"
 #include "simpleline.h"
@@ -162,64 +163,34 @@ Editor::initialize_canvas ()
        _region_motion_group = new ArdourCanvas::Group (*_trackview_group);
 
        meter_bar_group = new ArdourCanvas::Group (*track_canvas->root ());
-       if (Profile->get_sae()) {
-               meter_bar = new ArdourCanvas::SimpleRect (*meter_bar_group, 0.0, 0.0, phys_width, timebar_height - 1);
-               meter_bar->property_outline_pixels() = 1;
-       } else {
-               meter_bar = new ArdourCanvas::SimpleRect (*meter_bar_group, 0.0, 0.0, phys_width, timebar_height);
-               meter_bar->property_outline_pixels() = 0;
-       }
-       meter_bar->property_outline_what() = (0x1 | 0x8);
+       meter_bar = new ArdourCanvas::SimpleRect (*meter_bar_group, 0.0, 0.0, phys_width, timebar_height - 1);
+       meter_bar->property_outline_pixels() = 1;
+       meter_bar->property_outline_what() = 0x8;
 
        tempo_bar_group = new ArdourCanvas::Group (*track_canvas->root ());
-       if (Profile->get_sae()) {
-               tempo_bar = new ArdourCanvas::SimpleRect (*tempo_bar_group, 0.0, 0.0, phys_width, (timebar_height - 1));
-               tempo_bar->property_outline_pixels() = 1;
-       } else {
-               tempo_bar = new ArdourCanvas::SimpleRect (*tempo_bar_group, 0.0, 0.0, phys_width, (timebar_height));
-               tempo_bar->property_outline_pixels() = 0;
-       }
-       tempo_bar->property_outline_what() = (0x1 | 0x8);
+       tempo_bar = new ArdourCanvas::SimpleRect (*tempo_bar_group, 0.0, 0.0, phys_width, (timebar_height - 1));
+       tempo_bar->property_outline_pixels() = 1;
+       tempo_bar->property_outline_what() = 0x8;
 
        range_marker_bar_group = new ArdourCanvas::Group (*track_canvas->root ());
-       if (Profile->get_sae()) {
-               range_marker_bar = new ArdourCanvas::SimpleRect (*range_marker_bar_group, 0.0, 0.0, phys_width, (timebar_height - 1));
-               range_marker_bar->property_outline_pixels() = 1;
-       } else {
-               range_marker_bar = new ArdourCanvas::SimpleRect (*range_marker_bar_group, 0.0, 0.0, phys_width, (timebar_height));
-               range_marker_bar->property_outline_pixels() = 0;
-       }
-       range_marker_bar->property_outline_what() = (0x1 | 0x8);
+       range_marker_bar = new ArdourCanvas::SimpleRect (*range_marker_bar_group, 0.0, 0.0, phys_width, (timebar_height - 1));
+       range_marker_bar->property_outline_pixels() = 1;
+       range_marker_bar->property_outline_what() = 0x8;
 
        transport_marker_bar_group = new ArdourCanvas::Group (*track_canvas->root ());
-       if (Profile->get_sae()) {
-               transport_marker_bar = new ArdourCanvas::SimpleRect (*transport_marker_bar_group, 0.0, 0.0,  phys_width, (timebar_height - 1));
-               transport_marker_bar->property_outline_pixels() = 1;
-       } else {
-               transport_marker_bar = new ArdourCanvas::SimpleRect (*transport_marker_bar_group, 0.0, 0.0,  phys_width, (timebar_height));
-               transport_marker_bar->property_outline_pixels() = 0;
-       }
-       transport_marker_bar->property_outline_what() = (0x1 | 0x8);
+       transport_marker_bar = new ArdourCanvas::SimpleRect (*transport_marker_bar_group, 0.0, 0.0,  phys_width, (timebar_height - 1));
+       transport_marker_bar->property_outline_pixels() = 1;
+       transport_marker_bar->property_outline_what() = 0x8;
 
        marker_bar_group = new ArdourCanvas::Group (*track_canvas->root ());
-       if (Profile->get_sae()) {
-               marker_bar = new ArdourCanvas::SimpleRect (*marker_bar_group, 0.0, 0.0, phys_width, (timebar_height - 1));
-               marker_bar->property_outline_pixels() = 1;
-       } else {
-               marker_bar = new ArdourCanvas::SimpleRect (*marker_bar_group, 0.0, 0.0, phys_width, (timebar_height));
-               marker_bar->property_outline_pixels() = 0;
-       }
-       marker_bar->property_outline_what() = (0x1 | 0x8);
+       marker_bar = new ArdourCanvas::SimpleRect (*marker_bar_group, 0.0, 0.0, phys_width, (timebar_height - 1));
+       marker_bar->property_outline_pixels() = 1;
+       marker_bar->property_outline_what() = 0x8;
 
        cd_marker_bar_group = new ArdourCanvas::Group (*track_canvas->root ());
-       if (Profile->get_sae()) {
-               cd_marker_bar = new ArdourCanvas::SimpleRect (*cd_marker_bar_group, 0.0, 0.0, phys_width, (timebar_height - 1));
-               cd_marker_bar->property_outline_pixels() = 1;
-       } else {
-               cd_marker_bar = new ArdourCanvas::SimpleRect (*cd_marker_bar_group, 0.0, 0.0, phys_width, (timebar_height));
-               cd_marker_bar->property_outline_pixels() = 0;
-       }
-       cd_marker_bar->property_outline_what() = (0x1 | 0x8);
+       cd_marker_bar = new ArdourCanvas::SimpleRect (*cd_marker_bar_group, 0.0, 0.0, phys_width, (timebar_height - 1));
+       cd_marker_bar->property_outline_pixels() = 1;
+       cd_marker_bar->property_outline_what() = 0x8;
 
        timebar_group =  new ArdourCanvas::Group (*track_canvas->root(), 0.0, 0.0);
        cursor_group = new ArdourCanvas::Group (*track_canvas->root(), 0.0, 0.0);
@@ -372,62 +343,33 @@ Editor::track_canvas_size_allocated ()
 }
 
 void
-Editor::controls_layout_size_request (Requisition* req)
+Editor::reset_controls_layout_width ()
 {
-       double pos = 0;
-       for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) {
-               pos += (*i)->effective_height ();
-       }
-
-       gint height = min ((gint) pos, (gint) (physical_screen_height(get_window()) - 600));
+        gint w = edit_controls_vbox.get_width();
 
-       bool changed = false;
-
-       gint w = edit_controls_vbox.get_width();
-       if (_group_tabs->is_mapped()) {
-               w += _group_tabs->get_width ();
-       }
-
-       gint width = max (w, controls_layout.get_width());
-
-       /* don't get too big. the fudge factors here are just guesses */
-
-       width =  min (width, (gint) (physical_screen_width(get_window()) - 300));
-
-       if ((req->width != width) || (req->height != height)) {
-               changed = true;
-               controls_layout_size_request_connection.disconnect ();
-       }
-
-       if (req->width != width) {
-               gint vbox_width = edit_controls_vbox.get_width();
-               if (_group_tabs->is_mapped()) {
-                       vbox_width += _group_tabs->get_width();
-               }
-               req->width = width;
+        if (_group_tabs->is_mapped()) {
+                w += _group_tabs->get_width();
+        }
 
-               /* this one is important: it determines how big the layout thinks it really is, as
-                  opposed to what it displays on the screen
-               */
-               controls_layout.property_width () = vbox_width;
-               controls_layout.property_width_request () = vbox_width;
+        /* the controls layout has no horizontal scrolling, its visible
+           width is always equal to the total width of its contents. 
+        */
 
-               // time_button_event_box.property_width_request () = vbox_width;
-               // zoom_box.property_width_request () = vbox_width;
-       }
+        controls_layout.property_width() = w;
+        controls_layout.property_width_request() = w;
+}
 
-       if (req->height != height) {
-               req->height = height;
-               controls_layout.property_height () = (guint) floor (pos);
-               controls_layout.property_height_request () = height;
-       }
+void
+Editor::reset_controls_layout_height (int32_t h)
+{
+        /* set the height of the scrollable area (i.e. the sum of all contained widgets)
+         */
 
-       if (changed) {
-               controls_layout_size_request_connection = controls_layout.signal_size_request().connect (sigc::mem_fun (*this, &Editor::controls_layout_size_request));
-       }
-       //cerr << "sizes = " << req->width << " " << edit_controls_vbox.get_width() << " " << controls_layout.get_width() << " " << zoom_box.get_width() << " " << time_button_frame.get_width() << endl;//DEBUG
+        controls_layout.property_height() = h;
+        
+        /* size request is set elsewhere, see ::track_canvas_allocate() */
 }
-
+        
 bool
 Editor::track_canvas_map_handler (GdkEventAny* /*ev*/)
 {
@@ -747,7 +689,7 @@ Editor::stop_canvas_autoscroll ()
 bool
 Editor::left_track_canvas (GdkEventCrossing */*ev*/)
 {
-        DropDownKeys ();
+       DropDownKeys ();
        set_entered_track (0);
        set_entered_regionview (0);
        reset_canvas_action_sensitivity (false);
@@ -928,9 +870,9 @@ Editor::horizontal_position () const
 void
 Editor::set_canvas_cursor (Gdk::Cursor* cursor, bool save)
 {
-        if (save) {
-                current_canvas_cursor = cursor;
-        }
+       if (save) {
+               current_canvas_cursor = cursor;
+       }
 
        if (is_drawable()) {
                track_canvas->get_window()->set_cursor (*cursor);
@@ -942,7 +884,7 @@ Editor::track_canvas_key_press (GdkEventKey* event)
 {
        /* XXX: event does not report the modifier key pressed down, AFAICS, so use the Keyboard object instead */
        if (mouse_mode == Editing::MouseZoom && Keyboard::the_keyboard().key_is_down (GDK_Control_L)) {
-               set_canvas_cursor (_cursors->zoom_out);
+               set_canvas_cursor (_cursors->zoom_out, true);
        }
 
        return false;
@@ -952,7 +894,7 @@ bool
 Editor::track_canvas_key_release (GdkEventKey* event)
 {
        if (mouse_mode == Editing::MouseZoom && !Keyboard::the_keyboard().key_is_down (GDK_Control_L)) {
-               set_canvas_cursor (_cursors->zoom_in);
+               set_canvas_cursor (_cursors->zoom_in, true);
        }
 
        return false;