X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Feditor_canvas.cc;h=e8ba2b8a6032bce19af73d77172725eaa0e8070e;hb=f535b0f4913a9c0b31ca3b21bd717c367676ebfc;hp=d999c1187e685ae57571a8b435733a7565d888da;hpb=a9e38032a376df3c8a930457211813958f3ba73b;p=ardour.git diff --git a/gtk2_ardour/editor_canvas.cc b/gtk2_ardour/editor_canvas.cc index d999c1187e..e8ba2b8a60 100644 --- a/gtk2_ardour/editor_canvas.cc +++ b/gtk2_ardour/editor_canvas.cc @@ -20,6 +20,7 @@ #include #include +#include #include @@ -45,6 +46,7 @@ using namespace std; using namespace sigc; using namespace ARDOUR; +using namespace PBD; using namespace Gtk; using namespace Glib; using namespace Gtkmm2ext; @@ -126,10 +128,11 @@ Editor::initialize_canvas () time_line_group = new ArdourCanvas::Group (*track_canvas.root(), 0.0, 0.0); 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); meter_group = new ArdourCanvas::Group (*time_canvas.root(), 0.0, 0.0); tempo_group = new ArdourCanvas::Group (*time_canvas.root(), 0.0, timebar_height); @@ -273,44 +276,11 @@ Editor::track_canvas_allocate (Gtk::Allocation alloc) canvas_width = alloc.get_width(); canvas_height = alloc.get_height(); - if (session == 0 && !ARDOUR_UI::instance()->will_create_new_session_automatically()) { - - /* this mess of code is here to find out how wide this text is and - position the message in the center of the editor window. - */ - - int pixel_height; - int pixel_width; - - ustring msg = string_compose ("%1%2", - _("Start a new session\n"), _("via Session menu")); - - RefPtr layout = create_pango_layout (msg); - Pango::FontDescription font = get_font_for_style (N_("FirstActionMessage")); - layout->get_pixel_size (pixel_width, pixel_height); - - if (first_action_message == 0) { - - first_action_message = new ArdourCanvas::Text (*track_canvas.root()); - first_action_message->property_font_desc() = font; - first_action_message->property_fill_color_rgba() = color_map[cFirstActionMessage]; - first_action_message->property_x() = (canvas_width - pixel_width) / 2.0; - first_action_message->property_y() = (canvas_height/2.0) - pixel_height; - first_action_message->property_anchor() = ANCHOR_NORTH_WEST; - first_action_message->property_markup() = msg; - - } else { - - /* center it */ - first_action_message->property_x() = (canvas_width - pixel_width) / 2.0; - first_action_message->property_y() = (canvas_height/2.0) - pixel_height; - } - } - zoom_range_clock.set ((jack_nframes_t) floor ((canvas_width * frames_per_unit))); edit_cursor->set_position (edit_cursor->current_frame); playhead_cursor->set_position (playhead_cursor->current_frame); + reset_hscrollbar_stepping (); reset_scrolling_region (); if (edit_cursor) edit_cursor->set_length (canvas_height); @@ -367,26 +337,20 @@ Editor::reset_scrolling_region (Gtk::Allocation* alloc) for (pos = 0, i = rows.begin(); i != rows.end(); ++i) { TimeAxisView *tv = (*i)[route_display_columns.tv]; - if (tv != 0) { + if (tv != 0 && !tv->hidden()) { pos += tv->effective_height; pos += track_spacing; } } - RefPtr screen = get_screen(); - - if (!screen) { - screen = Gdk::Screen::get_default(); - } + double last_canvas_unit = last_canvas_frame / frames_per_unit; - double last_canvas_unit = ceil ((double) max_frames / frames_per_unit); track_canvas.set_scroll_region (0.0, 0.0, max (last_canvas_unit, canvas_width), pos); // XXX what is the correct height value for the time canvas ? this overstates it time_canvas.set_scroll_region ( 0.0, 0.0, max (last_canvas_unit, canvas_width), canvas_height); controls_layout.queue_resize(); - } void @@ -415,6 +379,10 @@ Editor::controls_layout_size_request (Requisition* req) edit_controls_vbox.check_resize(); req->width = max (edit_controls_vbox.get_width(), controls_layout.get_width()); + + /* don't get too big. the fudge factors here are just guesses */ + + req->width = min (req->width, screen->get_width() - 300); req->height = min ((gint) pos, (screen->get_height() - 400)); /* this one is important: it determines how big the layout thinks it really is, as @@ -460,7 +428,7 @@ Editor::drop_paths (const RefPtr& context, TimeAxisView* tvp; AudioTimeAxisView* tv; double cy; - vector paths; + vector paths; string spath; GdkEvent ev; jack_nframes_t frame; @@ -489,22 +457,18 @@ Editor::drop_paths (const RefPtr& context, if ((tvp = trackview_by_y_position (cy)) == 0) { - /* drop onto canvas background: create a new track */ - - insert_paths_as_new_tracks (paths, false); + /* drop onto canvas background: create new tracks */ + jack_nframes_t pos = 0; + do_embed (paths, false, ImportAsTrack, 0, pos, false); } else if ((tv = dynamic_cast(tvp)) != 0) { /* check that its an audio track, not a bus */ - + if (tv->get_diskstream()) { - - for (vector::iterator p = paths.begin(); p != paths.end(); ++p) { - insert_sndfile_into (*p, true, tv, frame); - } + do_embed (paths, false, ImportToTrack, tv->audio_track(), frame, true); } - } out: @@ -531,3 +495,162 @@ Editor::drop_regions (const RefPtr& context, context->drag_finish (true, false, time); } + +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; + bool startit = false; + + static int last_autoscroll_direction = 0; + + if (frame > rightmost_frame) { + + if (rightmost_frame < max_frames) { + autoscroll_direction = 1; + startit = true; + } + + } else if (frame < leftmost_frame) { + + if (leftmost_frame > 0) { + autoscroll_direction = -1; + startit = true; + } + + } else { + + if (drag_info.last_pointer_frame > drag_info.current_pointer_frame) { + autoscroll_direction = -1; + } else { + autoscroll_direction = 1; + } + } + + + if (autoscroll_direction != last_autoscroll_direction) { + stop_canvas_autoscroll (); + } + + if (startit && autoscroll_timeout_tag < 0) { + start_canvas_autoscroll (autoscroll_direction); + } + + last_autoscroll_direction = autoscroll_direction; +} + +gint +Editor::_autoscroll_canvas (void *arg) +{ + return ((Editor *) arg)->autoscroll_canvas (); +} + +gint +Editor::autoscroll_canvas () +{ + jack_nframes_t new_frame; + bool keep_calling = true; + jack_nframes_t limit = max_frames - current_page_frames(); + GdkEventMotion ev; + jack_nframes_t target_frame; + + if (autoscroll_direction < 0) { + if (leftmost_frame < autoscroll_distance) { + new_frame = 0; + } else { + new_frame = leftmost_frame - autoscroll_distance; + } + target_frame = drag_info.current_pointer_frame - autoscroll_distance; + } else { + if (leftmost_frame > limit - autoscroll_distance) { + new_frame = limit; + } else { + new_frame = leftmost_frame + autoscroll_distance; + } + 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; + ev.state &= Gdk::BUTTON1_MASK; + ev.x = frame_to_unit (target_frame); + ev.y = drag_info.current_pointer_y; + motion_handler (drag_info.item, (GdkEvent*) &ev, drag_info.item_type, true); + + if (new_frame == 0 || new_frame == limit) { + /* we are done */ + return false; + } + + autoscroll_cnt++; + + if (autoscroll_cnt == 1) { + + /* connect the timeout so that we get called repeatedly */ + + autoscroll_timeout_tag = gtk_timeout_add (20, _autoscroll_canvas, this); + keep_calling = false; + + } else 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); + + } else if (autoscroll_cnt == 75) { /* 1.0 seconds */ + + autoscroll_distance = (jack_nframes_t) floor (current_page_frames()/20.0f); + + } else if (autoscroll_cnt == 100) { /* 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); + + } + + return keep_calling; +} + +void +Editor::start_canvas_autoscroll (int dir) +{ + if (!session) { + return; + } + + stop_canvas_autoscroll (); + + autoscroll_direction = dir; + autoscroll_distance = (jack_nframes_t) floor (current_page_frames()/100.0); + autoscroll_cnt = 0; + + /* do it right now, which will start the repeated callbacks */ + + autoscroll_canvas (); +} + +void +Editor::stop_canvas_autoscroll () +{ + if (autoscroll_timeout_tag >= 0) { + gtk_timeout_remove (autoscroll_timeout_tag); + autoscroll_timeout_tag = -1; + } +} + +gint +Editor::left_track_canvas (GdkEventCrossing *ev) +{ + set_entered_track (0); + set_entered_regionview (0); + return FALSE; +} + +