[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