summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gtk2_ardour/editor_mouse.cc4
-rw-r--r--gtk2_ardour/midi_region_view.cc134
-rw-r--r--gtk2_ardour/midi_region_view.h29
-rw-r--r--gtk2_ardour/selection.cc21
-rw-r--r--gtk2_ardour/selection.h2
5 files changed, 73 insertions, 117 deletions
diff --git a/gtk2_ardour/editor_mouse.cc b/gtk2_ardour/editor_mouse.cc
index 7740cb9b17..a7b7059a12 100644
--- a/gtk2_ardour/editor_mouse.cc
+++ b/gtk2_ardour/editor_mouse.cc
@@ -333,12 +333,12 @@ Editor::update_time_selection_display ()
switch (mouse_mode) {
case MouseRange:
selection->clear_objects ();
- selection->ClearMidiNoteSelection (); /* EMIT SIGNAL */
+ selection->clear_midi_notes ();
break;
case MouseObject:
selection->clear_time ();
selection->clear_tracks ();
- selection->ClearMidiNoteSelection (); /* EMIT SIGNAL */
+ selection->clear_midi_notes ();
break;
case MouseDraw:
/* Clear regions, but not time or tracks, since that
diff --git a/gtk2_ardour/midi_region_view.cc b/gtk2_ardour/midi_region_view.cc
index e9e4258b81..c62686170a 100644
--- a/gtk2_ardour/midi_region_view.cc
+++ b/gtk2_ardour/midi_region_view.cc
@@ -90,8 +90,6 @@ using namespace Editing;
using namespace std;
using Gtkmm2ext::Keyboard;
-PBD::Signal1<void, MidiRegionView *> MidiRegionView::SelectionCleared;
-
#define MIDI_BP_ZERO ((Config->get_first_midi_bank_is_zero())?0:1)
MidiRegionView::MidiRegionView (ArdourCanvas::Container* parent,
@@ -134,11 +132,6 @@ MidiRegionView::MidiRegionView (ArdourCanvas::Container* parent,
Config->ParameterChanged.connect (*this, invalidator (*this), boost::bind (&MidiRegionView::parameter_changed, this, _1), gui_context());
connect_to_diskstream ();
-
- SelectionCleared.connect (_selection_cleared_connection, invalidator (*this), boost::bind (&MidiRegionView::selection_cleared, this, _1), gui_context ());
-
- PublicEditor& editor (trackview.editor());
- editor.get_selection().ClearMidiNoteSelection.connect (_clear_midi_selection_connection, invalidator (*this), boost::bind (&MidiRegionView::clear_midi_selection, this), gui_context ());
}
MidiRegionView::MidiRegionView (ArdourCanvas::Container* parent,
@@ -183,11 +176,6 @@ MidiRegionView::MidiRegionView (ArdourCanvas::Container* parent,
PublicEditor::DropDownKeys.connect (sigc::mem_fun (*this, &MidiRegionView::drop_down_keys));
connect_to_diskstream ();
-
- SelectionCleared.connect (_selection_cleared_connection, invalidator (*this), boost::bind (&MidiRegionView::selection_cleared, this, _1), gui_context ());
-
- PublicEditor& editor (trackview.editor());
- editor.get_selection().ClearMidiNoteSelection.connect (_clear_midi_selection_connection, invalidator (*this), boost::bind (&MidiRegionView::clear_midi_selection, this), gui_context ());
}
void
@@ -320,11 +308,6 @@ MidiRegionView::init (bool wfd)
Config->ParameterChanged.connect (*this, invalidator (*this), boost::bind (&MidiRegionView::parameter_changed, this, _1), gui_context());
connect_to_diskstream ();
-
- SelectionCleared.connect (_selection_cleared_connection, invalidator (*this), boost::bind (&MidiRegionView::selection_cleared, this, _1), gui_context ());
-
- PublicEditor& editor (trackview.editor());
- editor.get_selection().ClearMidiNoteSelection.connect (_clear_midi_selection_connection, invalidator (*this), boost::bind (&MidiRegionView::clear_midi_selection, this), gui_context ());
}
InstrumentInfo&
@@ -554,7 +537,7 @@ MidiRegionView::button_release (GdkEventButton* ev)
switch (editor.current_mouse_mode()) {
case MouseRange:
/* no motion occured - simple click */
- clear_selection ();
+ clear_editor_note_selection ();
_mouse_changed_selection = true;
break;
@@ -574,7 +557,7 @@ MidiRegionView::button_release (GdkEventButton* ev)
Evoral::Beats beats = get_grid_beats(editor.pixel_to_sample(event_x));
create_note_at (editor.pixel_to_sample (event_x), event_y, beats, true);
} else {
- clear_selection ();
+ clear_editor_note_selection ();
}
break;
@@ -669,7 +652,7 @@ MidiRegionView::motion (GdkEventMotion* ev)
} else if (m == MouseContent) {
editor.drags()->set (new MidiRubberbandSelectDrag (dynamic_cast<Editor *> (&editor), this), (GdkEvent *) ev);
if (!Keyboard::modifier_state_equals (ev->state, Keyboard::TertiaryModifier)) {
- clear_selection ();
+ clear_editor_note_selection ();
_mouse_changed_selection = true;
}
_mouse_state = SelectRectDragging;
@@ -752,7 +735,7 @@ MidiRegionView::key_press (GdkEventKey* ev)
return true;
} else if (ev->keyval == GDK_Escape && unmodified) {
- clear_selection();
+ clear_editor_note_selection ();
_mouse_state = None;
} else if (ev->keyval == GDK_comma || ev->keyval == GDK_period) {
@@ -970,7 +953,7 @@ MidiRegionView::create_note_at (framepos_t t, double y, Evoral::Beats length, bo
start_note_diff_command(_("add note"));
- clear_selection ();
+ clear_editor_note_selection ();
note_diff_add_note (new_note, true, false);
apply_diff();
@@ -979,9 +962,10 @@ MidiRegionView::create_note_at (framepos_t t, double y, Evoral::Beats length, bo
}
void
-MidiRegionView::clear_events (bool with_selection_signal)
+MidiRegionView::clear_events ()
{
- clear_selection (with_selection_signal);
+ // clear selection without signaling
+ clear_selection_internal ();
MidiGhostRegion* gr;
for (std::vector<GhostRegion*>::iterator g = ghosts.begin(); g != ghosts.end(); ++g) {
@@ -1008,7 +992,7 @@ MidiRegionView::display_model(boost::shared_ptr<MidiModel> model)
content_connection.disconnect ();
_model->ContentsChanged.connect (content_connection, invalidator (*this), boost::bind (&MidiRegionView::redisplay_model, this), gui_context());
/* Don't signal as nobody else needs to know until selection has been altered. */
- clear_events (false);
+ clear_events ();
if (_enable_display) {
redisplay_model();
@@ -1110,7 +1094,7 @@ MidiRegionView::abort_command()
{
delete _note_diff_command;
_note_diff_command = 0;
- clear_selection();
+ clear_editor_note_selection();
}
NoteBase*
@@ -1405,10 +1389,8 @@ MidiRegionView::~MidiRegionView ()
end_write();
}
- _selection_cleared_connection.disconnect ();
-
_selection.clear();
- clear_events (false);
+ clear_events ();
delete _note_group;
delete _note_diff_command;
@@ -1898,7 +1880,7 @@ MidiRegionView::step_add_note (uint8_t channel, uint8_t number, uint8_t velocity
start_note_diff_command (_("step add"));
- clear_selection ();
+ clear_editor_note_selection ();
note_diff_add_note (new_note, true, false);
apply_diff();
@@ -2148,65 +2130,50 @@ MidiRegionView::delete_note (boost::shared_ptr<NoteType> n)
}
void
-MidiRegionView::clear_selection_except (NoteBase* ev, bool signal)
+MidiRegionView::clear_editor_note_selection ()
{
- for (Selection::iterator i = _selection.begin(); i != _selection.end(); ) {
- if ((*i) != ev) {
- Selection::iterator tmp = i;
- ++tmp;
+ DEBUG_TRACE(DEBUG::Selection, "MRV::clear_editor_note_selection\n");
+ PublicEditor& editor(trackview.editor());
+ editor.get_selection().clear_midi_notes();
+}
- (*i)->set_selected (false);
- (*i)->hide_velocity ();
- _selection.erase (i);
+void
+MidiRegionView::clear_selection ()
+{
+ clear_selection_internal();
+ PublicEditor& editor(trackview.editor());
+ editor.get_selection().remove(this);
+}
- i = tmp;
- } else {
- ++i;
- }
+void
+MidiRegionView::clear_selection_internal ()
+{
+ DEBUG_TRACE(DEBUG::Selection, "MRV::clear_selection_internal\n");
+
+ for (Selection::iterator i = _selection.begin(); i != _selection.end(); ++i) {
+ (*i)->set_selected(false);
+ (*i)->hide_velocity();
}
+ _selection.clear();
- if (!ev && _entered) {
+ if (_entered) {
// Clearing selection entirely, ungrab keyboard
Keyboard::magic_widget_drop_focus();
_grabbed_keyboard = false;
}
-
- /* this does not change the status of this regionview w.r.t the editor
- selection.
- */
-
- if (signal) {
- SelectionCleared (this); /* EMIT SIGNAL */
- }
}
void
MidiRegionView::unique_select(NoteBase* ev)
{
- const bool selection_was_empty = _selection.empty();
-
- clear_selection_except (ev);
-
- /* don't bother with checking to see if we should remove this
- regionview from the editor selection, since we're about to add
- another note, and thus put/keep this regionview in the editor
- selection anyway.
- */
-
- if (!ev->selected()) {
- add_to_selection (ev);
- if (selection_was_empty && _entered) {
- // Grab keyboard for moving notes with arrow keys
- Keyboard::magic_widget_grab_focus();
- _grabbed_keyboard = true;
- }
- }
+ clear_editor_note_selection();
+ add_to_selection(ev);
}
void
MidiRegionView::select_all_notes ()
{
- clear_selection ();
+ clear_editor_note_selection ();
for (Events::iterator i = _events.begin(); i != _events.end(); ++i) {
add_to_selection (*i);
@@ -2216,7 +2183,7 @@ MidiRegionView::select_all_notes ()
void
MidiRegionView::select_range (framepos_t start, framepos_t end)
{
- clear_selection ();
+ clear_editor_note_selection ();
for (Events::iterator i = _events.begin(); i != _events.end(); ++i) {
framepos_t t = source_beats_to_absolute_frames((*i)->note()->time());
@@ -2281,7 +2248,7 @@ MidiRegionView::select_matching_notes (uint8_t notenum, uint16_t channel_mask, b
}
if (!add) {
- clear_selection ();
+ clear_editor_note_selection ();
if (!extend && (low_note == high_note) && (high_note == notenum)) {
/* only note previously selected is the one we are
@@ -2356,11 +2323,8 @@ void
MidiRegionView::note_selected (NoteBase* ev, bool add, bool extend)
{
if (!add) {
- clear_selection_except (ev);
- if (!_selection.empty()) {
- PublicEditor& editor (trackview.editor());
- editor.get_selection().add (this);
- }
+ clear_editor_note_selection();
+ add_to_selection (ev);
}
if (!extend) {
@@ -3574,7 +3538,7 @@ MidiRegionView::paste_internal (framepos_t pos, unsigned paste_count, float time
duration, pos, _region->position(),
pos_beats));
- clear_selection ();
+ clear_editor_note_selection ();
for (int n = 0; n < (int) times; ++n) {
@@ -4123,20 +4087,6 @@ MidiRegionView::snap_frame_to_grid_underneath (framepos_t p, framecnt_t& grid_fr
return snap_frame_to_frame (p);
}
-/** Called when the selection has been cleared in any MidiRegionView.
- * @param rv MidiRegionView that the selection was cleared in.
- */
-void
-MidiRegionView::selection_cleared (MidiRegionView* rv)
-{
- if (rv == this) {
- return;
- }
-
- /* Clear our selection in sympathy; but don't signal the fact */
- clear_selection (false);
-}
-
ChannelMode
MidiRegionView::get_channel_mode () const
{
diff --git a/gtk2_ardour/midi_region_view.h b/gtk2_ardour/midi_region_view.h
index eb23a8873b..5733861d87 100644
--- a/gtk2_ardour/midi_region_view.h
+++ b/gtk2_ardour/midi_region_view.h
@@ -328,9 +328,12 @@ public:
*/
void create_note_at (framepos_t t, double y, Evoral::Beats length, bool snap_t);
- void clear_selection (bool signal = true) { clear_selection_except (0, signal); }
+ /** An external request to clear the note selection, remove MRV from editor
+ * selection.
+ */
+ void clear_selection ();
- ARDOUR::InstrumentInfo& instrument_info() const;
+ ARDOUR::InstrumentInfo& instrument_info() const;
void note_deleted (NoteBase*);
@@ -349,19 +352,6 @@ private:
friend class MidiRubberbandSelectDrag;
friend class MidiVerticalSelectDrag;
- /** Emitted when the selection has been cleared in one MidiRegionView,
- * with the expectation that others will clear their selections in
- * sympathy.
- */
- static PBD::Signal1<void, MidiRegionView*> SelectionCleared;
- PBD::ScopedConnection _selection_cleared_connection;
- void selection_cleared (MidiRegionView *);
-
- /** this handles the case when the "external" world wants us to clear our internal selections
- */
- PBD::ScopedConnection _clear_midi_selection_connection;
- void clear_midi_selection () { clear_selection(); }
-
friend class EditNoteDialog;
/** Play the NoteOn event of the given note immediately
@@ -371,7 +361,13 @@ private:
void start_playing_midi_note (boost::shared_ptr<NoteType> note);
void start_playing_midi_chord (std::vector<boost::shared_ptr<NoteType> > notes);
- void clear_events (bool with_selection_signal = true);
+ /** Clear the note selection of just this midi region
+ */
+ void clear_selection_internal ();
+
+ void clear_editor_note_selection ();
+
+ void clear_events ();
bool canvas_group_event(GdkEvent* ev);
bool note_canvas_event(GdkEvent* ev);
@@ -389,7 +385,6 @@ private:
void trim_note(NoteBase* ev, ARDOUR::MidiModel::TimeType start_delta,
ARDOUR::MidiModel::TimeType end_delta);
- void clear_selection_except (NoteBase* ev, bool signal = true);
void update_drag_selection (framepos_t start, framepos_t end, double y0, double y1, bool extend);
void update_vertical_drag_selection (double last_y, double y, bool extend);
diff --git a/gtk2_ardour/selection.cc b/gtk2_ardour/selection.cc
index baf424669f..c1a53bd00d 100644
--- a/gtk2_ardour/selection.cc
+++ b/gtk2_ardour/selection.cc
@@ -27,6 +27,7 @@
#include "ardour/rc_configuration.h"
#include "audio_region_view.h"
+#include "debug.h"
#include "gui_thread.h"
#include "midi_cut_buffer.h"
#include "region_gain_line.h"
@@ -177,9 +178,18 @@ Selection::clear_midi_notes ()
MidiNotesChanged ();
}
- /* The note selection is actually stored in MidiRegionView, emit signal to
- tell them to clear their selection. */
- ClearMidiNoteSelection(); /* EMIT SIGNAL */
+ // clear note selections for MRV's that have note selections
+ // this will cause the MRV to be removed from the list
+ for (MidiRegionSelection::iterator i = midi_regions.begin();
+ i != midi_regions.end();) {
+ MidiRegionSelection::iterator tmp = i;
+ ++tmp;
+ MidiRegionView* mrv = dynamic_cast<MidiRegionView*>(*i);
+ if (mrv) {
+ mrv->clear_selection();
+ }
+ i = tmp;
+ }
}
void
@@ -518,6 +528,8 @@ Selection::add (RegionView* r)
void
Selection::add (MidiRegionView* mrv)
{
+ DEBUG_TRACE(DEBUG::Selection, string_compose("Selection::add MRV %1\n", mrv));
+
clear_time(); //enforce object/range exclusivity
clear_tracks(); //enforce object/track exclusivity
@@ -719,6 +731,8 @@ Selection::remove (RegionView* r)
void
Selection::remove (MidiRegionView* mrv)
{
+ DEBUG_TRACE(DEBUG::Selection, string_compose("Selection::remove MRV %1\n", mrv));
+
MidiRegionSelection::iterator x;
if ((x = find (midi_regions.begin(), midi_regions.end(), mrv)) != midi_regions.end()) {
@@ -727,7 +741,6 @@ Selection::remove (MidiRegionView* mrv)
}
}
-
void
Selection::remove (uint32_t selection_id)
{
diff --git a/gtk2_ardour/selection.h b/gtk2_ardour/selection.h
index c28b42a443..586c2e8997 100644
--- a/gtk2_ardour/selection.h
+++ b/gtk2_ardour/selection.h
@@ -221,8 +221,6 @@ class Selection : public sigc::trackable, public PBD::ScopedConnectionList
XMLNode& get_state () const;
int set_state (XMLNode const &, int);
- PBD::Signal0<void> ClearMidiNoteSelection;
-
std::list<std::pair<PBD::ID const, std::list<boost::shared_ptr<Evoral::Note<Evoral::Beats> > > > > pending_midi_note_selection;
private: