[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