cleanup up cleanup at session destruction; clarify the meaning of 3 signals (DropRefe...
[ardour.git] / gtk2_ardour / editor_selection_list.cc
index 959da1ad2d740e4a335d60d7a5290d45d978b05e..62b04d8efa231a49b355ef3533f67b16863392f9 100644 (file)
@@ -1,5 +1,5 @@
 /*
-    Copyright (C) 2000 Paul Davis 
+    Copyright (C) 2000 Paul Davis
 
     This program is free software; you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
@@ -15,7 +15,6 @@
     along with this program; if not, write to the Free Software
     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
-    $Id$
 */
 
 #include <cstdlib>
 
 #include <gtkmm.h>
 
-#include <ardour/named_selection.h>
-#include <ardour/session_selection.h>
-#include <ardour/playlist.h>
+#include "ardour/named_selection.h"
+#include "ardour/session_selection.h"
+#include "ardour/playlist.h"
 
 #include <gtkmm2ext/stop_signal.h>
 
 #include "editor.h"
+#include "keyboard.h"
 #include "selection.h"
 #include "time_axis_view.h"
 #include "ardour_ui.h"
@@ -38,7 +38,7 @@
 
 #include "i18n.h"
 
-using namespace sigc;
+using namespace std;
 using namespace ARDOUR;
 using namespace PBD;
 using namespace Gtk;
@@ -47,15 +47,15 @@ using namespace Gtkmm2ext;
 void
 Editor::handle_new_named_selection ()
 {
-       ARDOUR_UI::instance()->call_slot (mem_fun(*this, &Editor::redisplay_named_selections));
+       ARDOUR_UI::instance()->call_slot (boost::bind (&Editor::redisplay_named_selections, this));
 }
 
 void
-Editor::add_named_selection_to_named_selection_display (NamedSelection& selection)
+Editor::add_named_selection_to_named_selection_display (boost::shared_ptr<NamedSelection> selection)
 {
         TreeModel::Row row = *(named_selection_model->append());
        row[named_selection_columns.text] = selection.name;
-       row[named_selection_columns.selection] = &selection;
+       row[named_selection_columns.selection] = selection;
 }
 
 void
@@ -65,10 +65,48 @@ Editor::redisplay_named_selections ()
        session->foreach_named_selection (*this, &Editor::add_named_selection_to_named_selection_display);
 }
 
-gint
-Editor::named_selection_display_button_press (GdkEventButton *ev)
+bool
+Editor::named_selection_display_key_release (GdkEventKey* ev)
 {
+       if (session == 0) {
+               return true;
+       }
+
+       switch (ev->keyval) {
+       case GDK_Delete:
+               remove_selected_named_selections ();
+               return true;
+               break;
+       default:
+               return false;
+               break;
+       }
+
+}
+
+void
+Editor::remove_selected_named_selections ()
+{
+       Glib::RefPtr<TreeSelection> selection = named_selection_display.get_selection();
+       TreeView::Selection::ListHandle_Path rows = selection->get_selected_rows ();
+
+       if (selection->count_selected_rows() == 0) {
+               return;
+       }
+
+       for (TreeView::Selection::ListHandle_Path::iterator i = rows.begin(); i != rows.end(); ++i) {
+
+               TreeIter iter;
 
+               if ((iter = named_selection_model->get_iter (*i))) {
+                       session->remove_named_selection ((*iter)[named_selection_columns.selection]);
+               }
+       }
+}
+
+bool
+Editor::named_selection_display_button_release (GdkEventButton *ev)
+{
        TreeModel::Children rows = named_selection_model->children();
        TreeModel::Children::iterator i;
        Glib::RefPtr<TreeSelection> selection = named_selection_display.get_selection();
@@ -79,7 +117,7 @@ Editor::named_selection_display_button_press (GdkEventButton *ev)
                        case 1:
                                if (Keyboard::is_delete_event (ev)) {
                                        session->remove_named_selection ((*i)[named_selection_columns.selection]);
-                                       return stop_signal (named_selection_display, "button_press_event");
+                                       return true;
                                }
                                break;
                        case 2:
@@ -91,7 +129,8 @@ Editor::named_selection_display_button_press (GdkEventButton *ev)
                        }
                }
        }
-       return FALSE;
+
+       return false;
 }
 
 
@@ -101,37 +140,10 @@ Editor::named_selection_display_selection_changed ()
 }
 
 void
-Editor::name_selection ()
+Editor::create_named_selection ()
 {
-       ArdourPrompter p;
-
-       p.set_prompt (_("Name for Chunk:"));
-       p.add_button (Gtk::Stock::NEW, Gtk::RESPONSE_ACCEPT);
-       p.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false);
-       p.change_labels (_("Create Chunk"), _("Forget it"));
-       p.show_all ();
-
-       switch (p.run ()) {
-       case Gtk::RESPONSE_ACCEPT:
-         string name;
-               p.get_result (name);
-               if (name.length()) {
-                 create_named_selection (name);
-               }       
-               break;
-       }
+       string name;
 
-}
-
-void
-Editor::named_selection_name_chosen ()
-{
-       Gtk::Main::quit ();
-}
-
-void
-Editor::create_named_selection (const string & name)
-{
        if (session == 0) {
                return;
        }
@@ -142,7 +154,6 @@ Editor::create_named_selection (const string & name)
                return;
        }
 
-       
        TrackViewList *views = get_valid_views (selection->time.track, selection->time.group);
 
        if (views->empty()) {
@@ -150,32 +161,50 @@ Editor::create_named_selection (const string & name)
                return;
        }
 
-       Playlist*       what_we_found;
-       list<Playlist*> thelist;
+       boost::shared_ptr<Playlist>        what_we_found;
+       list<boost::shared_ptr<Playlist> > thelist;
 
        for (TrackViewList::iterator i = views->begin(); i != views->end(); ++i) {
-               
-               Playlist *pl = (*i)->playlist();
-               
-               if (pl) {
-                       
-                       if ((what_we_found = pl->copy (selection->time, false)) != 0) {
 
-                               thelist.push_back (what_we_found);
-                       }
+               boost::shared_ptr<Playlist> pl = (*i)->playlist();
+
+               if (pl && (what_we_found = pl->copy (selection->time, false)) != 0) {
+                       thelist.push_back (what_we_found);
                }
        }
 
-       NamedSelection* ns;
-       TreeModel::Row row = *(named_selection_model->append());
+       if (!thelist.empty()) {
 
-       ns = new NamedSelection (name, thelist);
-       row[named_selection_columns.selection] = ns;
-       row[named_selection_columns.text] = name;
+               ArdourPrompter p;
 
-       /* make the one we just added be selected */
+               p.set_prompt (_("Name for Chunk:"));
+               p.add_button (Gtk::Stock::NEW, Gtk::RESPONSE_ACCEPT);
+               p.set_response_sensitive (Gtk::RESPONSE_ACCEPT, false);
+               p.change_labels (_("Create Chunk"), _("Forget it"));
+               p.show_all ();
 
-       named_selection_display.get_selection()->select (row);
+               switch (p.run ()) {
 
+               case Gtk::RESPONSE_ACCEPT:
+                       p.get_result (name);
+                       if (name.empty()) {
+                               return;
+                       }
+                       break;
+               default:
+                       return;
+               }
+
+               boost::shared_ptr<NamedSelection> ns (new NamedSelection (name, thelist));
+               
+               /* make the one we just added be selected */
+
+               TreeModel::Children::iterator added = named_selection_model->children().end();
+               --added;
+               named_selection_display.get_selection()->select (*added);
+
+       } else {
+               error << _("No selectable material found in the currently selected time range") << endmsg;
+       }
 }