#include "rgb_macros.h"
#include "control_point_dialog.h"
#include "editor_drag.h"
+#include "automation_region_view.h"
#include "ardour/types.h"
#include "ardour/profile.h"
break;
case MouseObject:
- c = grabber_cursor;
+ c = grabber_note_cursor;
break;
case MouseTimeFX:
instant_save ();
+ cerr << "Mouse mode toggled to " << m << endl;
+
if (!internal_editing()) {
if (mouse_mode != MouseRange && _join_object_range_state == JOIN_OBJECT_RANGE_NONE) {
region alignment.
note: not dbl-click or triple-click
+
+ Also note that there is no region selection in internal edit mode, otherwise
+ for operations operating on the selection (e.g. cut) it is not obvious whether
+ to cut notes or regions.
*/
if (((mouse_mode != MouseObject) &&
(mouse_mode != MouseTimeFX || item_type != RegionItem) &&
(mouse_mode != MouseGain) &&
(mouse_mode != MouseRange)) ||
-
- ((event->type != GDK_BUTTON_PRESS && event->type != GDK_BUTTON_RELEASE) || event->button.button > 3)) {
+ ((event->type != GDK_BUTTON_PRESS && event->type != GDK_BUTTON_RELEASE) || event->button.button > 3) ||
+ internal_editing()) {
return;
}
if (_join_object_range_state == JOIN_OBJECT_RANGE_OBJECT && !selection->regions.empty()) {
clicked_selection = select_range_around_region (selection->regions.front());
}
-
break;
case RegionViewNameHighlight:
case RegionViewName:
+ case LeftFrameHandle:
+ case RightFrameHandle:
if (mouse_mode != MouseRange || _join_object_range_state == JOIN_OBJECT_RANGE_OBJECT) {
set_selected_regionview_from_click (press, op, true);
} else if (event->type == GDK_BUTTON_PRESS) {
break;
case ControlPointItem:
- set_selected_track_as_side_effect ();
+ set_selected_track_as_side_effect (true);
if (mouse_mode != MouseRange || _join_object_range_state == JOIN_OBJECT_RANGE_OBJECT) {
set_selected_control_point_from_click (op, false);
}
bool
Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_type)
{
- if (_drags->active ()) {
- _drags->abort ();
- }
-
/* single mouse clicks on any of these item types operate
independent of mouse mode, mostly because they are
not on the main track canvas or because we want
}
break;
+ case NoteItem:
+ if (internal_editing()) {
+ /* trim notes if we're in internal edit mode and near the ends of the note */
+ _drags->set (new NoteResizeDrag (this, item), event);
+ }
+ return true;
+
+ case StreamItem:
+ if (internal_editing()) {
+ _drags->set (new RegionCreateDrag (this, item, clicked_axisview), event);
+ return true;
+ } else {
+ _drags->set (new SelectionDrag (this, item, SelectionDrag::CreateSelection), event);
+ return true;
+ }
+ break;
+
+ case RegionViewNameHighlight:
+ case LeftFrameHandle:
+ case RightFrameHandle:
+ {
+ RegionSelection s = get_equivalent_regions (selection->regions, Properties::edit.property_id);
+ _drags->set (new TrimDrag (this, item, clicked_regionview, s.by_layer()), event);
+ return true;
+ break;
+ }
+
default:
if (!internal_editing()) {
_drags->set (new SelectionDrag (this, item, SelectionDrag::CreateSelection), event);
return true;
}
+ case FeatureLineItem:
+ {
+ if (Keyboard::modifier_state_contains (event->button.state, Keyboard::TertiaryModifier)) {
+ remove_transient(item);
+ return true;
+ }
+
+ _drags->set (new FeatureLineDrag (this, item), event);
+ return true;
+ break;
+ }
+
case RegionItem:
+ if (dynamic_cast<AutomationRegionView*> (clicked_regionview)) {
+ /* click on an automation region view; do nothing here and let the ARV's signal handler
+ sort it out.
+ */
+ break;
+ }
+
+ /* click on a normal region view */
if (Keyboard::modifier_state_contains (event->button.state, Keyboard::CopyModifier)) {
add_region_copy_drag (item, event, clicked_regionview);
- } else if (Keyboard::the_keyboard().key_is_down (GDK_b)) {
+ }
+ else if (Keyboard::the_keyboard().key_is_down (GDK_b)) {
add_region_brush_drag (item, event, clicked_regionview);
} else {
add_region_drag (item, event, clicked_regionview);
}
-
+
if (_join_object_range_state == JOIN_OBJECT_RANGE_OBJECT && !selection->regions.empty()) {
_drags->add (new SelectionDrag (this, clicked_axisview->get_selection_rect (clicked_selection)->rect, SelectionDrag::SelectionMove));
}
break;
case RegionViewNameHighlight:
- {
- RegionSelection s = get_equivalent_regions (selection->regions, Properties::edit.property_id);
- _drags->set (new TrimDrag (this, item, clicked_regionview, s.by_layer()), event);
- return true;
+ case LeftFrameHandle:
+ case RightFrameHandle:
+ if (!internal_editing ()) {
+ RegionSelection s = get_equivalent_regions (selection->regions, Properties::edit.property_id);
+ _drags->set (new TrimDrag (this, item, clicked_regionview, s.by_layer()), event);
+ return true;
+ }
break;
- }
case RegionViewName:
{
switch (item_type) {
case RegionViewNameHighlight:
- _drags->set (new TrimDrag (this, item, clicked_regionview, selection->regions.by_layer()), event);
+ case LeftFrameHandle:
+ case RightFrameHandle:
+ if (!internal_editing ()) {
+ _drags->set (new TrimDrag (this, item, clicked_regionview, selection->regions.by_layer()), event);
+ }
return true;
break;
if (pointer_window == track_canvas->get_bin_window()) {
track_canvas->window_to_world (x, y, wx, wy);
- allow_vertical_scroll = true;
- } else {
- allow_vertical_scroll = false;
}
}
return true;
}
- /* first, see if we're finishing a drag ... */
+ /* see if we're finishing a drag */
bool were_dragging = false;
if (_drags->active ()) {
were_dragging = true;
}
- button_selection (item, event, item_type);
-
/* edit events get handled here */
if (!_drags->active () && Keyboard::is_edit_event (&event->button)) {
case RegionItem:
case RegionViewNameHighlight:
+ case LeftFrameHandle:
+ case RightFrameHandle:
case RegionViewName:
popup_track_context_menu (1, event->button.time, item_type, false, where);
break;
}
break;
+ case NoteItem:
+ remove_midi_note (item, event);
+ break;
+
default:
break;
}
break;
case MouseGain:
- // Gain only makes sense for audio regions
-
- if (!dynamic_cast<AudioRegionView*>(clicked_regionview)) {
- break;
- }
-
switch (item_type) {
case RegionItem:
+ {
/* check that we didn't drag before releasing, since
its really annoying to create new control
points when doing this.
*/
- if (were_dragging) {
- dynamic_cast<AudioRegionView*>(clicked_regionview)->add_gain_point_event (item, event);
+ AudioRegionView* arv = dynamic_cast<AudioRegionView*> (clicked_regionview);
+ if (were_dragging && arv) {
+ arv->add_gain_point_event (item, event);
}
return true;
break;
+ }
case AutomationTrackItem:
dynamic_cast<AutomationTimeAxisView*>(clicked_axisview)->
ControlPoint* cp;
Marker * marker;
double fraction;
+ bool ret = true;
if (last_item_entered != item) {
last_item_entered = item;
break;
case RegionViewNameHighlight:
- if (is_drawable() && mouse_mode == MouseObject) {
+ if (is_drawable() && mouse_mode == MouseObject && !internal_editing()) {
track_canvas->get_window()->set_cursor (*trimmer_cursor);
}
break;
+ case LeftFrameHandle:
+ if (is_drawable() && mouse_mode == MouseObject && !internal_editing()) {
+ track_canvas->get_window()->set_cursor (*left_side_trim_cursor);
+ }
+ break;
+
+ case RightFrameHandle:
+ if (is_drawable() && mouse_mode == MouseObject && !internal_editing()) {
+ track_canvas->get_window()->set_cursor (*right_side_trim_cursor);
+ }
+ break;
+
case StartSelectionTrimItem:
case EndSelectionTrimItem:
track_canvas->get_window()->set_cursor (*timebar_cursor);
}
break;
+
case FadeInHandleItem:
+ if (mouse_mode == MouseObject && !internal_editing()) {
+ ArdourCanvas::SimpleRect *rect = dynamic_cast<ArdourCanvas::SimpleRect *> (item);
+ if (rect) {
+ rect->property_fill_color_rgba() = 0;
+ rect->property_outline_pixels() = 1;
+ }
+ track_canvas->get_window()->set_cursor (*fade_in_cursor);
+ }
+ break;
+
case FadeOutHandleItem:
- if (mouse_mode == MouseObject) {
+ if (mouse_mode == MouseObject && !internal_editing()) {
ArdourCanvas::SimpleRect *rect = dynamic_cast<ArdourCanvas::SimpleRect *> (item);
if (rect) {
rect->property_fill_color_rgba() = 0;
rect->property_outline_pixels() = 1;
}
- track_canvas->get_window()->set_cursor (*grabber_cursor);
+ track_canvas->get_window()->set_cursor (*fade_out_cursor);
+ }
+ break;
+ case FeatureLineItem:
+ {
+ ArdourCanvas::SimpleLine *line = dynamic_cast<ArdourCanvas::SimpleLine *> (item);
+ line->property_color_rgba() = 0xFF0000FF;
}
break;
-
default:
break;
}
break;
}
- return false;
+ return ret;
}
bool
Location *loc;
RegionView* rv;
bool is_start;
+ bool ret = true;
switch (item_type) {
case ControlPointItem:
break;
case RegionViewNameHighlight:
+ case LeftFrameHandle:
+ case RightFrameHandle:
case StartSelectionTrimItem:
case EndSelectionTrimItem:
case PlayheadCursorItem:
Glib::signal_idle().connect (sigc::mem_fun(*this, &Editor::left_automation_track));
}
break;
+ case FeatureLineItem:
+ {
+ ArdourCanvas::SimpleLine *line = dynamic_cast<ArdourCanvas::SimpleLine *> (item);
+ line->property_color_rgba() = (guint) ARDOUR_UI::config()->canvasvar_ZeroLine.get();;
+ }
+ break;
default:
break;
}
- return false;
+ return ret;
}
gint
if (_drags->active ()) {
handled = _drags->motion_handler (event, from_autoscroll);
}
-
+
if (!handled) {
return false;
}
mins = frame / (frame_rate * 60);
frame = frame % (frame_rate * 60);
secs = (float) frame / (float) frame_rate;
- snprintf (buf, sizeof (buf), "%02" PRId32 ":%02" PRId32 ":%.4f", hours, mins, secs);
+ snprintf (buf, sizeof (buf), "%02" PRId32 ":%02" PRId32 ":%07.4f", hours, mins, secs);
break;
default:
mins = distance / (frame_rate * 60);
distance = distance % (frame_rate * 60);
secs = (float) distance / (float) frame_rate;
- snprintf (buf, sizeof (buf), "%02" PRId32 ":%02" PRId32 ":%.4f", hours, mins, secs);
+ snprintf (buf, sizeof (buf), "%02" PRId32 ":%02" PRId32 ":%07.4f", hours, mins, secs);
break;
default:
mouse_select_button.set_image (*(manage (new Image (::get_icon("midi_tool_pencil")))));
mouse_select_button.get_image ()->show ();
ARDOUR_UI::instance()->tooltips().set_tip (mouse_select_button, _("Draw/Edit MIDI Notes"));
-
- for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) {
- MidiTimeAxisView* mtv = dynamic_cast<MidiTimeAxisView*> (*i);
- if (mtv) {
- mtv->start_step_editing ();
- }
- }
-
- for (TrackSelection::iterator i = selection->tracks.begin(); i != selection->tracks.end(); ++i) {
- (*i)->hide_selection ();
- }
-
- start_step_editing ();
set_canvas_cursor ();
+ /* deselect everything to avoid confusion when e.g. we can't now cut a previously selected
+ region because cut means "cut note" rather than "cut region".
+ */
+ selection->clear ();
+
} else {
mouse_select_button.set_image (*(manage (new Image (::get_icon("tool_range")))));
mouse_select_button.get_image ()->show ();
ARDOUR_UI::instance()->tooltips().set_tip (mouse_select_button, _("Select/Move Ranges"));
- stop_step_editing ();
-
- for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) {
- MidiTimeAxisView* mtv = dynamic_cast<MidiTimeAxisView*> (*i);
- if (mtv) {
- mtv->stop_step_editing ();
- }
- }
-
- mouse_mode_toggled (mouse_mode);
+ mouse_mode_toggled (mouse_mode); // sets cursor
}
}
return mouse_mode;
}
+
+void
+Editor::remove_midi_note (ArdourCanvas::Item* item, GdkEvent *)
+{
+ ArdourCanvas::CanvasNoteEvent* e = dynamic_cast<ArdourCanvas::CanvasNoteEvent*> (item);
+ assert (e);
+
+ e->region_view().delete_note (e->note ());
+}