summaryrefslogtreecommitdiff
path: root/gtk2_ardour
diff options
context:
space:
mode:
Diffstat (limited to 'gtk2_ardour')
-rw-r--r--gtk2_ardour/editor_canvas.cc1
-rw-r--r--gtk2_ardour/midi_region_view.cc64
-rw-r--r--gtk2_ardour/midi_region_view.h4
-rw-r--r--gtk2_ardour/midi_time_axis.h2
-rw-r--r--gtk2_ardour/public_editor.cc2
-rw-r--r--gtk2_ardour/public_editor.h2
6 files changed, 73 insertions, 2 deletions
diff --git a/gtk2_ardour/editor_canvas.cc b/gtk2_ardour/editor_canvas.cc
index b072a2779e..2b5e016378 100644
--- a/gtk2_ardour/editor_canvas.cc
+++ b/gtk2_ardour/editor_canvas.cc
@@ -750,6 +750,7 @@ Editor::stop_canvas_autoscroll ()
bool
Editor::left_track_canvas (GdkEventCrossing */*ev*/)
{
+ DropDownKeys ();
set_entered_track (0);
set_entered_regionview (0);
reset_canvas_action_sensitivity (false);
diff --git a/gtk2_ardour/midi_region_view.cc b/gtk2_ardour/midi_region_view.cc
index 3232ca4072..53948ef366 100644
--- a/gtk2_ardour/midi_region_view.cc
+++ b/gtk2_ardour/midi_region_view.cc
@@ -95,6 +95,7 @@ MidiRegionView::MidiRegionView (ArdourCanvas::Group *parent, RouteTimeAxisView &
, no_sound_notes (false)
{
_note_group->raise_to_top();
+ PublicEditor::DropDownKeys.connect (sigc::mem_fun (*this, &MidiRegionView::drop_down_keys));
}
MidiRegionView::MidiRegionView (ArdourCanvas::Group *parent, RouteTimeAxisView &tv,
@@ -119,9 +120,9 @@ MidiRegionView::MidiRegionView (ArdourCanvas::Group *parent, RouteTimeAxisView &
, no_sound_notes (false)
{
_note_group->raise_to_top();
+ PublicEditor::DropDownKeys.connect (sigc::mem_fun (*this, &MidiRegionView::drop_down_keys));
}
-
MidiRegionView::MidiRegionView (const MidiRegionView& other)
: sigc::trackable(other)
, RegionView (other)
@@ -182,6 +183,8 @@ MidiRegionView::MidiRegionView (const MidiRegionView& other, boost::shared_ptr<M
void
MidiRegionView::init (Gdk::Color const & basic_color, bool wfd)
{
+ PublicEditor::DropDownKeys.connect (sigc::mem_fun (*this, &MidiRegionView::drop_down_keys));
+
CanvasNoteEvent::CanvasNoteEventDeleted.connect (note_delete_connection, MISSING_INVALIDATOR,
ui_bind (&MidiRegionView::maybe_remove_deleted_note_from_selection, this, _1),
gui_context());
@@ -338,7 +341,9 @@ MidiRegionView::button_release (GdkEventButton* ev)
case MouseObject:
case MouseTimeFX:
clear_selection();
+ maybe_select_by_position (ev, event_x, event_y);
break;
+
case MouseRange:
{
bool success;
@@ -883,6 +888,20 @@ MidiRegionView::find_canvas_note (boost::shared_ptr<NoteType> note)
}
void
+MidiRegionView::get_events (Events& e, Evoral::Sequence<Evoral::MusicalTime>::NoteOperator op, uint8_t val, int chan_mask)
+{
+ MidiModel::Notes notes;
+ _model->get_notes (notes, op, val, chan_mask);
+
+ for (MidiModel::Notes::iterator n = notes.begin(); n != notes.end(); ++n) {
+ CanvasNoteEvent* cne = find_canvas_note (*n);
+ if (cne) {
+ e.push_back (cne);
+ }
+ }
+}
+
+void
MidiRegionView::redisplay_model()
{
// Don't redisplay the model if we're currently recording and displaying that
@@ -1716,7 +1735,7 @@ MidiRegionView::select_matching_notes (uint8_t notenum, uint16_t channel_mask, b
CanvasNoteEvent* cne;
bool select = false;
- if (((0x0001 << note->channel()) & channel_mask) != 0) {
+ if (((1 << note->channel()) & channel_mask) != 0) {
if (extend) {
if ((note->note() >= low_note && note->note() <= high_note)) {
select = true;
@@ -2848,3 +2867,44 @@ MidiRegionView::show_verbose_canvas_cursor (boost::shared_ptr<NoteType> n) const
snprintf (buf, sizeof (buf), "%s (%d)", Evoral::midi_note_name (n->note()).c_str(), (int) n->note ());
trackview.editor().show_verbose_canvas_cursor_with (buf);
}
+
+void
+MidiRegionView::drop_down_keys ()
+{
+ _mouse_state = None;
+}
+
+void
+MidiRegionView::maybe_select_by_position (GdkEventButton* ev, double x, double y)
+{
+ double note = midi_stream_view()->y_to_note(y);
+ Events e;
+ MidiTimeAxisView* const mtv = dynamic_cast<MidiTimeAxisView*>(&trackview);
+
+ uint16_t chn_mask = mtv->channel_selector().get_selected_channels();
+
+ if (Keyboard::modifier_state_equals (ev->state, Keyboard::TertiaryModifier)) {
+ get_events (e, Evoral::Sequence<Evoral::MusicalTime>::PitchGreaterThanOrEqual, (uint8_t) floor (note), chn_mask);
+ } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) {
+ get_events (e, Evoral::Sequence<Evoral::MusicalTime>::PitchLessThanOrEqual, (uint8_t) floor (note), chn_mask);
+ } else {
+ return;
+ }
+
+ bool add_mrv_selection = false;
+
+ if (_selection.empty()) {
+ add_mrv_selection = true;
+ }
+
+ for (Events::iterator i = e.begin(); i != e.end(); ++i) {
+ if (_selection.insert (*i).second) {
+ (*i)->selected (true);
+ }
+ }
+
+ if (add_mrv_selection) {
+ PublicEditor& editor (trackview.editor());
+ editor.get_selection().add (this);
+ }
+}
diff --git a/gtk2_ardour/midi_region_view.h b/gtk2_ardour/midi_region_view.h
index f823de2e9a..cb360159d9 100644
--- a/gtk2_ardour/midi_region_view.h
+++ b/gtk2_ardour/midi_region_view.h
@@ -430,6 +430,10 @@ class MidiRegionView : public RegionView
bool button_release (GdkEventButton*);
bool enter_notify (GdkEventCrossing*);
bool leave_notify (GdkEventCrossing*);
+
+ void drop_down_keys ();
+ void maybe_select_by_position (GdkEventButton* ev, double x, double y);
+ void get_events (Events& e, Evoral::Sequence<Evoral::MusicalTime>::NoteOperator op, uint8_t val, int chan_mask = 0);
};
diff --git a/gtk2_ardour/midi_time_axis.h b/gtk2_ardour/midi_time_axis.h
index e965e09403..aeb7ff150e 100644
--- a/gtk2_ardour/midi_time_axis.h
+++ b/gtk2_ardour/midi_time_axis.h
@@ -91,6 +91,8 @@ class MidiTimeAxisView : public RouteTimeAxisView
void check_step_edit ();
void step_edit_rest ();
+ const MidiMultipleChannelSelector& channel_selector() { return _channel_selector; }
+
private:
sigc::signal<void, std::string, std::string> _midi_patch_settings_changed;
diff --git a/gtk2_ardour/public_editor.cc b/gtk2_ardour/public_editor.cc
index 3955083c70..1b8b5c4801 100644
--- a/gtk2_ardour/public_editor.cc
+++ b/gtk2_ardour/public_editor.cc
@@ -27,6 +27,8 @@ const int PublicEditor::container_border_width = 12;
const int PublicEditor::vertical_spacing = 6;
const int PublicEditor::horizontal_spacing = 6;
+sigc::signal<void> PublicEditor::DropDownKeys;
+
PublicEditor::PublicEditor ()
: Window (Gtk::WINDOW_TOPLEVEL)
{
diff --git a/gtk2_ardour/public_editor.h b/gtk2_ardour/public_editor.h
index 2ff5d53326..bb498a8c4f 100644
--- a/gtk2_ardour/public_editor.h
+++ b/gtk2_ardour/public_editor.h
@@ -283,6 +283,8 @@ class PublicEditor : public Gtk::Window, public PBD::StatefulDestructible {
sigc::signal<void> Realized;
sigc::signal<void,nframes64_t> UpdateAllTransportClocks;
+ static sigc::signal<void> DropDownKeys;
+
Glib::RefPtr<Gtk::ActionGroup> editor_actions;
virtual void reset_focus () = 0;