[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: extragear/graphics/kphotoalbum
From: Jesper Pedersen <blackie () blackie ! dk>
Date: 2010-08-19 11:55:28
Message-ID: 20100819115528.E5852AC855 () svn ! kde ! org
[Download RAW message or body]
SVN commit 1165443 by blackie:
Rebuilding all thumbnails no longer block the UI. Instead a progress bar is
shown in the progress bar.
Also when the app starts up, missing thumbnails are requested.
Finally, when the grid is resized, all thumbnails are regenerated \
automatically.
M +2 -0 DB/NewImageFinder.cpp
M +68 -0 MainWindow/StatusBar.cpp
M +37 -1 MainWindow/StatusBar.h
M +12 -9 MainWindow/Window.cpp
M +2 -0 ThumbnailView/GridResizeInteraction.cpp
M +58 -37 ThumbnailView/ThumbnailBuilder.cpp
M +21 -4 ThumbnailView/ThumbnailBuilder.h
M +0 -1 ThumbnailView/ThumbnailModel.cpp
--- trunk/extragear/graphics/kphotoalbum/DB/NewImageFinder.cpp \
#1165442:1165443 @@ -16,6 +16,7 @@
Boston, MA 02110-1301, USA.
*/
#include "NewImageFinder.h"
+#include "ThumbnailView/ThumbnailBuilder.h"
#include "FastDir.h"
#include "ImageManager/ThumbnailCache.h"
@@ -63,6 +64,7 @@
searchForNewFiles( loadedFiles, \
Settings::SettingsData::instance()->imageDirectory() ); loadExtraFiles();
+ ThumbnailView::ThumbnailBuilder::instance()->buildMissing();
// To avoid deciding if the new images are shown in a given thumbnail \
view or in a given search // we rather just go to home.
return (!_pendingLoad.isEmpty()); // returns if new images was found.
--- trunk/extragear/graphics/kphotoalbum/MainWindow/StatusBar.cpp \
#1165442:1165443 @@ -1,4 +1,24 @@
+/* Copyright (C) 2003-2010 Jesper K. Pedersen <blackie@kde.org>
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
#include "StatusBar.h"
+#include <QToolButton>
+#include <QTimer>
+#include <QProgressBar>
#include "DB/ImageDB.h"
#include "ImageCounter.h"
#include "Settings/SettingsData.h"
@@ -6,12 +26,16 @@
#include "DirtyIndicator.h"
#include <KHBox>
#include <kiconloader.h>
+#include <KIcon>
MainWindow::StatusBar::StatusBar()
: KStatusBar()
{
setupFixedFonts();
setupGUI();
+ m_pendingShowTimer = new QTimer(this);
+ m_pendingShowTimer->setSingleShot( true );
+ connect( m_pendingShowTimer, SIGNAL( timeout() ), this, SLOT( \
showStatusBar() ) ); }
void MainWindow::StatusBar::setupFixedFonts()
@@ -31,6 +55,16 @@
connect( DB::ImageDB::instance(), SIGNAL( dirty() ), _dirtyIndicator, \
SLOT( markDirtySlot() ) );
+ m_progressBar = new QProgressBar( this );
+ m_progressBar->setMinimumWidth( 400 );
+ addPermanentWidget( m_progressBar, 0 );
+
+ m_cancel = new QToolButton( this );
+ m_cancel->setIcon( KIcon( QString::fromLatin1( "dialog-close" ) ) );
+ addPermanentWidget( m_cancel, 0 );
+ connect( m_cancel, SIGNAL( clicked() ), this, SIGNAL( cancelRequest() \
) ); + connect( m_cancel, SIGNAL( clicked() ), this, SLOT( \
hideStatusBar() ) ); +
_lockedIndicator = new QLabel( indicators );
addPermanentWidget( indicators, 0 );
@@ -45,6 +79,8 @@
_pathIndicator = new BreadcrumbViewer;
addWidget( _pathIndicator, 1 );
+
+ setStatusBarVisible( false );
}
void MainWindow::StatusBar::setLocked( bool locked )
@@ -58,3 +94,35 @@
_lockedIndicator->setPixmap( QPixmap() );
}
+
+void MainWindow::StatusBar::startProgress( const QString& text, int total \
) +{
+ m_progressBar->setFormat( text + QString::fromLatin1( ": %p%" ) );
+ m_progressBar->setMaximum( total );
+ m_progressBar->setValue(0);
+ m_pendingShowTimer->start( 2000 ); // To avoid flicker we will only \
show the statusbar after 2 seconds. +}
+
+void MainWindow::StatusBar::setProgress( int progress )
+{
+ m_progressBar->setValue( progress );
+ if ( progress == m_progressBar->maximum() )
+ hideStatusBar();
+}
+
+void MainWindow::StatusBar::setStatusBarVisible( bool show )
+{
+ m_progressBar->setVisible(show);
+ m_cancel->setVisible(show);
+}
+
+void MainWindow::StatusBar::hideStatusBar()
+{
+ setStatusBarVisible( false );
+ m_pendingShowTimer->stop();
+}
+
+void MainWindow::StatusBar::showStatusBar()
+{
+ setStatusBarVisible( true );
+}
--- trunk/extragear/graphics/kphotoalbum/MainWindow/StatusBar.h \
#1165442:1165443 @@ -1,3 +1,20 @@
+/* Copyright (C) 2003-2010 Jesper K. Pedersen <blackie@kde.org>
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; see the file COPYING. If not, write to
+ the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA.
+*/
#ifndef STATUSBAR_H
#define STATUSBAR_H
#include "BreadcrumbViewer.h"
@@ -2,2 +19,5 @@
#include <KStatusBar>
+class QToolButton;
+class QTimer;
+class QProgressBar;
class QLabel;
@@ -10,6 +30,7 @@
class StatusBar :public KStatusBar
{
+ Q_OBJECT
public:
StatusBar();
DirtyIndicator* _dirtyIndicator;
@@ -17,11 +38,26 @@
BreadcrumbViewer* _pathIndicator;
void setLocked( bool locked );
+ void startProgress( const QString& text, int total );
+ void setProgress( int progress );
+signals:
+ void cancelRequest();
+
+private slots:
+ void hideStatusBar();
+ void showStatusBar();
+
private:
- QLabel* _lockedIndicator;
void setupFixedFonts();
void setupGUI();
+ void setStatusBarVisible( bool );
+ void setPendingShow();
+
+ QLabel* _lockedIndicator;
+ QProgressBar* m_progressBar;
+ QToolButton* m_cancel;
+ QTimer* m_pendingShowTimer;
};
}
--- trunk/extragear/graphics/kphotoalbum/MainWindow/Window.cpp \
#1165442:1165443 @@ -207,6 +207,9 @@
// Automatically save toolbar settings
setAutoSaveSettings();
+
+ new ThumbnailView::ThumbnailBuilder( _statusBar, this );
+ ThumbnailView::ThumbnailBuilder::instance()->buildMissing();
}
MainWindow::Window::~Window()
@@ -457,11 +460,11 @@
void MainWindow::Window::slotSave()
{
Utilities::ShowBusyCursor dummy;
- statusBar()->showMessage(i18n("Saving..."), 5000 );
+ _statusBar->showMessage(i18n("Saving..."), 5000 );
DB::ImageDB::instance()->save( \
Settings::SettingsData::instance()->imageDirectory() + \
QString::fromLatin1("index.xml"), false ); \
_statusBar->_dirtyIndicator->saved();
QDir().remove( Settings::SettingsData::instance()->imageDirectory() + \
QString::fromLatin1(".#index.xml") );
- statusBar()->showMessage(i18n("Saving... Done"), 5000 );
+ _statusBar->showMessage(i18n("Saving... Done"), 5000 );
}
void MainWindow::Window::slotDeleteSelected()
@@ -931,9 +934,9 @@
{
if ( _statusBar->_dirtyIndicator->isAutoSaveDirty() ) {
Utilities::ShowBusyCursor dummy;
- statusBar()->showMessage(i18n("Auto saving...."));
+ _statusBar->showMessage(i18n("Auto saving...."));
DB::ImageDB::instance()->save( \
Settings::SettingsData::instance()->imageDirectory() + \
QString::fromLatin1(".#index.xml"), true );
- statusBar()->showMessage(i18n("Auto saving.... Done"), 5000);
+ _statusBar->showMessage(i18n("Auto saving.... Done"), 5000);
_statusBar->_dirtyIndicator->autoSaved();
}
}
@@ -949,7 +952,7 @@
void MainWindow::Window::showBrowser()
{
- statusBar()->clearMessage();
+ _statusBar->clearMessage();
_stack->raiseWidget( _browser );
_browser->setFocus();
updateStates( false );
@@ -1214,9 +1217,9 @@
void MainWindow::Window::slotSetFileName( const DB::ResultId& id )
{
if ( id.isNull() )
- statusBar()->clearMessage();
+ _statusBar->clearMessage();
else
- statusBar()->showMessage( \
id.fetchInfo()->fileName(DB::AbsolutePath), 4000 ); + \
_statusBar->showMessage( id.fetchInfo()->fileName(DB::AbsolutePath), 4000 \
); }
void MainWindow::Window::updateContextMenuFromSelectionSize(int \
selectionSize) @@ -1576,7 +1579,7 @@
void MainWindow::Window::showDateBarTip( const QString& msg )
{
- statusBar()->showMessage( msg, 3000 );
+ _statusBar->showMessage( msg, 3000 );
}
void MainWindow::Window::slotJumpToContext()
@@ -1694,7 +1697,7 @@
void MainWindow::Window::slotBuildThumbnails()
{
- new ThumbnailView::ThumbnailBuilder( this );
+ ThumbnailView::ThumbnailBuilder::instance()->buildAll();
}
void MainWindow::Window::slotOrderIncr()
--- trunk/extragear/graphics/kphotoalbum/ThumbnailView/GridResizeInteraction.cpp \
#1165442:1165443 @@ -16,6 +16,7 @@
Boston, MA 02110-1301, USA.
*/
#include "GridResizeInteraction.h"
+#include "ThumbnailBuilder.h"
#include "ImageManager/ThumbnailCache.h"
#include "CellGeometry.h"
#include "ThumbnailModel.h"
@@ -72,6 +73,7 @@
ImageManager::ThumbnailCache::instance()->flush();
model()->updateVisibleRowInfo();
widget()->setCurrentIndex( model()->index( m_currentRow, 0 ) );
+ ThumbnailBuilder::instance()->buildAll();
}
void ThumbnailView::GridResizeInteraction::enterGridReziingMode()
--- trunk/extragear/graphics/kphotoalbum/ThumbnailView/ThumbnailBuilder.cpp \
#1165442:1165443 @@ -15,55 +15,29 @@
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA.
*/
-/* Copyright (C) 2003-2009 Jesper K. Pedersen <blackie@kde.org>
- This program is free software; you can redistribute it and/or
- modify it under the terms of the GNU General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; see the file COPYING. If not, write to
- the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA.
-*/
-
#include <KLocale>
#include "ThumbnailBuilder.h"
+#include "ImageManager/ThumbnailCache.h"
+#include "MainWindow/StatusBar.h"
#include "CellGeometry.h"
#include "ImageManager/Manager.h"
#include "DB/ImageDB.h"
#include "DB/ResultId.h"
-ThumbnailView::ThumbnailBuilder::ThumbnailBuilder( QWidget* parent )
- :QProgressDialog( parent )
+ThumbnailView::ThumbnailBuilder* \
ThumbnailView::ThumbnailBuilder::m_instance = 0; +
+ThumbnailView::ThumbnailBuilder::ThumbnailBuilder( MainWindow::StatusBar* \
statusBar, QObject* parent ) + :QObject( parent ), m_statusBar( \
statusBar ), m_isBuilding( false ) {
- const DB::Result images = DB::ImageDB::instance()->images();
- setMaximum( qMax( images.size() - 1, 0 ) );
- setLabelText( i18n("Generating thumbnails") );
-
- connect( this, SIGNAL( canceled() ), this, SLOT( slotCancelRequests() \
) );
-
- Q_FOREACH(const DB::ImageInfoPtr info, images.fetchInfos()) {
- ImageManager::ImageRequest* request
- = new ImageManager::ImageRequest( \
info->fileName(DB::AbsolutePath),
- \
CellGeometry::preferredIconSize(), info->angle(),
- this );
- request->setIsThumbnailRequest(true);
- request->setPriority( ImageManager::BuildThumbnails );
- ImageManager::Manager::instance()->load( request );
+ connect( m_statusBar, SIGNAL( cancelRequest() ), this, SLOT( \
cancelRequests() ) ); + m_instance = this;
}
-}
-void ThumbnailView::ThumbnailBuilder::slotCancelRequests()
+void ThumbnailView::ThumbnailBuilder::cancelRequests()
{
ImageManager::Manager::instance()->stop( this, ImageManager::StopAll \
);
- setValue( maximum() );
+ m_isBuilding = false;
}
void ThumbnailView::ThumbnailBuilder::pixmapLoaded( const QString& \
fileName, const QSize& size, const QSize& fullSize, int, const QImage&, \
const bool loadedOK) @@ -74,7 +48,54 @@
DB::ImageInfoPtr info = DB::ImageDB::instance()->info( fileName, \
DB::AbsolutePath ); info->setSize( fullSize );
}
- setValue( value() + 1 );
+ m_statusBar->setProgress( ++m_count );
}
+void ThumbnailView::ThumbnailBuilder::buildAll()
+{
+ const DB::Result images = DB::ImageDB::instance()->images();
+ build( images.fetchInfos() );
+}
+
+ThumbnailView::ThumbnailBuilder* \
ThumbnailView::ThumbnailBuilder::instance() +{
+ Q_ASSERT( m_instance );
+ return m_instance;
+}
+
+void ThumbnailView::ThumbnailBuilder::buildMissing()
+{
+ const DB::Result images = DB::ImageDB::instance()->images();
+ const QList<DB::ImageInfoPtr> list = images.fetchInfos();
+ QList<DB::ImageInfoPtr> needed;
+ Q_FOREACH( const DB::ImageInfoPtr& info, list ) {
+ if ( ! ImageManager::ThumbnailCache::instance()->contains( \
info->fileName(DB::AbsolutePath) ) ) + needed.append( info );
+ }
+ build( needed );
+}
+
+void ThumbnailView::ThumbnailBuilder::build( const \
QList<DB::ImageInfoPtr>& list ) +{
+ if ( m_isBuilding )
+ cancelRequests();
+
+ if ( list.count() == 0 )
+ return;
+
+ m_isBuilding = true;
+ m_statusBar->startProgress( i18n("Building thumbnails"), qMax( \
list.size() - 1, 1 ) ); +
+ Q_FOREACH(const DB::ImageInfoPtr info, list) {
+ ImageManager::ImageRequest* request
+ = new ImageManager::ImageRequest( \
info->fileName(DB::AbsolutePath), + \
CellGeometry::preferredIconSize(), info->angle(), + \
this ); + request->setIsThumbnailRequest(true);
+ request->setPriority( ImageManager::BuildThumbnails );
+ ImageManager::Manager::instance()->load( request );
+ }
+ m_count = 0;
+}
+
#include "ThumbnailBuilder.moc"
--- trunk/extragear/graphics/kphotoalbum/ThumbnailView/ThumbnailBuilder.h \
#1165442:1165443 @@ -19,23 +19,40 @@
#ifndef THUMBNAILBUILDER_H
#define THUMBNAILBUILDER_H
+#include <QList>
#include <QProgressDialog>
#include <QImage>
#include "ImageManager/ImageClient.h"
+#include "DB/ImageInfoPtr.h"
+namespace MainWindow { class StatusBar; }
+namespace MainWindow { class Window; }
+
namespace ThumbnailView
{
-class ThumbnailBuilder :public QProgressDialog, public \
ImageManager::ImageClient { +class ThumbnailBuilder :public QObject, public \
ImageManager::ImageClient { Q_OBJECT
public:
- ThumbnailBuilder( QWidget* parent );
- virtual void pixmapLoaded( const QString& fileName, const QSize& size, \
const QSize& fullSize, int angle, const QImage&, const bool loadedOK); + \
static ThumbnailBuilder* instance(); + void buildAll();
+ void buildMissing();
+ OVERRIDE void pixmapLoaded( const QString& fileName, const QSize& \
size, const QSize& fullSize, int angle, const QImage&, const bool \
loadedOK); +
public slots:
- void slotCancelRequests();
+ void cancelRequests();
+ void build( const QList<DB::ImageInfoPtr>& list );
+
+private:
+ friend class MainWindow::Window;
+ static ThumbnailBuilder* m_instance;
+ ThumbnailBuilder( MainWindow::StatusBar* statusBar, QObject* parent );
+ MainWindow::StatusBar* m_statusBar;
+ int m_count;
+ bool m_isBuilding;
};
}
--- trunk/extragear/graphics/kphotoalbum/ThumbnailView/ThumbnailModel.cpp \
#1165442:1165443 @@ -16,7 +16,6 @@
Boston, MA 02110-1301, USA.
*/
#include "ThumbnailModel.h"
-#include <QPixmapCache>
#include <QDebug>
#include "CellGeometry.h"
#include <QPainter>
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic