[Digikam-devel] extragear/graphics/digikam/digikam

Marcel Wiesweg marcel.wiesweg at gmx.de
Mon Feb 12 20:39:25 GMT 2007


SVN commit 632982 by mwiesweg:

Add preloading for preview view

CCMAIL: digikam-devel at kde.org


 M  +2 -2      albumwidgetstack.cpp  
 M  +1 -1      albumwidgetstack.h  
 M  +15 -7     digikamview.cpp  
 M  +9 -6      imagepreviewview.cpp  
 M  +6 -6      imagepreviewview.h  
 M  +43 -2     imagepreviewwidget.cpp  
 M  +2 -0      imagepreviewwidget.h  


--- trunk/extragear/graphics/digikam/digikam/albumwidgetstack.cpp #632981:632982
@@ -122,7 +122,7 @@
     return d->imagePreviewView;
 }
 
-void AlbumWidgetStack::setPreviewItem(ImageInfo* info, bool hasPrev, bool hasNext)
+void AlbumWidgetStack::setPreviewItem(ImageInfo* info, ImageInfo *previous, ImageInfo *next)
 {
     if (!info)
     {
@@ -152,7 +152,7 @@
             if (previewMode() == MediaPlayerMode)
                 setPreviewItem();
 
-            d->imagePreviewView->setImageInfo(info, hasPrev, hasNext);
+            d->imagePreviewView->setImageInfo(info, previous, next);
 
             // NOTE: No need to toggle imediatly in PreviewImageMode here, 
             // because we will recieve a signal for that when the image preview will be loaded.
--- trunk/extragear/graphics/digikam/digikam/albumwidgetstack.h #632981:632982
@@ -64,7 +64,7 @@
     AlbumIconView    *albumIconView();
     ImagePreviewView *imagePreviewView();
 
-    void setPreviewItem(ImageInfo* info=0, bool hasPrev=false, bool hasNext=false);
+    void setPreviewItem(ImageInfo* info=0, ImageInfo *previous=0, ImageInfo *next=0);
     int  previewMode(void);
     void setPreviewMode(int mode);
 
--- trunk/extragear/graphics/digikam/digikam/digikamview.cpp #632981:632982
@@ -655,16 +655,21 @@
         else
         {
             d->rightSideBar->itemChanged(list);
+
             AlbumIconItem *selectedItem = d->iconView->firstSelectedItem();
-            bool hasPrev = d->iconView->firstItem() != selectedItem;
-            bool hasNext = d->iconView->lastItem() != selectedItem;
+            ImageInfo *previousInfo=0, *nextInfo=0;
+            if (selectedItem->prevItem())
+                previousInfo = static_cast<AlbumIconItem*>(selectedItem->prevItem())->imageInfo();
+            if (selectedItem->nextItem())
+                nextInfo = static_cast<AlbumIconItem*>(selectedItem->nextItem())->imageInfo();
+
             // we fed a list of copies
             d->rightSideBar->takeImageInfoOwnership(true);
 
             if (!d->albumWidgetStack->previewMode() == AlbumWidgetStack::PreviewAlbumMode)
-                d->albumWidgetStack->setPreviewItem(selectedItem->imageInfo(), hasPrev, hasNext);
+                d->albumWidgetStack->setPreviewItem(list.first(), previousInfo, nextInfo);
 
-            emit signalImageSelected(list, hasPrev, hasNext);
+            emit signalImageSelected(list, previousInfo, nextInfo);
         }
 
         d->needDispatchSelection = false;
@@ -895,9 +900,12 @@
     if (d->albumWidgetStack->previewMode() == AlbumWidgetStack::PreviewAlbumMode && iconItem)
     {
         // We will go to ImagePreview Mode.
-        bool hasPrev = d->iconView->firstItem() != iconItem;
-        bool hasNext = d->iconView->lastItem()  != iconItem;
-        d->albumWidgetStack->setPreviewItem(iconItem->imageInfo(), hasPrev, hasNext);
+        ImageInfo *previousInfo=0, *nextInfo=0;
+        if (iconItem->prevItem())
+            previousInfo = static_cast<AlbumIconItem*>(iconItem->prevItem())->imageInfo();
+        if (iconItem->nextItem())
+            nextInfo = static_cast<AlbumIconItem*>(iconItem->nextItem())->imageInfo();
+        d->albumWidgetStack->setPreviewItem(iconItem->imageInfo(), previousInfo, nextInfo);
     }
     else
     {
--- trunk/extragear/graphics/digikam/digikam/imagepreviewview.cpp #632981:632982
@@ -117,16 +117,19 @@
     setPaletteBackgroundColor(ThemeEngine::instance()->baseColor());
 }
 
-void ImagePreviewView::setImageInfo(ImageInfo* info, bool hasPrev, bool hasNext)
+void ImagePreviewView::setImageInfo(ImageInfo* info, ImageInfo *previous, ImageInfo *next)
 {
     d->imageInfo = info;
-    d->hasPrev   = hasPrev;
-    d->hasNext   = hasNext;
+    d->hasPrev   = previous;
+    d->hasNext   = next;
 
     if (d->imageInfo)
-        d->imagePreviewWidget->setImagePath(info->kurl().path()); 
-    else 
-        d->imagePreviewWidget->setImagePath(); 
+        d->imagePreviewWidget->setImagePath(info->filePath());
+    else
+        d->imagePreviewWidget->setImagePath();
+
+    d->imagePreviewWidget->setPreviousNextPaths(previous ? previous->filePath() : QString(),
+                                                next     ? next->filePath()     : QString());
 }
 
 ImageInfo* ImagePreviewView::getImageInfo()
--- trunk/extragear/graphics/digikam/digikam/imagepreviewview.h #632981:632982
@@ -42,9 +42,9 @@
 public:
 
     ImagePreviewView(QWidget *parent=0);
-    ~ImagePreviewView();    
-           
-    void setImageInfo(ImageInfo* info=0, bool hasPrev=false, bool hasNext=false);
+    ~ImagePreviewView();
+
+    void setImageInfo(ImageInfo* info=0, ImageInfo *previous=0, ImageInfo *next=0);
     ImageInfo* getImageInfo();
 
     void reload();
@@ -55,8 +55,8 @@
     void signalPrevItem();
     void signalDeleteItem();
     void signalEditItem();
-    void signalPreviewLoaded();   
-    void signalBack2Album();   
+    void signalPreviewLoaded();
+    void signalBack2Album();
 
 private slots:
 
@@ -71,7 +71,7 @@
 
 private:
 
-    ImagePreviewViewPriv* d;        
+    ImagePreviewViewPriv* d;
 };
 
 }  // NameSpace Digikam
--- trunk/extragear/graphics/digikam/digikam/imagepreviewwidget.cpp #632981:632982
@@ -52,16 +52,20 @@
 
     ImagePreviewWidgetPriv()
     {
-        previewThread = 0;
+        previewThread        = 0;
+        previewPreloadThread = 0;
     }
 
     QString            path;
+    QString            nextPath;
+    QString            previousPath;
 
     QPixmap            pixmap;
 
     QImage             preview;
 
     PreviewLoadThread *previewThread;
+    PreviewLoadThread *previewPreloadThread;
 };
 
 ImagePreviewWidget::ImagePreviewWidget(QWidget *parent)
@@ -74,7 +78,7 @@
     setFrameStyle(QFrame::NoFrame);
     setMargin(0);
     setLineWidth(0);
-    
+
     // ---------------------------------------------------------------
 
     connect(ThemeEngine::instance(), SIGNAL(signalThemeChanged()),
@@ -84,6 +88,7 @@
 ImagePreviewWidget::~ImagePreviewWidget()
 {
     delete d->previewThread;
+    delete d->previewPreloadThread;
     delete d;
 }
 
@@ -98,6 +103,9 @@
     setCursor( KCursor::waitCursor() );
     d->path = path;
 
+    d->nextPath     = QString();
+    d->previousPath = QString();
+
     if (d->path.isEmpty())
     {
         d->pixmap = QPixmap(contentsRect().size());
@@ -114,12 +122,24 @@
         connect(d->previewThread, SIGNAL(signalPreviewLoaded(const LoadingDescription &, const QImage &)),
                 this, SLOT(slotGotImagePreview(const LoadingDescription &, const QImage&)));
     }
+    if (!d->previewPreloadThread)
+    {
+        d->previewPreloadThread = new PreviewLoadThread();
+        connect(d->previewPreloadThread, SIGNAL(signalPreviewLoaded(const LoadingDescription &, const QImage &)),
+                this, SLOT(slotNextPreload()));
+    }
 
     d->previewThread->load(LoadingDescription(path, 1024, AlbumSettings::instance()->getExifRotate()));
 
     emit signalPreviewStarted();
 }
 
+void ImagePreviewWidget::setPreviousNextPaths(const QString& previous, const QString &next)
+{
+    d->nextPath     = next;
+    d->previousPath = previous;
+}
+
 void ImagePreviewWidget::slotGotImagePreview(const LoadingDescription &description, const QImage& preview)
 {
     if (description.filePath != d->path)
@@ -136,8 +156,29 @@
         emit signalPreviewFailed();
     else
         emit signalPreviewComplete();
+
+    slotNextPreload();
 }
 
+void ImagePreviewWidget::slotNextPreload()
+{
+    QString loadPath;
+    if (!d->nextPath.isNull())
+    {
+        loadPath = d->nextPath;
+        d->nextPath = QString();
+    }
+    else if (!d->previousPath.isNull())
+    {
+        loadPath = d->previousPath;
+        d->previousPath = QString();
+    }
+    else
+        return;
+
+    d->previewPreloadThread->load(LoadingDescription(loadPath, 1024, AlbumSettings::instance()->getExifRotate()));
+}
+
 void ImagePreviewWidget::updatePixmap( void )
 {
     d->pixmap.fill(ThemeEngine::instance()->baseColor());
--- trunk/extragear/graphics/digikam/digikam/imagepreviewwidget.h #632981:632982
@@ -50,6 +50,7 @@
     ~ImagePreviewWidget();
 
     void setImagePath(const QString& path=QString::null);
+    void setPreviousNextPaths(const QString& previous, const QString &next);
     void reload();
 
 signals:
@@ -74,6 +75,7 @@
 private slots:
 
     void slotGotImagePreview(const LoadingDescription &loadingDescription, const QImage &image);
+    void slotNextPreload();
 
 private:
 



More information about the Digikam-devel mailing list