From 737f91174f6680277632b6914a30b4be3ac81ab7 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Tue, 31 Jan 2012 03:03:13 +0000 Subject: [PATCH] tidy up MIDI list editor; make delete/backspace actually delete notes, and make Primary-z and Primary-r do the undo thing git-svn-id: svn://localhost/ardour2/branches/3.0@11397 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/midi_list_editor.cc | 46 +++++++++++++++++++++++++++------ gtk2_ardour/midi_list_editor.h | 3 +++ 2 files changed, 41 insertions(+), 8 deletions(-) diff --git a/gtk2_ardour/midi_list_editor.cc b/gtk2_ardour/midi_list_editor.cc index 879b1a9f2f..326f4e1680 100644 --- a/gtk2_ardour/midi_list_editor.cc +++ b/gtk2_ardour/midi_list_editor.cc @@ -28,6 +28,9 @@ #include "ardour/session.h" #include "ardour/tempo.h" +#include "gtkmm2ext/gui_thread.h" +#include "gtkmm2ext/keyboard.h" + #include "midi_list_editor.h" #include "i18n.h" @@ -63,8 +66,8 @@ MidiListEditor::MidiListEditor (Session* s, boost::shared_ptr r) view.append_column (_("Length"), columns.length); view.append_column (_("End"), columns.end); view.set_headers_visible (true); - view.set_name (X_("MidiListView")); view.set_rules_hint (true); + view.get_selection()->set_mode (SELECTION_MULTIPLE); for (int i = 0; i < 6; ++i) { CellRendererText* renderer = dynamic_cast(view.get_column_cell_renderer (i)); @@ -80,11 +83,14 @@ MidiListEditor::MidiListEditor (Session* s, boost::shared_ptr r) redisplay_model (); + region->midi_source(0)->model()->ContentsChanged.connect (content_connection, invalidator (*this), + boost::bind (&MidiListEditor::redisplay_model, this), gui_context()); + view.show (); scroller.show (); add (scroller); - set_size_request (400, 400); + set_size_request (-1, 400); } MidiListEditor::~MidiListEditor () @@ -111,6 +117,7 @@ MidiListEditor::key_press (GdkEventKey* ev) break; case GDK_Escape: break; + } } @@ -124,9 +131,22 @@ MidiListEditor::key_release (GdkEventKey* ev) switch (ev->keyval) { case GDK_Delete: + case GDK_BackSpace: delete_selected_note (); ret = true; break; + case GDK_z: + if (_session && Gtkmm2ext::Keyboard::modifier_state_contains (ev->state, Gtkmm2ext::Keyboard::PrimaryModifier)) { + _session->undo (1); + } + break; + + case GDK_r: + if (_session && Gtkmm2ext::Keyboard::modifier_state_contains (ev->state, Gtkmm2ext::Keyboard::PrimaryModifier)) { + _session->redo (1); + } + break; + default: break; } @@ -144,16 +164,26 @@ MidiListEditor::delete_selected_note () return; } - TreeView::Selection::ListHandle_Path::iterator i = rows.begin(); - TreeIter iter; + typedef vector > Notes; + Notes to_delete; - /* selection mode is single, so rows.begin() is it */ + for (TreeView::Selection::ListHandle_Path::iterator i = rows.begin(); i != rows.end(); ++i) { + TreeIter iter; - if ((iter = model->get_iter (*i))) { - boost::shared_ptr note = (*iter)[columns._note]; - cerr << "Would have deleted " << *note << endl; + if ((iter = model->get_iter (*i))) { + boost::shared_ptr note = (*iter)[columns._note]; + to_delete.push_back (note); + } } + boost::shared_ptr m (region->midi_source(0)->model()); + MidiModel::NoteDiffCommand* cmd = m->new_note_diff_command (_("delete notes (from list)")); + + for (Notes::iterator i = to_delete.begin(); i != to_delete.end(); ++i) { + cmd->remove (*i); + } + + m->apply_command (*_session, cmd); } void diff --git a/gtk2_ardour/midi_list_editor.h b/gtk2_ardour/midi_list_editor.h index c85eeafc51..20ffd39fee 100644 --- a/gtk2_ardour/midi_list_editor.h +++ b/gtk2_ardour/midi_list_editor.h @@ -77,6 +77,9 @@ class MidiListEditor : public ArdourWindow boost::shared_ptr region; + /** connection used to connect to model's ContentChanged signal */ + PBD::ScopedConnection content_connection; + void edited (const std::string&, const std::string&); void editing_started (Gtk::CellEditable*, const std::string& path, int); void editing_canceled ();