diff options
Diffstat (limited to 'gtk2_ardour/editor_canvas.cc')
-rw-r--r-- | gtk2_ardour/editor_canvas.cc | 388 |
1 files changed, 175 insertions, 213 deletions
diff --git a/gtk2_ardour/editor_canvas.cc b/gtk2_ardour/editor_canvas.cc index 8be0e61a7b..8f85e81867 100644 --- a/gtk2_ardour/editor_canvas.cc +++ b/gtk2_ardour/editor_canvas.cc @@ -21,8 +21,6 @@ #include "gtk2ardour-config.h" #endif -#include <libgnomecanvasmm/init.h> -#include <libgnomecanvasmm/pixbuf.h> #include <jack/types.h> #include "gtkmm2ext/utils.h" @@ -31,19 +29,14 @@ #include "ardour/rc_configuration.h" #include "ardour/smf_source.h" +#include "canvas/canvas.h" +#include "canvas/rectangle.h" +#include "canvas/pixbuf.h" +#include "canvas/text.h" + #include "ardour_ui.h" #include "editor.h" #include "global_signals.h" -#include "waveview.h" -#include "simplerect.h" -#include "simpleline.h" -#include "imageframe.h" -#include "waveview_p.h" -#include "simplerect_p.h" -#include "simpleline_p.h" -#include "imageframe_p.h" -#include "canvas_impl.h" -#include "canvas-noevent-text.h" #include "editing.h" #include "rgb_macros.h" #include "utils.h" @@ -72,63 +65,28 @@ using namespace Editing; const double max_canvas_coordinate = (double) JACK_MAX_FRAMES; -extern "C" -{ - -GType gnome_canvas_simpleline_get_type(void); -GType gnome_canvas_simplerect_get_type(void); -GType gnome_canvas_waveview_get_type(void); -GType gnome_canvas_imageframe_get_type(void); - -} - -static void ardour_canvas_type_init() -{ - // Map gtypes to gtkmm wrapper-creation functions: - - Glib::wrap_register(gnome_canvas_simpleline_get_type(), &Gnome::Canvas::SimpleLine_Class::wrap_new); - Glib::wrap_register(gnome_canvas_simplerect_get_type(), &Gnome::Canvas::SimpleRect_Class::wrap_new); - Glib::wrap_register(gnome_canvas_waveview_get_type(), &Gnome::Canvas::WaveView_Class::wrap_new); - // Glib::wrap_register(gnome_canvas_imageframe_get_type(), &Gnome::Canvas::ImageFrame_Class::wrap_new); - - // Register the gtkmm gtypes: - - (void) Gnome::Canvas::WaveView::get_type(); - (void) Gnome::Canvas::SimpleLine::get_type(); - (void) Gnome::Canvas::SimpleRect::get_type(); - (void) Gnome::Canvas::ImageFrame::get_type(); -} - void Editor::initialize_canvas () { - if (getenv ("ARDOUR_NON_AA_CANVAS")) { - track_canvas = new ArdourCanvas::Canvas (); - } else { - track_canvas = new ArdourCanvas::CanvasAA (); - } - - track_canvas->set_can_default (true); - set_default (*track_canvas); + /* XXX */ - ArdourCanvas::init (); - ardour_canvas_type_init (); - - /* don't try to center the canvas */ - - track_canvas->set_center_scroll_region (false); - track_canvas->set_dither (Gdk::RGB_DITHER_NONE); - - gint phys_width = physical_screen_width (Glib::RefPtr<Gdk::Window>()); - gint phys_height = physical_screen_height (Glib::RefPtr<Gdk::Window>()); + _track_canvas_hadj = new Adjustment (0, 0, 1e16); + _track_canvas_vadj = new Adjustment (0, 0, 1e16); + _track_canvas_viewport = new ArdourCanvas::GtkCanvasViewport (*_track_canvas_hadj, *_track_canvas_vadj); + _track_canvas = _track_canvas_viewport->canvas (); + _time_bars_canvas_hadj = new Adjustment (0, 0, 1e16); + _time_bars_canvas_vadj = new Adjustment (0, 0, 1e16); + _time_bars_canvas_viewport = new ArdourCanvas::GtkCanvasViewport (*_time_bars_canvas_hadj, *_time_bars_canvas_vadj); + _time_bars_canvas = _time_bars_canvas_viewport->canvas (); + _verbose_cursor = new VerboseCursor (this); /* on the bottom, an image */ if (Profile->get_sae()) { Image img (::get_icon (X_("saelogo"))); - logo_item = new ArdourCanvas::Pixbuf (*track_canvas->root(), 0.0, 0.0, img.get_pixbuf()); + // logo_item = new ArdourCanvas::Pixbuf (_track_canvas->root(), 0.0, 0.0, img.get_pixbuf()); // logo_item->property_height_in_pixels() = true; // logo_item->property_width_in_pixels() = true; // logo_item->property_height_set() = true; @@ -137,64 +95,70 @@ Editor::initialize_canvas () } /* a group to hold time (measure) lines */ - time_line_group = new ArdourCanvas::Group (*track_canvas->root()); + time_line_group = new ArdourCanvas::Group (track_canvas->root()); -#ifdef GTKOSX - /*XXX please don't laugh. this actually improves canvas performance on osx */ - bogus_background_rect = new ArdourCanvas::SimpleRect (*time_line_group, 0.0, 0.0, max_canvas_coordinate/3, phys_height); - bogus_background_rect->property_outline_pixels() = 0; -#endif - transport_loop_range_rect = new ArdourCanvas::SimpleRect (*time_line_group, 0.0, 0.0, 0.0, phys_height); - transport_loop_range_rect->property_outline_pixels() = 1; + transport_loop_range_rect = new ArdourCanvas::Rectangle (*time_line_group, ArdourCanvas::Rect (0.0, 0.0, 0.0, ArdourCanvas::COORD_MAX)); + transport_loop_range_rect->set_outline_width (1); transport_loop_range_rect->hide(); - transport_punch_range_rect = new ArdourCanvas::SimpleRect (*time_line_group, 0.0, 0.0, 0.0, phys_height); - transport_punch_range_rect->property_outline_pixels() = 0; + transport_punch_range_rect = new ArdourCanvas::Rectangle (*time_line_group, ArdourCanvas::Rect (0.0, 0.0, 0.0, ArdourCanvas::COORD_MAX)); + transport_punch_range_rect->set_outline_width (0); transport_punch_range_rect->hide(); - _background_group = new ArdourCanvas::Group (*track_canvas->root()); - _master_group = new ArdourCanvas::Group (*track_canvas->root()); - _trackview_group = new ArdourCanvas::Group (*_master_group); - _region_motion_group = new ArdourCanvas::Group (*_trackview_group); + _background_group = new ArdourCanvas::Group (_track_canvas->root()); + _master_group = new ArdourCanvas::Group (_track_canvas->root()); + + _trackview_group = new ArdourCanvas::Group (_master_group); + _region_motion_group = new ArdourCanvas::Group (_trackview_group); + + meter_bar_group = new ArdourCanvas::Group (_time_bars_canvas->root ()); + meter_bar = new ArdourCanvas::Rectangle (meter_bar_group, ArdourCanvas::Rect (0.0, 0.0, ArdourCanvas::COORD_MAX, timebar_height - 1)); + meter_bar->set_outline_width (1); + meter_bar->set_outline_what (0x8); + + tempo_bar_group = new ArdourCanvas::Group (_time_bars_canvas->root ()); + tempo_bar = new ArdourCanvas::Rectangle (tempo_bar_group, ArdourCanvas::Rect (0.0, 0.0, ArdourCanvas::COORD_MAX, timebar_height - 1)); + tempo_bar->set_outline_width (1); + tempo_bar->set_outline_what (0x8); - meter_bar_group = new ArdourCanvas::Group (*track_canvas->root ()); - meter_bar = new ArdourCanvas::SimpleRect (*meter_bar_group, 0.0, 0.0, phys_width, timebar_height - 1); - meter_bar->property_outline_pixels() = 1; - meter_bar->property_outline_what() = 0x8; + range_marker_bar_group = new ArdourCanvas::Group (_time_bars_canvas->root ()); + range_marker_bar = new ArdourCanvas::Rectangle (range_marker_bar_group, ArdourCanvas::Rect (0.0, 0.0, ArdourCanvas::COORD_MAX, timebar_height - 1)); + range_marker_bar->set_outline_width (1); + range_marker_bar->set_outline_what (0x8); - tempo_bar_group = new ArdourCanvas::Group (*track_canvas->root ()); - tempo_bar = new ArdourCanvas::SimpleRect (*tempo_bar_group, 0.0, 0.0, phys_width, (timebar_height - 1)); - tempo_bar->property_outline_pixels() = 1; - tempo_bar->property_outline_what() = 0x8; + transport_marker_bar_group = new ArdourCanvas::Group (_time_bars_canvas->root ()); + transport_marker_bar = new ArdourCanvas::Rectangle (transport_marker_bar_group, ArdourCanvas::Rect (0.0, 0.0, ArdourCanvas::COORD_MAX, timebar_height - 1)); + transport_marker_bar->set_outline_width (1); + transport_marker_bar->set_outline_what (0x8); - range_marker_bar_group = new ArdourCanvas::Group (*track_canvas->root ()); - range_marker_bar = new ArdourCanvas::SimpleRect (*range_marker_bar_group, 0.0, 0.0, phys_width, (timebar_height - 1)); - range_marker_bar->property_outline_pixels() = 1; - range_marker_bar->property_outline_what() = 0x8; + marker_bar_group = new ArdourCanvas::Group (_time_bars_canvas->root ()); + marker_bar = new ArdourCanvas::Rectangle (marker_bar_group, ArdourCanvas::Rect (0.0, 0.0, ArdourCanvas::COORD_MAX, timebar_height - 1)); + marker_bar->set_outline_width (1); + marker_bar->set_outline_what (0x8); - transport_marker_bar_group = new ArdourCanvas::Group (*track_canvas->root ()); - transport_marker_bar = new ArdourCanvas::SimpleRect (*transport_marker_bar_group, 0.0, 0.0, phys_width, (timebar_height - 1)); - transport_marker_bar->property_outline_pixels() = 1; - transport_marker_bar->property_outline_what() = 0x8; + cd_marker_bar_group = new ArdourCanvas::Group (_time_bars_canvas->root ()); + cd_marker_bar = new ArdourCanvas::Rectangle (cd_marker_bar_group, ArdourCanvas::Rect (0.0, 0.0, ArdourCanvas::COORD_MAX, timebar_height - 1)); + cd_marker_bar->set_outline_width (1); + cd_marker_bar->set_outline_what (0x8); - marker_bar_group = new ArdourCanvas::Group (*track_canvas->root ()); - marker_bar = new ArdourCanvas::SimpleRect (*marker_bar_group, 0.0, 0.0, phys_width, (timebar_height - 1)); - marker_bar->property_outline_pixels() = 1; - marker_bar->property_outline_what() = 0x8; + _time_markers_group = new ArdourCanvas::Group (_time_bars_canvas->root()); + + meter_group = new ArdourCanvas::Group (_time_markers_group, ArdourCanvas::Duple (0.0, timebar_height * 5.0)); + tempo_group = new ArdourCanvas::Group (_time_markers_group, ArdourCanvas::Duple (0.0, timebar_height * 4.0)); + range_marker_group = new ArdourCanvas::Group (_time_markers_group, ArdourCanvas::Duple (0.0, timebar_height * 3.0)); + transport_marker_group = new ArdourCanvas::Group (_time_markers_group, ArdourCanvas::Duple (0.0, timebar_height * 2.0)); + marker_group = new ArdourCanvas::Group (_time_markers_group, ArdourCanvas::Duple (0.0, timebar_height)); + cd_marker_group = new ArdourCanvas::Group (_time_markers_group, ArdourCanvas::Duple (0.0, 0.0)); - cd_marker_bar_group = new ArdourCanvas::Group (*track_canvas->root ()); - cd_marker_bar = new ArdourCanvas::SimpleRect (*cd_marker_bar_group, 0.0, 0.0, phys_width, (timebar_height - 1)); - cd_marker_bar->property_outline_pixels() = 1; - cd_marker_bar->property_outline_what() = 0x8; #ifdef WITH_VIDEOTIMELINE videotl_bar_group = new ArdourCanvas::Group (*track_canvas->root ()); if (Profile->get_sae()) { - videotl_bar = new ArdourCanvas::SimpleRect (*videotl_bar_group, 0.0, 0.0, phys_width, (timebar_height * videotl_bar_height - 1)); + videotl_bar = new ArdourCanvas::Rectangle (*videotl_bar_group, 0.0, 0.0, phys_width, (timebar_height * videotl_bar_height - 1)); videotl_bar->property_outline_pixels() = 1; } else { - videotl_bar = new ArdourCanvas::SimpleRect (*videotl_bar_group, 0.0, 0.0, phys_width, (timebar_height * videotl_bar_height)); + videotl_bar = new ArdourCanvas::Rectangle (*videotl_bar_group, 0.0, 0.0, phys_width, (timebar_height * videotl_bar_height)); videotl_bar->property_outline_pixels() = 0; } videotl_bar->property_outline_what() = (0x1 | 0x8); @@ -214,55 +178,55 @@ Editor::initialize_canvas () videotl_group = new ArdourCanvas::Group (*timebar_group, 0.0, 0.0); #endif - cd_marker_bar_drag_rect = new ArdourCanvas::SimpleRect (*cd_marker_group, 0.0, 0.0, 100, timebar_height); - cd_marker_bar_drag_rect->property_outline_pixels() = 0; + cd_marker_bar_drag_rect = new ArdourCanvas::Rectangle (cd_marker_group, ArdourCanvas::Rect (0.0, 0.0, 100, timebar_height)); + cd_marker_bar_drag_rect->set_outline (false); cd_marker_bar_drag_rect->hide (); - range_bar_drag_rect = new ArdourCanvas::SimpleRect (*range_marker_group, 0.0, 0.0, 100, timebar_height); - range_bar_drag_rect->property_outline_pixels() = 0; + range_bar_drag_rect = new ArdourCanvas::Rectangle (range_marker_group, Ardour::Rect (0.0, 0.0, 100, timebar_height)); + range_bar_drag_rect->set_outline (false); range_bar_drag_rect->hide (); - transport_bar_drag_rect = new ArdourCanvas::SimpleRect (*transport_marker_group, 0.0, 0.0, 100, timebar_height); - transport_bar_drag_rect->property_outline_pixels() = 0; + transport_bar_drag_rect = new ArdourCanvas::Rectangle (transport_marker_group, Ardour::Rect (0.0, 0.0, 100, timebar_height)); + transport_bar_drag_rect->set_outline (false); transport_bar_drag_rect->hide (); - transport_punchin_line = new ArdourCanvas::SimpleLine (*_master_group); - transport_punchin_line->property_x1() = 0.0; - transport_punchin_line->property_y1() = 0.0; - transport_punchin_line->property_x2() = 0.0; - transport_punchin_line->property_y2() = phys_height; + transport_punchin_line = new ArdourCanvas::Line (_master_group); + transport_punchin_line->set_x1 (0); + transport_punchin_line->set_y1 (0); + transport_punchin_line->set_x2 (0); + transport_punchin_line->set_y2 (ArdourCanvas::COORD_MAX); transport_punchin_line->hide (); - transport_punchout_line = new ArdourCanvas::SimpleLine (*_master_group); - transport_punchout_line->property_x1() = 0.0; - transport_punchout_line->property_y1() = 0.0; - transport_punchout_line->property_x2() = 0.0; - transport_punchout_line->property_y2() = phys_height; + transport_punchout_line = new ArdourCanvas::Line (_master_group); + transport_punchout_line->set_x1 (0); + transport_punchout_line->set_y1 (0); + transport_punchout_line->set_x2 (0); + transport_punchout_line->set_y2 (ArdourCanvas::COORD_MAX); transport_punchout_line->hide(); // used to show zoom mode active zooming - zoom_rect = new ArdourCanvas::SimpleRect (*_master_group, 0.0, 0.0, 0.0, 0.0); - zoom_rect->property_outline_pixels() = 1; + zoom_rect = new ArdourCanvas::Rectangle (_master_group, 0.0, 0.0, 0.0, 0.0); + zoom_rect->set_outline_width (1); zoom_rect->hide(); - zoom_rect->signal_event().connect (sigc::bind (sigc::mem_fun (*this, &Editor::canvas_zoom_rect_event), (ArdourCanvas::Item*) 0)); + zoom_rect->Event().connect (sigc::bind (sigc::mem_fun (*this, &Editor::canvas_zoom_rect_event), (ArdourCanvas::Item*) 0)); // used as rubberband rect - rubberband_rect = new ArdourCanvas::SimpleRect (*_trackview_group, 0.0, 0.0, 0.0, 0.0); + rubberband_rect = new ArdourCanvas::Rectangle (_trackview_group, ArdourCanvas::Rect (0.0, 0.0, 0.0, 0.0)); - rubberband_rect->property_outline_pixels() = 1; + rubberband_rect->set_outline_width (1); rubberband_rect->hide(); - tempo_bar->signal_event().connect (sigc::bind (sigc::mem_fun (*this, &Editor::canvas_tempo_bar_event), tempo_bar)); - meter_bar->signal_event().connect (sigc::bind (sigc::mem_fun (*this, &Editor::canvas_meter_bar_event), meter_bar)); - marker_bar->signal_event().connect (sigc::bind (sigc::mem_fun (*this, &Editor::canvas_marker_bar_event), marker_bar)); - cd_marker_bar->signal_event().connect (sigc::bind (sigc::mem_fun (*this, &Editor::canvas_cd_marker_bar_event), cd_marker_bar)); + tempo_bar->Event().connect (sigc::bind (sigc::mem_fun (*this, &Editor::canvas_tempo_bar_event), tempo_bar)); + meter_bar->Event().connect (sigc::bind (sigc::mem_fun (*this, &Editor::canvas_meter_bar_event), meter_bar)); + marker_bar->Event().connect (sigc::bind (sigc::mem_fun (*this, &Editor::canvas_marker_bar_event), marker_bar)); + cd_marker_bar->Event().connect (sigc::bind (sigc::mem_fun (*this, &Editor::canvas_cd_marker_bar_event), cd_marker_bar)); #ifdef WITH_VIDEOTIMELINE - videotl_bar_group->signal_event().connect (sigc::bind (sigc::mem_fun (*this, &Editor::canvas_videotl_bar_event), videotl_bar)); - //videotl_bar->signal_event().connect (sigc::bind (sigc::mem_fun (*this, &Editor::canvas_videotl_bar_event), videotl_bar)); + videotl_bar_group->Event().connect (sigc::bind (sigc::mem_fun (*this, &Editor::canvas_videotl_bar_event), videotl_bar)); + //videotl_bar->Event().connect (sigc::bind (sigc::mem_fun (*this, &Editor::canvas_videotl_bar_event), videotl_bar)); #endif - range_marker_bar->signal_event().connect (sigc::bind (sigc::mem_fun (*this, &Editor::canvas_range_marker_bar_event), range_marker_bar)); - transport_marker_bar->signal_event().connect (sigc::bind (sigc::mem_fun (*this, &Editor::canvas_transport_marker_bar_event), transport_marker_bar)); + range_marker_bar->Event().connect (sigc::bind (sigc::mem_fun (*this, &Editor::canvas_range_marker_bar_event), range_marker_bar)); + transport_marker_bar->Event().connect (sigc::bind (sigc::mem_fun (*this, &Editor::canvas_transport_marker_bar_event), transport_marker_bar)); playhead_cursor = new EditorCursor (*this, &Editor::canvas_playhead_cursor_event); @@ -271,19 +235,19 @@ Editor::initialize_canvas () } /* need to handle 4 specific types of events as catch-alls */ - track_canvas->signal_scroll_event().connect (sigc::mem_fun (*this, &Editor::track_canvas_scroll_event)); - track_canvas->signal_motion_notify_event().connect (sigc::mem_fun (*this, &Editor::track_canvas_motion_notify_event)); - track_canvas->signal_button_press_event().connect (sigc::mem_fun (*this, &Editor::track_canvas_button_press_event)); - track_canvas->signal_button_release_event().connect (sigc::mem_fun (*this, &Editor::track_canvas_button_release_event)); - track_canvas->signal_drag_motion().connect (sigc::mem_fun (*this, &Editor::track_canvas_drag_motion)); - track_canvas->signal_key_press_event().connect (sigc::mem_fun (*this, &Editor::track_canvas_key_press)); - track_canvas->signal_key_release_event().connect (sigc::mem_fun (*this, &Editor::track_canvas_key_release)); + _track_canvas->signal_scroll_event().connect (sigc::mem_fun (*this, &Editor::track_canvas_scroll_event)); + _track_canvas->signal_motion_notify_event().connect (sigc::mem_fun (*this, &Editor::track_canvas_motion_notify_event)); + _track_canvas->signal_button_press_event().connect (sigc::mem_fun (*this, &Editor::track_canvas_button_press_event)); + _track_canvas->signal_button_release_event().connect (sigc::mem_fun (*this, &Editor::track_canvas_button_release_event)); + _track_canvas->signal_drag_motion().connect (sigc::mem_fun (*this, &Editor::track_canvas_drag_motion)); + _track_canvas->signal_key_press_event().connect (sigc::mem_fun (*this, &Editor::track_canvas_key_press)); + _track_canvas->signal_key_release_event().connect (sigc::mem_fun (*this, &Editor::track_canvas_key_release)); - track_canvas->set_name ("EditorMainCanvas"); - track_canvas->add_events (Gdk::POINTER_MOTION_HINT_MASK | Gdk::SCROLL_MASK | Gdk::KEY_PRESS_MASK | Gdk::KEY_RELEASE_MASK); - track_canvas->signal_leave_notify_event().connect (sigc::mem_fun(*this, &Editor::left_track_canvas), false); - track_canvas->signal_enter_notify_event().connect (sigc::mem_fun(*this, &Editor::entered_track_canvas), false); - track_canvas->set_flags (CAN_FOCUS); + _track_canvas->set_name ("EditorMainCanvas"); + _track_canvas->add_events (Gdk::POINTER_MOTION_HINT_MASK | Gdk::SCROLL_MASK | Gdk::KEY_PRESS_MASK | Gdk::KEY_RELEASE_MASK); + _track_canvas->signal_leave_notify_event().connect (sigc::mem_fun(*this, &Editor::left_track_canvas), false); + _track_canvas->signal_enter_notify_event().connect (sigc::mem_fun(*this, &Editor::entered_track_canvas), false); + _track_canvas->set_flags (CAN_FOCUS); /* set up drag-n-drop */ @@ -296,10 +260,10 @@ Editor::initialize_canvas () target_table.push_back (TargetEntry ("text/uri-list")); target_table.push_back (TargetEntry ("application/x-rootwin-drop")); - track_canvas->drag_dest_set (target_table); - track_canvas->signal_drag_data_received().connect (sigc::mem_fun(*this, &Editor::track_canvas_drag_data_received)); + _track_canvas->drag_dest_set (target_table); + _track_canvas->signal_drag_data_received().connect (sigc::mem_fun(*this, &Editor::track_canvas_drag_data_received)); - track_canvas->signal_size_allocate().connect (sigc::mem_fun(*this, &Editor::track_canvas_allocate)); + _track_canvas_viewport->signal_size_allocate().connect (sigc::mem_fun(*this, &Editor::track_canvas_viewport_allocate)); ColorsChanged.connect (sigc::mem_fun (*this, &Editor::color_handler)); color_handler(); @@ -307,19 +271,19 @@ Editor::initialize_canvas () } void -Editor::track_canvas_allocate (Gtk::Allocation alloc) +Editor::track_canvas_viewport_allocate (Gtk::Allocation alloc) { - canvas_allocation = alloc; - track_canvas_size_allocated (); + _canvas_viewport_allocation = alloc; + track_canvas_viewport_size_allocated (); } bool -Editor::track_canvas_size_allocated () +Editor::track_canvas_viewport_size_allocated () { - bool height_changed = _canvas_height != canvas_allocation.get_height(); + bool height_changed = _visible_canvas_height != _canvas_viewport_allocation.get_height(); - _canvas_width = canvas_allocation.get_width(); - _canvas_height = canvas_allocation.get_height(); + _visible_canvas_width = _canvas_viewport_allocation.get_width (); + _visible_canvas_height = _canvas_viewport_allocation.get_height (); if (_session) { TrackViewList::iterator i; @@ -330,22 +294,18 @@ Editor::track_canvas_size_allocated () } if (height_changed) { - if (playhead_cursor) { - playhead_cursor->set_length (_canvas_height); - } for (LocationMarkerMap::iterator i = location_markers.begin(); i != location_markers.end(); ++i) { - i->second->canvas_height_set (_canvas_height); + i->second->canvas_height_set (_visible_canvas_height); } - vertical_adjustment.set_page_size (_canvas_height); - last_trackview_group_vertical_offset = get_trackview_group_vertical_offset (); - if ((vertical_adjustment.get_value() + _canvas_height) >= vertical_adjustment.get_upper()) { + vertical_adjustment.set_page_size (_visible_canvas_height); + if ((vertical_adjustment.get_value() + _visible_canvas_height) >= vertical_adjustment.get_upper()) { /* We're increasing the size of the canvas while the bottom is visible. We scroll down to keep in step with the controls layout. */ - vertical_adjustment.set_value (full_canvas_height - _canvas_height); + vertical_adjustment.set_value (_full_canvas_height - _visible_canvas_height); } } @@ -493,7 +453,7 @@ Editor::drop_paths (const RefPtr<Gdk::DragContext>& context, /* D-n-D coordinates are window-relative, so convert to "world" coordinates */ - track_canvas->window_to_world (x, y, wx, wy); + _track_canvas_viewport->window_to_canvas (x, y, wx, wy); ev.type = GDK_BUTTON_RELEASE; ev.button.x = wx; @@ -571,10 +531,10 @@ Editor::maybe_autoscroll (bool allow_horiz, bool allow_vert, bool moving_left, b autoscroll_y = 0; autoscroll_x = 0; - if (ty < canvas_timebars_vsize && moving_up && allow_vert) { + if (ty < 0 && moving_up && allow_vert) { autoscroll_y = -1; startit = true; - } else if (ty > _canvas_height && !moving_up && allow_vert) { + } else if (ty > _visible_canvas_height && !moving_up && allow_vert) { autoscroll_y = 1; startit = true; } @@ -638,7 +598,7 @@ Editor::autoscroll_canvas () if (autoscroll_y_distance != 0) { if (autoscroll_y > 0) { - autoscroll_y_distance = (_drags->current_pointer_y() - (get_trackview_group_vertical_offset() + _canvas_height)) / 3; + autoscroll_y_distance = (_drags->current_pointer_y() - (get_trackview_group_vertical_offset() + _visible_canvas_height)) / 3; } else if (autoscroll_y < 0) { autoscroll_y_distance = (vertical_adjustment.get_value () - _drags->current_pointer_y()) / 3; @@ -676,10 +636,10 @@ Editor::autoscroll_canvas () } else if (autoscroll_y > 0) { - double top_of_bottom_of_canvas = full_canvas_height - _canvas_height; + double const top_of_bottom_of_canvas = _full_canvas_height - _visible_canvas_height; - if (vertical_pos > full_canvas_height - autoscroll_y_distance) { - new_pixel = full_canvas_height; + if (vertical_pos > _full_canvas_height - autoscroll_y_distance) { + new_pixel = _full_canvas_height; } else { new_pixel = vertical_pos + autoscroll_y_distance; } @@ -692,7 +652,7 @@ Editor::autoscroll_canvas () (its top edge will line up with the bottom of the visible canvas. */ - target_pixel = min (target_pixel, full_canvas_height - 10); + target_pixel = min (target_pixel, _full_canvas_height - 10); } else { target_pixel = _drags->current_pointer_y(); @@ -712,7 +672,7 @@ Editor::autoscroll_canvas () /* fake an event. */ - Glib::RefPtr<Gdk::Window> canvas_window = const_cast<Editor*>(this)->track_canvas->get_window(); + Glib::RefPtr<Gdk::Window> canvas_window = const_cast<Editor*>(this)->_track_canvas->get_window(); gint x, y; Gdk::ModifierType mask; canvas_window->get_pointer (x, y, mask); @@ -806,10 +766,19 @@ Editor::ensure_time_axis_view_is_visible (const TimeAxisView& tav) } } +/** Called when the main vertical_adjustment has changed */ void Editor::tie_vertical_scrolling () { - scroll_canvas_vertically (); + _track_canvas_vadj->set_value (vertical_adjustment.get_value ()); + + for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) { + (*i)->clip_to_viewport (); + } + + /* required to keep the controls_layout in lock step with the canvas group */ + + update_canvas_now (); /* this will do an immediate redraw */ @@ -823,18 +792,10 @@ Editor::tie_vertical_scrolling () void Editor::set_horizontal_position (double p) { - /* horizontal scrolling only */ - double x1, y1, x2, y2, x_delta; - _master_group->get_bounds (x1, y1, x2, y2); - - x_delta = - (x1 + p); + _track_canvas_hadj->set_value (p); + _time_bars_canvas_hadj->set_value (p); - _master_group->move (x_delta, 0); - timebar_group->move (x_delta, 0); - time_line_group->move (x_delta, 0); - cursor_group->move (x_delta, 0); - - leftmost_frame = (framepos_t) floor (p * frames_per_unit); + leftmost_frame = (framepos_t) floor (p * frames_per_pixel); update_fixed_rulers (); redisplay_tempo (true); @@ -881,55 +842,55 @@ Editor::scroll_canvas_vertically () void Editor::color_handler() { - playhead_cursor->canvas_item.property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_PlayHead.get(); + playhead_cursor->canvas_item.set_fill_color (ARDOUR_UI::config()->canvasvar_PlayHead.get()); _verbose_cursor->set_color (ARDOUR_UI::config()->canvasvar_VerboseCanvasCursor.get()); - meter_bar->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_MeterBar.get(); - meter_bar->property_outline_color_rgba() = ARDOUR_UI::config()->canvasvar_MarkerBarSeparator.get(); + meter_bar->set_fill_color (ARDOUR_UI::config()->canvasvar_MeterBar.get()); + meter_bar->set_outline_color (ARDOUR_UI::config()->canvasvar_MarkerBarSeparator.get()); - tempo_bar->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_TempoBar.get(); - tempo_bar->property_outline_color_rgba() = ARDOUR_UI::config()->canvasvar_MarkerBarSeparator.get(); + tempo_bar->set_fill_color (ARDOUR_UI::config()->canvasvar_TempoBar.get()); + tempo_bar->set_outline_color (ARDOUR_UI::config()->canvasvar_MarkerBarSeparator.get()); - marker_bar->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_MarkerBar.get(); - marker_bar->property_outline_color_rgba() = ARDOUR_UI::config()->canvasvar_MarkerBarSeparator.get(); + marker_bar->set_fill_color (ARDOUR_UI::config()->canvasvar_MarkerBar.get()); + marker_bar->set_outline_color (ARDOUR_UI::config()->canvasvar_MarkerBarSeparator.get()); - cd_marker_bar->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_CDMarkerBar.get(); - cd_marker_bar->property_outline_color_rgba() = ARDOUR_UI::config()->canvasvar_MarkerBarSeparator.get(); + cd_marker_bar->set_fill_color (ARDOUR_UI::config()->canvasvar_CDMarkerBar.get()); + cd_marker_bar->set_outline_color (ARDOUR_UI::config()->canvasvar_MarkerBarSeparator.get()); #ifdef WITH_VIDEOTIMELINE - videotl_bar->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_VideoBar.get(); - videotl_bar->property_outline_color_rgba() = ARDOUR_UI::config()->canvasvar_MarkerBarSeparator.get(); + videotl_bar->set_fill_color (ARDOUR_UI::config()->canvasvar_VideoBar.get()); + videotl_bar->set_outline_color (ARDOUR_UI::config()->canvasvar_MarkerBarSeparator.get()); #endif - range_marker_bar->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_RangeMarkerBar.get(); - range_marker_bar->property_outline_color_rgba() = ARDOUR_UI::config()->canvasvar_MarkerBarSeparator.get(); + range_marker_bar->set_fill_color (ARDOUR_UI::config()->canvasvar_RangeMarkerBar.get()); + range_marker_bar->set_outline_color (ARDOUR_UI::config()->canvasvar_MarkerBarSeparator.get()); - transport_marker_bar->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_TransportMarkerBar.get(); - transport_marker_bar->property_outline_color_rgba() = ARDOUR_UI::config()->canvasvar_MarkerBarSeparator.get(); + transport_marker_bar->set_fill_color (ARDOUR_UI::config()->canvasvar_TransportMarkerBar.get()); + transport_marker_bar->set_outline_color (ARDOUR_UI::config()->canvasvar_MarkerBarSeparator.get()); - cd_marker_bar_drag_rect->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_RangeDragBarRect.get(); - cd_marker_bar_drag_rect->property_outline_color_rgba() = ARDOUR_UI::config()->canvasvar_RangeDragBarRect.get(); + cd_marker_bar_drag_rect->set_fill_color (ARDOUR_UI::config()->canvasvar_RangeDragBarRect.get()); + cd_marker_bar_drag_rect->set_outline_color (ARDOUR_UI::config()->canvasvar_RangeDragBarRect.get()); - range_bar_drag_rect->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_RangeDragBarRect.get(); - range_bar_drag_rect->property_outline_color_rgba() = ARDOUR_UI::config()->canvasvar_RangeDragBarRect.get(); + range_bar_drag_rect->set_fill_color (ARDOUR_UI::config()->canvasvar_RangeDragBarRect.get()); + range_bar_drag_rect->set_outline_color (ARDOUR_UI::config()->canvasvar_RangeDragBarRect.get()); - transport_bar_drag_rect->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_TransportDragRect.get(); - transport_bar_drag_rect->property_outline_color_rgba() = ARDOUR_UI::config()->canvasvar_TransportDragRect.get(); + transport_bar_drag_rect->set_fill_color (ARDOUR_UI::config()->canvasvar_TransportDragRect.get()); + transport_bar_drag_rect->set_outline_color (ARDOUR_UI::config()->canvasvar_TransportDragRect.get()); - transport_loop_range_rect->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_TransportLoopRect.get(); - transport_loop_range_rect->property_outline_color_rgba() = ARDOUR_UI::config()->canvasvar_TransportLoopRect.get(); + transport_loop_range_rect->set_fill_color (ARDOUR_UI::config()->canvasvar_TransportLoopRect.get()); + transport_loop_range_rect->set_outline_color (ARDOUR_UI::config()->canvasvar_TransportLoopRect.get()); - transport_punch_range_rect->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_TransportPunchRect.get(); - transport_punch_range_rect->property_outline_color_rgba() = ARDOUR_UI::config()->canvasvar_TransportPunchRect.get(); + transport_punch_range_rect->set_fill_color (ARDOUR_UI::config()->canvasvar_TransportPunchRect.get()); + transport_punch_range_rect->set_outline_color (ARDOUR_UI::config()->canvasvar_TransportPunchRect.get()); - transport_punchin_line->property_color_rgba() = ARDOUR_UI::config()->canvasvar_PunchLine.get(); - transport_punchout_line->property_color_rgba() = ARDOUR_UI::config()->canvasvar_PunchLine.get(); + transport_punchin_line->set_color (ARDOUR_UI::config()->canvasvar_PunchLine.get()); + transport_punchout_line->set_color (ARDOUR_UI::config()->canvasvar_PunchLine.get()); - zoom_rect->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_ZoomRect.get(); - zoom_rect->property_outline_color_rgba() = ARDOUR_UI::config()->canvasvar_ZoomRect.get(); + zoom_rect->set_fill_color (ARDOUR_UI::config()->canvasvar_ZoomRect.get()); + zoom_rect->set_outline_color (ARDOUR_UI::config()->canvasvar_ZoomRect.get()); - rubberband_rect->property_outline_color_rgba() = ARDOUR_UI::config()->canvasvar_RubberBandRect.get(); - rubberband_rect->property_fill_color_rgba() = (guint32) ARDOUR_UI::config()->canvasvar_RubberBandRect.get(); + rubberband_rect->set_outline_color (ARDOUR_UI::config()->canvasvar_RubberBandRect.get()); + rubberband_rect->set_fill_color ((guint32) ARDOUR_UI::config()->canvasvar_RubberBandRect.get()); location_marker_color = ARDOUR_UI::config()->canvasvar_LocationMarker.get(); location_range_color = ARDOUR_UI::config()->canvasvar_LocationRange.get(); @@ -967,10 +928,11 @@ Editor::update_canvas_now () If one is scheduled, GC should probably remove it. */ - GnomeCanvas* c = track_canvas->gobj (); - if (c->need_update || c->need_redraw) { - track_canvas->update_now (); - } + /* XXX: CANVAS */ +// GnomeCanvas* c = track_canvas->gobj (); +// if (c->need_update || c->need_redraw) { +// track_canvas->update_now (); +// } } double |