[Digikam-devel] [digikam/development/2.0] /: Toolbar and menu action relayout

Marcel Wiesweg marcel.wiesweg at gmx.de
Sat Feb 12 23:08:45 GMT 2011


Git commit a699bc91683b28f7504183d20e5dc82e4ed3133e by Marcel Wiesweg.
Committed on 13/02/2011 at 00:05.
Pushed by mwiesweg into branch 'development/2.0'.

Toolbar and menu action relayout
Implements the changes proposed some time ago on the mailing list.
In the main toolbar, there are the four main windows: IE, Light table, BQM, Camera import;
then the three modes of the main panel: thumbnails, preview, map; then slideshow and full screen.
In the menu bar, the Image menu is resorted. There is a "Browse" menu which offers access
to the left side bar places, marking them as the primary access to the user's pictures.
Some more changes, internal cleanups.
The main window actions offer some automatic guessing, like the "import" button
automatically opening the last plugged camera (need to test), or the light table button
using some heuristics whether to clear the light table before.

CCMAIL: digikam-devel at kde.org

M  +3    -2    digikam/albumwidgetstack.cpp     
M  +1    -1    digikam/albumwidgetstack.h     
M  +243  -139  digikam/digikamapp.cpp     
M  +5    -1    digikam/digikamapp.h     
M  +17   -5    digikam/digikamapp_p.h     
M  +62   -17   digikam/digikamimageview.cpp     
M  +6    -1    digikam/digikamimageview.h     
M  +56   -35   digikam/digikamui.rc     
M  +68   -35   digikam/digikamview.cpp     
M  +11   -4    digikam/digikamview.h     
M  +23   -1    digikam/imageviewutilities.cpp     
M  +4    -1    digikam/imageviewutilities.h     
M  +3    -3    digikam/leftsidebarwidgets.cpp     
M  +2    -0    utilities/lighttable/lighttablewindow.cpp     

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

diff --git a/digikam/albumwidgetstack.cpp b/digikam/albumwidgetstack.cpp
index 56c921c..67c11d0 100644
--- a/digikam/albumwidgetstack.cpp
+++ b/digikam/albumwidgetstack.cpp
@@ -351,7 +351,6 @@ void AlbumWidgetStack::setPreviewMode(const int mode)
     {
         setPreviewItem();
         setCurrentIndex(mode);
-        emit signalToggledToPreviewMode(false);
     }
     else
     {
@@ -368,6 +367,8 @@ void AlbumWidgetStack::setPreviewMode(const int mode)
     {
         d->mapWidgetView->setFocus();
     }
+    
+    emit signalViewModeChanged();
 }
 
 void AlbumWidgetStack::syncSelection(ImageCategorizedView* from, ImageCategorizedView* to)
@@ -425,7 +426,7 @@ void AlbumWidgetStack::slotIconViewSelectionChanged()
 
 void AlbumWidgetStack::previewLoaded()
 {
-    emit signalToggledToPreviewMode(true);
+    emit signalViewModeChanged();
 }
 
 void AlbumWidgetStack::slotZoomFactorChanged(double z)
diff --git a/digikam/albumwidgetstack.h b/digikam/albumwidgetstack.h
index 336fd19..a63c567 100644
--- a/digikam/albumwidgetstack.h
+++ b/digikam/albumwidgetstack.h
@@ -105,7 +105,7 @@ Q_SIGNALS:
     void signalPrevItem();
     void signalEditItem();
     void signalDeleteItem();
-    void signalToggledToPreviewMode(bool);
+    void signalViewModeChanged();
     void signalBack2Album();
     void signalSlideShow();
     void signalZoomFactorChanged(double);
diff --git a/digikam/digikamapp.cpp b/digikam/digikamapp.cpp
index 5c69fc2..4a19056 100644
--- a/digikam/digikamapp.cpp
+++ b/digikam/digikamapp.cpp
@@ -218,9 +218,10 @@ DigikamApp::DigikamApp()
     connect(AlbumSettings::instance(), SIGNAL(setupChanged()),
             this, SLOT(slotSetupChanged()));
 
-    d->cameraMenu     = new KActionMenu(this);
-    d->usbMediaMenu   = new KActionMenu(this);
-    d->cardReaderMenu = new KActionMenu(this);
+    d->cameraMenu      = new KActionMenu(this);
+    d->usbMediaMenu    = new KActionMenu(this);
+    d->cardReaderMenu  = new KActionMenu(this);
+    d->quickImportMenu = new KActionMenu(this);
 
     d->cameraList = new CameraList(this, KStandardDirs::locateLocal("appdata", "cameras.xml"));
 
@@ -529,6 +530,14 @@ void DigikamApp::setupView()
 
     connect(d->view, SIGNAL(signalImageSelected(const ImageInfoList&, bool, bool, const ImageInfoList&)),
             this, SLOT(slotImageSelected(const ImageInfoList&, bool, bool, const ImageInfoList&)));
+
+    connect(d->view, SIGNAL(signalSwitchedToPreview()),
+            this, SLOT(slotSwitchedToPreview()));
+    connect(d->view, SIGNAL(signalSwitchedToIconView()),
+            this, SLOT(slotSwitchedToIconView()));
+    connect(d->view, SIGNAL(signalSwitchedToMapView()),
+            this, SLOT(slotSwitchedToMapView()));
+
 }
 
 void DigikamApp::setupStatusBar()
@@ -576,9 +585,6 @@ void DigikamApp::setupStatusBar()
     connect(d->view, SIGNAL(signalThumbSizeChanged(int)),
             this, SLOT(slotThumbSizeChanged(int)));
 
-    connect(d->view, SIGNAL(signalTogglePreview(bool)),
-            this, SLOT(slotTogglePreview(bool)));
-
     connect(d->statusNavigateBar, SIGNAL(signalFirstItem()),
             d->view, SLOT(slotFirstItem()));
 
@@ -630,15 +636,17 @@ void DigikamApp::setupAccelerators()
     lastImageAction->setShortcut(KShortcut(Qt::Key_End) );
     connect(lastImageAction, SIGNAL(triggered()), this, SIGNAL(signalLastItem()));
 
-    KAction* cutItemsAction = KStandardAction::cut(this, SIGNAL(signalCutAlbumItemsSelection()), this);
-    cutItemsAction->setShortcut(KShortcut(Qt::CTRL + Qt::Key_X));
-    actionCollection()->addAction("cut_album_selection", cutItemsAction);
+    d->cutItemsAction = KStandardAction::cut(this, SIGNAL(signalCutAlbumItemsSelection()), this);
+    d->cutItemsAction->setShortcut(KShortcut(Qt::CTRL + Qt::Key_X));
+    actionCollection()->addAction("cut_album_selection", d->cutItemsAction);
 
-    KAction* copyItemsAction = KStandardAction::copy(this, SIGNAL(signalCopyAlbumItemsSelection()), this);
-    actionCollection()->addAction("copy_album_selection", copyItemsAction);
+    d->copyItemsAction = KStandardAction::copy(this, SIGNAL(signalCopyAlbumItemsSelection()), this);
+    d->cutItemsAction->setShortcut(KShortcut(Qt::CTRL + Qt::Key_C));
+    actionCollection()->addAction("copy_album_selection", d->copyItemsAction);
 
-    KAction* pasteItemsAction = KStandardAction::paste(this, SIGNAL(signalPasteAlbumItemsSelection()), this);
-    actionCollection()->addAction("paste_album_selection", pasteItemsAction);
+    d->pasteItemsAction = KStandardAction::paste(this, SIGNAL(signalPasteAlbumItemsSelection()), this);
+    d->cutItemsAction->setShortcut(KShortcut(Qt::CTRL + Qt::Key_V));
+    actionCollection()->addAction("paste_album_selection", d->pasteItemsAction);
 }
 
 void DigikamApp::setupActions()
@@ -707,6 +715,32 @@ void DigikamApp::setupActions()
 
     // -----------------------------------------------------------------
 
+    d->refreshAlbumAction = new KAction(KIcon("view-refresh"), i18n("Refresh"), this);
+    d->refreshAlbumAction->setShortcut(KShortcut(Qt::Key_F5));
+    d->refreshAlbumAction->setWhatsThis(i18n("Refresh the contents of the current album."));
+    connect(d->refreshAlbumAction, SIGNAL(triggered()), d->view, SLOT(slotAlbumRefresh()));
+    actionCollection()->addAction("album_refresh", d->refreshAlbumAction);
+
+    // -----------------------------------------------------------------
+
+    QSignalMapper* browseActionsMapper = new QSignalMapper(this);
+    connect(browseActionsMapper, SIGNAL(mapped(QWidget*)),
+            d->view, SLOT(slotLeftSideBarActivate(QWidget*)));
+
+    kDebug() << d->view->leftSidebarWidgets();
+    foreach (SidebarWidget* leftWidget, d->view->leftSidebarWidgets())
+    {
+        QString actionName = "browse_" +
+                leftWidget->objectName().remove(' ').remove("Sidebar").remove("FolderView").remove("View").toLower();
+        kDebug() << actionName << leftWidget->objectName();
+        KAction* action = new KAction(KIcon(leftWidget->getIcon()), leftWidget->getCaption(), this);
+        actionCollection()->addAction(actionName, action);
+        connect(action, SIGNAL(triggered()), browseActionsMapper, SLOT(map()));
+        browseActionsMapper->setMapping(action, leftWidget);
+    }
+
+    // -----------------------------------------------------------------
+
     d->newAction = new KAction(KIcon("albumfolder-new"), i18n("&New..."), this);
     d->newAction->setShortcut(KStandardShortcut::openNew());
     d->newAction->setWhatsThis(i18n("Creates a new empty Album in the collection."));
@@ -722,7 +756,7 @@ void DigikamApp::setupActions()
 
     // -----------------------------------------------------------------
 
-    d->deleteAction = new KAction(KIcon("albumfolder-user-trash"), i18n("Delete"), this);
+    d->deleteAction = new KAction(KIcon("albumfolder-user-trash"), i18n("Delete Album"), this);
     connect(d->deleteAction, SIGNAL(triggered()), d->view, SLOT(slotDeleteAlbum()));
     actionCollection()->addAction("album_delete", d->deleteAction);
 
@@ -734,14 +768,6 @@ void DigikamApp::setupActions()
     actionCollection()->addAction("album_propsEdit", d->propsEditAction);
 
     // -----------------------------------------------------------------
-
-    d->refreshAlbumAction = new KAction(KIcon("view-refresh"), i18n("Refresh"), this);
-    d->refreshAlbumAction->setShortcut(KShortcut(Qt::Key_F5));
-    d->refreshAlbumAction->setWhatsThis(i18n("Refresh the contents of the current album."));
-    connect(d->refreshAlbumAction, SIGNAL(triggered()), d->view, SLOT(slotAlbumRefresh()));
-    actionCollection()->addAction("album_refresh", d->refreshAlbumAction);
-
-    // -----------------------------------------------------------------
     
     d->rebuildAlbumThumbsAction = new KAction(KIcon("view-process-all"), i18n("Rebuild Thumbnails In Current Album"), this);
     d->rebuildAlbumThumbsAction->setWhatsThis(i18n("Rebuilds all thumbnails for the current selected album"));
@@ -782,6 +808,12 @@ void DigikamApp::setupActions()
 
     // -----------------------------------------------------------
 
+    d->browseTagsAction = new KAction(KIcon("tag"), i18n("Browse Tags..."), this);
+    connect(d->browseTagsAction, SIGNAL(triggered()), d->view, SLOT(slotLeftSideBarActivateTags()));
+    actionCollection()->addAction("browse_tag_long", d->browseTagsAction);
+
+    // -----------------------------------------------------------
+
     d->newTagAction = new KAction(KIcon("tag-new"), i18nc("new tag", "N&ew..."), this);
     connect(d->newTagAction, SIGNAL(triggered()), d->view, SLOT(slotNewTag()));
     actionCollection()->addAction("tag_new", d->newTagAction);
@@ -800,24 +832,24 @@ void DigikamApp::setupActions()
 
     // -----------------------------------------------------------
 
-    d->imagePreviewAction = new KToggleAction(KIcon("viewimage"), i18nc("View the selected image", "View..."), this);
-    d->imagePreviewAction->setShortcut(KShortcut(Qt::Key_F3));
-    connect(d->imagePreviewAction, SIGNAL(triggered()), d->view, SLOT(slotImagePreview()));
-    actionCollection()->addAction("image_view", d->imagePreviewAction);
-
-
-    // -----------------------------------------------------------
-
-    d->imageViewSelectionAction = new KActionMenu(KIcon("viewimage"), i18n("Views"), this);
-    d->imageViewSelectionAction->setDelayed(false);
+    d->imageViewSelectionAction = new KSelectAction(KIcon("viewimage"), i18n("Views"), this);
+    //d->imageViewSelectionAction->setDelayed(false);
     actionCollection()->addAction("view_selection", d->imageViewSelectionAction);
 
-    d->imageIconViewAction = new KAction( i18n("Icon view..."), this);
+    d->imageIconViewAction = new KToggleAction(KIcon("view-list-icons"),
+                                               i18nc("@action Go to thumbnails (icon) view", "Thumbnails"), this);
     actionCollection()->addAction("icon_view", d->imageIconViewAction);
     connect(d->imageIconViewAction, SIGNAL(triggered()), d->view, SLOT(slotIconView()));
     d->imageViewSelectionAction->addAction(d->imageIconViewAction);
 
-    d->imageMapViewAction = new KAction( i18n("Map View..."), this);
+    d->imagePreviewAction = new KToggleAction(KIcon("viewimage"), i18nc("View the selected image", "View Image"), this);
+    d->imagePreviewAction->setShortcut(KShortcut(Qt::Key_F3));
+    actionCollection()->addAction("image_view", d->imagePreviewAction);
+    connect(d->imagePreviewAction, SIGNAL(triggered()), d->view, SLOT(slotImagePreview()));
+    d->imageViewSelectionAction->addAction(d->imagePreviewAction);
+
+    d->imageMapViewAction = new KToggleAction(KIcon("applications-internet"),
+                                              i18nc("@action Switch to map view", "Map"), this);
     actionCollection()->addAction("map_view", d->imageMapViewAction);
     connect(d->imageMapViewAction, SIGNAL(triggered()), d->view, SLOT(slotMapWidgetView()));
     d->imageViewSelectionAction->addAction(d->imageMapViewAction);
@@ -831,21 +863,31 @@ void DigikamApp::setupActions()
     actionCollection()->addAction("script_console", d->scriptConsoleAction);
 
     // -----------------------------------------------------------
+
     d->imageViewAction = new KAction(KIcon("editimage"), i18n("Edit..."), this);
     d->imageViewAction->setShortcut(KShortcut(Qt::Key_F4));
     d->imageViewAction->setWhatsThis(i18n("Open the selected item in the image editor."));
     connect(d->imageViewAction, SIGNAL(triggered()), d->view, SLOT(slotImageEdit()));
     actionCollection()->addAction("image_edit", d->imageViewAction);
 
+    KAction* ieAction = new KAction(KIcon("editimage"), i18n("Image Editor"), this);
+    ieAction->setWhatsThis(i18n("Open the image editor."));
+    connect(ieAction, SIGNAL(triggered()), d->view, SLOT(slotEditor()));
+    actionCollection()->addAction("imageeditor", ieAction);
+
     // -----------------------------------------------------------
 
+    KAction* ltAction = new KAction(KIcon("lighttable"), i18n("Light Table"), this);
+    ltAction->setShortcut(KShortcut(Qt::Key_L));
+    connect(ltAction, SIGNAL(triggered()), d->view, SLOT(slotLightTable()));
+    actionCollection()->addAction("light_table", ltAction);
+
     d->imageLightTableAction = new KAction(KIcon("lighttable"), i18n("Place onto Light Table"), this);
     d->imageLightTableAction->setShortcut(KShortcut(Qt::CTRL+Qt::Key_L));
     d->imageLightTableAction->setWhatsThis(i18n("Place the selected items on the light table thumbbar."));
     connect(d->imageLightTableAction, SIGNAL(triggered()), d->view, SLOT(slotImageLightTable()));
     actionCollection()->addAction("image_lighttable", d->imageLightTableAction);
 
-    // -----------------------------------------------------------
 
     d->imageAddLightTableAction = new KAction(KIcon("lighttableadd"), i18n("Add to Light Table"), this);
     d->imageAddLightTableAction->setShortcut(KShortcut(Qt::SHIFT+Qt::CTRL+Qt::Key_L));
@@ -855,6 +897,11 @@ void DigikamApp::setupActions()
 
     // -----------------------------------------------------------
 
+    KAction* bqmAction = new KAction(KIcon("bqm-diff"), i18n("Batch Queue Manager"), this);
+    bqmAction->setShortcut(KShortcut(Qt::Key_B));
+    connect(bqmAction, SIGNAL(triggered()), d->view, SLOT(slotQueueMgr()));
+    actionCollection()->addAction("queue_manager", bqmAction);
+
     d->imageAddCurrentQueueAction = new KAction(KIcon("bqm-commit"), i18n("Add to Current Queue"), this);
     d->imageAddCurrentQueueAction->setShortcut(KShortcut(Qt::CTRL+Qt::Key_B));
     d->imageAddCurrentQueueAction->setWhatsThis(i18n("Add selected items to current queue from batch manager."));
@@ -869,6 +916,12 @@ void DigikamApp::setupActions()
 
     // -----------------------------------------------------------------
 
+    d->quickImportMenu->setText(i18nc("@action Import photos from camera", "Import"));
+    d->quickImportMenu->setIcon(KIcon("camera-photo"));
+    actionCollection()->addAction("import_auto", d->quickImportMenu);
+
+    // -----------------------------------------------------------------
+
     d->imageWriteMetadataAction = new KAction(KIcon("document-edit"), i18n("Write Metadata to Selected Images"), this);
     d->imageWriteMetadataAction->setWhatsThis(i18n("Updates metadata of images in the current "
             "album with the contents of digiKam database "
@@ -1201,20 +1254,6 @@ void DigikamApp::setupActions()
 
     // -----------------------------------------------------------
 
-    KAction* ltAction = new KAction(KIcon("lighttable"), i18n("Light Table"), this);
-    ltAction->setShortcut(KShortcut(Qt::Key_L));
-    connect(ltAction, SIGNAL(triggered()), d->view, SLOT(slotLightTable()));
-    actionCollection()->addAction("light_table", ltAction);
-
-    // -----------------------------------------------------------
-
-    KAction* bqmAction = new KAction(KIcon("bqm-diff"), i18n("Batch Queue Manager"), this);
-    bqmAction->setShortcut(KShortcut(Qt::Key_B));
-    connect(bqmAction, SIGNAL(triggered()), d->view, SLOT(slotQueueMgr()));
-    actionCollection()->addAction("queue_manager", bqmAction);
-
-    // -----------------------------------------------------------
-
     KAction* databaseMigrationAction = new KAction(KIcon("server-database"), i18n("Database Migration..."), this);
     connect(databaseMigrationAction, SIGNAL(triggered()), this, SLOT(slotDatabaseMigration()));
     actionCollection()->addAction("database_migration", databaseMigrationAction);
@@ -1302,6 +1341,8 @@ void DigikamApp::initGui()
     // Setting the filter condition also updates the tooltip.
     // (So `setRating` is called first, as otherwise the filter value is not respected).
     d->albumIconViewFilter->readSettings();
+
+    slotSwitchedToIconView();
 }
 
 void DigikamApp::enableZoomPlusAction(bool val)
@@ -1356,22 +1397,45 @@ void DigikamApp::slotAlbumSelected(bool val)
 
     Album* album = AlbumManager::instance()->currentAlbum();
 
-    if (album && !val)
+    if (album)
     {
-        // Not a PAlbum is selected
-        d->deleteAction->setEnabled(false);
-        d->addImagesAction->setEnabled(false);
-        d->propsEditAction->setEnabled(false);
-        d->openInFileManagerAction->setEnabled(false);
-        d->openInTerminalAction->setEnabled(false);
-        d->newAction->setEnabled(false);
-        d->addFoldersAction->setEnabled(false);
-        d->writeAlbumMetadataAction->setEnabled(true);
-        d->readAlbumMetadataAction->setEnabled(true);
+        if (!val)
+        {
+            // Not a PAlbum is selected
+            d->deleteAction->setEnabled(false);
+            d->addImagesAction->setEnabled(false);
+            d->propsEditAction->setEnabled(false);
+            d->openInFileManagerAction->setEnabled(false);
+            d->openInTerminalAction->setEnabled(false);
+            d->newAction->setEnabled(false);
+            d->addFoldersAction->setEnabled(false);
+            d->writeAlbumMetadataAction->setEnabled(true);
+            d->readAlbumMetadataAction->setEnabled(true);
+            d->pasteItemsAction->setEnabled(!album->isRoot());
+        }
+        else
+        {
+            // We have either the abstract root album,
+            // the album root album for collection base dirs, or normal albums.
+            PAlbum* palbum     = static_cast<PAlbum*>(album);
+            bool isRoot        = palbum->isRoot();
+            bool isAlbumRoot   = palbum->isAlbumRoot();
+            bool isNormalAlbum = !isRoot && !isAlbumRoot;
+
+            d->deleteAction->setEnabled(isNormalAlbum);
+            d->addImagesAction->setEnabled(isNormalAlbum || isAlbumRoot);
+            d->propsEditAction->setEnabled(isNormalAlbum);
+            d->openInFileManagerAction->setEnabled(true);
+            d->openInTerminalAction->setEnabled(true);
+            d->newAction->setEnabled(isNormalAlbum || isAlbumRoot);
+            d->addFoldersAction->setEnabled(isNormalAlbum || isAlbumRoot);
+            d->writeAlbumMetadataAction->setEnabled(isNormalAlbum || isAlbumRoot);
+            d->readAlbumMetadataAction->setEnabled(isNormalAlbum || isAlbumRoot);
+            d->pasteItemsAction->setEnabled(isNormalAlbum || isAlbumRoot);
+        }
     }
-    else if (!album && !val)
+    else
     {
-        // Groupitem selected (Collection/date)
         d->deleteAction->setEnabled(false);
         d->addImagesAction->setEnabled(false);
         d->propsEditAction->setEnabled(false);
@@ -1381,25 +1445,7 @@ void DigikamApp::slotAlbumSelected(bool val)
         d->addFoldersAction->setEnabled(false);
         d->writeAlbumMetadataAction->setEnabled(false);
         d->readAlbumMetadataAction->setEnabled(false);
-    }
-    else if (album && album->type() == Album::PHYSICAL)
-    {
-        // We have either the abstract root album,
-        // the album root album for collection base dirs, or normal albums.
-        PAlbum* palbum     = static_cast<PAlbum*>(album);
-        bool isRoot        = palbum->isRoot();
-        bool isAlbumRoot   = palbum->isAlbumRoot();
-        bool isNormalAlbum = !isRoot && !isAlbumRoot;
-
-        d->deleteAction->setEnabled(isNormalAlbum);
-        d->addImagesAction->setEnabled(isNormalAlbum || isAlbumRoot);
-        d->propsEditAction->setEnabled(isNormalAlbum);
-        d->openInFileManagerAction->setEnabled(true);
-        d->openInTerminalAction->setEnabled(true);
-        d->newAction->setEnabled(isNormalAlbum || isAlbumRoot);
-        d->addFoldersAction->setEnabled(isNormalAlbum || isAlbumRoot);
-        d->writeAlbumMetadataAction->setEnabled(isNormalAlbum || isAlbumRoot);
-        d->readAlbumMetadataAction->setEnabled(isNormalAlbum || isAlbumRoot);
+        d->pasteItemsAction->setEnabled(false);
     }
 }
 
@@ -1412,21 +1458,11 @@ void DigikamApp::slotTagSelected(bool val)
         return;
     }
 
-    if (!val)
-    {
-        d->deleteTagAction->setEnabled(false);
-        d->editTagAction->setEnabled(false);
-    }
-    else if (!album->isRoot())
-    {
-        d->deleteTagAction->setEnabled(true);
-        d->editTagAction->setEnabled(true);
-    }
-    else
-    {
-        d->deleteTagAction->setEnabled(false);
-        d->editTagAction->setEnabled(false);
-    }
+    bool enabled = val && album && !album->isRoot();
+    d->browseTagsAction->setEnabled(!val);
+    d->newTagAction->setEnabled(enabled);
+    d->deleteTagAction->setEnabled(enabled);
+    d->editTagAction->setEnabled(enabled);
 }
 
 void DigikamApp::slotImageSelected(const ImageInfoList& selection, bool hasPrev, bool hasNext,
@@ -1477,12 +1513,9 @@ void DigikamApp::slotSelectionChanged(int selectionCount)
 {
     // The preview can either be activated when only one image is selected,
     // or if multiple images are selected, but one image is the 'current image'.
-    d->imagePreviewAction->setEnabled(
-               (selectionCount == 1)
-            || ( (selectionCount > 0) && d->view->hasCurrentItem())
-        );
-
-    d->imageViewAction->setEnabled(selectionCount == 1);
+    bool hasAtLeastCurrent =(selectionCount == 1) || ( (selectionCount > 0) && d->view->hasCurrentItem());
+    d->imagePreviewAction->setEnabled(hasAtLeastCurrent);
+    d->imageViewAction->setEnabled(hasAtLeastCurrent);
     d->imageFindSimilarAction->setEnabled(selectionCount == 1);
     d->imageRenameAction->setEnabled(selectionCount > 0);
     d->imageLightTableAction->setEnabled(selectionCount > 0);
@@ -1495,6 +1528,8 @@ void DigikamApp::slotSelectionChanged(int selectionCount)
     d->imageExifOrientationActionMenu->setEnabled(selectionCount > 0);
     d->slideShowSelectionAction->setEnabled(selectionCount > 0);
     d->moveSelectionToAlbumAction->setEnabled(selectionCount > 0);
+    d->cutItemsAction->setEnabled(selectionCount > 0);
+    d->copyItemsAction->setEnabled(selectionCount > 0);
 
     if (selectionCount > 0)
     {
@@ -1507,6 +1542,28 @@ void DigikamApp::slotSelectionChanged(int selectionCount)
     }
 }
 
+void DigikamApp::slotSwitchedToPreview()
+{
+    d->imagePreviewAction->setChecked(true);
+    d->zoomBar->setBarMode(DZoomBar::PreviewZoomCtrl);
+    d->showBarAction->setEnabled(true);
+}
+
+void DigikamApp::slotSwitchedToIconView()
+{
+    d->zoomBar->setBarMode(DZoomBar::ThumbsSizeCtrl);
+    d->imageIconViewAction->setChecked(true);
+    d->showBarAction->setEnabled(false);
+}
+
+void DigikamApp::slotSwitchedToMapView()
+{
+    //TODO: Link to map view's zoom actions
+    d->zoomBar->setBarMode(DZoomBar::ThumbsSizeCtrl);
+    d->imageMapViewAction->setChecked(true);
+    d->showBarAction->setEnabled(false);
+}
+
 void DigikamApp::slotProgressBarMode(int mode, const QString& text)
 {
     d->statusProgressBar->progressBarMode((StatusProgressBar::StatusProgressBarMode)mode, text);
@@ -1623,6 +1680,7 @@ void DigikamApp::slotCameraAdded(CameraType* ctype)
 
     ctype->setAction(cAction);
     updateCameraMenu();
+    updateQuickImportAction();
 }
 
 void DigikamApp::slotCameraRemoved(KAction* cAction)
@@ -1633,6 +1691,7 @@ void DigikamApp::slotCameraRemoved(KAction* cAction)
     }
 
     updateCameraMenu();
+    updateQuickImportAction();
 }
 
 void DigikamApp::slotCameraAutoDetect()
@@ -2011,6 +2070,7 @@ QString DigikamApp::labelForSolidCamera(const Solid::Device& cameraDevice)
 
 void DigikamApp::fillSolidMenus()
 {
+    QHash<QString, QDateTime> newAppearanceTimes;
     d->usbMediaMenu->menu()->clear();
     d->cardReaderMenu->menu()->clear();
 
@@ -2062,6 +2122,8 @@ void DigikamApp::fillSolidMenus()
         action->setIcon(KIcon(iconName));
         // set data to identify device in action slot slotSolidSetupDevice
         action->setData(cameraDevice.udi());
+        newAppearanceTimes[cameraDevice.udi()] = d->cameraAppearanceTimes.contains(cameraDevice.udi()) ?
+            d->cameraAppearanceTimes.value(cameraDevice.udi()) : QDateTime::currentDateTime();
 
         d->cameraMenu->addAction(action);
     }
@@ -2251,6 +2313,8 @@ void DigikamApp::fillSolidMenus()
 
         // set data to identify device in action slot slotSolidSetupDevice
         action->setData(accessDevice.udi());
+        newAppearanceTimes[accessDevice.udi()] = d->cameraAppearanceTimes.contains(accessDevice.udi()) ?
+            d->cameraAppearanceTimes.value(accessDevice.udi()) : QDateTime::currentDateTime();
 
         if (isCamera)
         {
@@ -2293,12 +2357,14 @@ void DigikamApp::fillSolidMenus()
     d->cardReaderMenu->menuAction()->setVisible(!d->cardReaderMenu->isEmpty());
     */
 
+    d->cameraAppearanceTimes = newAppearanceTimes;
 
     // disable empty menus
     d->usbMediaMenu->setEnabled(!d->usbMediaMenu->menu()->isEmpty());
     d->cardReaderMenu->setEnabled(!d->cardReaderMenu->menu()->isEmpty());
 
     updateCameraMenu();
+    updateQuickImportAction();
 }
 
 void DigikamApp::slotSetup()
@@ -2380,6 +2446,9 @@ void DigikamApp::slotConfToolbars()
         createGUI(xmlFile());
         applyMainWindowSettings(d->config->group("General Settings"));
         plugActionList( QString::fromLatin1("file_actions_import"), d->kipiFileActionsImport );
+        plugActionList( QString::fromLatin1("image_jpeglossless_actions"), d->kipiJpeglosslessActions);
+        plugActionList( QString::fromLatin1("image_print_actions"),  d->kipiPrintActions);
+        plugActionList( QString::fromLatin1("image_metadata_actions"), d->kipiMetadataActions);
         plugActionList( QString::fromLatin1("image_actions"),       d->kipiImageActions );
         plugActionList( QString::fromLatin1("tool_actions"),        d->kipiToolsActions );
         plugActionList( QString::fromLatin1("batch_actions"),       d->kipiBatchActions );
@@ -2507,6 +2576,9 @@ void DigikamApp::slotKipiPluginPlug()
 {
     unplugActionList(QString::fromLatin1("file_actions_export"));
     unplugActionList(QString::fromLatin1("file_actions_import"));
+    unplugActionList(QString::fromLatin1("image_jpeglossless_actions"));
+    unplugActionList(QString::fromLatin1("image_print_actions"));
+    unplugActionList(QString::fromLatin1("image_metadata_actions"));
     unplugActionList(QString::fromLatin1("image_actions"));
     unplugActionList(QString::fromLatin1("tool_actions"));
     unplugActionList(QString::fromLatin1("batch_actions"));
@@ -2565,12 +2637,11 @@ void DigikamApp::slotKipiPluginPlug()
         pluginActionsDisabled << QString("batch_convert_images");  // Obsolete since 1.2.0, replaced by BQM convert tools.
         pluginActionsDisabled << QString("batch_color_images");    // Obsolete since 1.2.0, replaced by BQM color tools.
         pluginActionsDisabled << QString("batch_filter_images");   // Obsolete since 1.2.0, replaced by BQM enhance tools.
+        pluginActionsDisabled << QString("jpeglossless_convert2grayscale");
 
         // Add actions to kipipluginsActionCollection
         QList<QAction*> allPluginActions = plugin->actionCollection()->actions();
 
-#if KDE_IS_VERSION(4,1,68)
-
         if (allPluginActions.count() > 3)
         {
             KActionCategory* category = new KActionCategory(plugin->objectName(), d->kipipluginsActionCollection);
@@ -2586,7 +2657,6 @@ void DigikamApp::slotKipiPluginPlug()
         }
         else
         {
-#endif
             foreach (QAction* action, allPluginActions)
             {
                 QString actionName(action->objectName());
@@ -2596,11 +2666,8 @@ void DigikamApp::slotKipiPluginPlug()
                     d->kipipluginsActionCollection->addAction(actionName, action);
                 }
             }
-#if KDE_IS_VERSION(4,1,68)
         }
 
-#endif
-
         // Plugin category identification using KAction method based.
 
         QList<KAction*> actions = plugin->actions();
@@ -2625,8 +2692,27 @@ void DigikamApp::slotKipiPluginPlug()
                         d->kipiFileActionsExport.append(action);
                         break;
                     case KIPI::ImagesPlugin:
-                        d->kipiImageActions.append(action);
+                    {
+                        if (plugin->objectName() == "JPEGLossless")
+                        {
+                            d->kipiJpeglosslessActions.append(action);
+                        }
+                        else if (plugin->objectName() == "PrintImages")
+                        {
+                            d->kipiPrintActions.append(action);
+                        }
+                        else if (plugin->objectName() == "GPSSync" ||
+                                 plugin->objectName() == "MetadataEdit" ||
+                                 plugin->objectName() == "TimeAdjust")
+                        {
+                            d->kipiMetadataActions.append(action);
+                        }
+                        else
+                        {
+                            d->kipiImageActions.append(action);
+                        }
                         break;
+                    }
                     case KIPI::ToolsPlugin:
                     {
                         if (actionName == QString("advancedslideshow"))
@@ -2659,6 +2745,9 @@ void DigikamApp::slotKipiPluginPlug()
     // Create GUI menu in according with plugins.
     plugActionList(QString::fromLatin1("file_actions_export"), d->kipiFileActionsExport);
     plugActionList(QString::fromLatin1("file_actions_import"), d->kipiFileActionsImport);
+    plugActionList(QString::fromLatin1("image_jpeglossless_actions"), d->kipiJpeglosslessActions);
+    plugActionList(QString::fromLatin1("image_print_actions"), d->kipiPrintActions);
+    plugActionList(QString::fromLatin1("image_metadata_actions"), d->kipiMetadataActions);
     plugActionList(QString::fromLatin1("image_actions"),       d->kipiImageActions);
     plugActionList(QString::fromLatin1("tool_actions"),        d->kipiToolsActions);
     plugActionList(QString::fromLatin1("batch_actions"),       d->kipiBatchActions);
@@ -2910,36 +2999,6 @@ void DigikamApp::slotZoomChanged(double zoom)
     }
 }
 
-void DigikamApp::slotTogglePreview(bool t)
-{
-    // NOTE: if 't' is true, we are in Preview Mode, else we are in AlbumView Mode
-
-    // This is require if ESC is pressed to go out of Preview Mode.
-    // imagePreviewAction is handled by F3 key only.
-    d->imagePreviewAction->setChecked(t);
-
-    // Here, we will toggle some menu actions depending of current Mode.
-
-    // Select menu.
-    d->selectAllAction->setEnabled(!t);
-    d->selectNoneAction->setEnabled(!t);
-    d->selectInvertAction->setEnabled(!t);
-
-    // View menu
-    d->albumSortAction->setEnabled(!t);
-    d->imageSortAction->setEnabled(!t);
-    d->showBarAction->setEnabled(t);
-
-    if (t)
-    {
-        d->zoomBar->setBarMode(DZoomBar::PreviewZoomCtrl);
-    }
-    else
-    {
-        d->zoomBar->setBarMode(DZoomBar::ThumbsSizeCtrl);
-    }
-}
-
 void DigikamApp::slotImportAddImages()
 {
     QString startingPath;
@@ -3064,6 +3123,51 @@ void DigikamApp::updateCameraMenu()
     d->cameraMenu->addAction(actionCollection()->action("camera_add"));
 }
 
+void DigikamApp::updateQuickImportAction()
+{
+    d->quickImportMenu->menu()->clear();
+    foreach (QAction* action, d->solidCameraActionGroup->actions())
+    {
+        d->quickImportMenu->addAction(action);
+    }
+    foreach (QAction* action, d->solidUsmActionGroup->actions())
+    {
+        d->quickImportMenu->addAction(action);
+    }
+    foreach (QAction* action, d->manualCameraActionGroup->actions())
+    {
+        d->quickImportMenu->addAction(action);
+    }
+
+    if (d->quickImportMenu->menu()->actions().isEmpty())
+    {
+        d->quickImportMenu->setEnabled(false);
+    }
+    else
+    {
+        disconnect(d->quickImportMenu, SIGNAL(triggered()), 0, 0);
+
+        QAction* primaryAction = 0;
+        QDateTime latest;
+        foreach (QAction* action, d->quickImportMenu->menu()->actions())
+        {
+            QDateTime appearanceTime = d->cameraAppearanceTimes.value(action->data().toString());
+            if (latest.isNull() || appearanceTime > latest)
+            {
+                primaryAction = action;
+                latest = appearanceTime;
+            }
+        }
+        if (!primaryAction)
+        {
+            primaryAction = d->quickImportMenu->menu()->actions().first();
+        }
+        connect(d->quickImportMenu, SIGNAL(triggered()),
+                primaryAction, SLOT(trigger()));
+        d->quickImportMenu->setDelayed(d->quickImportMenu->menu()->actions().size() > 1);
+    }
+}
+
 void DigikamApp::setupExifOrientationActions()
 {
     QSignalMapper* exifOrientationMapper = new QSignalMapper(d->view);
diff --git a/digikam/digikamapp.h b/digikam/digikamapp.h
index f4d5bae..5f5c919 100644
--- a/digikam/digikamapp.h
+++ b/digikam/digikamapp.h
@@ -143,6 +143,7 @@ private:
     void runFaceScanner(const FaceScanSettings& rebuildAll);
     void runThumbnailsGenerator(bool rebuildAll);
     void updateCameraMenu();
+    void updateQuickImportAction();
     void initGui();
 
 private Q_SLOTS:
@@ -215,7 +216,10 @@ private Q_SLOTS:
     void slotZoomSliderChanged(int);
     void slotThumbSizeChanged(int);
     void slotZoomChanged(double);
-    void slotTogglePreview(bool);
+
+    void slotSwitchedToPreview();
+    void slotSwitchedToIconView();
+    void slotSwitchedToMapView();
 
     void slotImportAddImages();
     void slotImportAddFolders();
diff --git a/digikam/digikamapp_p.h b/digikam/digikamapp_p.h
index f7ed6a8..914e91f 100644
--- a/digikam/digikamapp_p.h
+++ b/digikam/digikamapp_p.h
@@ -109,6 +109,7 @@ public:
         rebuildAlbumThumbsAction(0),
         writeAlbumMetadataAction(0),
         readAlbumMetadataAction(0),
+        browseTagsAction(0),
         newTagAction(0),
         deleteTagAction(0),
         editTagAction(0),
@@ -132,6 +133,9 @@ public:
         imageRenameAction(0),
         imageDeleteAction(0),
         imageExifOrientationActionMenu(0),
+        cutItemsAction(0),
+        copyItemsAction(0),
+        pasteItemsAction(0),
         selectAllAction(0),
         selectNoneAction(0),
         selectInvertAction(0),
@@ -194,6 +198,9 @@ public:
     // KIPI plugins support
     QList<QAction*>                     kipiFileActionsExport;
     QList<QAction*>                     kipiFileActionsImport;
+    QList<QAction*>                     kipiJpeglosslessActions;
+    QList<QAction*>                     kipiPrintActions;
+    QList<QAction*>                     kipiMetadataActions;
     QList<QAction*>                     kipiImageActions;
     QList<QAction*>                     kipiToolsActions;
     QList<QAction*>                     kipiBatchActions;
@@ -202,6 +209,8 @@ public:
     KActionMenu*                        cameraMenu;
     KActionMenu*                        usbMediaMenu;
     KActionMenu*                        cardReaderMenu;
+    KActionMenu*                        quickImportMenu;
+    QHash<QString, QDateTime>           cameraAppearanceTimes;
 
     KSharedConfig::Ptr                  config;
 
@@ -229,16 +238,16 @@ public:
     KAction*                            readAlbumMetadataAction;
 
     // Tag Actions
+    KAction*                            browseTagsAction;
     KAction*                            newTagAction;
     KAction*                            deleteTagAction;
     KAction*                            editTagAction;
 
     // Image Actions
+    KSelectAction*                      imageViewSelectionAction;
     KToggleAction*                      imagePreviewAction;
-    KAction*                            imageMapViewAction;
-    KActionMenu*                        imageViewSelectionAction;
-    KAction*                            imageIconViewAction;
-    KAction*                            imagePreviewViewAction;
+    KToggleAction*                      imageMapViewAction;
+    KToggleAction*                      imageIconViewAction;
     KAction*                            imageLightTableAction;
     KAction*                            imageAddLightTableAction;
     KAction*                            imageAddCurrentQueueAction;
@@ -259,7 +268,10 @@ public:
     KAction*                            imageDeleteAction;
     KActionMenu*                        imageExifOrientationActionMenu;
 
-    // Selection Actions
+    // Edit Actions
+    KAction*                            cutItemsAction;
+    KAction*                            copyItemsAction;
+    KAction*                            pasteItemsAction;
     KAction*                            selectAllAction;
     KAction*                            selectNoneAction;
     KAction*                            selectInvertAction;
diff --git a/digikam/digikamimageview.cpp b/digikam/digikamimageview.cpp
index a4d2751..9ac507a 100644
--- a/digikam/digikamimageview.cpp
+++ b/digikam/digikamimageview.cpp
@@ -239,21 +239,6 @@ void DigikamImageView::activated(const ImageInfo& info)
     }
 }
 
-void DigikamImageView::openInEditor(const ImageInfo& info)
-{
-    d->utilities->openInEditor(info, imageInfos(), currentAlbum());
-}
-
-void DigikamImageView::openCurrentInEditor()
-{
-    ImageInfo info = currentInfo();
-
-    if (!info.isNull())
-    {
-        d->utilities->openInEditor(info, imageInfos(), currentAlbum());
-    }
-}
-
 void DigikamImageView::showContextMenuOnInfo(QContextMenuEvent* event, const ImageInfo& info)
 {
     QList<ImageInfo> selectedInfos = selectedImageInfosCurrentFirst();
@@ -372,7 +357,39 @@ void DigikamImageView::showContextMenu(QContextMenuEvent* event)
     delete paste;
 }
 
-void DigikamImageView::insertSelectedToLightTable(bool addTo)
+void DigikamImageView::openInEditor(const ImageInfo& info)
+{
+    d->utilities->openInEditor(info, imageInfos(), currentAlbum());
+}
+
+void DigikamImageView::openCurrentInEditor()
+{
+    ImageInfo info = currentInfo();
+
+    if (!info.isNull())
+    {
+        d->utilities->openInEditor(info, imageInfos(), currentAlbum());
+    }
+}
+
+void DigikamImageView::openEditor()
+{
+    ImageInfoList imageInfoList = imageInfos();
+    ImageInfo     singleInfo    = currentInfo();
+    if (singleInfo.isNull() && !imageInfoList.isEmpty())
+    {
+        singleInfo = imageInfoList.first();
+    }
+
+    d->utilities->openInEditor(singleInfo, imageInfoList, currentAlbum());
+}
+
+void DigikamImageView::setOnLightTable()
+{
+    d->utilities->insertToLightTableAuto(imageInfos(), selectedImageInfos(), currentInfo());
+}
+
+void DigikamImageView::addSelectedToLightTable()
 {
     // Run Light Table with all selected image files in the current Album.
     // If addTo is false, the light table will be emptied before adding
@@ -381,8 +398,36 @@ void DigikamImageView::insertSelectedToLightTable(bool addTo)
 
     if (!imageInfoList.isEmpty())
     {
-        d->utilities->insertToLightTable(imageInfoList, imageInfoList.first(), addTo);
+        d->utilities->insertToLightTable(imageInfoList, imageInfoList.first(), true);
+    }
+}
+
+void DigikamImageView::setSelectedOnLightTable()
+{
+    // Run Light Table with all selected image files in the current Album.
+    // If addTo is false, the light table will be emptied before adding
+    // the images.
+    ImageInfoList imageInfoList = selectedImageInfos();
+
+    if (!imageInfoList.isEmpty())
+    {
+        d->utilities->insertToLightTable(imageInfoList, imageInfoList.first(), false);
+    }
+}
+
+void DigikamImageView::insertToQueue()
+{
+    ImageInfoList imageInfoList = selectedImageInfos();
+    ImageInfo     singleInfo    = currentInfo();
+    if (singleInfo.isNull() && !imageInfoList.isEmpty())
+    {
+        singleInfo = imageInfoList.first();
+    }
+    if (singleInfo.isNull() && model()->rowCount())
+    {
+        singleInfo = imageInfos().first();
     }
+    d->utilities->insertToQueueManagerAuto(imageInfoList, singleInfo);
 }
 
 void DigikamImageView::insertSelectedToCurrentQueue()
diff --git a/digikam/digikamimageview.h b/digikam/digikamimageview.h
index 549438c..4d53f4c 100644
--- a/digikam/digikamimageview.h
+++ b/digikam/digikamimageview.h
@@ -54,10 +54,15 @@ public:
 
 public Q_SLOTS:
 
+    void openEditor();
     void openInEditor(const ImageInfo& info);
     void openCurrentInEditor();
 
-    void insertSelectedToLightTable(bool addTo);
+    void setOnLightTable();
+    void addSelectedToLightTable();
+    void setSelectedOnLightTable();
+
+    void insertToQueue();
     void insertSelectedToCurrentQueue();
     void insertSelectedToNewQueue();
     void insertSelectedToExistingQueue(int queueid);
diff --git a/digikam/digikamui.rc b/digikam/digikamui.rc
index 630f3fe..4d8b4b2 100644
--- a/digikam/digikamui.rc
+++ b/digikam/digikamui.rc
@@ -1,78 +1,101 @@
 <!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
-<gui version="201" name="digikam" >
+<gui version="202" name="digikam" >
 
  <MenuBar>
 
-  <Menu name="Album" >
-   <text>&Album</text>
+  <Menu name="Browse" >
+   <text>&Browse</text>
+     <Action name="browse_album" />
+     <Action name="browse_tag" />
+     <Action name="browse_date" />
+     <Action name="browse_timeline" />
+     <Action name="browse_search" />
+     <Action name="browse_fuzzysearch" />
+     <Action name="browse_gpssearch" />
+     <Action name="browse_people" />
+   <Separator/>
      <Action name="album_back" />
      <Action name="album_forward" />
+     <Action name="album_refresh" />
    <Separator/>
+     <Action name="app_exit" />
+  </Menu>
+
+  <Menu name="Album" >
+   <text>&Album</text>
      <Action name="album_new" />
      <Action name="album_propsEdit" />
-     <Action name="album_refresh" />
      <Action name="album_openinfilemanager" />
      <Action name="album_openinterminal" />
+     <Action name="album_remove" />
+     <Action name="album_delete" />
    <Separator/>
      <Action name="album_rebuild_thumbs" />
      <Action name="album_write_metadata" />
      <Action name="album_read_metadata" />
-   <Separator/>
-     <Action name="album_remove" />
-     <Action name="album_delete" />
-   <Separator/>
-     <Action name="app_exit" />
   </Menu>
 
   <Menu name="Tag" >
    <text>T&ag</text>
+     <Action name="browse_tag_long" />
+   <Separator/>
      <Action name="tag_new" />
      <Action name="tag_edit" />
-   <Separator/>
      <Action name="tag_delete" />
   </Menu>
 
   <Menu name="Image" >
    <text>&Image</text>
-     <Action name="image_view" />
      <Action name="image_edit" />
    <Separator />
+     <Action name="image_rename" />
+     <Action name="image_delete" />
+   <Separator />
      <Action name="image_lighttable" />
      <Action name="image_add_to_lighttable" />
-   <Separator />
      <Action name="image_add_to_current_queue" />
      <Action name="image_add_to_new_queue" />
+     <Action name="image_find_similar" />
+   <Separator />
+     <ActionList name="image_print_actions"/>
    <Separator />
      <Action name="image_write_metadata" />
      <Action name="image_read_metadata" />
+     <ActionList name="image_metadata_actions"/>
    <Separator />
-     <Action name="image_find_similar" />
+     <ActionList name="image_jpeglossless_actions"/>
      <Action name="image_set_exif_orientation"/>
    <Separator />
      <ActionList name="image_actions"/>
    <Separator />
-     <Action name="image_rename" />
-     <Action name="image_delete" />
   </Menu>
 
   <Menu name="Edit" >
    <text>&Edit</text>
+     <Action name="cut_album_selection" />
+     <Action name="copy_album_selection" />
+     <Action name="paste_album_selection" />
+     <Separator/>
      <Action name="selectAll" />
      <Action name="selectNone" />
      <Action name="selectInvert" />
-  </Menu>
+   </Menu>
 
   <Menu name="View" >
    <text>&View</text>
-     <Action name="full_screen" />
-     <Action name="view_selection" />
+     <Action name="icon_view" />
+     <Action name="image_view" />
+     <Action name="map_view" />
+     <!--<Action name="view_selection" />-->
+     <Separator/>
      <Action name="slideshow" />
+     <Action name="full_screen" />
      <Separator/>
      <Action name="album_zoomin" />
      <Action name="album_zoomout" />
+    <Separator/>
      <Action name="album_zoomto100percents" />
      <Action name="album_zoomfit2window" />
-     <Separator />
      <Action name="showthumbs" />
      <Separator />
      <Action name="album_sort" />
@@ -84,15 +107,15 @@
   </Menu>
 
   <Menu name="Tools"><text>&Tools</text>
+        <Action name="imageeditor" />
+        <Action name="light_table" />
+        <Action name="queue_manager" />
+      <Separator/>
         <Action name="script_console"/>
         <Action name="search_quick" />
         <Action name="search_advanced" />
         <Action name="find_duplicates" />
       <Separator/>
-        <Action name="light_table" />
-        <Action name="queue_manager" />
-      <Separator/>
-          <Action name="database_migration" />
         <Action name="database_rescan" />
         <Action name="thumbnails_rebuild" />
         <Action name="fingerprints_rebuild" />
@@ -130,6 +153,7 @@
      <Action name="options_configure_keybinding"/>
      <Action name="options_configure_toolbars"/>
      <Action name="options_configure_notifications"/>
+     <Action name="database_migration" />
      <Action name="options_configure"/>
   </Menu>
 
@@ -150,21 +174,20 @@
 
  <ToolBar noMerge="1" name="mainToolBar" >
   <text>Main Toolbar</text>
-  <Action name="album_back" />
+  <!--<Action name="album_back" />
   <Action name="album_forward" />
-  <Action name="album_new" />
-  <Action name="album_addImages" />
-  <Action name="album_propsEdit" />
-  <Separator/>
-  <Action name="search_quick" />
+  <Separator/>-->
+  <Action name="imageeditor" />
+  <Action name="light_table" />
+  <Action name="queue_manager" />
+  <Action name="import_auto" />
   <Separator/>
+  <Action name="icon_view" />
   <Action name="image_view" />
-  <Action name="image_edit" />
-  <Action name="image_rename" />
+  <Action name="map_view" />
   <Separator/>
-  <Action name="full_screen" />
   <Action name="slideshow" />
-  <Action name="view_selection" />
+  <Action name="full_screen" />
   <WeakSeparator/>
   <Action name="logo_action" />
  </ToolBar>
@@ -175,8 +198,6 @@
   <Action name="previous_image"/>
   <Action name="first_image"/>
   <Action name="last_image"/>
-  <Action name="copy_album_selection"/>
-  <Action name="paste_album_selection"/>
  </MainWindow>
 
  <ActionProperties/>
diff --git a/digikam/digikamview.cpp b/digikam/digikamview.cpp
index c69bf63..ae0fefd 100644
--- a/digikam/digikamview.cpp
+++ b/digikam/digikamview.cpp
@@ -206,12 +206,6 @@ DigikamView::DigikamView(QWidget* parent, DigikamModelCollection* modelCollectio
     connect(d->albumFolderSideBar, SIGNAL(signalFindDuplicatesInAlbum(Album*)),
             this, SLOT(slotNewDuplicatesSearch(Album*)));
 
-    // date view
-    d->dateViewSideBar = new DateFolderViewSideBarWidget(d->leftSideBar,
-            d->modelCollection->getDateAlbumModel(),
-            d->iconView->imageAlbumFilterModel());
-    d->leftSideBarWidgets << d->dateViewSideBar;
-
     // Tags sidebar tab contents.
     d->tagViewSideBar = new TagViewSideBarWidget(d->leftSideBar,
             d->modelCollection->getTagModel());
@@ -219,6 +213,12 @@ DigikamView::DigikamView(QWidget* parent, DigikamModelCollection* modelCollectio
     connect(d->tagViewSideBar, SIGNAL(signalFindDuplicatesInAlbum(Album*)),
             this, SLOT(slotNewDuplicatesSearch(Album*)));
 
+    // date view
+    d->dateViewSideBar = new DateFolderViewSideBarWidget(d->leftSideBar,
+            d->modelCollection->getDateAlbumModel(),
+            d->iconView->imageAlbumFilterModel());
+    d->leftSideBarWidgets << d->dateViewSideBar;
+
     // timeline side bar
     d->timelineSideBar = new TimelineSideBarWidget(d->leftSideBar,
             d->modelCollection->getSearchModel(),
@@ -467,8 +467,8 @@ void DigikamView::setupConnections()
     connect(d->albumWidgetStack, SIGNAL(signalDeleteItem()),
             this, SLOT(slotImageDelete()));
 
-    connect(d->albumWidgetStack, SIGNAL(signalToggledToPreviewMode(bool)),
-            this, SLOT(slotToggledToPreviewMode(bool)));
+    connect(d->albumWidgetStack, SIGNAL(signalViewModeChanged()),
+            this, SLOT(slotViewModeChanged()));
 
     connect(d->albumWidgetStack, SIGNAL(signalBack2Album()),
             this, SLOT(slotEscapePreview()));
@@ -654,6 +654,11 @@ void DigikamView::saveViewState()
     d->rightSideBar->saveState();
 }
 
+QList<SidebarWidget*> DigikamView::leftSidebarWidgets()
+{
+    return d->leftSideBarWidgets;
+}
+
 KUrl::List DigikamView::allUrls() const
 {
     return d->iconView->urls();
@@ -1022,6 +1027,11 @@ void DigikamView::slotAlbumSelected(Album* album)
         */
         emit signalTagSelected(true);
     }
+    else
+    {
+        emit signalAlbumSelected(false);
+        emit signalTagSelected(false);
+    }
 
     if (d->useAlbumHistory)
     {
@@ -1412,11 +1422,6 @@ void DigikamView::slotEscapePreview()
 
 void DigikamView::slotMapWidgetView()
 {
-    if (d->albumWidgetStack->previewMode() == AlbumWidgetStack::PreviewImageMode)
-    {
-        emit signalTogglePreview(false);
-    }
-
     d->albumWidgetStack->setPreviewMode(AlbumWidgetStack::MapWidgetMode);
 }
 
@@ -1425,7 +1430,6 @@ void DigikamView::slotIconView()
     if (d->albumWidgetStack->previewMode() == AlbumWidgetStack::PreviewImageMode)
     {
         emit signalThumbSizeChanged(d->iconView->thumbnailSize().size());
-        emit signalTogglePreview(false);
     }
 
     // and switch to icon view
@@ -1481,27 +1485,31 @@ void DigikamView::slotTogglePreviewMode(const ImageInfo& info)
     slotImageSelected();
 }
 
-void DigikamView::slotToggledToPreviewMode(bool b)
+void DigikamView::slotViewModeChanged()
 {
-    /// @todo What do we have to do in the map widget mode???
-
     toggleZoomActions();
 
-    if (d->albumWidgetStack->previewMode() == AlbumWidgetStack::PreviewAlbumMode)
-    {
-        emit signalThumbSizeChanged(d->iconView->thumbnailSize().size());
-    }
-    else if (d->albumWidgetStack->previewMode() == AlbumWidgetStack::PreviewImageMode)
-    {
-        slotZoomFactorChanged(d->albumWidgetStack->zoomFactor());
+    switch (d->albumWidgetStack->previewMode())
+    {
+        case AlbumWidgetStack::PreviewAlbumMode:
+            emit signalSwitchedToIconView();
+            emit signalThumbSizeChanged(d->iconView->thumbnailSize().size());
+            break;
+        case AlbumWidgetStack::PreviewImageMode:
+            emit signalSwitchedToPreview();
+            slotZoomFactorChanged(d->albumWidgetStack->zoomFactor());
+            break;
+        case AlbumWidgetStack::WelcomePageMode:
+            emit signalSwitchedToIconView();
+            break;
+        case AlbumWidgetStack::MediaPlayerMode:
+            emit signalSwitchedToPreview();
+            break;
+        case AlbumWidgetStack::MapWidgetMode:
+            emit signalSwitchedToMapView();
+            //TODO: connect map view's zoom buttons to main status bar zoom buttons
+            break;
     }
-
-    emit signalTogglePreview(b);
-}
-
-void DigikamView::slotImageEdit()
-{
-    d->iconView->openCurrentInEditor();
 }
 
 void DigikamView::slotImageFindSimilar()
@@ -1520,14 +1528,24 @@ void DigikamView::slotImageExifOrientation(int orientation)
     d->iconView->setExifOrientationOfSelected(orientation);
 }
 
+void DigikamView::slotEditor()
+{
+    d->iconView->openEditor();
+}
+
 void DigikamView::slotLightTable()
 {
-    d->iconView->utilities()->insertToLightTable(ImageInfoList(), ImageInfo(), true);
+    d->iconView->setOnLightTable();
 }
 
 void DigikamView::slotQueueMgr()
 {
-    d->iconView->utilities()->insertToQueueManager(ImageInfoList(), ImageInfo(), false);
+    d->iconView->insertToQueue();
+}
+
+void DigikamView::slotImageEdit()
+{
+    d->iconView->openCurrentInEditor();
 }
 
 void DigikamView::slotImageLightTable()
@@ -1536,7 +1554,7 @@ void DigikamView::slotImageLightTable()
     if (d->albumWidgetStack->previewMode() == AlbumWidgetStack::PreviewAlbumMode)
     {
         // put images into an emptied light table
-        d->iconView->insertSelectedToLightTable(false);
+        d->iconView->setSelectedOnLightTable();
     }
     else
     {
@@ -1554,7 +1572,7 @@ void DigikamView::slotImageAddToLightTable()
     if (d->albumWidgetStack->previewMode() == AlbumWidgetStack::PreviewAlbumMode)
     {
         // add images to the existing images in the light table
-        d->iconView->insertSelectedToLightTable(true);
+        d->iconView->addSelectedToLightTable();
     }
     else
     {
@@ -1899,11 +1917,26 @@ void DigikamView::slotOrientationChangeFailed(const QStringList& failedFileNames
     }
 }
 
+void DigikamView::slotLeftSideBarActivateAlbums()
+{
+    d->leftSideBar->setActiveTab(d->albumFolderSideBar);
+}
+
+void DigikamView::slotLeftSideBarActivateTags()
+{
+    d->leftSideBar->setActiveTab(d->tagViewSideBar);
+}
+
 void DigikamView::slotLeftSideBarActivate(SidebarWidget* widget)
 {
     d->leftSideBar->setActiveTab(widget);
 }
 
+void DigikamView::slotLeftSideBarActivate(QWidget* widget)
+{
+    slotLeftSideBarActivate(static_cast<SidebarWidget*>(widget));
+}
+
 void DigikamView::slotRatingChanged(const KUrl& url, int rating)
 {
     rating = qMin(RatingMax, qMax(RatingMin, rating));
diff --git a/digikam/digikamview.h b/digikam/digikamview.h
index 886bbed..f4eeed2 100644
--- a/digikam/digikamview.h
+++ b/digikam/digikamview.h
@@ -84,6 +84,7 @@ public:
     double zoomMax();
 
     void toggleTag(int tagID);
+    QList<SidebarWidget*> leftSidebarWidgets();
 
 Q_SIGNALS:
 
@@ -96,7 +97,9 @@ Q_SIGNALS:
     void signalProgressValue(int);
     void signalThumbSizeChanged(int);
     void signalZoomChanged(double);
-    void signalTogglePreview(bool);
+    void signalSwitchedToPreview();
+    void signalSwitchedToIconView();
+    void signalSwitchedToMapView();
 
     void signalGotoAlbumAndItem(const ImageInfo&);
     void signalGotoDateAndItem(AlbumIconItem*);
@@ -180,9 +183,15 @@ public Q_SLOTS:
     void slotAssignRating(int rating);
 
     // Tools action slots.
+    void slotEditor();
     void slotLightTable();
     void slotQueueMgr();
 
+    void slotLeftSideBarActivate(QWidget* widget);
+    void slotLeftSideBarActivate(SidebarWidget* widget);
+    void slotLeftSideBarActivateAlbums();
+    void slotLeftSideBarActivateTags();
+
 private:
 
     void toggleZoomActions();
@@ -195,8 +204,6 @@ private:
 
 private Q_SLOTS:
 
-    void slotLeftSideBarActivate(SidebarWidget* widget);
-
     void slotAllAlbumsLoaded();
 
     void slotAlbumsCleared();
@@ -214,7 +221,7 @@ private Q_SLOTS:
     void slotLastItem();
     void slotSelectItemByUrl(const KUrl&);
 
-    void slotToggledToPreviewMode(bool);
+    void slotViewModeChanged();
     void slotEscapePreview();
     void slotCancelSlideShow();
 
diff --git a/digikam/imageviewutilities.cpp b/digikam/imageviewutilities.cpp
index 479c747..66da5a3 100644
--- a/digikam/imageviewutilities.cpp
+++ b/digikam/imageviewutilities.cpp
@@ -275,6 +275,21 @@ void ImageViewUtilities::createNewAlbumForInfos(const QList<ImageInfo>& infos, A
             this, SLOT(slotDIOResult(KJob*)));
 }
 
+void ImageViewUtilities::insertToLightTableAuto(const QList<ImageInfo>& all, const QList<ImageInfo>& selected, const ImageInfo& current)
+{
+    ImageInfoList list          = selected;
+    ImageInfo     singleInfo    = current;
+    if (list.isEmpty() || (list.size() == 1 && LightTableWindow::lightTableWindow()->isEmpty()))
+    {
+        list = all;
+    }
+    if (singleInfo.isNull() && !list.isEmpty())
+    {
+        singleInfo = list.first();
+    }
+    insertToLightTable(list, current, list.size() <= 1);
+}
+
 void ImageViewUtilities::insertToLightTable(const QList<ImageInfo>& list, const ImageInfo& current, bool addTo)
 {
     LightTableWindow* ltview = LightTableWindow::lightTableWindow();
@@ -297,8 +312,15 @@ void ImageViewUtilities::insertToLightTable(const QList<ImageInfo>& list, const
     KWindowSystem::activateWindow(ltview->winId());
 }
 
-void ImageViewUtilities::insertToQueueManager(const QList<ImageInfo>& list, const ImageInfo& /*current*/, bool newQueue)
+void ImageViewUtilities::insertToQueueManagerAuto(const QList<ImageInfo>& list, const ImageInfo& current)
 {
+    insertToQueueManager(list, current, QueueMgrWindow::queueManagerWindow()->isBusy());
+}
+
+void ImageViewUtilities::insertToQueueManager(const QList<ImageInfo>& list, const ImageInfo& current, bool newQueue)
+{
+    Q_UNUSED(current);
+
     QueueMgrWindow* bqmview = QueueMgrWindow::queueManagerWindow();
 
     if (bqmview->isHidden())
diff --git a/digikam/imageviewutilities.h b/digikam/imageviewutilities.h
index 1eb9c48..d795467 100644
--- a/digikam/imageviewutilities.h
+++ b/digikam/imageviewutilities.h
@@ -61,7 +61,10 @@ public Q_SLOTS:
     bool deleteImages(const QList<ImageInfo>& infos, bool deletePermanently);
     void deleteImagesDirectly(const QList<ImageInfo>& infos, bool useTrash);
 
-    void insertToLightTable(const QList<ImageInfo>& list, const ImageInfo& current, bool emptyBeforeAdding);
+    void insertToLightTableAuto(const QList<ImageInfo>& all, const QList<ImageInfo>& selected, const ImageInfo& current);
+    void insertToLightTable(const QList<ImageInfo>& list, const ImageInfo& current, bool addTo);
+
+    void insertToQueueManagerAuto(const QList<ImageInfo>& list, const ImageInfo& currentInfo);
     void insertToQueueManager(const QList<ImageInfo>& list, const ImageInfo& currentInfo, bool newQueue);
     void insertSilentToQueueManager(const QList<ImageInfo>& list, const ImageInfo& currentInfo, int queueid);
 
diff --git a/digikam/leftsidebarwidgets.cpp b/digikam/leftsidebarwidgets.cpp
index 6a27fe1..8cf45b2 100644
--- a/digikam/leftsidebarwidgets.cpp
+++ b/digikam/leftsidebarwidgets.cpp
@@ -890,7 +890,7 @@ QPixmap SearchSideBarWidget::getIcon()
 
 QString SearchSideBarWidget::getCaption()
 {
-    return i18n("Searches");
+    return i18nc("Search images, access stored searches", "Search");
 }
 
 void SearchSideBarWidget::newKeywordSearch()
@@ -1073,7 +1073,7 @@ QPixmap GPSSearchSideBarWidget::getIcon()
 
 QString GPSSearchSideBarWidget::getCaption()
 {
-    return i18n("Map Searches");
+    return i18nc("Search images on a map", "Map Search");
 }
 
 // -----------------------------------------------------------------------------
@@ -1158,7 +1158,7 @@ QPixmap PeopleSideBarWidget::getIcon()
 
 QString PeopleSideBarWidget::getCaption()
 {
-    return i18nc("People on your photos", "People");
+    return i18nc("Browse images sorted by depicted people", "People");
 }
 
 void PeopleSideBarWidget::slotInit()
diff --git a/utilities/lighttable/lighttablewindow.cpp b/utilities/lighttable/lighttablewindow.cpp
index fee095c..dfe134b 100644
--- a/utilities/lighttable/lighttablewindow.cpp
+++ b/utilities/lighttable/lighttablewindow.cpp
@@ -35,6 +35,7 @@
 #include <kactioncollection.h>
 #include <kapplication.h>
 #include <kconfig.h>
+#include <kdebug.h>
 #include <kedittoolbar.h>
 #include <kglobal.h>
 #include <klocale.h>
@@ -671,6 +672,7 @@ void LightTableWindow::loadImageInfos(const ImageInfoList& list,
                                       bool addTo)
 {
     // Clear all items before adding new images to the light table.
+    kDebug() << "Clearing LT" << (!addTo);
     if (!addTo)
     {
         slotClearItemsList();



More information about the Digikam-devel mailing list