Update region names in the region list when they change, to fix #1584
authorCarl Hetherington <carl@carlh.net>
Sun, 4 Nov 2007 21:40:12 +0000 (21:40 +0000)
committerCarl Hetherington <carl@carlh.net>
Sun, 4 Nov 2007 21:40:12 +0000 (21:40 +0000)
git-svn-id: svn://localhost/ardour2/trunk@2587 d708f5d6-7413-0410-9779-e7cbd77b26cf

gtk2_ardour/editor.h
gtk2_ardour/editor_region_list.cc

index 4fc2bd0d1852b4b574562eba1548c0f65c2b7722..5f18d36e67aac44856f4d5c1dc9622292142bb4d 100644 (file)
@@ -789,11 +789,13 @@ class Editor : public PublicEditor
            
        RegionListDisplayModelColumns          region_list_columns;
        Gtkmm2ext::DnDTreeView<boost::shared_ptr<ARDOUR::Region> > region_list_display;
+       std::list<sigc::connection> region_state_changed_connections;
 
        Glib::RefPtr<Gtk::TreeStore>           region_list_model;
        Glib::RefPtr<Gtk::ToggleAction>        toggle_full_region_list_action;
        Glib::RefPtr<Gtk::ToggleAction>        toggle_show_auto_regions_action;
 
+       void region_list_region_changed (ARDOUR::Change, boost::weak_ptr<ARDOUR::Region>);
        void region_list_selection_changed ();
        bool region_list_selection_filter (const Glib::RefPtr<Gtk::TreeModel>& model, const Gtk::TreeModel::Path& path, bool yn);
 
index f1001cb8e44e478ce81663e4855f7cf7c84c42bf..3e47d26cd6b7e2e0cdbbc670ba568bfc7fd68eda 100644 (file)
@@ -89,6 +89,10 @@ Editor::add_region_to_region_display (boost::shared_ptr<Region> region)
        Gdk::Color c;
        bool missing_source;
 
+       region_state_changed_connections.push_back (
+               region->StateChanged.connect (bind (mem_fun (*this, &Editor::region_list_region_changed), boost::weak_ptr<Region> (region)))
+               );
+
        missing_source = boost::dynamic_pointer_cast<SilentFileSource>(region->source());
 
        if (!show_automatic_regions_in_region_list && region->automatic()) {
@@ -217,6 +221,44 @@ Editor::add_region_to_region_display (boost::shared_ptr<Region> region)
        }
 }
 
+
+void
+Editor::region_list_region_changed (Change what_changed, boost::weak_ptr<Region> region)
+{
+       ENSURE_GUI_THREAD (bind (mem_fun (*this, &Editor::region_list_region_changed), what_changed, region));
+       
+       boost::shared_ptr<Region> r = region.lock ();
+       
+       if (!r) {
+               return;
+       }
+       
+       if (what_changed & ARDOUR::NameChanged) {
+               /* find the region in our model and change its name */
+               TreeModel::Children rows = region_list_model->children ();
+               TreeModel::iterator i = rows.begin ();
+               while (i != rows.end ()) {
+                       TreeModel::Children children = (*i)->children ();
+                       TreeModel::iterator j = children.begin ();
+                       while (j != children.end()) {
+                               boost::shared_ptr<Region> c = (*j)[region_list_columns.region];
+                               if (c == r) {
+                                       break;
+                               }
+                               ++j;
+                       }
+
+                       if (j != children.end()) {
+                               (*j)[region_list_columns.name] = r->name ();
+                               break;
+                       }
+                       
+                       ++i;
+               }
+
+       }
+}
+
 void
 Editor::region_list_selection_changed() 
 {
@@ -267,6 +309,13 @@ Editor::redisplay_regions ()
 {
        if (session) {
 
+               for (std::list<connection>::iterator i = region_state_changed_connections.begin();
+                    i != region_state_changed_connections.end();
+                    ++i)
+               {
+                       i->disconnect ();
+               }
+
                region_list_display.set_model (Glib::RefPtr<Gtk::TreeStore>(0));
                region_list_model->clear ();