X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Feditor_canvas_events.cc;h=7dcfe37fe506501461deb48bd89337144c4b2520;hb=72bdfc38a8aabd5c1277825f84969d30adadb1af;hp=7b0adaa4ad672f1888914f58f47e799877318c31;hpb=f603ca174eb389d13c3a578e207cae1784c22fcc;p=ardour.git diff --git a/gtk2_ardour/editor_canvas_events.cc b/gtk2_ardour/editor_canvas_events.cc index 7b0adaa4ad..7dcfe37fe5 100644 --- a/gtk2_ardour/editor_canvas_events.cc +++ b/gtk2_ardour/editor_canvas_events.cc @@ -24,6 +24,8 @@ #include "pbd/stacktrace.h" +#include "ardour/audio_track.h" +#include "ardour/midi_track.h" #include "ardour/midi_region.h" #include "ardour/region_factory.h" #include "ardour/profile.h" @@ -35,7 +37,6 @@ #include "editor.h" #include "keyboard.h" #include "public_editor.h" -#include "ardour_ui.h" #include "audio_region_view.h" #include "audio_streamview.h" #include "audio_time_axis.h" @@ -47,6 +48,7 @@ #include "editor_drag.h" #include "midi_time_axis.h" #include "editor_regions.h" +#include "ui_config.h" #include "verbose_cursor.h" #include "i18n.h" @@ -62,11 +64,6 @@ using Gtkmm2ext::Keyboard; bool Editor::track_canvas_scroll (GdkEventScroll* ev) { - if (Keyboard::some_magic_widget_has_focus()) { - return false; - } - - framepos_t xdelta; int direction = ev->direction; /* this event arrives without transformation by the canvas, so we have @@ -75,7 +72,6 @@ Editor::track_canvas_scroll (GdkEventScroll* ev) Duple event_coords = _track_canvas->window_to_canvas (Duple (ev->x, ev->y)); - retry: switch (direction) { case GDK_SCROLL_UP: if (Keyboard::modifier_state_equals (ev->state, Keyboard::ScrollZoomHorizontalModifier)) { @@ -86,8 +82,8 @@ Editor::track_canvas_scroll (GdkEventScroll* ev) zoom_focus = temp_focus; return true; } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::ScrollHorizontalModifier)) { - direction = GDK_SCROLL_LEFT; - goto retry; + scroll_left_step (); + return true; } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::ScrollZoomVerticalModifier)) { if (!current_stepping_trackview) { step_timeout = Glib::signal_timeout().connect (sigc::mem_fun(*this, &Editor::track_height_step_timeout), 500); @@ -115,8 +111,8 @@ Editor::track_canvas_scroll (GdkEventScroll* ev) zoom_focus = temp_focus; return true; } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::ScrollHorizontalModifier)) { - direction = GDK_SCROLL_RIGHT; - goto retry; + scroll_right_step (); + return true; } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::ScrollZoomVerticalModifier)) { if (!current_stepping_trackview) { step_timeout = Glib::signal_timeout().connect (sigc::mem_fun(*this, &Editor::track_height_step_timeout), 500); @@ -136,21 +132,13 @@ Editor::track_canvas_scroll (GdkEventScroll* ev) break; case GDK_SCROLL_LEFT: - xdelta = (current_page_samples() / 8); - if (leftmost_frame > xdelta) { - reset_x_origin (leftmost_frame - xdelta); - } else { - reset_x_origin (0); - } + scroll_left_step (); + return true; break; case GDK_SCROLL_RIGHT: - xdelta = (current_page_samples() / 8); - if (max_framepos - xdelta > leftmost_frame) { - reset_x_origin (leftmost_frame + xdelta); - } else { - reset_x_origin (max_framepos - current_page_samples()); - } + scroll_right_step (); + return true; break; default: @@ -180,7 +168,7 @@ Editor::track_canvas_button_press_event (GdkEventButton *event) { _track_canvas->grab_focus(); if (!Keyboard::is_context_menu_event (event)) { - begin_reversible_selection_op (_("Clear Selection Click (track canvas)")); + begin_reversible_selection_op (X_("Clear Selection Click (track canvas)")); selection->clear (); commit_reversible_selection_op(); } @@ -327,7 +315,7 @@ Editor::canvas_wave_view_event (GdkEvent *event, ArdourCanvas::Item* item, Regio } return ret; -} +} bool @@ -686,13 +674,19 @@ bool Editor::canvas_line_event (GdkEvent *event, ArdourCanvas::Item* item, AutomationLine* al) { ItemType type; - - if (dynamic_cast (al) != 0) { + AudioRegionGainLine* gl; + if ((gl = dynamic_cast (al)) != 0) { type = GainLineItem; + clicked_regionview = &gl->region_view (); } else { type = AutomationLineItem; + clicked_regionview = 0; } + clicked_control_point = 0; + clicked_axisview = &al->trackview; + clicked_routeview = dynamic_cast(clicked_axisview); + return typed_event (item, event, type); } @@ -974,7 +968,7 @@ Editor::canvas_feature_line_event (GdkEvent *event, ArdourCanvas::Item* item, Re } bool -Editor::canvas_marker_event (GdkEvent *event, ArdourCanvas::Item* item, Marker* /*marker*/) +Editor::canvas_marker_event (GdkEvent *event, ArdourCanvas::Item* item, ArdourMarker* /*marker*/) { return typed_event (item, event, MarkerItem); } @@ -1024,19 +1018,20 @@ Editor::canvas_meter_marker_event (GdkEvent *event, ArdourCanvas::Item* item, Me bool Editor::canvas_ruler_event (GdkEvent *event, ArdourCanvas::Item* item, ItemType type) { - framepos_t xdelta; bool handled = false; if (event->type == GDK_SCROLL) { - + /* scroll events in the rulers are handled a little differently from scrolling elsewhere in the canvas. */ switch (event->scroll.direction) { case GDK_SCROLL_UP: - - if (Profile->get_mixbus()) { + if (Keyboard::modifier_state_equals(event->scroll.state, + Keyboard::ScrollHorizontalModifier)) { + scroll_left_half_page (); + } else if (Profile->get_mixbus()) { //for mouse-wheel zoom, force zoom-focus to mouse Editing::ZoomFocus temp_focus = zoom_focus; zoom_focus = Editing::ZoomFocusMouse; @@ -1047,9 +1042,12 @@ Editor::canvas_ruler_event (GdkEvent *event, ArdourCanvas::Item* item, ItemType } handled = true; break; - + case GDK_SCROLL_DOWN: - if (Profile->get_mixbus()) { + if (Keyboard::modifier_state_equals(event->scroll.state, + Keyboard::ScrollHorizontalModifier)) { + scroll_right_half_page (); + } else if (Profile->get_mixbus()) { //for mouse-wheel zoom, force zoom-focus to mouse Editing::ZoomFocus temp_focus = zoom_focus; zoom_focus = Editing::ZoomFocusMouse; @@ -1060,27 +1058,17 @@ Editor::canvas_ruler_event (GdkEvent *event, ArdourCanvas::Item* item, ItemType } handled = true; break; - + case GDK_SCROLL_LEFT: - xdelta = (current_page_samples() / 2); - if (leftmost_frame > xdelta) { - reset_x_origin (leftmost_frame - xdelta); - } else { - reset_x_origin (0); - } + scroll_left_half_page (); handled = true; break; - + case GDK_SCROLL_RIGHT: - xdelta = (current_page_samples() / 2); - if (max_framepos - xdelta > leftmost_frame) { - reset_x_origin (leftmost_frame + xdelta); - } else { - reset_x_origin (max_framepos - current_page_samples()); - } + scroll_right_half_page (); handled = true; break; - + default: /* what? */ break; @@ -1122,13 +1110,13 @@ Editor::canvas_note_event (GdkEvent *event, ArdourCanvas::Item* item) bool Editor::canvas_drop_zone_event (GdkEvent* event) { - GdkEventScroll scroll; + GdkEventScroll scroll; ArdourCanvas::Duple winpos; - + switch (event->type) { case GDK_BUTTON_RELEASE: if (event->button.button == 1) { - begin_reversible_selection_op (_("Nowhere Click")); + begin_reversible_selection_op (X_("Nowhere Click")); selection->clear_objects (); selection->clear_tracks (); commit_reversible_selection_op (); @@ -1185,18 +1173,18 @@ Editor::track_canvas_drag_motion (Glib::RefPtr const& context, std::pair const tv = trackview_by_y_position (py, false); bool can_drop = false; - + if (tv.first != 0) { /* over a time axis view of some kind */ rtav = dynamic_cast (tv.first); - + if (rtav != 0 && rtav->is_track ()) { /* over a track, not a bus */ can_drop = true; } - + } else { /* not over a time axis view, so drop is possible */ @@ -1205,19 +1193,31 @@ Editor::track_canvas_drag_motion (Glib::RefPtr const& context, if (can_drop) { region = _regions->get_dragged_region (); - + if (region) { - + + if (tv.first == 0 + && ( + boost::dynamic_pointer_cast (region) != 0 || + boost::dynamic_pointer_cast (region) != 0 + ) + ) + { + /* drop to drop-zone */ + context->drag_status (context->get_suggested_action(), time); + return true; + } + if ((boost::dynamic_pointer_cast (region) != 0 && dynamic_cast (tv.first) != 0) || (boost::dynamic_pointer_cast (region) != 0 && dynamic_cast (tv.first) != 0)) { - - /* audio to audio - OR + + /* audio to audio + OR midi to midi */ - + context->drag_status (context->get_suggested_action(), time); return true; } @@ -1227,7 +1227,7 @@ Editor::track_canvas_drag_motion (Glib::RefPtr const& context, * TODO: check if file is audio/midi, allow drops on same track-type only, * currently: if audio is dropped on a midi-track, it is only added to the region-list */ - if (Profile->get_sae() || ARDOUR_UI::config()->get_only_copy_imported_files()) { + if (Profile->get_sae() || UIConfiguration::instance().get_only_copy_imported_files()) { context->drag_status(Gdk::ACTION_COPY, time); } else { if ((context->get_actions() & (Gdk::ACTION_COPY | Gdk::ACTION_LINK | Gdk::ACTION_MOVE)) == Gdk::ACTION_COPY) { @@ -1251,9 +1251,6 @@ Editor::drop_regions (const Glib::RefPtr& /*context*/, const SelectionData& /*data*/, guint /*info*/, guint /*time*/) { - boost::shared_ptr region; - boost::shared_ptr region_copy; - RouteTimeAxisView* rtav; GdkEvent event; double px; double py; @@ -1263,39 +1260,47 @@ Editor::drop_regions (const Glib::RefPtr& /*context*/, event.button.y = y; /* assume we're dragging with button 1 */ event.motion.state = Gdk::BUTTON1_MASK; - framepos_t const pos = window_event_sample (&event, &px, &py); + boost::shared_ptr region = _regions->get_dragged_region (); + if (!region) { return; } + + RouteTimeAxisView* rtav = 0; std::pair const tv = trackview_by_y_position (py, false); if (tv.first != 0) { - rtav = dynamic_cast (tv.first); - - if (rtav != 0 && rtav->is_track ()) { - - boost::shared_ptr region = _regions->get_dragged_region (); - - if (region) { - - region_copy = RegionFactory::create (region, true); - - - if ((boost::dynamic_pointer_cast (region_copy) != 0 && - dynamic_cast (tv.first) != 0) || - (boost::dynamic_pointer_cast (region_copy) != 0 && - dynamic_cast (tv.first) != 0)) { - - /* audio to audio - OR - midi to midi - */ - - - _drags->set (new RegionInsertDrag (this, region_copy, rtav, pos), &event); - _drags->end_grab (0); + } else { + try { + if (boost::dynamic_pointer_cast (region)) { + uint32_t output_chan = region->n_channels(); + if ((Config->get_output_auto_connect() & AutoConnectMaster) && session()->master_out()) { + output_chan = session()->master_out()->n_inputs().n_audio(); } + list > audio_tracks; + audio_tracks = session()->new_audio_track (region->n_channels(), output_chan, ARDOUR::Normal, 0, 1, region->name()); + rtav = axis_view_from_route (audio_tracks.front()); + } else if (boost::dynamic_pointer_cast (region)) { + ChanCount one_midi_port (DataType::MIDI, 1); + list > midi_tracks; + midi_tracks = session()->new_midi_track (one_midi_port, one_midi_port, boost::shared_ptr(), ARDOUR::Normal, 0, 1, region->name()); + rtav = axis_view_from_route (midi_tracks.front()); + } else { + return; } + } catch (...) { + error << _("Could not create new track after region placed in the drop zone") << endmsg; + return; + } + } + + if (rtav != 0 && rtav->is_track ()) { + boost::shared_ptr region_copy = RegionFactory::create (region, true); + + if ((boost::dynamic_pointer_cast (region_copy) != 0 && dynamic_cast (rtav) != 0) || + (boost::dynamic_pointer_cast (region_copy) != 0 && dynamic_cast (rtav) != 0)) { + _drags->set (new RegionInsertDrag (this, region_copy, rtav, pos), &event); + _drags->end_grab (0); } } }