21 #include "gtk2ardour-config.h"
43 #include "canvas/canvas.h"
44 #include "canvas/scroll_group.h"
84 , _current_pointer_frame (0)
99 cerr <<
"Aborting drag\n";
101 for (list<Drag*>::const_iterator i =
_drags.begin(); i !=
_drags.end(); ++i) {
140 for (list<Drag*>::const_iterator i =
_drags.begin(); i !=
_drags.end(); ++i) {
141 (*i)->start_grab (e, c);
154 for (list<Drag*>::iterator i =
_drags.begin(); i !=
_drags.end(); ++i) {
155 bool const t = (*i)->end_grab (e);
174 for (list<Drag*>::const_iterator i =
_drags.begin(); i !=
_drags.end(); ++i) {
175 (*i)->set_double_click (
true);
192 for (list<Drag*>::iterator i =
_drags.begin(); i !=
_drags.end(); ++i) {
193 bool const t = (*i)->motion_handler (e, from_autoscroll);
209 list<Drag*>::const_iterator j =
_drags.begin ();
210 while (j !=
_drags.end() && (*j)->item () != i) {
214 return j !=
_drags.end ();
220 , _pointer_frame_offset (0)
221 , _trackview_only (trackview_only)
222 , _move_threshold_passed (false)
223 , _starting_point_passed (false)
224 , _initially_vertical (false)
225 , _was_double_click (false)
226 , _raw_grab_frame (0)
228 , _last_pointer_frame (0)
253 if (Keyboard::is_button2_event (&event->button)) {
254 if (Keyboard::modifier_state_equals (event->button.state, Keyboard::SecondaryModifier)) {
292 case SnapToRegionStart:
293 case SnapToRegionEnd:
294 case SnapToRegionSync:
295 case SnapToRegionBoundary:
386 if (event->motion.state & Gdk::BUTTON1_MASK || event->motion.state & Gdk::BUTTON2_MASK) {
399 if (!from_autoscroll) {
467 const Meter& m = map.meter_at (pos);
501 for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) {
505 for (TimeAxisView::Children::iterator j = children_list.begin(); j != children_list.end(); ++j) {
513 for (list<RegionView*>::const_iterator i = v.begin(); i != v.end(); ++i) {
523 list<DraggingView>::iterator i =
_views.begin ();
524 while (i !=
_views.end() && i->view != v) {
556 , _last_pointer_time_axis_view (0)
557 , _last_pointer_layer (0)
558 , _single_axis (false)
571 if (Keyboard::modifier_state_contains (event->button.state, Keyboard::TertiaryModifier)) {
601 if (sync_dir >= 0 || (sync_dir < 0 && *pending_region_position >= sync_offset)) {
603 sync_frame = *pending_region_position + (sync_dir*sync_offset);
628 framecnt_t total_dx = *pending_region_position;
634 for (list<DraggingView>::const_iterator i =
_views.begin(); i !=
_views.end(); ++i) {
635 if ((i->view->region()->position() + total_dx) < 0) {
655 const int dt = delta > 0 ? +1 : -1;
657 int target = start + delta - skip;
660 assert (skip == 0 || (skip < 0 && delta < 0) || (skip > 0 && delta > 0));
662 while (current >= 0 && current != target) {
664 if (current < 0 && dt < 0) {
667 if (current >= tavsize && dt > 0) {
670 if (current < 0 || current >= tavsize) {
679 if (distance_only && current == start + delta) {
694 for (list<DraggingView>::const_iterator i =
_views.begin(); i !=
_views.end(); ++i) {
698 if (i->time_axis_view < 0 || i->time_axis_view >= tavsize) {
700 if (delta_track >= 0) {
710 }
else if (n >= tavsize) {
721 double const l = i->layer + delta_layer;
726 if (delta_track == 0 && (l < -0.5 || l >=
int (to->
view()->
layers()))) {
747 double delta_layer = 0;
748 int delta_time_axis_view = 0;
749 int current_pointer_time_axis_view = -1;
751 assert (!
_views.empty ());
772 if (!tv && cur_y < 0) {
778 Coord last_track_bottom_edge;
779 last_track_bottom_edge = 0;
781 if (!(*t)->hidden()) {
782 last_track_bottom_edge = (*t)->
canvas_display()->canvas_origin ().y + (*t)->effective_height();
787 if (tv && tv->
view()) {
789 double layer = r.second;
797 assert(current_pointer_time_axis_view >= 0);
873 assert(ptr_y >= last_track_bottom_edge);
878 uint32_t dzpos =
_ddropzone + floor((1 + ptr_y - last_track_bottom_edge) / dzi_h);
883 }
else if (dzpos < _pdropzone && _ndropzone > 0) {
891 double const x_delta =
compute_x_delta (event, &pending_region_position);
896 if (_last_pointer_time_axis_view < 0 && _pdropzone > 0) {
910 const int dt = delta_time_axis_view + (int)_pdropzone - (
int)
_ddropzone;
924 - delta_time_axis_view;
930 delta_time_axis_view = 0;
935 if (x_delta == 0 && (tv && tv->
view() && delta_time_axis_view == 0) && delta_layer == 0 && !first_move) {
942 typedef map<boost::shared_ptr<Playlist>,
double> PlaylistDropzoneMap;
943 PlaylistDropzoneMap playlist_dropzone_map;
957 for (list<DraggingView>::const_iterator i =
_views.begin(); i !=
_views.end(); ++i) {
958 if (i->time_axis_view != prev_track) {
959 prev_track = i->time_axis_view;
965 _views.back().time_axis_view -
966 _views.front().time_axis_view;
969 -
_views.back().time_axis_view;
971 printf(
"Dragging region(s) from %d different track(s), max dist: %d\n",
_ntracks, spread);
975 for (list<DraggingView>::iterator i =
_views.begin(); i !=
_views.end(); ++i) {
994 Duple rv_canvas_offset = rvg->parent()->canvas_origin ();
1000 rvg->move (rv_canvas_offset - dmg_canvas_offset);
1008 double this_delta_layer = delta_layer;
1009 if (delta_time_axis_view != 0) {
1010 this_delta_layer = - i->layer;
1013 int this_delta_time_axis_view =
apply_track_delta(i->time_axis_view, delta_time_axis_view, delta_skip) - i->time_axis_view;
1015 int track_index = i->time_axis_view + this_delta_time_axis_view;
1016 assert(track_index >= 0);
1021 i->time_axis_view = track_index;
1025 double yposition = 0;
1026 PlaylistDropzoneMap::iterator pdz = playlist_dropzone_map.find (i->view->region()->playlist());
1032 if (pdz == playlist_dropzone_map.end()) {
1036 yposition = last_track_bottom_edge;
1040 boost::optional<ArdourCanvas::Rect> obbox = rv->
get_canvas_group()->bounding_box ();
1041 ArdourCanvas::Rect bbox;
1044 bbox = obbox.get ();
1047 last_track_bottom_edge += bbox.height();
1049 playlist_dropzone_map.insert (make_pair (i->view->region()->playlist(), yposition));
1052 yposition = pdz->second;
1071 this_delta_layer = - i->layer;
1080 if (current_tv->
hidden ()) {
1087 i->time_axis_view = track_index;
1088 i->layer += this_delta_layer;
1096 track_origin = current_tv->
canvas_display()->item_to_canvas (track_origin);
1123 rv->
move (x_delta, y_delta);
1142 if (delta_time_axis_view < 0) {
1163 assert(current_pointer_time_axis_view >= 0);
1169 if (
_pdropzone == 0 && delta_time_axis_view != 0) {
1170 assert(delta_time_axis_view < 0);
1188 assert ((delta_time_axis_view > 0) || (((
int)
_pdropzone) >= (delta_skip - delta_time_axis_view)));
1189 _pdropzone += delta_time_axis_view - delta_skip;
1199 if (
_copy && first_move) {
1209 list<DraggingView> new_regionviews;
1211 for (list<DraggingView>::const_iterator i =
_views.begin(); i !=
_views.end(); ++i) {
1241 new_regionviews.push_back (
DraggingView (nrv,
this, i->initial_time_axis_view));
1254 if (!new_regionviews.empty()) {
1258 _views = new_regionviews;
1260 swap_grab (new_regionviews.front().view->get_canvas_group (), 0,
event ?
event->motion.time : 0);
1263 }
else if (!
_copy && first_move) {
1279 if (!(*i)->view()) {
1283 if ((*i)->view()->layer_display() ==
Expanded) {
1284 (*i)->view()->set_layer_display (
Stacked);
1294 if (!movement_occurred) {
1315 assert (!
_views.empty ());
1321 for (list<DraggingView>::iterator i =
_views.begin(); i !=
_views.end(); ++i) {
1322 i->view->get_canvas_group()->show ();
1358 if (boost::dynamic_pointer_cast<AudioRegion> (region)) {
1359 list<boost::shared_ptr<AudioTrack> > audio_tracks;
1371 ChanCount one_midi_port (DataType::MIDI, 1);
1372 list<boost::shared_ptr<MidiTrack> > midi_tracks;
1381 error <<
_(
"Could not create new track after region placed in the drop zone") <<
endmsg;
1396 for (list<DraggingView>::iterator i =
_views.begin(); i !=
_views.end(); ++i) {
1405 PlaylistMapping playlist_mapping;
1408 for (list<DraggingView>::const_iterator i =
_views.begin(); i !=
_views.end();) {
1412 if (i->view->region()->locked() || i->view->region()->video_locked()) {
1419 where = i->
view->region()->position() - drag_delta;
1421 where = i->view->region()->position();
1424 if (i->time_axis_view < 0 || i->time_axis_view >= (
int)
_time_axis_views.size()) {
1427 PlaylistMapping::iterator pm;
1429 if ((pm = playlist_mapping.find (i->view->region()->playlist())) == playlist_mapping.end()) {
1432 playlist_mapping.insert (make_pair (i->view->region()->playlist(), new_time_axis_view));
1433 dest_rtv = new_time_axis_view;
1436 dest_rtv = pm->second;
1443 if (dest_rtv != 0) {
1445 if (new_view != 0) {
1446 new_views.push_back (new_view);
1454 list<DraggingView>::const_iterator next = i;
1464 if (new_views.size() > 0) {
1476 bool const changed_position,
1477 bool const changed_tracks,
1484 set<RouteTimeAxisView*> views_to_update;
1494 PlaylistMapping playlist_mapping;
1496 for (list<DraggingView>::const_iterator i =
_views.begin(); i !=
_views.end(); ) {
1506 if (i->time_axis_view < 0 || i->time_axis_view >= (
int)
_time_axis_views.size()) {
1509 PlaylistMapping::iterator pm;
1511 if ((pm = playlist_mapping.find (i->view->region()->playlist())) == playlist_mapping.end()) {
1514 playlist_mapping.insert (make_pair (i->view->region()->playlist(), new_time_axis_view));
1515 dest_rtv = new_time_axis_view;
1518 dest_rtv = pm->second;
1528 double const dest_layer = i->layer;
1530 views_to_update.insert (dest_rtv);
1540 if (changed_tracks) {
1545 RegionFactory::create (rv->
region (),
true), dest_rtv, dest_layer, where, modified_playlists
1548 if (new_view == 0) {
1553 new_views.push_back (new_view);
1575 pair<PlaylistSet::iterator, bool> r = modified_playlists.insert (playlist);
1599 r = frozen_playlists.insert (playlist);
1610 if (changed_tracks) {
1645 if (new_views.size() > 0) {
1665 for (set<RouteTimeAxisView*>::iterator i = views_to_update.begin(); i != views_to_update.end(); ++i) {
1666 (*i)->view()->playlist_layered ((*i)->track ());
1683 pair<set<boost::shared_ptr<Playlist> >::iterator,
bool> r = modified_playlists.insert (playlist);
1713 if (!dest_playlist) {
1722 pair<PlaylistSet::iterator, bool> r = modified_playlists.insert (dest_playlist);
1730 dest_playlist->
set_layer (region, dest_layer);
1749 for (PlaylistSet::const_iterator i = playlists.begin(); i != playlists.end(); ++i) {
1765 for (list<DraggingView>::const_iterator i =
_views.begin(); i !=
_views.end();) {
1766 list<DraggingView>::const_iterator next = i;
1793 for (list<DraggingView>::const_iterator i =
_views.begin(); i !=
_views.end(); ++i) {
1835 assert ((boost::dynamic_pointer_cast<AudioRegion> (r) && dynamic_cast<AudioTimeAxisView*> (v)) ||
1836 (boost::dynamic_pointer_cast<MidiRegion> (r) && dynamic_cast<MidiTimeAxisView*> (v)));
1852 int pos =
_views.front().time_axis_view;
1934 for (RegionSelection::iterator i = copy.begin(); i != copy.end(); ++i) {
1944 if ((playlist = atv->
playlist()) == 0) {
1953 if (pf < (*i)->region()->last_frame() + 1) {
1957 if (pf > (*i)->region()->first_frame()) {
1963 playlist->
shuffle ((*i)->region(), dir);
1991 for (RegionList::iterator i = rl->begin(); i != rl->end(); ++i) {
1992 if ((*i)->position() >= where) {
1997 for (RegionSelection::iterator i = to_ripple.begin(); i != to_ripple.end(); ++i) {
2001 if (drag_in_progress) {
2007 ArdourCanvas::Item* rvg = (*i)->get_canvas_group();
2008 Duple rv_canvas_offset = rvg->item_to_canvas (Duple (0,0));
2013 Duple fudge = rv_canvas_offset - dmg_canvas_offset;
2027 for (std::list<DraggingView>::iterator i =
_views.begin(); i !=
_views.end(); ) {
2030 std::list<DraggingView>::iterator to_erase = i++;
2051 rv->
move(-amount, 0);
2087 for (RegionSelection::iterator i =selected_regions.begin(); i != selected_regions.end(); ++i) {
2088 exclude->push_back((*i)->region());
2095 std::set<boost::shared_ptr<ARDOUR::Playlist> > playlists = copy.
playlists();
2096 std::set<boost::shared_ptr<ARDOUR::Playlist> >::const_iterator pi;
2098 for (pi = playlists.begin(); pi != playlists.end(); ++pi) {
2100 RegionView *first_selected_on_this_track = NULL;
2101 for (RegionSelection::iterator i = copy.begin(); i != copy.end(); ++i) {
2102 if ((*i)->region()->playlist() == (*pi)) {
2104 first_selected_on_this_track = *i;
2108 assert (first_selected_on_this_track);
2112 selected_regions,
false);
2116 orig_tav = &(*selected_regions.begin())->get_time_axis_view();
2144 assert (where >= 0);
2201 if (!movement_occurred) {
2226 vector<Command*> cmds;
2232 vector<Command*> cmds;
2240 std::set<boost::shared_ptr<ARDOUR::Playlist> >::const_iterator pi;
2242 for (pi = playlists.begin(); pi != playlists.end(); ++pi) {
2243 (*pi)->clear_changes();
2244 vector<Command*> cmds;
2245 (*pi)->rdiff (cmds);
2301 if (!movement_occurred) {
2328 Gdk::Cursor* cursor;
2333 if (x_fraction > 0.0 && x_fraction < 0.25) {
2347 if (event->motion.state & Keyboard::PrimaryModifier) {
2355 if (ms.size() > 1) {
2367 for (MidiRegionSelection::iterator r = ms.begin(); r != ms.end(); ) {
2368 MidiRegionSelection::iterator next;
2383 for (MidiRegionSelection::iterator r = ms.begin(); r != ms.end(); ++r) {
2397 for (MidiRegionSelection::iterator r = ms.begin(); r != ms.end(); ++r) {
2413 for (MidiRegionSelection::iterator r = ms.begin(); r != ms.end(); ++r) {
2436 std::list<RegionView*> views = rs.
by_layer();
2438 for (list<RegionView*>::iterator i = views.begin(); i != views.end(); ++i) {
2462 for (list<AVDraggingView>::iterator i =
_views.begin(); i !=
_views.end(); ++i) {
2470 Timecode::Time timecode;
2472 snprintf (buf,
sizeof (buf),
"Video Start:\n%c%02" PRId32
":%02" PRId32
":%02" PRId32
":%02" PRId32, (
_startdrag_video_offset<0?
'-':
' '), timecode.hours, timecode.minutes, timecode.seconds, timecode.frames);
2496 for (list<AVDraggingView>::iterator i =
_views.begin(); i !=
_views.end(); ++i) {
2509 Timecode::Time timecode;
2510 Timecode::Time timediff;
2514 snprintf (buf,
sizeof (buf),
2515 "%s\n%c%02" PRId32
":%02" PRId32
":%02" PRId32
":%02" PRId32
2516 "\n%s\n%c%02" PRId32
":%02" PRId32
":%02" PRId32
":%02" PRId32
2517 ,
_(
"Video Start:"),
2518 (offset<0?
'-':
' '), timecode.hours, timecode.minutes, timecode.seconds, timecode.frames
2520 (dt<0?
'-':
' '), timediff.hours, timediff.minutes, timediff.seconds, timediff.frames
2545 for (list<AVDraggingView>::iterator i =
_views.begin(); i !=
_views.end(); ++i) {
2546 i->view->drag_end();
2547 i->view->region()->resume_property_changes ();
2570 for (list<AVDraggingView>::iterator i =
_views.begin(); i !=
_views.end(); ++i) {
2571 i->view->region()->resume_property_changes ();
2572 i->view->region()->set_position(i->initial_position);
2578 , _preserve_fade_anchor (preserve_fade_anchor)
2579 , _jump_position_when_done (false)
2601 if (Keyboard::modifier_state_equals (event->button.state, Keyboard::PrimaryModifier)) {
2607 if (pf < (region_start + region_length/2)) {
2611 if (Keyboard::modifier_state_equals (event->button.state, Keyboard::TertiaryModifier)) {
2619 if (Keyboard::modifier_state_equals (event->button.state, Keyboard::TertiaryModifier)) {
2627 if (Keyboard::modifier_state_equals (event->button.state, Keyboard::TertiaryModifier)) {
2634 for (list<DraggingView>::iterator i =
_views.begin(); i !=
_views.end(); ++i) {
2635 i->view->trim_front_starting ();
2646 for (list<DraggingView>::const_iterator i =
_views.begin(); i !=
_views.end(); ++i) {
2647 i->view->region()->suspend_property_changes ();
2659 pair<set<boost::shared_ptr<Playlist> >::iterator,
bool> insert_result;
2674 trim_type =
"Region start trim";
2677 trim_type =
"Region end trim";
2680 trim_type =
"Region content trim";
2689 for (list<DraggingView>::const_iterator i =
_views.begin(); i !=
_views.end(); ++i) {
2704 if (insert_result.second) {
2710 bool non_overlap_trim =
false;
2712 if (event && Keyboard::modifier_state_equals (event->button.state, Keyboard::TertiaryModifier)) {
2713 non_overlap_trim =
true;
2720 for (list<DraggingView>::const_iterator i =
_views.begin(); i !=
_views.end(); ++i) {
2724 if (ar->locked())
continue;
2726 if (len < dt) dt = min(dt, len);
2730 for (list<DraggingView>::const_iterator i =
_views.begin(); i !=
_views.end(); ++i) {
2734 if (ar->locked())
continue;
2736 if (len < -dt) dt = max(dt, -len);
2747 for (list<DraggingView>::iterator i =
_views.begin(); i !=
_views.end(); ++i) {
2748 bool changed = i->view->trim_front (i->initial_position + dt, non_overlap_trim);
2754 framecnt_t diff = ar->first_frame() - i->initial_position;
2756 i->anchored_fade_length = min (ar->length(), new_length);
2765 for (list<DraggingView>::iterator i =
_views.begin(); i !=
_views.end(); ++i) {
2766 bool changed = i->view->trim_end (i->initial_end + dt, non_overlap_trim);
2772 framecnt_t diff = 1 + ar->last_frame() - i->initial_end;
2774 i->anchored_fade_length = min (ar->length(), new_length);
2786 for (list<DraggingView>::const_iterator i =
_views.begin(); i !=
_views.end(); ++i) {
2787 i->view->move_contents (frame_delta);
2810 if (movement_occurred) {
2814 for (list<DraggingView>::const_iterator i =
_views.begin(); i !=
_views.end(); ++i) {
2820 i->view->trim_front_ending ();
2827 ar->set_fade_in_length(i->anchored_fade_length);
2828 ar->set_fade_in_active(
true);
2832 i->view->region()->set_position (i->initial_position);
2836 for (list<DraggingView>::const_iterator i =
_views.begin(); i !=
_views.end(); ++i) {
2842 ar->set_fade_out_length(i->anchored_fade_length);
2843 ar->set_fade_out_active(
true);
2847 i->view->region()->set_position (i->initial_end - i->view->region()->length());
2855 _views.begin()->view->region()->position());
2859 _views.begin()->view->region()->position() +
2860 _views.begin()->view->region()->length());
2868 set<boost::shared_ptr<Playlist> > diffed_playlists;
2870 for (list<DraggingView>::const_iterator i =
_views.begin(); i !=
_views.end(); ++i) {
2871 i->view->thaw_after_trim ();
2872 i->view->enable_display (
true);
2880 if (diffed_playlists.find (p) == diffed_playlists.end()) {
2881 vector<Command*> cmds;
2884 diffed_playlists.insert (p);
2901 for (list<DraggingView>::const_iterator i =
_views.begin(); i !=
_views.end(); ++i) {
2903 i->view->trim_front_ending ();
2906 i->view->region()->resume_property_changes ();
2920 if (movement_occurred) {
2924 for (list<DraggingView>::const_iterator i =
_views.begin(); i !=
_views.end(); ++i) {
2925 i->view->region()->resume_property_changes ();
2932 list<DraggingView>::iterator i =
_views.begin ();
2991 if (!section.movable()) {
3007 swap_grab (&_marker->the_item(), 0, GDK_CURRENT_TIME);
3014 map.remove_meter (section,
true);
3027 if (!movement_occurred) {
3040 Timecode::BBT_Time when;
3045 if (
_copy ==
true) {
3047 XMLNode &before = map.get_state();
3049 XMLNode &after = map.get_state();
3059 XMLNode &after = map.get_state();
3138 swap_grab (&_marker->the_item(), 0, GDK_CURRENT_TIME);
3145 map.remove_tempo (section,
true);
3157 if (!movement_occurred) {
3172 Timecode::BBT_Time when;
3174 map.bbt_time (beat_time, when);
3176 if (
_copy ==
true) {
3178 XMLNode &before = map.get_state();
3180 XMLNode &after = map.get_state();
3188 XMLNode &after = map.get_state();
3213 :
Drag (e, &c.track_canvas_item(), false)
3275 if (AudioEngine::instance()->connected()) {
3310 if (!movement_occurred &&
_stop) {
3369 if (pos < (region->
position() + 64)) {
3374 fade_length = pos - region->
position();
3377 for (list<DraggingView>::iterator i =
_views.begin(); i !=
_views.end(); ++i) {
3394 if (!movement_occurred) {
3404 if (pos < (region->
position() + 64)) {
3409 fade_length = pos - region->
position();
3414 for (list<DraggingView>::iterator i =
_views.begin(); i !=
_views.end(); ++i) {
3438 for (list<DraggingView>::iterator i =
_views.begin(); i !=
_views.end(); ++i) {
3491 for (list<DraggingView>::iterator i =
_views.begin(); i !=
_views.end(); ++i) {
3508 if (!movement_occurred) {
3528 for (list<DraggingView>::iterator i =
_views.begin(); i !=
_views.end(); ++i) {
3552 for (list<DraggingView>::iterator i =
_views.begin(); i !=
_views.end(); ++i) {
3571 _points.push_back (ArdourCanvas::Duple (0, 0));
3624 list<Marker*> to_add;
3635 for (Locations::LocationList::iterator i = ll.begin(); i != ll.end(); ++i) {
3639 to_add.push_back (lm->
start);
3642 to_add.push_back (lm->
end);
3646 if (!to_add.empty()) {
3673 CopiedLocationInfo::iterator x;
3675 if (*(*x).location == *l) {
3682 (*x).markers.push_back (*i);
3683 (*x).move_both =
true;
3703 bool move_both =
false;
3710 if (Keyboard::modifier_state_equals (event->button.state, Keyboard::PrimaryModifier)) {
3714 CopiedLocationInfo::iterator x;
3720 copy_location = (*x).location;
3722 if (find (x->markers.begin(), x->markers.end(),
_marker) != x->markers.end()) {
3733 if (real_location->
is_mark()) {
3734 f_delta = newframe - copy_location->
start();
3743 f_delta = newframe - copy_location->
start();
3750 f_delta = newframe - copy_location->
end();
3771 copy_location = x->location;
3777 if (real_location->
locked()) {
3781 if (copy_location->
is_mark()) {
3794 if (move_both || (*x).move_both) {
3796 copy_location->
set_end (new_end);
3797 }
else if (new_start < copy_location->end()) {
3799 }
else if (newframe > 0) {
3801 copy_location->
set_end (next);
3807 if (move_both || (*x).move_both) {
3808 copy_location->
set_end (new_end);
3810 }
else if (new_end > copy_location->
start()) {
3811 copy_location->
set_end (new_end);
3812 }
else if (newframe > 0) {
3815 copy_location->
set_end (newframe);
3845 if (!movement_occurred) {
3883 MarkerSelection::iterator i;
3884 CopiedLocationInfo::iterator x;
3895 if (location->
locked()) {
3900 location->
set_start (((*x).location)->start());
3902 location->
set (((*x).location)->start(), ((*x).location)->end());
3915 if (!movement_occured) {
3924 for (vector<Marker*>::iterator m = x->markers.begin(); m != x->markers.end(); ++m) {
3930 (*m)->set_position (is_start ? location->
start() : location->
end());
3944 _cumulative_x_drag (0),
3945 _cumulative_y_drag (0)
3974 _pushing = Keyboard::modifier_state_contains (event->button.state, Keyboard::PrimaryModifier);
3987 if (event->button.state & Keyboard::SecondaryModifier) {
4002 if ((cy < zero_gain_y && (cy - dy) > zero_gain_y) || (cy > zero_gain_y && (cy - dy) < zero_gain_y)) {
4038 if (!movement_occurred) {
4042 if (Keyboard::modifier_state_equals (event->button.state, Keyboard::TertiaryModifier)) {
4063 if (m == Editing::MouseDraw) {
4075 _cumulative_y_drag (0)
4092 double cx =
event->button.x;
4093 double cy =
event->button.y;
4126 if (event->button.state & Keyboard::SecondaryModifier) {
4137 double const fraction = 1.0 - (cy /
_line->
height());
4149 if (movement_occured) {
4177 _cumulative_x_drag (0)
4192 double cx =
event->button.x;
4193 double cy =
event->button.y;
4195 _item->parent()->canvas_to_item (cx, cy);
4225 boost::optional<ArdourCanvas::Rect> bbox =
_line->bounding_box ();
4227 _line->set (ArdourCanvas::Duple (cx, 2.0), ArdourCanvas::Duple (cx, bbox.get().height ()));
4229 float *pos =
new float;
4232 _line->set_data (
"position", pos);
4252 , _vertical_only (false)
4299 if (start != end || y1 != y2) {
4303 const double min_dimension = 2.0;
4310 x2 = min (x1 - min_dimension, x2);
4312 x2 = max (x1 + min_dimension, x2);
4317 y2 = min (y1 - min_dimension, y2);
4319 y2 = max (y1 + min_dimension, y2);
4324 ArdourCanvas::Rect r (x1, y1, x2, y2);
4376 select_things (event->button.state, x1, x2, y1, y2, drag_in_progress);
4382 if (movement_occurred) {
4391 bool do_deselect =
true;
4399 do_deselect =
false;
4407 if (!Keyboard::modifier_state_contains (event->button.state, Keyboard::PrimaryModifier) &&
4408 !Keyboard::modifier_state_contains (event->button.state, Keyboard::TertiaryModifier) &&
4445 int layer = tv.first->layer_display() ==
Overlaid ? 0 : tv.second;
4446 int layers = tv.first->layer_display() ==
Overlaid ? 1 : cv->
layers();
4462 if (!movement_occurred) {
4475 #ifndef USE_RUBBERBAND
4478 percentage = (float) ((
double) newlen - (double)
_primary->
region()->
length()) / ((
double) newlen) * 100.0
f;
4490 error <<
_(
"An error occurred while executing time stretch operation") <<
endmsg;
4538 , _time_selection_at_start (!_editor->get_selection().time.empty())
4559 if (Keyboard::modifier_state_equals (event->button.state, Keyboard::CopyModifier)) {
4641 if (grab < pending_position) {
4648 if (pending_position < grab) {
4649 start = pending_position;
4652 end = pending_position;
4693 ArdourCanvas::Coord
const top =
grab_y();
4696 if (top >= 0 && bottom >= 0) {
4699 for (TrackViewList::const_iterator i = all_tracks.begin(); i != all_tracks.end(); ++i) {
4700 if ((*i)->covered_by_y_range (top, bottom)) {
4701 new_selection.push_back (*i);
4707 for (TrackViewList::const_iterator i = new_selection.begin(); i != new_selection.end(); ++i) {
4710 for (TrackViewList::const_iterator j = all_tracks.begin(); j != all_tracks.end(); ++j) {
4713 grouped_add.push_back (*j);
4722 for (TrackViewList::const_iterator i = grouped_add.begin(); i != grouped_add.end(); ++i)
4724 tracks_to_add.push_back ( *i );
4726 if ( !grouped_add.
contains ( *i ) )
4727 tracks_to_remove.push_back ( *i );
4740 if (pending_position > end) {
4743 start = pending_position;
4752 if (pending_position < start) {
4755 end = pending_position;
4765 length = end -
start;
4766 distance = pending_position -
start;
4767 start = pending_position;
4803 if (movement_occurred) {
4836 if (Keyboard::modifier_state_equals (event->button.state, Keyboard::CopyModifier)) {
4869 :
Drag (e, i, false),
4876 ArdourCanvas::Rect (0.0, 0.0, 0.0,
4912 if (Keyboard::modifier_state_equals (event->button.state, Keyboard::TertiaryModifier)) {
4931 ArdourCanvas::Rectangle *crect;
4947 error <<
string_compose (
_(
"programming_error: %1"),
"Error: unknown range marker op passed to Editor::drag_range_markerbar_op ()") <<
endmsg;
5005 if (movement_occurred) {
5018 flags = Location::IsRangeMarker | Location::IsSkip;
5023 flags = Location::IsRangeMarker | Location::IsCDMarker;
5028 flags = Location::IsRangeMarker;
5101 if (movement_occured) {
5118 , _cumulative_dx (0)
5119 , _cumulative_dy (0)
5141 bool extend = Keyboard::modifier_state_equals (event->button.state, Keyboard::TertiaryModifier);
5144 bool add = Keyboard::modifier_state_equals (event->button.state, Keyboard::PrimaryModifier);
5208 _cumulative_dy += tdy;
5221 uint8_t new_note = min (max (
_primary->
note()->note() + note_delta, 0), 127);
5224 (
int) floor ((
double)new_note));
5239 bool changed =
false;
5242 bool add = Keyboard::modifier_state_equals (ev->button.state, Keyboard::PrimaryModifier);
5248 bool extend = Keyboard::modifier_state_equals (ev->button.state, Keyboard::TertiaryModifier);
5249 bool add = Keyboard::modifier_state_equals (ev->button.state, Keyboard::PrimaryModifier);
5254 }
else if (extend) {
5280 :
Drag (editor, atv->base_item ())
5282 , _y_origin (atv->y_position())
5283 , _nothing_to_drag (false)
5291 :
Drag (editor, rv->get_canvas_group ())
5293 , _y_origin (rv->get_time_axis_view().y_position())
5294 , _nothing_to_drag (false)
5299 list<boost::shared_ptr<AutomationLine> > lines;
5303 if ((audio_view = dynamic_cast<AudioRegionView*>(rv))) {
5305 }
else if ((automation_view = dynamic_cast<AutomationRegionView*>(rv))) {
5306 lines.push_back (automation_view->
line ());
5309 error <<
_(
"Automation range drag created for invalid region type") <<
endmsg;
5322 list<boost::shared_ptr<AutomationLine> >::const_iterator i = lines.begin ();
5323 while (i != lines.end ()) {
5324 list<boost::shared_ptr<AutomationLine> >::const_iterator j = i;
5327 pair<framepos_t, framepos_t> r = (*i)->get_point_x_range ();
5330 list<AudioRange>::const_iterator k =
_ranges.begin ();
5362 const double v = list->
eval(x);
5372 for (list<Line>::iterator i =
_lines.begin(); i !=
_lines.end(); ++i) {
5373 i->state = &i->line->get_state ();
5380 for (list<Line>::iterator i =
_lines.begin(); i !=
_lines.end(); ++i) {
5381 uint32_t
const N = i->line->npoints ();
5382 for (uint32_t j = 0; j <
N; ++j) {
5383 i->points.push_back (i->line->nth (j));
5389 for (list<AudioRange>::const_iterator i =
_ranges.begin(); i !=
_ranges.end(); ++i) {
5391 framecnt_t const half = (i->start + i->end) / 2;
5394 list<Line>::iterator j =
_lines.begin();
5395 while (j !=
_lines.end() && (j->range.first > i->start || j->range.second < i->start)) {
5411 double const p = j->line->time_converter().from (i->start - j->line->time_converter().origin_b ());
5412 double const q = j->line->time_converter().from (a - j->line->time_converter().origin_b ());
5421 while (j !=
_lines.end() && (j->range.first > i->end || j->range.second < i->end)) {
5437 double const p = j->line->time_converter().from (b - j->line->time_converter().origin_b ());
5438 double const q = j->line->time_converter().from (i->end - j->line->time_converter().origin_b ());
5451 for (list<Line>::iterator i =
_lines.begin(); i !=
_lines.end(); ++i) {
5453 uint32_t
const N = i->line->npoints ();
5454 for (uint32_t j = 0; j <
N; ++j) {
5461 list<AudioRange>::const_iterator k =
_ranges.begin ();
5462 while (k !=
_ranges.end() && (k->start >= w || k->end <= w)) {
5469 i->points.push_back (p);
5479 for (list<Line>::iterator i =
_lines.begin(); i !=
_lines.end(); ++i) {
5491 for (list<Line>::iterator l =
_lines.begin(); l !=
_lines.end(); ++l) {
5495 l->line->drag_motion (0, f,
true,
false, ignored);
5508 for (list<Line>::iterator i =
_lines.begin(); i !=
_lines.end(); ++i) {
5509 i->line->end_drag (
false, 0);
5518 for (list<Line>::iterator i =
_lines.begin(); i !=
_lines.end(); ++i) {
5525 , initial_time_axis_view (itav)
5539 :
Drag (e, i->canvas_item ())
5542 , _cumulative_dx (0)
5566 if (!movement_occurred) {
5573 f = min (f, r->last_frame ());
5606 Keyboard::modifier_state_contains (button_state, Keyboard::TertiaryModifier));
5627 y1 = max (0.0, y1 - y);
5628 y2 = max (0.0, y2 - y);
5633 Keyboard::modifier_state_contains (button_state, Keyboard::TertiaryModifier)
5652 if (drag_in_progress) {
5748 if (!had_movement) {
5787 std::cout << (
"CrossfadeEdgeDrag is DEPRECATED. See TrimDrag::preserve_fade_anchor") << endl;
5807 len = ar->fade_in()->back()->when;
5810 len = ar->fade_out()->back()->when;
5819 new_length = ar->verify_xfade_bounds (new_length,
start);
5839 len = ar->fade_in()->back()->when;
5842 len = ar->fade_out()->back()->when;
5848 ar->playlist()->clear_owned_changes ();
5851 ar->set_fade_in_length (new_length);
5853 ar->set_fade_out_length (new_length);
5861 vector<Command*> cmds;
5862 ar->playlist()->rdiff (cmds);
5879 :
Drag (e, item, true)
bool operator()(TimeAxisView *a, TimeAxisView *b)
void change(Gdk::Cursor *cursor)
virtual RegionView * create_region_view(boost::shared_ptr< ARDOUR::Region >, bool, bool)
int next_available_name(std::string &result, std::string base)
LIBEVORAL_API std::string midi_note_name(uint8_t noteval)
RegionView * find_view(boost::shared_ptr< const ARDOUR::Region >)
MidiTimeAxisView * midi_view() const
ArdourCanvas::Item & parent_group() const
bool transport_rolling() const
bool follow_playhead() const
MidiRegionView * _region_view
bool control_points_adjacent(double xval, uint32_t &before, uint32_t &after)
void setup_pointer_frame_offset()
std::pair< TimeAxisView *, double > trackview_by_y_position(double, bool trackview_relative_offset=true) const
virtual void set_playlist(boost::weak_ptr< ARDOUR::Playlist >)
boost::shared_ptr< AutomationLine > line
the line
virtual void setup_pointer_frame_offset()
double _cumulative_x_drag
CopiedLocationMarkerInfo(ARDOUR::Location *l, Marker *m)
ArdourCanvas::Item * get_canvas_group()
void motion(GdkEvent *, bool)
boost::shared_ptr< ARDOUR::Playlist > playlist() const
double initial_y
the initial y position of the view before any reparenting
void finished(GdkEvent *, bool)
ArdourCanvas::Color color(const std::string &, bool *failed=0) const
void ripple(framepos_t at, framecnt_t distance, RegionList *exclude)
ControlPoint * nth(uint32_t)
CopiedLocationInfo _copied_locations
void move_time(framecnt_t)
void setup_pointer_frame_offset()
void start_grab(GdkEvent *, Gdk::Cursor *c=0)
void finished(GdkEvent *, bool)
virtual bool active(Editing::MouseMode m)
void set_selected_track_as_side_effect(Selection::Operation op)
static PBD::Signal1< void, RegionView * > RegionViewGoingAway
void commit_reversible_selection_op()
TimeAxisView & get_time_axis_view() const
RegionMoveDrag(Editor *, ArdourCanvas::Item *, RegionView *, std::list< RegionView * > const &, bool, bool)
void set_offset(ARDOUR::frameoffset_t offset)
std::set< boost::shared_ptr< ARDOUR::Playlist > > motion_frozen_playlists
void motion(GdkEvent *, bool)
void scrub(framepos_t, double)
ArdourCanvas::Container * _drag_motion_group
ArdourCanvas::Arrow & track_canvas_item()
ARDOUR::frameoffset_t get_offset()
ArdourCanvas::GtkCanvasViewport * get_track_canvas() const
void setup_pointer_frame_offset()
SelectionDrag(Editor *, ArdourCanvas::Item *, Operation)
void motion(GdkEvent *, bool)
PatchChange * _patch_change
bool initially_vertical() const
static Gdk::Cursor * invalid_cursor()
bool operator()(RegionView *a, RegionView *b)
void set_follow_playhead(bool yn, bool catch_up=true)
TimeAxisView * clicked_axisview
void bbt_time(framepos_t when, Timecode::BBT_Time &)
CursorDrag(Editor *, EditorCursor &, bool)
void update_drag_selection(framepos_t start, framepos_t end, double y0, double y1, bool extend)
void set_fade_out_length(framecnt_t)
std::list< Location * > LocationList
RangeMarkerBarDrag(Editor *, ArdourCanvas::Item *, Operation)
bool _was_rolling
true if the session was rolling before the drag started, otherwise false
ARDOUR::framepos_t adjusted_current_frame(GdkEvent const *, bool snap=true) const
void start_grab(GdkEvent *, Gdk::Cursor *c=0)
bool _preserve_fade_anchor
framepos_t pixel_to_sample_from_event(double pixel) const
void abort_reversible_command()
void begin_reversible_command(std::string cmd_name)
std::list< ARDOUR::AudioRange > _ranges
void add_tempo(const Tempo &, Timecode::BBT_Time where)
void start_grab(GdkEvent *, Gdk::Cursor *c=0)
void setup_pointer_frame_offset()
LIBARDOUR_API PBD::PropertyDescriptor< layer_t > layer
LIBARDOUR_API PBD::PropertyDescriptor< bool > hidden
void order_selection_trims(ArdourCanvas::Item *item, bool put_start_on_top)
void update_item(ARDOUR::Location *)
void finished(GdkEvent *, bool)
RouteTimeAxisView * create_destination_time_axis(boost::shared_ptr< ARDOUR::Region >, TimeAxisView *original)
sigc::signal< void, RegionView * > RegionViewAdded
void start_grab(GdkEvent *, Gdk::Cursor *c=0)
NoteDrag(Editor *, ArdourCanvas::Item *)
void set_layer_display(LayerDisplay)
virtual DataType data_type() const =0
void setup(std::list< boost::shared_ptr< AutomationLine > > const &)
virtual void start_drag_single(ControlPoint *, double, float)
ArdourCanvas::Line * _line
MidiVerticalSelectDrag(Editor *, MidiRegionView *)
void show_verbose_cursor_time(framepos_t)
void remove(TimeAxisView *)
framecnt_t grid_frames(framepos_t) const
void motion(GdkEvent *, bool)
double compute_x_delta(GdkEvent const *, ARDOUR::framepos_t *)
LIBARDOUR_API GQuark region_drag
ARDOUR::layer_t layers() const
framepos_t position() const
virtual void end_drag(bool with_push, uint32_t final_index)
void temporarily_hide_envelope()
Dangerous!
shared_ptr< T > dynamic_pointer_cast(shared_ptr< U > const &r)
virtual void hide_timestretch()
static ARDOUR_UI * instance()
framepos_t end_frame() const
void reset_fade_out_shape_width(boost::shared_ptr< ARDOUR::AudioRegion > ar, framecnt_t, bool drag_active=false)
RegionMotionDrag(Editor *, ArdourCanvas::Item *, RegionView *, std::list< RegionView * > const &, bool)
boost::shared_ptr< AutomationList > fade_in()
framepos_t canvas_event_sample(GdkEvent const *, double *px=0, double *py=0) const
AutomationLine & line() const
void update_item(ARDOUR::Location *)
void finished(GdkEvent *, bool)
NoteResizeDrag(Editor *, ArdourCanvas::Item *)
void set_manager(DragManager *m)
double _last_pointer_layer
void set_layer(boost::shared_ptr< Region >, double)
std::set< boost::shared_ptr< ARDOUR::Playlist > > PlaylistSet
bool allow_moves_across_tracks
double _region_view_grab_x
bool timecode_transmission_suspended() const
double current_pointer_x() const
bool _initially_vertical
true if after move threshold is passed we appear to be moving vertically; undefined before that ...
framepos_t window_event_sample(GdkEvent const *, double *px=0, double *py=0) const
std::vector< boost::shared_ptr< TimeAxisView > > Children
framepos_t start_at_start
void create_note_at(framepos_t t, double y, Evoral::Beats length, bool snap_t)
void add_command(Command *const cmd)
LIBGTKMM2EXT_API int physical_screen_height(Glib::RefPtr< Gdk::Window >)
boost::shared_ptr< AudioRegionGainLine > get_gain_line() const
void start_grab(GdkEvent *, Gdk::Cursor *c=0)
virtual void start_grab(GdkEvent *e, Gdk::Cursor *c=0)
ArdourCanvas::Container * tempo_group
virtual void aborted(bool m)=0
void remove_region(boost::shared_ptr< Region >)
Always round up, even if on a division.
double value(boost::shared_ptr< ARDOUR::AutomationList > list, double x) const
MidiRegionView * _region_view
virtual StreamView * view() const
void show_verbose_cursor_duration(framepos_t, framepos_t, double xoffset=0)
boost::shared_ptr< RegionList > regions_with_start_within(Evoral::Range< framepos_t >)
boost::shared_ptr< AutomationList > fade_out()
RegionView * view
the view
Marker * _marker
marker being dragged
ARDOUR::framepos_t end_frame()
virtual B to(A a) const =0
bool _dragging_edit_point
double sample_to_pixel_unrounded(framepos_t sample) const
bool is_auditioning() const
RegionView * _primary
the view that was clicked on (or whatever) to start the drag
void set(std::list< Selectable * > const &)
virtual void motion(GdkEvent *, bool)
std::list< boost::shared_ptr< AutomationLine > > lines() const
LIBPBD_API Transmitter error
double y_fraction(boost::shared_ptr< AutomationLine >, double global_y_position) const
LIBARDOUR_API GQuark fixed_time_region_copy
double _cumulative_y_drag
ARDOUR::TempoSection & tempo() const
void clear_owned_changes()
CrossfadeEdgeDrag(Editor *, AudioRegionView *, ArdourCanvas::Item *, bool start)
bool get_play_range() const
bool operator()(const DraggingView &a, const DraggingView &b)
ARDOUR::Session * session() const
void finished(GdkEvent *, bool)
bool _starting_point_passed
true if we called move () with first_move flag, otherwise false
void get_regions_after(RegionSelection &, framepos_t where, const TrackViewList &ts) const
sigc::signal< void > TimeChanged
void range(ARDOUR::framepos_t &start, ARDOUR::framepos_t &end)
std::ostream & endmsg(std::ostream &ostr)
framepos_t initial_end
initial end position of the region
void start_grab(GdkEvent *, Gdk::Cursor *c=0)
PatchChangeDrag(Editor *, PatchChange *, MidiRegionView *)
bool _y_constrained
true if y motion is constrained, otherwise false
ArdourCanvas::Container * get_trackview_group() const
void collect_new_region_view(RegionView *)
void finished(GdkEvent *, bool)
StreamView * view() const
void unique_select(NoteBase *ev)
double current_pointer_x() const
boost::shared_ptr< ARDOUR::AudioRegion > audio_region() const
void edit_meter_marker(MeterMarker &)
Evoral::Beats region_frames_to_region_beats(framepos_t) const
Evoral::Beats get_grid_type_as_beats(bool &success, framepos_t position)
LIBARDOUR_API PBD::PropertyDescriptor< framepos_t > start
void marks_either_side(framepos_t const, framepos_t &, framepos_t &) const
ARDOUR::framepos_t _current_pointer_frame
frame that the pointer is now at
ARDOUR::frameoffset_t quantify_frames_to_apv(ARDOUR::frameoffset_t offset)
void request_locate(framepos_t frame, bool with_roll=false)
void start_grab(GdkEvent *, Gdk::Cursor *c=0)
XMLNode * state
the XML state node before the drag
uint32_t current_height() const
virtual void drag_start()
EditorCursor * playhead_cursor
framecnt_t frame_rate() const
void flush_videotimeline_cache(bool localcacheonly=false)
ArdourCanvas::Points _points
static bool is_invalid(Gdk::Cursor *c)
void by_position(std::list< RegionView * > &) const
void start_grab(GdkEvent *, Gdk::Cursor *c=0)
double y_position() const
ScrubDrag(Editor *, ArdourCanvas::Item *)
void thaw(bool from_undo=false)
double _grab_y
y of the grab start position, possibly adjusted if _trackview_only is true
void new_transport_marker_context_menu(GdkEventButton *, ArdourCanvas::Item *)
boost::shared_ptr< AutomationLine > line()
bool empty(bool internal_selection=false)
uint8_t lowest_note() const
virtual void aborted(bool)
void queue_full_time_code()
virtual std::pair< ARDOUR::framecnt_t, int > move_threshold() const
framepos_t source_beats_to_absolute_frames(Evoral::Beats beats) const
virtual bool regions_came_from_canvas() const =0
MidiStreamView * midi_stream_view() const
static Handle create(Editor &editor, Gdk::Cursor *cursor)
void setup_pointer_frame_offset()
void motion(GdkEvent *, bool)
void update_transient(float old_pos, float new_pos)
void select_things(int, framepos_t, framepos_t, double, double, bool)
const Timecode::BBT_Time & start() const
void finished_copy(bool const, bool const, ARDOUR::framecnt_t const )
void motion(GdkEvent *, bool)
void motion(GdkEvent *, bool)
MeterMarkerDrag(Editor *, ArdourCanvas::Item *, bool)
ARDOUR::framepos_t _last_pointer_frame
adjusted_frame the last time a motion occurred
double y_to_region(double) const
bool set_position(framepos_t pos, void *src, double *delta=0)
void maybe_locate_with_edit_preroll(framepos_t)
ARDOUR::framepos_t grab_frame() const
void request_suspend_timecode_transmission()
void add_all_after_to_views(TimeAxisView *tav, framepos_t where, const RegionSelection &exclude, bool drag_in_progress)
int time_stretch(RegionSelection &, float fraction)
void move(ArdourCanvas::Duple)
void note_selected(NoteBase *ev, bool add, bool extend=false)
virtual void enable_display(bool yn)
ARDOUR::frameoffset_t _max_backwards_drag
void motion(GdkEvent *, bool)
void move(double xdelta, double ydelta)
void set_height(uint32_t h, TrackHeightMode m=OnlySelf)
void add(std::list< Selectable * > const &)
double _current_pointer_x
canvas-coordinate space x of the current pointer
ARDOUR::framepos_t _grab_frame
adjusted_frame that the mouse was at when start_grab was called, or 0
std::list< DraggingView > _views
information about all views that are being dragged
boost::shared_ptr< ARDOUR::MidiRegion > add_region(ARDOUR::framepos_t, ARDOUR::framecnt_t, bool)
void finished(GdkEvent *, bool)
bool contains(RegionView *) const
double current_pointer_y() const
virtual void show_timestretch(framepos_t start, framepos_t end, int layers, int layer)
ARDOUR::framecnt_t maximum_time() const
void setup_pointer_frame_offset()
MidiRegionView & region_view() const
LIBGTKMM2EXT_API uint64_t Keyboard
void toggle(std::list< Selectable * > const &)
framepos_t current_frame() const
bool region_is_shuffle_constrained(boost::shared_ptr< Region >)
void add_region(boost::shared_ptr< Region >, framepos_t position, float times=1, bool auto_partition=false)
void finished(GdkEvent *, bool)
void request_stop(bool abort=false, bool clear_state=false)
void motion(GdkEvent *, bool)
class LIBPBD_API StatefulDiffCommand
const DataType & data_type() const
MidiRubberbandSelectDrag(Editor *, MidiRegionView *)
void start_grab(GdkEvent *, Gdk::Cursor *c=0)
uint32_t order_key() const
LIBARDOUR_API RCConfiguration * Config
void add_meter(const Meter &, Timecode::BBT_Time where)
uint32_t clicked_selection
void set_position(framepos_t)
int set(framepos_t start, framepos_t end, bool allow_bbt_recompute=true)
float mouse_x_fraction() const
void replace(uint32_t time_index, framepos_t start, framepos_t end)
AVDraggingView(RegionView *)
bool video_locked() const
void point_trim(GdkEvent *, framepos_t)
const std::list< RegionView * > & by_layer() const
boost::shared_ptr< ARDOUR::Region > region() const
framecnt_t samples_per_pixel
bool _ending
true if end_grab or abort is in progress, otherwise false
VideoTimeLine * video_timeline
void finished(GdkEvent *, bool)
void motion(GdkEvent *, bool)
virtual bool y_movement_matters() const
void set_position(framepos_t)
void finished(GdkEvent *, bool)
ARDOUR::framepos_t raw_grab_frame() const
void motion(GdkEvent *, bool)
LineDrag(Editor *e, ArdourCanvas::Item *i)
double _last_pointer_y
trackview y of the pointer last time a motion occurred
ARDOUR::Location * temp_location
void begin_reversible_selection_op(std::string cmd_name)
std::vector< TimeAxisView * > _time_axis_views
void note_deselected(NoteBase *ev)
void motion(GdkEvent *, bool)
Editing::MouseMode current_mouse_mode() const
void finished(GdkEvent *, bool)
double eval(double where)
void shuffle(boost::shared_ptr< Region >, int dir)
void finished(GdkEvent *, bool)
ArdourCanvas::Container * canvas_display()
virtual void start_grab(GdkEvent *, Gdk::Cursor *)
bool _old_follow_playhead
state of Editor::follow_playhead() before the drags started
void region_going_away(RegionView *)
virtual std::string get_verbose_cursor_string(double) const
Round down only if necessary.
framepos_t region_beats_to_region_frames(Evoral::Beats beats) const
double _grab_zoom
editor frames per unit when our grab started
ArdourCanvas::Rectangle * _drag_rect
ArdourCanvas::Rectangle * transport_bar_drag_rect
boost::shared_ptr< Route > master_out() const
virtual bool allow_vertical_autoscroll() const
double current_pointer_y() const
ARDOUR::frameoffset_t snap_frame_to_frame(ARDOUR::frameoffset_t) const
void request_transport_speed(double speed, bool as_default=false)
void set_fade_in_length(framecnt_t)
double _cumulative_y_drag
bool autoscroll_active() const
void visible_order_range(int *, int *) const
static Beats ticks(uint32_t ticks)
framecnt_t get_duration() const
bool active(Editing::MouseMode m)
RegionCutDrag(Editor *, ArdourCanvas::Item *, framepos_t)
MarkerDrag(Editor *, ArdourCanvas::Item *)
CursorContext::Handle _cursor_ctx
cursor change context
virtual bool y_movement_allowed(int, double, int skip_invisible=0) const
boost::shared_ptr< ARDOUR::Region > add_midi_region(MidiTimeAxisView *)
virtual std::pair< double, float > drag_motion(double, float, bool, bool with_push, uint32_t &final_index)
FadeInDrag(Editor *, ArdourCanvas::Item *, RegionView *, std::list< RegionView * > const &)
void do_select_things(GdkEvent *, bool)
framepos_t initial_position
initial position of the region
void setup_pointer_frame_offset()
boost::shared_ptr< ARDOUR::Track > track() const
bool enabled_property(PBD::PropertyID)
bool _time_selection_at_start
double last_pointer_frame() const
void swap_grab(ArdourCanvas::Item *, Gdk::Cursor *, uint32_t)
bool y_movement_allowed(int delta_track, double delta_layer, int skip_invisible=0) const
ARDOUR::MeterSection & meter() const
void stop_canvas_autoscroll()
boost::shared_ptr< ARDOUR::Region > _region
MidiRegionSelection midi_regions
void update_vertical_drag_selection(double last_y, double y, bool extend)
AutomationRangeDrag(Editor *, AutomationTimeAxisView *, std::list< ARDOUR::AudioRange > const &)
void motion(GdkEvent *, bool)
virtual void editor_add(double when, double value)
void start_grab(GdkEvent *, Gdk::Cursor *c=0)
Drag(Editor *, ArdourCanvas::Item *, bool trackview_only=true)
RegionSelection get_regions_from_selection_and_mouse(framepos_t)
void motion(GdkEvent *, bool)
void set(Drag *, GdkEvent *, Gdk::Cursor *c=MouseCursors::invalid_cursor())
RegionCreateDrag(Editor *, ArdourCanvas::Item *, TimeAxisView *)
void set_duration(framepos_t, framepos_t)
void finished(GdkEvent *, bool)
void show_verbose_cursor_text(std::string const &)
Gdk::Cursor * right_side_trim
bool _x_constrained
true if x motion is constrained, otherwise false
ARDOUR::MidiModel::PatchChangePtr patch() const
void snap_to_with_modifier(framepos_t &first, GdkEvent const *ev, ARDOUR::RoundMode direction=ARDOUR::RoundNearest, bool for_mark=false)
void motion(GdkEvent *, bool)
ArdourCanvas::Rectangle * cd_marker_bar_drag_rect
virtual void thaw_after_trim()
double _current_pointer_y
canvas-coordinate space y of the current pointer
void select_things(int, framepos_t, framepos_t, double, double, bool)
MouseCursors const * cursors() const
double _last_pointer_x
trackview x of the pointer last time a motion occurred
void motion(GdkEvent *, bool)
frameoffset_t sync_offset(int &dir) const
#define DEBUG_TRACE(bits, str)
ARDOUR::framepos_t current_pointer_frame() const
void set_fade_out_active(bool yn)
bool motion_handler(GdkEvent *, bool)
virtual bool end_grab(GdkEvent *)
sigc::signal< void, framepos_t > UpdateAllTransportClocks
VerboseCursor * verbose_cursor() const
FadeOutDrag(Editor *, ArdourCanvas::Item *, RegionView *, std::list< RegionView * > const &)
void mouse_brush_insert_region(RegionView *, framepos_t pos)
virtual void finished(GdkEvent *e, bool m)=0
ARDOUR::framepos_t _raw_grab_frame
unsnapped frame that the mouse was at when start_grab was called, or 0
void motion(GdkEvent *, bool)
double note_divisor() const
virtual void show_region_editor()
ArdourCanvas::Container * meter_group
void find_all_between(framepos_t start, framepos_t, LocationList &, Location::Flags)
void set_position(framepos_t)
void maybe_update_session_range(framepos_t, framepos_t)
void update_resizing(NoteBase *, bool, double, bool)
void start_grab(GdkEvent *, Gdk::Cursor *c=0)
ChanCount n_inputs() const
ARDOUR::framepos_t adjusted_frame(ARDOUR::framepos_t, GdkEvent const *, bool snap=true) const
void finished(GdkEvent *, bool)
framepos_t adjust_to_sync(framepos_t) const
void request_resume_timecode_transmission()
void set_fade_in_active(bool yn)
double beats_per_minute() const
ARDOUR::framecnt_t _pointer_frame_offset
std::list< boost::shared_ptr< Region > > RegionList
void sample_to_timecode(framepos_t sample, Timecode::Time &timecode, bool use_offset, bool use_subframes) const
void remove_unselected_from_views(framecnt_t amount, bool move_regions)
framepos_t position() const
void queue_song_position_pointer()
std::set< boost::shared_ptr< ARDOUR::Playlist > > playlists() const
void start_grab(GdkEvent *, Gdk::Cursor *c=MouseCursors::invalid_cursor())
ArdourCanvas::Item * _item
our item
void maybe_autoscroll(bool, bool, bool)
int set_start(framepos_t s, bool force=false, bool allow_bbt_recompute=true)
MidiRegionView * _region_view
void finished(GdkEvent *, bool)
bool selected(TimeAxisView *)
double sample_to_pixel(framepos_t sample) const
const boost::shared_ptr< NoteType > note() const
ArdourCanvas::Container * time_line_group
LocationMarkers * find_location_markers(ARDOUR::Location *) const
double _cumulative_x_drag
void motion(GdkEvent *, bool)
void set_position(framepos_t start, framepos_t end=0)
boost::shared_ptr< ARDOUR::Playlist > initial_playlist
Editing::SnapMode snap_mode() const
void add(Location *, bool make_current=false)
void finished(GdkEvent *, bool)
void fake_locate(framepos_t)
void finished(GdkEvent *, bool)
Gdk::Cursor * anchored_left_side_trim
void setup_pointer_frame_offset()
std::list< AVDraggingView > _views
information about all audio that are being dragged along
void start_grab(GdkEvent *, Gdk::Cursor *c=0)
double _grab_x
trackview x of the grab start position
FeatureLineDrag(Editor *e, ArdourCanvas::Item *i)
void set_time(framepos_t)
bool motion_handler(GdkEvent *, bool)
LIBARDOUR_API double gain_to_slider_position_with_max(double g, double max_gain=2.0)
void motion(GdkEvent *, bool)
void rename_marker(Marker *marker)
void add_stateful_diff_commands_for_playlists(PlaylistSet const &)
ARDOUR::framepos_t start()
DraggingView(RegionView *, RegionDrag *, TimeAxisView *original_tav)
framepos_t pixel_to_sample(double pixel) const
Editing::SnapType snap_type() const
XMLNode & get_state(void)
void finished(GdkEvent *, bool)
void finished(GdkEvent *, bool)
void commit_resizing(NoteBase *, bool, double, bool)
ARDOUR::Location * location
static Selection::Operation selection_type(guint state)
framepos_t initial_position
initial position of the region
uint32_t n_channels() const
bool _jump_position_when_done
void motion(GdkEvent *, bool)
void finished_no_copy(bool const, bool const, ARDOUR::framecnt_t const )
bool have_item(ArdourCanvas::Item *) const
double child_height() const
framepos_t current_end_frame() const
double note_to_y(uint8_t note) const
void request_play_range(std::list< AudioRange > *, bool leave_rolling=false)
void remove_region_from_playlist(boost::shared_ptr< ARDOUR::Region >, boost::shared_ptr< ARDOUR::Playlist >, PlaylistSet &modified_playlists)
virtual void set_height(double)
ARDOUR::frameoffset_t total_dx() const
void finished(GdkEvent *, bool)
bool _trackview_only
true if pointer y value should always be relative to the top of the trackview group ...
RegionRippleDrag(Editor *, ArdourCanvas::Item *, RegionView *, std::list< RegionView * > const &)
void move_patch_change(PatchChange &, Evoral::Beats)
const Evoral::TimeConverter< double, ARDOUR::framepos_t > & time_converter() const
double note_height() const
bool _stop
true to stop the transport on starting the drag, otherwise false
void set_length(framecnt_t)
framepos_t current_start_frame() const
double last_pointer_y() const
RegionInsertDrag(Editor *, boost::shared_ptr< ARDOUR::Region >, RouteTimeAxisView *, ARDOUR::framepos_t)
RegionSpliceDrag(Editor *, ArdourCanvas::Item *, RegionView *, std::list< RegionView * > const &)
LIBARDOUR_API PBD::PropertyDescriptor< Evoral::Beats > length_beats
RouteGroup * route_group() const
void finished(GdkEvent *, bool)
std::list< boost::shared_ptr< AudioTrack > > new_audio_track(int input_channels, int output_channels, TrackMode mode=Normal, RouteGroup *route_group=0, uint32_t how_many=1, std::string name_template="")
LIBARDOUR_API PBD::PropertyDescriptor< framepos_t > position
ARDOUR::Location * find_location_from_marker(Marker *, bool &is_start) const
void finished(GdkEvent *, bool)
void reset_fade_in_shape_width(boost::shared_ptr< ARDOUR::AudioRegion > ar, framecnt_t, bool drag_active=false)
static UIConfiguration * config()
virtual void finished(GdkEvent *, bool)
void move_selection(double dx, double dy, double cumulative_dy)
void rdiff(std::vector< Command * > &) const
ARDOUR::AutomationList::iterator model() const
virtual void select_things(int button_state, framepos_t x1, framepos_t x2, double y1, double y2, bool drag_in_progress)=0
uint8_t highest_note() const
ArdourCanvas::Rectangle * rubberband_rect
NoteCreateDrag(Editor *, ArdourCanvas::Item *, MidiRegionView *)
Gdk::Cursor * anchored_right_side_trim
LIBARDOUR_API PBD::PropertyDescriptor< bool > select
ArdourCanvas::Rectangle * range_bar_drag_rect
uint8_t y_to_note(double y) const
virtual void region_changed(const PBD::PropertyChange &)
void setup_pointer_frame_offset()
double divisions_per_bar() const
RegionView * insert_region_into_playlist(boost::shared_ptr< ARDOUR::Region >, RouteTimeAxisView *, ARDOUR::layer_t, ARDOUR::framecnt_t, PlaylistSet &)
double last_pointer_x() const
void start_grab(GdkEvent *, Gdk::Cursor *c=0)
void start_grab(GdkEvent *, Gdk::Cursor *c=0)
void start_grab(GdkEvent *, Gdk::Cursor *c=0)
Editor * _editor
our editor
void finished(GdkEvent *, bool)
Selection & get_selection() const
bool contains(TimeAxisView const *) const
bool was_double_click() const
static float dB_to_coefficient(float dB)
void finished(GdkEvent *, bool)
void add_automation_event(GdkEvent *, framepos_t, double, bool with_guard_points)
ARDOUR::RegionList * exclude
int find_time_axis_view(TimeAxisView *) const
ARDOUR::framecnt_t get_duration()
TrackViewList track_views
void reset_point_selection()
std::list< boost::shared_ptr< MidiTrack > > new_midi_track(const ChanCount &input, const ChanCount &output, boost::shared_ptr< PluginInfo > instrument=boost::shared_ptr< PluginInfo >(), TrackMode mode=Normal, RouteGroup *route_group=0, uint32_t how_many=1, std::string name_template="")
virtual LayerDisplay layer_display() const
LIBEVORAL_API uint64_t Beats
LayerDisplay layer_display() const
void finished(GdkEvent *, bool)
RouteTimeAxisView * axis_view_from_route(boost::shared_ptr< ARDOUR::Route >) const
framepos_t round_to_beat(framepos_t frame, RoundMode dir)
void note_dropped(NoteBase *ev, ARDOUR::frameoffset_t, int8_t d_note)
framecnt_t length() const
static const framepos_t max_framepos
void motion(GdkEvent *, bool)
Round up only if necessary.
double frames_per_bar(const Tempo &, framecnt_t sr) const
RubberbandSelectDrag(Editor *, ArdourCanvas::Item *)
void split_regions_at(framepos_t, RegionSelection &)
virtual void deselect_things()=0
void motion(GdkEvent *, bool)
MidiRegionView * _region_view
void motion(GdkEvent *, bool)
TrimDrag(Editor *, ArdourCanvas::Item *, RegionView *, std::list< RegionView * > const &, bool preserve_fade_anchor=false)
void set(std::string const &)
std::pair< ARDOUR::framepos_t, ARDOUR::framepos_t > range
the range of all points on the line, in session frames
ArdourCanvas::Item & grab_item() const
static uint32_t preset_height(Height)
void finished(GdkEvent *, bool)
ControlPointDrag(Editor *, ArdourCanvas::Item *)
bool _move_threshold_passed
true if the move threshold has been passed, otherwise false
void commit_reversible_command()
void add_commands(std::vector< Command * > const &cmds)
virtual void motion(GdkEvent *e, bool f)=0
Gdk::Cursor * left_side_trim
void send_mmc_locate(framepos_t)
void hide_region_editor()
int _last_pointer_time_axis_view
void motion(GdkEvent *, bool)
virtual boost::shared_ptr< ARDOUR::Playlist > playlist() const
std::list< Drag * > _drags
ARDOUR::framepos_t _last_frame_position
last position of the thing being dragged
ARDOUR::frameoffset_t _startdrag_video_offset
TempoMarkerDrag(Editor *, ArdourCanvas::Item *, bool)
TimeFXDrag(Editor *, ArdourCanvas::Item *, RegionView *, std::list< RegionView * > const &)
void build_region_boundary_cache()
virtual bool x_movement_matters() const
LIBARDOUR_API GQuark insert_region
PBD::ScopedConnection death_connection
void begin_resizing(bool at_front)
void start_grab(GdkEvent *, Gdk::Cursor *c=0)
void start_grab(GdkEvent *, Gdk::Cursor *c=0)
void finished(GdkEvent *, bool)
std::vector< Marker * > markers
VideoTimeLineDrag(Editor *e, ArdourCanvas::Item *i)
LIBARDOUR_API GQuark region_copy
framecnt_t selection_length
void start_grab(GdkEvent *, Gdk::Cursor *c=0)
void select_things(int, framepos_t, framepos_t, double, double, bool)
virtual void set_selected(bool yn)
void start_grab(GdkEvent *, Gdk::Cursor *c=0)
void start_grab(GdkEvent *, Gdk::Cursor *c=0)
RegionView * _new_region_view
boost::shared_ptr< ARDOUR::Route > route() const
Always round down, even if on a division.
void start_grab(GdkEvent *, Gdk::Cursor *c=0)
void motion(GdkEvent *, bool)
bool end_grab(GdkEvent *)
void select_all_within(framepos_t, framepos_t, double, double, TrackViewList const &, Selection::Operation, bool)
int set_end(framepos_t e, bool force=false, bool allow_bbt_recompute=true)
std::string string_compose(const std::string &fmt, const T1 &o1)
static double _zero_gain_fraction
virtual void start_drag_line(uint32_t, uint32_t, float)
EditorRubberbandSelectDrag(Editor *, ArdourCanvas::Item *)
int apply_track_delta(const int start, const int delta, const int skip, const bool distance_only=false) const
boost::shared_ptr< ARDOUR::Playlist > playlist() const
void finished(GdkEvent *, bool)
Editing::MouseMode mouse_mode
ArdourCanvas::Container * canvas_item()
void motion(GdkEvent *, bool)
RegionDrag(Editor *, ArdourCanvas::Item *, RegionView *, std::list< RegionView * > const &)
void motion(GdkEvent *, bool)
void suspend_property_changes()
void edit_tempo_marker(TempoMarker &)
framepos_t last_frame() const
LIBARDOUR_API PBD::PropertyDescriptor< framecnt_t > length
ArdourCanvas::Rectangle * _drag_rect
void snap_to(framepos_t &first, ARDOUR::RoundMode direction=ARDOUR::RoundNearest, bool for_mark=false)
bool _pending_locate_request
LIBARDOUR_API PBD::PropertyDescriptor< bool > color