basic adoption of new mouse binding facility
[ardour.git] / gtk2_ardour / editor_mouse.cc
index a689553e6782af7738484ce23d8bf8cad87a3b3f..2733280dac6b4afe5b5ddd8c89b935aa2b26a451 100644 (file)
 
 #include "pbd/error.h"
 #include "pbd/enumwriter.h"
-#include <gtkmm2ext/utils.h>
-#include <gtkmm2ext/tearoff.h>
 #include "pbd/memento_command.h"
 #include "pbd/basename.h"
 #include "pbd/stateful_diff_command.h"
 
+#include "gtkmm2ext/bindings.h"
+#include "gtkmm2ext/utils.h"
+#include "gtkmm2ext/tearoff.h"
+
 #include "ardour_ui.h"
 #include "actions.h"
 #include "canvas-note.h"
@@ -74,6 +76,7 @@
 #include "ardour/region_factory.h"
 #include "ardour/source_factory.h"
 #include "ardour/session.h"
+#include "ardour/operations.h"
 
 #include <bitset>
 
@@ -377,9 +380,6 @@ Editor::mouse_mode_toggled (MouseMode m)
                           show the object (region) selection.
                        */
                         
-                       for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) {
-                               (*i)->set_should_show_selection (true);
-                       }
                        for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) {
                                (*i)->hide_selection ();
                        }
@@ -735,9 +735,16 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
                        break;
 
                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);
+                               return true;
+                       }
+                       break;
+
                case LeftFrameHandle:
                case RightFrameHandle:
-                       if (!clicked_regionview->region()->locked()) {
+                       if (!internal_editing() && !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);
                                return true;
@@ -820,8 +827,7 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
                                /* click on a normal region view */
                                if (Keyboard::modifier_state_contains (event->button.state, Keyboard::CopyModifier)) {
                                        add_region_copy_drag (item, event, clicked_regionview);
-                               } 
-                               else if (Keyboard::the_keyboard().key_is_down (GDK_b)) {
+                               } else if (Keyboard::the_keyboard().key_is_down (GDK_b)) {
                                        add_region_brush_drag (item, event, clicked_regionview);
                                } else {
                                        add_region_drag (item, event, clicked_regionview);
@@ -837,7 +843,7 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
                        case RegionViewNameHighlight:
                        case LeftFrameHandle:
                         case RightFrameHandle:
-                               if (!internal_editing () && !clicked_regionview->region()->locked()) {
+                               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);
                                        return true;
@@ -1065,6 +1071,10 @@ Editor::button_press_handler_2 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
 
                switch (item_type) {
                case RegionViewNameHighlight:
+                        _drags->set (new TrimDrag (this, item, clicked_regionview, selection->regions.by_layer()), event);
+                        return true;
+                        break;
+
                 case LeftFrameHandle:
                 case RightFrameHandle:
                        if (!internal_editing ()) {
@@ -1092,7 +1102,7 @@ Editor::button_press_handler_2 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
 
        case MouseZoom:
                if (Keyboard::modifier_state_equals (event->button.state, Keyboard::PrimaryModifier)) {
-                       temporal_zoom_session();
+                       temporal_zoom_to_frame (false, event_frame (event));
                } else {
                        temporal_zoom_to_frame (true, event_frame(event));
                }
@@ -1160,6 +1170,7 @@ Editor::button_press_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemTyp
                break;
 
        default:
+                return button_press_dispatch (&event->button);
                break;
 
        }
@@ -1167,6 +1178,26 @@ Editor::button_press_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemTyp
        return false;
 }
 
+bool
+Editor::button_press_dispatch (GdkEventButton* ev)
+{
+        /* this function is intended only for buttons 4 and above.
+         */
+
+        Gtkmm2ext::MouseButton b (ev->state, ev->button);
+        return button_bindings->activate (b, Gtkmm2ext::Bindings::Press);
+}
+
+bool
+Editor::button_release_dispatch (GdkEventButton* ev)
+{
+        /* this function is intended only for buttons 4 and above.
+         */
+
+        Gtkmm2ext::MouseButton b (ev->state, ev->button);
+        return button_bindings->activate (b, Gtkmm2ext::Bindings::Release);
+}
+
 bool
 Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_type)
 {
@@ -1453,7 +1484,7 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT
                        break;
 
                case MouseAudition:
-                        set_canvas_cursor (current_canvas_cursor);
+                       set_canvas_cursor (current_canvas_cursor);
                        if (scrubbing_direction == 0) {
                                /* no drag, just a click */
                                switch (item_type) {
@@ -1580,7 +1611,7 @@ Editor::enter_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_
                break;
 
        case RegionViewNameHighlight:
-               if (is_drawable() && mouse_mode == MouseObject && !internal_editing() && entered_regionview) {
+               if (is_drawable() && mouse_mode == MouseObject && entered_regionview) {
                        set_canvas_cursor_for_region_view (event->crossing.x, entered_regionview);
                        _over_region_trim_target = true;
                }
@@ -1705,8 +1736,8 @@ Editor::enter_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_
                break;
        case FeatureLineItem:
                {
-                       ArdourCanvas::SimpleLine *line = dynamic_cast<ArdourCanvas::SimpleLine *> (item);
-                       line->property_color_rgba() = 0xFF0000FF;
+                       ArdourCanvas::Line *line = dynamic_cast<ArdourCanvas::Line *> (item);
+                       line->property_fill_color_rgba() = 0xFF0000FF;
                }
                break;
        case SelectionItem:
@@ -1865,8 +1896,8 @@ Editor::leave_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_
                break;
        case FeatureLineItem:
                {
-                       ArdourCanvas::SimpleLine *line = dynamic_cast<ArdourCanvas::SimpleLine *> (item);
-                       line->property_color_rgba() = (guint) ARDOUR_UI::config()->canvasvar_ZeroLine.get();;
+                       ArdourCanvas::Line *line = dynamic_cast<ArdourCanvas::Line *> (item);
+                       line->property_fill_color_rgba() = (guint) ARDOUR_UI::config()->canvasvar_ZeroLine.get();;
                }
                break;
 
@@ -1919,7 +1950,7 @@ Editor::scrub (framepos_t frame, double current_x)
                                scrub_reverse_distance = 0;
 
                                delta = 0.01 * (last_scrub_x - current_x);
-                               _session->request_transport_speed (_session->transport_speed() - delta);
+                               _session->request_transport_speed_nonzero (_session->transport_speed() - delta);
                        }
 
                } else {
@@ -1938,7 +1969,7 @@ Editor::scrub (framepos_t frame, double current_x)
                                scrub_reverse_distance = 0;
 
                                delta = 0.01 * (current_x - last_scrub_x);
-                               _session->request_transport_speed (_session->transport_speed() + delta);
+                               _session->request_transport_speed_nonzero (_session->transport_speed() + delta);
                        }
                }
 
@@ -2150,7 +2181,7 @@ Editor::show_verbose_time_cursor (framepos_t frame, double offset, double xpos,
 {
        char buf[128];
        Timecode::Time timecode;
-       BBT_Time bbt;
+       Timecode::BBT_Time bbt;
        int hours, mins;
        framepos_t frame_rate;
        float secs;
@@ -2207,8 +2238,8 @@ Editor::show_verbose_duration_cursor (framepos_t start, framepos_t end, double o
 {
        char buf[128];
        Timecode::Time timecode;
-       BBT_Time sbbt;
-       BBT_Time ebbt;
+       Timecode::BBT_Time sbbt;
+       Timecode::BBT_Time ebbt;
        int hours, mins;
        framepos_t distance, frame_rate;
        float secs;
@@ -2247,7 +2278,7 @@ Editor::show_verbose_duration_cursor (framepos_t start, framepos_t end, double o
                        ebbt.ticks -= sbbt.ticks;
                } else {
                        ebbt.beats--;
-                       ebbt.ticks = int(Meter::ticks_per_beat) + ebbt.ticks - sbbt.ticks;
+                       ebbt.ticks = int(Timecode::BBT_Time::ticks_per_beat) + ebbt.ticks - sbbt.ticks;
                }
 
                snprintf (buf, sizeof (buf), "%02" PRIu32 "|%02" PRIu32 "|%02" PRIu32, ebbt.bars, ebbt.beats, ebbt.ticks);
@@ -2468,7 +2499,7 @@ Editor::mouse_brush_insert_region (RegionView* rv, framepos_t pos)
        double speed = rtv->track()->speed();
 
        playlist->clear_changes ();
-       boost::shared_ptr<Region> new_region (RegionFactory::create (rv->region()));
+       boost::shared_ptr<Region> new_region (RegionFactory::create (rv->region(), true));
        playlist->add_region (new_region, (framepos_t) (pos * speed));
        _session->add_command (new StatefulDiffCommand (playlist));
 
@@ -2540,7 +2571,7 @@ Editor::add_region_brush_drag (ArdourCanvas::Item* item, GdkEvent* event, Region
        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));
 
-       begin_reversible_command (_("Drag region brush"));
+       begin_reversible_command (Operations::drag_region_brush);
 }
 
 /** Start a grab where a time range is selected, track(s) are selected, and the
@@ -2581,7 +2612,7 @@ Editor::start_selection_grab (ArdourCanvas::Item* /*item*/, GdkEvent* event)
           creating the new region and another for moving it.
        */
 
-       begin_reversible_command (_("selection grab"));
+       begin_reversible_command (Operations::selection_grab);
 
        boost::shared_ptr<Playlist> playlist = clicked_axisview->playlist();
 
@@ -2627,10 +2658,9 @@ Editor::set_internal_edit (bool yn)
                ARDOUR_UI::instance()->set_tip (mouse_select_button, _("Draw/Edit MIDI Notes"));
                mouse_mode_toggled (mouse_mode);
 
-               /* deselect everything to avoid confusion when e.g. we can't now cut a previously selected
-                  region because cut means "cut note" rather than "cut region".
-               */
-               selection->clear ();
+                for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) {
+                        (*i)->enter_internal_edit_mode ();
+                }
 
        } else {
 
@@ -2638,6 +2668,10 @@ Editor::set_internal_edit (bool yn)
                mouse_select_button.get_image ()->show ();
                ARDOUR_UI::instance()->set_tip (mouse_select_button, _("Select/Move Ranges"));
                mouse_mode_toggled (mouse_mode); // sets cursor
+
+                for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) {
+                        (*i)->leave_internal_edit_mode ();
+                }
        }
 }