Context menu for applying edits to note selection.
[ardour.git] / gtk2_ardour / editor_mouse.cc
index 7a264e35de05925f8f936fc1cfbf63e08ff30831..6f22199d661a727558e52bbd171924170b27bf3d 100644 (file)
@@ -292,27 +292,19 @@ Editor::mouse_mode_toggled (MouseMode m)
                _session->request_transport_speed (0.0, true);
        }
 
-       if (mouse_mode == m) {
-               /* switch to the same mode, act like a toggle and switch back to previous mode */
-               Glib::RefPtr<Action>       pact  = get_mouse_mode_action(previous_mouse_mode);
-               Glib::RefPtr<ToggleAction> ptact = Glib::RefPtr<ToggleAction>::cast_dynamic(pact);
-               ptact->set_active(true);
-               return;
-       }
-
        const bool was_internal = internal_editing();
 
-       previous_mouse_mode = mouse_mode;
        mouse_mode = m;
 
+       /* Switch snap type/mode if we're moving to/from an internal tool.  Note
+          this must toggle the actions and not call set_snap_*() directly,
+          otherwise things get out of sync and the combo box stops working. */
        if (!was_internal && internal_editing()) {
-               /* switched to internal, switch to internal snap settings */
-               set_snap_to(internal_snap_type);
-               set_snap_mode(internal_snap_mode);
+               snap_type_action(internal_snap_type)->set_active(true);
+               snap_mode_action(internal_snap_mode)->set_active(true);
        } else if (was_internal && !internal_editing()) {
-               /* switched out of internal, switch to non-internal snap settings */
-               set_snap_to(pre_internal_snap_type);
-               set_snap_mode(pre_internal_snap_mode);
+               snap_type_action(pre_internal_snap_type)->set_active(true);
+               snap_mode_action(pre_internal_snap_mode)->set_active(true);
        }
 
        instant_save ();
@@ -329,6 +321,8 @@ Editor::mouse_mode_toggled (MouseMode m)
        
        update_time_selection_display ();
 
+       update_all_enter_cursors ();
+
        MouseModeChanged (); /* EMIT SIGNAL */
 }
 
@@ -714,7 +708,7 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
                case RegionViewName:
                case StreamItem:
                case AutomationTrackItem:
-                       _drags->set (new RegionCutDrag (this, item, canvas_event_sample (event)), event, current_canvas_cursor);
+                       _drags->set (new RegionCutDrag (this, item, canvas_event_sample (event)), event, get_canvas_cursor());
                        return true;
                        break;
                default:
@@ -728,7 +722,7 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
                        /* Existing note: allow trimming/motion */
                        if ((note = reinterpret_cast<NoteBase*> (item->get_data ("notebase")))) {
                                if (note->big_enough_to_trim() && note->mouse_near_ends()) {
-                                       _drags->set (new NoteResizeDrag (this, item), event, current_canvas_cursor);
+                                       _drags->set (new NoteResizeDrag (this, item), event, get_canvas_cursor());
                                } else {
                                        _drags->set (new NoteDrag (this, item), event);
                                }
@@ -947,7 +941,7 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
                        if ((note = reinterpret_cast<NoteBase*>(item->get_data ("notebase")))) {
                                if (note->big_enough_to_trim() && note->mouse_near_ends()) {
                                        /* Note is big and pointer is near the end, trim */
-                                       _drags->set (new NoteResizeDrag (this, item), event, current_canvas_cursor);
+                                       _drags->set (new NoteResizeDrag (this, item), event, get_canvas_cursor());
                                } else {
                                        /* Drag note */
                                        _drags->set (new NoteDrag (this, item), event);
@@ -973,7 +967,7 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
                        /* resize-drag notes */
                        if ((note = reinterpret_cast<NoteBase*>(item->get_data ("notebase")))) {
                                if (note->big_enough_to_trim()) {
-                                       _drags->set (new NoteResizeDrag (this, item), event, current_canvas_cursor);
+                                       _drags->set (new NoteResizeDrag (this, item), event, get_canvas_cursor());
                                }
                        }
                        return true;
@@ -985,12 +979,11 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
                break;
 
        case MouseAudition:
-               _drags->set (new ScrubDrag (this, item), event);
+               _drags->set (new ScrubDrag (this, item), event, _cursors->transparent);
                scrub_reversals = 0;
                scrub_reverse_distance = 0;
                last_scrub_x = event->button.x;
                scrubbing_direction = 0;
-               push_canvas_cursor (_cursors->transparent);
                return true;
                break;
 
@@ -1077,8 +1070,6 @@ Editor::button_press_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemTyp
                return false;
        }
 
-        pre_press_cursor = current_canvas_cursor;
-
        _track_canvas->grab_focus();
 
        if (_session && _session->actively_recording()) {
@@ -1097,7 +1088,7 @@ Editor::button_press_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemTyp
        }
 
        //not rolling, range mode click + join_play_range :  locate the PH here
-       if ( !_drags->active () && !_session->transport_rolling() && ( effective_mouse_mode() == MouseRange ) && Config->get_follow_edits() ) {
+       if ( !_drags->active () && !_session->transport_rolling() && ( effective_mouse_mode() == MouseRange ) && ARDOUR_UI::config()->get_follow_edits() ) {
                framepos_t where = canvas_event_sample (event);
                snap_to(where);
                _session->request_locate (where, false);
@@ -1150,10 +1141,7 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT
        framepos_t where = canvas_event_sample (event);
        AutomationTimeAxisView* atv = 0;
 
-        if (pre_press_cursor) {
-                set_canvas_cursor (pre_press_cursor);
-                pre_press_cursor = 0;
-        }
+       _press_cursor_ctx.reset();
 
        /* no action if we're recording */
 
@@ -1317,6 +1305,12 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT
                                popup_control_point_context_menu (item, event);
                                break;
 
+                       case NoteItem:
+                               if (internal_editing()) {
+                                       popup_note_context_menu (item, event);
+                               }
+                               break;
+
                        default:
                                break;
                        }
@@ -1450,7 +1444,6 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT
                        break;
 
                case MouseAudition:
-                       pop_canvas_cursor ();
                        if (scrubbing_direction == 0) {
                                /* no drag, just a click */
                                switch (item_type) {
@@ -1538,7 +1531,7 @@ Editor::enter_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_
         * (e.g. the actual entered regionview)
         */
 
-       choose_canvas_cursor_on_entry (&event->crossing, item_type);
+       choose_canvas_cursor_on_entry (item_type);
 
        switch (item_type) {
        case ControlPointItem:
@@ -1658,7 +1651,7 @@ Editor::leave_handler (ArdourCanvas::Item* item, GdkEvent*, ItemType item_type)
        bool is_start;
        bool ret = true;
 
-       reset_canvas_cursor ();
+       _enter_stack.pop_back();
 
        switch (item_type) {
        case ControlPointItem:
@@ -1896,21 +1889,15 @@ Editor::edit_control_point (ArdourCanvas::Item* item)
 }
 
 void
-Editor::edit_notes (TimeAxisViewItem& tavi)
+Editor::edit_notes (MidiRegionView* mrv)
 {
-       MidiRegionView* mrv = dynamic_cast<MidiRegionView*>(&tavi);
-
-       if (!mrv) {
-               return;
-       }
-
        MidiRegionView::Selection const & s = mrv->selection();
 
        if (s.empty ()) {
                return;
        }
 
-       EditNoteDialog* d = new EditNoteDialog (&(*s.begin())->region_view(), s);
+       EditNoteDialog* d = new EditNoteDialog (mrv, s);
        d->show_all ();
        ensure_float (*d);
 
@@ -2329,9 +2316,10 @@ Editor::update_join_object_range_location (double y)
                double const c = item_space.y / entered_regionview->height();
                        
                _join_object_range_state = c <= 0.5 ? JOIN_OBJECT_RANGE_RANGE : JOIN_OBJECT_RANGE_OBJECT;
-               
-               if (_join_object_range_state != old) {
-                       set_canvas_cursor (which_track_cursor ());
+
+               Editor::EnterContext* ctx = get_enter_context(RegionItem);
+               if (_join_object_range_state != old && ctx) {
+                       ctx->cursor_ctx->change(which_track_cursor());
                }
 
        } else if (entered_track) {
@@ -2346,7 +2334,7 @@ Editor::update_join_object_range_location (double y)
                        entered_route_view->canvas_display()->canvas_to_item (cx, cy);
 
                        double track_height = entered_route_view->view()->child_height();
-                       if (Config->get_show_name_highlight()) {
+                       if (ARDOUR_UI::config()->get_show_name_highlight()) {
                                track_height -= TimeAxisViewItem::NAME_HIGHLIGHT_SIZE;
                        }
                        double const c = cy / track_height;
@@ -2363,8 +2351,9 @@ Editor::update_join_object_range_location (double y)
                        _join_object_range_state = JOIN_OBJECT_RANGE_OBJECT;
                }
 
-               if (_join_object_range_state != old) {
-                       set_canvas_cursor (which_track_cursor ());
+               Editor::EnterContext* ctx = get_enter_context(StreamItem);
+               if (_join_object_range_state != old && ctx) {
+                       ctx->cursor_ctx->change(which_track_cursor());
                }
        }
 }