Author: jghali
Date: Fri Jun  7 01:09:21 2019
New Revision: 23003

URL: http://scribus.net/websvn/listing.php?repname=Scribus&sc=1&rev=23003
Log:
Do a better job at preserving clicked point when zooming out

Modified:
    trunk/Scribus/scribus/scribusdoc.cpp
    trunk/Scribus/scribus/scribusdoc.h
    trunk/Scribus/scribus/scribusview.cpp

Modified: trunk/Scribus/scribus/scribusdoc.cpp
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=23003&path=/trunk/Scribus/scribus/scribusdoc.cpp
==============================================================================
--- trunk/Scribus/scribus/scribusdoc.cpp        (original)
+++ trunk/Scribus/scribus/scribusdoc.cpp        Fri Jun  7 01:09:21 2019
@@ -5822,9 +5822,9 @@
        int docItemsCount=Items->count();
        if (docItemsCount != 0)
        {
-               for (int ic = 0; ic < docItemsCount; ++ic)
-               {
-                       currItem = Items->at(ic);
+               for (int i = 0; i < docItemsCount; ++i)
+               {
+                       currItem = Items->at(i);
                        if (currItem->rotation() != 0.0)
                        {
                                FPointArray pb;
@@ -5855,23 +5855,58 @@
        }
        else
        {
-               ScPage* Seite;
-               int docPageCount=Pages->count();
+               ScPage* page;
                MarginStruct pageBleeds;
-               for (int a = 0; a < docPageCount; ++a)
-               {
-                       Seite = Pages->at(a);
-                       getBleeds(Seite, pageBleeds);
-                       minx = qMin(minx, Seite->xOffset() - pageBleeds.left());
-                       miny = qMin(miny, Seite->yOffset() - pageBleeds.top());
-                       maxx = qMax(maxx, Seite->xOffset() + Seite->width() + 
pageBleeds.left() + pageBleeds.right());
-                       maxy = qMax(maxy, Seite->yOffset() + Seite->height() + 
pageBleeds.top() + pageBleeds.bottom());
+               int docPageCount = Pages->count();
+               for (int i = 0; i < docPageCount; ++i)
+               {
+                       page = Pages->at(i);
+                       getBleeds(page, pageBleeds);
+                       minx = qMin(minx, page->xOffset() - pageBleeds.left());
+                       miny = qMin(miny, page->yOffset() - pageBleeds.top());
+                       maxx = qMax(maxx, page->xOffset() + page->width() + 
pageBleeds.left() + pageBleeds.right());
+                       maxy = qMax(maxy, page->yOffset() + page->height() + 
pageBleeds.top() + pageBleeds.bottom());
                }
        }
        minPoint.setX(minx);
        minPoint.setY(miny);
        maxPoint.setX(maxx);
        maxPoint.setY(maxy);
+}
+
+QRectF ScribusDoc::canvasOptimalRect()
+{
+       double x, y, width, height;
+       QRectF canvasRect;
+       QRectF pageRect;
+       MarginStruct pageBleeds;
+       PageItem *currItem;
+       ScPage* page;
+
+       int pageCount = Pages->count();
+       for (int i = 0; i < pageCount; ++i)
+       {
+               page = Pages->at(i);
+               getBleeds(page, pageBleeds);
+               x = page->xOffset() - pageBleeds.left();
+               y = page->yOffset() - pageBleeds.top();
+               width  = page->width() + pageBleeds.left() + pageBleeds.right();
+               height = page->height() + pageBleeds.top() + 
pageBleeds.bottom();
+               canvasRect = canvasRect.united(QRectF(x, y, width, height));
+       }
+
+       int itemsCount = Items->count();
+       for (int i = 0; i < itemsCount; ++i)
+       {
+               currItem = Items->at(i);
+               QRectF itemRect = currItem->getBoundingRect();
+               canvasRect = canvasRect.united(itemRect);
+       }
+
+       const MarginStruct& scratch = m_docPrefsData.displayPrefs.scratch;
+       canvasRect.adjust(-scratch.left(), -scratch.top(), scratch.right(), 
scratch.bottom());
+
+       return canvasRect;
 }
 
 
@@ -6252,11 +6287,12 @@
                return;
        if (!isLoading())
        {
+               FPoint minPoint, maxPoint;
+               const MarginStruct& scratch = 
m_docPrefsData.displayPrefs.scratch;
                updateMarks(true);
-               FPoint minPoint, maxPoint;
                canvasMinMax(minPoint, maxPoint);
-               FPoint maxSize(qMax(maxXPos, 
maxPoint.x()+m_docPrefsData.displayPrefs.scratch.right()), qMax(maxYPos, 
maxPoint.y()+m_docPrefsData.displayPrefs.scratch.bottom()));
-               adjustCanvas(FPoint(qMin(0.0, 
minPoint.x()-m_docPrefsData.displayPrefs.scratch.left()),qMin(0.0, 
minPoint.y()-m_docPrefsData.displayPrefs.scratch.top())), maxSize, true);
+               FPoint maxSize(qMax(maxXPos, maxPoint.x() + scratch.right()), 
qMax(maxYPos, maxPoint.y() + scratch.bottom()));
+               adjustCanvas(FPoint(qMin(0.0, minPoint.x() - scratch.left()), 
qMin(0.0, minPoint.y() - scratch.top())), maxSize, true);
                changed();
        }
        else

Modified: trunk/Scribus/scribus/scribusdoc.h
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=23003&path=/trunk/Scribus/scribus/scribusdoc.h
==============================================================================
--- trunk/Scribus/scribus/scribusdoc.h  (original)
+++ trunk/Scribus/scribus/scribusdoc.h  Fri Jun  7 01:09:21 2019
@@ -858,11 +858,16 @@
         * @param dia optional progress widget
         */
        void RecalcPictures(QList<PageItem*>* items, ProfilesL *Pr, ProfilesL 
*PrCMYK, QProgressBar *dia = nullptr);
-       /**
-        *
+
+       /**
         * @brief Find the minX,MinY and maxX,maxY for the canvas required for 
the doc
         */
        void canvasMinMax(FPoint&, FPoint&);
+
+       /**
+        * @brief Find the optimal area for canvas
+        */
+       QRectF canvasOptimalRect();
        
        int  OnPage(double x2, double  y2);
        int  OnPage(PageItem *currItem);

Modified: trunk/Scribus/scribus/scribusview.cpp
URL: 
http://scribus.net/websvn/diff.php?repname=Scribus&rev=23003&path=/trunk/Scribus/scribus/scribusview.cpp
==============================================================================
--- trunk/Scribus/scribus/scribusview.cpp       (original)
+++ trunk/Scribus/scribus/scribusview.cpp       Fri Jun  7 01:09:21 2019
@@ -3617,20 +3617,73 @@
 void ScribusView::zoom(int canvasX, int canvasY, double scale, bool 
preservePoint)
 {
        QPoint globalPoint = m_canvas->canvasToGlobal(QPointF(canvasX, 
canvasY));
+       double oldScale = m_canvas->scale();
        double newScale = (scale > (Prefs->opToolPrefs.magMax / 100) * 
Prefs->displayPrefs.displayScale) ? ((Prefs->opToolPrefs.magMax / 100) * 
Prefs->displayPrefs.displayScale) : scale;
        undoManager->setUndoEnabled(false);
        updatesOn(false);
        setScale(newScale);
+
+       FPoint minPos = Doc->minCanvasCoordinate;
+       FPoint maxPos = Doc->maxCanvasCoordinate;
+       if (newScale > oldScale)
+       {
+               // Try to set scrollBars values in a reasonable way after 
important zoom out 
+               QRectF optimalRect = Doc->canvasOptimalRect();
+               double minX = qMax(minPos.x(), optimalRect.left());
+               double minY = qMax(minPos.y(), optimalRect.top());
+               double maxX = qMin(maxPos.x(), optimalRect.right());
+               double maxY = qMin(maxPos.y(), optimalRect.bottom());
+               minPos.setXY(minX, minY);
+               maxPos.setXY(maxX, maxY);
+       }
+
+       // FIXME : find a way to avoid adjustCanvas/resizeContents, cause 
unnecessary paintEvents despite updates disabled
+       if (minPos != Doc->minCanvasCoordinate || maxPos != 
Doc->maxCanvasCoordinate)
+               Doc->adjustCanvas(minPos, maxPos, true);
+       else
+       {
+               int nw = qMax(qRound((Doc->maxCanvasCoordinate.x() - 
Doc->minCanvasCoordinate.x()) * m_canvas->scale()), visibleWidth());
+               int nh = qMax(qRound((Doc->maxCanvasCoordinate.y() - 
Doc->minCanvasCoordinate.y()) * m_canvas->scale()), visibleHeight());
+               resizeContents(nw, nh);
+       }
+
        QPoint localPoint = m_canvas->canvasToLocal( QPointF(canvasX, canvasY) 
);
-       int nw = qMax(qRound((Doc->maxCanvasCoordinate.x() - 
Doc->minCanvasCoordinate.x()) * m_canvas->scale()), visibleWidth());
-       int nh = qMax(qRound((Doc->maxCanvasCoordinate.y() - 
Doc->minCanvasCoordinate.y()) * m_canvas->scale()), visibleHeight());
-       resizeContents(nw, nh); // FIXME : should be avoided here, cause an 
unnecessary paintEvent despite updates disabled
+
        QPoint canvasPoint;
        if (preservePoint)
                canvasPoint = viewport()->mapFromGlobal(globalPoint);
        else
                canvasPoint = QPoint(viewport()->width() / 2, 
viewport()->height() / 2);
-       setContentsPos(localPoint.x() - canvasPoint.x(), localPoint.y() - 
canvasPoint.y());
+
+       int contentPosX = localPoint.x() - canvasPoint.x();
+       int contentPosY = localPoint.y() - canvasPoint.y();
+
+       QSize maxViewport = maximumViewportSize();
+       minPos = 
m_canvas->localToCanvas(QPoint(horizontalScrollBar()->minimum(), 
verticalScrollBar()->minimum()));
+       maxPos = 
m_canvas->localToCanvas(QPoint(horizontalScrollBar()->maximum() + 
maxViewport.width(), verticalScrollBar()->maximum() + maxViewport.height()));
+
+       int hMin = qMin(contentPosX, horizontalScrollBar()->minimum());
+       int hMax = qMax(contentPosX, horizontalScrollBar()->maximum());
+       int vMin = qMin(contentPosY, verticalScrollBar()->minimum());
+       int vMax = qMax(contentPosY, verticalScrollBar()->maximum());
+       if ((hMin < horizontalScrollBar()->minimum()) || (hMax > 
horizontalScrollBar()->maximum()) ||
+               (vMin < verticalScrollBar()->minimum())   || (vMax > 
verticalScrollBar()->maximum()))
+       {
+               QSize maxViewport = maximumViewportSize();
+               minPos = m_canvas->localToCanvas(QPoint(hMin, vMin));
+               maxPos = m_canvas->localToCanvas(QPoint(hMax + 
maxViewport.width(), vMax + maxViewport.height()));
+       }
+
+       Doc->adjustCanvas(minPos, maxPos);
+       localPoint = m_canvas->canvasToLocal(QPointF(canvasX, canvasY));
+       if (preservePoint)
+               canvasPoint = viewport()->mapFromGlobal(globalPoint);
+       else
+               canvasPoint = QPoint(viewport()->width() / 2, 
viewport()->height() / 2);
+       contentPosX = localPoint.x() - canvasPoint.x();
+       contentPosY = localPoint.y() - canvasPoint.y();
+       setContentsPos(contentPosX, contentPosY);
+       
        updatesOn(true);
        undoManager->setUndoEnabled(true);
 }


_______________________________________________
scribus-commit mailing list
[email protected]
http://lists.scribus.net/mailman/listinfo/scribus-commit

Reply via email to