Present trim cursors over region view name bar.
authorCarl Hetherington <carl@carlh.net>
Mon, 15 Nov 2010 19:00:31 +0000 (19:00 +0000)
committerCarl Hetherington <carl@carlh.net>
Mon, 15 Nov 2010 19:00:31 +0000 (19:00 +0000)
git-svn-id: svn://localhost/ardour2/branches/3.0@8041 d708f5d6-7413-0410-9779-e7cbd77b26cf

gtk2_ardour/editor.cc
gtk2_ardour/editor.h
gtk2_ardour/editor_mouse.cc
gtk2_ardour/region_view.cc

index b86fa6a7792d6ebce8d4dc4c3d2a3236c68b0f80..8f954895df8c1e30b7ab2787cc7301761ee6899c 100644 (file)
@@ -750,6 +750,7 @@ Editor::Editor ()
        _popup_region_menu_item = 0;
 
        _show_marker_lines = false;
+       _over_region_trim_target = false;
 
        constructed = true;
        instant_save ();
index 2b08569220442d211b1796315b4e177e3484c753..10a6b57e3470314a7cb32b316b78d47710f40af7 100644 (file)
@@ -1430,6 +1430,8 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
         friend class EditorRegions;
 
        ArdourCanvas::Item *last_item_entered;
+       /** true if the mouse is over a place where region trim can happen */
+       bool _over_region_trim_target;
 
        /* non-public event handlers */
 
@@ -2097,6 +2099,8 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
        Gtk::MenuItem& action_menu_item (std::string const &);
        void action_pre_activated (Glib::RefPtr<Gtk::Action> const &);
 
+        void set_canvas_cursor_for_region_view (double, RegionView *);
+       
        friend class Drag;
        friend class RegionDrag;
        friend class RegionMoveDrag;
index a056b2dddcf9a6f37b6edaef768a4d54c0699b7a..5c7f03ec37cc5ac39b238a5fd0ac2eba32907c12 100644 (file)
@@ -1576,7 +1576,8 @@ Editor::enter_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_
 
        case RegionViewNameHighlight:
                if (is_drawable() && mouse_mode == MouseObject && !internal_editing()) {
-                       set_canvas_cursor (trimmer_cursor);
+                       set_canvas_cursor_for_region_view (event->crossing.x, entered_regionview);
+                       _over_region_trim_target = true;
                }
                break;
 
@@ -1636,7 +1637,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 +1793,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 +1815,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 +2013,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 +2714,25 @@ 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);
+
+       double const h = (x1 + x2) / 2;
+
+       if (x1 < x && x <= h) {
+               set_canvas_cursor (left_side_trim_cursor);
+       } else if (h < x && x <= x2) {
+               set_canvas_cursor (right_side_trim_cursor);
+       }
+}
index 755281a119e11fe31fcc7bb9ca14b3557280a8ac..9601c6931801eefc237767cfac95597e057cd436 100644 (file)
@@ -679,8 +679,19 @@ RegionView::update_coverage_frames (LayerDisplay d)
 
        if (frame_handle_start) {
                frame_handle_start->raise_to_top ();
+       }
+
+       if (frame_handle_end) {
                frame_handle_end->raise_to_top ();
        }
+
+       if (name_highlight) {
+               name_highlight->raise_to_top ();
+       }
+
+       if (name_pixbuf) {
+               name_pixbuf->raise_to_top ();
+       }
 }
 
 void