heavy-handed and crude way to stop WM-stolen-alt keys from causing MidiRegionView...
authorPaul Davis <paul@linuxaudiosystems.com>
Fri, 28 May 2010 21:39:12 +0000 (21:39 +0000)
committerPaul Davis <paul@linuxaudiosystems.com>
Fri, 28 May 2010 21:39:12 +0000 (21:39 +0000)
git-svn-id: svn://localhost/ardour2/branches/3.0@7192 d708f5d6-7413-0410-9779-e7cbd77b26cf

gtk2_ardour/editor_canvas.cc
gtk2_ardour/midi_region_view.cc
gtk2_ardour/midi_region_view.h
gtk2_ardour/midi_time_axis.h
gtk2_ardour/public_editor.cc
gtk2_ardour/public_editor.h

index b072a2779e13d49d8c4feabb31a920a27ae406eb..2b5e0163783c05accef923c283e3eb54b2a7cb6e 100644 (file)
@@ -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);
index 3232ca407222c2efa358064484172ac820ad9c7c..53948ef366c1adc3e7d84de32ccc38748f039c78 100644 (file)
@@ -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;
@@ -882,6 +887,20 @@ MidiRegionView::find_canvas_note (boost::shared_ptr<NoteType> note)
        return 0;
 }
 
+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()
 {
@@ -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);
+       }
+}                
index f823de2e9a9218f215685d4204025c290aa03c4e..cb360159d91506fa49ec44b68202ea052c432449 100644 (file)
@@ -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);
 };
 
 
index e965e0940364455cfe1c74ffcd9b330d817456c3..aeb7ff150ee710cea23f01c1883723cd0fe4a606 100644 (file)
@@ -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;
 
index 3955083c70b2bd9ea4e4d445a5f6f0daffed29f3..1b8b5c480155da25b1522fab64bb3221c564b078 100644 (file)
@@ -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)
 {
index 2ff5d53326ad8e19374bb8c18294b3daa7c876c3..bb498a8c4f4eff0c6f89b04697a6cce54911ad5d 100644 (file)
@@ -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;