Index: CMakeLists.txt
===================================================================
--- CMakeLists.txt	(révision 1158462)
+++ CMakeLists.txt	(copie de travail)
@@ -1305,6 +1305,7 @@
         ${CMAKE_CURRENT_SOURCE_DIR}/digikam/searchmodificationhelper.cpp
         ${CMAKE_CURRENT_SOURCE_DIR}/digikam/welcomepageview.cpp
         ${CMAKE_CURRENT_SOURCE_DIR}/digikam/databaseguierrorhandler.cpp
+        ${CMAKE_CURRENT_SOURCE_DIR}/digikam/navigationbar.cpp
        )
 
     SET(libdigikamhelpers_SRCS
Index: digikam/digikamview.cpp
===================================================================
--- digikam/digikamview.cpp	(révision 1158462)
+++ digikam/digikamview.cpp	(copie de travail)
@@ -419,14 +419,67 @@
             d->iconView->imageFilterModel(),
             SLOT(setTagFilter(const QList<int>&, ImageFilterSettings::MatchingCondition, bool)));
 
-    // -- Preview image widget Connections ------------------------
+    // -- Navigation & actions bar Connections ------------------------
 
-    connect(d->albumWidgetStack, SIGNAL(signalNextItem()),
-            this, SLOT(slotNextItem()));
+    connect(d->albumWidgetStack, SIGNAL(signalFirstItem()),
+            this, SLOT(slotFirstItem()));
 
     connect(d->albumWidgetStack, SIGNAL(signalPrevItem()),
             this, SLOT(slotPrevItem()));
 
+    connect(d->albumWidgetStack, SIGNAL(signalNextItem()),
+            this, SLOT(slotNextItem()));
+
+    connect(d->albumWidgetStack, SIGNAL(signalLastItem()),
+            this, SLOT(slotLastItem()));
+
+    connect(d->albumWidgetStack, SIGNAL(signalPreviewRequestedCurrent()),
+            this, SLOT(slotImagePreview()));
+
+    connect(this, SIGNAL(signalImageSelected(const ImageInfoList&, bool, bool, const ImageInfoList&)),
+            d->albumWidgetStack, SIGNAL(signalImageSelected(const ImageInfoList&, bool, bool, const ImageInfoList&)));
+
+    connect(this, SIGNAL(signalSelectionChanged(int)),
+            d->albumWidgetStack, SIGNAL(signalSelectionChanged(int)));
+
+    connect(d->albumWidgetStack, SIGNAL(signalSlideShowAll()),
+            this, SLOT(slotSlideShowAll()));
+
+    connect(d->albumWidgetStack, SIGNAL(signalSlideShowSelection()),
+            this, SLOT(slotSlideShowSelection()));
+
+    connect(d->albumWidgetStack, SIGNAL(signalSlideShowRecursive()),
+            this, SLOT(slotSlideShowRecursive()));
+
+    connect(d->albumWidgetStack, SIGNAL(signalZoomIn()),
+            this, SLOT(slotZoomIn()));
+
+    connect(d->albumWidgetStack, SIGNAL(signalZoomOut()),
+            this, SLOT(slotZoomOut()));
+
+    connect(d->albumWidgetStack, SIGNAL(signalZoomTo100Percents()),
+            this, SLOT(slotZoomTo100Percents()));
+
+    connect(d->albumWidgetStack, SIGNAL(signalFitToWindow()),
+            this, SLOT(slotFitToWindow()));
+
+    connect(d->albumWidgetStack, SIGNAL(signalZoomSliderChanged(int)),
+            this, SIGNAL(signalZoomSliderChanged(int)));
+
+    connect(d->albumWidgetStack, SIGNAL(signalZoomValueEdited(double)),
+            this, SLOT(setZoomFactor(double)));
+
+    connect(this, SIGNAL(signalWindowHasMoved()),
+            d->albumWidgetStack, SIGNAL(signalWindowHasMoved()));
+
+    connect(this, SIGNAL(signalThumbSizeChanged(int)),
+            d->albumWidgetStack, SIGNAL(signalThumbSizeChanged(int)));
+
+    connect(this, SIGNAL(signalZoomChanged(double)),
+            d->albumWidgetStack, SLOT(slotZoomChanged(double)));
+
+    // -- Preview image widget Connections ------------------------
+
     connect(d->albumWidgetStack, SIGNAL(signalEditItem()),
             this, SLOT(slotImageEdit()));
 
@@ -520,7 +573,7 @@
 
     connect(d->albumHistory, SIGNAL(signalSetSelectedUrls(KUrl::List)),
             d->iconView, SLOT(setSelectedUrls(KUrl::List)));
-            
+
     connect(d->albumManager, SIGNAL(signalAlbumDeleted(Album*)),
             d->albumHistory, SLOT(slotAlbumDeleted(Album*)));
 }
@@ -1053,7 +1106,7 @@
 
 void DigikamView::setZoomFactor(double zoom)
 {
-    d->albumWidgetStack->setZoomFactorSnapped(zoom);    
+    d->albumWidgetStack->setZoomFactorSnapped(zoom);
 }
 
 void DigikamView::slotZoomFactorChanged(double zoom)
Index: digikam/albumwidgetstack.h
===================================================================
--- digikam/albumwidgetstack.h	(révision 1158462)
+++ digikam/albumwidgetstack.h	(copie de travail)
@@ -41,12 +41,14 @@
 #include "digikam_export.h"
 #include "imageinfo.h"
 #include "thumbbardock.h"
+#include "albumiconviewfilter.h"
 
 namespace Digikam
 {
 
 class DigikamImageView;
 class ImagePreviewView;
+class ImageInfoList;
 class AlbumWidgetStackPriv;
 
 class AlbumWidgetStack : public QStackedWidget
@@ -99,8 +101,28 @@
 
 Q_SIGNALS:
 
+    void signalFirstItem();
+    void signalLastItem();
     void signalNextItem();
     void signalPrevItem();
+    void signalPreviewRequestedCurrent();
+    void signalSelectionChanged(int);
+    void signalImageSelected(const ImageInfoList&, bool, bool, const ImageInfoList&);
+    void signalPreviewChanged(const ImageInfo&);
+
+    void signalZoomSliderChanged(int);
+    void signalZoomValueEdited(double);
+    void signalWindowHasMoved();
+    void signalZoomIn();
+    void signalZoomOut();
+    void signalZoomTo100Percents();
+    void signalFitToWindow();
+    void signalThumbSizeChanged(int);
+    void signalZoomChanged(double zoom, double zmin, double zmax);
+
+    void signalSlideShowAll();
+    void signalSlideShowSelection();
+    void signalSlideShowRecursive();
     void signalEditItem();
     void signalDeleteItem();
     void signalToggledToPreviewMode(bool);
@@ -121,6 +143,8 @@
 
     void slotEscapePreview();
 
+    void slotZoomChanged(double zoom);
+
 private Q_SLOTS:
 
     void slotZoomFactorChanged(double);
Index: digikam/navigationbar.cpp
===================================================================
--- digikam/navigationbar.cpp	(révision 0)
+++ digikam/navigationbar.cpp	(révision 0)
@@ -0,0 +1,372 @@
+/* ============================================================
+ *
+ * This file is a part of digiKam project
+ * http://www.digikam.org
+ *
+ * Date        : 2010-08-02
+ * Description : Tool bar for navigation & most used actions.
+ *
+ * Copyright (C) 2010 by Luc Vieillescazes <luc at vieillescazes dot net>
+ *
+ * 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, 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.
+ *
+ * ============================================================ */
+
+// Qt includes
+
+#include <QGridLayout>
+#include <QHBoxLayout>
+
+// KDE includes
+
+#include <klocale.h>
+#include <kiconloader.h>
+#include <KPushButton>
+#include <KStandardAction>
+#include <KAction>
+#include <KMenu>
+
+// Local includes
+
+#include "albumiconviewfilter.h"
+#include "dzoombar.h"
+#include "imagethumbnailbar.h"
+#include "navigationbar.h"
+
+namespace Digikam
+{
+
+class NavigationBarPriv
+{
+
+public:
+
+    NavigationBarPriv()
+    {
+        firstImg                = 0;
+        prevImg                 = 0;
+        nextImg                 = 0;
+        lastImg                 = 0;
+        thumbBar                = 0;
+        backToAlbum             = 0;
+        showPreview             = 0;
+        deleteImgs              = 0;
+        rotateLeft              = 0;
+        rotateRight             = 0;
+        editImage               = 0;
+        slideShow               = 0;
+        slideShowMenu           = 0;
+        slideShowAll            = 0;
+        slideShowSelection      = 0;
+        slideShowRecursive      = 0;
+        filterBar               = 0;
+        zoomBar                 = 0;
+        zoomPlusAction          = 0;
+        zoomMinusAction         = 0;
+        zoomTo100percents       = 0;
+        zoomFitToWindowAction   = 0;
+        navLayout               = 0;
+        filterZoomLayout        = 0;
+        globalLayout            = 0;
+    }
+
+    // Navigation & Actions buttons
+    KPushButton*    firstImg;
+    KPushButton*    prevImg;
+    KPushButton*    nextImg;
+    KPushButton*    lastImg;
+    ImageThumbnailBar* thumbBar;
+    KPushButton*    backToAlbum;
+    KPushButton*    showPreview;
+    KPushButton*    deleteImgs;
+    KPushButton*    rotateLeft;
+    KPushButton*    rotateRight;
+    KPushButton*    editImage;
+    KPushButton*    slideShow;
+    KMenu*          slideShowMenu;
+    KAction*        slideShowAll;
+    KAction*        slideShowSelection;
+    KAction*        slideShowRecursive;
+
+    // Filter bar
+    AlbumIconViewFilter* filterBar;
+
+    // Zoom bar
+    DZoomBar*       zoomBar;
+    KAction*        zoomPlusAction;
+    KAction*        zoomMinusAction;
+    KAction*        zoomTo100percents;
+    KAction*        zoomFitToWindowAction;
+
+    // Layout
+    QHBoxLayout*    navLayout;
+    QHBoxLayout*    filterZoomLayout;
+    QGridLayout*    globalLayout;
+};
+
+NavigationBar::NavigationBar(ImageModel *thumbModel, ImageFilterModel *thumbFilterModel)
+                : QWidget(), d(new NavigationBarPriv)
+{
+    /**
+     * Navigation & Actions buttons
+     */
+    d->firstImg     = new KPushButton(KIcon("go-first"), i18nc("go to the first image", ""), this);
+    d->prevImg      = new KPushButton(KIcon("go-previous"), i18nc("go to previous image", ""), this);
+    d->nextImg      = new KPushButton(KIcon("go-next"), i18nc("go to next image", ""), this);
+    d->lastImg      = new KPushButton(KIcon("go-last"), i18nc("go to the last image", ""), this);
+
+    d->thumbBar     = new ImageThumbnailBar(this);
+    d->thumbBar->setModels(thumbModel, thumbFilterModel);
+    d->thumbBar->setMinimumHeight(110);
+
+    d->showPreview  = new KPushButton(KIcon("folder-image"), i18n("View image"), this);
+    d->backToAlbum  = new KPushButton(KIcon("image"), i18n("Back to album"), this);
+    d->deleteImgs   = new KPushButton(KIcon("edit-delete"), i18nc("delete image", ""), this);
+    d->rotateLeft   = new KPushButton(KIcon("object-rotate-left"), i18nc("Rotate Left", ""), this);
+    d->rotateRight  = new KPushButton(KIcon("object-rotate-right"), i18nc("Rotate Right", ""), this);
+    d->editImage    = new KPushButton(KIcon("editimage"), i18nc("Edit...", ""), this);
+
+    d->slideShow    = new KPushButton(KIcon("view-presentation"), i18nc("Slideshow", ""), this);
+    d->slideShowAll = new KAction(i18n("All"), this);
+    d->slideShowSelection = new KAction(i18n("Selection"), this);
+    d->slideShowRecursive = new KAction(i18n("With All Sub-Albums"), this);
+    d->slideShowMenu = new KMenu(this);
+    d->slideShowMenu->addAction(d->slideShowAll);
+    d->slideShowMenu->addAction(d->slideShowSelection);
+    d->slideShowMenu->addAction(d->slideShowRecursive);
+    d->slideShow->setMenu(d->slideShowMenu);
+
+    connect(d->firstImg, SIGNAL(clicked()),
+            this, SIGNAL(signalFirstItem()));
+
+    connect(d->prevImg, SIGNAL(clicked()),
+            this, SIGNAL(signalPrevItem()));
+
+    connect(d->nextImg, SIGNAL(clicked()),
+            this, SIGNAL(signalNextItem()));
+
+    connect(d->lastImg, SIGNAL(clicked()),
+            this, SIGNAL(signalLastItem()));
+
+    connect(d->thumbBar, SIGNAL(imageActivated(const ImageInfo&)),
+            this, SIGNAL(signalImageSelected(const ImageInfo&)));
+
+    connect(d->showPreview, SIGNAL(clicked()),
+            this, SIGNAL(signalPreviewRequestedCurrent()));
+
+    connect(d->backToAlbum, SIGNAL(clicked()),
+            this, SIGNAL(signalBack2Album()));
+
+    connect(d->deleteImgs, SIGNAL(clicked()),
+            this, SIGNAL(signalDeleteItem()));
+
+    connect(d->rotateLeft, SIGNAL(clicked()),
+            this, SIGNAL(signalRotateLeft()));
+
+    connect(d->rotateRight, SIGNAL(clicked()),
+            this, SIGNAL(signalRotateRight()));
+
+    connect(d->editImage, SIGNAL(clicked()),
+            this, SIGNAL(signalEditItem()));
+
+    connect(d->slideShowAll, SIGNAL(triggered()),
+            this, SIGNAL(signalSlideShowAll()));
+
+    connect(d->slideShowSelection, SIGNAL(triggered()),
+            this, SIGNAL(signalSlideShowSelection()));
+
+    connect(d->slideShowRecursive, SIGNAL(triggered()),
+            this, SIGNAL(signalSlideShowRecursive()));
+
+    /**
+     * Filter bar
+     */
+    d->filterBar    = new AlbumIconViewFilter(this);
+
+    connect(d->filterBar, SIGNAL(ratingFilterChanged(int, ImageFilterSettings::RatingCondition)),
+            this, SIGNAL(signalRatingFilter(int, ImageFilterSettings::RatingCondition)));
+
+    connect(d->filterBar, SIGNAL(mimeTypeFilterChanged(int)),
+            this, SIGNAL(signalMimeTypeFilter(int)));
+
+    connect(d->filterBar, SIGNAL(textFilterChanged(const SearchTextSettings&)),
+            this, SIGNAL(signalTextFilter(const SearchTextSettings&)));
+
+    connect(this, SIGNAL(signalFilterMatches(bool)),
+            d->filterBar, SLOT(slotFilterMatches(bool)));
+
+    connect(this, SIGNAL(signalFilterMatchesForText(bool)),
+            d->filterBar, SLOT(slotFilterMatchesForText(bool)));
+
+    connect(this, SIGNAL(signalFilterSettingsChanged(const ImageFilterSettings&)),
+            d->filterBar, SLOT(slotFilterSettingsChanged(const ImageFilterSettings&)));
+
+    /**
+     * Zoom bar
+     */
+    d->zoomBar      = new DZoomBar(this);
+    d->zoomBar->setBarMode(DZoomBar::ThumbsSizeCtrl);
+
+    connect(d->zoomBar, SIGNAL(signalZoomSliderChanged(int)),
+            this, SIGNAL(signalZoomSliderChanged(int)));
+
+    connect(d->zoomBar, SIGNAL(signalZoomValueEdited(double)),
+            this, SIGNAL(signalZoomValueEdited(double)));
+
+    connect(this, SIGNAL(signalWindowHasMoved()),
+            d->zoomBar, SLOT(slotUpdateTrackerPos()));
+
+    d->zoomPlusAction  = KStandardAction::zoomIn(this, SIGNAL(signalZoomIn()), this);
+    KShortcut keysPlus = d->zoomPlusAction->shortcut();
+    keysPlus.setAlternate(Qt::Key_Plus);
+    d->zoomPlusAction->setShortcut(keysPlus);
+
+    d->zoomMinusAction  = KStandardAction::zoomOut(this, SIGNAL(signalZoomOut()), this);
+    KShortcut keysMinus = d->zoomMinusAction->shortcut();
+    keysMinus.setAlternate(Qt::Key_Minus);
+    d->zoomMinusAction->setShortcut(keysMinus);
+
+    d->zoomTo100percents = new KAction(KIcon("zoom-original"), i18n("Zoom to 100%"), this);
+
+    connect(d->zoomTo100percents, SIGNAL(triggered()),
+            this, SIGNAL(signalZoomTo100Percents()));
+
+    d->zoomFitToWindowAction = new KAction(KIcon("zoom-fit-best"), i18n("Fit to &Window"), this);
+
+    connect(d->zoomFitToWindowAction, SIGNAL(triggered()),
+            this, SIGNAL(signalFitToWindow()));
+
+    d->zoomBar->setZoomToFitAction(d->zoomFitToWindowAction);
+    d->zoomBar->setZoomTo100Action(d->zoomTo100percents);
+    d->zoomBar->setZoomPlusAction(d->zoomPlusAction);
+    d->zoomBar->setZoomMinusAction(d->zoomMinusAction);
+
+    /**
+     * Layout
+     */
+    // Navigation & Actions buttons
+    d->navLayout    = new QHBoxLayout();
+    d->navLayout->setSpacing(0);
+    d->navLayout->setMargin(0);
+    d->navLayout->addWidget(d->firstImg, 0, Qt::AlignTop);
+    d->navLayout->addWidget(d->prevImg, 0, Qt::AlignTop);
+    d->navLayout->addWidget(d->nextImg, 0, Qt::AlignTop);
+    d->navLayout->addWidget(d->lastImg, 0, Qt::AlignTop);
+    d->navLayout->addStretch();
+    d->navLayout->addWidget(d->rotateLeft, 0, Qt::AlignTop);
+    d->navLayout->addWidget(d->rotateRight, 0, Qt::AlignTop);
+    d->navLayout->addWidget(d->editImage, 0, Qt::AlignTop);
+    d->navLayout->addWidget(d->deleteImgs, 0, Qt::AlignTop);
+    d->navLayout->addWidget(d->slideShow, 0, Qt::AlignTop);
+    d->navLayout->addWidget(d->showPreview, 0, Qt::AlignTop);
+    d->navLayout->addWidget(d->backToAlbum, 0, Qt::AlignTop);
+
+    // Filter & Zoom bars
+    d->filterZoomLayout = new QHBoxLayout();
+    d->filterZoomLayout->setSpacing(0);
+    d->filterZoomLayout->setMargin(0);
+    d->filterZoomLayout->addWidget(d->filterBar, 0, Qt::AlignBottom);
+    d->filterZoomLayout->addWidget(d->zoomBar, 0, Qt::AlignBottom);
+
+    // Global Layout
+    d->globalLayout = new QGridLayout();
+    d->globalLayout->setSpacing(0);
+    d->globalLayout->setMargin(0);
+    d->globalLayout->addWidget(d->thumbBar, 0, 0);
+    d->globalLayout->addLayout(d->navLayout, 1, 0);
+    d->globalLayout->addLayout(d->filterZoomLayout, 2, 0 );
+
+    setLayout(d->globalLayout);
+    setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Maximum);
+}
+
+NavigationBar::~NavigationBar()
+{
+    delete d;
+}
+
+void NavigationBar::slotToggledToPreviewMode(bool isImagePreviewMode)
+{
+    if (isImagePreviewMode)
+    {
+        d->zoomBar->setBarMode(DZoomBar::PreviewZoomCtrl);
+
+        d->showPreview->setVisible(false);
+        d->backToAlbum->setVisible(true);
+       d->thumbBar->setVisible(true);
+    }
+    else
+    {
+        d->zoomBar->setBarMode(DZoomBar::ThumbsSizeCtrl);
+
+        d->showPreview->setVisible(true);
+        d->backToAlbum->setVisible(false);
+        d->thumbBar->setVisible(false);
+    }
+}
+
+void NavigationBar::slotPreviewChanged(const ImageInfo& info)
+{
+    d->thumbBar->setCurrentInfo(info);
+}
+
+// Thumbnails size changed (In album view mode)
+void NavigationBar::slotThumbSizeChanged(int size)
+{
+    d->zoomBar->setThumbsSize(size);
+}
+
+// Image size changed (In image view mode)
+void NavigationBar::slotZoomChanged(double zoom, double zmin, double zmax)
+{
+    d->zoomBar->setZoom(zoom, zmin, zmax);
+}
+
+void NavigationBar::slotImageSelected(const ImageInfoList& selection, bool hasPrev, bool hasNext, const ImageInfoList& listAll)
+{
+    Q_UNUSED(selection);
+    Q_UNUSED(listAll);
+
+    if (hasPrev)
+    {
+       d->firstImg->setEnabled(true);
+       d->prevImg->setEnabled(true);
+    }
+    else
+    {
+       d->firstImg->setEnabled(false);
+       d->prevImg->setEnabled(false);
+    }
+
+    if (hasNext)
+    {
+       d->nextImg->setEnabled(true);
+       d->lastImg->setEnabled(true);
+    }
+    else
+    {
+       d->nextImg->setEnabled(false);
+       d->lastImg->setEnabled(false);
+    }
+}
+
+void NavigationBar::slotSelectionChanged(int selectionCount)
+{
+    d->showPreview->setEnabled(selectionCount == 1);
+    d->editImage->setEnabled(selectionCount == 1);
+    d->deleteImgs->setEnabled(selectionCount > 0);
+    d->slideShowSelection->setEnabled(selectionCount > 0);
+    d->rotateLeft->setEnabled(selectionCount > 0);
+    d->rotateRight->setEnabled(selectionCount > 0);
+}
+
+}
Index: digikam/digikamview.h
===================================================================
--- digikam/digikamview.h	(révision 1158462)
+++ digikam/digikamview.h	(copie de travail)
@@ -80,7 +80,7 @@
 
     double zoomMin();
     double zoomMax();
-    
+
 Q_SIGNALS:
 
     void signalAlbumSelected(bool val);
@@ -99,6 +99,9 @@
     void signalGotoTagAndItem(int tagID);
     void signalChangedTab(QWidget*);
 
+    void signalZoomSliderChanged(int);
+    void signalWindowHasMoved();
+
 public Q_SLOTS:
 
     void setZoomFactor(double zoom);
Index: digikam/navigationbar.h
===================================================================
--- digikam/navigationbar.h	(révision 0)
+++ digikam/navigationbar.h	(révision 0)
@@ -0,0 +1,104 @@
+/* ============================================================
+ *
+ * This file is a part of digiKam project
+ * http://www.digikam.org
+ *
+ * Date        : 2010-08-02
+ * Description : Tool bar for navigation & most used actions.
+ *
+ * Copyright (C) 2010 by Luc Vieillescazes <luc at vieillescazes dot net>
+ *
+ * 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, 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.
+ *
+ * ============================================================ */
+
+#ifndef NAVIGATIONBAR_H
+#define NAVIGATIONBAR_H
+
+
+// Local includes
+
+#include "ratingfilter.h"
+#include "imageinfo.h"
+#include "imagealbummodel.h"
+#include "imagealbumfiltermodel.h"
+
+namespace Digikam
+{
+
+class ImageInfoList;
+class NavigationBarPriv;
+
+class NavigationBar : public QWidget
+{
+    Q_OBJECT
+
+public:
+
+    NavigationBar(ImageModel *thumbModel, ImageFilterModel *thumbFilterModel);
+    ~NavigationBar();
+
+Q_SIGNALS:
+
+    // Out
+    void signalFirstItem();
+    void signalPrevItem();
+    void signalNextItem();
+    void signalLastItem();
+    void signalPreviewRequestedCurrent();
+    void signalBack2Album();
+    void signalDeleteItem();
+    void signalImageSelected(const ImageInfo&);
+    void signalRotateLeft();
+    void signalRotateRight();
+    void signalEditItem();
+    void signalSlideShowAll();
+    void signalSlideShowSelection();
+    void signalSlideShowRecursive();
+
+    // Out
+    void signalRatingFilter(int, ImageFilterSettings::RatingCondition);
+    void signalMimeTypeFilter(int);
+    void signalTextFilter(const SearchTextSettings&);
+    // In
+    void signalFilterMatches(bool);
+    void signalFilterMatchesForText(bool);
+    void signalFilterSettingsChanged(const ImageFilterSettings&);
+
+    // Out
+    void signalZoomSliderChanged(int);
+    void signalZoomValueEdited(double);
+    void signalZoomIn();
+    void signalZoomOut();
+    void signalZoomTo100Percents();
+    void signalFitToWindow();
+    // In
+    void signalWindowHasMoved();
+
+public Q_SLOTS:
+
+    void slotToggledToPreviewMode(bool isImagePreviewMode);
+    void slotThumbSizeChanged(int size);
+    void slotZoomChanged(double zoom, double zmin, double zmax);
+    void slotImageSelected(const ImageInfoList&, bool, bool, const ImageInfoList&);
+    void slotSelectionChanged(int);
+    void slotPreviewChanged(const ImageInfo& info);
+
+private:
+
+    NavigationBarPriv*  const d;
+};
+
+
+}  // namespace Digikam
+
+#endif /* NAVIGATIONBAR_H */
\ No newline at end of file
Index: digikam/digikamapp.cpp
===================================================================
--- digikam/digikamapp.cpp	(révision 1158462)
+++ digikam/digikamapp.cpp	(copie de travail)
@@ -495,6 +495,12 @@
 
     connect(d->view, SIGNAL(signalImageSelected(const ImageInfoList&, bool, bool, const ImageInfoList&)),
             this, SLOT(slotImageSelected(const ImageInfoList&, bool, bool, const ImageInfoList&)));
+
+    connect(d->view, SIGNAL(signalZoomSliderChanged(int)),
+            this, SLOT(slotZoomSliderChanged(int)));
+
+    connect(this, SIGNAL(signalWindowHasMoved()),
+            d->view, SIGNAL(signalWindowHasMoved()));
 }
 
 void DigikamApp::setupStatusBar()
Index: digikam/albumwidgetstack.cpp
===================================================================
--- digikam/albumwidgetstack.cpp	(révision 1158462)
+++ digikam/albumwidgetstack.cpp	(copie de travail)
@@ -53,6 +53,7 @@
 #include "welcomepageview.h"
 #include "mediaplayerview.h"
 #include "thumbbardock.h"
+#include "navigationbar.h"
 
 namespace Digikam
 {
@@ -74,6 +75,8 @@
         mediaPlayerView    = 0;
         thumbbarTimer      = 0;
         needUpdateBar      = false;
+        navigationBar      = 0;
+        navigationBarDock  = 0;
     }
 
     bool              needUpdateBar;
@@ -88,22 +91,145 @@
     MediaPlayerView*  mediaPlayerView;
     ThumbBarDock*     thumbBarDock;
     WelcomePageView*  welcomePageView;
+    NavigationBar*    navigationBar;
+    QDockWidget*      navigationBarDock;
 };
 
 AlbumWidgetStack::AlbumWidgetStack(QWidget *parent)
                 : QStackedWidget(parent), d(new AlbumWidgetStackPriv)
 {
+    /**
+     * Views modes
+     */
     d->imageIconView    = new DigikamImageView(this);
     d->imagePreviewView = new ImagePreviewView(this);
+    d->welcomePageView  = new WelcomePageView(this);
+    d->mediaPlayerView  = new MediaPlayerView(this);
+
+    /**
+     * Thumbnails dock bar
+     */
     d->thumbBarDock     = new ThumbBarDock();
     d->thumbBar         = new ImageThumbnailBar(d->thumbBarDock);
     d->thumbBar->setModels(d->imageIconView->imageModel(), d->imageIconView->imageFilterModel());
     d->thumbBarDock->setWidget(d->thumbBar);
     d->thumbBarDock->setObjectName("mainwindow_thumbbar");
 
-    d->welcomePageView = new WelcomePageView(this);
-    d->mediaPlayerView = new MediaPlayerView(this);
+    /**
+     * Navigation & Actions dock bar
+     */
+    d->navigationBar    = new NavigationBar(d->imageIconView->imageModel(), d->imageIconView->imageFilterModel());
+    d->navigationBarDock = new QDockWidget();
+    d->navigationBarDock->setWidget(d->navigationBar);
 
+    // Connect navigation & actions signals
+    connect(d->navigationBar, SIGNAL(signalFirstItem()),
+            this, SIGNAL(signalFirstItem()));
+
+    connect(d->navigationBar, SIGNAL(signalPrevItem()),
+            this, SIGNAL(signalPrevItem()));
+
+    connect(d->navigationBar, SIGNAL(signalLastItem()),
+            this, SIGNAL(signalLastItem()));
+
+    connect(d->navigationBar, SIGNAL(signalNextItem()),
+            this, SIGNAL(signalNextItem()));
+
+    connect(d->navigationBar, SIGNAL(signalPreviewRequestedCurrent()),
+            this, SIGNAL(signalPreviewRequestedCurrent()));
+
+    connect(d->navigationBar, SIGNAL(signalBack2Album()),
+            this, SIGNAL(signalBack2Album()));
+
+    connect(d->navigationBar, SIGNAL(signalDeleteItem()),
+            this, SIGNAL(signalDeleteItem()));
+
+    connect(d->navigationBar, SIGNAL(signalImageSelected(const ImageInfo&)),
+            this, SIGNAL(signalImageSelected(const ImageInfo&)));
+
+    // Share slotRotate{Left,Right} between DigikamImageView & ImagePreviewView ??
+    connect(d->navigationBar, SIGNAL(signalRotateLeft()),
+            d->imagePreviewView, SLOT(slotRotateLeft()));
+
+    connect(d->navigationBar, SIGNAL(signalRotateRight()),
+            d->imagePreviewView, SLOT(slotRotateRight()));
+
+    connect(d->navigationBar, SIGNAL(signalEditItem()),
+            this, SIGNAL(signalEditItem()));
+
+    connect(d->navigationBar, SIGNAL(signalSlideShowAll()),
+            this, SIGNAL(signalSlideShowAll()));
+
+    connect(d->navigationBar, SIGNAL(signalSlideShowSelection()),
+            this, SIGNAL(signalSlideShowSelection()));
+
+    connect(d->navigationBar, SIGNAL(signalSlideShowRecursive()),
+            this, SIGNAL(signalSlideShowRecursive()));
+
+    connect(this, SIGNAL(signalPreviewChanged(const ImageInfo&)),
+            d->navigationBar, SLOT(slotPreviewChanged(const ImageInfo&)));
+
+    connect(this, SIGNAL(signalImageSelected(const ImageInfoList&, bool, bool, const ImageInfoList&)),
+            d->navigationBar, SLOT(slotImageSelected(const ImageInfoList&, bool, bool, const ImageInfoList&)));
+
+    connect(this, SIGNAL(signalSelectionChanged(int)),
+            d->navigationBar, SLOT(slotSelectionChanged(int)));
+
+    // Connect filter signals
+    ImageAlbumFilterModel *model = d->imageIconView->imageAlbumFilterModel();
+
+    connect(d->navigationBar, SIGNAL(signalRatingFilter(int, ImageFilterSettings::RatingCondition)),
+            model, SLOT(setRatingFilter(int, ImageFilterSettings::RatingCondition)));
+
+    connect(d->navigationBar, SIGNAL(signalMimeTypeFilter(int)),
+            model, SLOT(setMimeTypeFilter(int)));
+
+    connect(d->navigationBar, SIGNAL(signalTextFilter(const SearchTextSettings&)),
+            model, SLOT(setTextFilter(const SearchTextSettings&)));
+
+    connect(model, SIGNAL(filterMatches(bool)),
+            d->navigationBar, SIGNAL(signalFilterMatches(bool)));
+
+    connect(model, SIGNAL(filterMatchesForText(bool)),
+            d->navigationBar, SIGNAL(signalFilterMatchesForText(bool)));
+
+    connect(model, SIGNAL(filterSettingsChanged(const ImageFilterSettings&)),
+            d->navigationBar, SIGNAL(signaltFilterSettingsChanged(const ImageFilterSettings&)));
+
+    // Connect zoom signals
+    connect(d->navigationBar, SIGNAL(signalZoomSliderChanged(int)),
+            this, SIGNAL(signalZoomSliderChanged(int)));
+
+    connect(d->navigationBar, SIGNAL(signalZoomValueEdited(double)),
+            this, SIGNAL(signalZoomValueEdited(double)));
+
+    connect(d->navigationBar, SIGNAL(signalZoomIn()),
+            this, SIGNAL(signalZoomIn()));
+
+    connect(d->navigationBar, SIGNAL(signalZoomOut()),
+            this, SIGNAL(signalZoomOut()));
+
+    connect(d->navigationBar, SIGNAL(signalZoomTo100Percents()),
+            this, SIGNAL(signalZoomTo100Percents()));
+
+    connect(d->navigationBar, SIGNAL(signalFitToWindow()),
+            this, SIGNAL(signalFitToWindow()));
+
+    connect(this, SIGNAL(signalWindowHasMoved()),
+            d->navigationBar, SIGNAL(signalWindowHasMoved()));
+
+    connect(this, SIGNAL(signalThumbSizeChanged(int)),
+            d->navigationBar, SLOT(slotThumbSizeChanged(int)));
+
+    connect(this, SIGNAL(signalZoomChanged(double, double, double)),
+            d->navigationBar, SLOT(slotZoomChanged(double, double, double)));
+
+    // Conect views modes signals
+    connect(this, SIGNAL(signalToggledToPreviewMode(bool)),
+            d->navigationBar, SLOT(slotToggledToPreviewMode(bool)));
+
+    // -----------------------------------------------------------------
+
     insertWidget(PreviewAlbumMode, d->imageIconView);
     insertWidget(PreviewImageMode, d->imagePreviewView);
     insertWidget(WelcomePageMode,  d->welcomePageView->view());
@@ -211,11 +337,17 @@
 
 void AlbumWidgetStack::setDockArea(QMainWindow* dockArea)
 {
+    d->dockArea = dockArea;
+
     // Attach the thumbbar dock to the given dock area and place it initially on top.
-    d->dockArea = dockArea;
     d->thumbBarDock->setParent(d->dockArea);
     d->dockArea->addDockWidget(Qt::TopDockWidgetArea, d->thumbBarDock);
     d->thumbBarDock->setFloating(false);
+
+    // Attach the NavigationBar dock to the given dock area and place it initially on bottom.
+    d->navigationBarDock->setParent(d->dockArea);
+    d->dockArea->addDockWidget(Qt::BottomDockWidgetArea, d->navigationBarDock);
+    d->navigationBarDock->setFloating(false);
 }
 
 ThumbBarDock* AlbumWidgetStack::thumbBarDock()
@@ -291,6 +423,7 @@
         }
 
         d->thumbBar->setCurrentInfo(info);
+        emit signalPreviewChanged(info);
     }
 }
 
@@ -307,7 +440,7 @@
 
     if (mode == PreviewImageMode)
     {
-        d->thumbBarDock->restoreVisibility();
+//         d->thumbBarDock->restoreVisibility();
     }
     else
     {
@@ -452,6 +585,11 @@
     return d->imagePreviewView->zoomMax();
 }
 
+void AlbumWidgetStack::slotZoomChanged(double zoom)
+{
+    emit signalZoomChanged(zoom, zoomMin(), zoomMax());
+}
+
 void AlbumWidgetStack::applySettings()
 {
     AlbumSettings *settings = AlbumSettings::instance();
