39 #include "canvas/canvas.h"
99 if (!within_track_canvas) {
104 Glib::RefPtr<Gdk::Window> canvas_window =
const_cast<Editor*
>(
this)->_track_canvas->get_window();
106 if (!canvas_window) {
110 Glib::RefPtr<const Gdk::Window> pointer_window = Gdk::Display::get_default()->get_window_at_pointer (x, y);
112 if (!pointer_window) {
116 if (pointer_window != canvas_window) {
117 in_track_canvas =
false;
121 in_track_canvas =
true;
124 event.type = GDK_BUTTON_RELEASE;
128 where = window_event_sample (&event, 0, 0);
136 ArdourCanvas::Duple d;
138 if (!gdk_event_get_coords (event, &d.x, &d.y)) {
145 d = _track_canvas->window_to_canvas (d);
155 return pixel_to_sample (d.x);
166 if (!gdk_event_get_coords (event, &x, &y)) {
167 cerr <<
"!NO c COORDS for event type " <<
event->type << endl;
184 return pixel_to_sample_from_event (x);
192 if (!st || st == t) {
202 if (!sm || sm != m) {
214 Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic (act);
217 set_mouse_mode(m,
true);
220 static Glib::RefPtr<Action>
239 return Glib::RefPtr<Action>();
245 if (_drags->active ()) {
249 if (!force && m == mouse_mode) {
254 if ( m == MouseCut) m = MouseObject;
258 Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
261 tact->set_active (
false);
262 tact->set_active (
true);
271 if ( m == MouseCut) m = MouseObject;
275 Glib::RefPtr<ToggleAction> tact = Glib::RefPtr<ToggleAction>::cast_dynamic(act);
277 if (!tact->get_active()) {
285 if (_session && mouse_mode == MouseAudition) {
288 _session->request_transport_speed (0.0,
true);
291 const bool was_internal = internal_editing();
298 if (!was_internal && internal_editing()) {
299 snap_type_action(internal_snap_type)->set_active(
true);
300 snap_mode_action(internal_snap_mode)->set_active(
true);
301 }
else if (was_internal && !internal_editing()) {
302 snap_type_action(pre_internal_snap_type)->set_active(
true);
303 snap_mode_action(pre_internal_snap_mode)->set_active(
true);
313 _track_canvas->re_enter ();
316 set_gain_envelope_visibility ();
318 update_time_selection_display ();
320 update_all_enter_cursors ();
328 return mouse_mode == Editing::MouseContent || mouse_mode == Editing::MouseDraw;
334 switch (mouse_mode) {
336 selection->clear_objects ();
337 selection->ClearMidiNoteSelection ();
340 selection->clear_time ();
341 selection->clear_tracks ();
342 selection->ClearMidiNoteSelection ();
348 selection->clear_regions ();
349 selection->clear_playlists ();
355 selection->clear_regions();
356 selection->clear_lines();
357 selection->clear_playlists ();
359 selection->clear_time ();
360 selection->clear_tracks ();
365 selection->clear_points ();
366 selection->clear_lines();
367 selection->clear_playlists ();
369 selection->clear_time ();
370 selection->clear_tracks ();
375 selection->clear_regions ();
376 selection->clear_playlists ();
377 selection->clear_time ();
378 selection->clear_tracks ();
383 selection->clear_objects();
384 selection->clear_time ();
385 selection->clear_tracks ();
393 const int n_mouse_modes = (int)MouseContent + 1;
394 int current = (int)current_mouse_mode();
396 set_mouse_mode((
MouseMode)((current + 1) % n_mouse_modes));
398 set_mouse_mode((
MouseMode)((current + n_mouse_modes - 1) % n_mouse_modes));
418 MouseMode eff_mouse_mode = effective_mouse_mode ();
420 if (eff_mouse_mode == MouseCut) {
425 if (get_smart_mode() && eff_mouse_mode == MouseRange && event->button.button == 3 && item_type ==
RegionItem) {
429 eff_mouse_mode = MouseObject;
433 if (get_smart_mode()) {
439 eff_mouse_mode = MouseObject;
446 if (((mouse_mode != MouseObject) &&
447 (mouse_mode != MouseAudition || item_type !=
RegionItem) &&
448 (mouse_mode != MouseTimeFX || item_type !=
RegionItem) &&
449 (mouse_mode != MouseDraw)) ||
450 ((event->type != GDK_BUTTON_PRESS && event->type != GDK_BUTTON_RELEASE) || event->button.button > 3)) {
454 if (event->type == GDK_BUTTON_PRESS || event->type == GDK_BUTTON_RELEASE) {
456 if ((event->button.state & Keyboard::RelevantModifierKeyMask) && event->button.button != 1) {
460 if (item_type !=
RegionItem && event->button.button != 2) {
467 bool press = (
event->type == GDK_BUTTON_PRESS);
470 _mouse_changed_selection =
false;
476 if (eff_mouse_mode != MouseRange) {
477 _mouse_changed_selection = set_selected_regionview_from_click (press, op);
484 if (!selection->selected (clicked_axisview)) {
489 if (eff_mouse_mode != MouseRange) {
490 _mouse_changed_selection |= set_selected_regionview_from_click (press, op);
507 if (get_smart_mode() || eff_mouse_mode != MouseRange) {
508 _mouse_changed_selection |= set_selected_regionview_from_click (press, op);
509 }
else if (event->type == GDK_BUTTON_PRESS) {
510 set_selected_track_as_side_effect (op);
515 set_selected_track_as_side_effect (op);
516 if (eff_mouse_mode != MouseRange) {
517 _mouse_changed_selection |= set_selected_control_point_from_click (press, op);
523 if (event->button.button == 3) {
524 selection->clear_tracks ();
525 set_selected_track_as_side_effect (op);
528 begin_reversible_selection_op (
X_(
"Button 3 Menu Select"));
529 commit_reversible_selection_op ();
534 set_selected_track_as_side_effect (op);
541 if ((!press) && _mouse_changed_selection) {
542 begin_reversible_selection_op (
X_(
"Button Selection"));
543 commit_reversible_selection_op ();
544 _mouse_changed_selection =
false;
561 _drags->set (
new CursorDrag (
this, *playhead_cursor,
true), event);
565 if (Keyboard::modifier_state_equals (event->button.state, Keyboard::ModifierMask(Keyboard::PrimaryModifier|Keyboard::TertiaryModifier))) {
566 hide_marker (item, event);
568 _drags->set (
new MarkerDrag (
this, item), event);
578 Keyboard::modifier_state_contains (event->button.state, Keyboard::CopyModifier)
591 Keyboard::modifier_state_contains (event->button.state, Keyboard::CopyModifier)
610 if (!Keyboard::modifier_state_equals (event->button.state, Keyboard::PrimaryModifier)) {
611 _drags->set (
new CursorDrag (
this, *playhead_cursor,
false), event);
618 if (Keyboard::modifier_state_contains (event->button.state, Keyboard::TertiaryModifier)) {
620 }
else if (Keyboard::modifier_state_equals (event->button.state, Keyboard::PrimaryModifier)) {
623 _drags->set (
new CursorDrag (
this, *playhead_cursor,
false), event);
629 if (!Keyboard::modifier_state_equals (event->button.state, Keyboard::PrimaryModifier)) {
630 _drags->set (
new CursorDrag (
this, *playhead_cursor,
false), event);
638 if (!Keyboard::modifier_state_equals (event->button.state, Keyboard::PrimaryModifier)) {
639 _drags->set (
new CursorDrag (
this, *playhead_cursor,
false), event);
650 if (_join_object_range_state == JOIN_OBJECT_RANGE_OBJECT) {
667 if (get_smart_mode()) {
692 if (Keyboard::modifier_state_contains (event->button.state, Keyboard::ModifierMask(Keyboard::PrimaryModifier|Keyboard::SecondaryModifier))) {
693 start_selection_grab (item, event);
695 }
else if (Keyboard::modifier_state_equals (event->button.state, Keyboard::SecondaryModifier)) {
706 if (Keyboard::modifier_state_equals (event->button.state, Keyboard::RangeSelectModifier)) {
715 if (!clicked_regionview->region()->locked()) {
716 _drags->set (
new TrimDrag (
this, item, clicked_regionview, selection->regions.by_layer()), event);
722 if (Keyboard::modifier_state_equals (event->button.state, Keyboard::RangeSelectModifier)) {
743 _drags->set (
new RegionCutDrag (
this, item, canvas_event_sample (event)), event, get_canvas_cursor());
755 if ((note = reinterpret_cast<NoteBase*> (item->get_data (
"notebase")))) {
757 _drags->set (
new NoteResizeDrag (
this, item), event, get_canvas_cursor());
759 _drags->set (
new NoteDrag (
this, item), event);
780 if (dynamic_cast<AutomationRegionView*>(clicked_regionview)) {
793 if (Keyboard::modifier_state_contains (event->button.state, Keyboard::ModifierMask(Keyboard::PrimaryModifier|Keyboard::SecondaryModifier)) &&
794 event->type == GDK_BUTTON_PRESS) {
798 }
else if (event->type == GDK_BUTTON_PRESS) {
803 _drags->set (
new FadeInDrag (
this, item, reinterpret_cast<RegionView*> (item->get_data(
"regionview")), selection->regions), event, _cursors->fade_in);
809 _drags->set (
new FadeOutDrag (
this, item, reinterpret_cast<RegionView*> (item->get_data(
"regionview")), selection->regions), event, _cursors->fade_out);
824 if (Keyboard::modifier_state_contains (event->button.state, Keyboard::TertiaryModifier)) {
825 remove_transient(item);
835 if (dynamic_cast<AutomationRegionView*> (clicked_regionview)) {
843 if (Keyboard::modifier_state_contains (event->button.state, Keyboard::CopyModifier)) {
844 add_region_copy_drag (item, event, clicked_regionview);
845 }
else if (Keyboard::the_keyboard().key_is_down (GDK_b)) {
846 add_region_brush_drag (item, event, clicked_regionview);
848 add_region_drag (item, event, clicked_regionview);
852 _drags->start_grab (event);
859 if (!clicked_regionview->region()->locked()) {
860 _drags->set (
new TrimDrag (
this, item, clicked_regionview, selection->regions.by_layer()), event);
867 if (!clicked_regionview->region()->locked()) {
868 _drags->set (
new TrimDrag (
this, item, clicked_regionview, selection->regions.by_layer(),
true), event);
876 if (clicked_regionview->get_name_highlight()) {
877 _drags->set (
new TrimDrag (
this, clicked_regionview->get_name_highlight(), clicked_regionview, selection->regions.by_layer()), event);
889 _drags->set (
new LineDrag (
this, item), event);
902 if (parent && dynamic_cast<MidiTimeAxisView*> (parent) && atv->
show_regions ()) {
912 framepos_t const t = canvas_event_sample (event);
946 _drags->set (
new LineDrag (
this, item), event);
956 if (dynamic_cast<AudioRegionView*>(clicked_regionview) ||
957 dynamic_cast<AutomationRegionView*>(clicked_regionview)) {
959 event, _cursors->up_down);
961 double const y =
event->button.y;
962 pair<TimeAxisView*, int> tvp = trackview_by_y_position (y,
false);
967 _drags->set (
new AutomationRangeDrag (
this, atv, selection->time), event, _cursors->up_down);
976 _drags->set (
new LineDrag (
this, item), event);
980 if ((note = reinterpret_cast<NoteBase*>(item->get_data (
"notebase")))) {
983 _drags->set (
new NoteResizeDrag (
this, item), event, get_canvas_cursor());
986 _drags->set (
new NoteDrag (
this, item), event);
993 if (dynamic_cast<MidiTimeAxisView*> (clicked_axisview)) {
1007 if ((note = reinterpret_cast<NoteBase*>(item->get_data (
"notebase")))) {
1009 _drags->set (
new NoteResizeDrag (
this, item), event, get_canvas_cursor());
1013 }
else if (clicked_regionview) {
1015 _drags->set (
new TimeFXDrag (
this, item, clicked_regionview, selection->regions.by_layer()), event);
1021 _drags->set (
new ScrubDrag (
this, item), event, _cursors->transparent);
1022 scrub_reversals = 0;
1023 scrub_reverse_distance = 0;
1024 last_scrub_x =
event->button.x;
1025 scrubbing_direction = 0;
1042 switch (item_type) {
1044 if (Keyboard::modifier_state_contains (event->button.state, Keyboard::CopyModifier)) {
1045 add_region_copy_drag (item, event, clicked_regionview);
1047 add_region_drag (item, event, clicked_regionview);
1049 _drags->start_grab (event);
1061 switch (item_type) {
1063 _drags->set (
new TrimDrag (
this, item, clicked_regionview, selection->regions.by_layer()), event);
1069 _drags->set (
new TrimDrag (
this, item, clicked_regionview, selection->regions.by_layer()), event);
1074 _drags->set (
new TrimDrag (
this, clicked_regionview->get_name_highlight(), clicked_regionview, selection->regions.by_layer()), event);
1102 if (event->type == GDK_2BUTTON_PRESS) {
1103 _drags->mark_double_click ();
1104 gdk_pointer_ungrab (GDK_CURRENT_TIME);
1108 if (event->type != GDK_BUTTON_PRESS) {
1112 _track_canvas->grab_focus();
1114 if (_session && _session->actively_recording()) {
1118 button_selection (item, event, item_type);
1120 if (!_drags->active () &&
1121 (Keyboard::is_delete_event (&event->button) ||
1122 Keyboard::is_context_menu_event (&event->button) ||
1123 Keyboard::is_edit_event (&event->button))) {
1130 if ( !_drags->active () && !_session->transport_rolling() && ( effective_mouse_mode() == MouseRange ) &&
ARDOUR_UI::config()->get_follow_edits() ) {
1131 framepos_t where = canvas_event_sample (event);
1133 _session->request_locate (where,
false);
1136 switch (event->button.button) {
1138 return button_press_handler_1 (item, event, item_type);
1142 return button_press_handler_2 (item, event, item_type);
1149 return button_press_dispatch (&event->button);
1180 framepos_t where = canvas_event_sample (event);
1183 _press_cursor_ctx.reset();
1187 if (_session && _session->actively_recording()) {
1191 bool were_dragging =
false;
1193 if (!Keyboard::is_context_menu_event (&event->button)) {
1197 if (_drags->active ()) {
1198 bool const r = _drags->end_grab (event);
1204 were_dragging =
true;
1207 update_region_layering_order_editor ();
1212 if (!_drags->active () && Keyboard::is_edit_event (&event->button)) {
1213 switch (item_type) {
1215 show_region_properties ();
1222 if ((marker = reinterpret_cast<Marker *> (item->get_data (
"marker"))) == 0) {
1223 fatal <<
_(
"programming error: tempo marker canvas item has no marker object pointer!") <<
endmsg;
1227 if ((tempo_marker = dynamic_cast<TempoMarker*> (marker)) == 0) {
1228 fatal <<
_(
"programming error: marker for tempo is not a tempo marker!") <<
endmsg;
1232 edit_tempo_marker (*tempo_marker);
1240 if ((marker = reinterpret_cast<Marker *> (item->get_data (
"marker"))) == 0) {
1241 fatal <<
_(
"programming error: tempo marker canvas item has no marker object pointer!") <<
endmsg;
1245 if ((meter_marker = dynamic_cast<MeterMarker*> (marker)) == 0) {
1246 fatal <<
_(
"programming error: marker for meter is not a meter marker!") <<
endmsg;
1249 edit_meter_marker (*meter_marker);
1254 if (clicked_regionview->name_active()) {
1255 return mouse_rename_region (item, event);
1260 edit_control_point (item);
1270 if (Keyboard::is_context_menu_event (&event->button)) {
1272 context_click_event = *event;
1274 if (!_drags->active ()) {
1280 switch (item_type) {
1285 popup_xfade_in_context_menu (1, event->button.time, item, item_type);
1292 popup_xfade_out_context_menu (1, event->button.time, item, item_type);
1300 popup_track_context_menu (1, event->button.time, item_type,
false);
1306 popup_track_context_menu (1, event->button.time, item_type,
false);
1310 popup_track_context_menu (1, event->button.time, item_type,
true);
1314 popup_track_context_menu (1, event->button.time, item_type,
false);
1328 popup_ruler_menu (where, item_type);
1332 marker_context_menu (&event->button, item);
1336 tempo_or_meter_marker_context_menu (&event->button, item);
1340 tempo_or_meter_marker_context_menu (&event->button, item);
1344 popup_track_context_menu (1, event->button.time, item_type,
false);
1348 popup_control_point_context_menu (item, event);
1352 if (internal_editing()) {
1353 popup_note_context_menu (item, event);
1369 if (!_drags->active () && Keyboard::is_delete_event (&event->button)) {
1371 switch (item_type) {
1373 remove_tempo_marker (item);
1377 remove_meter_marker (item);
1381 remove_marker (*item, event);
1385 if (eff == MouseObject) {
1386 remove_clicked_region ();
1391 remove_control_point (item);
1395 remove_midi_note (item, event);
1404 switch (event->button.button) {
1407 switch (item_type) {
1418 if (!_dragging_playhead) {
1419 snap_to_with_modifier (where, event,
RoundNearest,
true);
1420 mouse_add_new_marker (where);
1425 if (!_dragging_playhead) {
1427 snap_to_with_modifier (where, event,
RoundNearest,
true);
1428 mouse_add_new_marker (where,
true);
1433 if (!_dragging_playhead) {
1434 snap_to_with_modifier (where, event);
1435 mouse_add_new_tempo_event (where);
1440 if (!_dragging_playhead) {
1441 mouse_add_new_meter_event (pixel_to_sample (event->button.x));
1459 switch (item_type) {
1467 if (!were_dragging && arv) {
1468 bool with_guard_points = Keyboard::modifier_state_equals (event->button.state, Keyboard::PrimaryModifier);
1476 bool with_guard_points = Keyboard::modifier_state_equals (event->button.state, Keyboard::PrimaryModifier);
1490 if (scrubbing_direction == 0) {
1492 switch (item_type) {
1494 play_selected_region ();
1499 }
else if (_session) {
1501 _session->request_transport_speed (0.0);
1511 button_selection (item, event, item_type);
1521 switch (item_type) {
1523 if (Keyboard::modifier_state_equals (event->button.state, Keyboard::TertiaryModifier)) {
1525 }
else if (Keyboard::modifier_state_equals (event->button.state, Keyboard::ModifierMask (Keyboard::TertiaryModifier|Keyboard::SecondaryModifier))) {
1578 choose_canvas_cursor_on_entry (item_type);
1580 switch (item_type) {
1582 if (mouse_mode == MouseDraw || mouse_mode == MouseObject) {
1583 cp =
static_cast<ControlPoint*
>(item->get_data (
"control_point"));
1589 _verbose_cursor->show ();
1594 if (mouse_mode == MouseDraw) {
1595 ArdourCanvas::Line *line =
dynamic_cast<ArdourCanvas::Line *
> (item);
1603 if (mouse_mode == MouseDraw || mouse_mode == MouseObject) {
1604 ArdourCanvas::Line *line =
dynamic_cast<ArdourCanvas::Line *
> (item);
1613 if ((atv = static_cast<AutomationTimeAxisView*>(item->get_data (
"trackview"))) != 0) {
1614 clear_entered_track =
false;
1615 set_entered_track (atv);
1620 if ((marker = static_cast<Marker *> (item->get_data (
"marker"))) == 0) {
1623 entered_marker = marker;
1632 if (mouse_mode == MouseObject) {
1633 ArdourCanvas::Rectangle *rect =
dynamic_cast<ArdourCanvas::Rectangle *
> (item);
1643 if (mouse_mode == MouseObject) {
1644 ArdourCanvas::Rectangle *rect =
dynamic_cast<ArdourCanvas::Rectangle *
> (item);
1654 ArdourCanvas::Line *line =
dynamic_cast<ArdourCanvas::Line *
> (item);
1655 line->set_outline_color (0xFF0000FF);
1669 switch (item_type) {
1674 clear_entered_track =
false;
1698 if (!_enter_stack.empty()) {
1699 _enter_stack.pop_back();
1702 switch (item_type) {
1704 _verbose_cursor->hide ();
1709 al =
reinterpret_cast<AutomationLine*
> (item->get_data (
"line"));
1711 ArdourCanvas::Line *line =
dynamic_cast<ArdourCanvas::Line *
> (item);
1719 if ((marker = static_cast<Marker *> (item->get_data (
"marker"))) == 0) {
1723 if ((loc = find_location_from_marker (marker, is_start)) != 0) {
1724 location_flags_changed (loc);
1736 ArdourCanvas::Rectangle *rect =
dynamic_cast<ArdourCanvas::Rectangle *
> (item);
1748 ArdourCanvas::Line *line =
dynamic_cast<ArdourCanvas::Line *
> (item);
1765 if (scrubbing_direction == 0) {
1767 _session->request_locate (frame,
false);
1768 _session->request_transport_speed (0.1);
1769 scrubbing_direction = 1;
1773 if (last_scrub_x > current_x) {
1777 if (scrubbing_direction > 0) {
1782 scrub_reverse_distance += (int) (last_scrub_x - current_x);
1788 scrub_reversals = 0;
1789 scrub_reverse_distance = 0;
1791 delta = 0.01 * (last_scrub_x - current_x);
1792 _session->request_transport_speed_nonzero (_session->transport_speed() - delta);
1798 if (scrubbing_direction < 0) {
1802 scrub_reverse_distance += (int) (current_x - last_scrub_x);
1807 scrub_reversals = 0;
1808 scrub_reverse_distance = 0;
1810 delta = 0.01 * (current_x - last_scrub_x);
1811 _session->request_transport_speed_nonzero (_session->transport_speed() + delta);
1819 if (scrub_reversals >= 2 || scrub_reverse_distance > 10) {
1821 if (scrubbing_direction > 0) {
1823 _session->request_transport_speed (-0.1);
1824 scrubbing_direction = -1;
1827 _session->request_transport_speed (0.1);
1828 scrubbing_direction = 1;
1831 scrub_reverse_distance = 0;
1832 scrub_reversals = 0;
1836 last_scrub_x = current_x;
1842 _last_motion_y =
event->motion.y;
1844 if (event->motion.is_hint) {
1856 _track_canvas->get_pointer (x, y);
1859 if (current_stepping_trackview) {
1861 current_stepping_trackview = 0;
1862 step_timeout.disconnect ();
1865 if (_session && _session->actively_recording()) {
1870 update_join_object_range_location (event->motion.y);
1872 if (_drags->active ()) {
1873 return _drags->motion_handler (event, from_autoscroll);
1884 if ((control_point = reinterpret_cast<ControlPoint *> (item->get_data (
"control_point"))) == 0) {
1885 fatal <<
_(
"programming error: control point canvas item has no control point object pointer!") <<
endmsg;
1890 if (dynamic_cast<AudioRegionGainLine*> (&line)) {
1903 if (!can_remove_control_point (item)) {
1909 if ((control_point = reinterpret_cast<ControlPoint *> (item->get_data (
"control_point"))) == 0) {
1910 fatal <<
_(
"programming error: control point canvas item has no control point object pointer!") <<
endmsg;
1923 fatal <<
_(
"programming error: control point canvas item has no control point object pointer!") <<
endmsg;
1929 if (d.run () != RESPONSE_ACCEPT) {
1964 for (TrackViewList::const_iterator i = track_views.begin(); i != track_views.end(); ++i) {
1970 if (*high < rtv->order()) {
1971 *high = rtv->
order ();
1974 if (*low > rtv->
order()) {
1975 *low = rtv->
order ();
1988 if (Keyboard::modifier_state_contains (event->state, Keyboard::PrimaryModifier)) {
1996 framepos_t where = get_preferred_edit_position();
2000 if (Keyboard::modifier_state_equals (event->state, Keyboard::ModifierMask (Keyboard::PrimaryModifier|Keyboard::SecondaryModifier))) {
2004 }
else if (Keyboard::modifier_state_equals (event->state, Keyboard::ModifierMask (Keyboard::PrimaryModifier|Keyboard::TertiaryModifier))) {
2019 latest_regionviews.push_back (rv);
2026 latest_regionviews.push_back (rv);
2032 for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) {
2033 (*i)->hide_selection ();
2036 selection->clear ();
2037 clicked_selection = 0;
2043 for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) {
2044 (*i)->hide_selection ();
2046 selection->time.clear ();
2047 clicked_selection = 0;
2056 switch (event->button.button) {
2058 begin_reversible_command (
_(
"start point trim"));
2060 if (selection->selected (rv)) {
2061 for (list<RegionView*>::const_iterator i = selection->regions.by_layer().begin();
2062 i != selection->regions.by_layer().end(); ++i)
2064 if (!(*i)->region()->locked()) {
2065 (*i)->region()->clear_changes ();
2066 (*i)->region()->trim_front (new_bound);
2079 commit_reversible_command();
2083 begin_reversible_command (
_(
"End point trim"));
2085 if (selection->selected (rv)) {
2087 for (list<RegionView*>::const_iterator i = selection->regions.by_layer().begin(); i != selection->regions.by_layer().end(); ++i)
2089 if (!(*i)->region()->locked()) {
2090 (*i)->region()->clear_changes();
2091 (*i)->region()->trim_end (new_bound);
2105 commit_reversible_command();
2119 if ((marker = static_cast<Marker *> (item->get_data (
"marker"))) == 0) {
2120 fatal <<
_(
"programming error: marker canvas item has no marker object pointer!") <<
endmsg;
2124 Location* location = find_location_from_marker (marker, is_start);
2137 prompter.add_button (
_(
"Rename"), Gtk::RESPONSE_ACCEPT);
2138 prompter.set_response_sensitive (Gtk::RESPONSE_ACCEPT,
false);
2139 prompter.show_all ();
2140 switch (prompter.run ()) {
2141 case Gtk::RESPONSE_ACCEPT:
2145 clicked_regionview->region()->set_name (str);
2158 switch (_snap_mode) {
2165 switch (_snap_type) {
2181 if (rtv == 0 || !rtv->
is_track()) {
2202 current_stepping_trackview = 0;
2211 assert (region_view);
2217 switch (
Config->get_edit_mode()) {
2219 _drags->add (
new RegionSpliceDrag (
this, item, region_view, selection->regions.by_layer()));
2222 _drags->add (
new RegionRippleDrag (
this, item, region_view, selection->regions.by_layer()));
2225 _drags->add (
new RegionMoveDrag (
this, item, region_view, selection->regions.by_layer(),
false,
false));
2234 assert (region_view);
2240 _drags->add (
new RegionMoveDrag (
this, item, region_view, selection->regions.by_layer(),
false,
true));
2246 assert (region_view);
2256 _drags->add (
new RegionMoveDrag (
this, item, region_view, selection->regions.by_layer(),
true,
false));
2268 if (clicked_regionview == 0) {
2274 vector<boost::shared_ptr<Region> > new_regions;
2275 create_region_from_selection (new_regions);
2277 if (new_regions.empty()) {
2292 latest_regionviews.clear();
2304 clicked_routeview->playlist()->add_region (region, selection->time[clicked_selection].start);
2309 if (latest_regionviews.empty()) {
2318 selection->set (latest_regionviews);
2320 commit_reversible_command ();
2322 _drags->set (
new RegionMoveDrag (
this, latest_regionviews.front()->get_canvas_group(), latest_regionviews.front(), latest_regionviews,
false,
false), event);
2328 if (_drags->active ()) {
2331 selection->clear ();
2344 if (!get_smart_mode()) {
2345 _join_object_range_state = JOIN_OBJECT_RANGE_NONE;
2351 if (mouse_mode == MouseObject) {
2352 _join_object_range_state = JOIN_OBJECT_RANGE_OBJECT;
2353 }
else if (mouse_mode == MouseRange) {
2354 _join_object_range_state = JOIN_OBJECT_RANGE_RANGE;
2357 if (entered_regionview) {
2359 ArdourCanvas::Duple
const item_space = entered_regionview->get_canvas_group()->canvas_to_item (ArdourCanvas::Duple (0, y));
2360 double const c = item_space.y / entered_regionview->height();
2362 _join_object_range_state = c <= 0.5 ? JOIN_OBJECT_RANGE_RANGE : JOIN_OBJECT_RANGE_OBJECT;
2365 if (_join_object_range_state != old && ctx) {
2369 }
else if (entered_track) {
2373 if (entered_route_view) {
2384 double const c = cy / track_height;
2388 _join_object_range_state = JOIN_OBJECT_RANGE_RANGE;
2390 _join_object_range_state = JOIN_OBJECT_RANGE_OBJECT;
2395 _join_object_range_state = JOIN_OBJECT_RANGE_OBJECT;
2399 if (_join_object_range_state != old && ctx) {
2408 if (_join_object_range_state == JOIN_OBJECT_RANGE_OBJECT) {
2410 }
else if (_join_object_range_state == JOIN_OBJECT_RANGE_RANGE) {
2431 _track_canvas->get_pointer (px, py);
2432 _track_canvas->window_to_canvas (px, py, x, y);
void change(Gdk::Cursor *cursor)
uint32_t get_line_color() const
boost::shared_ptr< ARDOUR::Playlist > playlist() const
LIBPBD_API Transmitter fatal
void modify_point_y(ControlPoint &, double)
TimeAxisView & get_time_axis_view() const
void trim_front(framepos_t new_position)
void scrub(framepos_t, double)
bool button_press_handler_2(ArdourCanvas::Item *, GdkEvent *, ItemType)
TimeAxisView * get_parent()
void mouse_mode_toggled(Editing::MouseMode m)
void add_region_drag(ArdourCanvas::Item *, GdkEvent *, RegionView *)
void set_current_movable(boost::shared_ptr< ARDOUR::Movable >)
void start_selection_grab(ArdourCanvas::Item *, GdkEvent *)
gint track_height_step_timeout()
void remove_control_point(ArdourCanvas::Item *)
void update_time_selection_display()
LIBARDOUR_API GQuark selection_grab
void button_selection(ArdourCanvas::Item *item, GdkEvent *event, ItemType item_type)
framepos_t canvas_event_sample(GdkEvent const *, double *px=0, double *py=0) const
AutomationLine & line() const
framepos_t window_event_sample(GdkEvent const *, double *px=0, double *py=0) const
void step_mouse_mode(bool next)
LIBGTKMM2EXT_API Glib::RefPtr< Gtk::Action > get_action(const char *group, const char *name)
void update_join_object_range_location(double)
void hide_marker(ArdourCanvas::Item *, GdkEvent *)
void set_current_trimmable(boost::shared_ptr< ARDOUR::Trimmable >)
Editing::MouseMode effective_mouse_mode() const
std::ostream & endmsg(std::ostream &ostr)
StreamView * view() const
void edit_notes(MidiRegionView *)
bool mouse_frame(framepos_t &, bool &in_track_canvas) const
void set_initial_text(std::string txt)
bool motion_handler(ArdourCanvas::Item *, GdkEvent *, bool from_autoscroll=false)
void region_view_item_click(AudioRegionView &, GdkEventButton *)
gint mouse_rename_region(ArdourCanvas::Item *, GdkEvent *)
LIBARDOUR_API GQuark drag_region_brush
Selection selection() const
LIBARDOUR_API microseconds_t get_microseconds()
void trim_end(framepos_t new_position)
bool leave_handler(ArdourCanvas::Item *, GdkEvent *, ItemType)
MidiRegionView & region_view() const
LIBGTKMM2EXT_API uint64_t Keyboard
void add_region(boost::shared_ptr< Region >, framepos_t position, float times=1, bool auto_partition=false)
static Glib::RefPtr< Action > get_mouse_mode_action(MouseMode m)
virtual void remove_point(ControlPoint &)
LIBARDOUR_API RCConfiguration * Config
boost::shared_ptr< Region > find_next_region(framepos_t frame, RegionPoint point, int dir)
void point_trim(GdkEvent *, framepos_t)
boost::shared_ptr< ARDOUR::Region > region() const
void set_prompt(std::string prompt)
void remove_midi_note(ArdourCanvas::Item *, GdkEvent *)
bool enter_handler(ArdourCanvas::Item *, GdkEvent *, ItemType)
void add_gain_point_event(ArdourCanvas::Item *item, GdkEvent *event, bool with_guard_points)
void set_color_rgba(uint32_t rgba)
ArdourCanvas::Container * canvas_display()
void delete_note(boost::shared_ptr< NoteType >)
virtual std::string get_verbose_cursor_string(double) const
bool show_regions() const
void visible_order_range(int *, int *) const
bool button_release_handler(ArdourCanvas::Item *, GdkEvent *, ItemType)
boost::shared_ptr< ARDOUR::Track > track() const
bool internal_editing() const
boost::shared_ptr< Playlist > playlist()
bool button_press_handler(ArdourCanvas::Item *, GdkEvent *, ItemType)
void mouse_brush_insert_region(RegionView *, framepos_t pos)
uint32_t get_fill_color() const
bool can_remove_control_point(ArdourCanvas::Item *)
LIBARDOUR_API RuntimeProfile * Profile
void get_result(std::string &str, bool strip=true)
bool button_press_dispatch(GdkEventButton *)
framepos_t position() const
bool button_press_handler_1(ArdourCanvas::Item *, GdkEvent *, ItemType)
double get_y_fraction() const
bool is_last_point(ControlPoint &)
const boost::shared_ptr< NoteType > note() const
uint32_t n_regions() const
void cancel_time_selection()
std::set< NoteBase * > Selection
bool button_release_dispatch(GdkEventButton *)
PBD::Signal1< void, boost::weak_ptr< Region > > RegionAdded
bool mouse_near_ends() const
static Selection::Operation selection_type(guint state)
double child_height() const
bool is_first_point(ControlPoint &)
boost::shared_ptr< CursorContext > cursor_ctx
void set_length(framecnt_t)
void add_region_brush_drag(ArdourCanvas::Item *, GdkEvent *, RegionView *)
static UIConfiguration * config()
void add_automation_event(GdkEvent *, framepos_t, double, bool with_guard_points)
void get_pointer_position(double &, double &) const
void mouse_mode_object_range_toggled()
void add_region_copy_drag(ArdourCanvas::Item *, GdkEvent *, RegionView *)
void set_mouse_mode(Editing::MouseMode, bool force=true)
void collect_new_region_view(RegionView *)
void set_hidden(bool yn, void *src)
void collect_and_select_new_region_view(RegionView *)
virtual bool big_enough_to_trim() const
boost::shared_ptr< ARDOUR::Playlist > playlist() const
static double NAME_HIGHLIGHT_SIZE
void note_edit_done(int, EditNoteDialog *)
void edit_control_point(ArdourCanvas::Item *)
LIBARDOUR_API PBD::PropertyDescriptor< bool > color