make zoom focus selector a little narrower
[ardour.git] / gtk2_ardour / mixer_ui.cc
index c2eb588b2f2744865d085574155f36aff585e3cf..45b6eecee9077be303e16e5c7f0103e777f78c39 100644 (file)
@@ -67,9 +67,7 @@ Mixer_UI::Mixer_UI (AudioEngine& eng)
        mix_group_context_menu = 0;
        no_track_list_redisplay = false;
        in_group_row_change = false;
-
-       XMLNode* node = ARDOUR_UI::instance()->mixer_settings();
-       set_state (*node);
+       _visible = false;
 
        scroller_base.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK);
        scroller_base.set_name ("MixerWindow");
@@ -78,12 +76,12 @@ Mixer_UI::Mixer_UI (AudioEngine& eng)
        strip_packer.pack_end (scroller_base, true, true);
 
        scroller.add (strip_packer);
-       scroller.set_policy (Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);
+       scroller.set_policy (Gtk::POLICY_ALWAYS, Gtk::POLICY_AUTOMATIC);
 
        track_model = ListStore::create (track_columns);
        track_display.set_model (track_model);
        track_display.append_column (_("Strips"), track_columns.text);
-       track_display.append_column (_("Visible"), track_columns.visible);
+       track_display.append_column (_("Show"), track_columns.visible);
        track_display.get_column (0)->set_data (X_("colnum"), GUINT_TO_POINTER(0));
        track_display.get_column (1)->set_data (X_("colnum"), GUINT_TO_POINTER(1));
        track_display.get_column (0)->set_expand(true);
@@ -109,7 +107,7 @@ Mixer_UI::Mixer_UI (AudioEngine& eng)
        group_display.set_model (group_model);
        group_display.append_column (_("Group"), group_columns.text);
        group_display.append_column (_("Active"), group_columns.active);
-       group_display.append_column (_("Visible"), group_columns.visible);
+       group_display.append_column (_("Show"), group_columns.visible);
        group_display.get_column (0)->set_data (X_("colnum"), GUINT_TO_POINTER(0));
        group_display.get_column (1)->set_data (X_("colnum"), GUINT_TO_POINTER(1));
        group_display.get_column (2)->set_data (X_("colnum"), GUINT_TO_POINTER(2));
@@ -187,7 +185,7 @@ Mixer_UI::Mixer_UI (AudioEngine& eng)
        list_vpacker.pack_start (rhs_pane1, true, true);
 
        global_hpacker.pack_start (scroller, true, true);
-       global_hpacker.pack_start (out_packer, false, false);
+       global_hpacker.pack_start (out_packer, false, false, 12);
 
        list_hpane.add1(list_vpacker);
        list_hpane.add2(global_hpacker);
@@ -213,7 +211,7 @@ Mixer_UI::Mixer_UI (AudioEngine& eng)
 
        add_accel_group (ActionManager::ui_manager->get_accel_group());
 
-       signal_delete_event().connect (bind (sigc::ptr_fun (just_hide_it), static_cast<Gtk::Window *>(this)));
+       signal_delete_event().connect (mem_fun (*this, &Mixer_UI::hide_window));
        add_events (Gdk::KEY_PRESS_MASK|Gdk::KEY_RELEASE_MASK);
 
        _plugin_selector = new PluginSelector (PluginManager::the_manager());
@@ -248,41 +246,54 @@ Mixer_UI::show_window ()
                ms = (*ri)[track_columns.strip];
                ms->set_width (ms->get_width());
        }
+       _visible = true;
 }
 
+bool
+Mixer_UI::hide_window (GdkEventAny *ev)
+{
+       _visible = false;
+       return just_hide_it(ev, static_cast<Gtk::Window *>(this));
+}
+
+
 void
-Mixer_UI::add_strip (boost::shared_ptr<Route> route)
+Mixer_UI::add_strip (Session::RouteList& routes)
 {
-       ENSURE_GUI_THREAD(bind (mem_fun(*this, &Mixer_UI::add_strip), route));
+       ENSURE_GUI_THREAD(bind (mem_fun(*this, &Mixer_UI::add_strip), routes));
        
        MixerStrip* strip;
 
-       if (route->hidden()) {
-               return;
-       }
-
-       strip = new MixerStrip (*this, *session, route);
-       strips.push_back (strip);
-
-       strip->set_width (_strip_width);
-       show_strip (strip);
-
-       no_track_list_redisplay = true;
+       for (Session::RouteList::iterator x = routes.begin(); x != routes.end(); ++x) {
+               boost::shared_ptr<Route> route = (*x);
 
-       TreeModel::Row row = *(track_model->append());
-       row[track_columns.text] = route->name();
-
-       row[track_columns.visible] = true;
-       row[track_columns.route] = route;
-       row[track_columns.strip] = strip;
-
-       no_track_list_redisplay = false;
-       redisplay_track_list ();
-
-       route->name_changed.connect (bind (mem_fun(*this, &Mixer_UI::strip_name_changed), strip));
-       strip->GoingAway.connect (bind (mem_fun(*this, &Mixer_UI::remove_strip), strip));
-
-       strip->signal_button_release_event().connect (bind (mem_fun(*this, &Mixer_UI::strip_button_release_event), strip));
+               if (route->hidden()) {
+                       return;
+               }
+               
+               strip = new MixerStrip (*this, *session, route);
+               strips.push_back (strip);
+               
+               strip->set_width (_strip_width);
+               show_strip (strip);
+               
+               no_track_list_redisplay = true;
+               
+               TreeModel::Row row = *(track_model->append());
+               row[track_columns.text] = route->name();
+               
+               row[track_columns.visible] = true;
+               row[track_columns.route] = route;
+               row[track_columns.strip] = strip;
+               
+               no_track_list_redisplay = false;
+               redisplay_track_list ();
+               
+               route->name_changed.connect (bind (mem_fun(*this, &Mixer_UI::strip_name_changed), strip));
+               strip->GoingAway.connect (bind (mem_fun(*this, &Mixer_UI::remove_strip), strip));
+               
+               strip->signal_button_release_event().connect (bind (mem_fun(*this, &Mixer_UI::strip_button_release_event), strip));
+       }
 }
 
 void
@@ -341,15 +352,19 @@ Mixer_UI::strip_button_release_event (GdkEventButton *ev, MixerStrip *strip)
 void
 Mixer_UI::connect_to_session (Session* sess)
 {
+
        session = sess;
 
+       XMLNode* node = ARDOUR_UI::instance()->mixer_settings();
+       set_state (*node);
+
        string wintitle = _("ardour: mixer: ");
        wintitle += session->name();
        set_title (wintitle);
 
        initial_track_display ();
 
-       session->going_away.connect (mem_fun(*this, &Mixer_UI::disconnect_from_session));
+       session->GoingAway.connect (mem_fun(*this, &Mixer_UI::disconnect_from_session));
        session->RouteAdded.connect (mem_fun(*this, &Mixer_UI::add_strip));
        session->mix_group_added.connect (mem_fun(*this, &Mixer_UI::add_mix_group));
        session->mix_group_removed.connect (mem_fun(*this, &Mixer_UI::mix_groups_changed));
@@ -358,6 +373,10 @@ Mixer_UI::connect_to_session (Session* sess)
        
        _plugin_selector->set_session (session);
 
+       if (_visible) {
+              show_window();
+       }
+
        start_updating ();
 }
 
@@ -374,11 +393,11 @@ Mixer_UI::disconnect_from_session ()
 void
 Mixer_UI::show_strip (MixerStrip* ms)
 {
-        TreeModel::Children rows = track_model->children();
+       TreeModel::Children rows = track_model->children();
        TreeModel::Children::iterator i;
-
+       
        for (i = rows.begin(); i != rows.end(); ++i) {
-
+       
                MixerStrip* strip = (*i)[track_columns.strip];
                if (strip == ms) {
                        (*i)[track_columns.visible] = true;
@@ -390,7 +409,7 @@ Mixer_UI::show_strip (MixerStrip* ms)
 void
 Mixer_UI::hide_strip (MixerStrip* ms)
 {
-        TreeModel::Children rows = track_model->children();
+       TreeModel::Children rows = track_model->children();
        TreeModel::Children::iterator i;
        
        for (i = rows.begin(); i != rows.end(); ++i) {
@@ -400,37 +419,37 @@ Mixer_UI::hide_strip (MixerStrip* ms)
                        (*i)[track_columns.visible] = false;
                        break;
                }
-        }
- }
+       }
+}
 
- gint
- Mixer_UI::start_updating ()
- {
-        fast_screen_update_connection = ARDOUR_UI::instance()->SuperRapidScreenUpdate.connect (mem_fun(*this, &Mixer_UI::fast_update_strips));
-        return 0;
- }
+gint
+Mixer_UI::start_updating ()
+{
+    fast_screen_update_connection = ARDOUR_UI::instance()->SuperRapidScreenUpdate.connect (mem_fun(*this, &Mixer_UI::fast_update_strips));
+    return 0;
+}
 
- gint
- Mixer_UI::stop_updating ()
- {
-        fast_screen_update_connection.disconnect();
-        return 0;
- }
+gint
+Mixer_UI::stop_updating ()
+{
+    fast_screen_update_connection.disconnect();
+    return 0;
+}
 
- void
- Mixer_UI::fast_update_strips ()
- {
-        if (is_mapped () && session) {
-                for (list<MixerStrip *>::iterator i = strips.begin(); i != strips.end(); ++i) {
-                        (*i)->fast_update ();
-                }
-        }
- }
+void
+Mixer_UI::fast_update_strips ()
+{
+       if (is_mapped () && session) {
+               for (list<MixerStrip *>::iterator i = strips.begin(); i != strips.end(); ++i) {
+                       (*i)->fast_update ();
+               }
+       }
+}
 
 void
 Mixer_UI::set_all_strips_visibility (bool yn)
 {
-        TreeModel::Children rows = track_model->children();
+       TreeModel::Children rows = track_model->children();
        TreeModel::Children::iterator i;
 
        no_track_list_redisplay = true;
@@ -623,9 +642,7 @@ Mixer_UI::initial_track_display ()
 
        track_model->clear ();
 
-       for (Session::RouteList::iterator i = copy.begin(); i != copy.end(); ++i) {
-               add_strip (*i);
-       }
+       add_strip (copy);
 
        no_track_list_redisplay = false;
 
@@ -639,7 +656,7 @@ Mixer_UI::show_track_list_menu ()
                build_track_menu ();
        }
 
-       track_menu->popup (1, 0);
+       track_menu->popup (1, gtk_get_current_event_time());
 }
 
 bool
@@ -748,7 +765,7 @@ Mixer_UI::group_display_button_press (GdkEventButton* ev)
                if (mix_group_context_menu == 0) {
                        build_mix_group_context_menu ();
                }
-               mix_group_context_menu->popup (1, 0);
+               mix_group_context_menu->popup (1, ev->time);
                return true;
        }
 
@@ -1046,6 +1063,12 @@ Mixer_UI::set_state (const XMLNode& node)
                }
        }
 
+       if ((prop = node.property ("show-mixer"))) {
+               if (prop->value() == "yes") {
+                      _visible = true;
+               }
+       }
+
        return 0;
 }
 
@@ -1087,6 +1110,8 @@ Mixer_UI::get_state (void)
 
        node->add_property ("narrow-strips", _strip_width == Narrow ? "yes" : "no");
 
+       node->add_property ("show-mixer", _visible ? "yes" : "no");
+
        return *node;
 }