fixup freeze operation.
[ardour.git] / gtk2_ardour / mixer_ui.cc
index 8126a81e85837c1abbd96b510ec14f74fd8b0c22..874f8feddf7ac119cb6bb3c85701cda842b24790 100644 (file)
@@ -240,6 +240,7 @@ Mixer_UI::Mixer_UI ()
        group_display.show();
 
        _in_group_rebuild_or_clear = false;
+       _maximised = false;
 
        MixerStrip::CatchDeletion.connect (*this, invalidator (*this), boost::bind (&Mixer_UI::remove_strip, this, _1), gui_context());
 
@@ -313,6 +314,22 @@ Mixer_UI::hide_window (GdkEventAny *ev)
 void
 Mixer_UI::add_strips (RouteList& routes)
 {
+       bool from_scratch = track_model->children().size() == 0;
+       Gtk::TreeModel::Children::iterator insert_iter = track_model->children().end();
+
+       for (Gtk::TreeModel::Children::iterator it = track_model->children().begin(); it != track_model->children().end(); ++it) {
+               boost::shared_ptr<Route> r = (*it)[track_columns.route];
+
+               if (r->order_key() == (routes.front()->order_key() + routes.size())) {
+                       insert_iter = it;
+                       break;
+               }
+       }
+
+       if(!from_scratch) {
+               _selection.clear_routes ();
+       }
+
        MixerStrip* strip;
 
        try {
@@ -359,11 +376,15 @@ Mixer_UI::add_strips (RouteList& routes)
                        
                        show_strip (strip);
                        
-                       TreeModel::Row row = *(track_model->append());
+                       TreeModel::Row row = *(track_model->insert(insert_iter));
                        row[track_columns.text] = route->name();
                        row[track_columns.visible] = strip->route()->is_master() ? true : strip->marked_for_display();
                        row[track_columns.route] = route;
                        row[track_columns.strip] = strip;
+
+                       if (!from_scratch) {
+                               _selection.add (strip);
+                       }
                        
                        route->PropertyChanged.connect (*this, invalidator (*this), boost::bind (&Mixer_UI::strip_property_changed, this, _1, strip), gui_context());
                        
@@ -1539,6 +1560,19 @@ Mixer_UI::set_state (const XMLNode& node)
                }
        }
 
+       if ((prop = node.property ("maximised"))) {
+               bool yn = string_is_affirmative (prop->value());
+               Glib::RefPtr<Action> act = ActionManager::get_action (X_("Common"), X_("ToggleMaximalMixer"));
+               assert (act);
+               Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
+               bool fs = tact && tact->get_active();
+               if (yn ^ fs) {
+                       ActionManager::do_action ("Common",
+                                       "ToggleMaximalMixer");
+               }
+       }
+
+
        return 0;
 }
 
@@ -1581,6 +1615,8 @@ Mixer_UI::get_state (void)
 
        node->add_property ("show-mixer", _visible ? "yes" : "no");
 
+       node->add_property ("maximised", _maximised ? "yes" : "no");
+
        return *node;
 }
 
@@ -1922,3 +1958,26 @@ Mixer_UI::toggle_midi_input_active (bool flip_others)
        _session->set_exclusive_input_active (rl, onoff, flip_others);
 }
 
+void
+Mixer_UI::maximise_mixer_space ()
+{
+       if (_maximised) {
+               return;
+       }
+
+       fullscreen ();
+
+       _maximised = true;
+}
+
+void
+Mixer_UI::restore_mixer_space ()
+{
+       if (!_maximised) {
+               return;
+       }
+
+       unfullscreen();
+
+       _maximised = false;
+}