Factor out grid beat divisions.
[ardour.git] / gtk2_ardour / editor_mouse.cc
index a799bf85af2521ee0e6006a9573bc8fd299d8b2a..e093eb5426ad54fda5a0f91bfa917d41c9ea7f93 100644 (file)
@@ -296,14 +296,15 @@ Editor::mouse_mode_toggled (MouseMode m)
 
        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 ();
@@ -320,6 +321,8 @@ Editor::mouse_mode_toggled (MouseMode m)
        
        update_time_selection_display ();
 
+       update_all_enter_cursors ();
+
        MouseModeChanged (); /* EMIT SIGNAL */
 }
 
@@ -1302,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;
                        }
@@ -1456,7 +1465,11 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT
                }
 
                 /* do any (de)selection operations that should occur on button release */
+
+               begin_reversible_selection_op (_("Button Select"));
                 button_selection (item, event, item_type);
+               commit_reversible_selection_op ();
+
                return true;
                break;
 
@@ -1642,8 +1655,9 @@ Editor::leave_handler (ArdourCanvas::Item* item, GdkEvent*, ItemType item_type)
        bool is_start;
        bool ret = true;
 
-       _enter_cursor_ctx.reset();
-       _entered_item_type = NoItem;
+       if (!_enter_stack.empty()) {
+               _enter_stack.pop_back();
+       }
 
        switch (item_type) {
        case ControlPointItem:
@@ -1881,21 +1895,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);
 
@@ -2312,11 +2320,12 @@ Editor::update_join_object_range_location (double y)
 
                ArdourCanvas::Duple const item_space = entered_regionview->get_canvas_group()->canvas_to_item (ArdourCanvas::Duple (0, 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 && _enter_cursor_ctx) {
-                       _enter_cursor_ctx->change(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) {
@@ -2348,8 +2357,9 @@ Editor::update_join_object_range_location (double y)
                        _join_object_range_state = JOIN_OBJECT_RANGE_OBJECT;
                }
 
-               if (_join_object_range_state != old && _enter_cursor_ctx) {
-                       _enter_cursor_ctx->change(which_track_cursor());
+               Editor::EnterContext* ctx = get_enter_context(StreamItem);
+               if (_join_object_range_state != old && ctx) {
+                       ctx->cursor_ctx->change(which_track_cursor());
                }
        }
 }