add/remove edit groups via buttons (still a bit of work left to do)
authorPaul Davis <paul@linuxaudiosystems.com>
Wed, 8 Mar 2006 23:26:28 +0000 (23:26 +0000)
committerPaul Davis <paul@linuxaudiosystems.com>
Wed, 8 Mar 2006 23:26:28 +0000 (23:26 +0000)
git-svn-id: svn://localhost/trunk/ardour2@364 d708f5d6-7413-0410-9779-e7cbd77b26cf

gtk2_ardour/editor.cc
gtk2_ardour/editor.h
gtk2_ardour/editor_edit_groups.cc
gtk2_ardour/editor_route_list.cc
libs/ardour/ardour/route.h
libs/ardour/ardour/route_group.h
libs/ardour/ardour/session.h
libs/ardour/route.cc
libs/ardour/session_state.cc

index e3ca52cac23cf7c1f7ebd61fc22be65a7ea75ec4..4667cd45a2ff47c9862f9738168a261592c157da 100644 (file)
@@ -568,9 +568,9 @@ Editor::Editor (AudioEngine& eng)
        group_model->signal_row_changed().connect (mem_fun (*this, &Editor::edit_group_row_change));
 
        edit_group_display.set_name ("EditGroupList");
-       edit_group_display.get_selection()->set_mode (SELECTION_NONE);
+       edit_group_display.get_selection()->set_mode (SELECTION_SINGLE);
        edit_group_display.set_reorderable (false);
-
+       edit_group_display.set_rules_hint (true);
        edit_group_display.set_size_request (75, -1);
 
        edit_group_display_scroller.add (edit_group_display);
@@ -578,14 +578,19 @@ Editor::Editor (AudioEngine& eng)
 
        edit_group_display.signal_button_press_event().connect (mem_fun(*this, &Editor::edit_group_list_button_press_event), false);
 
-       {
-               TreeModel::Row row;
-               row = *(group_model->append());
-               row[group_columns.is_active] = false;
-               row[group_columns.is_visible] = true;
-               row[group_columns.text] = (_("-all-"));
-               row[group_columns.routegroup] = 0;
-       }
+       VBox* edit_group_display_packer = manage (new VBox());
+       HButtonBox* edit_group_display_button_box = manage (new HButtonBox());
+       Button* edit_group_add_button = manage (new Button ("+"));
+       Button* edit_group_remove_button = manage (new Button("-"));
+
+       edit_group_add_button->signal_clicked().connect (mem_fun (*this, &Editor::new_edit_group));
+       edit_group_remove_button->signal_clicked().connect (mem_fun (*this, &Editor::remove_selected_edit_group));
+       
+       edit_group_display_button_box->pack_start (*edit_group_add_button);
+       edit_group_display_button_box->pack_start (*edit_group_remove_button);
+
+       edit_group_display_packer->pack_start (edit_group_display_scroller, true, true);
+       edit_group_display_packer->pack_start (*edit_group_display_button_box, false, false);
 
        region_list_display.set_size_request (100, -1);
        region_list_display.set_name ("RegionListDisplay");
@@ -662,7 +667,7 @@ Editor::Editor (AudioEngine& eng)
                the_notebook.append_page (region_list_scroller, _("Regions"));
                the_notebook.append_page (route_list_scroller, _("Tracks/Busses"));
        the_notebook.append_page (snapshot_display_scroller, _("Snapshots"));
-       the_notebook.append_page (edit_group_display_scroller, _("Edit Groups"));
+       the_notebook.append_page (*edit_group_display_packer, _("Edit Groups"));
        the_notebook.append_page (named_selection_scroller, _("Chunks"));
        the_notebook.set_show_tabs (true);
        the_notebook.set_scrollable (true);
@@ -1029,12 +1034,6 @@ Editor::session_control_changed (Session::ControlType t)
        }
 }
 
-void
-Editor::fake_add_edit_group (RouteGroup *group)
-{
-       Gtkmm2ext::UI::instance()->call_slot (bind (mem_fun(*this, &Editor::add_edit_group), group));
-}
-
 void
 Editor::fake_handle_new_audio_region (AudioRegion *region)
 {
@@ -1182,7 +1181,8 @@ Editor::connect_to_session (Session *t)
        session_connections.push_back (session->AudioRegionAdded.connect (mem_fun(*this, &Editor::fake_handle_new_audio_region)));
        session_connections.push_back (session->AudioRegionRemoved.connect (mem_fun(*this, &Editor::fake_handle_audio_region_removed)));
        session_connections.push_back (session->DurationChanged.connect (mem_fun(*this, &Editor::fake_handle_new_duration)));
-       session_connections.push_back (session->edit_group_added.connect (mem_fun(*this, &Editor::fake_add_edit_group)));
+       session_connections.push_back (session->edit_group_added.connect (mem_fun(*this, &Editor::add_edit_group)));
+       session_connections.push_back (session->edit_group_removed.connect (mem_fun(*this, &Editor::edit_groups_changed)));
        session_connections.push_back (session->NamedSelectionAdded.connect (mem_fun(*this, &Editor::handle_new_named_selection)));
        session_connections.push_back (session->NamedSelectionRemoved.connect (mem_fun(*this, &Editor::handle_new_named_selection)));
        session_connections.push_back (session->DirtyChanged.connect (mem_fun(*this, &Editor::update_title)));
@@ -1195,7 +1195,7 @@ Editor::connect_to_session (Session *t)
 
        session_connections.push_back (session->tempo_map().StateChanged.connect (mem_fun(*this, &Editor::tempo_map_changed)));
 
-       session->foreach_edit_group (mem_fun (*this, &Editor::add_edit_group));
+       edit_groups_changed ();
 
        edit_cursor_clock.set_session (session);
        selection_start_clock.set_session (session);
index 8b0d5cb28f6261d8ee1c7cb15355266fdbf0ae7b..f5cdcce900d389bc85af4d3c4fc62bbe289313b3 100644 (file)
@@ -1521,7 +1521,10 @@ class Editor : public PublicEditor
        gint edit_group_list_button_press_event (GdkEventButton* ev);
        void edit_group_selection_changed ();
        void fake_add_edit_group (ARDOUR::RouteGroup* group);
+       void fake_remove_edit_group (ARDOUR::RouteGroup* group);
        void add_edit_group (ARDOUR::RouteGroup* group);
+       void remove_selected_edit_group ();
+       void edit_groups_changed ();
        void group_flags_changed (void*, ARDOUR::RouteGroup*);
 
        Gtk::VBox           list_vpacker;
index b77594aabdc0772ea437fbca9648cfceee5d71da..49d6b13a0ffd193d934f3270ef6cbd6bb9decc07 100644 (file)
@@ -97,6 +97,31 @@ Editor::new_edit_group ()
        }
 }
 
+void
+Editor::remove_selected_edit_group ()
+{
+       Glib::RefPtr<TreeSelection> selection = edit_group_display.get_selection();
+       TreeView::Selection::ListHandle_Path rows = selection->get_selected_rows ();
+
+       if (rows.empty()) {
+               return;
+       }
+
+       TreeView::Selection::ListHandle_Path::iterator i = rows.begin();
+       TreeIter iter;
+       
+       /* selection mode is single, so rows.begin() is it */
+
+       if ((iter = group_model->get_iter (*i))) {
+
+               RouteGroup* rg = (*iter)[group_columns.routegroup];
+
+               if (rg) {
+                       session->remove_edit_group (*rg);
+               }
+       }
+}
+
 void
 Editor::edit_group_list_button_clicked ()
 {
@@ -203,6 +228,29 @@ Editor::add_edit_group (RouteGroup* group)
        group->FlagsChanged.connect (bind (mem_fun(*this, &Editor::group_flags_changed), group));
 }
 
+void
+Editor::edit_groups_changed ()
+{
+       ENSURE_GUI_THREAD (mem_fun (*this, &Editor::edit_groups_changed));
+
+       /* just rebuild the while thing */
+
+       edit_group_display.set_model (Glib::RefPtr<TreeModel>(0));
+       group_model->clear ();
+
+       {
+               TreeModel::Row row;
+               row = *(group_model->append());
+               row[group_columns.is_active] = false;
+               row[group_columns.is_visible] = true;
+               row[group_columns.text] = (_("-all-"));
+               row[group_columns.routegroup] = 0;
+       }
+
+       session->foreach_edit_group (mem_fun (*this, &Editor::add_edit_group));
+       edit_group_display.set_model (group_model);
+}
+
 void
 Editor::group_flags_changed (void* src, RouteGroup* group)
 {
index ffbf0580f9035a9311f02c9b1f83d1c638de07c1..79b67a544a8fe8422aade14f2ea8042112585c09 100644 (file)
@@ -177,7 +177,6 @@ Editor::hide_track_in_display (TimeAxisView& tv)
 {
        TreeModel::Children rows = route_display_model->children();
        TreeModel::Children::iterator i;
-       Glib::RefPtr<TreeSelection> selection = route_list_display.get_selection();
 
        for (i = rows.begin(); i != rows.end(); ++i) {
                if ((*i)[route_display_columns.tv] == &tv) { 
@@ -199,7 +198,6 @@ Editor::show_track_in_display (TimeAxisView& tv)
 {
        TreeModel::Children rows = route_display_model->children();
        TreeModel::Children::iterator i;
-       Glib::RefPtr<TreeSelection> selection = route_list_display.get_selection();
        
        for (i = rows.begin(); i != rows.end(); ++i) {
                if ((*i)[route_display_columns.tv] == &tv) { 
index 7afc84e74ac2571233a7249a7e2796c444c846bb..b6cc90c42c77f8e8b770e3a1d3bcda975f6a8105 100644 (file)
@@ -127,9 +127,11 @@ class Route : public IO
        bool phase_invert() const { return _phase_invert; }
        
        void       set_edit_group (RouteGroup *, void *);
+       void       drop_edit_group (void *);
        RouteGroup *edit_group () { return _edit_group; }
 
        void       set_mix_group (RouteGroup *, void *);
+       void       drop_mix_group (void *);
        RouteGroup *mix_group () { return _mix_group; }
 
        virtual void  set_meter_point (MeterPoint, void *src);
index ad523da9c7d49a8a6d027f78682acd83a34d2375..f5c55e184fcc90300d8f61ea18e893dee35c04ab 100644 (file)
@@ -69,9 +69,15 @@ class RouteGroup : public Stateful, public sigc::trackable {
 
     int remove (Route *);
 
+    void apply (void (Route::*func)(void *), void *src) {
+           for (list<Route *>::iterator i = routes.begin(); i != routes.end(); i++) {
+                   ((*i)->*func)(src);
+           }
+    }
+
     template<class T> void apply (void (Route::*func)(T, void *), T val, void *src) {
            for (list<Route *>::iterator i = routes.begin(); i != routes.end(); i++) {
-                   ((*i)->*func)(val, this);
+                   ((*i)->*func)(val, src);
            }
     }
 
index a47e070766742af0e37890b460a7f1b5b16792de..6756bbe992aee6b32db80c513f826df023def72c 100644 (file)
@@ -505,11 +505,16 @@ class Session : public sigc::trackable, public Stateful
        RouteGroup* add_edit_group (string);
        RouteGroup* add_mix_group (string);
 
+       void remove_edit_group (RouteGroup&);
+       void remove_mix_group (RouteGroup&);
+
        RouteGroup *mix_group_by_name (string);
        RouteGroup *edit_group_by_name (string);
 
        sigc::signal<void,RouteGroup*> edit_group_added;
        sigc::signal<void,RouteGroup*> mix_group_added;
+       sigc::signal<void> edit_group_removed;
+       sigc::signal<void> mix_group_removed;
 
        void foreach_edit_group (sigc::slot<void,RouteGroup*> sl) {
                for (list<RouteGroup *>::iterator i = edit_groups.begin(); i != edit_groups.end(); i++) {
index 7f7b56cc2bbea152ae3a13916b46b3d388e8177f..18ce52dd437a673812ebd37fca012a82004d8fc7 100644 (file)
@@ -1833,16 +1833,27 @@ void
 Route::set_edit_group (RouteGroup *eg, void *src)
 
 {
+       if (eg == _edit_group) {
+               return;
+       }
+
        if (_edit_group) {
                _edit_group->remove (this);
        }
 
-       if ((_edit_group = eg)) {
+       if ((_edit_group = eg) != 0) {
                _edit_group->add (this);
        }
 
        _session.set_dirty ();
+       edit_group_changed (src); /* EMIT SIGNAL */
+}
 
+void
+Route::drop_edit_group (void *src)
+{
+       _edit_group = 0;
+       _session.set_dirty ();
        edit_group_changed (src); /* EMIT SIGNAL */
 }
 
@@ -1850,16 +1861,27 @@ void
 Route::set_mix_group (RouteGroup *mg, void *src)
 
 {
+       if (mg == _mix_group) {
+               return;
+       }
+
        if (_mix_group) {
                _mix_group->remove (this);
        }
 
-       if ((_mix_group = mg)) {
+       if ((_mix_group = mg) != 0) {
                _mix_group->add (this);
        }
 
        _session.set_dirty ();
-       
+       mix_group_changed (src); /* EMIT SIGNAL */
+}
+
+void
+Route::drop_mix_group (void *src)
+{
+       _mix_group = 0;
+       _session.set_dirty ();
        mix_group_changed (src); /* EMIT SIGNAL */
 }
 
index acd6829e93f88ff50b774365f3c1a93511393e1d..731184e8d9af121bf225faeffc31f2d843d20edd 100644 (file)
@@ -2415,6 +2415,34 @@ Session::add_mix_group (string name)
        return rg;
 }
 
+void
+Session::remove_edit_group (RouteGroup& rg)
+{
+       list<RouteGroup*>::iterator i;
+
+       if ((i = find (edit_groups.begin(), edit_groups.end(), &rg)) != edit_groups.end()) {
+               (*i)->apply (&Route::drop_edit_group, this);
+               edit_groups.erase (i);
+               edit_group_removed (); /* EMIT SIGNAL */
+       }
+
+       delete &rg;
+}
+
+void
+Session::remove_mix_group (RouteGroup& rg)
+{
+       list<RouteGroup*>::iterator i;
+
+       if ((i = find (mix_groups.begin(), mix_groups.end(), &rg)) != mix_groups.end()) {
+               (*i)->apply (&Route::drop_mix_group, this);
+               mix_groups.erase (i);
+               mix_group_removed (); /* EMIT SIGNAL */
+       }
+
+       delete &rg;
+}
+
 RouteGroup *
 Session::mix_group_by_name (string name)
 {