summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Hetherington <carl@carlh.net>2012-06-20 14:14:27 +0000
committerCarl Hetherington <carl@carlh.net>2012-06-20 14:14:27 +0000
commit3c7f6a4a4cb46b50a4d5b239f2d2d6dfef3525a5 (patch)
tree7b9db403f25e87e58b8d02c05e363ee7fc012950
parent0fba3e073cc274b6cd3d6ac02d1eecf7bbd5cc5a (diff)
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
-rw-r--r--gtk2_ardour/editor.cc50
-rw-r--r--gtk2_ardour/editor.h4
-rw-r--r--gtk2_ardour/editor_ops.cc33
3 files changed, 43 insertions, 44 deletions
diff --git a/gtk2_ardour/editor.cc b/gtk2_ardour/editor.cc
index ab2f92823c..44548791ea 100644
--- a/gtk2_ardour/editor.cc
+++ b/gtk2_ardour/editor.cc
@@ -917,12 +917,9 @@ Editor::zoom_adjustment_changed ()
}
double fpu = zoom_range_clock->current_duration() / _canvas_width;
-
- if (fpu < 1.0) {
- fpu = 1.0;
- 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;
+ bool clamped = clamp_frames_per_unit (fpu);
+
+ if (clamped) {
zoom_range_clock->set ((framepos_t) floor (fpu * _canvas_width));
}
@@ -4064,6 +4061,12 @@ Editor::reset_y_origin (double y)
void
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.frames_per_unit = fpu;
ensure_visual_change_idle_handler ();
@@ -4171,41 +4174,20 @@ Editor::use_visual_state (VisualState& vs)
_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
Editor::set_frames_per_unit (double fpu)
{
- /* 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.
- */
-
- 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)
+ if (tempo_lines) {
tempo_lines->tempo_map_changed();
+ }
frames_per_unit = fpu;
- post_zoom ();
-}
-void
-Editor::post_zoom ()
-{
- // convert fpu to frame count
+ /* convert fpu to frame count */
framepos_t frames = (framepos_t) floor (frames_per_unit * _canvas_width);
diff --git a/gtk2_ardour/editor.h b/gtk2_ardour/editor.h
index 5bfc7b127e..7b4b1dcbbf 100644
--- a/gtk2_ardour/editor.h
+++ b/gtk2_ardour/editor.h
@@ -525,7 +525,7 @@ class Editor : public PublicEditor, public PBD::ScopedConnectionList, public ARD
Editing::ZoomFocus zoom_focus;
void set_frames_per_unit (double);
- void post_zoom ();
+ bool clamp_frames_per_unit (double &) const;
Editing::MouseMode 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 zoom_to_region (bool both_axes);
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_to_frame (bool coarser, framepos_t frame);
diff --git a/gtk2_ardour/editor_ops.cc b/gtk2_ardour/editor_ops.cc
index eacf0c51bd..46a69ce6af 100644
--- a/gtk2_ardour/editor_ops.cc
+++ b/gtk2_ardour/editor_ops.cc
@@ -1327,14 +1327,30 @@ Editor::tav_zoom_smooth (bool coarser, bool force_all)
_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
Editor::temporal_zoom_step (bool coarser)
{
ENSURE_GUI_THREAD (*this, &Editor::temporal_zoom_step, coarser)
- double nfpu;
-
- nfpu = frames_per_unit;
+ double nfpu = frames_per_unit;
if (coarser) {
nfpu = min (9e6, nfpu * 1.61803399);
@@ -1346,9 +1362,11 @@ Editor::temporal_zoom_step (bool coarser)
}
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_leftmost = leftmost_frame;
@@ -1362,9 +1380,8 @@ Editor::temporal_zoom (gdouble fpu)
double nfpu;
double l;
- /* XXX this limit is also in ::set_frames_per_unit() */
-
- if (frames_per_unit <= 1.0 && fpu <= frames_per_unit) {
+ clamp_frames_per_unit (fpu);
+ if (fpu == frames_per_unit) {
return;
}