Unify clamping of frames-per-unit values during zoom; should help with #3514.
git-svn-id: svn://localhost/ardour2/branches/3.0@12796 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
parent
0fba3e073c
commit
3c7f6a4a4c
|
@ -917,12 +917,9 @@ Editor::zoom_adjustment_changed ()
|
||||||
}
|
}
|
||||||
|
|
||||||
double fpu = zoom_range_clock->current_duration() / _canvas_width;
|
double fpu = zoom_range_clock->current_duration() / _canvas_width;
|
||||||
|
bool clamped = clamp_frames_per_unit (fpu);
|
||||||
if (fpu < 1.0) {
|
|
||||||
fpu = 1.0;
|
if (clamped) {
|
||||||
zoom_range_clock->set ((framepos_t) floor (fpu * _canvas_width));
|
|
||||||
} else if (fpu > _session->current_end_frame() / _canvas_width) {
|
|
||||||
fpu = _session->current_end_frame() / _canvas_width;
|
|
||||||
zoom_range_clock->set ((framepos_t) floor (fpu * _canvas_width));
|
zoom_range_clock->set ((framepos_t) floor (fpu * _canvas_width));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4064,6 +4061,12 @@ Editor::reset_y_origin (double y)
|
||||||
void
|
void
|
||||||
Editor::reset_zoom (double fpu)
|
Editor::reset_zoom (double fpu)
|
||||||
{
|
{
|
||||||
|
clamp_frames_per_unit (fpu);
|
||||||
|
|
||||||
|
if (fpu == frames_per_unit) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
pending_visual_change.add (VisualChange::ZoomLevel);
|
pending_visual_change.add (VisualChange::ZoomLevel);
|
||||||
pending_visual_change.frames_per_unit = fpu;
|
pending_visual_change.frames_per_unit = fpu;
|
||||||
ensure_visual_change_idle_handler ();
|
ensure_visual_change_idle_handler ();
|
||||||
|
@ -4171,41 +4174,20 @@ Editor::use_visual_state (VisualState& vs)
|
||||||
_routes->resume_redisplay ();
|
_routes->resume_redisplay ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** This is the core function that controls the zoom level of the canvas. It is called
|
||||||
|
* whenever one or more calls are made to reset_zoom(). It executes in an idle handler.
|
||||||
|
* @param fpu New frames per unit; should already have been clamped so that it is sensible.
|
||||||
|
*/
|
||||||
void
|
void
|
||||||
Editor::set_frames_per_unit (double fpu)
|
Editor::set_frames_per_unit (double fpu)
|
||||||
{
|
{
|
||||||
/* this is the core function that controls the zoom level of the canvas. it is called
|
if (tempo_lines) {
|
||||||
whenever one or more calls are made to reset_zoom(). it executes in an idle handler.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (fpu == frames_per_unit) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fpu < 2.0) {
|
|
||||||
fpu = 2.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* don't allow zooms that fit more than the maximum number
|
|
||||||
of frames into an 800 pixel wide space.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (max_framepos / fpu < 800.0) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tempo_lines)
|
|
||||||
tempo_lines->tempo_map_changed();
|
tempo_lines->tempo_map_changed();
|
||||||
|
}
|
||||||
|
|
||||||
frames_per_unit = fpu;
|
frames_per_unit = fpu;
|
||||||
post_zoom ();
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
/* convert fpu to frame count */
|
||||||
Editor::post_zoom ()
|
|
||||||
{
|
|
||||||
// convert fpu to frame count
|
|
||||||
|
|
||||||
framepos_t frames = (framepos_t) floor (frames_per_unit * _canvas_width);
|
framepos_t frames = (framepos_t) floor (frames_per_unit * _canvas_width);
|
||||||
|
|
||||||
|
|
|
@ -525,7 +525,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
|
||||||
Editing::ZoomFocus zoom_focus;
|
Editing::ZoomFocus zoom_focus;
|
||||||
|
|
||||||
void set_frames_per_unit (double);
|
void set_frames_per_unit (double);
|
||||||
void post_zoom ();
|
bool clamp_frames_per_unit (double &) const;
|
||||||
|
|
||||||
Editing::MouseMode mouse_mode;
|
Editing::MouseMode mouse_mode;
|
||||||
Editing::MouseMode pre_internal_mouse_mode;
|
Editing::MouseMode pre_internal_mouse_mode;
|
||||||
|
@ -1209,7 +1209,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
|
||||||
void temporal_zoom_region (bool both_axes);
|
void temporal_zoom_region (bool both_axes);
|
||||||
void zoom_to_region (bool both_axes);
|
void zoom_to_region (bool both_axes);
|
||||||
void temporal_zoom_session ();
|
void temporal_zoom_session ();
|
||||||
void temporal_zoom (gdouble scale);
|
void temporal_zoom (double scale);
|
||||||
void temporal_zoom_by_frame (framepos_t start, framepos_t end);
|
void temporal_zoom_by_frame (framepos_t start, framepos_t end);
|
||||||
void temporal_zoom_to_frame (bool coarser, framepos_t frame);
|
void temporal_zoom_to_frame (bool coarser, framepos_t frame);
|
||||||
|
|
||||||
|
|
|
@ -1327,14 +1327,30 @@ Editor::tav_zoom_smooth (bool coarser, bool force_all)
|
||||||
_routes->resume_redisplay ();
|
_routes->resume_redisplay ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
Editor::clamp_frames_per_unit (double& fpu) const
|
||||||
|
{
|
||||||
|
bool clamped = false;
|
||||||
|
|
||||||
|
if (fpu < 2.0) {
|
||||||
|
fpu = 2.0;
|
||||||
|
clamped = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (max_framepos / fpu < 800) {
|
||||||
|
fpu = max_framepos / 800.0;
|
||||||
|
clamped = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return clamped;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
Editor::temporal_zoom_step (bool coarser)
|
Editor::temporal_zoom_step (bool coarser)
|
||||||
{
|
{
|
||||||
ENSURE_GUI_THREAD (*this, &Editor::temporal_zoom_step, coarser)
|
ENSURE_GUI_THREAD (*this, &Editor::temporal_zoom_step, coarser)
|
||||||
|
|
||||||
double nfpu;
|
double nfpu = frames_per_unit;
|
||||||
|
|
||||||
nfpu = frames_per_unit;
|
|
||||||
|
|
||||||
if (coarser) {
|
if (coarser) {
|
||||||
nfpu = min (9e6, nfpu * 1.61803399);
|
nfpu = min (9e6, nfpu * 1.61803399);
|
||||||
|
@ -1346,9 +1362,11 @@ Editor::temporal_zoom_step (bool coarser)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
Editor::temporal_zoom (gdouble fpu)
|
Editor::temporal_zoom (double fpu)
|
||||||
{
|
{
|
||||||
if (!_session) return;
|
if (!_session) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
framepos_t current_page = current_page_frames();
|
framepos_t current_page = current_page_frames();
|
||||||
framepos_t current_leftmost = leftmost_frame;
|
framepos_t current_leftmost = leftmost_frame;
|
||||||
|
@ -1362,9 +1380,8 @@ Editor::temporal_zoom (gdouble fpu)
|
||||||
double nfpu;
|
double nfpu;
|
||||||
double l;
|
double l;
|
||||||
|
|
||||||
/* XXX this limit is also in ::set_frames_per_unit() */
|
clamp_frames_per_unit (fpu);
|
||||||
|
if (fpu == frames_per_unit) {
|
||||||
if (frames_per_unit <= 1.0 && fpu <= frames_per_unit) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user