only the last step-edited note remains selected after each note addition; waf install...
[ardour.git] / gtk2_ardour / editor_selection_list.cc
index d6681cf5a5c407177f42936263c021ae51add776..73ceb59c377544b86360947c5e3a94b417d4b000 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 <gtkmm2ext/stop_signal.h>
+#include "ardour/named_selection.h"
+#include "ardour/session_selection.h"
+#include "ardour/playlist.h"
 
 #include "editor.h"
+#include "keyboard.h"
 #include "selection.h"
 #include "time_axis_view.h"
 #include "ardour_ui.h"
 
 #include "i18n.h"
 
-using namespace sigc;
+using namespace std;
 using namespace ARDOUR;
+using namespace PBD;
 using namespace Gtk;
 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)
 {
-       const gchar *row[1];
-
-       row[0] = selection.name.c_str();
-       named_selection_display.rows().push_back (row);
-       named_selection_display.rows().back().set_data (&selection);
+        TreeModel::Row row = *(named_selection_model->append());
+       row[named_selection_columns.text] = selection.name;
+       row[named_selection_columns.selection] = selection;
 }
 
 void
 Editor::redisplay_named_selections ()
 {
-       named_selection_display.freeze ();
-       named_selection_display.clear ();
+       named_selection_model->clear ();
        session->foreach_named_selection (*this, &Editor::add_named_selection_to_named_selection_display);
-       named_selection_display.thaw ();
 }
 
-gint
-Editor::named_selection_display_button_press (GdkEventButton *ev)
+bool
+Editor::named_selection_display_key_release (GdkEventKey* ev)
 {
-       NamedSelection* named_selection;
-       gint row;
-       gint col;
-
-       switch (ev->button) {
-       case 1:
-               if (Keyboard::is_delete_event (ev)) {
-                       if (named_selection_display.get_selection_info ((int)ev->x, (int)ev->y, &row, &col) != 0) {
-                               if ((named_selection = reinterpret_cast<NamedSelection *> (named_selection_display.get_row_data (row))) != 0) {
-                                       session->remove_named_selection (named_selection);
-                                       return stop_signal (named_selection_display, "button_press_event");
-                               }
-                       }
-               } 
-               break;
-
-       case 2:
-               break;
+       if (session == 0) {
+               return true;
+       }
 
-       case 3:
+       switch (ev->keyval) {
+       case GDK_Delete:
+               remove_selected_named_selections ();
+               return true;
                break;
        default:
+               return false;
                break;
        }
-       return FALSE;
-}
-
 
-void
-Editor::named_selection_display_selected (gint row, gint col, GdkEvent *ev)
-{
 }
 
 void
-Editor::named_selection_display_unselected (gint row, gint col, GdkEvent *ev)
+Editor::remove_selected_named_selections ()
 {
-}
+       Glib::RefPtr<TreeSelection> selection = named_selection_display.get_selection();
+       TreeView::Selection::ListHandle_Path rows = selection->get_selected_rows ();
 
-void
-Editor::name_selection ()
-{
-       ArdourPrompter p;
+       if (selection->count_selected_rows() == 0) {
+               return;
+       }
 
-       p.set_prompt (_("name for chunk:"));
-       p.done.connect (mem_fun(*this, &Editor::named_selection_name_chosen));
-       p.change_labels (_("Create chunk"), _("Forget it"));
-       p.show_all ();
+       for (TreeView::Selection::ListHandle_Path::iterator i = rows.begin(); i != rows.end(); ++i) {
 
-       Gtk::Main::run ();
+               TreeIter iter;
 
-       if (p.status == Prompter::entered) {
-               string name;
-               p.get_result (name);
-               
-               if (name.length()){
-                       create_named_selection (name);
+               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();
+
+       for (i = rows.begin(); i != rows.end(); ++i) {
+               if (selection->is_selected (i)) {
+                       switch (ev->button) {
+                       case 1:
+                               if (Keyboard::is_delete_event (ev)) {
+                                       session->remove_named_selection ((*i)[named_selection_columns.selection]);
+                                       return true;
+                               }
+                               break;
+                       case 2:
+                               break;
+                       case 3:
+                               break;
+                       default:
+                               break;
+                       }
+               }
+       }
+
+       return false;
+}
+
+
 void
-Editor::named_selection_name_chosen ()
+Editor::named_selection_display_selection_changed ()
 {
-       Gtk::Main::quit ();
 }
 
 void
-Editor::create_named_selection (string name)
+Editor::create_named_selection ()
 {
+       string name;
+
        if (session == 0) {
                return;
        }
@@ -150,7 +152,6 @@ Editor::create_named_selection (string name)
                return;
        }
 
-       
        TrackViewList *views = get_valid_views (selection->time.track, selection->time.group);
 
        if (views->empty()) {
@@ -158,28 +159,50 @@ Editor::create_named_selection (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;
+       if (!thelist.empty()) {
+
+               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 ()) {
 
-       ns = new NamedSelection (name, thelist);
+               case Gtk::RESPONSE_ACCEPT:
+                       p.get_result (name);
+                       if (name.empty()) {
+                               return;
+                       }
+                       break;
+               default:
+                       return;
+               }
 
-       /* make the one we just added be selected */
+               boost::shared_ptr<NamedSelection> ns (new NamedSelection (name, thelist));
+               
+               /* make the one we just added be selected */
 
-       named_selection_display.rows().back().select ();
+               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;
+       }
 }