[Digikam-devel] [Bug 140131] No zoom in image preview

Gilles Caulier caulier.gilles at gmail.com
Thu Apr 12 09:15:45 CEST 2007


------- You are receiving this mail because: -------
You are the assignee for the bug, or are watching the assignee.
         
http://bugs.kde.org/show_bug.cgi?id=140131         




------- Additional Comments From caulier.gilles gmail com  2007-04-12 09:15 -------
SVN commit 652884 by cgilles:

digikam from trunk : pan icon widget is back with Preview Mode...
CCBUGS: 140131

 M  +107 -10   digikam/imagepreviewwidget.cpp  
 M  +4 -0      digikam/imagepreviewwidget.h  
 M  +2 -2      libs/widgets/common/Makefile.am  
 AM            libs/widgets/common/paniconwidget.cpp   [License: GPL]
 AM            libs/widgets/common/paniconwidget.h   [License: GPL]


--- trunk/extragear/graphics/digikam/digikam/imagepreviewwidget.cpp #652883:652884
 @ -24,6 +24,7  @
 
 // Qt includes.
 
+#include <qtooltip.h>
 #include <qcache.h>
 #include <qpainter.h>
 #include <qimage.h>
 @ -31,12 +32,15  @
 #include <qrect.h>
 #include <qtimer.h>
 #include <qguardedptr.h>
+#include <qtoolbutton.h>
 
 // KDE include.
 
 #include <kcursor.h>
 #include <kprocess.h>
 #include <klocale.h>
+#include <kdatetbl.h>
+#include <kiconloader.h>
 
 // Local includes.
 
 @ -44,6 +48,7  @
 #include "fastscale.h"
 #include "themeengine.h"
 #include "albumsettings.h"
+#include "paniconwidget.h"
 #include "imagepreviewwidget.h"
 #include "imagepreviewwidget.moc"
 
 @ -57,16 +62,19  @
     ImagePreviewWidgetPriv() :
         tileSize(128), minZoom(0.1), maxZoom(12.0), zoomMultiplier(1.2) 
     {
-        pressedMoving        = false;
-        midButtonPressed     = false;
-        midButtonX           = 0;
-        midButtonY           = 0;
-        autoZoom             = false;
-        fullScreen           = false;
-        zoom                 = 1.0;
-        zoomWidth            = 0;
-        zoomHeight           = 0;
-        tileTmpPix           = new QPixmap(tileSize, tileSize);
+        pressedMoving    = false;
+        midButtonPressed = false;
+        midButtonX       = 0;
+        midButtonY       = 0;
+        autoZoom         = false;
+        fullScreen       = false;
+        zoom             = 1.0;
+        zoomWidth        = 0;
+        zoomHeight       = 0;
+        panIconPopup     = 0;
+        panIconWidget    = 0;
+        cornerButton     = 0;
+        tileTmpPix       = new QPixmap(tileSize, tileSize);
 
         tileCache.setMaxCost((10*1024*1024)/(tileSize*tileSize*4));
         tileCache.setAutoDelete(true);
 @ -88,6 +96,8  @
     const double         maxZoom;
     const double         zoomMultiplier;
 
+    QToolButton         *cornerButton;
+
     QRect                pixmapRect;
     
     QCache<QPixmap>      tileCache;
 @ -97,6 +107,10  @
     QColor               bgColor;
 
     QImage               preview;
+
+    KPopupFrame         *panIconPopup;
+
+    PanIconWidget       *panIconWidget;
 };
 
 ImagePreviewWidget::ImagePreviewWidget(QWidget *parent)
 @ -112,8 +126,20  @
     setMargin(0); 
     setLineWidth(1); 
 
+    d->cornerButton = new QToolButton(this);
+    d->cornerButton->setIconSet(SmallIcon("move"));
+    d->cornerButton->hide();
+    QToolTip::add(d->cornerButton, i18n("Pan the image to a region"));
+    setCornerWidget(d->cornerButton);
+
     // ------------------------------------------------------------
 
+    connect(this, SIGNAL(signalZoomFactorChanged(double)),
+            this, SLOT(slotZoomChanged(double)));
+
+    connect(d->cornerButton, SIGNAL(pressed()),
+            this, SLOT(slotCornerButtonPressed()));
+
     connect(ThemeEngine::instance(), SIGNAL(signalThemeChanged()),
             this, SLOT(slotThemeChanged()));
 }
 @ -156,6 +182,8  @
     d->zoom       = calcAutoZoomFactor();
     d->zoomWidth  = (int)(d->preview.width()  * d->zoom);
     d->zoomHeight = (int)(d->preview.height() * d->zoom);
+
+    emit signalZoomFactorChanged(d->zoom);
 }
 
 double ImagePreviewWidget::calcAutoZoomFactor()
 @ -210,6 +238,10  @
 
     // No need to repaint. its called   
     // automatically after resize
+
+    // To be sure than corner widget used to pan image will be hide/show 
+    // accordinly with resize event.
+    slotZoomChanged(d->zoom);
 }
 
 void ImagePreviewWidget::viewportPaintEvent(QPaintEvent *e)
 @ -463,10 +495,75  @
     if (d->autoZoom)
         updateAutoZoom();
     else
+    {
         d->zoom = 1.0;
+        emit signalZoomFactorChanged(d->zoom);
+    }
 
     updateContentsSize();
     viewport()->update();
 }
 
+void ImagePreviewWidget::slotCornerButtonPressed()
+{    
+    if (d->panIconPopup)
+    {
+        d->panIconPopup->hide();
+        delete d->panIconPopup;
+        d->panIconPopup = 0;
+    }
+
+    d->panIconPopup    = new KPopupFrame(this);
+    PanIconWidget *pan = new PanIconWidget(d->panIconPopup);
+    pan->setImage(180, 120, d->preview); 
+    d->panIconPopup->setMainWidget(pan);
+
+    QRect r((int)(contentsX()    / d->zoom), (int)(contentsY()     / d->zoom),
+            (int)(visibleWidth() / d->zoom), (int)(visibleHeight() / d->zoom));
+    pan->setRegionSelection(r);
+    pan->setMouseFocus();
+
+    connect(pan, SIGNAL(signalSelectionMoved(QRect, bool)),
+            this, SLOT(slotPanIconSelectionMoved(QRect, bool)));
+    
+    connect(pan, SIGNAL(signalHiden()),
+            this, SLOT(slotPanIconHiden()));
+    
+    QPoint g = mapToGlobal(viewport()->pos());
+    g.setX(g.x()+ viewport()->size().width());
+    g.setY(g.y()+ viewport()->size().height());
+    d->panIconPopup->popup(QPoint(g.x() - d->panIconPopup->width(), 
+                                  g.y() - d->panIconPopup->height()));
+
+    pan->setCursorToLocalRegionSelectionCenter();
+}
+
+void ImagePreviewWidget::slotPanIconHiden()
+{
+    d->cornerButton->blockSignals(true);
+    d->cornerButton->animateClick();
+    d->cornerButton->blockSignals(false);
+}
+
+void ImagePreviewWidget::slotPanIconSelectionMoved(QRect r, bool b)
+{
+    setContentsPos((int)(r.x()*d->zoom), (int)(r.y()*d->zoom));
+
+    if (b)
+    {
+        d->panIconPopup->hide();
+        delete d->panIconPopup;
+        d->panIconPopup = 0;
+        slotPanIconHiden();
+    }
+}
+
+void ImagePreviewWidget::slotZoomChanged(double zoom)
+{
+    if (zoom > calcAutoZoomFactor())
+        d->cornerButton->show();
+    else
+        d->cornerButton->hide();        
+}
+
 }  // NameSpace Digikam
--- trunk/extragear/graphics/digikam/digikam/imagepreviewwidget.h #652883:652884
 @ -85,6 +85,10  @
 private slots:
 
     void slotThemeChanged();
+    void slotCornerButtonPressed();
+    void slotZoomChanged(double);
+    void slotPanIconSelectionMoved(QRect, bool);
+    void slotPanIconHiden();
 
 private:
 
--- trunk/extragear/graphics/digikam/libs/widgets/common/Makefile.am #652883:652884
 @ -5,7 +5,7  @
 libcommonwidgets_la_SOURCES = histogramwidget.cpp colorgradientwidget.cpp curveswidget.cpp \
                               sidebar.cpp squeezedcombobox.cpp filesaveoptionsbox.cpp \
                               dpopupmenu.cpp statusnavigatebar.cpp statusprogressbar.cpp \
-                              dcursortracker.cpp 
+                              dcursortracker.cpp paniconwidget.cpp
 
 libcommonwidgets_la_LDFLAGS = $(all_libraries) $(KDE_RPATH)
 
 @ -17,6 +17,6  @
 	       $(all_includes)
 
 digikaminclude_HEADERS = histogramwidget.h colorgradientwidget.h sidebar.h curveswidget.h \
-	                     squeezedcombobox.h dcursortracker.h 
+	                 squeezedcombobox.h dcursortracker.h paniconwidget.h
 
 digikamincludedir = $(includedir)/digikam
** trunk/extragear/graphics/digikam/libs/widgets/common/paniconwidget.cpp #property svn:eol-style
   + native
** trunk/extragear/graphics/digikam/libs/widgets/common/paniconwidget.h #property svn:eol-style
   + native


More information about the Digikam-devel mailing list