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/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/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);
     }
 }
 
@@ -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();
