X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Feditor_canvas_events.cc;h=bf84eb20e9c4ee58c9c6e3da3cf13e451aae01ce;hb=9c4f5ac000ad91b55e4cf91317b7a89f6239870e;hp=cf03587e8a2945877961df718fa07263a27598dc;hpb=7703f0a76a82ec3fe21609c396ebf2f950803bf9;p=ardour.git diff --git a/gtk2_ardour/editor_canvas_events.cc b/gtk2_ardour/editor_canvas_events.cc index cf03587e8a..bf84eb20e9 100644 --- a/gtk2_ardour/editor_canvas_events.cc +++ b/gtk2_ardour/editor_canvas_events.cc @@ -24,7 +24,6 @@ #include "pbd/stacktrace.h" -#include "ardour/audio_diskstream.h" #include "ardour/audioplaylist.h" #include "ardour/audioregion.h" #include "ardour/region_factory.h" @@ -45,14 +44,12 @@ #include "control_point.h" #include "canvas_impl.h" #include "simplerect.h" -#include "interactive-item.h" #include "editor_drag.h" #include "midi_time_axis.h" #include "editor_regions.h" #include "i18n.h" -using namespace sigc; using namespace std; using namespace ARDOUR; using namespace PBD; @@ -64,44 +61,21 @@ using Gtkmm2ext::Keyboard; bool Editor::track_canvas_scroll (GdkEventScroll* ev) { - int x, y; - double wx, wy; nframes64_t xdelta; int direction = ev->direction; - Gnome::Canvas::Item* item = track_canvas->get_item_at(ev->x, ev->y); - InteractiveItem* interactive_item = dynamic_cast(item); - if (interactive_item) { - return interactive_item->on_event(reinterpret_cast(ev)); - } - retry: switch (direction) { case GDK_SCROLL_UP: if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) { - //if (ev->state == GDK_CONTROL_MASK) { - /* XXX - the ev->x will be out of step with the canvas - if we're in mid zoom, so we have to get the damn mouse - pointer again - */ - track_canvas->get_pointer (x, y); - track_canvas->window_to_world (x, y, wx, wy); - - GdkEvent event; - event.type = GDK_BUTTON_RELEASE; - event.button.x = wx; - event.button.y = wy; - - nframes64_t where = event_frame (&event, 0, 0); - temporal_zoom_to_frame (false, where); + temporal_zoom_step (false); return true; } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::SecondaryModifier)) { direction = GDK_SCROLL_LEFT; goto retry; } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::TertiaryModifier)) { if (!current_stepping_trackview) { - step_timeout = Glib::signal_timeout().connect (mem_fun(*this, &Editor::track_height_step_timeout), 500); + step_timeout = Glib::signal_timeout().connect (sigc::mem_fun(*this, &Editor::track_height_step_timeout), 500); std::pair const p = trackview_by_y_position (ev->y + vertical_adjustment.get_value() - canvas_timebars_vsize); current_stepping_trackview = p.first; if (!current_stepping_trackview) { @@ -119,24 +93,14 @@ Editor::track_canvas_scroll (GdkEventScroll* ev) case GDK_SCROLL_DOWN: if (Keyboard::modifier_state_equals (ev->state, Keyboard::PrimaryModifier)) { - //if (ev->state == GDK_CONTROL_MASK) { - track_canvas->get_pointer (x, y); - track_canvas->window_to_world (x, y, wx, wy); - - GdkEvent event; - event.type = GDK_BUTTON_RELEASE; - event.button.x = wx; - event.button.y = wy; - - nframes64_t where = event_frame (&event, 0, 0); - temporal_zoom_to_frame (true, where); + temporal_zoom_step (true); return true; } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::SecondaryModifier)) { direction = GDK_SCROLL_RIGHT; goto retry; } else if (Keyboard::modifier_state_equals (ev->state, Keyboard::TertiaryModifier)) { if (!current_stepping_trackview) { - step_timeout = Glib::signal_timeout().connect (mem_fun(*this, &Editor::track_height_step_timeout), 500); + step_timeout = Glib::signal_timeout().connect (sigc::mem_fun(*this, &Editor::track_height_step_timeout), 500); std::pair const p = trackview_by_y_position (ev->y + vertical_adjustment.get_value() - canvas_timebars_vsize); current_stepping_trackview = p.first; if (!current_stepping_trackview) { @@ -182,8 +146,7 @@ bool Editor::track_canvas_scroll_event (GdkEventScroll *event) { track_canvas->grab_focus(); - track_canvas_scroll (event); - return false; + return track_canvas_scroll (event); } bool @@ -197,10 +160,8 @@ Editor::track_canvas_button_press_event (GdkEventButton */*event*/) bool Editor::track_canvas_button_release_event (GdkEventButton *event) { - if (_drag) { - _drag->end_grab ((GdkEvent*) event); - delete _drag; - _drag = 0; + if (_drags->active ()) { + _drags->end_grab ((GdkEvent*) event); } return false; } @@ -266,7 +227,6 @@ Editor::canvas_region_view_event (GdkEvent *event, ArdourCanvas::Item* item, Reg return false; } - switch (event->type) { case GDK_BUTTON_PRESS: case GDK_2BUTTON_PRESS: @@ -591,7 +551,7 @@ Editor::canvas_crossfade_view_event (GdkEvent* event, ArdourCanvas::Item* item, if (atv->is_audio_track()) { boost::shared_ptr pl; - if ((pl = boost::dynamic_pointer_cast (atv->get_diskstream()->playlist())) != 0) { + if ((pl = boost::dynamic_pointer_cast (atv->track()->playlist())) != 0) { Playlist::RegionList* rl = pl->regions_at (event_frame (event)); if (!rl->empty()) { @@ -808,6 +768,14 @@ Editor::canvas_frame_handle_event (GdkEvent* event, ArdourCanvas::Item* item, Re perspective. XXX change this ?? */ + ItemType type; + + if (item->get_data ("isleft")) { + type = LeftFrameHandle; + } else { + type = RightFrameHandle; + } + switch (event->type) { case GDK_BUTTON_PRESS: case GDK_2BUTTON_PRESS: @@ -816,20 +784,20 @@ Editor::canvas_frame_handle_event (GdkEvent* event, ArdourCanvas::Item* item, Re clicked_control_point = 0; clicked_axisview = &clicked_regionview->get_time_axis_view(); clicked_routeview = dynamic_cast(clicked_axisview); - ret = button_press_handler (item, event, RegionViewNameHighlight); + ret = button_press_handler (item, event, type); break; case GDK_BUTTON_RELEASE: - ret = button_release_handler (item, event, RegionViewNameHighlight); + ret = button_release_handler (item, event, type); break; case GDK_MOTION_NOTIFY: ret = motion_handler (item, event); break; case GDK_ENTER_NOTIFY: - ret = enter_handler (item, event, RegionViewNameHighlight); + ret = enter_handler (item, event, type); break; case GDK_LEAVE_NOTIFY: - ret = leave_handler (item, event, RegionViewNameHighlight); + ret = leave_handler (item, event, type); break; default: @@ -863,7 +831,8 @@ Editor::canvas_region_view_name_highlight_event (GdkEvent* event, ArdourCanvas:: ret = button_release_handler (item, event, RegionViewNameHighlight); break; case GDK_MOTION_NOTIFY: - ret = motion_handler (item, event); + motion_handler (item, event); + ret = true; // force this to avoid progagating the event into the regionview break; case GDK_ENTER_NOTIFY: ret = enter_handler (item, event, RegionViewNameHighlight); @@ -1010,7 +979,7 @@ Editor::track_canvas_drag_motion (Glib::RefPtr const & /*c*/, /* assume we're dragging with button 1 */ event.motion.state = Gdk::BUTTON1_MASK; - if (_drag == 0) { + if (!_drags->active ()) { double px; double py; @@ -1028,6 +997,10 @@ Editor::track_canvas_drag_motion (Glib::RefPtr const & /*c*/, boost::shared_ptr region = _regions->get_dragged_region (); + if (!region) { + return true; + } + boost::shared_ptr region_copy = RegionFactory::create (region); if (boost::dynamic_pointer_cast (region_copy) != 0 && @@ -1044,11 +1017,10 @@ Editor::track_canvas_drag_motion (Glib::RefPtr const & /*c*/, return true; } - _drag = new RegionInsertDrag (this, region_copy, rtav, pos); - _drag->start_grab (&event); + _drags->set (new RegionInsertDrag (this, region_copy, rtav, pos), &event); } - _drag->motion_handler (&event, false); + _drags->motion_handler (&event, false); return true; }