X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Feditor_canvas.cc;h=3ff0cf4c4a50b2380bb7029aeefe79a053322e7c;hb=ea5d75a05b76c8e61e2261521339e385d81094d0;hp=53ab840ed8934965aab429c23ba0bfd307dc75c3;hpb=9e4b972286c5aa9b161afd09b58635eaa4973c40;p=ardour.git diff --git a/gtk2_ardour/editor_canvas.cc b/gtk2_ardour/editor_canvas.cc index 53ab840ed8..3ff0cf4c4a 100644 --- a/gtk2_ardour/editor_canvas.cc +++ b/gtk2_ardour/editor_canvas.cc @@ -73,6 +73,7 @@ Editor::initialize_canvas () _track_canvas = _track_canvas_viewport->canvas (); _track_canvas->set_background_color (UIConfiguration::instance().color ("arrange base")); + _track_canvas->use_nsglview (); /* scroll group for items that should not automatically scroll * (e.g verbose cursor). It shares the canvas coordinate space. @@ -126,7 +127,7 @@ Editor::initialize_canvas () * uppermost (last) group with hv_scroll_group as a parent */ _drag_motion_group = new ArdourCanvas::Container (hv_scroll_group); - CANVAS_DEBUG_NAME (_drag_motion_group, "Canvas Drag Motion"); + CANVAS_DEBUG_NAME (_drag_motion_group, "Canvas Drag Motion"); /* TIME BAR CANVAS */ @@ -173,7 +174,7 @@ Editor::initialize_canvas () cd_marker_bar = new ArdourCanvas::Rectangle (cd_marker_group, ArdourCanvas::Rect (0.0, 0.0, ArdourCanvas::COORD_MAX, timebar_height)); CANVAS_DEBUG_NAME (cd_marker_bar, "CD Marker Bar"); - cd_marker_bar->set_outline_what (ArdourCanvas::Rectangle::BOTTOM); + cd_marker_bar->set_outline_what (ArdourCanvas::Rectangle::BOTTOM); ARDOUR_UI::instance()->video_timeline = new VideoTimeLine(this, videotl_group, (timebar_height * videotl_bar_height)); @@ -240,6 +241,8 @@ Editor::initialize_canvas () _track_canvas->signal_enter_notify_event().connect (sigc::mem_fun(*this, &Editor::entered_track_canvas), false); _track_canvas->set_flags (CAN_FOCUS); + _track_canvas->PreRender.connect (sigc::mem_fun(*this, &Editor::pre_render)); + /* set up drag-n-drop */ vector target_table; @@ -314,17 +317,17 @@ Editor::reset_controls_layout_width () edit_controls_vbox.size_request (req); w = req.width; - if (_group_tabs->is_visible()) { + if (_group_tabs->is_visible()) { _group_tabs->size_request (req); - w += req.width; - } + w += req.width; + } - /* the controls layout has no horizontal scrolling, its visible - width is always equal to the total width of its contents. - */ + /* the controls layout has no horizontal scrolling, its visible + width is always equal to the total width of its contents. + */ - controls_layout.property_width() = w; - controls_layout.property_width_request() = w; + controls_layout.property_width() = w; + controls_layout.property_width_request() = w; } void @@ -342,11 +345,11 @@ Editor::reset_controls_layout_height (int32_t h) h += _canvas_drop_zone->height (); - /* set the height of the scrollable area (i.e. the sum of all contained widgets) + /* set the height of the scrollable area (i.e. the sum of all contained widgets) * for the controls layout. The size request is set elsewhere. - */ + */ - controls_layout.property_height() = h; + controls_layout.property_height() = h; } @@ -411,10 +414,11 @@ Editor::drop_paths_part_two (const vector& paths, framepos_t frame, doub frame = 0; InstrumentSelector is; // instantiation builds instrument-list and sets default. - do_import (midi_paths, Editing::ImportDistinctFiles, ImportAsTrack, SrcBest, SMFTrackName, frame, is.selected_instrument()); + do_import (midi_paths, Editing::ImportDistinctFiles, ImportAsTrack, SrcBest, SMFTrackName, SMFTempoIgnore, frame, is.selected_instrument()); if (UIConfiguration::instance().get_only_copy_imported_files() || copy) { - do_import (audio_paths, Editing::ImportDistinctFiles, Editing::ImportAsTrack, SrcBest, SMFTrackName, frame); + do_import (audio_paths, Editing::ImportDistinctFiles, Editing::ImportAsTrack, + SrcBest, SMFTrackName, SMFTempoIgnore, frame); } else { do_embed (audio_paths, Editing::ImportDistinctFiles, ImportAsTrack, frame); } @@ -427,10 +431,12 @@ Editor::drop_paths_part_two (const vector& paths, framepos_t frame, doub /* select the track, then embed/import */ selection->set (tv); - do_import (midi_paths, Editing::ImportSerializeFiles, ImportToTrack, SrcBest, SMFTrackName, frame); + do_import (midi_paths, Editing::ImportSerializeFiles, ImportToTrack, + SrcBest, SMFTrackName, SMFTempoIgnore, frame); if (UIConfiguration::instance().get_only_copy_imported_files() || copy) { - do_import (audio_paths, Editing::ImportSerializeFiles, Editing::ImportToTrack, SrcBest, SMFTrackName, frame); + do_import (audio_paths, Editing::ImportSerializeFiles, Editing::ImportToTrack, + SrcBest, SMFTrackName, SMFTempoIgnore, frame); } else { do_embed (audio_paths, Editing::ImportSerializeFiles, ImportToTrack, frame); } @@ -446,7 +452,6 @@ Editor::drop_paths (const RefPtr& context, { vector paths; GdkEvent ev; - framepos_t frame; double cy; if (convert_drop_to_paths (paths, context, x, y, data, info, time) == 0) { @@ -458,9 +463,8 @@ Editor::drop_paths (const RefPtr& context, ev.button.x = x; ev.button.y = y; - frame = window_event_sample (&ev, 0, &cy); - - snap_to (frame); + MusicFrame when (window_event_sample (&ev, 0, &cy), 0); + snap_to (when); bool copy = ((context->get_actions() & (Gdk::ACTION_COPY | Gdk::ACTION_LINK | Gdk::ACTION_MOVE)) == Gdk::ACTION_COPY); #ifdef __APPLE__ @@ -468,9 +472,9 @@ Editor::drop_paths (const RefPtr& context, the main event loop with GTK/Quartz. Since import/embed wants to push up a progress dialog, defer all this till we go idle. */ - Glib::signal_idle().connect (sigc::bind (sigc::mem_fun (*this, &Editor::idle_drop_paths), paths, frame, cy, copy)); + Glib::signal_idle().connect (sigc::bind (sigc::mem_fun (*this, &Editor::idle_drop_paths), paths, when.frame, cy, copy)); #else - drop_paths_part_two (paths, frame, cy, copy); + drop_paths_part_two (paths, when.frame, cy, copy); #endif } @@ -511,6 +515,16 @@ Editor::maybe_autoscroll (bool allow_horiz, bool allow_vert, bool from_headers) if (from_headers) { alloc = controls_layout.get_allocation (); + + int wx, wy; + + controls_layout.get_parent()->translate_coordinates (*toplevel, + alloc.get_x(), alloc.get_y(), + wx, wy); + + scrolling_boundary = ArdourCanvas::Rect (wx, wy, wx + alloc.get_width(), wy + alloc.get_height()); + + } else { alloc = _track_canvas_viewport->get_allocation (); @@ -541,9 +555,14 @@ Editor::maybe_autoscroll (bool allow_horiz, bool allow_vert, bool from_headers) alloc.set_x (alloc.get_x() + 10); } - } + int wx, wy; + + _track_canvas_viewport->get_parent()->translate_coordinates (*toplevel, + alloc.get_x(), alloc.get_y(), + wx, wy); - scrolling_boundary = ArdourCanvas::Rect (alloc.get_x(), alloc.get_y(), alloc.get_x() + alloc.get_width(), alloc.get_y() + alloc.get_height()); + scrolling_boundary = ArdourCanvas::Rect (wx, wy, wx + alloc.get_width(), wy + alloc.get_height()); + } int x, y; Gdk::ModifierType mask; @@ -792,22 +811,46 @@ Editor::get_enter_context(ItemType type) } bool -Editor::left_track_canvas (GdkEventCrossing */*ev*/) +Editor::left_track_canvas (GdkEventCrossing* ev) { + const bool was_within = within_track_canvas; DropDownKeys (); within_track_canvas = false; set_entered_track (0); set_entered_regionview (0); reset_canvas_action_sensitivity (false); + + if (was_within) { + if (ev->detail == GDK_NOTIFY_NONLINEAR || + ev->detail == GDK_NOTIFY_NONLINEAR_VIRTUAL) { + /* context menu or something similar */ + sensitize_the_right_region_actions (false); + } else { + sensitize_the_right_region_actions (true); + } + } + return false; } bool -Editor::entered_track_canvas (GdkEventCrossing */*ev*/) +Editor::entered_track_canvas (GdkEventCrossing* ev) { + const bool was_within = within_track_canvas; within_track_canvas = true; reset_canvas_action_sensitivity (true); - return FALSE; + + if (!was_within) { + if (ev->detail == GDK_NOTIFY_NONLINEAR || + ev->detail == GDK_NOTIFY_NONLINEAR_VIRTUAL) { + /* context menu or something similar */ + sensitize_the_right_region_actions (false); + } else { + sensitize_the_right_region_actions (true); + } + } + + return false; } void @@ -870,22 +913,13 @@ Editor::set_horizontal_position (double p) horizontal_adjustment.set_value (p); leftmost_frame = (framepos_t) floor (p * samples_per_pixel); - - update_fixed_rulers (); - redisplay_tempo (true); - - if (pending_visual_change.idle_handler_id < 0) { - _summary->set_overlays_dirty (); - } - - update_video_timeline(); } void Editor::color_handler() { - ArdourCanvas::Color base = UIConfiguration::instance().color ("ruler base"); - ArdourCanvas::Color text = UIConfiguration::instance().color ("ruler text"); + Gtkmm2ext::Color base = UIConfiguration::instance().color ("ruler base"); + Gtkmm2ext::Color text = UIConfiguration::instance().color ("ruler text"); timecode_ruler->set_fill_color (base); timecode_ruler->set_outline_color (text); minsec_ruler->set_fill_color (base);