}
boost::shared_ptr<Region>
-Drag::add_midi_region (MidiTimeAxisView* view)
+Drag::add_midi_region (MidiTimeAxisView* view, bool commit)
{
if (_editor->session()) {
const TempoMap& map (_editor->session()->tempo_map());
might be wrong.
*/
framecnt_t len = m.frames_per_bar (map.tempo_at (pos), _editor->session()->frame_rate());
- return view->add_region (grab_frame(), len, true);
+ return view->add_region (grab_frame(), len, commit);
}
return boost::shared_ptr<Region>();
RegionCreateDrag::motion (GdkEvent* event, bool first_move)
{
if (first_move) {
- _region = add_midi_region (_view);
+ _editor->begin_reversible_command (_("create region"));
+ _region = add_midi_region (_view, false);
_view->playlist()->freeze ();
} else {
if (_region) {
framepos_t const f = adjusted_current_frame (event);
if (f < grab_frame()) {
- _region->set_position (f);
+ _region->set_initial_position (f);
}
/* Don't use a zero-length region, and subtract 1 frame from the snapped length
RegionCreateDrag::finished (GdkEvent*, bool movement_occurred)
{
if (!movement_occurred) {
- add_midi_region (_view);
+ add_midi_region (_view, true);
} else {
_view->playlist()->thaw ();
+ _editor->commit_reversible_command();
}
}
switch (_operation) {
case StartTrim:
show_verbose_cursor_time (region_start);
- for (list<DraggingView>::iterator i = _views.begin(); i != _views.end(); ++i) {
- i->view->trim_front_starting ();
- }
break;
case EndTrim:
show_verbose_cursor_duration (region_start, region_end);
rv->enable_display (false);
rv->region()->playlist()->clear_owned_changes ();
+ if (_operation == StartTrim) {
+ rv->trim_front_starting ();
+ }
+
AudioRegionView* const arv = dynamic_cast<AudioRegionView*> (rv);
if (arv) {
} else {
/* no mouse movement */
- _editor->point_trim (event, adjusted_current_frame (event));
+ if (adjusted_current_frame (event) != adjusted_frame (_drags->current_pointer_frame(), event, false)) {
+ _editor->point_trim (event, adjusted_current_frame (event));
+ }
}
for (list<DraggingView>::const_iterator i = _views.begin(); i != _views.end(); ++i) {
- if (_operation == StartTrim) {
- i->view->trim_front_ending ();
- }
-
i->view->region()->resume_property_changes ();
}
}
swap_grab (&_marker->the_item(), 0, GDK_CURRENT_TIME);
if (!_copy) {
+ _editor->begin_reversible_command (_("move tempo mark"));
TempoMap& map (_editor->session()->tempo_map());
/* get current state */
before_state = &map.get_state();
_editor->commit_reversible_command ();
} else {
- _editor->begin_reversible_command (_("move tempo mark"));
/* we removed it before, so add it back now */
map.add_tempo (_marker->tempo(), when);
XMLNode &after = map.get_state();
_cumulative_x_drag = cx - _fixed_grab_x;
_cumulative_y_drag = cy - _fixed_grab_y;
+ cx = max (0.0, cx);
+ cy = max (0.0, cy);
+ cy = min ((double) _point->line().height(), cy);
+
// make sure we hit zero when passing through
if ((cy < zero_gain_y && (cy - dy) > zero_gain_y) || (cy > zero_gain_y && (cy - dy) < zero_gain_y)) {
cy = zero_gain_y;
}
- cx = max (0.0, cx);
- cy = max (0.0, cy);
- cy = min ((double) _point->line().height(), cy);
-
framepos_t cx_frames = _editor->pixel_to_sample (cx) + snap_delta (event->button.state);
if (!_x_constrained && need_snap) {
float const fraction = 1.0 - (cy / _point->line().height());
if (first_motion) {
+ float const initial_fraction = 1.0 - (_fixed_grab_y / _point->line().height());
_editor->begin_reversible_command (_("automation event move"));
- _point->line().start_drag_single (_point, _fixed_grab_x, fraction);
+ _point->line().start_drag_single (_point, _fixed_grab_x, initial_fraction);
}
+ pair<double, float> result;
+ result = _point->line().drag_motion (_editor->sample_to_pixel_unrounded (cx_frames), fraction, false, _pushing, _final_index);
- _point->line().drag_motion (_editor->sample_to_pixel_unrounded (cx_frames), fraction, false, _pushing, _final_index);
-
- show_verbose_cursor_text (_point->line().get_verbose_cursor_string (fraction));
+ show_verbose_cursor_text (_point->line().get_verbose_cursor_string (result.second));
}
void
}
} else {
- motion (event, false);
_point->line().end_drag (_pushing, _final_index);
_editor->commit_reversible_command ();
}
origin, and ditto for y.
*/
- double cx = event->button.x;
- double cy = event->button.y;
+ double mx = event->button.x;
+ double my = event->button.y;
- _line->parent_group().canvas_to_item (cx, cy);
+ _line->grab_item().canvas_to_item (mx, my);
- framecnt_t const frame_within_region = (framecnt_t) floor (cx * _editor->samples_per_pixel);
+ framecnt_t const frame_within_region = (framecnt_t) floor (mx * _editor->samples_per_pixel);
if (!_line->control_points_adjacent (frame_within_region, _before, _after)) {
/* no adjacent points */
Drag::start_grab (event, _editor->cursors()->fader);
- /* store grab start in parent frame */
+ /* store grab start in item frame */
+ double const bx = _line->nth (_before)->get_x();
+ double const ax = _line->nth (_after)->get_x();
+ double const click_ratio = (ax - mx) / (ax - bx);
- _fixed_grab_x = cx;
+ double const cy = ((_line->nth (_before)->get_y() * click_ratio) + (_line->nth (_after)->get_y() * (1 - click_ratio)));
+
+ _fixed_grab_x = mx;
_fixed_grab_y = cy;
double fraction = 1.0 - (cy / _line->height());
uint32_t ignored;
if (first_move) {
+ float const initial_fraction = 1.0 - (_fixed_grab_y / _line->height());
+
_editor->begin_reversible_command (_("automation range move"));
- _line->start_drag_line (_before, _after, fraction);
+ _line->start_drag_line (_before, _after, initial_fraction);
}
/* we are ignoring x position for this drag, so we can just pass in anything */
- _line->drag_motion (0, fraction, true, false, ignored);
+ pair<double, float> result;
- show_verbose_cursor_text (_line->get_verbose_cursor_string (fraction));
+ result = _line->drag_motion (0, fraction, true, false, ignored);
+ show_verbose_cursor_text (_line->get_verbose_cursor_string (result.second));
}
void
AutomationTimeAxisView* atv;
if ((atv = dynamic_cast<AutomationTimeAxisView*>(_editor->clicked_axisview)) != 0) {
- framepos_t where = _editor->canvas_event_sample (event, 0, 0);
+ framepos_t where = grab_frame ();
+
+ double cx = 0;
+ double cy = _fixed_grab_y;
+
+ _line->grab_item().item_to_canvas (cx, cy);
- atv->add_automation_event (event, where, event->button.y, false);
+ atv->add_automation_event (event, where, cy, false);
} else if (dynamic_cast<AudioTimeAxisView*>(_editor->clicked_axisview) != 0) {
AudioRegionView* arv;
if ((arv = dynamic_cast<AudioRegionView*>(_editor->clicked_regionview)) != 0) {
- arv->add_gain_point_event (arv->get_canvas_group (), event, false);
+ arv->add_gain_point_event (&arv->get_gain_line()->grab_item(), event, false);
}
}
}
/* MIDI track */
if (_editor->selection->empty() && _editor->mouse_mode == MouseDraw) {
/* nothing selected */
- add_midi_region (mtv);
+ add_midi_region (mtv, true);
do_deselect = false;
}
}
frameoffset_t ret;
if (snap) {
- ret = _region->snap_frame_to_frame (st - rp) + rp - n - snap_delta (state);
+ bool const ensure_snap = _editor->snap_mode () != SnapMagnetic;
+ ret = _region->snap_frame_to_frame (st - rp, ensure_snap) + rp - n - snap_delta (state);
} else {
ret = st - n - snap_delta (state);
}
for (list<Line>::iterator l = _lines.begin(); l != _lines.end(); ++l) {
float const f = y_fraction (l->line, current_pointer_y());
/* we are ignoring x position for this drag, so we can just pass in anything */
+ pair<double, float> result;
uint32_t ignored;
- l->line->drag_motion (0, f, true, false, ignored);
- show_verbose_cursor_text (l->line->get_verbose_cursor_relative_string (l->original_fraction, f));
+ result = l->line->drag_motion (0, f, true, false, ignored);
+ show_verbose_cursor_text (l->line->get_verbose_cursor_relative_string (l->original_fraction, result.second));
}
}