[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [digikam/development/3.0.0] utilities/cameragui/views: Added the new views for import tool
From:       Islam Wazery <wazery () ubuntu ! com>
Date:       2012-07-31 23:11:44
Message-ID: 20120731231144.CF0F0A6094 () git ! kde ! org
[Download RAW message or body]

Git commit b6d71e848b2731ea34140887cb372d1adc194d07 by Islam Wazery.
Committed on 01/08/2012 at 00:39.
Pushed by wazery into branch 'development/3.0.0'.

Added the new views for import tool

M  +7    -5    utilities/cameragui/views/importcategorizedview.cpp
M  +2    -2    utilities/cameragui/views/importcategorizedview.h
A  +362  -0    utilities/cameragui/views/importiconview.cpp     [License: UNKNOWN]  *
A  +64   -0    utilities/cameragui/views/importiconview.h     [License: UNKNOWN]  *
A  +59   -0    utilities/cameragui/views/importiconview_p.cpp     [License: UNKNOWN]  \
* A  +72   -0    utilities/cameragui/views/importiconview_p.h     [License: GPL \
(v2+)] A  +508  -0    utilities/cameragui/views/importpreviewview.cpp     [License: \
GPL (v2+)] A  +115  -0    utilities/cameragui/views/importpreviewview.h     [License: \
GPL (v2+)] A  +476  -0    utilities/cameragui/views/importstackedview.cpp     \
[License: GPL (v2+)] A  +137  -0    utilities/cameragui/views/importstackedview.h     \
[License: GPL (v2+)] A  +192  -0    utilities/cameragui/views/importthumbnailbar.cpp  \
[License: UNKNOWN]  * A  +57   -0    utilities/cameragui/views/importthumbnailbar.h   \
[License: UNKNOWN]  * A  +867  -0    utilities/cameragui/views/importview.cpp     \
[License: UNKNOWN]  * A  +133  -0    utilities/cameragui/views/importview.h     \
[License: UNKNOWN]  *

The files marked with a * at the end have a non valid license. Please read: \
http://techbase.kde.org/Policies/Licensing_Policy and use the headers which are \
listed at that page.


http://commits.kde.org/digikam/b6d71e848b2731ea34140887cb372d1adc194d07

diff --git a/utilities/cameragui/views/importcategorizedview.cpp \
b/utilities/cameragui/views/importcategorizedview.cpp index 1ba4ef4..6d73b44 100644
--- a/utilities/cameragui/views/importcategorizedview.cpp
+++ b/utilities/cameragui/views/importcategorizedview.cpp
@@ -116,9 +116,10 @@ ImportCategorizedView::~ImportCategorizedView()
 }
 
 //FIXME: Needs testing
-void ImportCategorizedView::installDefaultModels()
+void ImportCategorizedView::installDefaultModels(CameraController* controller)
 {
     ImportModel* model             = new ImportModel(this);
+    model->setupCameraController(controller);
     ImportFilterModel* filterModel = new ImportFilterModel(this);
 
     filterModel->setSourceImportModel(model);
@@ -148,7 +149,7 @@ void ImportCategorizedView::setModels(ImportImageModel* model, \
ImportSortFilterM  
     if (d->model)
     {
-        disconnect(d->model, SIGNAL(CamItemInfosAdded(QList<CamItemInfo>)),
+        disconnect(d->model, SIGNAL(itemInfosAdded(QList<CamItemInfo>)),
                    this, SLOT(slotCamItemInfosAdded()));
     }
 
@@ -164,7 +165,7 @@ void ImportCategorizedView::setModels(ImportImageModel* model, \
ImportSortFilterM  this, SLOT(layoutWasChanged()),
             Qt::QueuedConnection);
 
-    connect(d->model, SIGNAL(CamItemInfosAdded(QList<CamItemInfo>)),
+    connect(d->model, SIGNAL(itemInfosAdded(QList<CamItemInfo>)),
             this, SLOT(slotCamItemInfosAdded()));
 
     emit modelChanged();
@@ -207,7 +208,7 @@ ImportDelegate* ImportCategorizedView::delegate() const
 
 void ImportCategorizedView::setItemDelegate(ImportDelegate* delegate)
 {
-    ThumbnailSize oldSize      = thumbnailSize();
+    ThumbnailSize oldSize       = thumbnailSize();
     ImportDelegate* oldDelegate = d->delegate;
 
     if (oldDelegate)
@@ -223,7 +224,8 @@ void ImportCategorizedView::setItemDelegate(ImportDelegate* \
delegate)  }
 
     d->delegate = delegate;
-    d->delegate->setThumbnailSize(oldSize);
+    qDebug() << QString::number(oldSize.size());
+    delegate->setThumbnailSize(oldSize);
 
     if (oldDelegate)
     {
diff --git a/utilities/cameragui/views/importcategorizedview.h \
b/utilities/cameragui/views/importcategorizedview.h index c00b887..054efe0 100644
--- a/utilities/cameragui/views/importcategorizedview.h
+++ b/utilities/cameragui/views/importcategorizedview.h
@@ -150,8 +150,8 @@ protected Q_SLOTS:
 
 protected:
 
-    /// install default ImageAlbumModel and filter model, ready for use
-    void installDefaultModels();
+    /// install default ImportModel and filter model, ready for use
+    void installDefaultModels(CameraController* controller);
 
     /// Reimplement these in a subclass
     virtual void activated(const CamItemInfo& info);
diff --git a/utilities/cameragui/views/importiconview.cpp \
b/utilities/cameragui/views/importiconview.cpp new file mode 100644
index 0000000..675291d
--- /dev/null
+++ b/utilities/cameragui/views/importiconview.cpp
@@ -0,0 +1,362 @@
+#include "importiconview_p.h"
+#include "importiconview.moc"
+
+// Qt includes
+
+#include <QPointer>
+#include <QAction>
+
+// KDE includes
+
+#include <KLocale>
+#include <KMenu>
+
+// Local includes
+
+#include "importsettings.h"
+#include "camitemsortsettings.h"
+#include "fileactionmngr.h"
+#include "importdelegate.h"
+#include "advancedrenamedialog.h"
+#include "advancedrenameprocessdialog.h"
+#include "imageviewutilities.h"
+#include "contextmenuhelper.h"
+
+namespace Digikam
+{
+
+ImportIconView::ImportIconView(QWidget* parent)
+    : ImportCategorizedView(parent), d(new ImportIconViewPriv(this))
+{
+}
+
+void ImportIconView::init(CameraController* controller)
+{
+    installDefaultModels(controller);
+
+    d->normalDelegate = new ImportNormalDelegate(this);
+    if(d->normalDelegate)
+        setItemDelegate(d->normalDelegate);
+    setSpacing(10);
+
+    ImportSettings* settings = ImportSettings::instance();
+
+    importFilterModel()->setCategorizationMode(CamItemSortSettings::CategoryByFormat);
 +
+    setThumbnailSize((ThumbnailSize::Size)settings->getDefaultIconSize());
+
+    //importImageModel()->setDragDropHandler(new \
ImageDragDropHandler(importImageModel())); +    //setDragEnabled(true);
+    setAcceptDrops(true);
+    setDropIndicatorShown(false);
+
+    setToolTipEnabled(settings->showToolTipsIsValid());
+    importFilterModel()->setSortRole((CamItemSortSettings::SortRole)settings->getImageSortOrder());
 +    importFilterModel()->setSortOrder((CamItemSortSettings::SortOrder)settings->getImageSorting());
 +    importFilterModel()->setCategorizationMode((CamItemSortSettings::CategorizationMode)settings->getImageGroupMode());
 +
+    // selection overlay
+    addSelectionOverlay(d->normalDelegate);
+    //TODO: addSelectionOverlay(d->faceDelegate);
+
+    // rotation overlays
+    //TODO: d->rotateLeftOverlay = ImageRotateOverlay::left(this);
+    //TODO: d->rotateRightOverlay = ImageRotateOverlay::right(this);
+    //TODO: d->updateOverlays();
+
+    // rating overlay
+    //TODO: ImageRatingOverlay* ratingOverlay = new ImageRatingOverlay(this);
+    //TODO: addOverlay(ratingOverlay);
+
+    //TODO: GroupIndicatorOverlay* groupOverlay = new GroupIndicatorOverlay(this);
+    //TODO: addOverlay(groupOverlay);
+
+    //TODO: connect(ratingOverlay, SIGNAL(ratingEdited(QList<QModelIndex>,int)),
+            //this, SLOT(assignRating(QList<QModelIndex>,int)));
+
+    //TODO: connect(groupOverlay, SIGNAL(toggleGroupOpen(QModelIndex)),
+            //this, SLOT(groupIndicatorClicked(QModelIndex)));
+
+    //TODO: connect(groupOverlay, \
SIGNAL(showButtonContextMenu(QModelIndex,QContextMenuEvent*)), +            //this, \
SLOT(showGroupContextMenu(QModelIndex,QContextMenuEvent*))); +
+    //TODO: connect(importImageModel()->dragDropHandler(), \
SIGNAL(assignTags(QList<CamItemInfo>,QList<int>)), +            \
//FileActionMngr::instance(), SLOT(assignTags(QList<CamItemInfo>,QList<int>))); +
+    connect(importImageModel()->dragDropHandler(), \
SIGNAL(addToGroup(CamItemInfo,QList<CamItemInfo>)), +            \
FileActionMngr::instance(), SLOT(addToGroup(CamItemInfo,QList<CamItemInfo>))); +
+    connect(settings, SIGNAL(setupChanged()),
+            this, SLOT(slotSetupChanged()));
+
+    slotSetupChanged();
+}
+
+ImportIconView::~ImportIconView()
+{
+    delete d;
+}
+
+ImageViewUtilities* ImportIconView::utilities() const
+{
+    return d->utilities;
+}
+
+void ImportIconView::setThumbnailSize(const ThumbnailSize& size)
+{
+    importThumbnailModel()->setThumbnailSize(size);
+    ImportCategorizedView::setThumbnailSize(size);
+}
+
+int ImportIconView::fitToWidthIcons()
+{
+    return delegate()->calculatethumbSizeToFit(viewport()->size().width());
+}
+
+void ImportIconView::slotSetupChanged()
+{
+    setToolTipEnabled(ImportSettings::instance()->showToolTipsIsValid());
+    setFont(ImportSettings::instance()->getIconViewFont());
+
+    d->updateOverlays();
+
+    ImportCategorizedView::slotSetupChanged();
+}
+
+void ImportIconView::rename()
+{
+    KUrl::List urls = selectedUrls();
+    NewNamesList newNamesList;
+
+    QPointer<AdvancedRenameDialog> dlg = new AdvancedRenameDialog(this);
+    dlg->slotAddImages(urls);
+
+    if (dlg->exec() == KDialog::Accepted)
+    {
+        newNamesList = dlg->newNames();
+    }
+
+    delete dlg;
+
+    if (!newNamesList.isEmpty())
+    {
+        QPointer<AdvancedRenameProcessDialog> dlg = new \
AdvancedRenameProcessDialog(newNamesList); +        dlg->exec();
+        delete dlg;
+    }
+}
+
+void ImportIconView::deleteSelected(bool permanently)
+{
+    CamItemInfoList camItemInfoList = selectedCamItemInfos();
+
+    //FIXME: This way of deletion may not working with camera items.
+    //if (d->utilities->deleteImages(camItemInfoList, permanently))
+    //{
+    //    awayFromSelection();
+    //}
+}
+
+void ImportIconView::deleteSelectedDirectly(bool permanently)
+{
+    CamItemInfoList camItemInfoList = selectedCamItemInfos();
+    //FIXME: This way of deletion may not working with camera items.
+    //d->utilities->deleteImagesDirectly(camItemInfoList, permanently);
+    awayFromSelection();
+}
+
+void ImportIconView::createGroupFromSelection()
+{
+    //TODO: Impelemnt grouping in import tool.
+    //QList<CamItemInfo> selectedInfos = selectedCamItemInfosCurrentFirst();
+    //CamItemInfo groupLeader          = selectedInfos.takeFirst();
+    //FileActionMngr::instance()->addToGroup(groupLeader, selectedInfos);
+}
+
+void ImportIconView::createGroupByTimeFromSelection()
+{
+    //TODO: Impelemnt grouping in import tool.
+    //QList<CamItemInfo> selectedInfos = selectedCamItemInfosCurrentFirst();
+
+    //while (selectedInfos.size() > 0)
+    //{
+        //QList<CamItemInfo> group;
+        //CamItemInfo groupLeader = selectedInfos.takeFirst();
+        //QDateTime dateTime    = groupLeader.dateTime();
+
+        //while (selectedInfos.size() > 0 && \
abs(dateTime.secsTo(selectedInfos.first().dateTime())) < 2) +        //{
+        //    group.push_back(selectedInfos.takeFirst());
+        //}
+
+        //FileActionMngr::instance()->addToGroup(groupLeader, group);
+    //}
+}
+
+void ImportIconView::ungroupSelected()
+{
+    //TODO: Impelemnt grouping in import tool.
+    //FileActionMngr::instance()->ungroup(selectedCamItemInfos());
+}
+
+void ImportIconView::removeSelectedFromGroup()
+{
+    //TODO: Impelemnt grouping in import tool.
+    //FileActionMngr::instance()->removeFromGroup(selectedCamItemInfos());
+}
+
+void ImportIconView::activated(const CamItemInfo& info)
+{
+    if (info.isNull())
+    {
+        return;
+    }
+
+    if (ImportSettings::instance()->getItemLeftClickAction() == \
ImportSettings::ShowPreview) +    {
+        emit previewRequested(info);
+    }
+    else
+    {
+        //TODO: openInEditor(info);
+    }
+}
+
+//TODO: Implement context menu
+void ImportIconView::showContextMenuOnInfo(QContextMenuEvent* event, const \
CamItemInfo& info) +{
+//    QList<CamItemInfo> selectedInfos = selectedCamItemInfosCurrentFirst();
+//    QList<qlonglong> selectedImageIDs;
+//    foreach(const CamItemInfo& info, selectedInfos)
+//    {
+//        selectedImageIDs << info.id;
+//    }
+
+//    // Temporary actions --------------------------------------
+
+//    QAction* viewAction = new QAction(SmallIcon("viewimage"), i18nc("View the \
selected image", "Preview"), this); +//    \
viewAction->setEnabled(selectedImageIDs.count() == 1); +
+//    // --------------------------------------------------------
+
+//    KMenu popmenu(this);
+//    ContextMenuHelper cmhelper(&popmenu);
+//    cmhelper.setImageFilterModel(importFilterModel());
+
+//    cmhelper.addAction("full_screen");
+//    cmhelper.addSeparator();
+//    // --------------------------------------------------------
+//    cmhelper.addAction("move_selection_to_album");
+//    cmhelper.addAction(viewAction);
+//    cmhelper.addAction("image_edit");
+//    cmhelper.addServicesMenu(selectedUrls());
+//    cmhelper.addGotoMenu(selectedImageIDs);
+//    cmhelper.addRotateMenu(selectedImageIDs);
+//    cmhelper.addSeparator();
+//    // --------------------------------------------------------
+//    cmhelper.addAction("image_find_similar");
+//    cmhelper.addStandardActionLightTable();
+//    cmhelper.addQueueManagerMenu();
+//    cmhelper.addSeparator();
+//    // --------------------------------------------------------
+//    cmhelper.addAction("image_rename");
+//    cmhelper.addAction("cut_album_selection");
+//    cmhelper.addAction("copy_album_selection");
+//    cmhelper.addAction("paste_album_selection");
+//    cmhelper.addStandardActionItemDelete(this, SLOT(deleteSelected()), \
selectedImageIDs.count()); +//    cmhelper.addSeparator();
+//    // --------------------------------------------------------
+//    cmhelper.addStandardActionThumbnail(selectedImageIDs, currentAlbum());
+//    // --------------------------------------------------------
+//    cmhelper.addAssignTagsMenu(selectedImageIDs);
+//    cmhelper.addRemoveTagsMenu(selectedImageIDs);
+//    cmhelper.addSeparator();
+//    // --------------------------------------------------------
+//    cmhelper.addLabelsAction();
+//    if (!d->faceMode)
+//    {
+//        cmhelper.addGroupMenu(selectedImageIDs);
+//    }
+
+//    // special action handling --------------------------------
+
+//    connect(&cmhelper, SIGNAL(signalAssignTag(int)),
+//            this, SLOT(assignTagToSelected(int)));
+
+//    connect(&cmhelper, SIGNAL(signalPopupTagsView()),
+//            this, SIGNAL(signalPopupTagsView()));
+
+//    connect(&cmhelper, SIGNAL(signalRemoveTag(int)),
+//            this, SLOT(removeTagFromSelected(int)));
+
+//    connect(&cmhelper, SIGNAL(signalGotoTag(int)),
+//            this, SIGNAL(gotoTagAndImageRequested(int)));
+
+//    connect(&cmhelper, SIGNAL(signalGotoAlbum(ImageInfo)),
+//            this, SIGNAL(gotoAlbumAndImageRequested(ImageInfo)));
+
+//    connect(&cmhelper, SIGNAL(signalGotoDate(ImageInfo)),
+//            this, SIGNAL(gotoDateAndImageRequested(ImageInfo)));
+
+//    connect(&cmhelper, SIGNAL(signalAssignPickLabel(int)),
+//            this, SLOT(assignPickLabelToSelected(int)));
+
+//    connect(&cmhelper, SIGNAL(signalAssignColorLabel(int)),
+//            this, SLOT(assignColorLabelToSelected(int)));
+
+//    connect(&cmhelper, SIGNAL(signalAssignRating(int)),
+//            this, SLOT(assignRatingToSelected(int)));
+
+//    connect(&cmhelper, SIGNAL(signalSetThumbnail(ImageInfo)),
+//            this, SLOT(setAsAlbumThumbnail(ImageInfo)));
+
+//    connect(&cmhelper, SIGNAL(signalAddToExistingQueue(int)),
+//            this, SLOT(insertSelectedToExistingQueue(int)));
+
+//    connect(&cmhelper, SIGNAL(signalCreateGroup()),
+//            this, SLOT(createGroupFromSelection()));
+
+//    connect(&cmhelper, SIGNAL(signalCreateGroupByTime()),
+//            this, SLOT(createGroupByTimeFromSelection()));
+
+//    connect(&cmhelper, SIGNAL(signalUngroup()),
+//            this, SLOT(ungroupSelected()));
+
+//    connect(&cmhelper, SIGNAL(signalRemoveFromGroup()),
+//            this, SLOT(removeSelectedFromGroup()));
+
+//    // --------------------------------------------------------
+
+//    QAction* choice = cmhelper.exec(event->globalPos());
+
+//    if (choice && (choice == viewAction))
+//    {
+//        emit previewRequested(info);
+//    }
+}
+
+void ImportIconView::showContextMenu(QContextMenuEvent* event)
+{
+//    Album* album = currentAlbum();
+
+//    if (!album ||
+//        album->isRoot() ||
+//        (album->type() != Album::PHYSICAL && album->type() != Album::TAG) )
+//    {
+//        return;
+//    }
+
+//    KMenu popmenu(this);
+//    ContextMenuHelper cmhelper(&popmenu);
+//    cmhelper.setImageFilterModel(imageFilterModel());
+
+//    cmhelper.addAction("full_screen");
+//    cmhelper.addSeparator();
+//    // --------------------------------------------------------
+//    cmhelper.addStandardActionPaste(this, SLOT(paste()));
+//    // --------------------------------------------------------
+
+//    cmhelper.exec(event->globalPos());
+}
+
+} // namespace Digikam
diff --git a/utilities/cameragui/views/importiconview.h \
b/utilities/cameragui/views/importiconview.h new file mode 100644
index 0000000..b0aba96
--- /dev/null
+++ b/utilities/cameragui/views/importiconview.h
@@ -0,0 +1,64 @@
+#ifndef ImportIconView_H
+#define ImportIconView_H
+
+// Local includes
+
+#include "importcategorizedview.h"
+
+namespace Digikam
+{
+
+class ImageViewUtilities;
+
+class ImportIconView : public ImportCategorizedView
+{
+    Q_OBJECT
+
+public:
+
+    ImportIconView(QWidget* parent = 0);
+    ~ImportIconView();
+
+    void init(CameraController* controller);
+
+    ImageViewUtilities* utilities() const;
+
+    int fitToWidthIcons();
+
+    virtual void setThumbnailSize(const ThumbnailSize& size);
+
+public Q_SLOTS:
+
+    void deleteSelected(bool permanently = false);
+    void deleteSelectedDirectly(bool permanently = false);
+
+    void createGroupFromSelection();
+    void createGroupByTimeFromSelection();
+    void ungroupSelected();
+    void removeSelectedFromGroup();
+    void rename();
+
+Q_SIGNALS:
+
+    void previewRequested(const CamItemInfo& info);
+
+protected:
+
+    virtual void activated(const CamItemInfo& info);
+    virtual void showContextMenuOnInfo(QContextMenuEvent* event, const CamItemInfo& \
info); +    virtual void showContextMenu(QContextMenuEvent* event);
+    virtual void slotSetupChanged();
+
+    void slotRotateLeft(const QList<QModelIndex>&);
+    void slotRotateRight(const QList<QModelIndex>&);
+    void slotInitProgressIndicator();
+
+private:
+
+    class ImportIconViewPriv;
+    ImportIconViewPriv* const d;
+};
+
+} // namespace Digikam
+
+#endif // ImportIconView_H
diff --git a/utilities/cameragui/views/importiconview_p.cpp \
b/utilities/cameragui/views/importiconview_p.cpp new file mode 100644
index 0000000..f54fc95
--- /dev/null
+++ b/utilities/cameragui/views/importiconview_p.cpp
@@ -0,0 +1,59 @@
+#include "importiconview_p.h"
+
+namespace Digikam
+{
+
+ImportIconView::ImportIconViewPriv::ImportIconViewPriv(ImportIconView* qq)
+    : overlaysActive(false), q_ptr(qq)
+{
+    //TODO: utilities          = 0;
+    //TODO: rotateLeftOverlay  = 0;
+    //TODO: rotateRightOverlay = 0;
+    normalDelegate     = 0;
+}
+
+ImportIconView::ImportIconViewPriv::~ImportIconViewPriv()
+{
+}
+
+void ImportIconView::ImportIconViewPriv::updateOverlays()
+{
+    Q_Q(ImportIconView);
+    ImportSettings* settings = ImportSettings::instance();
+
+//TODO: Implement overlays.
+//    if (overlaysActive)
+//    {
+//        if (!settings->getIconShowOverlays())
+//        {
+//            disconnect(rotateLeftOverlay, \
SIGNAL(signalRotate(QList<QModelIndex>)), +//                       q, \
SLOT(slotRotateLeft(QList<QModelIndex>))); +
+//            disconnect(rotateRightOverlay, \
SIGNAL(signalRotate(QList<QModelIndex>)), +//                       q, \
SLOT(slotRotateRight(QList<QModelIndex>))); +
+//            q->removeOverlay(rotateLeftOverlay);
+//            q->removeOverlay(rotateRightOverlay);
+
+//            overlaysActive = false;
+//        }
+//    }
+//    else
+//    {
+//        if (settings->getIconShowOverlays())
+//        {
+//            q->addOverlay(rotateLeftOverlay, normalDelegate);
+//            q->addOverlay(rotateRightOverlay, normalDelegate);
+
+//            connect(rotateLeftOverlay, SIGNAL(signalRotate(QList<QModelIndex>)),
+//                    q, SLOT(slotRotateLeft(QList<QModelIndex>)));
+
+//            connect(rotateRightOverlay, SIGNAL(signalRotate(QList<QModelIndex>)),
+//                    q, SLOT(slotRotateRight(QList<QModelIndex>)));
+
+//            overlaysActive = true;
+//        }
+//    }
+}
+
+} // namespace Digikam
diff --git a/utilities/cameragui/views/importiconview_p.h \
b/utilities/cameragui/views/importiconview_p.h new file mode 100644
index 0000000..4d6e8c4
--- /dev/null
+++ b/utilities/cameragui/views/importiconview_p.h
@@ -0,0 +1,72 @@
+/* ============================================================
+ *
+ * This file is a part of digiKam project
+ * http://www.digikam.org
+ *
+ * Date        : 2012-25-07
+ * Description : Private Qt item view for images
+ *
+ * Copyright (C) 2012 by Islam Wazery <wazery at ubuntu dot com>
+ *
+ * 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 IMPORTICONVIEW_P_H
+#define IMPORTICONVIEW_P_H
+
+// Qt includes
+
+#include <QObject>
+
+// Local includes
+
+#include "importiconview.h"
+#include "importdelegate.h"
+#include "importsettings.h"
+
+namespace Digikam
+{
+
+class ImportNormalDelegate;
+
+class ImportIconView::ImportIconViewPriv : public QObject
+{
+    Q_OBJECT
+    Q_DECLARE_PUBLIC(ImportIconView)
+
+public:
+
+    ImportIconViewPriv(ImportIconView* qq);
+    virtual ~ImportIconViewPriv();
+
+    void updateOverlays();
+    void triggerRotateAction(const char* actionName);
+
+public:
+
+    ImageViewUtilities*       utilities;
+    ImportNormalDelegate*     normalDelegate;
+
+    bool                      overlaysActive;
+
+    //ImageRotateOverlay*       rotateLeftOverlay;
+    //ImageRotateOverlay*       rotateRightOverlay;
+
+private:
+
+    ImportIconView*           q_ptr;
+};
+
+} // namespace Digikam
+
+#endif // IMPORTICONVIEW_P_H
diff --git a/utilities/cameragui/views/importpreviewview.cpp \
b/utilities/cameragui/views/importpreviewview.cpp new file mode 100644
index 0000000..0ff1b4d
--- /dev/null
+++ b/utilities/cameragui/views/importpreviewview.cpp
@@ -0,0 +1,508 @@
+/* ============================================================
+ *
+ * This file is a part of digiKam project
+ * http://www.digikam.org
+ *
+ * Date        : 2012-14-07
+ * Description : An embedded view to show the cam item preview widget.
+ *
+ * Copyright (C) 2012 by Islam Wazery  <wazery at ubuntu dot com>
+ *
+ * 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.
+ *
+ * ============================================================ */
+
+#include "importpreviewview.h"
+
+// Qt includes
+
+#include <QMouseEvent>
+#include <QGraphicsSceneContextMenuEvent>
+#include <QToolBar>
+
+// KDE includes
+
+#include <klocale.h>
+#include <ktoggleaction.h>
+#include <kmenu.h>
+#include <kapplication.h>
+
+// Local includes
+
+#include "dimgpreviewitem.h"
+#include "fileactionmngr.h"
+#include "contextmenuhelper.h"
+#include "previewlayout.h"
+#include "thememanager.h"
+#include "importsettings.h"
+
+namespace Digikam
+{
+
+class ImportPreviewViewItem : public DImgPreviewItem
+{
+public:
+
+    ImportPreviewViewItem(ImportPreviewView* view)
+        : m_view(view)/*, m_group(0)*/
+    {
+        setAcceptHoverEvents(true);
+    }
+
+    //void setFaceGroup(FaceGroup* group)
+    //{
+    //    m_group = group;
+    //}
+
+    void contextMenuEvent(QGraphicsSceneContextMenuEvent* event)
+    {
+        m_view->showContextMenu(m_info, event);
+    }
+
+    void setCamItemInfo(const CamItemInfo& info)
+    {
+        m_info = info;
+
+        //FIXME: is this a valid path?
+        setPath(info.url().prettyUrl());
+    }
+
+    void hoverEnterEvent(QGraphicsSceneHoverEvent* e)
+    {
+        Q_UNUSED(e) //FIXME
+        //m_group->itemHoverEnterEvent(e);
+    }
+
+    void hoverLeaveEvent(QGraphicsSceneHoverEvent* e)
+    {
+        Q_UNUSED(e) //FIXME:
+        //m_group->itemHoverLeaveEvent(e);
+    }
+
+    void hoverMoveEvent(QGraphicsSceneHoverEvent* e)
+    {
+        Q_UNUSED(e) //FIXME:
+        //m_group->itemHoverMoveEvent(e);
+    }
+
+    CamItemInfo camItemInfo() const
+    {
+        return m_info;
+    }
+
+protected:
+
+    ImportPreviewView* m_view;
+    //FaceGroup*        m_group;
+    CamItemInfo         m_info;
+};
+
+// ---------------------------------------------------------------------
+
+class ImportPreviewView::ImportPreviewViewPriv
+{
+public:
+
+    ImportPreviewViewPriv()
+    {
+        //peopleTagsShown    = false;
+        fullSize           = 0;
+        scale              = 1.0;
+        item               = 0;
+        isValid            = false;
+        toolBar            = 0;
+        //back2FilesListAction   = 0;
+        prevAction         = 0;
+        nextAction         = 0;
+        //rotLeftAction      = 0;
+        //rotRightAction     = 0;
+        //peopleToggleAction = 0;
+        //addPersonAction    = 0;
+        //faceGroup          = 0;
+        mode               = ImportPreviewView::IconViewPreview;
+    }
+
+    //bool                   peopleTagsShown;
+    bool                   fullSize;
+    double                 scale;
+    bool                   isValid;
+
+    ImportPreviewView::Mode mode;
+
+    ImportPreviewViewItem*  item;
+
+    //QAction*               back2FilesListAction;
+    QAction*               prevAction;
+    QAction*               nextAction;
+    //QAction*               rotLeftAction;
+    //QAction*               rotRightAction;
+    //KToggleAction*         peopleToggleAction;
+    //QAction*               addPersonAction;
+    //QAction*               forgetFacesAction;
+
+    QToolBar*              toolBar;
+
+    //FaceGroup*             faceGroup;
+};
+
+ImportPreviewView::ImportPreviewView(QWidget* parent, Mode mode)
+    : GraphicsDImgView(parent), d(new ImportPreviewViewPriv)
+{
+    d->mode = mode;
+    d->item = new ImportPreviewViewItem(this);
+    setItem(d->item);
+
+    //d->faceGroup = new FaceGroup(this);
+    //d->faceGroup->setShowOnHover(true);
+
+    //d->item->setFaceGroup(d->faceGroup);
+
+    connect(d->item, SIGNAL(loaded()),
+            this, SLOT(imageLoaded()));
+
+    connect(d->item, SIGNAL(loadingFailed()),
+            this, SLOT(imageLoadingFailed()));
+
+    // set default zoom
+    layout()->fitToWindow();
+
+    // ------------------------------------------------------------
+
+    installPanIcon();
+
+    setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+
+    // ------------------------------------------------------------
+
+    //FIXME: d->back2FilesListAction   = new QAction(SmallIcon("folder-image"),      \
i18n("Back to Camera Files"),       this); +    d->prevAction         = new \
QAction(SmallIcon("go-previous"),         i18nc("go to previous image", "Back"),  \
this); +    d->nextAction         = new QAction(SmallIcon("go-next"),             \
i18nc("go to next image", "Forward"),   this); +    //FIXME: d->rotLeftAction      = \
new QAction(SmallIcon("object-rotate-left"),  i18nc("@info:tooltip", "Rotate Left"),  \
this); +    //FIXME: d->rotRightAction     = new \
QAction(SmallIcon("object-rotate-right"), i18nc("@info:tooltip", "Rotate Right"), \
this); +    //FIXME: d->addPersonAction    = new QAction(SmallIcon("list-add-user"),  \
i18n("Add a Face Tag"),                 this); +    //FIXME: d->forgetFacesAction  = \
new QAction(SmallIcon("list-remove-user"),    i18n("Clear all faces on this image"),  \
this); +    //FIXME: d->peopleToggleAction = new KToggleAction(i18n("Show Face \
Tags"),                                             this); +    //FIXME: \
d->peopleToggleAction->setIcon(SmallIcon("user-identity")); +
+    d->toolBar = new QToolBar(this);
+
+    if (mode == IconViewPreview)
+    {
+        d->toolBar->addAction(d->prevAction);
+        d->toolBar->addAction(d->nextAction);
+        //FIXME: d->toolBar->addAction(d->back2FilesListAction);
+    }
+
+    //FIXME: d->toolBar->addAction(d->rotLeftAction);
+    //FIXME: d->toolBar->addAction(d->rotRightAction);
+    //FIXME: d->toolBar->addAction(d->peopleToggleAction);
+    //FIXME: d->toolBar->addAction(d->addPersonAction);
+
+    connect(d->prevAction, SIGNAL(triggered()),
+            this, SIGNAL(toPreviousImage()));
+
+    connect(d->nextAction, SIGNAL(triggered()),
+            this, SIGNAL(toNextImage()));
+
+    //FIXME: connect(d->back2FilesListAction, SIGNAL(triggered()),
+            //this, SIGNAL(signalBack2Album()));
+
+    //FIXME: connect(d->rotLeftAction, SIGNAL(triggered()),
+            //this, SLOT(slotRotateLeft()));
+
+    //FIXME: connect(d->rotRightAction, SIGNAL(triggered()),
+            //this, SLOT(slotRotateRight()));
+
+    //FIXME: connect(d->peopleToggleAction, SIGNAL(toggled(bool)),
+            //d->faceGroup, SLOT(setVisible(bool)));
+
+    //FIXME: connect(d->addPersonAction, SIGNAL(triggered()),
+            //d->faceGroup, SLOT(addFace()));
+
+    //FIXME: connect(d->forgetFacesAction, SIGNAL(triggered()),
+            //d->faceGroup, SLOT(rejectAll()));
+
+    // ------------------------------------------------------------
+
+    connect(this, SIGNAL(toNextImage()),
+            this, SIGNAL(signalNextItem()));
+
+    connect(this, SIGNAL(toPreviousImage()),
+            this, SIGNAL(signalPrevItem()));
+
+    //FIXME: connect(this, SIGNAL(activated()),
+            //this, SIGNAL(signalBack2Album()));
+
+    connect(ThemeManager::instance(), SIGNAL(signalThemeChanged()),
+            this, SLOT(slotThemeChanged()));
+
+    connect(ImportSettings::instance(), SIGNAL(setupChanged()),
+            this, SLOT(slotSetupChanged()));
+
+    slotSetupChanged();
+}
+
+ImportPreviewView::~ImportPreviewView()
+{
+    delete d->item;
+    delete d;
+}
+
+void ImportPreviewView::reload()
+{
+    previewItem()->reload();
+}
+
+void ImportPreviewView::camItemLoaded()
+{
+    emit signalPreviewLoaded(true);
+    //FIXME: d->rotLeftAction->setEnabled(true);
+    //FIXME: d->rotRightAction->setEnabled(true);
+
+    //FIXME: d->faceGroup->setInfo(d->item->camItemInfo());
+}
+
+void ImportPreviewView::camItemLoadingFailed()
+{
+    emit signalPreviewLoaded(false);
+    //FIXME: d->rotLeftAction->setEnabled(false);
+    //FIXME: d->rotRightAction->setEnabled(false);
+    //FIXME: d->faceGroup->setInfo(CamItemInfo());
+}
+
+void ImportPreviewView::setCamItemInfo(const CamItemInfo& info, const CamItemInfo& \
previous, const CamItemInfo& next) +{
+    //FIXME: d->faceGroup->aboutToSetInfo(info);
+    d->item->setCamItemInfo(info);
+
+    d->prevAction->setEnabled(!previous.isNull());
+    d->nextAction->setEnabled(!next.isNull());
+
+    QStringList previewPaths;
+
+    if (next.mime == "FIXME ... IMAGE")
+    {
+        //FIXME: is this a valid path?
+        previewPaths << next.url().prettyUrl();
+    }
+
+    if (previous.mime == "FIXME ... IMAGE")
+    {
+        //FIXME: is this a valid path?
+        previewPaths << previous.url().prettyUrl();
+    }
+
+    d->item->setPreloadPaths(previewPaths);
+}
+
+CamItemInfo ImportPreviewView::getCamItemInfo() const
+{
+    return d->item->camItemInfo();
+}
+
+bool ImportPreviewView::acceptsMouseClick(QMouseEvent* e)
+{
+    if (!GraphicsDImgView::acceptsMouseClick(e))
+    {
+        return false;
+    }
+    return false; //FIXME:
+
+    //FIXME: return d->faceGroup->acceptsMouseClick(mapToScene(e->pos()));
+}
+
+void ImportPreviewView::enterEvent(QEvent* e)
+{
+    Q_UNUSED(e) //FIXME
+    //FIXME: d->faceGroup->enterEvent(e);
+}
+
+void ImportPreviewView::leaveEvent(QEvent* e)
+{
+    Q_UNUSED(e) //FIXME
+    //FIXME: d->faceGroup->leaveEvent(e);
+}
+
+void ImportPreviewView::showEvent(QShowEvent* e)
+{
+    Q_UNUSED(e) //FIXME
+    GraphicsDImgView::showEvent(e);
+    //FIXME: d->faceGroup->setVisible(d->peopleToggleAction->isChecked());
+}
+
+void ImportPreviewView::showContextMenu(const CamItemInfo& info, \
QGraphicsSceneContextMenuEvent* event) +{
+    if (info.isNull())
+    {
+        return;
+    }
+
+    event->accept();
+
+    QList<qlonglong> idList;
+    idList << info.id;
+    KUrl::List selectedItems;
+    selectedItems << info.url();
+
+    // --------------------------------------------------------
+
+    KMenu popmenu(this);
+    ContextMenuHelper cmhelper(&popmenu);
+
+    cmhelper.addAction("full_screen");
+    cmhelper.addSeparator();
+
+    // --------------------------------------------------------
+
+    if (d->mode == IconViewPreview)
+    {
+        cmhelper.addAction(d->prevAction, true);
+        cmhelper.addAction(d->nextAction, true);
+        //FIXME: cmhelper.addAction(d->back2FilesListAction);
+        cmhelper.addGotoMenu(idList);
+        cmhelper.addSeparator();
+    }
+
+    // --------------------------------------------------------
+
+    //FIXME: cmhelper.addAction(d->peopleToggleAction, true);
+    //FIXME: cmhelper.addAction(d->addPersonAction, true);
+    //FIXME: cmhelper.addAction(d->forgetFacesAction, true);
+    //FIXME: cmhelper.addSeparator();
+
+    // --------------------------------------------------------
+
+    cmhelper.addAction("image_edit");
+    cmhelper.addServicesMenu(selectedItems);
+    cmhelper.addRotateMenu(idList);
+    cmhelper.addSeparator();
+
+    // --------------------------------------------------------
+
+    cmhelper.addAction("image_find_similar");
+
+    if (d->mode == IconViewPreview)
+    {
+        cmhelper.addStandardActionLightTable();
+    }
+
+    cmhelper.addQueueManagerMenu();
+    cmhelper.addSeparator();
+
+    // --------------------------------------------------------
+
+    cmhelper.addStandardActionItemDelete(this, SLOT(slotDeleteItem()));
+    cmhelper.addSeparator();
+
+    // --------------------------------------------------------
+
+    //FIXME: cmhelper.addAssignTagsMenu(idList);
+    //FIXME: cmhelper.addRemoveTagsMenu(idList);
+    //FIXME: cmhelper.addSeparator();
+
+    // --------------------------------------------------------
+
+    cmhelper.addLabelsAction();
+
+    // special action handling --------------------------------
+
+    //FIXME: connect(&cmhelper, SIGNAL(signalAssignTag(int)),
+            //this, SLOT(slotAssignTag(int)));
+
+    //FIXME: connect(&cmhelper, SIGNAL(signalPopupTagsView()),
+            //this, SIGNAL(signalPopupTagsView()));
+
+    //FIXME: connect(&cmhelper, SIGNAL(signalRemoveTag(int)),
+            //this, SLOT(slotRemoveTag(int)));
+
+    //FIXME: connect(&cmhelper, SIGNAL(signalAssignPickLabel(int)),
+            //this, SLOT(slotAssignPickLabel(int)));
+
+    //FIXME: connect(&cmhelper, SIGNAL(signalAssignColorLabel(int)),
+            //this, SLOT(slotAssignColorLabel(int)));
+
+    //FIXME: connect(&cmhelper, SIGNAL(signalAssignRating(int)),
+            //this, SLOT(slotAssignRating(int)));
+
+    //FIXME: connect(&cmhelper, SIGNAL(signalAddToExistingQueue(int)),
+            //this, SIGNAL(signalAddToExistingQueue(int)));
+
+    //FIXME: connect(&cmhelper, SIGNAL(signalGotoTag(int)),
+            //this, SIGNAL(signalGotoTagAndItem(int)));
+
+    //FIXME: connect(&cmhelper, SIGNAL(signalGotoFolder(CamItemInfo)),
+            //this, SIGNAL(signalGotoFolderAndItem(CamItemInfo)));
+
+    //FIXME: connect(&cmhelper, SIGNAL(signalGotoDate(CamItemInfo)),
+            //this, SIGNAL(signalGotoDateAndItem(CamItemInfo)));
+
+    cmhelper.exec(event->screenPos());
+}
+
+//void ImportPreviewView::slotAssignTag(int tagID)
+//{
+//    FileActionMngr::instance()->assignTag(d->item->camItemInfo(), tagID);
+//}
+
+//void ImportPreviewView::slotRemoveTag(int tagID)
+//{
+//    FileActionMngr::instance()->removeTag(d->item->camItemInfo(), tagID);
+//}
+
+//void ImportPreviewView::slotAssignPickLabel(int pickId)
+//{
+//    FileActionMngr::instance()->assignPickLabel(d->item->camItemInfo(), pickId);
+//}
+
+//void ImportPreviewView::slotAssignColorLabel(int colorId)
+//{
+//    FileActionMngr::instance()->assignColorLabel(d->item->camItemInfo(), colorId);
+//}
+
+//void ImportPreviewView::slotAssignRating(int rating)
+//{
+//    FileActionMngr::instance()->assignRating(d->item->camItemInfo(), rating);
+//}
+
+void ImportPreviewView::slotThemeChanged()
+{
+    QPalette plt(palette());
+    plt.setColor(backgroundRole(), kapp->palette().color(QPalette::Base));
+    setPalette(plt);
+}
+
+void ImportPreviewView::slotSetupChanged()
+{
+    previewItem()->setLoadFullImageSize(ImportSettings::instance()->getPreviewLoadFullImageSize());
 +
+    d->toolBar->setVisible(ImportSettings::instance()->getPreviewShowIcons());
+    setShowText(ImportSettings::instance()->getPreviewShowIcons());
+
+    // pass auto-suggest?
+}
+
+//void ImportPreviewView::slotRotateLeft()
+//{
+//    FileActionMngr::instance()->transform(QList<CamItemInfo>() << \
d->item->camItemInfo(), KExiv2Iface::RotationMatrix::Rotate270); +//}
+
+//void ImportPreviewView::slotRotateRight()
+//{
+//    FileActionMngr::instance()->transform(QList<CamItemInfo>() << \
d->item->camItemInfo(), KExiv2Iface::RotationMatrix::Rotate90); +//}
+
+void ImportPreviewView::slotDeleteItem()
+{
+    emit signalDeleteItem();
+}
+
+} // namespace Digikam
diff --git a/utilities/cameragui/views/importpreviewview.h \
b/utilities/cameragui/views/importpreviewview.h new file mode 100644
index 0000000..96a07c1
--- /dev/null
+++ b/utilities/cameragui/views/importpreviewview.h
@@ -0,0 +1,115 @@
+/* ============================================================
+ *
+ * This file is a part of digiKam project
+ * http://www.digikam.org
+ *
+ * Date        : 2012-14-07
+ * Description : An embedded view to show the cam item preview widget.
+ *
+ * Copyright (C) 2012 by Islam Wazery  <wazery at ubuntu dot com>
+ *
+ * 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 IMPORTPREVIEWVIEW_H
+#define IMPORTPREVIEWVIEW_H
+
+// Local includes
+
+#include "graphicsdimgview.h"
+#include "camiteminfo.h"
+
+namespace Digikam
+{
+
+class ImportPreviewView : public GraphicsDImgView
+{
+    Q_OBJECT
+
+public:
+
+    enum Mode
+    {
+        IconViewPreview
+    };
+
+    explicit ImportPreviewView(QWidget* parent, Mode mode = IconViewPreview);
+    ~ImportPreviewView();
+
+    void setCamItemInfo(const CamItemInfo& info   = CamItemInfo(),
+                      const CamItemInfo& previous = CamItemInfo(),
+                      const CamItemInfo& next     = CamItemInfo());
+
+    CamItemInfo getCamItemInfo() const;
+
+    void reload();
+    void setCamItemPath(const QString& path = QString());
+    void setPreviousNextPaths(const QString& previous, const QString& next);
+
+    void showContextMenu(const CamItemInfo& info, QGraphicsSceneContextMenuEvent* \
event); +
+Q_SIGNALS:
+
+    void signalNextItem();
+    void signalPrevItem();
+    void signalDeleteItem();
+    void signalEditItem();
+    void signalPreviewLoaded(bool success);
+    void signalBack2FilesList();
+    //void signalSlideShow();
+    //void signalInsert2LightTable();
+    //void signalInsert2QueueMgr();
+    //void signalFindSimilar();
+    //void signalAddToExistingQueue(int);
+
+    //void signalGotoFolderAndItem(const CamItemInfo&);
+    //void signalGotoDateAndItem(const CamItemInfo&);
+    //void signalGotoTagAndItem(int);
+    //void signalPopupTagsView();
+
+protected:
+
+    bool acceptsMouseClick(QMouseEvent* e);
+    void enterEvent(QEvent* e);
+    void leaveEvent(QEvent* e);
+    void showEvent(QShowEvent* e);
+
+private Q_SLOTS:
+
+    void camItemLoaded();
+    void camItemLoadingFailed();
+
+    //TOOD: Implement Tags, Rating, and Lables in Import Tool
+    //void slotAssignTag(int tagID);
+    //void slotRemoveTag(int tagID);
+    //void slotAssignRating(int rating);
+    //void slotAssignPickLabel(int pickId);
+    //void slotAssignColorLabel(int colorId);
+
+    void slotThemeChanged();
+    void slotSetupChanged();
+
+    //FIXME: Will the revamped Import Tool have a rotate option?
+    //void slotRotateLeft();
+    //void slotRotateRight();
+    void slotDeleteItem();
+
+private:
+
+    class ImportPreviewViewPriv;
+    ImportPreviewViewPriv* const d;
+};
+
+} // namespace Digikam
+
+#endif // IMPORTPREVIEWVIEW_H
diff --git a/utilities/cameragui/views/importstackedview.cpp \
b/utilities/cameragui/views/importstackedview.cpp new file mode 100644
index 0000000..c1ff88c
--- /dev/null
+++ b/utilities/cameragui/views/importstackedview.cpp
@@ -0,0 +1,476 @@
+/* ============================================================
+ *
+ * This file is a part of digiKam project
+ * http://www.digikam.org
+ *
+ * Date        : 2012-05-07
+ * Description : QStackedWidget to handle different types of views
+ *               (icon view, image preview, media view)
+ *
+ * Copyright (C) 2012 by Islam Wazery <wazery at ubuntu dot com>
+ *
+ * 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.
+ *
+ * ============================================================ */
+
+#include "importstackedview.moc"
+#include "importstackedview.h" //TOOD: Remove this line
+
+// Qt includes
+
+#include <QSplitter>
+
+// Local includes
+
+#include "previewlayout.h"
+#include "importsettings.h"
+
+namespace Digikam
+{
+
+class ImportStackedView::ImportStackedViewPriv
+{
+
+public:
+
+    ImportStackedViewPriv()
+    {
+        dockArea            = 0;
+        splitter            = 0;
+       //REM thumbBar            = 0;
+        //REMthumbBarDock        = 0;
+        importIconView      = 0;
+        importPreviewView   = 0;
+        //mediaPlayerView     = 0;
+        //mapWidgetView       = 0;
+        syncingSelection    = false;
+    }
+
+    bool                syncingSelection;
+
+    QMainWindow*        dockArea;
+    QSplitter*          splitter;
+
+    ImportIconView*     importIconView;
+    //REMImportThumbnailBar* thumbBar;
+    ImportPreviewView*  importPreviewView;
+    //REMThumbBarDock*       thumbBarDock;
+    //FIXME: MediaPlayerView*   mediaPlayerView;
+    //FIXME: MapWidgetView*     mapWidgetView;
+};
+
+ImportStackedView::ImportStackedView(CameraController* controller, QWidget* parent)
+    : QStackedWidget(parent), d(new ImportStackedViewPriv)
+{
+    d->importIconView    = new ImportIconView(this);
+    //d->importPreviewView = new ImportPreviewView(this);
+    //d->thumbBarDock      = new ThumbBarDock();
+    //d->thumbBar          = new ImportThumbnailBar(d->thumbBarDock);
+    //d->thumbBar->setModelsFiltered(d->importIconView->importImageModel(), \
d->importIconView->importFilterModel()); +    //FIXME: \
d->thumbBar->installRatingOverlay(); +
+    //d->thumbBarDock->setWidget(d->thumbBar);
+    //d->thumbBarDock->setObjectName("import_thumbbar");
+
+    if(controller)
+    {
+        d->importIconView->init(controller);
+    }
+
+    //FIXME: d->mediaPlayerView = new MediaPlayerView(this);
+    //FIXME: d->mapWidgetView   = new \
MapWidgetView(d->importIconView->getSelectionModel(), +                               \
//d->importIconView->imageFilterModel(), this); +    //FIXME: \
d->mapWidgetView->setObjectName("import_mapwidgetview"); +
+    insertWidget(PreviewCameraMode, d->importIconView);
+    //REMinsertWidget(PreviewImageMode, d->importPreviewView);
+    //insertWidget(MediaPlayerMode,  d->mediaPlayerView);
+    //insertWidget(MapWidgetMode,    d->mapWidgetView);
+
+    setPreviewMode(PreviewCameraMode);
+    setAttribute(Qt::WA_DeleteOnClose);
+
+    readSettings();
+
+    // -----------------------------------------------------------------
+
+    //FIXME: connect(d->importPreviewView, SIGNAL(signalPopupTagsView()),
+            //d->importIconView, SIGNAL(signalPopupTagsView()));
+
+    //REMconnect(d->importPreviewView, SIGNAL(signalGotoFolderAndItem(CamItemInfo)),
+            //REMthis, SIGNAL(signalGotoFolderAndItem(CamItemInfo)));
+
+    //REMconnect(d->importPreviewView, SIGNAL(signalGotoDateAndItem(CamItemInfo)),
+            //REMthis, SIGNAL(signalGotoDateAndItem(CamItemInfo)));
+
+    //FIXME: connect(d->importPreviewView, SIGNAL(signalGotoTagAndItem(int)),
+            //this, SIGNAL(signalGotoTagAndItem(int)));
+
+    //REMconnect(d->importPreviewView, SIGNAL(signalNextItem()),
+            //REMthis, SIGNAL(signalNextItem()));
+
+    //REMconnect(d->importPreviewView, SIGNAL(signalPrevItem()),
+            //REMthis, SIGNAL(signalPrevItem()));
+
+   //REM connect(d->importPreviewView, SIGNAL(signalEditItem()),
+          //REM  this, SIGNAL(signalEditItem()));
+
+    //REMconnect(d->importPreviewView, SIGNAL(signalDeleteItem()),
+         //REM   this, SIGNAL(signalDeleteItem()));
+
+    //FIXME: connect(d->importPreviewView, SIGNAL(signalBack2FilesList()),
+            //this, SIGNAL(signalBack2Album()));
+
+    //REMconnect(d->importPreviewView->layout(), SIGNAL(zoomFactorChanged(double)),
+            //REMthis, SLOT(slotZoomFactorChanged(double)));
+
+    //FIXME: connect(d->importPreviewView, SIGNAL(signalInsert2LightTable()),
+            //this, SIGNAL(signalInsert2LightTable()));
+
+    //FIXME: connect(d->importPreviewView, SIGNAL(signalInsert2QueueMgr()),
+            //this, SIGNAL(signalInsert2QueueMgr()));
+
+    //FIXME: connect(d->importPreviewView, SIGNAL(signalFindSimilar()),
+            //this, SIGNAL(signalFindSimilar()));
+
+    //FIXME: connect(d->importPreviewView, SIGNAL(signalAddToExistingQueue(int)),
+            //this, SIGNAL(signalAddToExistingQueue(int)));
+
+    //REMconnect(d->thumbBar, SIGNAL(selectionChanged()),
+           //REM this, SLOT(slotThumbBarSelectionChanged()));
+
+    connect(d->importIconView, SIGNAL(selectionChanged()),
+            this, SLOT(slotIconViewSelectionChanged()));
+
+    //REMconnect(d->thumbBarDock, SIGNAL(dockLocationChanged(Qt::DockWidgetArea)),
+            //REMd->thumbBar, SLOT(slotDockLocationChanged(Qt::DockWidgetArea)));
+
+    //FIXME: connect(d->mediaPlayerView, SIGNAL(signalNextItem()),
+            //this, SIGNAL(signalNextItem()));
+
+    //FIXME: connect(d->mediaPlayerView, SIGNAL(signalPrevItem()),
+            //this, SIGNAL(signalPrevItem()));
+
+    //FIXME: connect(d->mediaPlayerView, SIGNAL(signalBack2Album()),
+            //this, SIGNAL(signalBack2Album()));
+
+   //REM connect(d->importPreviewView, SIGNAL(signalPreviewLoaded(bool)),
+            //REMthis, SLOT(slotPreviewLoaded(bool)));
+}
+ImportStackedView::~ImportStackedView()
+{
+    delete d;
+}
+
+void ImportStackedView::readSettings()
+{
+    ImportSettings* settings = ImportSettings::instance();
+    //REMbool showThumbbar        = settings->getShowThumbbar();
+    //REMd->thumbBarDock->setShouldBeVisible(showThumbbar);
+}
+
+void ImportStackedView::setDockArea(QMainWindow* dockArea)
+{
+    // Attach the thumbbar dock to the given dock area and place it initially on \
top. +    d->dockArea = dockArea;
+    //REMd->thumbBarDock->setParent(d->dockArea);
+    //REMd->dockArea->addDockWidget(Qt::TopDockWidgetArea, d->thumbBarDock);
+    //REMd->thumbBarDock->setFloating(false);
+}
+
+//REMThumbBarDock* ImportStackedView::thumbBarDock() const
+//REM{
+//REM    return d->thumbBarDock;
+//REM}
+
+//REMImportThumbnailBar* ImportStackedView::thumbBar() const
+//REM{
+//REM    return d->thumbBar;
+//REM}
+
+void ImportStackedView::slotEscapePreview()
+{
+//FIXME: Uncomment when MediaPlayerView is implemented
+//    if (previewMode() == MediaPlayerMode)
+//    {
+//        d->mediaPlayerView->escapePreview();
+//    }
+}
+
+ImportIconView* ImportStackedView::importIconView() const
+{
+    return d->importIconView;
+}
+
+ImportPreviewView* ImportStackedView::importPreviewView() const
+{
+    return d->importPreviewView;
+}
+
+//MapWidgetView* ImportStackedView::mapWidgetView() const
+//{
+//    return d->mapWidgetView;
+//}
+
+//FIXME: Uncomment when MediaPlayerView is implemented
+//MediaPlayerView* ImportStackedView::mediaPlayerView() const
+//{
+//    return d->mediaPlayerView;
+//}
+
+bool ImportStackedView::isInSingleFileMode() const
+{
+    return currentIndex() == PreviewImageMode || currentIndex() == MediaPlayerMode;
+}
+
+bool ImportStackedView::isInMultipleFileMode() const
+{
+    return currentIndex() == PreviewCameraMode || currentIndex() == MapWidgetMode;
+}
+
+void ImportStackedView::setPreviewItem(const CamItemInfo& info, const CamItemInfo& \
previous, const CamItemInfo& next) +{
+    if (info.isNull())
+    {
+        //FIXME: Uncomment when MediaPlayerView is implemented
+        //if (previewMode() == MediaPlayerMode)
+        //{
+        //    d->mediaPlayerView->setCamItemInfo();
+        //}
+        /*else*/ if (previewMode() == PreviewImageMode)
+        {
+           //REM d->importPreviewView->setCamItemInfo();
+        }
+    }
+    else
+    {
+        if (identifyCategoryforMime(info.mime) == "audio" || \
identifyCategoryforMime(info.mime) == "video") +        {
+            // Stop image viewer
+            if (previewMode() == PreviewImageMode)
+            {
+                //REMd->importPreviewView->setCamItemInfo();
+            }
+
+            //FIXME: Uncomment when MediaPlayerView is implemented
+            //setPreviewMode(MediaPlayerMode);
+            //d->mediaPlayerView->setCamItemInfo(info, previous, next);
+        }
+        else
+        {
+            // Stop media player if running...
+            //FIXME: Uncomment when MediaPlayerView is implemented
+            //if (previewMode() == MediaPlayerMode)
+            //{
+            //    d->mediaPlayerView->setCamItemInfo();
+            //}
+
+            //REMd->importPreviewView->setCamItemInfo(info, previous, next);
+
+            // NOTE: No need to toggle immediately in PreviewImageMode here,
+            // 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. +        }
+
+        // do not touch the selection, only adjust current info
+        //REMQModelIndex currentIndex = \
d->thumbBar->importSortFilterModel()->indexForCamItemInfo(info); +        \
//REMd->thumbBar->selectionModel()->setCurrentIndex(currentIndex, \
QItemSelectionModel::NoUpdate); +    }
+}
+
+QString ImportStackedView::identifyCategoryforMime(QString mime)
+{
+    return mime.split("/").at(0);
+}
+
+int ImportStackedView::previewMode()
+{
+    return indexOf(currentWidget());
+}
+
+void ImportStackedView::setPreviewMode(const int mode)
+{
+    if (mode != PreviewCameraMode && mode != PreviewImageMode &&
+        mode != MediaPlayerMode && mode != MapWidgetMode)
+    {
+        return;
+    }
+
+    if (mode == PreviewImageMode || mode == MediaPlayerMode)
+    {
+        //REMd->thumbBarDock->restoreVisibility();
+        //REMsyncSelection(d->importIconView, d->thumbBar);
+    }
+    else
+    {
+        //REMd->thumbBarDock->hide();
+    }
+
+    //TODO: Implement the MapPageMode
+    //if (mode == PreviewCameraMode || mode == WelcomePageMode || mode == \
MapWidgetMode) +    //{
+    //    setPreviewItem();
+    //    setCurrentIndex(mode);
+    //}
+    //else
+    //{
+    //    setCurrentIndex(mode);
+    //}
+
+    //d->mapWidgetView->setActive(mode == MapWidgetMode);
+
+    //if (mode == PreviewCameraMode)
+    //{
+    //    d->importIconView->setFocus();
+    //}
+    //else if (mode == MapWidgetMode)
+    //{
+    //    d->mapWidgetView->setFocus();
+    //}
+
+    emit signalViewModeChanged();
+}
+
+void ImportStackedView::syncSelection(ImportCategorizedView* from, \
ImportCategorizedView* to) +{
+    ImportSortFilterModel* fromModel = from->importSortFilterModel();
+    ImportSortFilterModel* toModel = to->importSortFilterModel();
+    // set current info
+    QModelIndex currentIndex = toModel->indexForCamItemInfo(from->currentInfo());
+    to->selectionModel()->setCurrentIndex(currentIndex, \
QItemSelectionModel::NoUpdate); +
+    // sync selection
+    QItemSelection selection = from->selectionModel()->selection();
+    QItemSelection newSelection;
+    foreach(const QItemSelectionRange& range, selection)
+    {
+        QModelIndex topLeft = \
toModel->indexForCamItemInfo(fromModel->camItemInfo(range.topLeft())); +        \
QModelIndex bottomRight = \
toModel->indexForCamItemInfo(fromModel->camItemInfo(range.bottomRight())); +        \
newSelection.select(topLeft, bottomRight); +    }
+
+    d->syncingSelection = true;
+    to->selectionModel()->select(newSelection, QItemSelectionModel::ClearAndSelect);
+    d->syncingSelection = false;
+}
+
+void ImportStackedView::slotThumbBarSelectionChanged()
+{
+    if (currentIndex() != PreviewImageMode && currentIndex() != MediaPlayerMode)
+    {
+        return;
+    }
+
+    if (d->syncingSelection)
+    {
+        return;
+    }
+
+    //REMsyncSelection(d->thumbBar, d->importIconView);
+}
+
+void ImportStackedView::slotIconViewSelectionChanged()
+{
+    if (currentIndex() != PreviewCameraMode)
+    {
+        return;
+    }
+
+    if (d->syncingSelection)
+    {
+        return;
+    }
+
+    //REMsyncSelection(d->importIconView, d->thumbBar);
+}
+
+void ImportStackedView::previewLoaded()
+{
+    emit signalViewModeChanged();
+}
+
+void ImportStackedView::slotZoomFactorChanged(double z)
+{
+    if (previewMode() == PreviewImageMode)
+    {
+        emit signalZoomFactorChanged(z);
+    }
+}
+
+void ImportStackedView::increaseZoom()
+{
+    d->importPreviewView->layout()->increaseZoom();
+}
+
+void ImportStackedView::decreaseZoom()
+{
+    d->importPreviewView->layout()->decreaseZoom();
+}
+
+void ImportStackedView::zoomTo100Percents()
+{
+    d->importPreviewView->layout()->setZoomFactor(1.0);
+}
+
+void ImportStackedView::fitToWindow()
+{
+    d->importPreviewView->layout()->fitToWindow();
+}
+
+void ImportStackedView::toggleFitToWindowOr100()
+{
+    d->importPreviewView->layout()->toggleFitToWindowOr100();
+}
+
+bool ImportStackedView::maxZoom()
+{
+    return d->importPreviewView->layout()->atMaxZoom();
+}
+
+bool ImportStackedView::minZoom()
+{
+    return d->importPreviewView->layout()->atMinZoom();
+}
+
+void ImportStackedView::setZoomFactor(double z)
+{
+    // Giving a null anchor means to use the current view center
+    d->importPreviewView->layout()->setZoomFactor(z, QPoint());
+}
+
+void ImportStackedView::setZoomFactorSnapped(double z)
+{
+    d->importPreviewView->layout()->setZoomFactor(z, QPoint(), \
SinglePhotoPreviewLayout::SnapZoomFactor); +}
+
+double ImportStackedView::zoomFactor()
+{
+    return d->importPreviewView->layout()->zoomFactor();
+}
+
+double ImportStackedView::zoomMin()
+{
+    return d->importPreviewView->layout()->minZoomFactor();
+}
+
+double ImportStackedView::zoomMax()
+{
+    return d->importPreviewView->layout()->maxZoomFactor();
+}
+
+void ImportStackedView::slotPreviewLoaded(bool)
+{
+    setPreviewMode(ImportStackedView::PreviewImageMode);
+    previewLoaded();
+}
+
+}  // namespace Digikam
diff --git a/utilities/cameragui/views/importstackedview.h \
b/utilities/cameragui/views/importstackedview.h new file mode 100644
index 0000000..ca6b13a
--- /dev/null
+++ b/utilities/cameragui/views/importstackedview.h
@@ -0,0 +1,137 @@
+/* ============================================================
+ *
+ * This file is a part of digiKam project
+ * http://www.digikam.org
+ *
+ * Date        : 2012-05-07
+ * Description : QStackedWidget to handle different types of views
+ *               (icon view, items preview, media view)
+ *
+ * Copyright (C) 2012 by Islam Wazery <wazery at ubuntu dot com>
+ *
+ * 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 IMPORTSTACKEDVIEW_H
+#define IMPORTSTACKEDVIEW_H
+
+// Qt inclueds
+
+#include <QStackedWidget>
+
+// Local includes
+
+#include "importthumbnailbar.h"
+#include "importpreviewview.h"
+#include "thumbbardock.h"
+#include "camiteminfo.h"
+#include "importiconview.h"
+
+namespace Digikam
+{
+
+class ImportStackedView : public QStackedWidget
+{
+    Q_OBJECT
+
+public:
+
+    enum StackedViewMode
+    {
+        PreviewCameraMode = 0, // previewing the set of items on the camera
+        PreviewImageMode,
+        MediaPlayerMode,
+        MapWidgetMode
+    };
+
+    ImportStackedView(CameraController* controller, QWidget* parent = 0);
+    ~ImportStackedView();
+
+    /*FIXME: Attach the thumbnail dock widget to the specified QMainWindow. */
+    void setDockArea(QMainWindow*);
+
+    //REMThumbBarDock*       thumbBarDock()      const;
+    //REMImportThumbnailBar* thumbBar()          const;
+    ImportIconView*     importIconView()    const;
+    ImportPreviewView*  importPreviewView() const;
+    //FIXME: MapWidgetView*    mapWidgetView()    const;
+    //FIXME: MediaPlayerView*  mediaPlayerView()  const;
+
+    bool isInSingleFileMode() const;
+    bool isInMultipleFileMode() const;
+    //FIXME: bool isInAbstractMode() const;
+
+    void setPreviewItem(const CamItemInfo& info = CamItemInfo(),
+                        const CamItemInfo& previous = CamItemInfo(),
+                        const CamItemInfo& next = CamItemInfo());
+
+    int  previewMode();
+    void setPreviewMode(const int mode);
+    void previewLoaded();
+
+    void   increaseZoom();
+    void   decreaseZoom();
+    void   fitToWindow();
+    void   toggleFitToWindowOr100();
+    void   zoomTo100Percents();
+    bool   maxZoom();
+    bool   minZoom();
+    void   setZoomFactor(double z);
+    void   setZoomFactorSnapped(double z);
+    double zoomFactor();
+    double zoomMin();
+    double zoomMax();
+
+Q_SIGNALS:
+
+    void signalNextItem();
+    void signalPrevItem();
+    //FIXME: void signalEditItem();
+    void signalDeleteItem();
+    void signalViewModeChanged();
+    //FIXME: void signalBack2FilesList();
+    //FIXME: void signalSlideShow();
+    void signalZoomFactorChanged(double);
+
+    //FIXME: void signalGotoAlbumAndItem(const CamItemInfo&);
+    //FIXME: void signalGotoDateAndItem(const CamItemInfo&);
+    //FIXME: void signalGotoTagAndItem(int);
+
+public Q_SLOTS:
+
+    void slotEscapePreview();
+
+private Q_SLOTS:
+
+    void slotPreviewLoaded(bool);
+    void slotZoomFactorChanged(double);
+    void slotThumbBarSelectionChanged();
+    void slotIconViewSelectionChanged();
+
+private:
+
+    void readSettings();
+    void syncSelection(ImportCategorizedView* from, ImportCategorizedView* to);
+
+    /// Used to return the category for a specified camera item.
+    QString identifyCategoryforMime(QString mime);
+
+private:
+
+    class ImportStackedViewPriv;
+    ImportStackedViewPriv* const d;
+};
+
+} // namespace Digikam
+
+#endif // IMPORTSTACKEDVIEW_H
diff --git a/utilities/cameragui/views/importthumbnailbar.cpp \
b/utilities/cameragui/views/importthumbnailbar.cpp new file mode 100644
index 0000000..4f2e5bb
--- /dev/null
+++ b/utilities/cameragui/views/importthumbnailbar.cpp
@@ -0,0 +1,192 @@
+#include "importthumbnailbar.h"
+
+// KDE includes
+
+#include <kdebug.h>
+
+// Local includes
+
+#include "importsettings.h"
+#include "importdelegate.h"
+#include "importfiltermodel.h"
+
+namespace Digikam
+{
+
+//class ImportThumbnailDelegate;
+
+class ImportThumbnailBar::ImportThumbnailBarPriv
+{
+public:
+
+    ImportThumbnailBarPriv()
+    {
+        scrollPolicy     = Qt::ScrollBarAlwaysOn;
+        duplicatesFilter = 0;
+    }
+
+    Qt::ScrollBarPolicy            scrollPolicy;
+    NoDuplicatesImportFilterModel* duplicatesFilter;
+};
+
+ImportThumbnailBar::ImportThumbnailBar(QWidget* parent)
+    : ImportCategorizedView(parent), d(new ImportThumbnailBarPriv())
+{
+    setItemDelegate(new ImportThumbnailDelegate(this));
+    setSpacing(3);
+    setUsePointingHandCursor(false);
+    setScrollStepGranularity(5);
+    setScrollBarPolicy(Qt::ScrollBarAlwaysOn);
+
+    setDragEnabled(true);
+    setAcceptDrops(true);
+    setDropIndicatorShown(false);
+
+    //TODO: Implement Import Tool settings
+    //setToolTipEnabled(ImportSettings::instance()->showToolTipsIsValid());
+
+    connect(ImportSettings::instance(), SIGNAL(setupChanged()),
+            this, SLOT(slotSetupChanged()));
+
+    slotSetupChanged();
+    setFlow(LeftToRight);
+}
+
+ImportThumbnailBar::~ImportThumbnailBar()
+{
+    delete d;
+}
+
+void ImportThumbnailBar::setModelsFiltered(ImportImageModel* model, \
ImportSortFilterModel* filterModel) +{
+    if (!d->duplicatesFilter)
+    {
+        d->duplicatesFilter = new NoDuplicatesImportFilterModel(this);
+    }
+
+    d->duplicatesFilter->setSourceFilterModel(filterModel);
+    ImportCategorizedView::setModels(model, d->duplicatesFilter);
+}
+
+//TODO: Implement rating in Import Tool
+//void ImportThumbnailBar::installRatingOverlay()
+//{
+//    ImageRatingOverlay* ratingOverlay = new ImageRatingOverlay(this);
+//    addOverlay(ratingOverlay);
+
+//    connect(ratingOverlay, SIGNAL(ratingEdited(QList<QModelIndex>,int)),
+//            this, SLOT(assignRating(QList<QModelIndex>,int)));
+//}
+
+void ImportThumbnailBar::slotDockLocationChanged(Qt::DockWidgetArea area)
+{
+    if (area == Qt::LeftDockWidgetArea || area == Qt::RightDockWidgetArea)
+    {
+        setFlow(TopToBottom);
+    }
+    else
+    {
+        setFlow(LeftToRight);
+    }
+
+    scrollTo(currentIndex());
+}
+
+void ImportThumbnailBar::setScrollBarPolicy(Qt::ScrollBarPolicy policy)
+{
+    if (policy == Qt::ScrollBarAsNeeded)
+    {
+        // Delegate resizing will cause endless relayouting, see bug #228807
+        kError() << "The Qt::ScrollBarAsNeeded policy is not supported by \
ImportThumbnailBar"; +    }
+
+    d->scrollPolicy = policy;
+
+    if (flow() == TopToBottom)
+    {
+        setVerticalScrollBarPolicy(d->scrollPolicy);
+        setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+    }
+    else
+    {
+        setHorizontalScrollBarPolicy(d->scrollPolicy);
+        setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+    }
+}
+
+void ImportThumbnailBar::setFlow(QListView::Flow flow)
+{
+    setWrapping(false);
+
+    ImportCategorizedView::setFlow(flow);
+
+    ImportThumbnailDelegate* del = \
static_cast<ImportThumbnailDelegate*>(delegate()); +    del->setFlow(flow);
+
+    // Reset the minimum and maximum sizes.
+    setMinimumSize(QSize(0, 0));
+    setMaximumSize(QSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX));
+
+    // Adjust minimum and maximum width to thumbnail sizes.
+    if (flow == TopToBottom)
+    {
+        int viewportFullWidgetOffset = size().width() - viewport()->size().width();
+        setMinimumWidth(del->minimumSize() + viewportFullWidgetOffset);
+        setMaximumWidth(del->maximumSize() + viewportFullWidgetOffset);
+    }
+    else
+    {
+        int viewportFullWidgetOffset = size().height() - \
viewport()->size().height(); +        setMinimumHeight(del->minimumSize() + \
viewportFullWidgetOffset); +        setMaximumHeight(del->maximumSize() + \
viewportFullWidgetOffset); +    }
+
+    setScrollBarPolicy(d->scrollPolicy);
+}
+
+void ImportThumbnailBar::slotSetupChanged()
+{
+    setToolTipEnabled(ImportSettings::instance()->showToolTipsIsValid());
+    setFont(ImportSettings::instance()->getIconViewFont());
+
+    ImportCategorizedView::slotSetupChanged();
+}
+
+//TODO: Implement rating in Import Tool
+//void ImportThumbnailBar::assignRating(const QList<QModelIndex>& indexes, int \
rating) +//{
+//    FileActionMngr::instance()->assignRating(imageSortFilterModel()->imageInfos(indexes), \
rating); +//}
+
+bool ImportThumbnailBar::event(QEvent* e)
+{
+    // reset widget max/min sizes
+    if (e->type() == QEvent::StyleChange)
+    {
+        setFlow(flow());
+    }
+
+    return ImportCategorizedView::event(e);
+}
+
+QModelIndex ImportThumbnailBar::nextIndex(const QModelIndex& index) const
+{
+    return importFilterModel()->index(index.row() + 1, 0);
+}
+
+QModelIndex ImportThumbnailBar::previousIndex(const QModelIndex& index) const
+{
+    return importFilterModel()->index(index.row() - 1, 0);
+}
+
+QModelIndex ImportThumbnailBar::firstIndex() const
+{
+    return importFilterModel()->index(0, 0);
+}
+
+QModelIndex ImportThumbnailBar::lastIndex() const
+{
+    return importFilterModel()->index(importFilterModel()->rowCount() - 1, 0);
+}
+
+} // namespace Digikam
diff --git a/utilities/cameragui/views/importthumbnailbar.h \
b/utilities/cameragui/views/importthumbnailbar.h new file mode 100644
index 0000000..192a7e7
--- /dev/null
+++ b/utilities/cameragui/views/importthumbnailbar.h
@@ -0,0 +1,57 @@
+#ifndef IMPORTTHUMBNAILBAR_H
+#define IMPORTTHUMBNAILBAR_H
+
+// Local includes
+
+#include "importcategorizedview.h"
+
+namespace Digikam
+{
+
+class ImportThumbnailBar : public ImportCategorizedView
+{
+    Q_OBJECT
+
+public:
+
+    ImportThumbnailBar(QWidget* parent = 0);
+    ~ImportThumbnailBar();
+
+    /**
+     * This installs a duplicate filter model, if the ImportImageModel may contain \
duplicates. +     * Otherwise, just use setModels().
+     */
+    void setModelsFiltered(ImportImageModel* model, ImportSortFilterModel* \
filterModel); +
+    QModelIndex nextIndex(const QModelIndex& index)     const;
+    QModelIndex previousIndex(const QModelIndex& index) const;
+    QModelIndex firstIndex() const;
+    QModelIndex lastIndex()  const;
+
+    /// Sets the policy always for the one scroll bar which is relevant, depending \
on orientation +    void setScrollBarPolicy(Qt::ScrollBarPolicy policy);
+    void setFlow(QListView::Flow newFlow);
+
+    //TODO: Implement rating in Import Tool
+    //void installRatingOverlay();
+
+public Q_SLOTS:
+
+    //TODO: Implement rating in Import Tool
+    //void assignRating(const QList<QModelIndex>& index, int rating);
+    void slotDockLocationChanged(Qt::DockWidgetArea area);
+
+protected:
+
+    virtual void slotSetupChanged();
+    virtual bool event(QEvent*);
+
+private:
+
+    class ImportThumbnailBarPriv;
+    ImportThumbnailBarPriv* const d;
+};
+
+} // namespace Digikam
+
+#endif // IMPORTTHUMBNAILBAR_H
diff --git a/utilities/cameragui/views/importview.cpp \
b/utilities/cameragui/views/importview.cpp new file mode 100644
index 0000000..3abb951
--- /dev/null
+++ b/utilities/cameragui/views/importview.cpp
@@ -0,0 +1,867 @@
+//#include "importview.moc"
+#include "importview.h" //TODO: Remove this line
+
+// Qt includes
+
+#include <QTimer>
+#include <QShortcut>
+
+// KDE includes
+
+#include <KMessageBox>
+#include <KDebug>
+
+// Local includes
+
+#include "cameraui.h"
+#include "importiconview.h"
+#include "importstackedview.h"
+#include "thumbnailsize.h"
+#include "fileactionmngr.h"
+#include "importsettings.h"
+#include "sidebar.h"
+#include "dzoombar.h"
+#include "models/camitemsortsettings.h"
+
+namespace Digikam
+{
+
+class ImportView::ImportViewPriv
+{
+public:
+
+    ImportViewPriv() :
+        needDispatchSelection(false),
+        thumbSize(ThumbnailSize::Medium),
+        dockArea(0),
+        splitter(0),
+        selectionTimer(0),
+        thumbSizeTimer(0),
+        parent(0),
+        iconView(0),
+        StackedView(0),
+        lastPreviewMode(ImportStackedView::PreviewCameraMode),
+        leftSideBar(0)
+        //TODO: rightSideBar(0)
+        //FIXME: filterWidget(0)
+    {
+    }
+
+    void                          addPageUpDownActions(ImportView* q, QWidget* w);
+
+public:
+
+    bool                          needDispatchSelection;
+
+    //FIXME: int                           initialAlbumID;
+    int                           thumbSize;
+
+    QMainWindow*                  dockArea;
+
+    SidebarSplitter*              splitter;
+
+    QTimer*                       selectionTimer;
+    QTimer*                       thumbSizeTimer;
+
+    // left side bar
+    CameraUI*                     parent;
+
+    ImportIconView*               iconView;
+    //TODO: MapWidgetView*                mapView;
+    ImportStackedView*            StackedView;
+    int                           lastPreviewMode;
+
+    Sidebar*                      leftSideBar;
+    //TODO: ImagePropertiesSideBarDB*     rightSideBar;
+
+    //FIXME: FilterSideBarWidget*          filterWidget;
+
+    QString                       optionAlbumViewPrefix;
+
+    QList<SidebarWidget*>         leftSideBarWidgets;
+};
+
+ImportView::ImportView(CameraUI* ui, QWidget* parent)
+    : KHBox(parent), d(new ImportViewPriv)
+{
+    d->parent      = /*static_cast<CameraUI*>*/(ui);
+
+    d->splitter    = new SidebarSplitter;
+    d->splitter->setFrameStyle(QFrame::NoFrame);
+    d->splitter->setFrameShadow(QFrame::Plain);
+    d->splitter->setFrameShape(QFrame::NoFrame);
+    d->splitter->setOpaqueResize(false);
+
+    d->leftSideBar = new Sidebar(this, d->splitter, KMultiTabBar::Left);
+    d->leftSideBar->setObjectName("Import Left Sidebar");
+    d->splitter->setParent(this);
+
+    // The dock area where the thumbnail bar is allowed to go.
+    d->dockArea    = new QMainWindow(this, Qt::Widget);
+    d->splitter->addWidget(d->dockArea);
+    d->StackedView = new ImportStackedView(d->parent->getCameraController(), \
d->dockArea); +    d->dockArea->setCentralWidget(d->StackedView);
+    d->StackedView->setDockArea(d->dockArea);
+
+    d->iconView = d->StackedView->importIconView();
+    //TODO: d->mapView  = d->StackedView->mapWidgetView();
+
+    d->addPageUpDownActions(this, d->StackedView->importPreviewView());
+    //REMd->addPageUpDownActions(this, d->StackedView->thumbBar());
+    //TODO: d->addPageUpDownActions(this, d->StackedView->mediaPlayerView());
+
+    //TODO: d->rightSideBar = new ImagePropertiesSideBarDB(this, d->splitter, \
KMultiTabBar::Right, true); +    //TODO: d->rightSideBar->setObjectName("Import Right \
Sidebar"); +
+    foreach(SidebarWidget* leftWidget, d->leftSideBarWidgets)
+    {
+        d->leftSideBar->appendTab(leftWidget, leftWidget->getIcon(),
+                                  leftWidget->getCaption());
+        connect(leftWidget, SIGNAL(requestActiveTab(SidebarWidget*)),
+                this, SLOT(slotLeftSideBarActivate(SidebarWidget*)));
+    }
+
+    // To the right.
+
+    //d->addPageUpDownActions(this, d->rightSideBar->imageDescEditTab());
+
+    d->selectionTimer = new QTimer(this);
+    d->selectionTimer->setSingleShot(true);
+    d->selectionTimer->setInterval(75);
+    d->thumbSizeTimer = new QTimer(this);
+    d->thumbSizeTimer->setSingleShot(true);
+    d->thumbSizeTimer->setInterval(300);
+
+    slotSidebarTabTitleStyleChanged();
+    setupConnections();
+}
+
+ImportView::~ImportView()
+{
+    delete d;
+}
+
+void ImportView::applySettings()
+{
+    foreach(SidebarWidget* sidebarWidget, d->leftSideBarWidgets)
+    {
+        sidebarWidget->applySettings();
+    }
+
+    refreshView();
+}
+
+void ImportView::refreshView()
+{
+    //d->rightSideBar->refreshTagsView();
+}
+
+void ImportView::setupConnections()
+{
+    // -- CameraUI connections ----------------------------------
+
+    connect(d->parent, SIGNAL(signalEscapePressed()),
+            this, SLOT(slotEscapePreview()));
+
+    connect(d->parent, SIGNAL(signalEscapePressed()),
+            d->StackedView, SLOT(slotEscapePreview()));
+
+    connect(d->parent, SIGNAL(signalNextItem()),
+            this, SLOT(slotNextItem()));
+
+    connect(d->parent, SIGNAL(signalPrevItem()),
+            this, SLOT(slotPrevItem()));
+
+    connect(d->parent, SIGNAL(signalFirstItem()),
+            this, SLOT(slotFirstItem()));
+
+    connect(d->parent, SIGNAL(signalLastItem()),
+            this, SLOT(slotLastItem()));
+
+    // -- IconView Connections -------------------------------------
+
+    connect(d->iconView->model(), SIGNAL(rowsInserted(QModelIndex,int,int)),
+            this, SLOT(slotImageSelected()));
+
+    connect(d->iconView->model(), SIGNAL(rowsRemoved(QModelIndex,int,int)),
+            this, SLOT(slotImageSelected()));
+
+    connect(d->iconView->model(), SIGNAL(layoutChanged()),
+            this, SLOT(slotImageSelected()));
+
+    connect(d->iconView, SIGNAL(selectionChanged()),
+            this, SLOT(slotImageSelected()));
+
+    connect(d->iconView, SIGNAL(previewRequested(CamItemInfo)),
+            this, SLOT(slotTogglePreviewMode(CamItemInfo)));
+
+    connect(d->iconView, SIGNAL(zoomOutStep()),
+            this, SLOT(slotZoomOut()));
+
+    connect(d->iconView, SIGNAL(zoomInStep()),
+            this, SLOT(slotZoomIn()));
+
+    // -- Sidebar Connections -------------------------------------
+
+    connect(d->leftSideBar, SIGNAL(signalChangedTab(QWidget*)),
+            this, SLOT(slotLeftSidebarChangedTab(QWidget*)));
+
+    //TODO: connect(d->rightSideBar, SIGNAL(signalFirstItem()),
+            //this, SLOT(slotFirstItem()));
+
+    //TODO: connect(d->rightSideBar, SIGNAL(signalNextItem()),
+            //this, SLOT(slotNextItem()));
+
+    //TODO: connect(d->rightSideBar, SIGNAL(signalPrevItem()),
+            //this, SLOT(slotPrevItem()));
+
+    //TODO: connect(d->rightSideBar, SIGNAL(signalLastItem()),
+            //this, SLOT(slotLastItem()));
+
+    //TODO: connect(this, SIGNAL(signalNoCurrentItem()),
+            //d->rightSideBar, SLOT(slotNoCurrentItem()));
+
+    // -- Preview image widget Connections ------------------------
+
+    connect(d->StackedView, SIGNAL(signalNextItem()),
+            this, SLOT(slotNextItem()));
+
+    connect(d->StackedView, SIGNAL(signalPrevItem()),
+            this, SLOT(slotPrevItem()));
+
+    connect(d->StackedView, SIGNAL(signalEditItem()),
+            this, SLOT(slotImageEdit()));
+
+    connect(d->StackedView, SIGNAL(signalDeleteItem()),
+            this, SLOT(slotImageDelete()));
+
+    connect(d->StackedView, SIGNAL(signalViewModeChanged()),
+            this, SLOT(slotViewModeChanged()));
+
+    //FIXME: connect(d->StackedView, SIGNAL(signalBack2Album()),
+            //this, SLOT(slotEscapePreview()));
+
+    connect(d->StackedView, SIGNAL(signalZoomFactorChanged(double)),
+            this, SLOT(slotZoomFactorChanged(double)));
+
+    // -- FileActionMngr progress ---------------
+
+    connect(FileActionMngr::instance(), SIGNAL(signalImageChangeFailed(QString, \
QStringList)), +            this, SLOT(slotImageChangeFailed(QString, QStringList)));
+
+    // -- timers ---------------
+
+    connect(d->selectionTimer, SIGNAL(timeout()),
+            this, SLOT(slotDispatchImageSelected()));
+
+    connect(d->thumbSizeTimer, SIGNAL(timeout()),
+            this, SLOT(slotThumbSizeEffect()) );
+
+    // -- Album Settings ----------------
+
+    connect(ImportSettings::instance(), SIGNAL(setupChanged()),
+            this, SLOT(slotSidebarTabTitleStyleChanged()));
+}
+
+//void ImportView::connectIconViewFilter(FilterStatusBar* filterbar)
+//{
+//    ImageAlbumFilterModel* model = d->iconView->imageAlbumFilterModel();
+
+//    connect(model, SIGNAL(filterMatches(bool)),
+//            filterbar, SLOT(slotFilterMatches(bool)));
+
+//    connect(model, SIGNAL(filterSettingsChanged(ImageFilterSettings)),
+//            filterbar, SLOT(slotFilterSettingsChanged(ImageFilterSettings)));
+
+//    connect(filterbar, SIGNAL(signalResetFilters()),
+//            d->filterWidget, SLOT(slotResetFilters()));
+
+//    connect(filterbar, SIGNAL(signalPopupFiltersView()),
+//            this, SLOT(slotPopupFiltersView()));
+//}
+
+//void ImportView::slotPopupFiltersView()
+//{
+//    d->rightSideBar->setActiveTab(d->filterWidget);
+//    d->filterWidget->setFocusToTextFilter();
+//}
+
+void ImportView::ImportViewPriv::addPageUpDownActions(ImportView* q, QWidget* w)
+{
+    QShortcut *nextImageShortcut = new QShortcut(w);
+    nextImageShortcut->setKey(Qt::Key_PageDown);
+    nextImageShortcut->setContext(Qt::WidgetWithChildrenShortcut);
+    QObject::connect(nextImageShortcut, SIGNAL(activated()), q, \
SLOT(slotNextItem())); +
+    QShortcut *prevImageShortcut = new QShortcut(w);
+    prevImageShortcut->setKey(Qt::Key_PageUp);
+    prevImageShortcut->setContext(Qt::WidgetWithChildrenShortcut);
+    QObject::connect(prevImageShortcut, SIGNAL(activated()), q, \
SLOT(slotPrevItem())); +}
+
+void ImportView::loadViewState()
+{
+    foreach(SidebarWidget* widget, d->leftSideBarWidgets)
+    {
+        widget->loadState();
+    }
+
+    //TODO: d->filterWidget->loadState();
+
+    KSharedConfig::Ptr config = KGlobal::config();
+    KConfigGroup group        = config->group("MainWindow");
+
+    // Restore the splitter
+    d->splitter->restoreState(group);
+
+    // Restore the thumbnail bar dock.
+    QByteArray thumbbarState;
+    thumbbarState = group.readEntry("ThumbbarState", thumbbarState);
+    d->dockArea->restoreState(QByteArray::fromBase64(thumbbarState));
+
+    //TODO: d->mapView->loadState();
+    //TODO: d->rightSideBar->loadState();
+}
+
+void ImportView::saveViewState()
+{
+    KSharedConfig::Ptr config = KGlobal::config();
+    KConfigGroup group        = config->group("MainWindow");
+
+    foreach(SidebarWidget* widget, d->leftSideBarWidgets)
+    {
+        widget->saveState();
+    }
+
+    //TODO: d->filterWidget->saveState();
+
+    // Save the splitter states.
+    d->splitter->saveState(group);
+
+    // Save the position and size of the thumbnail bar. The thumbnail bar dock
+    // needs to be closed explicitly, because when it is floating and visible
+    // (when the user is in image preview mode) when the layout is saved, it
+    // also reappears when restoring the view, while it should always be hidden.
+    //REMd->StackedView->thumbBarDock()->close();
+    group.writeEntry("ThumbbarState", d->dockArea->saveState().toBase64());
+
+    //TODO: d->mapView->saveState();
+
+    //TODO: d->rightSideBar->saveState();
+}
+
+QList<SidebarWidget*> ImportView::leftSidebarWidgets()
+{
+    return d->leftSideBarWidgets;
+}
+
+KUrl::List ImportView::allUrls() const
+{
+    return d->iconView->urls();
+}
+
+KUrl::List ImportView::selectedUrls() const
+{
+    return d->iconView->selectedUrls();
+}
+
+void ImportView::showSideBars()
+{
+    d->leftSideBar->restore();
+    //d->rightSideBar->restore();
+}
+
+void ImportView::hideSideBars()
+{
+    d->leftSideBar->backup();
+    //d->rightSideBar->backup();
+}
+
+void ImportView::slotFirstItem()
+{
+    d->iconView->toFirstIndex();
+}
+
+void ImportView::slotPrevItem()
+{
+    d->iconView->toPreviousIndex();
+}
+
+void ImportView::slotNextItem()
+{
+    d->iconView->toNextIndex();
+}
+
+void ImportView::slotLastItem()
+{
+    d->iconView->toLastIndex();
+}
+
+void ImportView::slotSelectItemByUrl(const KUrl& url)
+{
+    d->iconView->toIndex(url);
+}
+
+void ImportView::slotImageSelected()
+{
+    // delay to slotDispatchImageSelected
+    d->needDispatchSelection = true;
+    d->selectionTimer->start();
+    emit signalSelectionChanged(d->iconView->numberOfSelectedIndexes());
+}
+
+void ImportView::slotDispatchImageSelected()
+{
+    if (d->needDispatchSelection)
+    {
+        // the list of CamItemInfos of currently selected items, currentItem first
+        // since the iconView tracks the changes also while we are in map widget \
mode, +        // we can still pull the data from the iconView
+        const CamItemInfoList list = \
d->iconView->selectedCamItemInfosCurrentFirst(); +
+        const CamItemInfoList allImages = d->iconView->CamItemInfos();
+
+        if (list.isEmpty())
+        {
+            d->StackedView->setPreviewItem();
+            emit signalImageSelected(list, false, false, allImages);
+            emit signalNoCurrentItem();
+        }
+        else
+        {
+            //TODO: d->rightSideBar->itemChanged(list);
+
+            CamItemInfo previousInfo;
+            CamItemInfo nextInfo;
+
+            if (d->StackedView->previewMode() != ImportStackedView::MapWidgetMode)
+            {
+                previousInfo = d->iconView->previousInfo(list.first());
+                nextInfo = d->iconView->nextInfo(list.first());
+            }
+
+            if (   (d->StackedView->previewMode() != \
ImportStackedView::PreviewCameraMode) +                   && \
(d->StackedView->previewMode() != ImportStackedView::MapWidgetMode) ) +            {
+                d->StackedView->setPreviewItem(list.first(), previousInfo, \
nextInfo); +            }
+
+            emit signalImageSelected(list, !previousInfo.isNull(), \
!nextInfo.isNull(), allImages); +        }
+
+        d->needDispatchSelection = false;
+    }
+}
+
+double ImportView::zoomMin()
+{
+    return d->StackedView->zoomMin();
+}
+
+double ImportView::zoomMax()
+{
+    return d->StackedView->zoomMax();
+}
+
+void ImportView::setZoomFactor(double zoom)
+{
+    d->StackedView->setZoomFactorSnapped(zoom);
+}
+
+void ImportView::slotZoomFactorChanged(double zoom)
+{
+    toggleZoomActions();
+    emit signalZoomChanged(zoom);
+}
+
+void ImportView::setThumbSize(int size)
+{
+    if (d->StackedView->previewMode() == ImportStackedView::PreviewImageMode)
+    {
+        double z = DZoomBar::zoomFromSize(size, zoomMin(), zoomMax());
+        setZoomFactor(z);
+    }
+    else if (d->StackedView->previewMode() == ImportStackedView::PreviewCameraMode)
+    {
+        if (size > ThumbnailSize::Huge)
+        {
+            d->thumbSize = ThumbnailSize::Huge;
+        }
+        else if (size < ThumbnailSize::Small)
+        {
+            d->thumbSize = ThumbnailSize::Small;
+        }
+        else
+        {
+            d->thumbSize = size;
+        }
+
+        emit signalThumbSizeChanged(d->thumbSize);
+
+        d->thumbSizeTimer->start();
+    }
+}
+
+ThumbnailSize ImportView::thumbnailSize()
+{
+    return d->thumbSize;
+}
+
+void ImportView::slotThumbSizeEffect()
+{
+    qDebug() << "SETTING THUMBNAIL SIZE IN <<<IMPORT VIEW>>>";
+    d->iconView->setThumbnailSize(d->thumbSize);
+    toggleZoomActions();
+
+    ImportSettings::instance()->setDefaultIconSize(d->thumbSize);
+}
+
+void ImportView::toggleZoomActions()
+{
+    if (d->StackedView->previewMode() == ImportStackedView::PreviewImageMode)
+    {
+        d->parent->enableZoomMinusAction(true);
+        d->parent->enableZoomPlusAction(true);
+
+        if (d->StackedView->maxZoom())
+        {
+            d->parent->enableZoomPlusAction(false);
+        }
+
+        if (d->StackedView->minZoom())
+        {
+            d->parent->enableZoomMinusAction(false);
+        }
+    }
+    else if (d->StackedView->previewMode() == ImportStackedView::PreviewCameraMode)
+    {
+        d->parent->enableZoomMinusAction(true);
+        d->parent->enableZoomPlusAction(true);
+
+        if (d->thumbSize >= ThumbnailSize::Huge)
+        {
+            d->parent->enableZoomPlusAction(false);
+        }
+
+        if (d->thumbSize <= ThumbnailSize::Small)
+        {
+            d->parent->enableZoomMinusAction(false);
+        }
+    }
+    else
+    {
+        d->parent->enableZoomMinusAction(false);
+        d->parent->enableZoomPlusAction(false);
+    }
+}
+
+void ImportView::slotZoomIn()
+{
+    if (d->StackedView->previewMode() == ImportStackedView::PreviewCameraMode)
+    {
+        setThumbSize(d->thumbSize + ThumbnailSize::Step);
+        toggleZoomActions();
+        emit signalThumbSizeChanged(d->thumbSize);
+    }
+    else if (d->StackedView->previewMode() == ImportStackedView::PreviewImageMode)
+    {
+        d->StackedView->increaseZoom();
+    }
+}
+
+void ImportView::slotZoomOut()
+{
+    if (d->StackedView->previewMode() == ImportStackedView::PreviewCameraMode)
+    {
+        setThumbSize(d->thumbSize - ThumbnailSize::Step);
+        toggleZoomActions();
+        emit signalThumbSizeChanged(d->thumbSize);
+    }
+    else if (d->StackedView->previewMode() == ImportStackedView::PreviewImageMode)
+    {
+        d->StackedView->decreaseZoom();
+    }
+}
+
+void ImportView::slotZoomTo100Percents()
+{
+    if (d->StackedView->previewMode() == ImportStackedView::PreviewImageMode)
+    {
+        d->StackedView->toggleFitToWindowOr100();
+    }
+}
+
+void ImportView::slotFitToWindow()
+{
+    if (d->StackedView->previewMode() == ImportStackedView::PreviewCameraMode)
+    {
+        int nts = d->iconView->fitToWidthIcons();
+        kDebug() << "new thumb size = " << nts;
+        setThumbSize(nts);
+        toggleZoomActions();
+        emit signalThumbSizeChanged(d->thumbSize);
+    }
+    else if (d->StackedView->previewMode() == ImportStackedView::PreviewImageMode)
+    {
+        d->StackedView->fitToWindow();
+    }
+}
+
+// ----------------------------------------------------------------
+
+void ImportView::slotEscapePreview()
+{
+    if (d->StackedView->previewMode() == ImportStackedView::PreviewCameraMode)
+        //TODO: || d->StackedView->previewMode() == \
ImportStackedView::WelcomePageMode) +    {
+        return;
+    }
+
+    // pass a null camera item info, because we want to fall back to the old
+    // view mode
+    slotTogglePreviewMode(CamItemInfo());
+}
+
+//void ImportView::slotMapWidgetView()
+//{
+//    d->StackedView->setPreviewMode(ImportStackedView::MapWidgetMode);
+//}
+
+void ImportView::slotIconView()
+{
+    if (d->StackedView->previewMode() == ImportStackedView::PreviewImageMode)
+    {
+        emit signalThumbSizeChanged(d->iconView->thumbnailSize().size());
+    }
+
+    // and switch to icon view
+    d->StackedView->setPreviewMode(ImportStackedView::PreviewCameraMode);
+
+    // make sure the next/previous buttons are updated
+    slotImageSelected();
+}
+
+void ImportView::slotImagePreview()
+{
+    const int currentPreviewMode = d->StackedView->previewMode();
+    CamItemInfo currentInfo;
+
+    if (currentPreviewMode == ImportStackedView::PreviewCameraMode)
+    {
+        currentInfo = d->iconView->currentInfo();
+    }
+    //TODO: Implement MapWidget
+    //else if (currentPreviewMode == ImportStackedView::MapWidgetMode)
+    //{
+    //    currentInfo = d->mapView->currentInfo();
+    //}
+
+    slotTogglePreviewMode(currentInfo);
+}
+
+/**
+ * @brief This method toggles between IconView/MapWidgetView and ImagePreview modes, \
depending on the context. + */
+void ImportView::slotTogglePreviewMode(const CamItemInfo& info)
+{
+    if (  (d->StackedView->previewMode() == ImportStackedView::PreviewCameraMode
+           || d->StackedView->previewMode() == ImportStackedView::MapWidgetMode)
+          && !info.isNull() )
+    {
+        d->lastPreviewMode = d->StackedView->previewMode();
+
+        if (d->StackedView->previewMode() == ImportStackedView::PreviewCameraMode)
+        {
+            d->StackedView->setPreviewItem(info, d->iconView->previousInfo(info), \
d->iconView->nextInfo(info)); +        }
+        else
+        {
+            d->StackedView->setPreviewItem(info, CamItemInfo(), CamItemInfo());
+        }
+    }
+    else
+    {
+        // go back to either CameraViewMode or MapWidgetMode
+        d->StackedView->setPreviewMode( d->lastPreviewMode );
+    }
+
+    // make sure the next/previous buttons are updated
+    slotImageSelected();
+}
+
+void ImportView::slotViewModeChanged()
+{
+    toggleZoomActions();
+
+    switch (d->StackedView->previewMode())
+    {
+        case ImportStackedView::PreviewCameraMode:
+            emit signalSwitchedToIconView();
+            emit signalThumbSizeChanged(d->iconView->thumbnailSize().size());
+            break;
+        case ImportStackedView::PreviewImageMode:
+            emit signalSwitchedToPreview();
+            slotZoomFactorChanged(d->StackedView->zoomFactor());
+            break;
+        //TODO: case ImportStackedView::WelcomePageMode:
+            //emit signalSwitchedToIconView();
+            //break;
+        case ImportStackedView::MediaPlayerMode:
+            emit signalSwitchedToPreview();
+            break;
+        case ImportStackedView::MapWidgetMode:
+            emit signalSwitchedToMapView();
+            //TODO: connect map view's zoom buttons to main status bar zoom buttons
+            break;
+    }
+}
+
+void ImportView::slotImageRename()
+{
+    d->iconView->rename();
+}
+
+//FIXME: Remove these functions
+//void ImportView::slotImageDelete()
+//{
+//    d->iconView->deleteSelected(false);
+//}
+
+//void ImportView::slotImageDeletePermanently()
+//{
+//    d->iconView->deleteSelected(true);
+//}
+
+//void ImportView::slotImageDeletePermanentlyDirectly()
+//{
+//    d->iconView->deleteSelectedDirectly(false);
+//}
+
+//void ImportView::slotImageTrashDirectly()
+//{
+//    d->iconView->deleteSelectedDirectly(true);
+//}
+
+void ImportView::slotSelectAll()
+{
+    d->iconView->selectAll();
+}
+
+void ImportView::slotSelectNone()
+{
+    d->iconView->clearSelection();
+}
+
+void ImportView::slotSelectInvert()
+{
+    d->iconView->invertSelection();
+}
+
+void ImportView::slotSortImages(int sortRole)
+{
+    ImportSettings* settings = ImportSettings::instance();
+
+    if (!settings)
+    {
+        return;
+    }
+
+    settings->setImageSortOrder(sortRole);
+    d->iconView->importFilterModel()->setSortRole((CamItemSortSettings::SortRole) \
sortRole); +}
+
+void ImportView::slotSortImagesOrder(int order)
+{
+    ImportSettings* settings = ImportSettings::instance();
+
+    if (!settings)
+    {
+        return;
+    }
+
+    settings->setImageSorting(order);
+    d->iconView->importFilterModel()->setSortOrder((CamItemSortSettings::SortOrder) \
order); +}
+
+void ImportView::slotGroupImages(int categoryMode)
+{
+    ImportSettings* settings = ImportSettings::instance();
+
+    if (!settings)
+    {
+        return;
+    }
+
+    settings->setImageGroupMode(categoryMode);
+    d->iconView->importFilterModel()->setCategorizationMode((CamItemSortSettings::CategorizationMode) \
categoryMode); +}
+
+void ImportView::slotLeftSidebarChangedTab(QWidget* w)
+{
+    // TODO update, temporary cast
+    SidebarWidget* widget = dynamic_cast<SidebarWidget*> (w);
+    foreach(SidebarWidget* sideBarWidget, d->leftSideBarWidgets)
+    {
+        bool active = (widget && (widget == sideBarWidget));
+        sideBarWidget->setActive(active);
+    }
+}
+
+void ImportView::slotSidebarTabTitleStyleChanged()
+{
+    //d->leftSideBar->setStyle(ImportSettings::instance()->getSidebarTitleStyle());
+    //TODO: d->rightSideBar->setStyle(ImportSettings::instance()->getSidebarTitleStyle());
 +
+    /// @todo Which settings actually have to be reloaded?
+    //     d->rightSideBar->applySettings();
+}
+
+void ImportView::toggleShowBar(bool b)
+{
+    //REMd->StackedView->thumbBarDock()->showThumbBar(b);
+}
+
+bool ImportView::isThumbBarVisible()
+{
+    //REMreturn d->StackedView->thumbBarDock()->isVisible();
+    return false;//REM
+}
+
+void ImportView::slotImageChangeFailed(const QString& message, const QStringList& \
fileNames) +{
+    if (fileNames.isEmpty())
+    {
+        return;
+    }
+
+    KMessageBox::errorList(0, message, fileNames);
+}
+
+void ImportView::slotLeftSideBarActivate(SidebarWidget* widget)
+{
+    d->leftSideBar->setActiveTab(widget);
+}
+
+void ImportView::slotLeftSideBarActivate(QWidget* widget)
+{
+    slotLeftSideBarActivate(static_cast<SidebarWidget*>(widget));
+}
+
+bool ImportView::hasCurrentItem() const
+{
+    // We should actually get this directly from the selection model,
+    // but the iconView is fine for now.
+    return !d->iconView->currentInfo().isNull();
+}
+
+//void ImportView::slotImageExifOrientation(int orientation)
+//{
+//    FileActionMngr::instance()->setExifOrientation(d->iconView->selectedCamItemInfos(), \
orientation); +//}
+
+//void ImportView::imageTransform(KExiv2Iface::RotationMatrix::TransformationAction \
transform) +//{
+//    FileActionMngr::instance()->transform(d->iconView->selectedCamItemInfos(), \
transform); +//}
+
+} // namespace Digikam
diff --git a/utilities/cameragui/views/importview.h \
b/utilities/cameragui/views/importview.h new file mode 100644
index 0000000..06f5aba
--- /dev/null
+++ b/utilities/cameragui/views/importview.h
@@ -0,0 +1,133 @@
+#ifndef IMPORTVIEW_H
+#define IMPORTVIEW_H
+
+// KDE includes
+
+#include <KHBox>
+
+// Local includes
+
+#include "camiteminfo.h"
+#include "sidebarwidget.h"
+#include "cameraui.h"
+#include "models/importmodel.h"
+
+namespace Digikam
+{
+
+class CameraUI;
+
+class ImportView : public KHBox
+{
+    Q_OBJECT
+
+public:
+
+    ImportView(CameraUI* ui, QWidget* parent);
+    ~ImportView();
+
+    void applySettings();
+    void refreshView();
+    void clearHistory();
+    void getForwardHistory(QStringList& titles);
+    void getBackwardHistory(QStringList& titles);
+    void showSideBars();
+    void hideSideBars();
+    void setThumbSize(int size);
+    void toggleShowBar(bool);
+    bool isThumbBarVisible();
+
+    KUrl::List allUrls() const;
+    KUrl::List selectedUrls() const;
+    bool hasCurrentItem() const;
+
+    double zoomMin();
+    double zoomMax();
+
+    ThumbnailSize thumbnailSize();
+
+    QList<SidebarWidget*> leftSidebarWidgets();
+
+Q_SIGNALS:
+
+    void signalImageSelected(const CamItemInfoList& selectedImage, bool hasPrevious, \
bool hasNext, +                             const CamItemInfoList& allImages);
+    void signalNoCurrentItem();
+    void signalSelectionChanged(int numberOfSelectedItems);
+    void signalThumbSizeChanged(int);
+    void signalZoomChanged(double);
+    void signalSwitchedToPreview();
+    void signalSwitchedToIconView();
+    void signalSwitchedToMapView();
+
+public Q_SLOTS:
+
+    void setZoomFactor(double zoom);
+
+    // View Action slots
+    void slotZoomIn();
+    void slotZoomOut();
+    void slotZoomTo100Percents();
+    void slotFitToWindow();
+
+    void slotImagePreview();
+    //TODO: void slotMapWidgetView();
+    void slotIconView();
+
+    void slotSelectAll();
+    void slotSelectNone();
+    void slotSelectInvert();
+
+    void slotImageRename();
+    //void slotImageDelete();
+    //void slotImageDeletePermanently();
+    //void slotImageDeletePermanentlyDirectly();
+    //void slotImageTrashDirectly();
+
+    void slotSortImages(int order);
+    void slotSortImagesOrder(int order);
+    void slotGroupImages(int mode);
+
+    void slotLeftSideBarActivate(QWidget* widget);
+    void slotLeftSideBarActivate(SidebarWidget* widget);
+
+private Q_SLOTS:
+
+    void slotImageSelected();
+    void slotTogglePreviewMode(const CamItemInfo& info);
+    void slotDispatchImageSelected();
+
+    void slotLeftSidebarChangedTab(QWidget* w);
+
+    void slotFirstItem();
+    void slotPrevItem();
+    void slotNextItem();
+    void slotLastItem();
+    void slotSelectItemByUrl(const KUrl&);
+
+    void slotViewModeChanged();
+    void slotEscapePreview();
+
+    void slotThumbSizeEffect();
+    void slotZoomFactorChanged(double);
+
+    void slotSidebarTabTitleStyleChanged();
+
+    void slotImageChangeFailed(const QString& message, const QStringList& \
fileNames); +
+private:
+
+    void toggleZoomActions();
+    void setupConnections();
+    void loadViewState();
+    void saveViewState();
+
+private:
+
+    class ImportViewPriv;
+    ImportViewPriv* const d;
+};
+
+} // namespace Digikam
+
+#endif // IMPORTVIEW_H


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic