X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Feditor_ops.cc;h=f2990751708dac5471d7ecd6c7b7429c396fda06;hb=2e27e21d3a09889311e18a8efe11abcaa6d9c8b3;hp=e0f94182685029eca3dc335335b28c39de5a9665;hpb=3f15584749d181197bffc65a25d5dcc94b06c34d;p=ardour.git diff --git a/gtk2_ardour/editor_ops.cc b/gtk2_ardour/editor_ops.cc index e0f9418268..f299075170 100644 --- a/gtk2_ardour/editor_ops.cc +++ b/gtk2_ardour/editor_ops.cc @@ -55,6 +55,8 @@ #include "ardour/strip_silence.h" #include "ardour/transient_detector.h" +#include "canvas/canvas.h" + #include "ardour_ui.h" #include "debug.h" #include "editor.h" @@ -357,8 +359,8 @@ Editor::nudge_forward (bool next, bool force_playhead) commit_reversible_command (); } else { - distance = get_nudge_distance (playhead_cursor->current_frame, next_distance); - _session->request_locate (playhead_cursor->current_frame + distance); + distance = get_nudge_distance (playhead_cursor->current_frame (), next_distance); + _session->request_locate (playhead_cursor->current_frame () + distance); } } @@ -446,10 +448,10 @@ Editor::nudge_backward (bool next, bool force_playhead) } else { - distance = get_nudge_distance (playhead_cursor->current_frame, next_distance); + distance = get_nudge_distance (playhead_cursor->current_frame (), next_distance); - if (playhead_cursor->current_frame > distance) { - _session->request_locate (playhead_cursor->current_frame - distance); + if (playhead_cursor->current_frame () > distance) { + _session->request_locate (playhead_cursor->current_frame () - distance); } else { _session->goto_start(); } @@ -772,7 +774,7 @@ Editor::get_region_boundary (framepos_t pos, int32_t dir, bool with_selection, b void Editor::cursor_to_region_boundary (bool with_selection, int32_t dir) { - framepos_t pos = playhead_cursor->current_frame; + framepos_t pos = playhead_cursor->current_frame (); framepos_t target; if (!_session) { @@ -807,7 +809,7 @@ void Editor::cursor_to_region_point (EditorCursor* cursor, RegionPoint point, int32_t dir) { boost::shared_ptr r; - framepos_t pos = cursor->current_frame; + framepos_t pos = cursor->current_frame (); if (!_session) { return; @@ -1143,8 +1145,8 @@ Editor::selected_marker_to_selection_end () void Editor::scroll_playhead (bool forward) { - framepos_t pos = playhead_cursor->current_frame; - framecnt_t delta = (framecnt_t) floor (current_page_frames() / 0.8); + framepos_t pos = playhead_cursor->current_frame (); + framecnt_t delta = (framecnt_t) floor (current_page_samples() / 0.8); if (forward) { if (pos == max_framepos) { @@ -1197,10 +1199,10 @@ Editor::cursor_align (bool playhead_to_edit) Location* loc = find_location_from_marker (*i, ignored); if (loc->is_mark()) { - loc->set_start (playhead_cursor->current_frame); + loc->set_start (playhead_cursor->current_frame ()); } else { - loc->set (playhead_cursor->current_frame, - playhead_cursor->current_frame + loc->length()); + loc->set (playhead_cursor->current_frame (), + playhead_cursor->current_frame () + loc->length()); } } } @@ -1209,7 +1211,7 @@ Editor::cursor_align (bool playhead_to_edit) void Editor::scroll_backward (float pages) { - framepos_t const one_page = (framepos_t) rint (_canvas_width * frames_per_unit); + framepos_t const one_page = (framepos_t) rint (_visible_canvas_width * samples_per_pixel); framepos_t const cnt = (framepos_t) floor (pages * one_page); framepos_t frame; @@ -1225,7 +1227,7 @@ Editor::scroll_backward (float pages) void Editor::scroll_forward (float pages) { - framepos_t const one_page = (framepos_t) rint (_canvas_width * frames_per_unit); + framepos_t const one_page = (framepos_t) rint (_visible_canvas_width * samples_per_pixel); framepos_t const cnt = (framepos_t) floor (pages * one_page); framepos_t frame; @@ -1242,8 +1244,8 @@ void Editor::scroll_tracks_down () { double vert_value = vertical_adjustment.get_value() + vertical_adjustment.get_page_size(); - if (vert_value > vertical_adjustment.get_upper() - _canvas_height) { - vert_value = vertical_adjustment.get_upper() - _canvas_height; + if (vert_value > vertical_adjustment.get_upper() - _visible_canvas_height) { + vert_value = vertical_adjustment.get_upper() - _visible_canvas_height; } vertical_adjustment.set_value (vert_value); @@ -1260,8 +1262,8 @@ Editor::scroll_tracks_down_line () { double vert_value = vertical_adjustment.get_value() + 60; - if (vert_value > vertical_adjustment.get_upper() - _canvas_height) { - vert_value = vertical_adjustment.get_upper() - _canvas_height; + if (vert_value > vertical_adjustment.get_upper() - _visible_canvas_height) { + vert_value = vertical_adjustment.get_upper() - _visible_canvas_height; } vertical_adjustment.set_value (vert_value); @@ -1329,17 +1331,17 @@ Editor::tav_zoom_smooth (bool coarser, bool force_all) } bool -Editor::clamp_frames_per_unit (double& fpu) const +Editor::clamp_samples_per_pixel (framecnt_t& fpp) const { bool clamped = false; - if (fpu < 2.0) { - fpu = 2.0; + if (fpp < 1) { + fpp = 1; clamped = true; } - if (max_framepos / fpu < 800) { - fpu = max_framepos / 800.0; + if (max_framepos / fpp < 800) { + fpp = max_framepos / 800; clamped = true; } @@ -1351,25 +1353,25 @@ Editor::temporal_zoom_step (bool coarser) { ENSURE_GUI_THREAD (*this, &Editor::temporal_zoom_step, coarser) - double nfpu = frames_per_unit; + framecnt_t nspp = samples_per_pixel; if (coarser) { - nfpu = min (9e6, nfpu * 1.61803399); + nspp *= 2; } else { - nfpu = max (1.0, nfpu / 1.61803399); + nspp /= 2; } - temporal_zoom (nfpu); + temporal_zoom (nspp); } void -Editor::temporal_zoom (double fpu) +Editor::temporal_zoom (framecnt_t fpp) { if (!_session) { return; } - framepos_t current_page = current_page_frames(); + framepos_t current_page = current_page_samples(); framepos_t current_leftmost = leftmost_frame; framepos_t current_rightmost; framepos_t current_center; @@ -1378,24 +1380,26 @@ Editor::temporal_zoom (double fpu) framepos_t leftmost_after_zoom = 0; framepos_t where; bool in_track_canvas; - double nfpu; + framecnt_t nfpp; double l; - clamp_frames_per_unit (fpu); - if (fpu == frames_per_unit) { + clamp_samples_per_pixel (fpp); + if (fpp == samples_per_pixel) { return; } - nfpu = fpu; - // Imposing an arbitrary limit to zoom out as too much zoom out produces // segfaults for lack of memory. If somebody decides this is not high enough I // believe it can be raisen to higher values but some limit must be in place. - if (nfpu > 8e+08) { - nfpu = 8e+08; - } + // + // This constant represents 1 day @ 48kHz on a 1600 pixel wide display + // all of which is used for the editor track displays. The whole day + // would be 4147200000 samples, so 2592000 samples per pixel. + + nfpp = min (fpp, (framecnt_t) 2592000); + nfpp = max ((framecnt_t) 1, fpp); - new_page_size = (framepos_t) floor (_canvas_width * nfpu); + new_page_size = (framepos_t) floor (_visible_canvas_width * nfpp); half_page_size = new_page_size / 2; switch (zoom_focus) { @@ -1423,7 +1427,7 @@ Editor::temporal_zoom (double fpu) case ZoomFocusPlayhead: /* centre playhead */ - l = playhead_cursor->current_frame - (new_page_size * 0.5); + l = playhead_cursor->current_frame () - (new_page_size * 0.5); if (l < 0) { leftmost_after_zoom = 0; @@ -1439,7 +1443,7 @@ Editor::temporal_zoom (double fpu) if (!mouse_frame (where, in_track_canvas)) { /* use playhead instead */ - where = playhead_cursor->current_frame; + where = playhead_cursor->current_frame (); if (where < half_page_size) { leftmost_after_zoom = 0; @@ -1488,7 +1492,7 @@ Editor::temporal_zoom (double fpu) // leftmost_after_zoom = min (leftmost_after_zoom, _session->current_end_frame()); - reposition_and_zoom (leftmost_after_zoom, nfpu); + reposition_and_zoom (leftmost_after_zoom, nfpp); } void @@ -1533,8 +1537,8 @@ Editor::temporal_zoom_region (bool both_axes) } framepos_t range = end - start; - double new_fpu = (double)range / (double)_canvas_width; - framepos_t extra_samples = (framepos_t) floor (one_centimeter_in_pixels * new_fpu); + double new_fpp = (double) range / (double) _visible_canvas_width; + framepos_t extra_samples = (framepos_t) floor (one_centimeter_in_pixels * new_fpp); if (start > extra_samples) { start -= extra_samples; @@ -1558,7 +1562,7 @@ Editor::temporal_zoom_region (bool both_axes) temporal_zoom_by_frame (start, end); if (both_axes) { - uint32_t per_track_height = (uint32_t) floor ((_canvas_height - canvas_timebars_vsize - 10.0) / tracks.size()); + uint32_t per_track_height = (uint32_t) floor ((_visible_canvas_height - 10.0) / tracks.size()); /* set visible track heights appropriately */ @@ -1632,11 +1636,11 @@ Editor::temporal_zoom_by_frame (framepos_t start, framepos_t end) framepos_t range = end - start; - double new_fpu = (double)range / (double)_canvas_width; + double const new_fpp = (double) range / (double) _visible_canvas_width; - framepos_t new_page = (framepos_t) floor (_canvas_width * new_fpu); - framepos_t middle = (framepos_t) floor( (double)start + ((double)range / 2.0f )); - framepos_t new_leftmost = (framepos_t) floor( (double)middle - ((double)new_page/2.0f)); + framepos_t new_page = (framepos_t) floor (_visible_canvas_width * new_fpp); + framepos_t middle = (framepos_t) floor ((double) start + ((double) range / 2.0f)); + framepos_t new_leftmost = (framepos_t) floor ((double) middle - ((double) new_page / 2.0f)); if (new_leftmost > middle) { new_leftmost = 0; @@ -1646,7 +1650,7 @@ Editor::temporal_zoom_by_frame (framepos_t start, framepos_t end) new_leftmost = 0; } - reposition_and_zoom (new_leftmost, new_fpu); + reposition_and_zoom (new_leftmost, new_fpp); } void @@ -1656,19 +1660,19 @@ Editor::temporal_zoom_to_frame (bool coarser, framepos_t frame) return; } double range_before = frame - leftmost_frame; - double new_fpu; + double new_fpp; - new_fpu = frames_per_unit; + new_fpp = samples_per_pixel; if (coarser) { - new_fpu *= 1.61803399; + new_fpp *= 1.61803399; range_before *= 1.61803399; } else { - new_fpu = max(1.0,(new_fpu/1.61803399)); + new_fpp = max(1.0,(new_fpp/1.61803399)); range_before /= 1.61803399; } - if (new_fpu == frames_per_unit) { + if (new_fpp == samples_per_pixel) { return; } @@ -1682,7 +1686,7 @@ Editor::temporal_zoom_to_frame (bool coarser, framepos_t frame) new_leftmost = 0; } - reposition_and_zoom (new_leftmost, new_fpu); + reposition_and_zoom (new_leftmost, new_fpp); } @@ -1847,7 +1851,7 @@ Editor::jump_forward_to_mark () return; } - framepos_t pos = _session->locations()->first_mark_after (playhead_cursor->current_frame); + framepos_t pos = _session->locations()->first_mark_after (playhead_cursor->current_frame()); if (pos < 0) { return; @@ -1863,7 +1867,7 @@ Editor::jump_backward_to_mark () return; } - framepos_t pos = _session->locations()->first_mark_before (playhead_cursor->current_frame); + framepos_t pos = _session->locations()->first_mark_before (playhead_cursor->current_frame()); if (pos < 0) { return; @@ -1962,22 +1966,19 @@ Editor::unhide_ranges () void Editor::insert_region_list_drag (boost::shared_ptr region, int x, int y) { - double wx, wy; double cx, cy; framepos_t where; RouteTimeAxisView *rtv = 0; boost::shared_ptr playlist; - track_canvas->window_to_world (x, y, wx, wy); - GdkEvent event; event.type = GDK_BUTTON_RELEASE; - event.button.x = wx; - event.button.y = wy; + event.button.x = x; + event.button.y = y; - where = event_frame (&event, &cx, &cy); + where = window_event_frame (&event, &cx, &cy); - if (where < leftmost_frame || where > leftmost_frame + current_page_frames()) { + if (where < leftmost_frame || where > leftmost_frame + current_page_samples()) { /* clearly outside canvas area */ return; } @@ -2007,21 +2008,16 @@ Editor::insert_region_list_drag (boost::shared_ptr region, int x, int y) void Editor::insert_route_list_drag (boost::shared_ptr route, int x, int y) { - double wx, wy; double cx, cy; RouteTimeAxisView *dest_rtv = 0; RouteTimeAxisView *source_rtv = 0; - track_canvas->window_to_world (x, y, wx, wy); - wx += horizontal_position (); - wy += vertical_adjustment.get_value(); - GdkEvent event; event.type = GDK_BUTTON_RELEASE; - event.button.x = wx; - event.button.y = wy; + event.button.x = x; + event.button.y = y; - event_frame (&event, &cx, &cy); + window_event_frame (&event, &cx, &cy); std::pair const tv = trackview_by_y_position (cy); if (tv.first == 0) { @@ -3481,7 +3477,7 @@ Editor::freeze_route () /* wait for just a little while, because the above call is asynchronous */ - ::usleep (250000); + Glib::usleep (250000); if (clicked_routeview == 0 || !clicked_routeview->is_audio_track()) { return; @@ -4424,14 +4420,14 @@ Editor::reset_point_selection () void Editor::center_playhead () { - float page = _canvas_width * frames_per_unit; - center_screen_internal (playhead_cursor->current_frame, page); + float const page = _visible_canvas_width * samples_per_pixel; + center_screen_internal (playhead_cursor->current_frame (), page); } void Editor::center_edit_point () { - float page = _canvas_width * frames_per_unit; + float const page = _visible_canvas_width * samples_per_pixel; center_screen_internal (get_preferred_edit_position(), page); } @@ -4712,7 +4708,7 @@ Editor::apply_midi_note_edit_op_to_region (MidiOperator& op, MidiRegionView& mrv vector::Notes> v; v.push_back (selected); - framepos_t pos_frames = mrv.midi_region()->position(); + framepos_t pos_frames = mrv.midi_region()->position() - mrv.midi_region()->start(); double pos_beats = _session->tempo_map().framewalk_to_beats(0, pos_frames); return op (mrv.midi_region()->model(), pos_beats, v); @@ -5602,7 +5598,7 @@ Editor::ensure_track_visible(TimeAxisView *track) return; double const current_view_min_y = vertical_adjustment.get_value(); - double const current_view_max_y = vertical_adjustment.get_value() + vertical_adjustment.get_page_size() - canvas_timebars_vsize; + double const current_view_max_y = vertical_adjustment.get_value() + vertical_adjustment.get_page_size(); double const track_min_y = track->y_position (); double const track_max_y = track->y_position () + track->effective_height (); @@ -5619,7 +5615,7 @@ Editor::ensure_track_visible(TimeAxisView *track) new_value = track_min_y; } else { // Track is below the current view - new_value = track->y_position () + track->effective_height() + canvas_timebars_vsize - vertical_adjustment.get_page_size(); + new_value = track->y_position () + track->effective_height() - vertical_adjustment.get_page_size(); } vertical_adjustment.set_value(new_value); @@ -6367,8 +6363,11 @@ Editor::tab_to_transient (bool forward) void Editor::playhead_forward_to_grid () { - if (!_session) return; - framepos_t pos = playhead_cursor->current_frame; + if (!_session) { + return; + } + + framepos_t pos = playhead_cursor->current_frame (); if (pos < max_framepos - 1) { pos += 2; snap_to_internal (pos, 1, false); @@ -6380,8 +6379,11 @@ Editor::playhead_forward_to_grid () void Editor::playhead_backward_to_grid () { - if (!_session) return; - framepos_t pos = playhead_cursor->current_frame; + if (!_session) { + return; + } + + framepos_t pos = playhead_cursor->current_frame (); if (pos > 2) { pos -= 2; snap_to_internal (pos, -1, false); @@ -6732,7 +6734,7 @@ Editor::fit_tracks (TrackViewList & tracks) ++visible_tracks; } - uint32_t h = (uint32_t) floor ((_canvas_height - child_heights - canvas_timebars_vsize) / visible_tracks); + uint32_t h = (uint32_t) floor ((_visible_canvas_height - child_heights) / visible_tracks); double first_y_pos = DBL_MAX; if (h < TimeAxisView::preset_height (HeightSmall)) { @@ -6794,7 +6796,7 @@ Editor::fit_tracks (TrackViewList & tracks) request signal handler will cause the vertical adjustment setting to fail */ - controls_layout.property_height () = full_canvas_height - canvas_timebars_vsize; + controls_layout.property_height () = _full_canvas_height; vertical_adjustment.set_value (first_y_pos); redo_visual_stack.push_back (current_visual_state (true));