X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Feditor_canvas.cc;h=40f6b05026822fa92621b6840dd2d941ca3b4111;hb=b01bdb7e70f021da764e81a4b55722e746e4885d;hp=69aa6428a680d58ed0ec08f01d5f3faf4ffb71ab;hpb=868f557f2612903f72614a2b3a317c7a528188d1;p=ardour.git diff --git a/gtk2_ardour/editor_canvas.cc b/gtk2_ardour/editor_canvas.cc index 69aa6428a6..40f6b05026 100644 --- a/gtk2_ardour/editor_canvas.cc +++ b/gtk2_ardour/editor_canvas.cc @@ -15,7 +15,6 @@ along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - $Id$ */ #include @@ -23,17 +22,16 @@ #include #include +#include #include "ardour_ui.h" #include "editor.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 "editing.h" #include "rgb_macros.h" @@ -41,17 +39,23 @@ #include "time_axis_view.h" #include "audio_time_axis.h" +#ifdef WITH_CMT +#include "imageframe.h" +#include "imageframe_p.h" +#endif + #include "i18n.h" using namespace std; using namespace sigc; using namespace ARDOUR; +using namespace PBD; using namespace Gtk; using namespace Glib; using namespace Gtkmm2ext; using namespace Editing; -/* XXX this is a hack. it ought to be the maximum value of an jack_nframes_t */ +/* XXX this is a hack. it ought to be the maximum value of an nframes_t */ const double max_canvas_coordinate = (double) JACK_MAX_FRAMES; @@ -61,7 +65,10 @@ extern "C" GType gnome_canvas_simpleline_get_type(void); GType gnome_canvas_simplerect_get_type(void); GType gnome_canvas_waveview_get_type(void); + +#ifdef WITH_CMT GType gnome_canvas_imageframe_get_type(void); +#endif } @@ -72,14 +79,20 @@ static void ardour_canvas_type_init() 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); + +#ifdef WITH_CMT Glib::wrap_register(gnome_canvas_imageframe_get_type(), &Gnome::Canvas::ImageFrame_Class::wrap_new); +#endif // Register the gtkmm gtypes: (void) Gnome::Canvas::WaveView::get_type(); (void) Gnome::Canvas::SimpleLine::get_type(); (void) Gnome::Canvas::SimpleRect::get_type(); + +#ifdef WITH_CMT (void) Gnome::Canvas::ImageFrame::get_type(); +#endif } void @@ -91,8 +104,15 @@ Editor::initialize_canvas () /* don't try to center the canvas */ track_canvas.set_center_scroll_region (false); + track_canvas.set_dither (Gdk::RGB_DITHER_NONE); + + /* need to handle 4 specific types of events as catch-alls */ + + track_canvas.signal_scroll_event().connect (mem_fun (*this, &Editor::track_canvas_scroll_event)); + track_canvas.signal_motion_notify_event().connect (mem_fun (*this, &Editor::track_canvas_motion_notify_event)); + track_canvas.signal_button_press_event().connect (mem_fun (*this, &Editor::track_canvas_button_press_event)); + track_canvas.signal_button_release_event().connect (mem_fun (*this, &Editor::track_canvas_button_release_event)); - track_canvas.signal_event().connect (bind (mem_fun (*this, &Editor::track_canvas_event), (ArdourCanvas::Item*) 0)); track_canvas.set_name ("EditorMainCanvas"); track_canvas.add_events (Gdk::POINTER_MOTION_HINT_MASK|Gdk::SCROLL_MASK); track_canvas.signal_leave_notify_event().connect (mem_fun(*this, &Editor::left_track_canvas)); @@ -114,60 +134,71 @@ Editor::initialize_canvas () /* stuff for the verbose canvas cursor */ - Pango::FontDescription font = get_font_for_style (N_("VerboseCanvasCursor")); + Pango::FontDescription* font = get_font_for_style (N_("VerboseCanvasCursor")); verbose_canvas_cursor = new ArdourCanvas::Text (*track_canvas.root()); - verbose_canvas_cursor->property_font_desc() = font; + verbose_canvas_cursor->property_font_desc() = *font; verbose_canvas_cursor->property_anchor() = ANCHOR_NW; - verbose_canvas_cursor->property_fill_color_rgba() = color_map[cVerboseCanvasCursor]; + delete font; + verbose_cursor_visible = false; + 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->property_height_in_pixels() = true; + // logo_item->property_width_in_pixels() = true; + // logo_item->property_height_set() = true; + // logo_item->property_width_set() = true; + logo_item->show (); + } + /* a group to hold time (measure) lines */ time_line_group = new ArdourCanvas::Group (*track_canvas.root(), 0.0, 0.0); + tempo_lines = new TempoLines(track_canvas, time_line_group); cursor_group = new ArdourCanvas::Group (*track_canvas.root(), 0.0, 0.0); - time_canvas.set_name ("EditorTimeCanvas"); time_canvas.add_events (Gdk::POINTER_MOTION_HINT_MASK); time_canvas.set_flags (CAN_FOCUS); time_canvas.set_center_scroll_region (false); + time_canvas.set_dither (Gdk::RGB_DITHER_NONE); + + marker_time_line_group = new ArdourCanvas::Group (*time_canvas.root(), 0.0, 0.0); + marker_tempo_lines = new TempoLines(time_canvas, marker_time_line_group); meter_group = new ArdourCanvas::Group (*time_canvas.root(), 0.0, 0.0); tempo_group = new ArdourCanvas::Group (*time_canvas.root(), 0.0, timebar_height); - marker_group = new ArdourCanvas::Group (*time_canvas.root(), 0.0, timebar_height * 2.0); - range_marker_group = new ArdourCanvas::Group (*time_canvas.root(), 0.0, timebar_height * 3.0); - transport_marker_group = new ArdourCanvas::Group (*time_canvas.root(), 0.0, timebar_height * 4.0); - - tempo_bar = new ArdourCanvas::SimpleRect (*tempo_group, 0.0, 0.0, max_canvas_coordinate, timebar_height); - tempo_bar->property_fill_color_rgba() = color_map[cTempoBar]; - tempo_bar->property_outline_pixels() = 0; + range_marker_group = new ArdourCanvas::Group (*time_canvas.root(), 0.0, timebar_height * 2.0); + transport_marker_group = new ArdourCanvas::Group (*time_canvas.root(), 0.0, timebar_height * 3.0); + marker_group = new ArdourCanvas::Group (*time_canvas.root(), 0.0, timebar_height * 4.0); - meter_bar = new ArdourCanvas::SimpleRect (*meter_group, 0.0, 0.0, max_canvas_coordinate, timebar_height); - meter_bar->property_fill_color_rgba() = color_map[cMeterBar]; - meter_bar->property_outline_pixels() = 0; + tempo_bar = new ArdourCanvas::SimpleRect (*tempo_group, 0.0, 0.0, max_canvas_coordinate, timebar_height-1.0); + tempo_bar->property_outline_what() = (0x1 | 0x8); + tempo_bar->property_outline_pixels() = 1; - marker_bar = new ArdourCanvas::SimpleRect (*marker_group, 0.0, 0.0, max_canvas_coordinate, timebar_height); - marker_bar->property_fill_color_rgba() = color_map[cMarkerBar]; - marker_bar->property_outline_pixels() = 0; + meter_bar = new ArdourCanvas::SimpleRect (*meter_group, 0.0, 0.0, max_canvas_coordinate, timebar_height-1.0); + meter_bar->property_outline_what() = (0x1 | 0x8); + meter_bar->property_outline_pixels() = 1; - range_marker_bar = new ArdourCanvas::SimpleRect (*range_marker_group, 0.0, 0.0, max_canvas_coordinate, timebar_height); - range_marker_bar->property_fill_color_rgba() = color_map[cRangeMarkerBar]; - range_marker_bar->property_outline_pixels() = 0; + marker_bar = new ArdourCanvas::SimpleRect (*marker_group, 0.0, 0.0, max_canvas_coordinate, timebar_height-1.0); + marker_bar->property_outline_what() = (0x1 | 0x8); + marker_bar->property_outline_pixels() = 1; - transport_marker_bar = new ArdourCanvas::SimpleRect (*transport_marker_group, 0.0, 0.0, max_canvas_coordinate, timebar_height); - transport_marker_bar->property_fill_color_rgba() = color_map[cTransportMarkerBar]; - transport_marker_bar->property_outline_pixels() = 0; + range_marker_bar = new ArdourCanvas::SimpleRect (*range_marker_group, 0.0, 0.0, max_canvas_coordinate, timebar_height-1.0); + range_marker_bar->property_outline_what() = (0x1 | 0x8); + range_marker_bar->property_outline_pixels() = 1; - range_bar_drag_rect = new ArdourCanvas::SimpleRect (*range_marker_group, 0.0, 0.0, max_canvas_coordinate, timebar_height); - range_bar_drag_rect->property_fill_color_rgba() = color_map[cRangeDragBarRectFill]; - range_bar_drag_rect->property_outline_color_rgba() = color_map[cRangeDragBarRect]; + transport_marker_bar = new ArdourCanvas::SimpleRect (*transport_marker_group, 0.0, 0.0, max_canvas_coordinate, timebar_height-1.0); + transport_marker_bar->property_outline_what() = (0x1 | 0x8); + transport_marker_bar->property_outline_pixels() = 1; + + range_bar_drag_rect = new ArdourCanvas::SimpleRect (*range_marker_group, 0.0, 0.0, max_canvas_coordinate, timebar_height-1.0); range_bar_drag_rect->property_outline_pixels() = 0; range_bar_drag_rect->hide (); - transport_bar_drag_rect = new ArdourCanvas::SimpleRect (*transport_marker_group, 0.0, 0.0, max_canvas_coordinate, timebar_height); - transport_bar_drag_rect ->property_fill_color_rgba() = color_map[cTransportDragRectFill]; - transport_bar_drag_rect->property_outline_color_rgba() = color_map[cTransportDragRect]; + transport_bar_drag_rect = new ArdourCanvas::SimpleRect (*transport_marker_group, 0.0, 0.0, max_canvas_coordinate, timebar_height-1.0); transport_bar_drag_rect->property_outline_pixels() = 0; transport_bar_drag_rect->hide (); @@ -176,24 +207,17 @@ Editor::initialize_canvas () marker_drag_line = new ArdourCanvas::Line (*track_canvas.root()); marker_drag_line->property_width_pixels() = 1; - marker_drag_line->property_fill_color_rgba() = color_map[cMarkerDragLine]; marker_drag_line->property_points() = marker_drag_line_points; marker_drag_line->hide(); range_marker_drag_rect = new ArdourCanvas::SimpleRect (*track_canvas.root(), 0.0, 0.0, 0.0, 0.0); - range_marker_drag_rect->property_fill_color_rgba() = color_map[cRangeDragRectFill]; - range_marker_drag_rect->property_outline_color_rgba() = color_map[cRangeDragRect]; range_marker_drag_rect->hide (); transport_loop_range_rect = new ArdourCanvas::SimpleRect (*time_line_group, 0.0, 0.0, 0.0, 0.0); - transport_loop_range_rect->property_fill_color_rgba() = color_map[cTransportLoopRectFill]; - transport_loop_range_rect->property_outline_color_rgba() = color_map[cTransportLoopRect]; transport_loop_range_rect->property_outline_pixels() = 1; transport_loop_range_rect->hide(); transport_punch_range_rect = new ArdourCanvas::SimpleRect (*time_line_group, 0.0, 0.0, 0.0, 0.0); - transport_punch_range_rect->property_fill_color_rgba() = color_map[cTransportPunchRectFill]; - transport_punch_range_rect->property_outline_color_rgba() = color_map[cTransportPunchRect]; transport_punch_range_rect->property_outline_pixels() = 0; transport_punch_range_rect->hide(); @@ -204,7 +228,6 @@ Editor::initialize_canvas () transport_punchin_line->property_y1() = 0.0; transport_punchin_line->property_x2() = 0.0; transport_punchin_line->property_y2() = 0.0; - transport_punchin_line->property_color_rgba() = color_map[cPunchInLine]; transport_punchin_line->hide (); transport_punchout_line = new ArdourCanvas::SimpleLine (*time_line_group); @@ -212,13 +235,10 @@ Editor::initialize_canvas () transport_punchout_line->property_y1() = 0.0; transport_punchout_line->property_x2() = 0.0; transport_punchout_line->property_y2() = 0.0; - transport_punchout_line->property_color_rgba() = color_map[cPunchOutLine]; transport_punchout_line->hide(); // used to show zoom mode active zooming zoom_rect = new ArdourCanvas::SimpleRect (*track_canvas.root(), 0.0, 0.0, 0.0, 0.0); - zoom_rect->property_fill_color_rgba() = color_map[cZoomRectFill]; - zoom_rect->property_outline_color_rgba() = color_map[cZoomRect]; zoom_rect->property_outline_pixels() = 1; zoom_rect->hide(); @@ -226,8 +246,6 @@ Editor::initialize_canvas () // used as rubberband rect rubberband_rect = new ArdourCanvas::SimpleRect (*track_canvas.root(), 0.0, 0.0, 0.0, 0.0); - rubberband_rect->property_outline_color_rgba() = color_map[cRubberBandRect]; - rubberband_rect->property_fill_color_rgba() = (guint32) color_map[cRubberBandRectFill]; rubberband_rect->property_outline_pixels() = 1; rubberband_rect->hide(); @@ -237,58 +255,80 @@ Editor::initialize_canvas () range_marker_bar->signal_event().connect (bind (mem_fun (*this, &Editor::canvas_range_marker_bar_event), range_marker_bar)); transport_marker_bar->signal_event().connect (bind (mem_fun (*this, &Editor::canvas_transport_marker_bar_event), transport_marker_bar)); - /* separator lines */ - - tempo_line = new ArdourCanvas::SimpleLine (*tempo_group, 0, timebar_height, max_canvas_coordinate, timebar_height); - tempo_line->property_color_rgba() = RGBA_TO_UINT (0,0,0,255); - - meter_line = new ArdourCanvas::SimpleLine (*meter_group, 0, timebar_height, max_canvas_coordinate, timebar_height); - meter_line->property_color_rgba() = RGBA_TO_UINT (0,0,0,255); - - marker_line = new ArdourCanvas::SimpleLine (*marker_group, 0, timebar_height, max_canvas_coordinate, timebar_height); - marker_line->property_color_rgba() = RGBA_TO_UINT (0,0,0,255); - - range_marker_line = new ArdourCanvas::SimpleLine (*range_marker_group, 0, timebar_height, max_canvas_coordinate, timebar_height); - range_marker_line->property_color_rgba() = RGBA_TO_UINT (0,0,0,255); - - transport_marker_line = new ArdourCanvas::SimpleLine (*transport_marker_group, 0, timebar_height, max_canvas_coordinate, timebar_height); - transport_marker_line->property_color_rgba() = RGBA_TO_UINT (0,0,0,255); - ZoomChanged.connect (bind (mem_fun(*this, &Editor::update_loop_range_view), false)); ZoomChanged.connect (bind (mem_fun(*this, &Editor::update_punch_range_view), false)); double time_height = timebar_height * 5; double time_width = FLT_MAX/frames_per_unit; time_canvas.set_scroll_region(0.0, 0.0, time_width, time_height); - - edit_cursor = new Cursor (*this, "blue", &Editor::canvas_edit_cursor_event); - playhead_cursor = new Cursor (*this, "red", &Editor::canvas_playhead_cursor_event); - + + playhead_cursor = new Cursor (*this, &Editor::canvas_playhead_cursor_event); + + initial_ruler_update_required = true; track_canvas.signal_size_allocate().connect (mem_fun(*this, &Editor::track_canvas_allocate)); + + if (logo_item) { + logo_item->lower_to_bottom (); + } + + ColorsChanged.connect (mem_fun (*this, &Editor::color_handler)); + color_handler(); + } void Editor::track_canvas_allocate (Gtk::Allocation alloc) { - static bool first_time = true; + canvas_allocation = alloc; + + if (!initial_ruler_update_required) { + if (!canvas_idle_queued) { + /* call this first so that we do stuff before any pending redraw */ + Glib::signal_idle().connect (mem_fun (*this, &Editor::track_canvas_size_allocated), false); + canvas_idle_queued = true; + } + return; + } + + initial_ruler_update_required = false; + + track_canvas_size_allocated (); +} - canvas_width = alloc.get_width(); - canvas_height = alloc.get_height(); +bool +Editor::track_canvas_size_allocated () +{ + if (canvas_idle_queued) { + canvas_idle_queued = false; + } - zoom_range_clock.set ((jack_nframes_t) floor ((canvas_width * frames_per_unit))); - edit_cursor->set_position (edit_cursor->current_frame); + canvas_width = canvas_allocation.get_width(); + canvas_height = canvas_allocation.get_height(); + + full_canvas_height = canvas_height; + + if (session) { + TrackViewList::iterator i; + double height = 0; + + for (i = track_views.begin(); i != track_views.end(); ++i) { + if ((*i)->control_parent) { + height += (*i)->effective_height; + } + } + + full_canvas_height = height; + } + + zoom_range_clock.set ((nframes_t) floor ((canvas_width * frames_per_unit))); playhead_cursor->set_position (playhead_cursor->current_frame); reset_hscrollbar_stepping (); reset_scrolling_region (); - if (edit_cursor) edit_cursor->set_length (canvas_height); if (playhead_cursor) playhead_cursor->set_length (canvas_height); - if (marker_drag_line) { - marker_drag_line_points.back().set_x(canvas_height); - marker_drag_line->property_points() = marker_drag_line_points; - } + // EDIT CURSOR XXX set line height for selected markers here if (range_marker_drag_rect) { range_marker_drag_rect->property_y1() = 0.0; @@ -314,17 +354,18 @@ Editor::track_canvas_allocate (Gtk::Allocation alloc) transport_punchout_line->property_y1() = 0.0; transport_punchout_line->property_y2() = canvas_height; } - - update_fixed_rulers (); + compute_fixed_ruler_scale (); + update_fixed_rulers(); + redisplay_tempo (true); - if (is_visible() && first_time) { - tempo_map_changed (Change (0)); - first_time = false; - } else { - redisplay_tempo (); + if (logo_item) { + // logo_item->property_height() = canvas_height; + // logo_item->property_width() = canvas_width; } Resized (); /* EMIT_SIGNAL */ + + return false; } void @@ -338,7 +379,6 @@ Editor::reset_scrolling_region (Gtk::Allocation* alloc) TimeAxisView *tv = (*i)[route_display_columns.tv]; if (tv != 0 && !tv->hidden()) { pos += tv->effective_height; - pos += track_spacing; } } @@ -363,7 +403,6 @@ Editor::controls_layout_size_request (Requisition* req) TimeAxisView *tv = (*i)[route_display_columns.tv]; if (tv != 0) { pos += tv->effective_height; - pos += track_spacing; } } @@ -425,12 +464,12 @@ Editor::drop_paths (const RefPtr& context, guint info, guint time) { TimeAxisView* tvp; - AudioTimeAxisView* tv; + RouteTimeAxisView* tv; double cy; vector paths; string spath; GdkEvent ev; - jack_nframes_t frame; + nframes64_t frame; if (convert_drop_to_paths (paths, context, x, y, data, info, time)) { goto out; @@ -458,15 +497,18 @@ Editor::drop_paths (const RefPtr& context, /* drop onto canvas background: create new tracks */ - jack_nframes_t pos = 0; - do_embed (paths, false, ImportAsTrack, 0, pos, false); + do_embed (paths, Editing::ImportDistinctFiles, ImportAsTrack, frame); - } else if ((tv = dynamic_cast(tvp)) != 0) { + } else if ((tv = dynamic_cast(tvp)) != 0) { /* check that its an audio track, not a bus */ + /* check that its an audio track, not a bus */ + if (tv->get_diskstream()) { - do_embed (paths, false, ImportToTrack, tv->audio_track(), frame, true); + /* select the track, then embed */ + selection->set (tv); + do_embed (paths, Editing::ImportDistinctFiles, ImportToTrack, frame); } } @@ -480,16 +522,14 @@ Editor::drop_regions (const RefPtr& context, const SelectionData& data, guint info, guint time) { - const DnDTreeView::SerializedObjectPointers* sr = reinterpret_cast (data.get_data()); + const SerializedObjectPointers >* sr = + reinterpret_cast > *> (data.get_data()); for (uint32_t i = 0; i < sr->cnt; ++i) { - Region* r = reinterpret_cast (sr->ptr[i]); - AudioRegion* ar; - - if ((ar = dynamic_cast(r)) != 0) { - insert_region_list_drag (*ar, x, y); - } + boost::shared_ptr r = sr->data[i]; + + insert_region_list_drag (r, x, y); } context->drag_finish (true, false, time); @@ -498,8 +538,8 @@ Editor::drop_regions (const RefPtr& context, void Editor::maybe_autoscroll (GdkEvent* event) { - jack_nframes_t rightmost_frame = leftmost_frame + current_page_frames(); - jack_nframes_t frame = drag_info.current_pointer_frame; + nframes_t rightmost_frame = leftmost_frame + current_page_frames(); + nframes_t frame = drag_info.current_pointer_frame; bool startit = false; static int last_autoscroll_direction = 0; @@ -528,7 +568,7 @@ Editor::maybe_autoscroll (GdkEvent* event) } - if (autoscroll_direction != last_autoscroll_direction) { + if ((autoscroll_direction != last_autoscroll_direction) || (leftmost_frame < frame < rightmost_frame)) { stop_canvas_autoscroll (); } @@ -542,17 +582,16 @@ Editor::maybe_autoscroll (GdkEvent* event) gint Editor::_autoscroll_canvas (void *arg) { - return ((Editor *) arg)->autoscroll_canvas (); + return ((Editor *) arg)->autoscroll_canvas (); } -gint +bool Editor::autoscroll_canvas () { - jack_nframes_t new_frame; - bool keep_calling = true; - jack_nframes_t limit = max_frames - current_page_frames(); + nframes_t new_frame; + nframes_t limit = max_frames - current_page_frames(); GdkEventMotion ev; - jack_nframes_t target_frame; + nframes_t target_frame; if (autoscroll_direction < 0) { if (leftmost_frame < autoscroll_distance) { @@ -570,10 +609,6 @@ Editor::autoscroll_canvas () target_frame = drag_info.current_pointer_frame + autoscroll_distance; } - if (new_frame != leftmost_frame) { - reposition_x_origin (new_frame); - } - /* now fake a motion event to get the object that is being dragged to move too */ ev.type = GDK_MOTION_NOTIFY; @@ -593,45 +628,52 @@ Editor::autoscroll_canvas () /* connect the timeout so that we get called repeatedly */ - autoscroll_timeout_tag = gtk_timeout_add (20, _autoscroll_canvas, this); - keep_calling = false; + autoscroll_timeout_tag = g_idle_add ( _autoscroll_canvas, this); + return false; - } else if (autoscroll_cnt == 50) { /* 0.5 seconds */ + } + + if (new_frame != leftmost_frame) { + reset_x_origin (new_frame); + } + + if (autoscroll_cnt == 50) { /* 0.5 seconds */ /* after about a while, speed up a bit by changing the timeout interval */ - autoscroll_distance = (jack_nframes_t) floor (current_page_frames()/50.0f); + autoscroll_distance = (nframes_t) floor (current_page_frames()/30.0f); - } else if (autoscroll_cnt == 75) { /* 1.0 seconds */ + } else if (autoscroll_cnt == 150) { /* 1.0 seconds */ - autoscroll_distance = (jack_nframes_t) floor (current_page_frames()/20.0f); + autoscroll_distance = (nframes_t) floor (current_page_frames()/20.0f); - } else if (autoscroll_cnt == 100) { /* 1.5 seconds */ + } else if (autoscroll_cnt == 300) { /* 1.5 seconds */ /* after about another while, speed up by increasing the shift per callback */ - autoscroll_distance = (jack_nframes_t) floor (current_page_frames()/10.0f); + autoscroll_distance = (nframes_t) floor (current_page_frames()/10.0f); } - return keep_calling; + return true; } void Editor::start_canvas_autoscroll (int dir) { - if (!session) { + if (!session || autoscroll_active) { return; } stop_canvas_autoscroll (); + autoscroll_active = true; autoscroll_direction = dir; - autoscroll_distance = (jack_nframes_t) floor (current_page_frames()/100.0); + autoscroll_distance = (nframes_t) floor (current_page_frames()/50.0); autoscroll_cnt = 0; /* do it right now, which will start the repeated callbacks */ - + autoscroll_canvas (); } @@ -639,9 +681,11 @@ void Editor::stop_canvas_autoscroll () { if (autoscroll_timeout_tag >= 0) { - gtk_timeout_remove (autoscroll_timeout_tag); + g_source_remove (autoscroll_timeout_tag); autoscroll_timeout_tag = -1; } + + autoscroll_active = false; } gint @@ -653,3 +697,91 @@ Editor::left_track_canvas (GdkEventCrossing *ev) } +void +Editor::canvas_horizontally_scrolled () +{ + cerr << "chs\n"; + + /* this is the core function that controls horizontal scrolling of the canvas. it is called + whenever the horizontal_adjustment emits its "value_changed" signal. it typically executes in an + idle handler, which is important because tempo_map_changed() should issue redraws immediately + and not defer them to an idle handler. + */ + + leftmost_frame = (nframes_t) floor (horizontal_adjustment.get_value() * frames_per_unit); + nframes_t rightmost_frame = leftmost_frame + current_page_frames (); + + if (rightmost_frame > last_canvas_frame) { + last_canvas_frame = rightmost_frame; + reset_scrolling_region (); + } + + if (logo_item) { + logo_item->property_x() = horizontal_adjustment.get_value (); + } + + update_fixed_rulers (); + + redisplay_tempo (!_dragging_hscrollbar); +} + +void +Editor::color_handler() +{ + playhead_cursor->canvas_item.property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_PlayHead.get(); + verbose_canvas_cursor->property_fill_color_rgba() = 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(); + + tempo_bar->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_TempoBar.get(); + tempo_bar->property_outline_color_rgba() = 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(); + + 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(); + + 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(); + + 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(); + + 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(); + + marker_drag_line->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_MarkerDragLine.get(); + + range_marker_drag_rect->property_fill_color_rgba() = ARDOUR_UI::config()->canvasvar_RangeDragRect.get(); + range_marker_drag_rect->property_outline_color_rgba() = ARDOUR_UI::config()->canvasvar_RangeDragRect.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_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_punchin_line->property_color_rgba() = ARDOUR_UI::config()->canvasvar_PunchLine.get(); + transport_punchout_line->property_color_rgba() = 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(); + + 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(); + + location_marker_color = ARDOUR_UI::config()->canvasvar_LocationMarker.get(); + location_range_color = ARDOUR_UI::config()->canvasvar_LocationRange.get(); + location_cd_marker_color = ARDOUR_UI::config()->canvasvar_LocationCDMarker.get(); + location_loop_color = ARDOUR_UI::config()->canvasvar_LocationLoop.get(); + location_punch_color = ARDOUR_UI::config()->canvasvar_LocationPunch.get(); + + refresh_location_display (); + redisplay_tempo (true); + + if (session) + session->tempo_map().apply_with_metrics (*this, &Editor::draw_metric_marks); // redraw metric markers +} +