fixup freeze operation.
[ardour.git] / gtk2_ardour / editor.cc
index adf51cdd3be64b7d33caad8a9940281663ac6d63..559196a68531b540cf60536e0e14d75fbc33fe31 100644 (file)
@@ -262,10 +262,11 @@ Editor::Editor ()
          /* tool bar related */
 
        , zoom_range_clock (new AudioClock (X_("zoomrange"), false, X_("zoom range"), true, false, true))
-
        , toolbar_selection_clock_table (2,3)
-
+       , _mouse_mode_tearoff (0)
        , automation_mode_button (_("mode"))
+       , _zoom_tearoff (0)
+       , _tools_tearoff (0)
 
        , _toolbar_viewport (*manage (new Gtk::Adjustment (0, 0, 1e10)), *manage (new Gtk::Adjustment (0, 0, 1e10)))
 
@@ -429,6 +430,9 @@ Editor::Editor ()
        meter_label.hide();
        meter_label.set_no_show_all();
 
+       if (Profile->get_trx()) {
+               mark_label.set_text (_("Markers"));
+       }
        mark_label.set_name ("EditorRulerLabel");
        mark_label.set_size_request (-1, (int)timebar_height);
        mark_label.set_alignment (1.0, 0.5);
@@ -484,7 +488,9 @@ Editor::Editor ()
 
        HBox* h = manage (new HBox);
        _group_tabs = new EditorGroupTabs (this);
-       h->pack_start (*_group_tabs, PACK_SHRINK);
+       if (!ARDOUR::Profile->get_trx()) {
+               h->pack_start (*_group_tabs, PACK_SHRINK);
+       }
        h->pack_start (edit_controls_vbox);
        controls_layout.add (*h);
 
@@ -603,10 +609,14 @@ Editor::Editor ()
        _summary_hbox.pack_start (*summary_frame, true, true);
        _summary_hbox.pack_start (*summary_arrows_right, false, false);
 
-       editor_summary_pane.pack2 (_summary_hbox);
+       if (!ARDOUR::Profile->get_trx()) {
+               editor_summary_pane.pack2 (_summary_hbox);
+       }
 
        edit_pane.pack1 (editor_summary_pane, true, true);
-       edit_pane.pack2 (_the_notebook, false, true);
+       if (!ARDOUR::Profile->get_trx()) {
+               edit_pane.pack2 (_the_notebook, false, true);
+       }
 
        editor_summary_pane.signal_size_allocate().connect (sigc::bind (sigc::mem_fun (*this, &Editor::pane_allocation_handler), static_cast<Paned*> (&editor_summary_pane)));
 
@@ -667,11 +677,11 @@ Editor::Editor ()
        /* nudge stuff */
 
        nudge_forward_button.set_name ("nudge button");
-//     nudge_forward_button.add_elements (ArdourButton::FlatFace);
+//     nudge_forward_button.add_elements (ArdourButton::Inset);
        nudge_forward_button.set_image(::get_icon("nudge_right"));
 
        nudge_backward_button.set_name ("nudge button");
-//     nudge_backward_button.add_elements (ArdourButton::FlatFace);
+//     nudge_backward_button.add_elements (ArdourButton::Inset);
        nudge_backward_button.set_image(::get_icon("nudge_left"));
 
        fade_context_menu.set_name ("ArdourContextMenu");
@@ -2265,6 +2275,10 @@ Editor::set_state (const XMLNode& node, int /*version*/)
                reset_zoom (samples_per_pixel);
        }
 
+       if ((prop = node.property ("visible-track-count"))) {
+               set_visible_track_count (PBD::atoi (prop->value()));
+       }
+
        if ((prop = node.property ("snap-to"))) {
                set_snap_to ((SnapType) string_2_enum (prop->value(), _snap_type));
        }
@@ -2496,6 +2510,8 @@ Editor::get_state ()
        node->add_property ("pre-internal-snap-to", enum_2_string (pre_internal_snap_type));
        node->add_property ("pre-internal-snap-mode", enum_2_string (pre_internal_snap_mode));
        node->add_property ("edit-point", enum_2_string (_edit_point));
+       snprintf (buf, sizeof(buf), "%d", _visible_track_count);
+       node->add_property ("visible-track-count", buf);
 
        snprintf (buf, sizeof (buf), "%" PRIi64, playhead_cursor->current_frame ());
        node->add_property ("playhead", buf);
@@ -2865,15 +2881,21 @@ Editor::setup_toolbar ()
 
        mouse_mode_hbox->set_spacing (2);
 
-       mouse_mode_hbox->pack_start (smart_mode_button, false, false);
+       if (!ARDOUR::Profile->get_trx()) {
+               mouse_mode_hbox->pack_start (smart_mode_button, false, false);
+       }
+
        mouse_mode_hbox->pack_start (mouse_move_button, false, false);
        mouse_mode_hbox->pack_start (mouse_select_button, false, false);
        mouse_mode_hbox->pack_start (mouse_zoom_button, false, false);
-       mouse_mode_hbox->pack_start (mouse_gain_button, false, false);
-       mouse_mode_hbox->pack_start (mouse_timefx_button, false, false);
-       mouse_mode_hbox->pack_start (mouse_audition_button, false, false);
-       mouse_mode_hbox->pack_start (mouse_draw_button, false, false);
-       mouse_mode_hbox->pack_start (internal_edit_button, false, false, 8);
+
+       if (!ARDOUR::Profile->get_trx()) {
+               mouse_mode_hbox->pack_start (mouse_gain_button, false, false);
+               mouse_mode_hbox->pack_start (mouse_timefx_button, false, false);
+               mouse_mode_hbox->pack_start (mouse_audition_button, false, false);
+               mouse_mode_hbox->pack_start (mouse_draw_button, false, false);
+               mouse_mode_hbox->pack_start (internal_edit_button, false, false, 8);
+       }
 
        mouse_mode_vbox->pack_start (*mouse_mode_hbox);
 
@@ -2890,9 +2912,11 @@ Editor::setup_toolbar ()
 
        edit_mode_selector.set_name ("mouse mode button");
        edit_mode_selector.set_size_request (65, -1);
-       edit_mode_selector.add_elements (ArdourButton::FlatFace);
+       edit_mode_selector.add_elements (ArdourButton::Inset);
 
-       mode_box->pack_start (edit_mode_selector, false, false);
+       if (!ARDOUR::Profile->get_trx()) {
+               mode_box->pack_start (edit_mode_selector, false, false);
+       }
        mode_box->pack_start (*mouse_mode_box, false, false);
 
        _mouse_mode_tearoff = manage (new TearOff (*mode_box));
@@ -2920,21 +2944,21 @@ Editor::setup_toolbar ()
        RefPtr<Action> act;
 
        zoom_in_button.set_name ("zoom button");
-//     zoom_in_button.add_elements ( ArdourButton::FlatFace );
+//     zoom_in_button.add_elements ( ArdourButton::Inset );
        zoom_in_button.set_tweaks ((ArdourButton::Tweaks) (ArdourButton::ShowClick) );
        zoom_in_button.set_image(::get_icon ("zoom_in"));
        act = ActionManager::get_action (X_("Editor"), X_("temporal-zoom-in"));
        zoom_in_button.set_related_action (act);
 
        zoom_out_button.set_name ("zoom button");
-//     zoom_out_button.add_elements ( ArdourButton::FlatFace );
+//     zoom_out_button.add_elements ( ArdourButton::Inset );
        zoom_out_button.set_tweaks ((ArdourButton::Tweaks) (ArdourButton::ShowClick) );
        zoom_out_button.set_image(::get_icon ("zoom_out"));
        act = ActionManager::get_action (X_("Editor"), X_("temporal-zoom-out"));
        zoom_out_button.set_related_action (act);
 
        zoom_out_full_button.set_name ("zoom button");
-//     zoom_out_full_button.add_elements ( ArdourButton::FlatFace );
+//     zoom_out_full_button.add_elements ( ArdourButton::Inset );
        zoom_out_full_button.set_tweaks ((ArdourButton::Tweaks) (ArdourButton::ShowClick) );
        zoom_out_full_button.set_image(::get_icon ("zoom_full"));
        act = ActionManager::get_action (X_("Editor"), X_("zoom-to-session"));
@@ -2942,46 +2966,72 @@ Editor::setup_toolbar ()
 
        zoom_focus_selector.set_name ("zoom button");
        zoom_focus_selector.set_size_request (80, -1);
-//     zoom_focus_selector.add_elements (ArdourButton::FlatFace);
-
-       _zoom_box.pack_start (zoom_out_button, false, false);
-       _zoom_box.pack_start (zoom_in_button, false, false);
-       _zoom_box.pack_start (zoom_out_full_button, false, false);
+//     zoom_focus_selector.add_elements (ArdourButton::Inset);
 
-       _zoom_box.pack_start (zoom_focus_selector, false, false);
+       if (!ARDOUR::Profile->get_trx()) {
+               _zoom_box.pack_start (zoom_out_button, false, false);
+               _zoom_box.pack_start (zoom_in_button, false, false);
+               _zoom_box.pack_start (zoom_out_full_button, false, false);
+               _zoom_box.pack_start (zoom_focus_selector, false, false);
+       } else {
+               mode_box->pack_start (zoom_out_button, false, false);
+               mode_box->pack_start (zoom_in_button, false, false);
+       }
 
        /* Track zoom buttons */
        visible_tracks_selector.set_name ("zoom button");
-//     visible_tracks_selector.add_elements ( ArdourButton::FlatFace );
+//     visible_tracks_selector.add_elements ( ArdourButton::Inset );
        set_size_request_to_display_given_text (visible_tracks_selector, _("all"), 40, 2);
 
-       _zoom_box.pack_start (visible_tracks_selector);
-
-       _zoom_tearoff = manage (new TearOff (_zoom_box));
-
-       _zoom_tearoff->Detach.connect (sigc::bind (sigc::mem_fun(*this, &Editor::detach_tearoff), static_cast<Box*>(&toolbar_hbox),
-                                                  &_zoom_tearoff->tearoff_window()));
-       _zoom_tearoff->Attach.connect (sigc::bind (sigc::mem_fun(*this, &Editor::reattach_tearoff), static_cast<Box*> (&toolbar_hbox),
-                                                  &_zoom_tearoff->tearoff_window(), 0));
-       _zoom_tearoff->Hidden.connect (sigc::bind (sigc::mem_fun(*this, &Editor::detach_tearoff), static_cast<Box*>(&toolbar_hbox),
-                                                  &_zoom_tearoff->tearoff_window()));
-       _zoom_tearoff->Visible.connect (sigc::bind (sigc::mem_fun(*this, &Editor::reattach_tearoff), static_cast<Box*> (&toolbar_hbox),
-                                                   &_zoom_tearoff->tearoff_window(), 0));
+       tav_expand_button.set_name ("zoom button");
+//     tav_expand_button.add_elements ( ArdourButton::FlatFace );
+       tav_expand_button.set_tweaks ((ArdourButton::Tweaks) (ArdourButton::ShowClick) );
+       tav_expand_button.set_size_request (-1, 20);
+       tav_expand_button.set_image(::get_icon ("tav_exp"));
+       act = ActionManager::get_action (X_("Editor"), X_("expand-tracks"));
+       tav_expand_button.set_related_action (act);
+
+       tav_shrink_button.set_name ("zoom button");
+//     tav_shrink_button.add_elements ( ArdourButton::FlatFace );
+       tav_shrink_button.set_tweaks ((ArdourButton::Tweaks) (ArdourButton::ShowClick) );
+       tav_shrink_button.set_size_request (-1, 20);
+       tav_shrink_button.set_image(::get_icon ("tav_shrink"));
+       act = ActionManager::get_action (X_("Editor"), X_("shrink-tracks"));
+       tav_shrink_button.set_related_action (act);
+
+       if (!ARDOUR::Profile->get_trx()) {
+               _zoom_box.pack_start (visible_tracks_selector);
+       }
+       _zoom_box.pack_start (tav_shrink_button);
+       _zoom_box.pack_start (tav_expand_button);
+
+       if (!ARDOUR::Profile->get_trx()) {
+               _zoom_tearoff = manage (new TearOff (_zoom_box));
+               
+               _zoom_tearoff->Detach.connect (sigc::bind (sigc::mem_fun(*this, &Editor::detach_tearoff), static_cast<Box*>(&toolbar_hbox),
+                                                          &_zoom_tearoff->tearoff_window()));
+               _zoom_tearoff->Attach.connect (sigc::bind (sigc::mem_fun(*this, &Editor::reattach_tearoff), static_cast<Box*> (&toolbar_hbox),
+                                                          &_zoom_tearoff->tearoff_window(), 0));
+               _zoom_tearoff->Hidden.connect (sigc::bind (sigc::mem_fun(*this, &Editor::detach_tearoff), static_cast<Box*>(&toolbar_hbox),
+                                                          &_zoom_tearoff->tearoff_window()));
+               _zoom_tearoff->Visible.connect (sigc::bind (sigc::mem_fun(*this, &Editor::reattach_tearoff), static_cast<Box*> (&toolbar_hbox),
+                                                           &_zoom_tearoff->tearoff_window(), 0));
+       } 
 
        snap_box.set_spacing (2);
        snap_box.set_border_width (2);
 
        snap_type_selector.set_name ("mouse mode button");
        snap_type_selector.set_size_request (140, -1);
-       snap_type_selector.add_elements (ArdourButton::FlatFace);
+       snap_type_selector.add_elements (ArdourButton::Inset);
 
        snap_mode_selector.set_name ("mouse mode button");
        snap_mode_selector.set_size_request (85, -1);
-       snap_mode_selector.add_elements (ArdourButton::FlatFace);
+       snap_mode_selector.add_elements (ArdourButton::Inset);
 
        edit_point_selector.set_name ("mouse mode button");
        edit_point_selector.set_size_request (85, -1);
-       edit_point_selector.add_elements (ArdourButton::FlatFace);
+       edit_point_selector.add_elements (ArdourButton::Inset);
 
        snap_box.pack_start (snap_mode_selector, false, false);
        snap_box.pack_start (snap_type_selector, false, false);
@@ -3030,15 +3080,19 @@ Editor::setup_toolbar ()
        toolbar_hbox.set_border_width (1);
 
        toolbar_hbox.pack_start (*_mouse_mode_tearoff, false, false);
-       toolbar_hbox.pack_start (*_zoom_tearoff, false, false);
-       toolbar_hbox.pack_start (*_tools_tearoff, false, false);
-
-       hbox->pack_start (snap_box, false, false);
-        if (!Profile->get_small_screen()) {
-                hbox->pack_start (*nudge_box, false, false);
-        } else {
-                ARDOUR_UI::instance()->editor_transport_box().pack_start (*nudge_box, false, false);
-        }
+       if (!ARDOUR::Profile->get_trx()) {
+               toolbar_hbox.pack_start (*_zoom_tearoff, false, false);
+               toolbar_hbox.pack_start (*_tools_tearoff, false, false);
+       }
+
+       if (!ARDOUR::Profile->get_trx()) {
+               hbox->pack_start (snap_box, false, false);
+               if (!Profile->get_small_screen()) {
+                       hbox->pack_start (*nudge_box, false, false);
+               } else {
+                       ARDOUR_UI::instance()->editor_transport_box().pack_start (*nudge_box, false, false);
+               }
+       }
        hbox->pack_start (panic_box, false, false);
 
        hbox->show_all ();
@@ -3141,6 +3195,8 @@ Editor::setup_tooltips ()
        ARDOUR_UI::instance()->set_tip (zoom_out_button, _("Zoom Out"));
        ARDOUR_UI::instance()->set_tip (zoom_out_full_button, _("Zoom to Session"));
        ARDOUR_UI::instance()->set_tip (zoom_focus_selector, _("Zoom focus"));
+       ARDOUR_UI::instance()->set_tip (tav_expand_button, _("Expand Tracks"));
+       ARDOUR_UI::instance()->set_tip (tav_shrink_button, _("Shrink Tracks"));
        ARDOUR_UI::instance()->set_tip (visible_tracks_selector, _("Number of visible tracks"));
        ARDOUR_UI::instance()->set_tip (snap_type_selector, _("Snap/Grid Units"));
        ARDOUR_UI::instance()->set_tip (snap_mode_selector, _("Snap/Grid Mode"));
@@ -3482,35 +3538,58 @@ Editor::build_track_count_menu ()
        visible_tracks_selector.AddMenuElem (MenuElem (X_("24"), sigc::bind (sigc::mem_fun(*this, &Editor::set_visible_track_count), 24)));
        visible_tracks_selector.AddMenuElem (MenuElem (X_("32"), sigc::bind (sigc::mem_fun(*this, &Editor::set_visible_track_count), 32)));
        visible_tracks_selector.AddMenuElem (MenuElem (X_("64"), sigc::bind (sigc::mem_fun(*this, &Editor::set_visible_track_count), 64)));
-       visible_tracks_selector.AddMenuElem (MenuElem (_("all"), sigc::bind (sigc::mem_fun(*this, &Editor::set_visible_track_count), -1)));
+       visible_tracks_selector.AddMenuElem (MenuElem (_("all"), sigc::bind (sigc::mem_fun(*this, &Editor::set_visible_track_count), 0)));
 }
 
 void
 Editor::set_visible_track_count (int32_t n)
 {
-       if (n == _visible_track_count && !visible_tracks_selector.get_text().empty()) {
+       _visible_track_count = n;
+
+       /* if the canvas hasn't really been allocated any size yet, just
+          record the desired number of visible tracks and return. when canvas
+          allocation happens, we will get called again and then we can do the
+          real work.
+       */
+       
+       if (_visible_canvas_height <= 1) {
                return;
        }
 
-       _visible_track_count = n;
-       
+       int h;
        string str;
 
        if (_visible_track_count > 0) {
+               h = _visible_canvas_height / _visible_track_count;
                std::ostringstream s;
                s << _visible_track_count;
-               
                str = s.str();
-               
-       } else {
+       } else if (_visible_track_count == 0) {
+               h = _visible_canvas_height / track_views.size();
                str = _("all");
+       } else {
+               /* negative value means that the visible track count has 
+                  been overridden by explicit track height changes.
+               */
+               visible_tracks_selector.set_text (X_("*"));
+               return;
        }
 
+       for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) {
+               (*i)->set_height (h);
+       }
+       
        if (str != visible_tracks_selector.get_text()) {
                visible_tracks_selector.set_text (str);
        }
 }
 
+void
+Editor::override_visible_track_count ()
+{
+       _visible_track_count = -_visible_track_count;
+}
+
 bool
 Editor::edit_controls_button_release (GdkEventButton* ev)
 {
@@ -3654,7 +3733,7 @@ Editor::detach_tearoff (Box* /*b*/, Window* /*w*/)
 {
        if ((_tools_tearoff->torn_off() || !_tools_tearoff->visible()) && 
            (_mouse_mode_tearoff->torn_off() || !_mouse_mode_tearoff->visible()) && 
-           (_zoom_tearoff->torn_off() || !_zoom_tearoff->visible())) {
+           (_zoom_tearoff && (_zoom_tearoff->torn_off() || !_zoom_tearoff->visible()))) {
                top_hbox.remove (toolbar_frame);
        }
 }
@@ -3964,7 +4043,9 @@ Editor::update_tearoff_visibility()
        bool visible = Config->get_keep_tearoffs();
        _mouse_mode_tearoff->set_visible (visible);
        _tools_tearoff->set_visible (visible);
-       _zoom_tearoff->set_visible (visible);
+       if (_zoom_tearoff) {
+               _zoom_tearoff->set_visible (visible);
+       }
 }
 
 void
@@ -4792,7 +4873,7 @@ Editor::region_view_removed ()
        _summary->set_dirty ();
 }
 
-TimeAxisView*
+RouteTimeAxisView*
 Editor::axis_view_from_route (boost::shared_ptr<Route> r) const
 {
        TrackViewList::const_iterator j = track_views.begin ();