void
Editor::set_canvas_cursor ()
{
- if (_internal_editing) {
+ switch (mouse_mode) {
+ case MouseRange:
+ current_canvas_cursor = _cursors->selector;
+ break;
- switch (mouse_mode) {
- case MouseDraw:
- current_canvas_cursor = _cursors->midi_pencil;
- break;
+ case MouseObject:
+ current_canvas_cursor = which_grabber_cursor();
+ break;
- case MouseObject:
- current_canvas_cursor = which_grabber_cursor();
- break;
+ case MouseDraw:
+ current_canvas_cursor = _cursors->midi_pencil;
+ break;
- case MouseTimeFX:
- current_canvas_cursor = _cursors->midi_resize;
- break;
+ case MouseGain:
+ current_canvas_cursor = _cursors->cross_hair;
+ break;
- default:
- return;
+ case MouseZoom:
+ if (Keyboard::the_keyboard().key_is_down (GDK_Control_L)) {
+ current_canvas_cursor = _cursors->zoom_out;
+ } else {
+ current_canvas_cursor = _cursors->zoom_in;
}
+ break;
- } else {
-
- switch (mouse_mode) {
- case MouseRange:
- current_canvas_cursor = _cursors->selector;
- break;
-
- case MouseObject:
- current_canvas_cursor = which_grabber_cursor();
- break;
-
- case MouseDraw:
- /* shouldn't be possible, but just cover it anyway ... */
- current_canvas_cursor = _cursors->midi_pencil;
- break;
-
- case MouseGain:
- current_canvas_cursor = _cursors->cross_hair;
- break;
-
- case MouseZoom:
- if (Keyboard::the_keyboard().key_is_down (GDK_Control_L)) {
- current_canvas_cursor = _cursors->zoom_out;
- } else {
- current_canvas_cursor = _cursors->zoom_in;
- }
- break;
-
- case MouseTimeFX:
- current_canvas_cursor = _cursors->time_fx; // just use playhead
- break;
+ case MouseTimeFX:
+ current_canvas_cursor = _cursors->time_fx; // just use playhead
+ break;
- case MouseAudition:
- current_canvas_cursor = _cursors->speaker;
- break;
- }
+ case MouseAudition:
+ current_canvas_cursor = _cursors->speaker;
+ break;
}
switch (_join_object_range_state) {
}
set_canvas_cursor ();
+ set_gain_envelope_visibility ();
MouseModeChanged (); /* EMIT SIGNAL */
}
(mouse_mode != MouseRange) &&
(mouse_mode != MouseDraw)) ||
((event->type != GDK_BUTTON_PRESS && event->type != GDK_BUTTON_RELEASE) || event->button.button > 3) ||
- internal_editing()) {
+ (internal_editing() && mouse_mode != MouseTimeFX)) {
return;
}
AutomationTimeAxisView* atv = dynamic_cast<AutomationTimeAxisView*> (clicked_axisview);
assert (atv);
if (parent && dynamic_cast<MidiTimeAxisView*> (parent) && atv->show_regions ()) {
- /* create a MIDI region so that we have somewhere to put automation */
- _drags->set (new RegionCreateDrag (this, item, parent), event);
+
+ RouteTimeAxisView* p = dynamic_cast<RouteTimeAxisView*> (parent);
+ assert (p);
+ boost::shared_ptr<Playlist> pl = p->track()->playlist ();
+ if (pl->n_regions() == 0) {
+ /* Parent has no regions; create one so that we have somewhere to put automation */
+ _drags->set (new RegionCreateDrag (this, item, parent), event);
+ } else {
+ /* See if there's a region before the click that we can extend, and extend it if so */
+ framepos_t const t = event_frame (event);
+ boost::shared_ptr<Region> prev = pl->find_next_region (t, End, -1);
+ if (!prev) {
+ _drags->set (new RegionCreateDrag (this, item, parent), event);
+ } else {
+ prev->set_length (t - prev->position ());
+ }
+ }
} else {
/* rubberband drag to select automation points */
_drags->set (new EditorRubberbandSelectDrag (this, item), event);
/* drag notes if we're in internal edit mode */
_drags->set (new NoteResizeDrag (this, item), event, current_canvas_cursor);
return true;
- } else if ((!internal_editing() || dynamic_cast<AudioRegionView*> (clicked_regionview)) && clicked_regionview) {
- /* do time-FX if we're not in internal edit mode, or we are but we clicked on an audio region */
+ } else if (clicked_regionview) {
+ /* do time-FX */
_drags->set (new TimeFXDrag (this, item, clicked_regionview, selection->regions.by_layer()), event);
return true;
}
break;
case NoteItem:
- edit_note (item);
+ {
+ ArdourCanvas::CanvasNoteEvent* e = dynamic_cast<ArdourCanvas::CanvasNoteEvent*> (item);
+ assert (e);
+ edit_notes (e->region_view().selection ());
break;
+ }
default:
break;
}
void
-Editor::edit_note (ArdourCanvas::Item* item)
+Editor::edit_notes (MidiRegionView::Selection const & s)
{
- ArdourCanvas::CanvasNoteEvent* e = dynamic_cast<ArdourCanvas::CanvasNoteEvent*> (item);
- assert (e);
-
- EditNoteDialog d (&e->region_view(), e);
+ if (s.empty ()) {
+ return;
+ }
+
+ EditNoteDialog d (&(*s.begin())->region_view(), s);
d.set_position (Gtk::WIN_POS_MOUSE);
ensure_float (d);