Remove unnecessary _have_transaction flag in TrimDrag. Fix undo when a trim of one...
[ardour.git] / gtk2_ardour / mixer_ui.cc
index 6a273434e3bba9d7f345e23170443f12a0183d05..4a3ec325a1afd2c557e4f7427e57210f7175300c 100644 (file)
 
 */
 
+#ifdef WAF_BUILD
+#include "gtk2ardour-config.h"
+#endif
+
 #include <algorithm>
 #include <map>
 #include <sigc++/bind.h>
 
 #include <gtkmm2ext/gtk_ui.h>
 #include <gtkmm2ext/utils.h>
-#include <gtkmm2ext/stop_signal.h>
 #include <gtkmm2ext/tearoff.h>
 #include <gtkmm2ext/window_title.h>
 
-#include "ardour/audio_diskstream.h"
 #include "ardour/audio_track.h"
 #include "ardour/plugin_manager.h"
 #include "ardour/route_group.h"
@@ -69,7 +71,6 @@ Mixer_UI::Mixer_UI ()
        _strip_width = Config->get_default_narrow_ms() ? Narrow : Wide;
        track_menu = 0;
         _monitor_section = 0;
-       route_group_context_menu = 0;
        no_track_list_redisplay = false;
        in_group_row_change = false;
        _visible = false;
@@ -77,7 +78,7 @@ Mixer_UI::Mixer_UI ()
        strip_redisplay_does_not_sync_order_keys = false;
        ignore_sync = false;
 
-       Route::SyncOrderKeys.connect (*this, ui_bind (&Mixer_UI::sync_order_keys, this, _1), gui_context());
+       Route::SyncOrderKeys.connect (*this, invalidator (*this), ui_bind (&Mixer_UI::sync_order_keys, this, _1), gui_context());
 
        scroller_base.add_events (Gdk::BUTTON_PRESS_MASK|Gdk::BUTTON_RELEASE_MASK);
        scroller_base.set_name ("MixerWindow");
@@ -173,8 +174,8 @@ Mixer_UI::Mixer_UI ()
        route_group_add_button->signal_clicked().connect (sigc::mem_fun (*this, &Mixer_UI::new_route_group));
        route_group_remove_button->signal_clicked().connect (sigc::mem_fun (*this, &Mixer_UI::remove_selected_route_group));
 
-       route_group_display_button_box->add (*route_group_remove_button);
        route_group_display_button_box->add (*route_group_add_button);
+       route_group_display_button_box->add (*route_group_remove_button);
 
        group_display_vbox.pack_start (group_display_scroller, true, true);
        group_display_vbox.pack_start (*route_group_display_button_box, false, false);
@@ -216,7 +217,7 @@ Mixer_UI::Mixer_UI ()
        title += _("Mixer");
        set_title (title.get_string());
 
-       set_wmclass (X_("ardour_mixer"), "Ardour");
+       set_wmclass (X_("ardour_mixer"), PROGRAM_NAME);
 
        add_accel_group (ActionManager::ui_manager->get_accel_group());
 
@@ -254,7 +255,7 @@ Mixer_UI::Mixer_UI ()
 
        auto_rebinding = FALSE;
 
-       MixerStrip::CatchDeletion.connect (*this, ui_bind (&Mixer_UI::remove_strip, this, _1), gui_context());
+       MixerStrip::CatchDeletion.connect (*this, invalidator (*this), ui_bind (&Mixer_UI::remove_strip, this, _1), gui_context());
 
         MonitorSection::setup_knob_images ();
 
@@ -321,7 +322,7 @@ Mixer_UI::add_strip (RouteList& routes)
                        continue;
                }
 
-                if (route->is_control()) {
+                if (route->is_monitor()) {
                         if (!_monitor_section) {
                                 _monitor_section = new MonitorSection (_session);
                                 out_packer.pack_end (_monitor_section->tearoff(), false, false);
@@ -362,7 +363,7 @@ Mixer_UI::add_strip (RouteList& routes)
                        route->set_order_key (N_("signal"), track_model->children().size()-1);
                }
 
-               route->PropertyChanged.connect (*this, ui_bind (&Mixer_UI::strip_property_changed, this, _1, strip), gui_context());
+               route->PropertyChanged.connect (*this, invalidator (*this), ui_bind (&Mixer_UI::strip_property_changed, this, _1, strip), gui_context());
 
                strip->WidthChanged.connect (sigc::mem_fun(*this, &Mixer_UI::strip_width_changed));
                strip->signal_button_release_event().connect (sigc::bind (sigc::mem_fun(*this, &Mixer_UI::strip_button_release_event), strip));
@@ -511,10 +512,12 @@ Mixer_UI::set_session (Session* sess)
 
        initial_track_display ();
 
-       _session->RouteAdded.connect (_session_connections, ui_bind (&Mixer_UI::add_strip, this, _1), gui_context());
-       _session->route_group_added.connect (_session_connections, ui_bind (&Mixer_UI::add_route_group, this, _1), gui_context());
-       _session->route_group_removed.connect (_session_connections, boost::bind (&Mixer_UI::route_groups_changed, this), gui_context());
-       _session->config.ParameterChanged.connect (_session_connections, ui_bind (&Mixer_UI::parameter_changed, this, _1), gui_context());
+       _session->RouteAdded.connect (_session_connections, invalidator (*this), ui_bind (&Mixer_UI::add_strip, this, _1), gui_context());
+       _session->route_group_added.connect (_session_connections, invalidator (*this), ui_bind (&Mixer_UI::add_route_group, this, _1), gui_context());
+       _session->route_group_removed.connect (_session_connections, invalidator (*this), boost::bind (&Mixer_UI::route_groups_changed, this), gui_context());
+       _session->config.ParameterChanged.connect (_session_connections, invalidator (*this), ui_bind (&Mixer_UI::parameter_changed, this, _1), gui_context());
+
+       Config->ParameterChanged.connect (*this, invalidator (*this), ui_bind (&Mixer_UI::parameter_changed, this, _1), gui_context ());
 
        route_groups_changed ();
 
@@ -538,7 +541,9 @@ Mixer_UI::session_going_away ()
                delete (*i);
        }
 
-        _monitor_section->tearoff().hide_visible ();
+        if (_monitor_section) {
+                _monitor_section->tearoff().hide_visible ();
+        }
 
        strips.clear ();
 
@@ -624,7 +629,7 @@ Mixer_UI::set_all_strips_visibility (bool yn)
                        continue;
                }
 
-               if (strip->route()->is_master() || strip->route()->is_control()) {
+               if (strip->route()->is_master() || strip->route()->is_monitor()) {
                        continue;
                }
 
@@ -652,7 +657,7 @@ Mixer_UI::set_all_audio_visibility (int tracks, bool yn)
                        continue;
                }
 
-               if (strip->route()->is_master() || strip->route()->is_control()) {
+               if (strip->route()->is_master() || strip->route()->is_monitor()) {
                        continue;
                }
 
@@ -775,7 +780,7 @@ Mixer_UI::redisplay_track_list ()
 
                        if (strip->packed()) {
 
-                               if (strip->route()->is_master() || strip->route()->is_control()) {
+                               if (strip->route()->is_master() || strip->route()->is_monitor()) {
                                        out_packer.reorder_child (*strip, -1);
                                } else {
                                        strip_packer.reorder_child (*strip, -1); /* put at end */
@@ -783,7 +788,7 @@ Mixer_UI::redisplay_track_list ()
 
                        } else {
 
-                               if (strip->route()->is_master() || strip->route()->is_control()) {
+                               if (strip->route()->is_master() || strip->route()->is_monitor()) {
                                        out_packer.pack_start (*strip, false, false);
                                } else {
                                        strip_packer.pack_start (*strip, false, false);
@@ -796,7 +801,7 @@ Mixer_UI::redisplay_track_list ()
 
                        strip->set_marked_for_display (false);
 
-                       if (strip->route()->is_master() || strip->route()->is_control()) {
+                       if (strip->route()->is_master() || strip->route()->is_monitor()) {
                                /* do nothing, these cannot be hidden */
                        } else {
                                if (strip->packed()) {
@@ -994,7 +999,7 @@ Mixer_UI::track_display_button_press (GdkEventButton* ev)
                        MixerStrip* strip = (*iter)[track_columns.strip];
                        if (strip) {
 
-                               if (!strip->route()->is_master() && !strip->route()->is_control()) {
+                               if (!strip->route()->is_master() && !strip->route()->is_monitor()) {
                                        bool visible = (*iter)[track_columns.visible];
                                        (*iter)[track_columns.visible] = !visible;
                                }
@@ -1054,37 +1059,9 @@ Mixer_UI::strip_property_changed (const PropertyChange& what_changed, MixerStrip
        error << _("track display list item for renamed strip not found!") << endmsg;
 }
 
-
-void
-Mixer_UI::build_route_group_context_menu ()
-{
-       using namespace Gtk::Menu_Helpers;
-
-       route_group_context_menu = new Menu;
-       route_group_context_menu->set_name ("ArdourContextMenu");
-       MenuList& items = route_group_context_menu->items();
-
-       items.push_back (MenuElem (_("Activate All"), sigc::mem_fun(*this, &Mixer_UI::activate_all_route_groups)));
-       items.push_back (MenuElem (_("Disable All"), sigc::mem_fun(*this, &Mixer_UI::disable_all_route_groups)));
-       items.push_back (SeparatorElem());
-       items.push_back (MenuElem (_("Add group"), sigc::mem_fun(*this, &Mixer_UI::new_route_group)));
-
-}
-
 bool
 Mixer_UI::group_display_button_press (GdkEventButton* ev)
 {
-       if (Keyboard::is_context_menu_event (ev)) {
-               if (route_group_context_menu == 0) {
-                       build_route_group_context_menu ();
-               }
-               route_group_context_menu->popup (1, ev->time);
-               return true;
-       }
-
-
-        RouteGroup* group;
-       TreeIter iter;
        TreeModel::Path path;
        TreeViewColumn* column;
        int cellx;
@@ -1094,32 +1071,40 @@ Mixer_UI::group_display_button_press (GdkEventButton* ev)
                return false;
        }
 
+       TreeIter iter = group_model->get_iter (path);
+       if (!iter) {
+               return false;
+       }
+
+       RouteGroup* group = (*iter)[group_columns.group];
+
+       if (Keyboard::is_context_menu_event (ev)) {
+               _group_tabs->get_menu(group)->popup (1, ev->time);
+               return true;
+       }
+
        switch (GPOINTER_TO_UINT (column->get_data (X_("colnum")))) {
        case 0:
                if (Keyboard::is_edit_event (ev)) {
-                       if ((iter = group_model->get_iter (path))) {
-                               if ((group = (*iter)[group_columns.group]) != 0) {
-                                       // edit_route_group (group);
+                       if (group) {
+                               // edit_route_group (group);
 #ifdef GTKOSX
-                                       group_display.queue_draw();
+                               group_display.queue_draw();
 #endif
-                                       return true;
-                               }
+                               return true;
                        }
-
                }
                break;
 
        case 1:
-               if ((iter = group_model->get_iter (path))) {
-                       bool visible = (*iter)[group_columns.visible];
-                       (*iter)[group_columns.visible] = !visible;
+       {
+               bool visible = (*iter)[group_columns.visible];
+               (*iter)[group_columns.visible] = !visible;
 #ifdef GTKOSX
-                       group_display.queue_draw();
+               group_display.queue_draw();
 #endif
-                       return true;
-               }
-               break;
+               return true;
+       }
 
        default:
                break;
@@ -1158,22 +1143,16 @@ Mixer_UI::route_groups_changed ()
        }
 
        _session->foreach_route_group (sigc::mem_fun (*this, &Mixer_UI::add_route_group));
+
+       _group_tabs->set_dirty ();
 }
 
 void
 Mixer_UI::new_route_group ()
 {
-       PropertyList plist;
-
-       plist.add (Properties::active, true);
-       plist.add (Properties::gain, true);
-       plist.add (Properties::mute, true);
-       plist.add (Properties::solo, true);
-
-       RouteGroup* g = new RouteGroup (*_session, "");
-       g->set_properties (plist);
-
-       _session->add_route_group (g);
+       RouteList rl;
+       
+       _group_tabs->run_new_group_dialog (rl);
 }
 
 void
@@ -1202,14 +1181,12 @@ Mixer_UI::remove_selected_route_group ()
 }
 
 void
-Mixer_UI::group_flags_changed (void* src, RouteGroup* group)
+Mixer_UI::route_group_property_changed (RouteGroup* group, const PropertyChange& change)
 {
        if (in_group_row_change) {
                return;
        }
 
-       ENSURE_GUI_THREAD (*this, &Mixer_UI::group_flags_changed, src, group)
-
        /* force an update of any mixer strips that are using this group,
           otherwise mix group names don't change in mixer strips
        */
@@ -1236,11 +1213,13 @@ Mixer_UI::group_flags_changed (void* src, RouteGroup* group)
 
        in_group_row_change = false;
 
-       _group_tabs->set_dirty ();
+       if (change.contains (Properties::name)) {
+               _group_tabs->set_dirty ();
+       }
 }
 
 void
-Mixer_UI::route_group_name_edit (const Glib::ustring& path, const Glib::ustring& new_text)
+Mixer_UI::route_group_name_edit (const std::string& path, const std::string& new_text)
 {
        RouteGroup* group;
        TreeIter iter;
@@ -1284,7 +1263,7 @@ Mixer_UI::route_group_row_change (const Gtk::TreeModel::Path&, const Gtk::TreeMo
                }
        }
 
-       Glib::ustring name = (*iter)[group_columns.text];
+       std::string name = (*iter)[group_columns.text];
 
        if (name != group->name()) {
                group->set_name (name);
@@ -1310,7 +1289,7 @@ Mixer_UI::add_route_group (RouteGroup* group)
                focus = true;
        }
 
-       group->FlagsChanged.connect (*this, ui_bind (&Mixer_UI::group_flags_changed, this, _1, group), gui_context());
+       group->PropertyChanged.connect (*this, invalidator (*this), ui_bind (&Mixer_UI::route_group_property_changed, this, group, _1), gui_context());
 
        if (focus) {
                TreeViewColumn* col = group_display.get_column (0);
@@ -1318,6 +1297,8 @@ Mixer_UI::add_route_group (RouteGroup* group)
                group_display.set_cursor (group_model->get_path (row), *col, *name_cell, true);
        }
 
+       _group_tabs->set_dirty ();
+
        in_group_row_change = false;
 }
 
@@ -1612,6 +1593,11 @@ Mixer_UI::parameter_changed (string const & p)
                } else {
                        _group_tabs->hide ();
                }
+       } else if (p == "default-narrow_ms") {
+               bool const s = Config->get_default_narrow_ms ();
+               for (list<MixerStrip*>::iterator i = strips.begin(); i != strips.end(); ++i) {
+                       (*i)->set_width_enum (s ? Narrow : Wide, this);
+               }
        }
 }