X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Feditor_mouse.cc;h=8a8a9518cf02b9ee912a2cbcf744dd97cda600f8;hb=cf52d6e4b40111eb04b244ec054055a4ec15dbe0;hp=51b6795b1a8590c6dfa241ec2744489268f604b2;hpb=486d47db0e5c2cc6ac307126155baa20bf8d89a7;p=ardour.git diff --git a/gtk2_ardour/editor_mouse.cc b/gtk2_ardour/editor_mouse.cc index 51b6795b1a..8a8a9518cf 100644 --- a/gtk2_ardour/editor_mouse.cc +++ b/gtk2_ardour/editor_mouse.cc @@ -34,7 +34,6 @@ #include "gtkmm2ext/bindings.h" #include "gtkmm2ext/utils.h" -#include "gtkmm2ext/tearoff.h" #include "canvas/canvas.h" @@ -47,7 +46,6 @@ #include "ardour/session.h" #include "ardour/types.h" -#include "ardour_ui.h" #include "actions.h" #include "editor.h" #include "time_axis_view.h" @@ -73,7 +71,7 @@ #include "verbose_cursor.h" #include "note.h" -#include "i18n.h" +#include "pbd/i18n.h" using namespace std; using namespace ARDOUR; @@ -86,7 +84,7 @@ bool Editor::mouse_frame (framepos_t& where, bool& in_track_canvas) const { /* gdk_window_get_pointer() has X11's XQueryPointer semantics in that it only - pays attentions to subwindows. this means that menu windows are ignored, and + pays attentions to subwindows. this means that menu windows are ignored, and if the pointer is in a menu, the return window from the call will be the the regular subwindow *under* the menu. @@ -208,16 +206,12 @@ void Editor::mouse_mode_object_range_toggled() { MouseMode m = mouse_mode; - + Glib::RefPtr act = ActionManager::get_action (X_("MouseMode"), X_("set-mouse-mode-range")); assert (act); Glib::RefPtr tact = Glib::RefPtr::cast_dynamic (act); assert (tact); - if (tact->get_active()) { - m = MouseObject; //Smart mode turned to ON, force editing to Object mode - } - set_mouse_mode(m, true); //call this so the button styles can get updated } @@ -318,7 +312,7 @@ Editor::mouse_mode_toggled (MouseMode m) } set_gain_envelope_visibility (); - + update_time_selection_display (); update_all_enter_cursors (); @@ -335,37 +329,59 @@ Editor::internal_editing() const void Editor::update_time_selection_display () { - if (smart_mode_action->get_active()) { - /* not sure what to do here */ - if (mouse_mode == MouseObject) { - } else { - } - } else { - switch (mouse_mode) { - case MouseRange: - selection->clear_objects (); - selection->ClearMidiNoteSelection(); //signal - break; - case MouseObject: - selection->clear_objects (); - selection->clear_time (); - selection->clear_tracks (); - selection->ClearMidiNoteSelection(); //signal - break; - case MouseContent: - case MouseDraw: - //if we go into internal editing, clear everything in the outside world - selection->clear_objects (); - selection->clear_time (); - selection->clear_tracks (); - break; - default: - //clear everything - selection->clear_objects (); - selection->clear_time (); - selection->clear_tracks (); - break; - } + switch (mouse_mode) { + case MouseRange: + selection->clear_objects (); + selection->clear_midi_notes (); + break; + case MouseObject: + selection->clear_time (); + selection->clear_tracks (); + selection->clear_midi_notes (); + break; + case MouseDraw: + /* Clear regions, but not time or tracks, since that + would destroy the range selection rectangle, which we need to stick + around for AutomationRangeDrag. */ + selection->clear_regions (); + selection->clear_playlists (); + break; + case MouseContent: + /* This handles internal edit. + Clear everything except points and notes. + */ + selection->clear_regions(); + selection->clear_lines(); + selection->clear_playlists (); + + selection->clear_time (); + selection->clear_tracks (); + break; + + case MouseTimeFX: + /* We probably want to keep region selection */ + selection->clear_points (); + selection->clear_lines(); + selection->clear_playlists (); + + selection->clear_time (); + selection->clear_tracks (); + break; + + case MouseAudition: + /*Don't lose lines or points if no action in this mode */ + selection->clear_regions (); + selection->clear_playlists (); + selection->clear_time (); + selection->clear_tracks (); + break; + + default: + /*Clear everything */ + selection->clear_objects(); + selection->clear_time (); + selection->clear_tracks (); + break; } } @@ -382,8 +398,9 @@ Editor::step_mouse_mode (bool next) } void -Editor::button_selection (ArdourCanvas::Item* /*item*/, GdkEvent* event, ItemType item_type) +Editor::button_selection (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_type) { + /* in object/audition/timefx/gain-automation mode, any button press sets the selection if the object can be selected. this is a bit of hack, because @@ -428,7 +445,8 @@ Editor::button_selection (ArdourCanvas::Item* /*item*/, GdkEvent* event, ItemTyp if (((mouse_mode != MouseObject) && (mouse_mode != MouseAudition || item_type != RegionItem) && (mouse_mode != MouseTimeFX || item_type != RegionItem) && - (mouse_mode != MouseDraw)) || + (mouse_mode != MouseDraw) && + (mouse_mode != MouseContent || item_type == RegionItem)) || ((event->type != GDK_BUTTON_PRESS && event->type != GDK_BUTTON_RELEASE) || event->button.button > 3)) { return; } @@ -439,7 +457,9 @@ Editor::button_selection (ArdourCanvas::Item* /*item*/, GdkEvent* event, ItemTyp /* almost no selection action on modified button-2 or button-3 events */ - if (item_type != RegionItem && event->button.button != 2) { + if ((item_type != RegionItem && event->button.button != 2) + /* for selection of control points prior to delete (shift-right click) */ + && !(item_type == ControlPointItem && event->button.button == 3 && event->type == GDK_BUTTON_PRESS)) { return; } } @@ -448,11 +468,18 @@ Editor::button_selection (ArdourCanvas::Item* /*item*/, GdkEvent* event, ItemTyp Selection::Operation op = ArdourKeyboard::selection_type (event->button.state); bool press = (event->type == GDK_BUTTON_PRESS); + if (press) { + _mouse_changed_selection = false; + } + switch (item_type) { case RegionItem: + if (eff_mouse_mode == MouseDraw) { + break; + } if (press) { if (eff_mouse_mode != MouseRange) { - set_selected_regionview_from_click (press, op); + _mouse_changed_selection = set_selected_regionview_from_click (press, op); } else { /* don't change the selection unless the clicked track is not currently selected. if @@ -465,7 +492,7 @@ Editor::button_selection (ArdourCanvas::Item* /*item*/, GdkEvent* event, ItemTyp } } else { if (eff_mouse_mode != MouseRange) { - set_selected_regionview_from_click (press, op); + _mouse_changed_selection |= set_selected_regionview_from_click (press, op); } } break; @@ -483,16 +510,104 @@ Editor::button_selection (ArdourCanvas::Item* /*item*/, GdkEvent* event, ItemTyp case StartCrossFadeItem: case EndCrossFadeItem: if (get_smart_mode() || eff_mouse_mode != MouseRange) { - set_selected_regionview_from_click (press, op); + _mouse_changed_selection |= set_selected_regionview_from_click (press, op); } else if (event->type == GDK_BUTTON_PRESS) { set_selected_track_as_side_effect (op); } break; case ControlPointItem: - set_selected_track_as_side_effect (op); + /* for object/track exclusivity, we don't call set_selected_track_as_side_effect (op); */ + if (eff_mouse_mode != MouseRange) { - set_selected_control_point_from_click (press, op); + if (event->button.button != 3) { + _mouse_changed_selection |= set_selected_control_point_from_click (press, op); + } else { + _mouse_changed_selection |= set_selected_control_point_from_click (press, Selection::Set); + } + } + break; + + case GainLineItem: + if (eff_mouse_mode != MouseRange) { + AutomationLine* argl = reinterpret_cast (item->get_data ("line")); + + std::list selectables; + uint32_t before, after; + framecnt_t const where = (framecnt_t) floor (event->button.x * samples_per_pixel) - clicked_regionview->region ()->position (); + + if (!argl || !argl->control_points_adjacent (where, before, after)) { + break; + } + + selectables.push_back (argl->nth (before)); + selectables.push_back (argl->nth (after)); + + switch (op) { + case Selection::Set: + if (press) { + selection->set (selectables); + _mouse_changed_selection = true; + } + break; + case Selection::Add: + if (press) { + selection->add (selectables); + _mouse_changed_selection = true; + } + break; + case Selection::Toggle: + if (press) { + selection->toggle (selectables); + _mouse_changed_selection = true; + } + break; + + case Selection::Extend: + /* XXX */ + break; + } + } + break; + + case AutomationLineItem: + if (eff_mouse_mode != MouseRange) { + AutomationLine* al = reinterpret_cast (item->get_data ("line")); + std::list selectables; + uint32_t before, after; + framecnt_t const where = (framecnt_t) floor (event->button.x * samples_per_pixel); + + if (!al || !al->control_points_adjacent (where, before, after)) { + break; + } + + selectables.push_back (al->nth (before)); + selectables.push_back (al->nth (after)); + + switch (op) { + case Selection::Set: + if (press) { + selection->set (selectables); + _mouse_changed_selection = true; + } + break; + case Selection::Add: + if (press) { + selection->add (selectables); + _mouse_changed_selection = true; + } + break; + case Selection::Toggle: + if (press) { + selection->toggle (selectables); + _mouse_changed_selection = true; + } + break; + + case Selection::Extend: + /* XXX */ + break; + } } break; @@ -501,16 +616,42 @@ Editor::button_selection (ArdourCanvas::Item* /*item*/, GdkEvent* event, ItemTyp if (event->button.button == 3) { selection->clear_tracks (); set_selected_track_as_side_effect (op); + + /* We won't get a release.*/ + begin_reversible_selection_op (X_("Button 3 Menu Select")); + commit_reversible_selection_op (); } break; case AutomationTrackItem: - set_selected_track_as_side_effect (op); + if (eff_mouse_mode != MouseDraw && op == Selection::Set) { + set_selected_track_as_side_effect (op); + } + break; + + case NoteItem: + if (press && event->button.button == 3) { + NoteBase* cnote = reinterpret_cast (item->get_data ("notebase")); + assert (cnote); + if (cnote->region_view().selection_size() == 0 || !cnote->selected()) { + selection->clear_points(); + cnote->region_view().unique_select (cnote); + /* we won't get the release, so store the selection change now */ + begin_reversible_selection_op (X_("Button 3 Note Selection")); + commit_reversible_selection_op (); + } + } break; default: break; } + + if ((!press) && _mouse_changed_selection) { + begin_reversible_selection_op (X_("Button Selection")); + commit_reversible_selection_op (); + _mouse_changed_selection = false; + } } bool @@ -543,7 +684,7 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT new TempoMarkerDrag ( this, item, - Keyboard::modifier_state_contains (event->button.state, Keyboard::CopyModifier) + Keyboard::modifier_state_equals (event->button.state, Keyboard::CopyModifier) ), event ); @@ -556,7 +697,7 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT new MeterMarkerDrag ( this, item, - Keyboard::modifier_state_contains (event->button.state, Keyboard::CopyModifier) + Keyboard::modifier_state_equals (event->button.state, Keyboard::CopyModifier) ), event ); @@ -570,13 +711,17 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT case MarkerBarItem: case TempoBarItem: + case TempoCurveItem: case MeterBarItem: case TimecodeRulerItem: case SamplesRulerItem: case MinsecRulerItem: case BBTRulerItem: - if (!Keyboard::modifier_state_equals (event->button.state, Keyboard::PrimaryModifier)) { + if (!Keyboard::modifier_state_equals (event->button.state, Keyboard::PrimaryModifier) + && !Keyboard::modifier_state_contains (event->button.state, ArdourKeyboard::constraint_modifier())) { _drags->set (new CursorDrag (this, *playhead_cursor, false), event); + } else if (Keyboard::modifier_state_contains (event->button.state, ArdourKeyboard::constraint_modifier())) { + _drags->set (new BBTRulerDrag (this, item), event); } return true; break; @@ -632,7 +777,7 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT Editing::MouseMode eff = effective_mouse_mode (); /* special case: allow drag of region fade in/out in object mode with join object/range enabled */ - if (get_smart_mode()) { + if (get_smart_mode()) { switch (item_type) { case FadeInHandleItem: case FadeInTrimHandleItem: @@ -729,21 +874,37 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT } return true; + case GainLineItem: + _drags->set (new LineDrag (this, item), event); + return true; + break; + case ControlPointItem: _drags->set (new ControlPointDrag (this, item), event); return true; break; + case AutomationLineItem: + _drags->set (new LineDrag (this, item), event); + return true; + break; + case StreamItem: - if (dynamic_cast (clicked_axisview)) { - _drags->set (new RegionCreateDrag (this, item, clicked_axisview), event); - return true; - } + //in the past, we created a new midi region here, but perhaps that is best left to the Draw mode break; case AutomationTrackItem: /* rubberband drag to select automation points */ _drags->set (new EditorRubberbandSelectDrag (this, item), event); + return true; + break; + + case RegionItem: + if (dynamic_cast(clicked_regionview)) { + /* rubberband drag to select automation points */ + _drags->set (new EditorRubberbandSelectDrag (this, item), event); + return true; + } break; default: @@ -774,7 +935,7 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT case StartCrossFadeItem: case EndCrossFadeItem: - /* we might allow user to grab inside the fade to trim a region with preserve_fade_anchor. for not this is not fully implemented */ + /* we might allow user to grab inside the fade to trim a region with preserve_fade_anchor. for not this is not fully implemented */ // if (!clicked_regionview->region()->locked()) { // _drags->set (new TrimDrag (this, item, clicked_regionview, selection->regions.by_layer(), true), event); // return true; @@ -876,7 +1037,7 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT if (!prev) { _drags->set (new RegionCreateDrag (this, item, parent), event); } else { - prev->set_length (t - prev->position ()); + prev->set_length (t - prev->position (), get_grid_music_divisions (event->button.state)); } } } else { @@ -915,12 +1076,13 @@ Editor::button_press_handler_1 (ArdourCanvas::Item* item, GdkEvent* event, ItemT case SelectionItem: { - AudioRegionView* arv = dynamic_cast (clicked_regionview); - if (arv) { - _drags->set (new AutomationRangeDrag (this, arv, selection->time), event, _cursors->up_down); + if (dynamic_cast(clicked_regionview) || + dynamic_cast(clicked_regionview)) { + _drags->set (new AutomationRangeDrag (this, clicked_regionview, selection->time), + event, _cursors->up_down); } else { double const y = event->button.y; - pair tvp = trackview_by_y_position (y); + pair tvp = trackview_by_y_position (y, false); if (tvp.first) { AutomationTimeAxisView* atv = dynamic_cast (tvp.first); if ( atv) { @@ -1056,7 +1218,7 @@ Editor::button_press_handler_2 (ArdourCanvas::Item* item, GdkEvent* event, ItemT return false; } - + bool Editor::button_press_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_type) { @@ -1088,7 +1250,7 @@ Editor::button_press_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemTyp } //not rolling, range mode click + join_play_range : locate the PH here - if ( !_drags->active () && !_session->transport_rolling() && ( effective_mouse_mode() == MouseRange ) && ARDOUR_UI::config()->get_follow_edits() ) { + if ( !_drags->active () && _session && !_session->transport_rolling() && ( effective_mouse_mode() == MouseRange ) && UIConfiguration::instance().get_follow_edits() && !_session->config.get_external_sync() ) { framepos_t where = canvas_event_sample (event); snap_to(where); _session->request_locate (where, false); @@ -1149,20 +1311,24 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT return true; } - /* see if we're finishing a drag */ + bool were_dragging = false; - bool were_dragging = false; - if (_drags->active ()) { - bool const r = _drags->end_grab (event); - if (r) { - /* grab dragged, so do nothing else */ - return true; - } + if (!Keyboard::is_context_menu_event (&event->button)) { - were_dragging = true; - } + /* see if we're finishing a drag */ + + if (_drags->active ()) { + bool const r = _drags->end_grab (event); + if (r) { + /* grab dragged, so do nothing else */ + return true; + } - update_region_layering_order_editor (); + were_dragging = true; + } + + update_region_layering_order_editor (); + } /* edit events get handled here */ @@ -1171,34 +1337,33 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT case RegionItem: show_region_properties (); break; - case TempoMarkerItem: { - Marker* marker; + ArdourMarker* marker; TempoMarker* tempo_marker; - - if ((marker = reinterpret_cast (item->get_data ("marker"))) == 0) { + + if ((marker = reinterpret_cast (item->get_data ("marker"))) == 0) { fatal << _("programming error: tempo marker canvas item has no marker object pointer!") << endmsg; abort(); /*NOTREACHED*/ } - + if ((tempo_marker = dynamic_cast (marker)) == 0) { fatal << _("programming error: marker for tempo is not a tempo marker!") << endmsg; abort(); /*NOTREACHED*/ } - + edit_tempo_marker (*tempo_marker); break; } case MeterMarkerItem: { - Marker* marker; + ArdourMarker* marker; MeterMarker* meter_marker; - - if ((marker = reinterpret_cast (item->get_data ("marker"))) == 0) { + + if ((marker = reinterpret_cast (item->get_data ("marker"))) == 0) { fatal << _("programming error: tempo marker canvas item has no marker object pointer!") << endmsg; abort(); /*NOTREACHED*/ } - + if ((meter_marker = dynamic_cast (marker)) == 0) { fatal << _("programming error: marker for meter is not a meter marker!") << endmsg; abort(); /*NOTREACHED*/ @@ -1266,7 +1431,7 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT case SelectionItem: popup_track_context_menu (1, event->button.time, item_type, true); break; - + case AutomationTrackItem: popup_track_context_menu (1, event->button.time, item_type, false); break; @@ -1276,6 +1441,7 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT case TransportMarkerBarItem: case CdMarkerBarItem: case TempoBarItem: + case TempoCurveItem: case MeterBarItem: case VideoBarItem: case TimecodeRulerItem: @@ -1385,8 +1551,8 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT mouse_add_new_marker (where, true); } return true; - case TempoBarItem: + case TempoCurveItem: if (!_dragging_playhead) { snap_to_with_modifier (where, event); mouse_add_new_tempo_event (where); @@ -1453,7 +1619,7 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT default: break; } - } else { + } else if (_session) { /* make sure we stop */ _session->request_transport_speed (0.0); } @@ -1465,7 +1631,8 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT } /* do any (de)selection operations that should occur on button release */ - button_selection (item, event, item_type); + button_selection (item, event, item_type); + return true; break; @@ -1494,7 +1661,7 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT case MouseDraw: return true; - + case MouseRange: // x_style_paste (where, 1.0); return true; @@ -1520,12 +1687,12 @@ bool Editor::enter_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_type) { ControlPoint* cp; - Marker * marker; + ArdourMarker * marker; double fraction; bool ret = true; /* by the time we reach here, entered_regionview and entered trackview - * will have already been set as appropriate. Things are done this + * will have already been set as appropriate. Things are done this * way because this method isn't passed a pointer to a variable type of * thing that is entered (which may or may not be canvas item). * (e.g. the actual entered regionview) @@ -1535,7 +1702,7 @@ Editor::enter_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_ switch (item_type) { case ControlPointItem: - if (mouse_mode == MouseDraw || mouse_mode == MouseObject) { + if (mouse_mode == MouseDraw || mouse_mode == MouseObject || mouse_mode == MouseContent) { cp = static_cast(item->get_data ("control_point")); cp->show (); @@ -1550,7 +1717,7 @@ Editor::enter_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_ if (mouse_mode == MouseDraw) { ArdourCanvas::Line *line = dynamic_cast (item); if (line) { - line->set_outline_color (ARDOUR_UI::config()->color ("entered gain line")); + line->set_outline_color (UIConfiguration::instance().color ("entered gain line")); } } break; @@ -1559,7 +1726,7 @@ Editor::enter_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_ if (mouse_mode == MouseDraw || mouse_mode == MouseObject) { ArdourCanvas::Line *line = dynamic_cast (item); if (line) { - line->set_outline_color (ARDOUR_UI::config()->color ("entered automation line")); + line->set_outline_color (UIConfiguration::instance().color ("entered automation line")); } } break; @@ -1573,11 +1740,11 @@ Editor::enter_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_ break; case MarkerItem: - if ((marker = static_cast (item->get_data ("marker"))) == 0) { + if ((marker = static_cast (item->get_data ("marker"))) == 0) { break; } entered_marker = marker; - marker->set_color_rgba (ARDOUR_UI::config()->color ("entered marker")); + marker->set_color_rgba (UIConfiguration::instance().color ("entered marker")); // fall through case MeterMarkerItem: case TempoMarkerItem: @@ -1615,6 +1782,14 @@ Editor::enter_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemType item_ case SelectionItem: break; + case WaveItem: + { + if (entered_regionview) { + entered_regionview->entered(); + } + } + break; + default: break; } @@ -1646,7 +1821,7 @@ bool Editor::leave_handler (ArdourCanvas::Item* item, GdkEvent*, ItemType item_type) { AutomationLine* al; - Marker *marker; + ArdourMarker *marker; Location *loc; bool is_start; bool ret = true; @@ -1657,7 +1832,7 @@ Editor::leave_handler (ArdourCanvas::Item* item, GdkEvent*, ItemType item_type) switch (item_type) { case ControlPointItem: - _verbose_cursor->hide (); + _verbose_cursor->hide (); break; case GainLineItem: @@ -1672,7 +1847,7 @@ Editor::leave_handler (ArdourCanvas::Item* item, GdkEvent*, ItemType item_type) break; case MarkerItem: - if ((marker = static_cast (item->get_data ("marker"))) == 0) { + if ((marker = static_cast (item->get_data ("marker"))) == 0) { break; } entered_marker = 0; @@ -1691,7 +1866,7 @@ Editor::leave_handler (ArdourCanvas::Item* item, GdkEvent*, ItemType item_type) { ArdourCanvas::Rectangle *rect = dynamic_cast (item); if (rect) { - rect->set_fill_color (ARDOUR_UI::config()->color ("inactive fade handle")); + rect->set_fill_color (UIConfiguration::instance().color ("inactive fade handle")); } } break; @@ -1702,7 +1877,7 @@ Editor::leave_handler (ArdourCanvas::Item* item, GdkEvent*, ItemType item_type) case FeatureLineItem: { ArdourCanvas::Line *line = dynamic_cast (item); - line->set_outline_color (ARDOUR_UI::config()->color ("zero line")); + line->set_outline_color (UIConfiguration::instance().color ("zero line")); } break; @@ -1817,14 +1992,14 @@ Editor::motion_handler (ArdourCanvas::Item* /*item*/, GdkEvent* event, bool from current_stepping_trackview = 0; step_timeout.disconnect (); } - + if (_session && _session->actively_recording()) { /* Sorry. no dragging stuff around while we record */ return true; } - + update_join_object_range_location (event->motion.y); - + if (_drags->active ()) { return _drags->motion_handler (event, from_autoscroll); } @@ -1881,7 +2056,6 @@ Editor::edit_control_point (ArdourCanvas::Item* item) } ControlPointDialog d (p); - ensure_float (d); if (d.run () != RESPONSE_ACCEPT) { return; @@ -1901,7 +2075,6 @@ Editor::edit_notes (MidiRegionView* mrv) EditNoteDialog* d = new EditNoteDialog (mrv, s); d->show_all (); - ensure_float (*d); d->signal_response().connect (sigc::bind (sigc::mem_fun (*this, &Editor::note_edit_done), d)); } @@ -1909,8 +2082,12 @@ Editor::edit_notes (MidiRegionView* mrv) void Editor::note_edit_done (int r, EditNoteDialog* d) { + begin_reversible_command (_("edit note(s)")); + d->done (r); delete d; + + commit_reversible_command(); } void @@ -1923,7 +2100,7 @@ Editor::visible_order_range (int* low, int* high) const RouteTimeAxisView* rtv = dynamic_cast (*i); - if (!rtv->hidden()) { + if (rtv && !rtv->hidden()) { if (*high < rtv->order()) { *high = rtv->order (); @@ -2003,7 +2180,7 @@ Editor::cancel_time_selection () } selection->time.clear (); clicked_selection = 0; -} +} void Editor::point_trim (GdkEvent* event, framepos_t new_bound) @@ -2038,7 +2215,7 @@ Editor::point_trim (GdkEvent* event, framepos_t new_bound) break; case 2: - begin_reversible_command (_("End point trim")); + begin_reversible_command (_("end point trim")); if (selection->selected (rv)) { @@ -2071,10 +2248,10 @@ Editor::point_trim (GdkEvent* event, framepos_t new_bound) void Editor::hide_marker (ArdourCanvas::Item* item, GdkEvent* /*event*/) { - Marker* marker; + ArdourMarker* marker; bool is_start; - if ((marker = static_cast (item->get_data ("marker"))) == 0) { + if ((marker = static_cast (item->get_data ("marker"))) == 0) { fatal << _("programming error: marker canvas item has no marker object pointer!") << endmsg; abort(); /*NOTREACHED*/ } @@ -2136,7 +2313,7 @@ Editor::mouse_brush_insert_region (RegionView* rv, framepos_t pos) RouteTimeAxisView* rtv = dynamic_cast(&rv->get_time_axis_view()); - if (rtv == 0 || !rtv->is_track()) { + if (!rtv || !rtv->is_track()) { return; } @@ -2150,7 +2327,7 @@ Editor::mouse_brush_insert_region (RegionView* rv, framepos_t pos) // playlist is frozen, so we have to update manually XXX this is disgusting - playlist->RegionAdded (new_region); /* EMIT SIGNAL */ + //playlist->RegionAdded (new_region); /* EMIT SIGNAL */ } gint @@ -2212,8 +2389,6 @@ Editor::add_region_brush_drag (ArdourCanvas::Item* item, GdkEvent*, RegionView* } _drags->add (new RegionMoveDrag (this, item, region_view, selection->regions.by_layer(), true, false)); - - begin_reversible_command (Operations::drag_region_brush); } /** Start a grab where a time range is selected, track(s) are selected, and the @@ -2253,7 +2428,6 @@ Editor::start_selection_grab (ArdourCanvas::Item* /*item*/, GdkEvent* event) /* A selection grab currently creates two undo/redo operations, one for creating the new region and another for moving it. */ - begin_reversible_command (Operations::selection_grab); boost::shared_ptr playlist = clicked_axisview->playlist(); @@ -2266,6 +2440,7 @@ Editor::start_selection_grab (ArdourCanvas::Item* /*item*/, GdkEvent* event) if (latest_regionviews.empty()) { /* something went wrong */ + abort_reversible_command (); return; } @@ -2289,7 +2464,7 @@ Editor::escape () selection->clear (); } - reset_focus (); + reset_focus (&contents()); } /** Update _join_object_range_state which indicate whether we are over the top @@ -2327,7 +2502,7 @@ Editor::update_join_object_range_location (double y) } else if (entered_track) { RouteTimeAxisView* entered_route_view = dynamic_cast (entered_track); - + if (entered_route_view) { double cx = 0; @@ -2336,7 +2511,7 @@ Editor::update_join_object_range_location (double y) entered_route_view->canvas_display()->canvas_to_item (cx, cy); double track_height = entered_route_view->view()->child_height(); - if (ARDOUR_UI::config()->get_show_name_highlight()) { + if (UIConfiguration::instance().get_show_name_highlight()) { track_height -= TimeAxisViewItem::NAME_HIGHLIGHT_SIZE; } double const c = cy / track_height;