summaryrefslogtreecommitdiff
path: root/gtk2_ardour/editor_mouse.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gtk2_ardour/editor_mouse.cc')
-rw-r--r--gtk2_ardour/editor_mouse.cc241
1 files changed, 67 insertions, 174 deletions
diff --git a/gtk2_ardour/editor_mouse.cc b/gtk2_ardour/editor_mouse.cc
index 19351d49e4..68899e67a2 100644
--- a/gtk2_ardour/editor_mouse.cc
+++ b/gtk2_ardour/editor_mouse.cc
@@ -259,6 +259,10 @@ Editor::set_mouse_mode (MouseMode m, bool force)
act = ActionManager::get_action (X_("MouseMode"), X_("set-mouse-mode-timefx"));
break;
+ case MouseContent:
+ act = ActionManager::get_action (X_("MouseMode"), X_("set-mouse-mode-content"));
+ break;
+
case MouseAudition:
act = ActionManager::get_action (X_("MouseMode"), X_("set-mouse-mode-audition"));
break;
@@ -307,6 +311,10 @@ Editor::mouse_mode_toggled (MouseMode m)
act = ActionManager::get_action (X_("MouseMode"), X_("set-mouse-mode-timefx"));
break;
+ case MouseContent:
+ act = ActionManager::get_action (X_("MouseMode"), X_("set-mouse-mode-content"));
+ break;
+
case MouseAudition:
act = ActionManager::get_action (X_("MouseMode"), X_("set-mouse-mode-audition"));
break;
@@ -350,6 +358,12 @@ Editor::mouse_mode_toggled (MouseMode m)
MouseModeChanged (); /* EMIT SIGNAL */
}
+bool
+Editor::internal_editing() const
+{
+ return mouse_mode == Editing::MouseContent || mouse_mode == Editing::MouseDraw;
+}
+
void
Editor::update_time_selection_display ()
{
@@ -366,7 +380,7 @@ Editor::update_time_selection_display ()
void
Editor::step_mouse_mode (bool next)
{
- const int n_mouse_modes = (int)MouseDraw + 1;
+ const int n_mouse_modes = (int)MouseContent + 1;
int current = (int)current_mouse_mode();
if (next) {
set_mouse_mode((MouseMode)((current + 1) % n_mouse_modes));
@@ -375,22 +389,6 @@ Editor::step_mouse_mode (bool next)
}
}
-bool
-Editor::toggle_internal_editing_from_double_click (GdkEvent* event)
-{
- if (_drags->active()) {
- _drags->end_grab (event);
- }
-
- ActionManager::do_action ("MouseMode", "toggle-internal-edit");
-
- /* prevent reversion of edit cursor on button release */
-
- pre_press_cursor = 0;
-
- return true;
-}
-
void
Editor::button_selection (ArdourCanvas::Item* /*item*/, GdkEvent* event, ItemType item_type)
{
@@ -439,9 +437,7 @@ Editor::button_selection (ArdourCanvas::Item* /*item*/, GdkEvent* event, ItemTyp
(mouse_mode != MouseAudition || item_type != RegionItem) &&
(mouse_mode != MouseTimeFX || item_type != RegionItem) &&
(mouse_mode != MouseDraw)) ||
- ((event->type != GDK_BUTTON_PRESS && event->type != GDK_BUTTON_RELEASE) || event->button.button > 3) ||
- (internal_editing() && mouse_mode != MouseTimeFX)) {
-
+ ((event->type != GDK_BUTTON_PRESS && event->type != GDK_BUTTON_RELEASE) || event->button.button > 3)) {
return;
}
@@ -534,6 +530,8 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
them to be modeless.
*/
+ NoteBase* note = NULL;
+
switch (item_type) {
case PlayheadCursorItem:
_drags->set (new CursorDrag (this, *playhead_cursor, true), event);
@@ -655,11 +653,6 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
}
}
- /* there is no Range mode when in internal edit mode */
- if (eff == MouseRange && internal_editing()) {
- eff = MouseObject;
- }
-
switch (eff) {
case MouseRange:
switch (item_type) {
@@ -686,19 +679,12 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
break;
case StreamItem:
- if (internal_editing()) {
- if (dynamic_cast<MidiTimeAxisView*> (clicked_axisview)) {
- _drags->set (new RegionCreateDrag (this, item, clicked_axisview), event);
- return true;
- }
+ if (Keyboard::modifier_state_equals (event->button.state, Keyboard::RangeSelectModifier)) {
+ _drags->set (new SelectionDrag (this, item, SelectionDrag::SelectionExtend), event);
} else {
- if (Keyboard::modifier_state_equals (event->button.state, Keyboard::RangeSelectModifier)) {
- _drags->set (new SelectionDrag (this, item, SelectionDrag::SelectionExtend), event);
- } else {
- _drags->set (new SelectionDrag (this, item, SelectionDrag::CreateSelection), event);
- }
- return true;
+ _drags->set (new SelectionDrag (this, item, SelectionDrag::CreateSelection), event);
}
+ return true;
break;
case RegionViewNameHighlight:
@@ -709,12 +695,10 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
break;
default:
- if (!internal_editing()) {
- if (Keyboard::modifier_state_equals (event->button.state, Keyboard::RangeSelectModifier)) {
- _drags->set (new SelectionDrag (this, item, SelectionDrag::SelectionExtend), event);
- } else {
- _drags->set (new SelectionDrag (this, item, SelectionDrag::CreateSelection), event);
- }
+ if (Keyboard::modifier_state_equals (event->button.state, Keyboard::RangeSelectModifier)) {
+ _drags->set (new SelectionDrag (this, item, SelectionDrag::SelectionExtend), event);
+ } else {
+ _drags->set (new SelectionDrag (this, item, SelectionDrag::CreateSelection), event);
}
}
return true;
@@ -740,26 +724,42 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
}
break;
- case MouseObject:
+ case MouseContent:
switch (item_type) {
case NoteItem:
/* Existing note: allow trimming/motion */
- if (internal_editing()) {
- NoteBase* cn = reinterpret_cast<NoteBase*> (item->get_data ("notebase"));
- assert (cn);
- if (cn->big_enough_to_trim() && cn->mouse_near_ends()) {
+ if ((note = reinterpret_cast<NoteBase*> (item->get_data ("notebase")))) {
+ if (note->big_enough_to_trim() && note->mouse_near_ends()) {
_drags->set (new NoteResizeDrag (this, item), event, current_canvas_cursor);
} else {
_drags->set (new NoteDrag (this, item), event);
}
+ }
+ return true;
+
+ case ControlPointItem:
+ _drags->set (new ControlPointDrag (this, item), event);
+ return true;
+ break;
+
+ case StreamItem:
+ if (dynamic_cast<MidiTimeAxisView*> (clicked_axisview)) {
+ _drags->set (new RegionCreateDrag (this, item, clicked_axisview), event);
return true;
}
break;
+ case AutomationTrackItem:
+ /* rubberband drag to select automation points */
+ _drags->set (new EditorRubberbandSelectDrag (this, item), event);
+ break;
+
default:
break;
}
+ break;
+ case MouseObject:
if (Keyboard::modifier_state_contains (event->button.state, Keyboard::ModifierMask(Keyboard::PrimaryModifier|Keyboard::SecondaryModifier)) &&
event->type == GDK_BUTTON_PRESS) {
@@ -809,10 +809,6 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
break;
}
- if (internal_editing ()) {
- break;
- }
-
/* click on a normal region view */
if (Keyboard::modifier_state_contains (event->button.state, Keyboard::CopyModifier)) {
add_region_copy_drag (item, event, clicked_regionview);
@@ -823,10 +819,6 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
}
-// if (!internal_editing() && (_join_object_range_state == JOIN_OBJECT_RANGE_RANGE && !selection->regions.empty())) {
-// _drags->add (new SelectionDrag (this, clicked_axisview->get_selection_rect (clicked_selection)->rect, SelectionDrag::SelectionMove));
-// }
-
_drags->start_grab (event);
return true;
break;
@@ -869,15 +861,8 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
break;
case StreamItem:
- if (internal_editing()) {
- if (dynamic_cast<MidiTimeAxisView*> (clicked_axisview)) {
- _drags->set (new RegionCreateDrag (this, item, clicked_axisview), event);
- }
- return true;
- } else {
- _drags->set (new EditorRubberbandSelectDrag (this, item), event);
- }
- break;
+ _drags->set (new EditorRubberbandSelectDrag (this, item), event);
+ return true;
case AutomationTrackItem:
{
@@ -961,28 +946,23 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
break;
case NoteItem:
- /* Existing note: allow trimming/motion */
- if (internal_editing()) {
- /* trim notes if we're in internal edit mode and near the ends of the note */
- NoteBase* cn = reinterpret_cast<NoteBase*>(item->get_data ("notebase"));
- assert (cn);
- if (cn->big_enough_to_trim() && cn->mouse_near_ends()) {
+ if ((note = reinterpret_cast<NoteBase*>(item->get_data ("notebase")))) {
+ if (note->big_enough_to_trim() && note->mouse_near_ends()) {
+ /* Note is big and pointer is near the end, trim */
_drags->set (new NoteResizeDrag (this, item), event, current_canvas_cursor);
} else {
+ /* Drag note */
_drags->set (new NoteDrag (this, item), event);
}
return true;
}
- break;
+ return true;
case StreamItem:
- if (internal_editing()) {
- if (dynamic_cast<MidiTimeAxisView*> (clicked_axisview)) {
- _drags->set (new RegionCreateDrag (this, item, clicked_axisview), event);
- }
- return true;
+ if (dynamic_cast<MidiTimeAxisView*> (clicked_axisview)) {
+ _drags->set (new RegionCreateDrag (this, item, clicked_axisview), event);
}
- break;
+ return true;
default:
break;
@@ -991,12 +971,12 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
break;
case MouseTimeFX:
- if (internal_editing() && item_type == NoteItem ) {
- /* drag notes if we're in internal edit mode */
- NoteBase* cn = reinterpret_cast<NoteBase*>(item->get_data ("notebase"));
- assert (cn);
- if (cn->big_enough_to_trim()) {
- _drags->set (new NoteResizeDrag (this, item), event, current_canvas_cursor);
+ if (item_type == NoteItem) {
+ /* resize-drag notes */
+ if ((note = reinterpret_cast<NoteBase*>(item->get_data ("notebase")))) {
+ if (note->big_enough_to_trim()) {
+ _drags->set (new NoteResizeDrag (this, item), event, current_canvas_cursor);
+ }
}
return true;
} else if (clicked_regionview) {
@@ -1031,11 +1011,6 @@ 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 {
@@ -1061,9 +1036,7 @@ Editor::button_press_handler_2 (ArdourCanvas::Item* item, GdkEvent* event, ItemT
case LeftFrameHandle:
case RightFrameHandle:
- if (!internal_editing ()) {
- _drags->set (new TrimDrag (this, item, clicked_regionview, selection->regions.by_layer()), event);
- }
+ _drags->set (new TrimDrag (this, item, clicked_regionview, selection->regions.by_layer()), event);
return true;
break;
@@ -1114,48 +1087,6 @@ Editor::button_press_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemTyp
return true;
}
- if (internal_editing()) {
- bool leave_internal_edit_mode = false;
-
- switch (item_type) {
- case NoteItem:
- break;
-
- case RegionItem:
- if (!dynamic_cast<MidiRegionView*> (clicked_regionview) && !dynamic_cast<AutomationRegionView*> (clicked_regionview)) {
- leave_internal_edit_mode = true;
- }
- break;
-
- case PlayheadCursorItem:
- case MarkerItem:
- case TempoMarkerItem:
- case MeterMarkerItem:
- case MarkerBarItem:
- case TempoBarItem:
- case MeterBarItem:
- case RangeMarkerBarItem:
- case CdMarkerBarItem:
- case TransportMarkerBarItem:
- case StreamItem:
- case TimecodeRulerItem:
- case SamplesRulerItem:
- case MinsecRulerItem:
- case BBTRulerItem:
- /* button press on these items never does anything to
- change the editing mode.
- */
- break;
-
- default:
- break;
- }
-
- if (leave_internal_edit_mode) {
- ActionManager::do_action ("MouseMode", "toggle-internal-edit");
- }
- }
-
button_selection (item, event, item_type);
if (!_drags->active () &&
@@ -1663,7 +1594,7 @@ Editor::enter_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_
case FadeInHandleItem:
case FadeInTrimHandleItem:
- if (mouse_mode == MouseObject && !internal_editing()) {
+ if (mouse_mode == MouseObject) {
ArdourCanvas::Rectangle *rect = dynamic_cast<ArdourCanvas::Rectangle *> (item);
if (rect) {
RegionView* rv = static_cast<RegionView*>(item->get_data ("regionview"));
@@ -1674,7 +1605,7 @@ Editor::enter_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_
case FadeOutHandleItem:
case FadeOutTrimHandleItem:
- if (mouse_mode == MouseObject && !internal_editing()) {
+ if (mouse_mode == MouseObject) {
ArdourCanvas::Rectangle *rect = dynamic_cast<ArdourCanvas::Rectangle *> (item);
if (rect) {
RegionView* rv = static_cast<RegionView*>(item->get_data ("regionview"));
@@ -2374,44 +2305,6 @@ Editor::escape ()
reset_focus ();
}
-void
-Editor::set_internal_edit (bool yn)
-{
- if (_internal_editing == yn) {
- return;
- }
-
- _internal_editing = yn;
-
- if (yn) {
- pre_internal_mouse_mode = mouse_mode;
- pre_internal_snap_type = _snap_type;
- pre_internal_snap_mode = _snap_mode;
-
- for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) {
- (*i)->enter_internal_edit_mode ();
- }
-
- set_snap_to (internal_snap_type);
- set_snap_mode (internal_snap_mode);
-
- } else {
-
- internal_snap_mode = _snap_mode;
- internal_snap_type = _snap_type;
-
- for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) {
- (*i)->leave_internal_edit_mode ();
- }
-
- set_snap_to (pre_internal_snap_type);
- set_snap_mode (pre_internal_snap_mode);
- }
-
- reset_canvas_cursor ();
- MouseModeChanged ();
-}
-
/** Update _join_object_range_state which indicate whether we are over the top
* or bottom half of a route view, used by the `join object/range' tool
* mode. Coordinates in canvas space.
@@ -2419,7 +2312,7 @@ Editor::set_internal_edit (bool yn)
void
Editor::update_join_object_range_location (double y)
{
- if (_internal_editing || !get_smart_mode()) {
+ if (!get_smart_mode()) {
_join_object_range_state = JOIN_OBJECT_RANGE_NONE;
return;
}