rationalize, consolidate and make work dbl-click editing for regions and markers...
authorPaul Davis <paul@linuxaudiosystems.com>
Mon, 27 Jan 2014 15:09:58 +0000 (10:09 -0500)
committerPaul Davis <paul@linuxaudiosystems.com>
Mon, 27 Jan 2014 15:09:58 +0000 (10:09 -0500)
gtk2_ardour/editor.h
gtk2_ardour/editor_drag.cc
gtk2_ardour/editor_mouse.cc
gtk2_ardour/editor_tempodisplay.cc

index 29e3ac2bef2939dd5281ce4a2620e205e2e8e606..47ce7d782800997ed3199b13cb381b3237fbfd27 100644 (file)
@@ -1482,8 +1482,8 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
 
        void edit_tempo_section (ARDOUR::TempoSection*);
        void edit_meter_section (ARDOUR::MeterSection*);
-       void edit_tempo_marker (ArdourCanvas::Item*);
-       void edit_meter_marker (ArdourCanvas::Item*);
+       void edit_tempo_marker (TempoMarker&);
+       void edit_meter_marker (MeterMarker&);
        void edit_control_point (ArdourCanvas::Item*);
         void edit_notes (TimeAxisViewItem&);
 
index 1748c397365dcfef3499766b05f931cd285f775f..d8209d4b518a38fbcbcff6daaeb63f3926c10274 100644 (file)
@@ -872,7 +872,15 @@ RegionMoveDrag::finished (GdkEvent* ev, bool movement_occurred)
        RegionMotionDrag::finished (ev, movement_occurred);
        
        if (!movement_occurred) {
+               
                /* just a click */
+
+               if (was_double_click() && !_views.empty()) {
+                       DraggingView dv = _views.front();
+                       dv.view->show_region_editor ();
+                       
+               }
+
                return;
        }
 
@@ -2146,6 +2154,10 @@ MeterMarkerDrag::setup_pointer_frame_offset ()
 void
 MeterMarkerDrag::motion (GdkEvent* event, bool first_move)
 {
+       if (!_marker->meter().movable()) {
+               return;
+       }
+
        if (first_move) {
 
                // create a dummy marker for visual representation of moving the
@@ -2191,6 +2203,13 @@ void
 MeterMarkerDrag::finished (GdkEvent* event, bool movement_occurred)
 {
        if (!movement_occurred) {
+               if (was_double_click()) {
+                       _editor->edit_meter_marker (*_marker);
+               }
+               return;
+       }
+
+       if (!_marker->meter().movable()) {
                return;
        }
 
@@ -2266,6 +2285,10 @@ TempoMarkerDrag::setup_pointer_frame_offset ()
 void
 TempoMarkerDrag::motion (GdkEvent* event, bool first_move)
 {
+       if (!_marker->tempo().movable()) {
+               return;
+       }
+
        if (first_move) {
 
                // create a dummy marker for visual representation of moving the
@@ -2310,6 +2333,13 @@ void
 TempoMarkerDrag::finished (GdkEvent* event, bool movement_occurred)
 {
        if (!movement_occurred) {
+               if (was_double_click()) {
+                       _editor->edit_tempo_marker (*_marker);
+               }
+               return;
+       }
+
+       if (!_marker->tempo().movable()) {
                return;
        }
 
@@ -3001,7 +3031,8 @@ MarkerDrag::finished (GdkEvent* event, bool movement_occurred)
        if (!movement_occurred) {
                
                if (was_double_click()) {
-                       cerr << "End of marker double click\n";
+                       _editor->rename_marker (_marker);
+                       return;
                }
 
                /* just a click, do nothing but finish
@@ -4128,10 +4159,24 @@ RangeMarkerBarDrag::finished (GdkEvent* event, bool movement_occurred)
                        _editor->new_transport_marker_context_menu (&event->button, _item);
                        break;
                }
+
        } else {
+
                /* just a click, no pointer movement. remember that context menu stuff was handled elsewhere */
 
-               if (Keyboard::no_modifier_keys_pressed (&event->button) && _operation != CreateCDMarker) {
+               if (_operation == CreateTransportMarker) {
+
+                       /* didn't drag, so just locate */
+
+                       _editor->session()->request_locate (grab_frame(), _editor->session()->transport_rolling());
+
+               } else if (_operation == CreateCDMarker) {
+
+                       /* didn't drag, but mark is already created so do
+                        * nothing */
+
+               } else { /* operation == CreateRangeMarker */
+                       
 
                        framepos_t start;
                        framepos_t end;
index e6772e42b20389ff59bda406884c76ea8b1dadc2..131d0dd6110abeb1122135b6e34beddd53f249ca 100644 (file)
@@ -723,38 +723,30 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
        {
                TempoMarker* m = reinterpret_cast<TempoMarker*> (item->get_data ("marker"));
                assert (m);
-               if (m->tempo().movable ()) {
-                       _drags->set (
-                               new TempoMarkerDrag (
-                                       this,
-                                       item,
-                                       Keyboard::modifier_state_contains (event->button.state, Keyboard::CopyModifier)
-                                       ),
-                               event
-                               );
-                       return true;
-               } else {
-                       return false;
-               }
+               _drags->set (
+                       new TempoMarkerDrag (
+                               this,
+                               item,
+                               Keyboard::modifier_state_contains (event->button.state, Keyboard::CopyModifier)
+                               ),
+                       event
+                       );
+               return true;
        }
 
        case MeterMarkerItem:
        {
                MeterMarker* m = reinterpret_cast<MeterMarker*> (item->get_data ("marker"));
                assert (m);
-               if (m->meter().movable ()) {
-                       _drags->set (
-                               new MeterMarkerDrag (
-                                       this,
-                                       item,
-                                       Keyboard::modifier_state_contains (event->button.state, Keyboard::CopyModifier)
-                                       ),
-                               event
-                               );
-                       return true;
-               } else {
-                       return false;
-               }
+               _drags->set (
+                       new MeterMarkerDrag (
+                               this,
+                               item,
+                               Keyboard::modifier_state_contains (event->button.state, Keyboard::CopyModifier)
+                               ),
+                       event
+                       );
+               return true;
        }
 
        case VideoBarItem:
@@ -1295,14 +1287,11 @@ Editor::button_press_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemTyp
 {
        if (event->type == GDK_2BUTTON_PRESS) {
                _drags->mark_double_click ();
-               return false;
+               gdk_pointer_ungrab (GDK_CURRENT_TIME);
+               return true;
        }
 
        if (event->type != GDK_BUTTON_PRESS) {
-               if (event->type == GDK_2BUTTON_PRESS) {
-                       gdk_pointer_ungrab (GDK_CURRENT_TIME);
-                       return button_double_click_handler (item, event, item_type);
-               }
                return false;
        }
 
@@ -1426,52 +1415,6 @@ Editor::button_release_dispatch (GdkEventButton* ev)
         return button_bindings->activate (b, Gtkmm2ext::Bindings::Release);
 }
 
-bool
-Editor::button_double_click_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_type) {
-
-       if (event->button.button != 1) {
-               return false;
-       }
-
-       switch (item_type) {
-               case RegionItem:
-                       RegionView *rv;
-                       rv = clicked_regionview;
-                       rv->show_region_editor ();
-                       return true;
-               case NoteItem:
-               case PlayheadCursorItem:
-                       break;
-               case MarkerItem:
-               case RangeMarkerBarItem:
-               case CdMarkerBarItem:
-                       Marker* marker;
-                       if ((marker = static_cast<Marker *> (item->get_data ("marker"))) == 0) {
-                               break;
-                       }
-                       rename_marker (marker);
-                       return true;
-               case TempoMarkerItem:
-                       edit_tempo_marker (item);
-                       return true;
-               case MeterMarkerItem:
-                       edit_meter_marker (item);
-                       return true;
-               case MarkerBarItem:
-               case TempoBarItem:
-               case MeterBarItem:
-               case TransportMarkerBarItem:
-               case StreamItem:
-                       break;
-
-               default:
-                       break;
-       }
-       return false;
-}
-
-
-
 bool
 Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_type)
 {
@@ -1512,13 +1455,40 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT
                        show_region_properties ();
                        break;
 
-               case TempoMarkerItem:
-                       edit_tempo_marker (item);
+               case TempoMarkerItem: {
+                       Marker* marker;
+                       TempoMarker* tempo_marker;
+                       
+                       if ((marker = reinterpret_cast<Marker *> (item->get_data ("marker"))) == 0) {
+                               fatal << _("programming error: tempo marker canvas item has no marker object pointer!") << endmsg;
+                               /*NOTREACHED*/
+                       }
+                       
+                       if ((tempo_marker = dynamic_cast<TempoMarker*> (marker)) == 0) {
+                               fatal << _("programming error: marker for tempo is not a tempo marker!") << endmsg;
+                               /*NOTREACHED*/
+                       }
+                       
+                       edit_tempo_marker (*tempo_marker);
                        break;
+               }
 
-               case MeterMarkerItem:
-                       edit_meter_marker (item);
+               case MeterMarkerItem: {
+                       Marker* marker;
+                       MeterMarker* meter_marker;
+                       
+                       if ((marker = reinterpret_cast<Marker *> (item->get_data ("marker"))) == 0) {
+                               fatal << _("programming error: tempo marker canvas item has no marker object pointer!") << endmsg;
+                               /*NOTREACHED*/
+                       }
+                       
+                       if ((meter_marker = dynamic_cast<MeterMarker*> (marker)) == 0) {
+                               fatal << _("programming error: marker for meter is not a meter marker!") << endmsg;
+                               /*NOTREACHED*/
+                       }
+                       edit_meter_marker (*meter_marker);
                        break;
+               }
 
                case RegionViewName:
                        if (clicked_regionview->name_active()) {
index b997d3bb5d94714ece8beb2b89007162f5c4880a..11c5513f68bba4eb418db1af3fd0970b63b81d32 100644 (file)
@@ -343,41 +343,15 @@ Editor::edit_tempo_section (TempoSection* section)
 }
 
 void
-Editor::edit_tempo_marker (ArdourCanvas::Item *item)
+Editor::edit_tempo_marker (TempoMarker& tm)
 {
-       Marker* marker;
-       TempoMarker* tempo_marker;
-
-       if ((marker = reinterpret_cast<Marker *> (item->get_data ("marker"))) == 0) {
-               fatal << _("programming error: tempo marker canvas item has no marker object pointer!") << endmsg;
-               /*NOTREACHED*/
-       }
-
-       if ((tempo_marker = dynamic_cast<TempoMarker*> (marker)) == 0) {
-               fatal << _("programming error: marker for tempo is not a tempo marker!") << endmsg;
-               /*NOTREACHED*/
-       }
-
-       edit_tempo_section (&tempo_marker->tempo());
+       edit_tempo_section (&tm.tempo());
 }
 
 void
-Editor::edit_meter_marker (ArdourCanvas::Item *item)
+Editor::edit_meter_marker (MeterMarker& mm)
 {
-       Marker* marker;
-       MeterMarker* meter_marker;
-
-       if ((marker = reinterpret_cast<Marker *> (item->get_data ("marker"))) == 0) {
-               fatal << _("programming error: tempo marker canvas item has no marker object pointer!") << endmsg;
-               /*NOTREACHED*/
-       }
-
-       if ((meter_marker = dynamic_cast<MeterMarker*> (marker)) == 0) {
-               fatal << _("programming error: marker for meter is not a meter marker!") << endmsg;
-               /*NOTREACHED*/
-       }
-
-       edit_meter_section (&meter_marker->meter());
+       edit_meter_section (&mm.meter());
 }
 
 gint