Modify region trim cursor if a region can only be trimmed in one direction.
[ardour.git] / gtk2_ardour / editor_mouse.cc
index a056b2dddcf9a6f37b6edaef768a4d54c0699b7a..653fdc320497e915592b8e39656f7a26396dc47e 100644 (file)
@@ -1575,30 +1575,16 @@ Editor::enter_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_
                break;
 
        case RegionViewNameHighlight:
-               if (is_drawable() && mouse_mode == MouseObject && !internal_editing()) {
-                       set_canvas_cursor (trimmer_cursor);
+               if (is_drawable() && mouse_mode == MouseObject && !internal_editing() && entered_regionview) {
+                       set_canvas_cursor_for_region_view (event->crossing.x, entered_regionview);
+                       _over_region_trim_target = true;
                }
                break;
 
        case LeftFrameHandle:
-               if (is_drawable() && mouse_mode == MouseObject && !internal_editing()) {
-                        if (entered_regionview) {
-                                Trimmable::CanTrim ct = entered_regionview->region()->can_trim();
-                                if ((ct & Trimmable::EndTrimEarlier) || (ct & Trimmable::EndTrimLater)) {
-                                        set_canvas_cursor (left_side_trim_cursor);
-                                }
-                        }
-               }
-                break;
-
        case RightFrameHandle:
-               if (is_drawable() && mouse_mode == MouseObject && !internal_editing()) {
-                        if (entered_regionview) {
-                                Trimmable::CanTrim ct = entered_regionview->region()->can_trim();
-                                if ((ct & Trimmable::FrontTrimEarlier) || (ct & Trimmable::FrontTrimLater)) {
-                                        set_canvas_cursor (right_side_trim_cursor);
-                                }
-                        }
+               if (is_drawable() && mouse_mode == MouseObject && !internal_editing() && entered_regionview) {
+                       set_canvas_cursor_for_region_view (event->crossing.x, entered_regionview);
                }
                 break;
 
@@ -1636,7 +1622,8 @@ Editor::enter_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_
 
                if (!reinterpret_cast<RegionView *> (item->get_data ("regionview"))->name_active()) {
                        if (mouse_mode == MouseObject && is_drawable()) {
-                               set_canvas_cursor (trimmer_cursor);
+                               set_canvas_cursor_for_region_view (event->crossing.x, entered_regionview);
+                               _over_region_trim_target = true;
                        }
                }
                break;
@@ -1791,6 +1778,8 @@ Editor::leave_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_
        case MarkerViewHandleEndItem:
 #endif
 
+               _over_region_trim_target = false;
+               
                if (is_drawable()) {
                         set_canvas_cursor (current_canvas_cursor);
                }
@@ -1811,6 +1800,8 @@ Editor::leave_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_
 
        case RegionViewName:
                /* see enter_handler() for notes */
+               _over_region_trim_target = false;
+               
                if (!reinterpret_cast<RegionView *> (item->get_data ("regionview"))->name_active()) {
                        if (is_drawable() && mouse_mode == MouseObject) {
                                 set_canvas_cursor (current_canvas_cursor);
@@ -2007,6 +1998,10 @@ Editor::motion_handler (ArdourCanvas::Item* /*item*/, GdkEvent* event, bool from
                set_canvas_cursor ();
        }
 
+       if (_over_region_trim_target) {
+               set_canvas_cursor_for_region_view (event->motion.x, entered_regionview);
+       }
+
        bool handled = false;
        if (_drags->active ()) {
                handled = _drags->motion_handler (event, from_autoscroll);
@@ -2704,3 +2699,35 @@ Editor::remove_midi_note (ArdourCanvas::Item* item, GdkEvent *)
 
        e->region_view().delete_note (e->note ());
 }
+
+void
+Editor::set_canvas_cursor_for_region_view (double x, RegionView* rv)
+{
+       ArdourCanvas::Group* g = rv->get_canvas_group ();
+       ArdourCanvas::Group* p = g->get_parent_group ();
+
+       /* Compute x in region view parent coordinates */
+       double dy = 0;
+       p->w2i (x, dy);
+
+       double x1, x2, y1, y2;
+       g->get_bounds (x1, y1, x2, y2);
+
+       /* Halfway across the region */
+       double const h = (x1 + x2) / 2;
+
+       Trimmable::CanTrim ct = rv->region()->can_trim ();
+       if (x <= h) {
+               if (ct & Trimmable::FrontTrimEarlier) {
+                       set_canvas_cursor (left_side_trim_cursor);
+               } else {
+                       set_canvas_cursor (left_side_trim_right_only_cursor);
+               }
+       } else {
+               if (ct & Trimmable::EndTrimLater) {
+                       set_canvas_cursor (right_side_trim_cursor);
+               } else {
+                       set_canvas_cursor (right_side_trim_left_only_cursor);
+               }
+       }
+}