#include "time_axis_view.h"
#include "audio_time_axis.h"
#include "audio_region_view.h"
+#include "midi_region_view.h"
#include "marker.h"
#include "streamview.h"
#include "region_gain_line.h"
#include "rgb_macros.h"
#include <ardour/types.h>
+#include <ardour/profile.h>
#include <ardour/route.h>
#include <ardour/audio_track.h>
#include <ardour/audio_diskstream.h>
#include <ardour/playlist.h>
#include <ardour/audioplaylist.h>
#include <ardour/audioregion.h>
+#include <ardour/midi_region.h>
#include <ardour/dB.h>
#include <ardour/utils.h>
#include <ardour/region_factory.h>
Selection::Operation op = Keyboard::selection_type (event->button.state);
bool press = (event->type == GDK_BUTTON_PRESS);
- begin_reversible_command (_("select on click"));
-
+ // begin_reversible_command (_("select on click"));
+
switch (item_type) {
case RegionItem:
- if (mouse_mode != MouseRange) {
- commit = set_selected_regionview_from_click (press, op, true);
- } else if (event->type == GDK_BUTTON_PRESS) {
- commit = set_selected_track_from_click (press, op, false);
- }
- break;
-
case RegionViewNameHighlight:
case RegionViewName:
- if (mouse_mode != MouseRange) {
- commit = set_selected_regionview_from_click (press, op, true);
- } else if (event->type == GDK_BUTTON_PRESS) {
- commit = set_selected_track_from_click (press, op, false);
- }
- break;
-
case FadeInHandleItem:
case FadeInItem:
case FadeOutHandleItem:
commit = set_selected_track_from_click (press, op, false);
}
break;
-
+
+ case CrossfadeViewItem:
+ commit = set_selected_track_from_click (press, op, false);
+ break;
+
case GainAutomationControlPointItem:
case PanAutomationControlPointItem:
case RedirectAutomationControlPointItem:
+ commit = set_selected_track_from_click (press, op, true);
if (mouse_mode != MouseRange) {
- commit = set_selected_control_point_from_click (op, false);
+ commit |= set_selected_control_point_from_click (op, false);
}
break;
break;
}
- if (commit) {
- commit_reversible_command ();
- }
+// if (commit) {
+// commit_reversible_command ();
+// }
}
bool
start_rubberband_select (item, event);
break;
- /* <CMT Additions> */
+#ifdef WITH_CMT
case ImageFrameHandleStartItem:
imageframe_start_handle_op(item, event) ;
return(true) ;
markerview_item_end_handle_op(item, event) ;
return(true) ;
break ;
- /* </CMT Additions> */
-
- /* <CMT Additions> */
case MarkerViewItem:
start_markerview_grab(item, event) ;
break ;
case ImageFrameItem:
start_imageframe_grab(item, event) ;
break ;
- /* </CMT Additions> */
+#endif
case MarkerBarItem:
break;
case StreamItem:
- popup_track_context_menu (1, event->button.time, item_type, false, where);
- break;
-
case RegionItem:
case RegionViewNameHighlight:
case RegionViewName:
- popup_track_context_menu (1, event->button.time, item_type, false, where);
- break;
-
case SelectionItem:
- popup_track_context_menu (1, event->button.time, item_type, true, where);
- break;
-
case AutomationTrackItem:
- popup_track_context_menu (1, event->button.time, item_type, false, where);
+ case CrossfadeViewItem:
+ popup_track_context_menu (1, event->button.time, where);
break;
case MarkerBarItem:
tm_marker_context_menu (&event->button, item);
break;
- case CrossfadeViewItem:
- popup_track_context_menu (1, event->button.time, item_type, false, where);
- break;
-
- /* <CMT Additions> */
+#ifdef WITH_CMT
case ImageFrameItem:
popup_imageframe_edit_menu(1, event->button.time, item, true) ;
break ;
case MarkerTimeAxisItem:
popup_marker_time_axis_edit_menu(1, event->button.time, item, false) ;
break ;
- /* <CMT Additions> */
-
+#endif
default:
break;
case MouseObject:
switch (item_type) {
case AutomationTrackItem:
- dynamic_cast<AutomationTimeAxisView*>(clicked_trackview)->add_automation_event
+ dynamic_cast<AutomationTimeAxisView*>(clicked_axisview)->add_automation_event
(item,
event,
where,
case MouseGain:
// Gain only makes sense for audio regions
- if ( ! dynamic_cast<AudioRegionView*>(clicked_regionview))
+
+ if (!dynamic_cast<AudioRegionView*>(clicked_regionview)) {
break;
+ }
switch (item_type) {
case RegionItem:
break;
case AutomationTrackItem:
- dynamic_cast<AutomationTimeAxisView*>(clicked_trackview)->
+ dynamic_cast<AutomationTimeAxisView*>(clicked_axisview)->
add_automation_event (item, event, where, event->button.y);
return true;
break;
case 2:
switch (mouse_mode) {
- case MouseObject:
- switch (item_type) {
- case RegionItem:
- if (Keyboard::modifier_state_equals (event->button.state, Keyboard::Shift)) {
- raise_region ();
- } else if (Keyboard::modifier_state_equals (event->button.state, Keyboard::ModifierMask (Keyboard::Shift|Keyboard::Alt))) {
- lower_region ();
- } else {
- // Button2 click is unused
- }
- return true;
-
- break;
-
- default:
- break;
- }
- break;
-
case MouseRange:
// x_style_paste (where, 1.0);
at_x += 20.0;
at_y += 20.0;
- fraction = 1.0 - (cp->get_y() / cp->line.height());
+ fraction = 1.0 - ((cp->get_y() - cp->line.y_position()) / cp->line.height());
set_verbose_canvas_cursor (cp->line.get_verbose_cursor_string (fraction), at_x, at_y);
show_verbose_canvas_cursor ();
case StartSelectionTrimItem:
case EndSelectionTrimItem:
- /* <CMT Additions> */
+
+#ifdef WITH_CMT
case ImageFrameHandleStartItem:
case ImageFrameHandleEndItem:
case MarkerViewHandleStartItem:
case MarkerViewHandleEndItem:
- /* </CMT Additions> */
+#endif
if (is_drawable()) {
track_canvas.get_window()->set_cursor (*trimmer_cursor);
case EndSelectionTrimItem:
case EditCursorItem:
case PlayheadCursorItem:
- /* <CMT Additions> */
+
+#ifdef WITH_CMT
case ImageFrameHandleStartItem:
case ImageFrameHandleEndItem:
case MarkerViewHandleStartItem:
case MarkerViewHandleEndItem:
- /* </CMT Additions> */
+#endif
+
if (is_drawable()) {
track_canvas.get_window()->set_cursor (*current_canvas_cursor);
}
case PanAutomationLineItem:
case FadeInHandleItem:
case FadeOutHandleItem:
- /* <CMT Additions> */
+
+#ifdef WITH_CMT
case ImageFrameHandleStartItem:
case ImageFrameHandleEndItem:
case MarkerViewHandleStartItem:
case MarkerViewHandleEndItem:
- /* </CMT Additions> */
+#endif
+
if (drag_info.item && (event->motion.state & Gdk::BUTTON1_MASK ||
(event->motion.state & Gdk::BUTTON2_MASK))) {
if (!from_autoscroll) {
Editor::start_control_point_grab (ArdourCanvas::Item* item, GdkEvent* event)
{
ControlPoint* control_point;
-
+
if ((control_point = reinterpret_cast<ControlPoint *> (item->get_data ("control_point"))) == 0) {
fatal << _("programming error: control point canvas item has no control point object pointer!") << endmsg;
/*NOTREACHED*/
control_point->line.start_drag (control_point, drag_info.grab_frame, 0);
- float fraction = 1.0 - (control_point->get_y() / control_point->line.height());
+ float fraction = 1.0 - ((control_point->get_y() - control_point->line.y_position()) / control_point->line.height());
set_verbose_canvas_cursor (control_point->line.get_verbose_cursor_string (fraction),
drag_info.current_pointer_x + 20, drag_info.current_pointer_y + 20);
cx = max (0.0, cx);
cy = max (0.0, cy);
- cy = min ((double) cp->line.height(), cy);
+ cy = min ((double) (cp->line.y_position() + cp->line.height()), cy);
//translate cx to frames
nframes_t cx_frames = unit_to_frame (cx);
snap_to (cx_frames);
}
- float fraction = 1.0 - (cy / cp->line.height());
-
+ float const fraction = 1.0 - ((cy - cp->line.y_position()) / cp->line.height());
+
bool push;
if (Keyboard::modifier_state_contains (event->button.state, Keyboard::Control)) {
start_grab (event, fader_cursor);
- double fraction = 1.0 - (cy / line->height());
+ double const fraction = 1.0 - ((cy - line->y_position()) / line->height());
line->start_drag (0, drag_info.grab_frame, fraction);
line->parent_group().w2i (cx, cy);
- double fraction;
- fraction = 1.0 - (cy / line->height());
+ double const fraction = 1.0 - ((cy - line->y_position()) / line->height());
bool push;
start_grab (event);
double speed = 1.0;
- TimeAxisView* tvp = clicked_trackview;
+ TimeAxisView* tvp = clicked_axisview;
RouteTimeAxisView* tv = dynamic_cast<RouteTimeAxisView*>(tvp);
- if (tv && tv->is_audio_track()) {
+ if (tv && tv->is_track()) {
speed = tv->get_diskstream()->speed();
}
start_grab(event);
TimeAxisView* tv = &clicked_regionview->get_time_axis_view();
- RouteTimeAxisView* atv = dynamic_cast<RouteTimeAxisView*>(tv);
+ RouteTimeAxisView* rtv = dynamic_cast<RouteTimeAxisView*>(tv);
double speed = 1.0;
- if (atv && atv->is_audio_track()) {
- speed = atv->get_diskstream()->speed();
+ if (rtv && rtv->is_track()) {
+ speed = rtv->get_diskstream()->speed();
}
drag_info.last_trackview = &clicked_regionview->get_time_axis_view();
start_grab (event);
double speed = 1.0;
- TimeAxisView* tvp = clicked_trackview;
+ TimeAxisView* tvp = clicked_axisview;
RouteTimeAxisView* tv = dynamic_cast<RouteTimeAxisView*>(tvp);
- if (tv && tv->is_audio_track()) {
+ if (tv && tv->is_track()) {
speed = tv->get_diskstream()->speed();
}
drag_info.want_move_threshold = false; // don't copy again
/* duplicate the region(s) */
-
+
vector<RegionView*> new_regionviews;
for (list<RegionView*>::const_iterator i = selection->regions.by_layer().begin(); i != selection->regions.by_layer().end(); ++i) {
RegionView* rv;
RegionView* nrv;
- AudioRegionView* arv;
rv = (*i);
-
- if ((arv = dynamic_cast<AudioRegionView*>(rv)) == 0) {
- /* XXX handle MIDI here */
+ AudioRegionView* arv = dynamic_cast<AudioRegionView*>(rv);
+ MidiRegionView* mrv = dynamic_cast<MidiRegionView*>(rv);
+
+ if (arv) {
+ nrv = new AudioRegionView (*arv);
+ } else if (mrv) {
+ nrv = new MidiRegionView (*mrv);
+ } else {
continue;
}
- nrv = new AudioRegionView (*arv);
nrv->get_canvas_group()->show ();
new_regionviews.push_back (nrv);
/* reset drag_info data to reflect the fact that we are dragging the copies */
drag_info.data = new_regionviews.front();
-
+
swap_grab (new_regionviews.front()->get_canvas_group (), 0, event->motion.time);
}
/* Which trackview is this ? */
TimeAxisView* tvp = trackview_by_y_position (drag_info.current_pointer_y);
- AudioTimeAxisView* tv = dynamic_cast<AudioTimeAxisView*>(tvp);
+ RouteTimeAxisView* tv = dynamic_cast<RouteTimeAxisView*>(tvp);
/* The region motion is only processed if the pointer is over
an audio track.
*/
- if (!tv || !tv->is_audio_track()) {
+ if (!tv || !tv->is_track()) {
/* To make sure we hide the verbose canvas cursor when the mouse is
- not held over and audiotrack.
+ not held over a track.
*/
hide_verbose_canvas_cursor ();
return;
for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) {
TimeAxisView *tracklist_timeview;
tracklist_timeview = (*i);
- AudioTimeAxisView* atv2 = dynamic_cast<AudioTimeAxisView*>(tracklist_timeview);
+ RouteTimeAxisView* rtv2 = dynamic_cast<RouteTimeAxisView*>(tracklist_timeview);
list<TimeAxisView*> children_list;
/* zeroes are audio tracks. ones are other types. */
- if (!atv2->hidden()) {
+ if (!rtv2->hidden()) {
- if (visible_y_high < atv2->order) {
- visible_y_high = atv2->order;
+ if (visible_y_high < rtv2->order) {
+ visible_y_high = rtv2->order;
}
- if (visible_y_low > atv2->order) {
- visible_y_low = atv2->order;
+ if (visible_y_low > rtv2->order) {
+ visible_y_low = rtv2->order;
}
- if (!atv2->is_audio_track()) {
- tracks = tracks |= (0x01 << atv2->order);
+ if (!rtv2->is_track()) {
+ tracks = tracks |= (0x01 << rtv2->order);
}
- height_list[atv2->order] = (*i)->height;
+ height_list[rtv2->order] = (*i)->height;
children = 1;
- if ((children_list = atv2->get_child_list()).size() > 0) {
+ if ((children_list = rtv2->get_child_list()).size() > 0) {
for (list<TimeAxisView*>::iterator j = children_list.begin(); j != children_list.end(); ++j) {
- tracks = tracks |= (0x01 << (atv2->order + children));
- height_list[atv2->order + children] = (*j)->height;
+ tracks = tracks |= (0x01 << (rtv2->order + children));
+ height_list[rtv2->order + children] = (*j)->height;
numtracks++;
children++;
}
rv2->get_canvas_frame()->get_bounds (ix1, iy1, ix2, iy2);
rv2->get_canvas_group()->i2w (ix1, iy1);
TimeAxisView* tvp2 = trackview_by_y_position (iy1);
- RouteTimeAxisView* atv2 = dynamic_cast<RouteTimeAxisView*>(tvp2);
+ RouteTimeAxisView* rtv2 = dynamic_cast<RouteTimeAxisView*>(tvp2);
- if (atv2->order != original_pointer_order) {
+ if (rtv2->order != original_pointer_order) {
/* this isn't the pointer track */
if (canvas_pointer_y_span > 0) {
/* moving up the canvas */
- if ((atv2->order - canvas_pointer_y_span) >= visible_y_low) {
+ if ((rtv2->order - canvas_pointer_y_span) >= visible_y_low) {
int32_t visible_tracks = 0;
while (visible_tracks < canvas_pointer_y_span ) {
visible_tracks++;
- while (height_list[atv2->order - (visible_tracks - n)] == 0) {
+ while (height_list[rtv2->order - (visible_tracks - n)] == 0) {
/* we're passing through a hidden track */
n--;
}
}
- if (tracks[atv2->order - (canvas_pointer_y_span - n)] != 0x00) {
+ if (tracks[rtv2->order - (canvas_pointer_y_span - n)] != 0x00) {
clamp_y_axis = true;
}
/*moving down the canvas*/
- if ((atv2->order - (canvas_pointer_y_span - n)) <= visible_y_high) { // we will overflow
+ if ((rtv2->order - (canvas_pointer_y_span - n)) <= visible_y_high) { // we will overflow
int32_t visible_tracks = 0;
while (visible_tracks > canvas_pointer_y_span ) {
visible_tracks--;
- while (height_list[atv2->order - (visible_tracks - n)] == 0) {
+ while (height_list[rtv2->order - (visible_tracks - n)] == 0) {
n++;
}
}
- if ( tracks[atv2->order - ( canvas_pointer_y_span - n)] != 0x00) {
+ if ( tracks[rtv2->order - ( canvas_pointer_y_span - n)] != 0x00) {
clamp_y_axis = true;
}
} else {
/* this is the pointer's track */
- if ((atv2->order - pointer_y_span) > visible_y_high) { // we will overflow
+ if ((rtv2->order - pointer_y_span) > visible_y_high) { // we will overflow
clamp_y_axis = true;
- } else if ((atv2->order - pointer_y_span) < visible_y_low) { // we will underflow
+ } else if ((rtv2->order - pointer_y_span) < visible_y_low) { // we will underflow
clamp_y_axis = true;
}
}
rv->get_canvas_frame()->get_bounds (ix1, iy1, ix2, iy2);
rv->get_canvas_group()->i2w (ix1, iy1);
TimeAxisView* tvp2 = trackview_by_y_position (iy1);
- AudioTimeAxisView* canvas_atv = dynamic_cast<AudioTimeAxisView*>(tvp2);
- AudioTimeAxisView* temp_atv;
+ RouteTimeAxisView* canvas_rtv = dynamic_cast<RouteTimeAxisView*>(tvp2);
+ RouteTimeAxisView* temp_rtv;
if ((pointer_y_span != 0) && !clamp_y_axis) {
y_delta = 0;
int32_t x = 0;
for (j = height_list.begin(); j!= height_list.end(); j++) {
- if (x == canvas_atv->order) {
+ if (x == canvas_rtv->order) {
/* we found the track the region is on */
if (x != original_pointer_order) {
/*this isn't from the same track we're dragging from */
/* find out where we'll be when we move and set height accordingly */
tvp2 = trackview_by_y_position (iy1 + y_delta);
- temp_atv = dynamic_cast<AudioTimeAxisView*>(tvp2);
- rv->set_height (temp_atv->height);
+ temp_rtv = dynamic_cast<RouteTimeAxisView*>(tvp2);
+ rv->set_y_position_and_height (0, temp_rtv->height);
/* if you un-comment the following, the region colours will follow the track colours whilst dragging,
personally, i think this can confuse things, but never mind.
*/
- //const GdkColor& col (temp_atv->view->get_region_color());
+ //const GdkColor& col (temp_rtv->view->get_region_color());
//rv->set_color (const_cast<GdkColor&>(col));
break;
}
pair<set<boost::shared_ptr<Playlist> >::iterator,bool> insert_result;
bool nocommit = true;
double speed;
- RouteTimeAxisView* atv;
+ RouteTimeAxisView* rtv;
bool regionview_y_movement;
bool regionview_x_movement;
+ vector<RegionView*> copies;
/* first_move is set to false if the regionview has been moved in the
motion handler.
*/
- if (drag_info.first_move) {
+ if (drag_info.first_move && !(drag_info.copy && drag_info.x_constrained)) {
/* just a click */
goto out;
}
if (drag_info.brushing) {
/* all changes were made during motion event handlers */
+
+ if (drag_info.copy) {
+ for (list<RegionView*>::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) {
+ copies.push_back (*i);
+ }
+ }
+
goto out;
}
/* adjust for track speed */
speed = 1.0;
- atv = dynamic_cast<AudioTimeAxisView*> (drag_info.last_trackview);
- if (atv && atv->get_diskstream()) {
- speed = atv->get_diskstream()->speed();
+ rtv = dynamic_cast<RouteTimeAxisView*> (drag_info.last_trackview);
+ if (rtv && rtv->get_diskstream()) {
+ speed = rtv->get_diskstream()->speed();
}
regionview_x_movement = (drag_info.last_frame_position != (nframes_t) (rv->region()->position()/speed));
if (regionview_y_movement) {
/* moved to a different audio track. */
+
+ vector<RegionView*> new_selection;
- list<RegionView*> new_selection;
- new_selection = selection->regions.by_layer();
- selection->clear_regions ();
-
- for (list<RegionView*>::const_iterator i = new_selection.begin(); i != new_selection.end(); ++i) {
-
+ for (list<RegionView*>::const_iterator i = selection->regions.by_layer().begin(); i != selection->regions.by_layer().end(); ) {
+
RegionView* rv = (*i);
double ix1, ix2, iy1, iy2;
rv->get_canvas_frame()->get_bounds (ix1, iy1, ix2, iy2);
rv->get_canvas_group()->i2w (ix1, iy1);
TimeAxisView* tvp2 = trackview_by_y_position (iy1);
- AudioTimeAxisView* atv2 = dynamic_cast<AudioTimeAxisView*>(tvp2);
+ RouteTimeAxisView* rtv2 = dynamic_cast<RouteTimeAxisView*>(tvp2);
boost::shared_ptr<Playlist> from_playlist = rv->region()->playlist();
- boost::shared_ptr<Playlist> to_playlist = atv2->playlist();
-
+ boost::shared_ptr<Playlist> to_playlist = rtv2->playlist();
+
where = (nframes_t) (unit_to_frame (ix1) * speed);
boost::shared_ptr<Region> new_region (RegionFactory::create (rv->region()));
+ /* undo the previous hide_dependent_views so that xfades don't
+ disappear on copying regions
+ */
+
+ rv->get_time_axis_view().reveal_dependent_views (*rv);
+
if (!drag_info.copy) {
/* the region that used to be in the old playlist is not
session->add_command (new MementoCommand<Playlist>(*from_playlist, &from_playlist->get_state(), 0));
from_playlist->remove_region ((rv->region()));
session->add_command (new MementoCommand<Playlist>(*from_playlist, 0, &from_playlist->get_state()));
+
+ } else {
+
+ /* the regionview we dragged around is a temporary copy, queue it for deletion */
+
+ copies.push_back (rv);
}
latest_regionview = 0;
- sigc::connection c = atv2->view()->RegionViewAdded.connect (mem_fun(*this, &Editor::collect_new_region_view));
+ sigc::connection c = rtv2->view()->RegionViewAdded.connect (mem_fun(*this, &Editor::collect_new_region_view));
session->add_command (new MementoCommand<Playlist>(*to_playlist, &to_playlist->get_state(), 0));
to_playlist->add_region (new_region, where);
session->add_command (new MementoCommand<Playlist>(*to_playlist, 0, &to_playlist->get_state()));
c.disconnect ();
if (latest_regionview) {
- selection->add (latest_regionview);
+ new_selection.push_back (latest_regionview);
}
+ /* OK, this is where it gets tricky. If the playlist was being used by >1 tracks, and the region
+ was selected in all of them, then removing it from the playlist will have removed all
+ trace of it from the selection (i.e. there were N regions selected, we removed 1,
+ but since its the same playlist for N tracks, all N tracks updated themselves, removed the
+ corresponding regionview, and the selection is now empty).
+
+ this could have invalidated any and all iterators into the region selection.
+
+ the heuristic we use here is: if the region selection is empty, break out of the loop
+ here. if the region selection is not empty, then restart the loop because we know that
+ we must have removed at least the region(view) we've just been working on as well as any
+ that we processed on previous iterations.
+
+ EXCEPT .... if we are doing a copy drag, then the selection hasn't been modified and
+ we can just iterate.
+ */
+
if (drag_info.copy) {
- // get rid of the copy
- delete rv;
- }
+ ++i;
+ } else {
+ if (selection->regions.empty()) {
+ break;
+ } else {
+ i = selection->regions.by_layer().begin();
+ }
+ }
}
+ selection->set (new_selection);
+
} else {
/* motion within a single track */
rv = (*i);
- if (rv->region()->locked()) {
+ if (!rv->region()->can_move()) {
continue;
}
-
if (regionview_x_movement) {
double ownspeed = 1.0;
- atv = dynamic_cast<AudioTimeAxisView*> (&(rv->get_time_axis_view()));
+ rtv = dynamic_cast<RouteTimeAxisView*> (&(rv->get_time_axis_view()));
- if (atv && atv->get_diskstream()) {
- ownspeed = atv->get_diskstream()->speed();
+ if (rtv && rtv->get_diskstream()) {
+ ownspeed = rtv->get_diskstream()->speed();
}
/* base the new region position on the current position of the regionview.*/
}
/* add it */
-
+
latest_regionview = 0;
- sigc::connection c = atv->view()->RegionViewAdded.connect (mem_fun(*this, &Editor::collect_new_region_view));
- to_playlist->add_region (newregion, (nframes_t) (where * atv->get_diskstream()->speed()));
+ sigc::connection c = rtv->view()->RegionViewAdded.connect (mem_fun(*this, &Editor::collect_new_region_view));
+ to_playlist->add_region (newregion, (nframes_t) (where * rtv->get_diskstream()->speed()));
c.disconnect ();
if (latest_regionview) {
- atv->reveal_dependent_views (*latest_regionview);
+ rtv->reveal_dependent_views (*latest_regionview);
selection->add (latest_regionview);
}
- /* if the original region was locked, we don't care for the new one */
-
- newregion->set_locked (false);
-
} else {
/* just change the model */
session->add_command (new MementoCommand<Playlist>(*to_playlist, 0, &to_playlist->get_state()));
- /* get rid of the copy */
-
if (drag_info.copy) {
- delete rv;
+ copies.push_back (rv);
}
}
}
if (!nocommit) {
commit_reversible_command ();
}
+
+ for (vector<RegionView*>::iterator x = copies.begin(); x != copies.end(); ++x) {
+ delete *x;
+ }
}
void
if (Keyboard::modifier_state_contains (event->state, Keyboard::Control)) {
TimeAxisView* tv = &rv.get_time_axis_view();
- AudioTimeAxisView* atv = dynamic_cast<AudioTimeAxisView*>(tv);
+ RouteTimeAxisView* rtv = dynamic_cast<RouteTimeAxisView*>(tv);
double speed = 1.0;
- if (atv && atv->is_audio_track()) {
- speed = atv->get_diskstream()->speed();
+ if (rtv && rtv->is_track()) {
+ speed = rtv->get_diskstream()->speed();
}
if (Keyboard::modifier_state_equals (event->state, Keyboard::ModifierMask (Keyboard::Control|Keyboard::Alt))) {
return;
}
- switch (ARDOUR_UI::instance()->secondary_clock.mode ()) {
+ switch (Profile->get_small_screen() ? ARDOUR_UI::instance()->primary_clock.mode () : ARDOUR_UI::instance()->secondary_clock.mode ()) {
case AudioClock::BBT:
session->bbt_time (frame, bbt);
snprintf (buf, sizeof (buf), "%02" PRIu32 "|%02" PRIu32 "|%02" PRIu32, bbt.bars, bbt.beats, bbt.ticks);
*/
latest_regionview = 0;
- sigc::connection c = clicked_audio_trackview->view()->RegionViewAdded.connect (mem_fun(*this, &Editor::collect_new_region_view));
+ sigc::connection c = clicked_routeview->view()->RegionViewAdded.connect (mem_fun(*this, &Editor::collect_new_region_view));
/* A selection grab currently creates two undo/redo operations, one for
creating the new region and another for moving it.
begin_reversible_command (_("selection grab"));
- boost::shared_ptr<Playlist> playlist = clicked_trackview->playlist();
+ boost::shared_ptr<Playlist> playlist = clicked_axisview->playlist();
- XMLNode *before = &(playlist->get_state());
- clicked_trackview->playlist()->add_region (region, selection->time[clicked_selection].start);
- XMLNode *after = &(playlist->get_state());
+ XMLNode *before = &(playlist->get_state());
+ clicked_routeview->playlist()->add_region (region, selection->time[clicked_selection].start);
+ XMLNode *after = &(playlist->get_state());
session->add_command(new MementoCommand<Playlist>(*playlist, before, after));
commit_reversible_command ();
start_grab (event);
- drag_info.last_trackview = clicked_trackview;
+ drag_info.last_trackview = clicked_axisview;
drag_info.last_frame_position = latest_regionview->region()->position();
drag_info.pointer_frame_offset = drag_info.grab_frame - drag_info.last_frame_position;
break;
case SelectionStartTrim:
- if (clicked_trackview) {
- clicked_trackview->order_selection_trims (item, true);
+ if (clicked_axisview) {
+ clicked_axisview->order_selection_trims (item, true);
}
start_grab (event, trimmer_cursor);
start = selection->time[clicked_selection].start;
break;
case SelectionEndTrim:
- if (clicked_trackview) {
- clicked_trackview->order_selection_trims (item, false);
+ if (clicked_axisview) {
+ clicked_axisview->order_selection_trims (item, false);
}
start_grab (event, trimmer_cursor);
end = selection->time[clicked_selection].end;
drag_info.copy = false;
} else {
/* new selection-> */
- clicked_selection = selection->set (clicked_trackview, start, end);
+ clicked_selection = selection->set (clicked_axisview, start, end);
}
}
break;
Editor::start_trim (ArdourCanvas::Item* item, GdkEvent* event)
{
double speed = 1.0;
- TimeAxisView* tvp = clicked_trackview;
- AudioTimeAxisView* tv = dynamic_cast<AudioTimeAxisView*>(tvp);
+ TimeAxisView* tvp = clicked_axisview;
+ RouteTimeAxisView* tv = dynamic_cast<RouteTimeAxisView*>(tvp);
- if (tv && tv->is_audio_track()) {
+ if (tv && tv->is_track()) {
speed = tv->get_diskstream()->speed();
}
*/
double speed = 1.0;
- TimeAxisView* tvp = clicked_trackview;
+ TimeAxisView* tvp = clicked_axisview;
RouteTimeAxisView* tv = dynamic_cast<RouteTimeAxisView*>(tvp);
pair<set<boost::shared_ptr<Playlist> >::iterator,bool> insert_result;
- if (tv && tv->is_audio_track()) {
+ if (tv && tv->is_track()) {
speed = tv->get_diskstream()->speed();
}
nframes_t new_bound;
double speed = 1.0;
- TimeAxisView* tvp = clicked_trackview;
+ TimeAxisView* tvp = clicked_axisview;
RouteTimeAxisView* tv = dynamic_cast<RouteTimeAxisView*>(tvp);
- if (tv && tv->is_audio_track()) {
+ if (tv && tv->is_track()) {
speed = tv->get_diskstream()->speed();
}
nframes_t new_bound;
double speed = 1.0;
- TimeAxisView* tvp = clicked_trackview;
- AudioTimeAxisView* tv = dynamic_cast<AudioTimeAxisView*>(tvp);
+ TimeAxisView* tvp = clicked_axisview;
+ RouteTimeAxisView* tv = dynamic_cast<RouteTimeAxisView*>(tvp);
- if (tv && tv->is_audio_track()) {
+ if (tv && tv->is_track()) {
speed = tv->get_diskstream()->speed();
}
nframes_t new_bound;
double speed = 1.0;
- TimeAxisView* tvp = clicked_trackview;
- AudioTimeAxisView* tv = dynamic_cast<AudioTimeAxisView*>(tvp);
+ TimeAxisView* tvp = clicked_axisview;
+ RouteTimeAxisView* tv = dynamic_cast<RouteTimeAxisView*>(tvp);
- if (tv && tv->is_audio_track()) {
+ if (tv && tv->is_track()) {
speed = tv->get_diskstream()->speed();
}
switch (mouse_mode) {
case MouseObject:
/* find the two markers on either side and then make the selection from it */
- select_all_within (start, end, 0.0f, FLT_MAX, Selection::Set);
+ select_all_within (start, end, 0.0f, FLT_MAX, track_views, Selection::Set);
break;
case MouseRange:
begin_reversible_command (_("rubberband selection"));
if (drag_info.grab_frame < drag_info.last_pointer_frame) {
- commit = select_all_within (drag_info.grab_frame, drag_info.last_pointer_frame, y1, y2, op);
+ commit = select_all_within (drag_info.grab_frame, drag_info.last_pointer_frame, y1, y2, track_views, op);
} else {
- commit = select_all_within (drag_info.last_pointer_frame, drag_info.grab_frame, y1, y2, op);
+ commit = select_all_within (drag_info.last_pointer_frame, drag_info.grab_frame, y1, y2, track_views, op);
}
if (commit) {
string str;
prompter.get_result(str);
if (str.length()) {
- clicked_regionview->region()->set_name (str);
+ clicked_regionview->region()->set_name (str);
}
break;
}
return;
}
- RouteTimeAxisView* atv = dynamic_cast<RouteTimeAxisView*>(&arv->get_time_axis_view());
+ RouteTimeAxisView* rtv = dynamic_cast<RouteTimeAxisView*>(&arv->get_time_axis_view());
- if (atv == 0 || !atv->is_audio_track()) {
+ if (rtv == 0 || !rtv->is_track()) {
return;
}
- boost::shared_ptr<Playlist> playlist = atv->playlist();
- double speed = atv->get_diskstream()->speed();
+ boost::shared_ptr<Playlist> playlist = rtv->playlist();
+ double speed = rtv->get_diskstream()->speed();
XMLNode &before = playlist->get_state();
playlist->add_region (boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create (arv->audio_region())), (nframes_t) (pos * speed));