# HG changeset patch # User Chris Cannam # Date 1537436724 -3600 # Node ID 97c68bffbda61d62356f1512bd3bfac227542fd8 # Parent bc2cb82050a070e5d0839d5f2b205c1eacce3a06 More ZoomLevel updates diff -r bc2cb82050a0 -r 97c68bffbda6 layer/TimeRulerLayer.cpp --- a/layer/TimeRulerLayer.cpp Wed Sep 19 15:42:22 2018 +0100 +++ b/layer/TimeRulerLayer.cpp Thu Sep 20 10:45:24 2018 +0100 @@ -230,7 +230,7 @@ int minPixelSpacing = 50; sv_frame_t incFrame = lrint((incms * sampleRate) / 1000); - int incX = int(round(v->getZoomLevel().framesToPixels(incFrame))); + int incX = int(round(v->getZoomLevel().framesToPixels(double(incFrame)))); int ticks = 10; if (incX < minPixelSpacing * 2) { ticks = quarter ? 4 : 5; diff -r bc2cb82050a0 -r 97c68bffbda6 view/Overview.cpp --- a/view/Overview.cpp Wed Sep 19 15:42:22 2018 +0100 +++ b/view/Overview.cpp Thu Sep 20 10:45:24 2018 +0100 @@ -124,7 +124,7 @@ } void -Overview::viewZoomLevelChanged(View *v, int, bool) +Overview::viewZoomLevelChanged(View *v, ZoomLevel, bool) { if (v == this) return; if (m_views.find(v) != m_views.end()) { @@ -190,7 +190,9 @@ emit zoomLevelChanged(m_zoomLevel, m_followZoom); } - sv_frame_t centreFrame = startFrame + m_zoomLevel * (width() / 2); + sv_frame_t centreFrame = startFrame + + sv_frame_t(round(m_zoomLevel.pixelsToFrames(width()/2))); + if (centreFrame > (startFrame + getModelsEndFrame())/2) { centreFrame = (startFrame + getModelsEndFrame())/2; } @@ -311,7 +313,7 @@ if (!m_clickedInRange) return; int xoff = int(e->x()) - int(m_clickPos.x()); - sv_frame_t frameOff = xoff * m_zoomLevel; + sv_frame_t frameOff = sv_frame_t(round(m_zoomLevel.pixelsToFrames(xoff))); sv_frame_t newCentreFrame = m_dragCentreFrame; if (frameOff > 0) { @@ -328,7 +330,8 @@ } if (std::max(m_centreFrame, newCentreFrame) - - std::min(m_centreFrame, newCentreFrame) > m_zoomLevel) { + std::min(m_centreFrame, newCentreFrame) > + m_zoomLevel.pixelsToFrames(1)) { sv_frame_t rf = alignToReference(newCentreFrame); #ifdef DEBUG_OVERVIEW cerr << "Overview::mouseMoveEvent: x " << e->x() << " and click x " << m_clickPos.x() << " -> frame " << newCentreFrame << " -> rf " << rf << endl; diff -r bc2cb82050a0 -r 97c68bffbda6 view/Overview.h --- a/view/Overview.h Wed Sep 19 15:42:22 2018 +0100 +++ b/view/Overview.h Thu Sep 20 10:45:24 2018 +0100 @@ -46,7 +46,7 @@ virtual void globalCentreFrameChanged(sv_frame_t); virtual void viewCentreFrameChanged(View *, sv_frame_t); - virtual void viewZoomLevelChanged(View *, int, bool); + virtual void viewZoomLevelChanged(View *, ZoomLevel, bool); virtual void viewManagerPlaybackFrameChanged(sv_frame_t); virtual void setBoxColour(QColor); diff -r bc2cb82050a0 -r 97c68bffbda6 view/Pane.cpp --- a/view/Pane.cpp Wed Sep 19 15:42:22 2018 +0100 +++ b/view/Pane.cpp Thu Sep 20 10:45:24 2018 +0100 @@ -201,7 +201,7 @@ int count = 0; int current = 0; - int level = 1; + ZoomLevel level; //!!! pull out into function (presumably in View) bool haveConstraint = false; @@ -215,18 +215,21 @@ if (haveConstraint) { while (true) { + //!!! this won't terminate if level is in the PixelsPerFrame zone if (getZoomLevel() == level) current = count; - int newLevel = getZoomConstraintBlockSize(level + 1, - ZoomConstraint::RoundUp); + ZoomLevel newLevel = getZoomConstraintLevel(level.incremented(), + ZoomConstraint::RoundUp); if (newLevel == level) break; level = newLevel; if (++count == 50) break; } } else { // if we have no particular constraints, we can really spread out + //!!! this is nonsense in PixelsPerFrame zone while (true) { + using namespace std::rel_ops; if (getZoomLevel() >= level) current = count; - int step = level / 10; + int step = level.level / 10; int pwr = 0; while (step > 0) { ++pwr; @@ -238,12 +241,13 @@ --pwr; } // cerr << level << endl; - level += step; - if (++count == 100 || level > 262144) break; + level.level += step; + if (++count == 100 || level.level > 262144) break; } } -// cerr << "Have " << count << " zoom levels" << endl; + //!!! + SVCERR << "Have " << count << " zoom levels" << endl; m_hthumb->setMinimumValue(0); m_hthumb->setMaximumValue(count); @@ -1145,8 +1149,8 @@ QImage * Pane::renderPartToNewImage(sv_frame_t f0, sv_frame_t f1) { - int x0 = int(f0 / getZoomLevel()); - int x1 = int(f1 / getZoomLevel()); + int x0 = int(round(getZoomLevel().framesToPixels(double(f0)))); + int x1 = int(round(getZoomLevel().framesToPixels(double(f1)))); QImage *image = new QImage(x1 - x0 + m_scaleWidth, height(), QImage::Format_RGB32); @@ -1881,9 +1885,9 @@ int x1 = r.x() + r.width(); int y1 = r.y() + r.height(); - int w = x1 - x0; - sv_frame_t newStartFrame = getFrameForX(x0); + sv_frame_t newEndFrame = getFrameForX(x1); + sv_frame_t dist = newEndFrame - newStartFrame; sv_frame_t visibleFrames = getEndFrame() - getStartFrame(); if (newStartFrame <= -visibleFrames) { @@ -1893,14 +1897,9 @@ if (newStartFrame >= getModelsEndFrame()) { newStartFrame = getModelsEndFrame() - 1; } - - double ratio = double(w) / double(width()); -// cerr << "ratio: " << ratio << endl; - int newZoomLevel = (int)nearbyint(m_zoomLevel * ratio); - if (newZoomLevel < 1) newZoomLevel = 1; - -// cerr << "start: " << m_startFrame << ", level " << m_zoomLevel << endl; - setZoomLevel(getZoomConstraintBlockSize(newZoomLevel)); + + ZoomLevel newZoomLevel = ZoomLevel::fromRatio(width(), dist); + setZoomLevel(getZoomConstraintLevel(newZoomLevel)); setStartFrame(newStartFrame); QString unit; @@ -2379,21 +2378,18 @@ } } else { + using namespace std::rel_ops; // Zoom in or out - int newZoomLevel = m_zoomLevel; + ZoomLevel newZoomLevel = m_zoomLevel; if (sign > 0) { - if (newZoomLevel <= 2) { - newZoomLevel = 1; - } else { - newZoomLevel = getZoomConstraintBlockSize - (newZoomLevel - 1, ZoomConstraint::RoundDown); - } - } else { // sign < 0 - newZoomLevel = getZoomConstraintBlockSize - (newZoomLevel + 1, ZoomConstraint::RoundUp); + newZoomLevel = getZoomConstraintLevel(newZoomLevel.decremented(), + ZoomConstraint::RoundDown); + } else { + newZoomLevel = getZoomConstraintLevel(newZoomLevel.incremented(), + ZoomConstraint::RoundUp); } if (newZoomLevel != m_zoomLevel) { @@ -2422,9 +2418,11 @@ // Scroll left or right by a fixed number of pixels if (getStartFrame() < 0 && - getEndFrame() >= getModelsEndFrame()) return; - - int delta = (pixels * m_zoomLevel); + getEndFrame() >= getModelsEndFrame()) { + return; + } + + int delta = int(round(m_zoomLevel.pixelsToFrames(pixels))); if (m_centreFrame < delta) { setCentreFrame(0); @@ -2443,8 +2441,7 @@ //!!! dupe with updateHeadsUpDisplay int count = 0; - int level = 1; - + ZoomLevel level; //!!! pull out into function (presumably in View) bool haveConstraint = false; @@ -2458,17 +2455,19 @@ if (haveConstraint) { while (true) { + //!!! this won't terminate if level is in the PixelsPerFrame zone if (m_hthumb->getMaximumValue() - value == count) break; - int newLevel = getZoomConstraintBlockSize(level + 1, - ZoomConstraint::RoundUp); + ZoomLevel newLevel = getZoomConstraintLevel(level.incremented(), + ZoomConstraint::RoundUp); if (newLevel == level) break; level = newLevel; if (++count == 50) break; } } else { + //!!! this is nonsense in PixelsPerFrame zone while (true) { if (m_hthumb->getMaximumValue() - value == count) break; - int step = level / 10; + int step = level.level / 10; int pwr = 0; while (step > 0) { ++pwr; @@ -2480,8 +2479,8 @@ --pwr; } // cerr << level << endl; - level += step; - if (++count == 100 || level > 262144) break; + level.level += step; + if (++count == 100 || level.level > 262144) break; } } @@ -2747,7 +2746,7 @@ } void -Pane::viewZoomLevelChanged(View *v, int z, bool locked) +Pane::viewZoomLevelChanged(View *v, ZoomLevel z, bool locked) { // cerr << "Pane[" << this << "]::zoomLevelChanged (global now " // << (m_manager ? m_manager->getGlobalZoom() : 0) << ")" << endl; diff -r bc2cb82050a0 -r 97c68bffbda6 view/Pane.h --- a/view/Pane.h Wed Sep 19 15:42:22 2018 +0100 +++ b/view/Pane.h Thu Sep 20 10:45:24 2018 +0100 @@ -87,7 +87,7 @@ // view slots virtual void toolModeChanged() override; virtual void zoomWheelsEnabledChanged() override; - virtual void viewZoomLevelChanged(View *v, int z, bool locked) override; + virtual void viewZoomLevelChanged(View *, ZoomLevel, bool locked) override; virtual void modelAlignmentCompletionChanged() override; // local slots, not overrides diff -r bc2cb82050a0 -r 97c68bffbda6 view/View.cpp --- a/view/View.cpp Wed Sep 19 15:42:22 2018 +0100 +++ b/view/View.cpp Thu Sep 20 10:45:24 2018 +0100 @@ -54,7 +54,7 @@ QFrame(w), m_id(getNextId()), m_centreFrame(0), - m_zoomLevel(1024), + m_zoomLevel(ZoomLevel::FramesPerPixel, 1024), m_followPan(true), m_followZoom(true), m_followPlay(PlaybackScrollPageWithCentre), @@ -64,7 +64,7 @@ m_cache(0), m_buffer(0), m_cacheCentreFrame(0), - m_cacheZoomLevel(1024), + m_cacheZoomLevel(ZoomLevel::FramesPerPixel, 1024), m_selectionCached(false), m_deleting(false), m_haveSelectedLayer(false), @@ -319,7 +319,8 @@ void View::setStartFrame(sv_frame_t f) { - setCentreFrame(f + m_zoomLevel * (width() / 2)); + setCentreFrame(f + sv_frame_t(round + (m_zoomLevel.pixelsToFrames(width() / 2)))); } bool diff -r bc2cb82050a0 -r 97c68bffbda6 view/ViewProxy.h --- a/view/ViewProxy.h Wed Sep 19 15:42:22 2018 +0100 +++ b/view/ViewProxy.h Thu Sep 20 10:45:24 2018 +0100 @@ -75,12 +75,20 @@ bool &log) const { return m_view->getValueExtents(unit, min, max, log); } - virtual int getZoomLevel() const { - int z = m_view->getZoomLevel(); -// cerr << "getZoomLevel: from " << z << " to "; - z = z / m_scaleFactor; -// cerr << z << endl; - if (z < 1) z = 1; + virtual ZoomLevel getZoomLevel() const { + ZoomLevel z = m_view->getZoomLevel(); + //!!! + cerr << "getZoomLevel: from " << z << " to "; + if (z.zone == ZoomLevel::FramesPerPixel) { + z.level /= m_scaleFactor; + if (z.level < 1) { + z.level = 1; + } + } else { + //!!!??? + z.level *= m_scaleFactor; + } + cerr << z << endl; return z; } virtual QRect getPaintRect() const {