add left/right side trim cursors and use them for region trimming, as appropriate
[ardour.git] / gtk2_ardour / editor_route_groups.cc
index 16bba4955bff3aed46df0141e91c08575d308d6a..c30132a3b883ab4d4537be7e9080b696c7f0d5c7 100644 (file)
@@ -20,7 +20,6 @@
 #include <cstdlib>
 #include <cmath>
 
-#include <gtkmm2ext/stop_signal.h>
 #include <gtkmm2ext/gtk_ui.h>
 #include "ardour/route_group.h"
 
@@ -234,12 +233,16 @@ EditorRouteGroups::set_activation (RouteGroup* g, bool a)
 ARDOUR::RouteGroup *
 EditorRouteGroups::new_route_group () const
 {
-       RouteGroup* g = new RouteGroup (
-               *_session,
-               "",
-               RouteGroup::Active,
-               (RouteGroup::Property) (RouteGroup::Mute | RouteGroup::Solo | RouteGroup::Edit)
-               );
+       PropertyList plist;
+
+       plist.add (Properties::active, true);
+       plist.add (Properties::mute, true);
+       plist.add (Properties::solo, true);
+       plist.add (Properties::edit, true);
+
+       RouteGroup* g = new RouteGroup (*_session, "");
+
+       g->set_properties (plist);
 
        RouteGroupDialog d (g, Gtk::Stock::NEW);
        int const r = d.do_run ();
@@ -255,12 +258,16 @@ EditorRouteGroups::new_route_group () const
 void
 EditorRouteGroups::run_new_group_dialog (const RouteList& rl)
 {
-       RouteGroup* g = new RouteGroup (
-               *_session,
-               "",
-               RouteGroup::Active,
-               (RouteGroup::Property) (RouteGroup::Mute | RouteGroup::Solo | RouteGroup::Edit | RouteGroup::RecEnable)
-               );
+       PropertyList plist;
+
+       plist.add (Properties::active, true);
+       plist.add (Properties::mute, true);
+       plist.add (Properties::solo, true);
+       plist.add (Properties::recenable, true);
+       plist.add (Properties::edit, true);
+
+       RouteGroup* g = new RouteGroup (*_session, "");
+       g->set_properties (plist);
 
        RouteGroupDialog d (g, Gtk::Stock::NEW);
        int const r = d.do_run ();
@@ -306,7 +313,7 @@ EditorRouteGroups::new_from_rec_enabled ()
 {
        RouteList rl;
 
-       for (Editor::TrackViewList::const_iterator i = _editor->get_track_views().begin(); i != _editor->get_track_views().end(); ++i) {
+       for (TrackViewList::const_iterator i = _editor->get_track_views().begin(); i != _editor->get_track_views().end(); ++i) {
                RouteTimeAxisView* rtv = dynamic_cast<RouteTimeAxisView*> (*i);
                if (rtv && rtv->route()->record_enabled()) {
                        rl.push_back (rtv->route());
@@ -325,7 +332,7 @@ EditorRouteGroups::new_from_soloed ()
 {
        RouteList rl;
 
-       for (Editor::TrackViewList::const_iterator i = _editor->get_track_views().begin(); i != _editor->get_track_views().end(); ++i) {
+       for (TrackViewList::const_iterator i = _editor->get_track_views().begin(); i != _editor->get_track_views().end(); ++i) {
                RouteTimeAxisView* rtv = dynamic_cast<RouteTimeAxisView*> (*i);
                if (rtv && !rtv->route()->is_master() && rtv->route()->soloed()) {
                        rl.push_back (rtv->route());
@@ -520,31 +527,37 @@ EditorRouteGroups::row_change (const Gtk::TreeModel::Path&, const Gtk::TreeModel
        }
 
        if ((*iter)[_columns.is_visible]) {
-               for (Editor::TrackViewList::const_iterator j = _editor->get_track_views().begin(); j != _editor->get_track_views().end(); ++j) {
+               for (TrackViewList::const_iterator j = _editor->get_track_views().begin(); j != _editor->get_track_views().end(); ++j) {
                        if ((*j)->route_group() == group) {
                                _editor->_routes->show_track_in_display (**j);
                        }
                }
        } else {
-               for (Editor::TrackViewList::const_iterator j = _editor->get_track_views().begin(); j != _editor->get_track_views().end(); ++j) {
+               for (TrackViewList::const_iterator j = _editor->get_track_views().begin(); j != _editor->get_track_views().end(); ++j) {
                        if ((*j)->route_group() == group) {
-                               _editor->hide_track_in_display (**j);
+                               _editor->hide_track_in_display (*j);
                        }
                }
        }
 
-       group->set_property (RouteGroup::Gain, (*iter)[_columns.gain]);
-       group->set_property (RouteGroup::RecEnable, (*iter)[_columns.record]);
-       group->set_property (RouteGroup::Mute, (*iter)[_columns.mute]);
-       group->set_property (RouteGroup::Solo, (*iter)[_columns.solo]);
-       group->set_property (RouteGroup::Select, (*iter)[_columns.select]);
-       group->set_property (RouteGroup::Edit, (*iter)[_columns.edits]);
-
-       string name = (*iter)[_columns.text];
-
-       if (name != group->name()) {
-               group->set_name (name);
-       }
+       PropertyList plist;
+       bool val = (*iter)[_columns.gain];
+       plist.add (Properties::gain, val);
+       val = (*iter)[_columns.record];
+       plist.add (Properties::recenable, val);
+       val = (*iter)[_columns.mute];
+       plist.add (Properties::mute, val);
+       val = (*iter)[_columns.solo];
+       plist.add (Properties::solo, val);
+       val = (*iter)[_columns.select];
+       plist.add (Properties::select, val);
+       val = (*iter)[_columns.edits];
+       plist.add (Properties::edit, val);
+       plist.add (Properties::name, string ((*iter)[_columns.text]));
+       
+       group->set_hidden (!(*iter)[_columns.is_visible], this);
+       
+       group->set_properties (plist);
 }
 
 void
@@ -556,12 +569,12 @@ EditorRouteGroups::add (RouteGroup* group)
        TreeModel::Row row = *(_model->append());
 
        row[_columns.is_visible] = !group->is_hidden();
-       row[_columns.gain] = group->property(RouteGroup::Gain);
-       row[_columns.record] = group->property(RouteGroup::RecEnable);
-       row[_columns.mute] = group->property(RouteGroup::Mute);
-       row[_columns.solo] = group->property(RouteGroup::Solo);
-       row[_columns.select] = group->property(RouteGroup::Select);
-       row[_columns.edits] = group->property(RouteGroup::Edit);
+       row[_columns.gain] = group->is_gain ();
+       row[_columns.record] = group->is_recenable();
+       row[_columns.mute] = group->is_mute ();
+       row[_columns.solo] = group->is_solo ();
+       row[_columns.select] = group->is_select ();
+       row[_columns.edits] = group->is_edit ();
 
        _in_row_change = true;
 
@@ -574,7 +587,7 @@ EditorRouteGroups::add (RouteGroup* group)
                focus = true;
        }
 
-       group->FlagsChanged.connect (sigc::bind (sigc::mem_fun (*this, &EditorRouteGroups::flags_changed), group));
+       group->PropertyChanged.connect (property_changed_connection, MISSING_INVALIDATOR, ui_bind (&EditorRouteGroups::property_changed, this, group, _1), gui_context());
 
        if (focus) {
                TreeViewColumn* col = _display.get_column (0);
@@ -604,14 +617,14 @@ EditorRouteGroups::groups_changed ()
                row[_columns.routegroup] = 0;
        }
 
-       _session->foreach_route_group (sigc::mem_fun (*this, &EditorRouteGroups::add));
+       if (_session) {
+               _session->foreach_route_group (sigc::mem_fun (*this, &EditorRouteGroups::add));
+       }
 }
 
 void
-EditorRouteGroups::flags_changed (void* src, RouteGroup* group)
+EditorRouteGroups::property_changed (RouteGroup* group, const PropertyChange& change)
 {
-        ENSURE_GUI_THREAD (*this, &EditorRouteGroups::flags_changed, src, group)
-
        _in_row_change = true;
 
         Gtk::TreeModel::Children children = _model->children();
@@ -620,18 +633,20 @@ EditorRouteGroups::flags_changed (void* src, RouteGroup* group)
                if (group == (*iter)[_columns.routegroup]) {
                        (*iter)[_columns.is_visible] = !group->is_hidden();
                        (*iter)[_columns.text] = group->name();
-                       (*iter)[_columns.gain] = group->property(RouteGroup::Gain);
-                       (*iter)[_columns.record] = group->property(RouteGroup::RecEnable);
-                       (*iter)[_columns.mute] = group->property(RouteGroup::Mute);
-                       (*iter)[_columns.solo] = group->property(RouteGroup::Solo);
-                       (*iter)[_columns.select] = group->property(RouteGroup::Select);
-                       (*iter)[_columns.edits] = group->property(RouteGroup::Edit);
+                       (*iter)[_columns.gain] = group->is_gain ();
+                       (*iter)[_columns.record] = group->is_recenable ();
+                       (*iter)[_columns.mute] = group->is_mute ();
+                       (*iter)[_columns.solo] = group->is_solo ();
+                       (*iter)[_columns.select] = group->is_select ();
+                       (*iter)[_columns.edits] = group->is_edit ();
                }
        }
 
        _in_row_change = false;
 
-       _editor->_group_tabs->set_dirty ();
+       if (change.contains (Properties::name) || change.contains (Properties::active)) {
+               _editor->_group_tabs->set_dirty ();
+       }
 }
 
 void
@@ -661,12 +676,14 @@ EditorRouteGroups::clear ()
 }
 
 void
-EditorRouteGroups::connect_to_session (Session* s)
+EditorRouteGroups::set_session (Session* s)
 {
-       EditorComponent::connect_to_session (s);
+       EditorComponent::set_session (s);
 
-       _session_connections.push_back (_session->route_group_added.connect (sigc::mem_fun (*this, &EditorRouteGroups::add)));
-       _session_connections.push_back (_session->route_group_removed.connect (sigc::mem_fun (*this, &EditorRouteGroups::groups_changed)));
+       if (_session) {
+               _session->route_group_added.connect (_session_connections, MISSING_INVALIDATOR, ui_bind (&EditorRouteGroups::add, this, _1), gui_context());
+               _session->route_group_removed.connect (_session_connections, MISSING_INVALIDATOR, boost::bind (&EditorRouteGroups::groups_changed, this), gui_context());
+       }
 
        groups_changed ();
 }
@@ -688,7 +705,7 @@ EditorRouteGroups::collect (RouteGroup* g)
        int const N = routes->size ();
 
        RouteList::iterator i = routes->begin ();
-       Editor::TrackViewList::const_iterator j = _editor->get_track_views().begin();
+       TrackViewList::const_iterator j = _editor->get_track_views().begin();
 
        int diff = 0;
        int coll = -1;