vtl: send A/V offset to video-monitor when launched
[ardour.git] / gtk2_ardour / editor_mouse.cc
index 11a4504aaad4f2e8081c05f68970101d780560a8..c7daeaccbd95a94effa8458890898532ae3e101f 100644 (file)
@@ -199,6 +199,10 @@ Editor::which_grabber_cursor ()
                case MouseTimeFX:
                        c = _cursors->midi_resize;
                        break;
+                       
+               case MouseRange:
+                       c = _cursors->grabber_note;
+                       break;
 
                default:
                        break;
@@ -250,6 +254,9 @@ Editor::set_canvas_cursor ()
        switch (mouse_mode) {
        case MouseRange:
                current_canvas_cursor = _cursors->selector;
+               if (_internal_editing) {
+                       current_canvas_cursor = which_grabber_cursor();
+               }
                break;
 
        case MouseObject:
@@ -281,19 +288,21 @@ Editor::set_canvas_cursor ()
                break;
        }
 
-       switch (_join_object_range_state) {
-       case JOIN_OBJECT_RANGE_NONE:
-               break;
-       case JOIN_OBJECT_RANGE_OBJECT:
-               current_canvas_cursor = which_grabber_cursor ();
-               break;
-       case JOIN_OBJECT_RANGE_RANGE:
-               current_canvas_cursor = _cursors->selector;
-               break;
+       if (!_internal_editing) {
+               switch (_join_object_range_state) {
+               case JOIN_OBJECT_RANGE_NONE:
+                       break;
+               case JOIN_OBJECT_RANGE_OBJECT:
+                       current_canvas_cursor = which_grabber_cursor ();
+                       break;
+               case JOIN_OBJECT_RANGE_RANGE:
+                       current_canvas_cursor = _cursors->selector;
+                       break;
+               }
        }
 
        /* up-down cursor as a cue that automation can be dragged up and down when in join object/range mode */
-       if ( get_smart_mode() ) {
+       if (!_internal_editing && get_smart_mode() ) {
                double x, y;
                get_pointer_position (x, y);
                ArdourCanvas::Item* i = track_canvas->get_item_at (x, y);
@@ -728,6 +737,11 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
                }
        }
 
+       case VideoBarItem:
+               _drags->set (new VideoTimeLineDrag (this, item), event);
+               return true;
+               break;
+
        case MarkerBarItem:
        case TempoBarItem:
        case MeterBarItem:
@@ -790,6 +804,11 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
                eff = MouseObject;
        }
 
+       /* there is no Range mode when in internal edit mode */
+       if (eff == MouseRange && internal_editing()) {
+               eff = MouseObject;
+       }
+
        switch (eff) {
        case MouseRange:
                switch (item_type) {
@@ -842,8 +861,7 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
 
                case RegionViewNameHighlight:
                        if (!clicked_regionview->region()->locked()) {
-                               RegionSelection s = get_equivalent_regions (selection->regions, Properties::edit.property_id);
-                               _drags->set (new TrimDrag (this, item, clicked_regionview, s.by_layer()), event);
+                               _drags->set (new TrimDrag (this, item, clicked_regionview, selection->regions.by_layer()), event);
                                return true;
                        }
                        break;
@@ -874,6 +892,14 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
                                return true;
                        }
                        break;
+               case StreamItem:
+                       if (internal_editing()) {
+                               if (dynamic_cast<MidiTimeAxisView*> (clicked_axisview)) {
+                                       _drags->set (new RegionCreateDrag (this, item, clicked_axisview), event);
+                               }
+                               return true;
+                       }
+                       break;
 
                default:
                        break;
@@ -908,15 +934,13 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
                        switch (item_type) {
                        case FadeInHandleItem:
                        {
-                               RegionSelection s = get_equivalent_regions (selection->regions, Properties::edit.property_id);
-                               _drags->set (new FadeInDrag (this, item, reinterpret_cast<RegionView*> (item->get_data("regionview")), s), event, _cursors->fade_in);
+                               _drags->set (new FadeInDrag (this, item, reinterpret_cast<RegionView*> (item->get_data("regionview")), selection->regions), event, _cursors->fade_in);
                                return true;
                        }
 
                        case FadeOutHandleItem:
                        {
-                               RegionSelection s = get_equivalent_regions (selection->regions, Properties::edit.property_id);
-                               _drags->set (new FadeOutDrag (this, item, reinterpret_cast<RegionView*> (item->get_data("regionview")), s), event, _cursors->fade_out);
+                               _drags->set (new FadeOutDrag (this, item, reinterpret_cast<RegionView*> (item->get_data("regionview")), selection->regions), event, _cursors->fade_out);
                                return true;
                        }
 
@@ -924,8 +948,7 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
                        case EndCrossFadeItem:
                                /* we might allow user to grab inside the fade to trim a region with preserve_fade_anchor.  for not this is not fully implemented */ 
 //                             if (!clicked_regionview->region()->locked()) {
-//                                     RegionSelection s = get_equivalent_regions (selection->regions, Properties::edit.property_id);
-//                                     _drags->set (new TrimDrag (this, item, clicked_regionview, s.by_layer(), true), event);
+//                                     _drags->set (new TrimDrag (this, item, clicked_regionview, selection->regions.by_layer(), true), event);
 //                                     return true;
 //                             }
                                break;
@@ -951,10 +974,6 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
                                }
 
                                if (internal_editing ()) {
-                                       if (event->type == GDK_2BUTTON_PRESS && event->button.button == 1) {
-                                               Glib::RefPtr<Action> act = ActionManager::get_action (X_("MouseMode"), X_("toggle-internal-edit"));
-                                               act->activate ();
-                                       }
                                        break;
                                }
 
@@ -979,8 +998,7 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
                        case LeftFrameHandle:
                         case RightFrameHandle:
                                if (!clicked_regionview->region()->locked()) {
-                                       RegionSelection s = get_equivalent_regions (selection->regions, Properties::edit.property_id);
-                                       _drags->set (new TrimDrag (this, item, clicked_regionview, s.by_layer()), event);
+                                       _drags->set (new TrimDrag (this, item, clicked_regionview, selection->regions.by_layer()), event);
                                        return true;
                                }
                                break;
@@ -988,8 +1006,7 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
                        case RegionViewName:
                        {
                                /* rename happens on edit clicks */
-                               RegionSelection s = get_equivalent_regions (selection->regions, Properties::edit.property_id);
-                               _drags->set (new TrimDrag (this, clicked_regionview->get_name_highlight(), clicked_regionview, s.by_layer()), event);
+                               _drags->set (new TrimDrag (this, clicked_regionview->get_name_highlight(), clicked_regionview, selection->regions.by_layer()), event);
                                return true;
                                break;
                        }
@@ -1088,31 +1105,6 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
                                break;
                        }
 
-#ifdef WITH_CMT
-                       case ImageFrameHandleStartItem:
-                               imageframe_start_handle_op(item, event) ;
-                               return(true) ;
-                               break ;
-                       case ImageFrameHandleEndItem:
-                               imageframe_end_handle_op(item, event) ;
-                               return(true) ;
-                               break ;
-                       case MarkerViewHandleStartItem:
-                               markerview_item_start_handle_op(item, event) ;
-                               return(true) ;
-                               break ;
-                       case MarkerViewHandleEndItem:
-                               markerview_item_end_handle_op(item, event) ;
-                               return(true) ;
-                               break ;
-                       case MarkerViewItem:
-                               start_markerview_grab(item, event) ;
-                               break ;
-                       case ImageFrameItem:
-                               start_imageframe_grab(item, event) ;
-                               break ;
-#endif
-
                        case MarkerBarItem:
 
                                break;
@@ -1326,14 +1318,11 @@ Editor::button_press_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemTyp
                case RangeMarkerBarItem:
                case CdMarkerBarItem:
                case TransportMarkerBarItem:
+               case StreamItem:
                        /* button press on these events never does anything to
                           change the editing mode.
                        */
                        break;
-                       
-               case StreamItem:
-                       leave_internal_edit_mode = true;
-                       break;
 
                default:
                        break;
@@ -1461,14 +1450,6 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT
                        edit_control_point (item);
                        break;
 
-               case NoteItem:
-               {
-                       ArdourCanvas::CanvasNoteEvent* e = dynamic_cast<ArdourCanvas::CanvasNoteEvent*> (item);
-                       assert (e);
-                       edit_notes (e->region_view().selection ());
-                       break;
-               }
-
                default:
                        break;
                }
@@ -1528,6 +1509,7 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT
                        case CdMarkerBarItem:
                        case TempoBarItem:
                        case MeterBarItem:
+                       case VideoBarItem:
                                popup_ruler_menu (where, item_type);
                                break;
 
@@ -1551,21 +1533,6 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT
                                popup_control_point_context_menu (item, event);
                                break;
 
-#ifdef WITH_CMT
-                       case ImageFrameItem:
-                               popup_imageframe_edit_menu(1, event->button.time, item, true) ;
-                               break ;
-                       case ImageFrameTimeAxisItem:
-                               popup_imageframe_edit_menu(1, event->button.time, item, false) ;
-                               break ;
-                       case MarkerViewItem:
-                               popup_marker_time_axis_edit_menu(1, event->button.time, item, true) ;
-                               break ;
-                       case MarkerTimeAxisItem:
-                               popup_marker_time_axis_edit_menu(1, event->button.time, item, false) ;
-                               break ;
-#endif
-
                        default:
                                break;
                        }
@@ -1844,19 +1811,11 @@ Editor::enter_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_
                 break;
 
        case StartSelectionTrimItem:
-#ifdef WITH_CMT
-       case ImageFrameHandleStartItem:
-       case MarkerViewHandleStartItem:
-#endif
                if (is_drawable()) {
                        set_canvas_cursor (_cursors->left_side_trim);
                }
                break;
        case EndSelectionTrimItem:
-#ifdef WITH_CMT
-       case ImageFrameHandleEndItem:
-       case MarkerViewHandleEndItem:
-#endif
                if (is_drawable()) {
                        set_canvas_cursor (_cursors->right_side_trim);
                }
@@ -2030,13 +1989,6 @@ Editor::leave_handler (ArdourCanvas::Item* item, GdkEvent*, ItemType item_type)
        case EndSelectionTrimItem:
        case PlayheadCursorItem:
 
-#ifdef WITH_CMT
-       case ImageFrameHandleStartItem:
-       case ImageFrameHandleEndItem:
-       case MarkerViewHandleStartItem:
-       case MarkerViewHandleEndItem:
-#endif
-
                _over_region_trim_target = false;
 
                if (is_drawable()) {
@@ -2252,11 +2204,12 @@ Editor::motion_handler (ArdourCanvas::Item* /*item*/, GdkEvent* event, bool from
 
        JoinObjectRangeState const old = _join_object_range_state;
        update_join_object_range_location (event->motion.x, event->motion.y);
-       if (_join_object_range_state != old) {
+
+       if (!_internal_editing && _join_object_range_state != old) {
                set_canvas_cursor ();
        }
 
-       if (_over_region_trim_target) {
+       if (!_internal_editing && _over_region_trim_target) {
                set_canvas_cursor_for_region_view (event->motion.x, entered_regionview);
        }
 
@@ -2322,7 +2275,6 @@ Editor::edit_control_point (ArdourCanvas::Item* item)
        }
 
        ControlPointDialog d (p);
-       d.set_position (Gtk::WIN_POS_MOUSE);
        ensure_float (d);
 
        if (d.run () != RESPONSE_ACCEPT) {
@@ -2333,19 +2285,33 @@ Editor::edit_control_point (ArdourCanvas::Item* item)
 }
 
 void
-Editor::edit_notes (MidiRegionView::Selection const & s)
+Editor::edit_notes (TimeAxisViewItem& tavi)
 {
+       MidiRegionView* mrv = dynamic_cast<MidiRegionView*>(&tavi);
+
+       if (!mrv) {
+               return;
+       }
+
+       MidiRegionView::Selection const & s = mrv->selection();
+
        if (s.empty ()) {
                return;
        }
        
-       EditNoteDialog d (&(*s.begin())->region_view(), s);
-       d.set_position (Gtk::WIN_POS_MOUSE);
-       ensure_float (d);
+       EditNoteDialog* d = new EditNoteDialog (&(*s.begin())->region_view(), s);
+        d->show_all ();
+       ensure_float (*d);
 
-       d.run ();
+        d->signal_response().connect (sigc::bind (sigc::mem_fun (*this, &Editor::note_edit_done), d));
 }
 
+void
+Editor::note_edit_done (int r, EditNoteDialog* d)
+{
+        d->done (r);
+        delete d;
+}
 
 void
 Editor::visible_order_range (int* low, int* high) const
@@ -2626,8 +2592,7 @@ Editor::add_region_drag (ArdourCanvas::Item* item, GdkEvent*, RegionView* region
        if (Config->get_edit_mode() == Splice) {
                _drags->add (new RegionSpliceDrag (this, item, region_view, selection->regions.by_layer()));
        } else {
-               RegionSelection s = get_equivalent_regions (selection->regions, ARDOUR::Properties::edit.property_id);
-               _drags->add (new RegionMoveDrag (this, item, region_view, s.by_layer(), false, false));
+               _drags->add (new RegionMoveDrag (this, item, region_view, selection->regions.by_layer(), false, false));
        }
 
        /* sync the canvas to what we think is its current state */
@@ -2645,8 +2610,7 @@ Editor::add_region_copy_drag (ArdourCanvas::Item* item, GdkEvent*, RegionView* r
 
        _region_motion_group->raise_to_top ();
 
-       RegionSelection s = get_equivalent_regions (selection->regions, ARDOUR::Properties::edit.property_id);
-       _drags->add (new RegionMoveDrag (this, item, region_view, s.by_layer(), false, true));
+       _drags->add (new RegionMoveDrag (this, item, region_view, selection->regions.by_layer(), false, true));
 }
 
 void
@@ -2662,8 +2626,7 @@ Editor::add_region_brush_drag (ArdourCanvas::Item* item, GdkEvent*, RegionView*
                return;
        }
 
-       RegionSelection s = get_equivalent_regions (selection->regions, ARDOUR::Properties::edit.property_id);
-       _drags->add (new RegionMoveDrag (this, item, region_view, s.by_layer(), true, false));
+       _drags->add (new RegionMoveDrag (this, item, region_view, selection->regions.by_layer(), true, false));
 
        begin_reversible_command (Operations::drag_region_brush);
 }