alpha3 rename
[ardour.git] / gtk2_ardour / editor_mouse.cc
index 9e6d3922fe47fe6ef3a7c855639a35b3da33db27..9c1b764985e4e840b9807795bfb796cd03fa593a 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"
@@ -503,8 +505,6 @@ Editor::button_selection (ArdourCanvas::Item* /*item*/, GdkEvent* event, ItemTyp
        Selection::Operation op = ArdourKeyboard::selection_type (event->button.state);
        bool press = (event->type == GDK_BUTTON_PRESS);
 
-       // begin_reversible_command (_("select on click"));
-
        switch (item_type) {
        case RegionItem:
                if (mouse_mode != MouseRange || _join_object_range_state == JOIN_OBJECT_RANGE_OBJECT) {
@@ -711,8 +711,7 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
                        if (internal_editing()) {
                                /* trim notes if we're in internal edit mode and near the ends of the note */
                                ArdourCanvas::CanvasNote* cn = dynamic_cast<ArdourCanvas::CanvasNote*> (item);
-                               cerr << "NoteItem button press, cursor = " << current_canvas_cursor << endl;
-                               if (cn->mouse_near_ends()) {
+                               if (cn->big_enough_to_trim() && cn->mouse_near_ends()) {
                                        _drags->set (new NoteResizeDrag (this, item), event, current_canvas_cursor);
                                } else {
                                        _drags->set (new NoteDrag (this, item), event);
@@ -1050,6 +1049,11 @@ Editor::button_press_handler_2 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
        case MouseObject:
                switch (item_type) {
                case RegionItem:
+                       if (internal_editing ()) {
+                               /* no region drags in internal edit mode */
+                               return false;
+                       }
+                       
                        if (Keyboard::modifier_state_contains (event->button.state, Keyboard::CopyModifier)) {
                                add_region_copy_drag (item, event, clicked_regionview);
                        } else {
@@ -1168,6 +1172,7 @@ Editor::button_press_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemTyp
                break;
 
        default:
+                return button_press_dispatch (&event->button);
                break;
 
        }
@@ -1175,6 +1180,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)
 {
@@ -1479,9 +1504,11 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT
 
                default:
                        break;
-
+                        
                }
 
+                /* do any (de)selection operations that should occur on button release */
+                button_selection (item, event, item_type);
                return true;
                break;
 
@@ -1526,6 +1553,7 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT
        default:
                break;
        }
+
        return false;
 }
 
@@ -2635,6 +2663,8 @@ Editor::set_internal_edit (bool yn)
                ARDOUR_UI::instance()->set_tip (mouse_select_button, _("Draw/Edit MIDI Notes"));
                mouse_mode_toggled (mouse_mode);
 
+                pre_internal_mouse_mode = mouse_mode;
+
                 for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) {
                         (*i)->enter_internal_edit_mode ();
                 }
@@ -2649,6 +2679,11 @@ Editor::set_internal_edit (bool yn)
                 for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) {
                         (*i)->leave_internal_edit_mode ();
                 }
+
+                if (mouse_mode == MouseRange && pre_internal_mouse_mode != MouseRange) {
+                        /* we were drawing .. flip back to something sensible */
+                        set_mouse_mode (pre_internal_mouse_mode);
+                }
        }
 }