Try to avoid coincident tempo/meter markers when removing time
[ardour.git] / gtk2_ardour / editor_mouse.cc
index abb8cc56a8add7bfe8d64bf9dcf5cb625b9a483d..5c106785e28559efafe7ee60fcb8c79c22680abb 100644 (file)
@@ -214,10 +214,6 @@ Editor::mouse_mode_object_range_toggled()
        Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic (act);
        assert (tact);
 
-       if (tact->get_active()) {
-               m = MouseObject;  //Smart mode turned to ON, force editing to Object mode
-       }
-
        set_mouse_mode(m, true);  //call this so the button styles can get updated
 }
 
@@ -341,20 +337,50 @@ Editor::update_time_selection_display ()
                selection->ClearMidiNoteSelection ();  /* EMIT SIGNAL */
                break;
        case MouseObject:
-               selection->clear_objects ();
                selection->clear_time ();
                selection->clear_tracks ();
                selection->ClearMidiNoteSelection ();  /* EMIT SIGNAL */
                break;
        case MouseDraw:
-               /* Clear top level objects, but not time or tracks, since that
-                woulddestroy the range selection rectangle, which we need to stick
+               /* Clear regions, but not time or tracks, since that
+                would destroy the range selection rectangle, which we need to stick
                 around for AutomationRangeDrag. */
-               selection->clear_objects ();
+               selection->clear_regions ();
+               selection->clear_playlists ();
+               break;
+       case MouseContent:
+               /* This handles internal edit.
+                  Clear everything except points and notes. 
+               */
+               selection->clear_regions();
+               selection->clear_lines();
+               selection->clear_playlists ();
+
+               selection->clear_time ();
+               selection->clear_tracks ();
+               break;
+
+       case MouseTimeFX:
+               /* We probably want to keep region selection */
+               selection->clear_points ();
+               selection->clear_lines();
+               selection->clear_playlists ();
+
+               selection->clear_time ();
+               selection->clear_tracks ();
+               break;
+
+       case MouseAudition:
+               /*Don't lose lines or points if no action in this mode */
+               selection->clear_regions ();
+               selection->clear_playlists ();
+               selection->clear_time ();
+               selection->clear_tracks ();
                break;
+
        default:
-               /* Clear everything. */
-               selection->clear_objects ();
+               /*Clear everything */
+               selection->clear_objects();
                selection->clear_time ();
                selection->clear_tracks ();
                break;
@@ -461,7 +487,7 @@ Editor::button_selection (ArdourCanvas::Item* /*item*/, GdkEvent* event, ItemTyp
                        }
                } else {
                        if (eff_mouse_mode != MouseRange) {
-                               _mouse_changed_selection = set_selected_regionview_from_click (press, op);
+                               _mouse_changed_selection |= set_selected_regionview_from_click (press, op);
                        }
                }
                break;
@@ -479,7 +505,7 @@ Editor::button_selection (ArdourCanvas::Item* /*item*/, GdkEvent* event, ItemTyp
        case StartCrossFadeItem:
        case EndCrossFadeItem:
                if (get_smart_mode() || eff_mouse_mode != MouseRange) {
-                       _mouse_changed_selection = set_selected_regionview_from_click (press, op);
+                       _mouse_changed_selection |= set_selected_regionview_from_click (press, op);
                } else if (event->type == GDK_BUTTON_PRESS) {
                        set_selected_track_as_side_effect (op);
                }
@@ -488,7 +514,7 @@ Editor::button_selection (ArdourCanvas::Item* /*item*/, GdkEvent* event, ItemTyp
        case ControlPointItem:
                set_selected_track_as_side_effect (op);
                if (eff_mouse_mode != MouseRange) {
-                       _mouse_changed_selection = set_selected_control_point_from_click (press, op);
+                       _mouse_changed_selection |= set_selected_control_point_from_click (press, op);
                }
                break;
 
@@ -497,7 +523,10 @@ Editor::button_selection (ArdourCanvas::Item* /*item*/, GdkEvent* event, ItemTyp
                if (event->button.button == 3) {
                        selection->clear_tracks ();
                        set_selected_track_as_side_effect (op);
-                       _mouse_changed_selection = true;
+
+                       /* We won't get a release.*/
+                       begin_reversible_selection_op (X_("Button 3 Menu Select"));
+                       commit_reversible_selection_op ();
                }
                break;
 
@@ -510,7 +539,7 @@ Editor::button_selection (ArdourCanvas::Item* /*item*/, GdkEvent* event, ItemTyp
        }
 
        if ((!press) && _mouse_changed_selection) {
-               begin_reversible_selection_op (_("Button Selection"));
+               begin_reversible_selection_op (X_("Button Selection"));
                commit_reversible_selection_op ();
                _mouse_changed_selection = false;
        }
@@ -738,10 +767,7 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
                        break;
 
                case StreamItem:
-                       if (dynamic_cast<MidiTimeAxisView*> (clicked_axisview)) {
-                               _drags->set (new RegionCreateDrag (this, item, clicked_axisview), event);
-                               return true;
-                       }
+                       //in the past, we created a new midi region here, but perhaps that is best left to the Draw mode
                        break;
 
                case AutomationTrackItem:
@@ -1162,20 +1188,24 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT
                return true;
        }
 
-       /* see if we're finishing a drag */
+        bool were_dragging = false;
 
-       bool were_dragging = false;
-       if (_drags->active ()) {
-               bool const r = _drags->end_grab (event);
-               if (r) {
-                       /* grab dragged, so do nothing else */
-                       return true;
-               }
+       if (!Keyboard::is_context_menu_event (&event->button)) {
 
-               were_dragging = true;
-       }
+                /* see if we're finishing a drag */
+                
+                if (_drags->active ()) {
+                        bool const r = _drags->end_grab (event);
+                        if (r) {
+                                /* grab dragged, so do nothing else */
+                                return true;
+                        }
+                        
+                        were_dragging = true;
+                }
 
-       update_region_layering_order_editor ();
+                update_region_layering_order_editor ();
+        }
 
        /* edit events get handled here */
 
@@ -1466,7 +1496,7 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT
                                default:
                                        break;
                                }
-                       } else {
+                       } else if (_session) {
                                /* make sure we stop */
                                _session->request_transport_speed (0.0);
                        }
@@ -1629,6 +1659,14 @@ Editor::enter_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_
        case SelectionItem:
                break;
 
+       case WaveItem:
+       {
+               if (entered_regionview) {
+                       entered_regionview->entered();
+               }
+       }
+       break;
+
        default:
                break;
        }
@@ -1895,7 +1933,6 @@ Editor::edit_control_point (ArdourCanvas::Item* item)
        }
 
        ControlPointDialog d (p);
-       ensure_float (d);
 
        if (d.run () != RESPONSE_ACCEPT) {
                return;
@@ -1915,7 +1952,6 @@ Editor::edit_notes (MidiRegionView* mrv)
 
        EditNoteDialog* d = new EditNoteDialog (mrv, s);
        d->show_all ();
-       ensure_float (*d);
 
        d->signal_response().connect (sigc::bind (sigc::mem_fun (*this, &Editor::note_edit_done), d));
 }