Restore snap when switching to/from internal.
[ardour.git] / gtk2_ardour / midi_region_view.cc
index 8533cefdc07cbcdb24a34310672b79448703bbc9..330a2204bfd9a4c3bc4a07dd95280ad50f658fe4 100644 (file)
@@ -135,6 +135,9 @@ MidiRegionView::MidiRegionView (ArdourCanvas::Container*      parent,
        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,
@@ -181,6 +184,9 @@ MidiRegionView::MidiRegionView (ArdourCanvas::Container*      parent,
        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
@@ -311,10 +317,17 @@ MidiRegionView::init (bool wfd)
                                               boost::bind (&MidiRegionView::snap_changed, this),
                                               gui_context());
 
+       trackview.editor().MouseModeChanged.connect(_mouse_mode_connection, invalidator (*this),
+                                                   boost::bind (&MidiRegionView::mouse_mode_changed, this),
+                                                   gui_context ());
+
        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&
@@ -404,10 +417,6 @@ MidiRegionView::canvas_group_event(GdkEvent* ev)
 bool
 MidiRegionView::enter_notify (GdkEventCrossing* ev)
 {
-       trackview.editor().MouseModeChanged.connect (
-               _mouse_mode_connection, invalidator (*this), boost::bind (&MidiRegionView::mouse_mode_changed, this), gui_context ()
-               );
-
        enter_internal();
 
        _entered = true;
@@ -417,8 +426,6 @@ MidiRegionView::enter_notify (GdkEventCrossing* ev)
 bool
 MidiRegionView::leave_notify (GdkEventCrossing*)
 {
-       _mouse_mode_connection.disconnect ();
-
        leave_internal();
 
        _entered = false;
@@ -428,12 +435,17 @@ MidiRegionView::leave_notify (GdkEventCrossing*)
 void
 MidiRegionView::mouse_mode_changed ()
 {
-       if (trackview.editor().internal_editing()) {
-               // Switched in to internal editing mode while entered
-               enter_internal();
-       } else {
-               // Switched out of internal editing mode while entered
-               leave_internal();
+       // Adjust frame colour (become more transparent for internal tools)
+       set_frame_color();
+
+       if (_entered) {
+               if (trackview.editor().internal_editing()) {
+                       // Switched in to internal editing mode while entered
+                       enter_internal();
+               } else {
+                       // Switched out of internal editing mode while entered
+                       leave_internal();
+               }
        }
 }
 
@@ -3227,30 +3239,18 @@ MidiRegionView::note_mouse_position (float x_fraction, float /*y_fraction*/, boo
        }
 }
 
-void
-MidiRegionView::set_frame_color()
+uint32_t
+MidiRegionView::get_fill_color() const
 {
-       uint32_t f;
-
-       TimeAxisViewItem::set_frame_color ();
-
-       if (!frame) {
-               return;
-       }
-
+       const std::string mod_name = (_dragging ? "dragging region" :
+                                     trackview.editor().internal_editing() ? "editable region" :
+                                     "midi frame base");
        if (_selected) {
-               f = ARDOUR_UI::config()->color ("selected region base");
+               return ARDOUR_UI::config()->color_mod ("selected region base", mod_name);
        } else if (high_enough_for_name || !ARDOUR_UI::config()->get_color_regions_using_track_color()) {
-               f = ARDOUR_UI::config()->color_mod ("midi frame base", "midi frame base");
-       } else {
-               f = fill_color;
-       }
-
-       if (!rect_visible) {
-               f = UINT_RGBA_CHANGE_A (f, 80);
+               return ARDOUR_UI::config()->color_mod ("midi frame base", mod_name);
        }
-
-       frame->set_fill_color (f);
+       return ARDOUR_UI::config()->color_mod (fill_color, mod_name);
 }
 
 void
@@ -3340,8 +3340,6 @@ MidiRegionView::selection_as_cut_buffer () const
 bool
 MidiRegionView::paste (framepos_t pos, const ::Selection& selection, PasteContext& ctx)
 {
-       trackview.editor().begin_reversible_command (Operations::paste);
-
        // Paste notes, if available
        MidiNoteSelection::const_iterator m = selection.midi_notes.get_nth(ctx.counts.n_notes());
        if (m != selection.midi_notes.end()) {
@@ -3356,8 +3354,6 @@ MidiRegionView::paste (framepos_t pos, const ::Selection& selection, PasteContex
                a->second->paste(pos, selection, ctx);
        }
 
-       trackview.editor().commit_reversible_command ();
-
        return true;
 }