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

Gilles Caulier caulier.gilles at gmail.com
Tue Mar 18 14:01:56 GMT 2008


SVN commit 787020 by cgilles:

digiKam from trunk (KDE4) : add thumbbar behind preview area from AlbumGUI when preview mode is used (F3). 
Icon view filter available to status bar and TagFilters still suitable to change thumbbar contents in live.
Thumbbar items can display Rating of pictures. More informations about thumbbar items are avaialble using 
pop-up tool tips is you enable this option in config dialog.
A fresh screenshot is available at these url :

- with Digikasa color theme : http://digikam3rdparty.free.fr/Screenshots/thumbbar4albumgui.png
- with Desert color theme : http://digikam3rdparty.free.fr/Screenshots/thumbbarwithpreviewmode.png

CCMAIL: digikam-devel at kde.org
BUG: 155408
CCBUGS: 148502



 M  +3 -5      CMakeLists.txt  
 M  +3 -5      albumiconview.cpp  
 M  +5 -2      albumiconview.h  
 M  +90 -6     albumwidgetstack.cpp  
 M  +13 -4     albumwidgetstack.h  
 M  +17 -4     digikamview.cpp  
 M  +5 -4      digikamview.h  
 AM            imagepreviewbar.cpp   [License: GPL (v2+)]
 AM            imagepreviewbar.h   [License: GPL (v2+)]
 M  +8 -8      imagepreviewview.cpp  
 M  +1 -1      imagepreviewview.h  


--- trunk/extragear/graphics/digikam/digikam/CMakeLists.txt #787019:787020
@@ -146,7 +146,6 @@
                      ${libthemeengine_SRCS}
                      ${libkipiiface_SRCS}
 
-
                      album.cpp 
                      albumiconview.cpp 
                      albumiconviewfilter.cpp 
@@ -172,11 +171,14 @@
                      dio.cpp 
                      ddragobjects.cpp 
                      firstrun.cpp 
+                     folderitem.cpp 
+                     folderview.cpp 
                      iconview.cpp 
                      icongroupitem.cpp 
                      iconitem.cpp 
                      imageattributeswatch.cpp 
                      imagepreviewview.cpp 
+                     imagepreviewbar.cpp 
                      kdateedit.cpp 
                      kdatetimeedit.cpp 
                      kdatepickerpopup.cpp 
@@ -205,10 +207,6 @@
                      timelineview.cpp
                      timelinewidget.cpp
                      welcomepageview.cpp 
-
-                     # obsolete QT3 classes
-                     folderitem.cpp 
-                     folderview.cpp 
     )
 
 KDE4_ADD_UI_FILES(digikam_bin_SRCS ../libs/dialogs/deletedialogbase.ui)
--- trunk/extragear/graphics/digikam/digikam/albumiconview.cpp #787019:787020
@@ -8,7 +8,7 @@
  * 
  * Copyright (C) 2002-2005 by Renchi Raju <renchi at pooh.tam.uiuc.edu>
  * Copyright (C) 2002-2008 by Gilles Caulier <caulier dot gilles at gmail dot com>
- * Copyright (C) 2006-2007 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
+ * Copyright (C) 2006-2008 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
  *
  * This program is free software; you can redistribute it
  * and/or modify it under the terms of the GNU General
@@ -1686,17 +1686,15 @@
     return itemList;
 }
 
-ImageInfoList AlbumIconView::allImageInfos() const
+ImageInfoList AlbumIconView::allImageInfos(bool currentInFirst) const
 {
-    // Returns the list of ImageInfos of all items,
-    // with the extra feature that the currentItem is the first in the list.
     ImageInfoList list;
     for (IconItem *it = firstItem(); it; it = it->nextItem())
     {
         AlbumIconItem *iconItem = static_cast<AlbumIconItem *>(it);
         ImageInfo info = iconItem->imageInfo();
 
-        if (iconItem == currentItem())
+        if (iconItem == currentItem() && currentInFirst)
             list.prepend(info);
         else
             list.append(info);
--- trunk/extragear/graphics/digikam/digikam/albumiconview.h #787019:787020
@@ -8,7 +8,7 @@
  * 
  * Copyright (C) 2002-2005 by Renchi Raju <renchi at pooh.tam.uiuc.edu>
  * Copyright (C) 2002-2008 by Gilles Caulier <caulier dot gilles at gmail dot com>
- * Copyright (C) 2006-2007 by Marcel Wiesweg <marcel.wiesweg at gmx.de>
+ * Copyright (C) 2006-2008 by Marcel Wiesweg <marcel.wiesweg at gmx.de>
  *
  * This program is free software; you can redistribute it
  * and/or modify it under the terms of the GNU General
@@ -91,7 +91,10 @@
     KUrl::List allItems();
     KUrl::List selectedItems();
 
-    ImageInfoList allImageInfos() const;
+    /** Returns the list of ImageInfos of all items,
+    with the extra feature that the currentItem is the first in the list
+    if 'currentInFirst' is true. */
+    ImageInfoList allImageInfos(bool currentInFirst=true) const;
     ImageInfoList selectedImageInfos() const;
 
     void refresh();
--- trunk/extragear/graphics/digikam/digikam/albumwidgetstack.cpp #787019:787020
@@ -7,7 +7,7 @@
  * Description : A widget stack to embedded album content view
  *               or the current image preview.
  *
- * Copyright (C) 2006-2007 by Gilles Caulier <caulier dot gilles at gmail dot com>
+ * Copyright (C) 2006-2008 by Gilles Caulier <caulier dot gilles at gmail dot com>
  *
  * This program is free software; you can redistribute it
  * and/or modify it under the terms of the GNU General
@@ -25,17 +25,24 @@
 // Qt includes.
 
 #include <QFileInfo>
+#include <QSplitter>
+#include <QWidget>
 
 // KDE includes.
 
 #include <kurl.h>
+#include <kconfiggroup.h>
+#include <kconfig.h>
 #include <khtmlview.h>
+#include <kglobal.h>
+#include <kapplication.h>
 
 // Local includes.
 
 #include "albumsettings.h"
 #include "albumiconview.h"
 #include "imagepreviewview.h"
+#include "imagepreviewbar.h"
 #include "welcomepageview.h"
 #include "mediaplayerview.h"
 #include "albumwidgetstack.h"
@@ -55,8 +62,14 @@
         imagePreviewView = 0;
         welcomePageView  = 0;
         mediaPlayerView  = 0;
+        splitter         = 0;
+        thumbBar         = 0;
     }
 
+    QSplitter        *splitter;
+
+    ImagePreviewBar  *thumbBar;
+
     AlbumIconView    *albumIconView;
 
     ImagePreviewView *imagePreviewView;
@@ -72,18 +85,33 @@
     d = new AlbumWidgetStackPriv;
 
     d->albumIconView    = new AlbumIconView(this);
-    d->imagePreviewView = new ImagePreviewView(this);
+
+    d->splitter         = new QSplitter(Qt::Vertical, this);
+    d->imagePreviewView = new ImagePreviewView(d->splitter, this);
+    d->thumbBar         = new ImagePreviewBar(d->splitter, Qt::Horizontal);
+
+    // To prevent flicker effect with content when user change icon view filter 
+    // if scrollbar appears or disapears.
+    d->thumbBar->setHScrollBarMode(Q3ScrollView::AlwaysOn);
+
+    d->splitter->setFrameStyle( QFrame::NoFrame );
+    d->splitter->setFrameShadow( QFrame::Plain );
+    d->splitter->setFrameShape( QFrame::NoFrame );
+    d->splitter->setOpaqueResize(false);
+
     d->welcomePageView  = new WelcomePageView(this);
     d->mediaPlayerView  = new MediaPlayerView(this);
 
     insertWidget(PreviewAlbumMode, d->albumIconView);
-    insertWidget(PreviewImageMode, d->imagePreviewView);
+    insertWidget(PreviewImageMode, d->splitter);
     insertWidget(WelcomePageMode,  d->welcomePageView->view());
     insertWidget(MediaPlayerMode,  d->mediaPlayerView);
 
     setPreviewMode(PreviewAlbumMode);
     setAttribute(Qt::WA_DeleteOnClose);
 
+    readSettings();
+
     // -----------------------------------------------------------------
 
     connect(d->imagePreviewView, SIGNAL(signalNextItem()),
@@ -109,13 +137,40 @@
 
     connect(d->imagePreviewView, SIGNAL(signalInsert2LightTable()),
             this, SIGNAL(signalInsert2LightTable()));
+
+    connect(d->albumIconView, SIGNAL(signalItemsAdded()),
+            this, SLOT(slotItemsAdded()));
+
+    connect(d->thumbBar, SIGNAL(signalUrlSelected(const KUrl&)),
+            this, SIGNAL(signalUrlSelected(const KUrl&)));
 }
 
 AlbumWidgetStack::~AlbumWidgetStack()
 {
+    saveSettings();
     delete d;
 }
 
+void AlbumWidgetStack::readSettings()
+{
+    KSharedConfig::Ptr config = KGlobal::config();
+    KConfigGroup group        = config->group("PreviewView");
+    if (group.hasKey("SplitterState")) 
+    {
+        QByteArray state;
+        state = group.readEntry("SplitterState", state);
+        d->splitter->restoreState(QByteArray::fromBase64(state));
+    }
+}
+
+void AlbumWidgetStack::saveSettings()
+{
+    KSharedConfig::Ptr config = KGlobal::config();
+    KConfigGroup group        = config->group("PreviewView");
+    group.writeEntry("SplitterState", d->splitter->saveState().toBase64());
+    config->sync();
+}
+
 void AlbumWidgetStack::slotEscapePreview()
 {
     if (previewMode() == MediaPlayerMode)
@@ -142,6 +197,11 @@
         {
             d->imagePreviewView->setImageInfo();
         }
+
+        // Special case to cleanup thumbbar if Image Lister do not query item accordingly to 
+        // IconView Filters.
+        if (d->albumIconView->allImageInfos().isEmpty())
+            d->thumbBar->clear();
     }
     else
     {
@@ -168,6 +228,11 @@
             // because we will receive a signal for that when the image preview will be loaded.
             // This will prevent a flicker effect with the old image preview loaded in stack.
         }
+
+        ThumbBarItem* item = d->thumbBar->findItemByUrl(info.fileUrl());
+        d->thumbBar->blockSignals(true);
+        d->thumbBar->setSelected(item);
+        d->thumbBar->blockSignals(false);
     }
 }
 
@@ -184,7 +249,7 @@
 
     if (mode == PreviewAlbumMode || mode == WelcomePageMode)
     {
-        d->albumIconView->setFocus();   
+        d->albumIconView->setFocus();
         setPreviewItem();
         setCurrentIndex(mode);
         emit signalToggledToPreviewMode(false);
@@ -206,7 +271,7 @@
         emit signalZoomFactorChanged(z);
 }
 
-void AlbumWidgetStack::slotItemsUpdated(const KUrl::List& list)
+void AlbumWidgetStack::slotItemsUpdated(const KUrl::List& urls)
 {
     // If item are updated from Icon View, and if we are in Preview Mode,
     // We will check if the current item preview need to be reloaded.
@@ -216,10 +281,29 @@
         previewMode() == AlbumWidgetStack::MediaPlayerMode)    // What we can do with media player ?
         return;
 
-    if (list.contains(imagePreviewView()->getImageInfo().fileUrl()))
+    if (urls.contains(imagePreviewView()->getImageInfo().fileUrl()))
         d->imagePreviewView->reload();
+
+    for (KUrl::List::const_iterator it = urls.begin();
+         it != urls.end(); ++it)
+    {
+        ThumbBarItem* foundItem = d->thumbBar->findItemByUrl(*it);
+        d->thumbBar->invalidateThumb(foundItem);
+    }
 }
 
+void AlbumWidgetStack::slotItemsAdded()
+{
+    d->thumbBar->clear();
+
+    ImageInfoList list = d->albumIconView->allImageInfos(false);
+    for (ImageInfoList::const_iterator it = list.begin();
+         it != list.end(); ++it)
+    {
+        new ImagePreviewBarItem(d->thumbBar, *it);
+    }
+}
+
 void AlbumWidgetStack::increaseZoom()
 {
     d->imagePreviewView->slotIncreaseZoom();
--- trunk/extragear/graphics/digikam/digikam/albumwidgetstack.h #787019:787020
@@ -7,7 +7,7 @@
  * Description : A widget stack to embedded album content view
  *               or the current image preview.
  *
- * Copyright (C) 2006-2007 by Gilles Caulier <caulier dot gilles at gmail dot com>
+ * Copyright (C) 2006-2008 by Gilles Caulier <caulier dot gilles at gmail dot com>
  *
  * This program is free software; you can redistribute it
  * and/or modify it under the terms of the GNU General
@@ -25,19 +25,21 @@
 #ifndef ALBUMWIDGETSTACK_H
 #define ALBUMWIDGETSTACK_H
 
-// KDE includes.
+// Qt includes.
 
 #include <QStackedWidget>
 #include <QByteArray>
 #include <QString>
 
+// KDE includes.
+
+#include <kurl.h>
+
 // Local includes
 
 #include "digikam_export.h"
 #include "imageinfo.h"
 
-class KUrl::List;
-
 namespace Digikam
 {
 
@@ -96,6 +98,7 @@
     void signalSlideShow();
     void signalZoomFactorChanged(double);
     void signalInsert2LightTable();
+    void signalUrlSelected(const KUrl&);
 
 public slots:
 
@@ -105,9 +108,15 @@
 private slots: 
 
     void slotZoomFactorChanged(double);
+    void slotItemsAdded();
 
 private:
 
+    void readSettings();
+    void saveSettings();
+
+private:
+
     AlbumWidgetStackPriv* d;
 };
 
--- trunk/extragear/graphics/digikam/digikam/digikamview.cpp #787019:787020
@@ -459,6 +459,10 @@
     connect(d->albumWidgetStack, SIGNAL(signalInsert2LightTable()),
             this, SLOT(slotImageLightTable()));
 
+    connect(d->albumWidgetStack, SIGNAL(signalUrlSelected(const KUrl&)),
+            this, SLOT(slotSelectItemByUrl(const KUrl&)));
+
+
     // -- Selection timer ---------------
 
     connect(d->selectionTimer, SIGNAL(timeout()),
@@ -510,7 +514,7 @@
     d->rightSideBar->backup();
 }
 
-void DigikamView::slotFirstItem(void)
+void DigikamView::slotFirstItem()
 {
     AlbumIconItem *currItem = dynamic_cast<AlbumIconItem*>(d->iconView->firstItem());
     d->iconView->clearSelection();
@@ -519,7 +523,7 @@
        d->iconView->setCurrentItem(currItem);
 }
 
-void DigikamView::slotPrevItem(void)
+void DigikamView::slotPrevItem()
 {
     AlbumIconItem *currItem = dynamic_cast<AlbumIconItem*>(d->iconView->currentItem());
     if (currItem)
@@ -533,7 +537,7 @@
     }
 }
 
-void DigikamView::slotNextItem(void)
+void DigikamView::slotNextItem()
 {
     AlbumIconItem *currItem = dynamic_cast<AlbumIconItem*>(d->iconView->currentItem());
     if (currItem)
@@ -547,7 +551,7 @@
     }
 }
 
-void DigikamView::slotLastItem(void)
+void DigikamView::slotLastItem()
 {
     AlbumIconItem *currItem = dynamic_cast<AlbumIconItem*>(d->iconView->lastItem());
     d->iconView->clearSelection();
@@ -556,6 +560,15 @@
        d->iconView->setCurrentItem(currItem);
 }
 
+void DigikamView::slotSelectItemByUrl(const KUrl& url)
+{
+    AlbumIconItem *currItem = dynamic_cast<AlbumIconItem*>(d->iconView->findItem(url.url()));
+    d->iconView->clearSelection();
+    d->iconView->updateContents();
+    if (currItem)
+       d->iconView->setCurrentItem(currItem);
+}
+
 void DigikamView::slotAllAlbumsLoaded()
 {
     disconnect(d->albumManager, SIGNAL(signalAllAlbumsLoaded()),
--- trunk/extragear/graphics/digikam/digikam/digikamview.h #787019:787020
@@ -173,10 +173,11 @@
 
     void slotLeftSidebarChangedTab(QWidget* w);
 
-    void slotFirstItem(void);
-    void slotPrevItem(void);
-    void slotNextItem(void);
-    void slotLastItem(void);
+    void slotFirstItem();
+    void slotPrevItem();
+    void slotNextItem();
+    void slotLastItem();
+    void slotSelectItemByUrl(const KUrl&);
 
     void slotToggledToPreviewMode(bool);
     void slotEscapePreview();
** trunk/extragear/graphics/digikam/digikam/imagepreviewbar.cpp #property svn:eol-style
   + native
** trunk/extragear/graphics/digikam/digikam/imagepreviewbar.h #property svn:eol-style
   + native
--- trunk/extragear/graphics/digikam/digikam/imagepreviewview.cpp #787019:787020
@@ -87,7 +87,7 @@
         cornerButton         = 0;
         previewThread        = 0;
         previewPreloadThread = 0;
-        parent               = 0;
+        stack                = 0;
         hasPrev              = false;
         hasNext              = false;
         loadFullImageSize    = false;
@@ -120,14 +120,14 @@
     PreviewLoadThread *previewThread;
     PreviewLoadThread *previewPreloadThread;
 
-    AlbumWidgetStack  *parent;
+    AlbumWidgetStack  *stack;
 };
 
-ImagePreviewView::ImagePreviewView(AlbumWidgetStack *parent)
+ImagePreviewView::ImagePreviewView(QWidget *parent, AlbumWidgetStack *stack)
                 : PreviewWidget(parent)
 {
     d = new ImagePreviewViewPriv;
-    d->parent = parent;
+    d->stack = stack;
 
     // get preview size from screen size, but limit from VGA to WQXGA
     d->previewSize = qMax(KApplication::desktop()->height(),
@@ -251,7 +251,7 @@
 
     if (preview.isNull())
     {
-        d->parent->setPreviewMode(AlbumWidgetStack::PreviewImageMode);
+        d->stack->setPreviewMode(AlbumWidgetStack::PreviewImageMode);
         QPixmap pix(visibleWidth(), visibleHeight());
         pix.fill(ThemeEngine::instance()->baseColor());
         QPainter p(&pix);
@@ -264,7 +264,7 @@
         p.end();
         // three copies - but the image is small
         setImage(DImg(pix.toImage()));
-        d->parent->previewLoaded();
+        d->stack->previewLoaded();
         emit signalPreviewLoaded(false);
     }
     else
@@ -272,9 +272,9 @@
         DImg img(preview);
         if (AlbumSettings::instance()->getExifRotate())
             d->previewThread->exifRotate(img, description.filePath);
-        d->parent->setPreviewMode(AlbumWidgetStack::PreviewImageMode);
+        d->stack->setPreviewMode(AlbumWidgetStack::PreviewImageMode);
         setImage(img);
-        d->parent->previewLoaded();
+        d->stack->previewLoaded();
         emit signalPreviewLoaded(true);
     }
 
--- trunk/extragear/graphics/digikam/digikam/imagepreviewview.h #787019:787020
@@ -53,7 +53,7 @@
 
 public:
 
-    ImagePreviewView(AlbumWidgetStack *parent=0);
+    ImagePreviewView(QWidget *parent, AlbumWidgetStack *stack);
     ~ImagePreviewView();
 
     void setLoadFullImageSize(bool b);



More information about the Digikam-devel mailing list