Index: trunk/extragear/graphics/digikam/digikam/digikamview.cpp =================================================================== --- trunk/extragear/graphics/digikam/digikam/digikamview.cpp (revision 632070) +++ trunk/extragear/graphics/digikam/digikam/digikamview.cpp (revision 632071) @@ -1,1035 +1,1065 @@ /* ============================================================ * Authors: Renchi Raju * Caulier Gilles * Date : 2002-16-10 * Description : implementation of album view interface. * * Copyright 2002-2005 by Renchi Raju and Gilles Caulier * Copyright 2006-2007 by Gilles Caulier * * This program is free software; you can redistribute it * and/or modify it under the terms of the GNU General * Public License as published by the Free Software Foundation; * either version 2, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * ============================================================ */ // Qt Includes. #include #include #include #include #include #include #include #include #include #include // KDE includes. #include #include #include #include #include #include #include #include #include #include // Local includes. #include "ddebug.h" #include "rawfiles.h" #include "albummanager.h" #include "album.h" #include "albumwidgetstack.h" #include "albumfolderview.h" #include "albumiconview.h" #include "albumiconitem.h" #include "albumsettings.h" #include "albumhistory.h" #include "batchsyncmetadata.h" +#include "slideshow.h" #include "sidebar.h" #include "imagepropertiessidebardb.h" #include "datefolderview.h" #include "tagfolderview.h" #include "searchfolderview.h" #include "tagfilterview.h" #include "thumbnailsize.h" #include "dio.h" #include "digikamapp.h" #include "digikamview.h" #include "digikamview.moc" namespace Digikam { class DigikamViewPriv { public: DigikamViewPriv() { splitter = 0; parent = 0; iconView = 0; folderView = 0; albumManager = 0; albumHistory = 0; leftSideBar = 0; rightSideBar = 0; dateFolderView = 0; tagFolderView = 0; searchFolderView = 0; tagFilterView = 0; albumWidgetStack = 0; selectionTimer = 0; needDispatchSelection= false; } int initialAlbumID; QSplitter *splitter; QTimer *selectionTimer; DigikamApp *parent; AlbumIconView *iconView; AlbumFolderView *folderView; AlbumManager *albumManager; AlbumHistory *albumHistory; AlbumWidgetStack *albumWidgetStack; Sidebar *leftSideBar; ImagePropertiesSideBarDB *rightSideBar; DateFolderView *dateFolderView; TagFolderView *tagFolderView; SearchFolderView *searchFolderView; TagFilterView *tagFilterView; bool needDispatchSelection; }; DigikamView::DigikamView(QWidget *parent) : QHBox(parent) { d = new DigikamViewPriv; d->parent = static_cast(parent); d->albumManager = AlbumManager::instance(); d->leftSideBar = new Sidebar(this, "Digikam Left Sidebar", Sidebar::Left); d->splitter = new QSplitter(this); d->splitter->setFrameStyle( QFrame::NoFrame ); d->splitter->setFrameShadow( QFrame::Plain ); d->splitter->setFrameShape( QFrame::NoFrame ); d->splitter->setOpaqueResize(false); d->leftSideBar->setSplitter(d->splitter); d->albumWidgetStack = new AlbumWidgetStack(d->splitter); QSizePolicy rightSzPolicy(QSizePolicy::Preferred, QSizePolicy::Expanding, 2, 1); d->albumWidgetStack->setSizePolicy(rightSzPolicy); d->iconView = d->albumWidgetStack->albumIconView(); d->rightSideBar = new ImagePropertiesSideBarDB(this, "Digikam Right Sidebar", d->splitter, Sidebar::Right, true); // To the left. d->folderView = new AlbumFolderView(this); d->dateFolderView = new DateFolderView(this); d->tagFolderView = new TagFolderView(this); d->searchFolderView = new SearchFolderView(this); d->leftSideBar->appendTab(d->folderView, SmallIcon("folder"), i18n("Albums")); d->leftSideBar->appendTab(d->dateFolderView, SmallIcon("date"), i18n("Dates")); d->leftSideBar->appendTab(d->tagFolderView, SmallIcon("tag"), i18n("Tags")); d->leftSideBar->appendTab(d->searchFolderView, SmallIcon("find"), i18n("Searches")); // To the right. d->tagFilterView = new TagFilterView(this); d->rightSideBar->appendTab(d->tagFilterView, SmallIcon("tag-assigned"), i18n("Tag Filters")); d->selectionTimer = new QTimer(this); setupConnections(); d->albumManager->setItemHandler(d->iconView); d->albumHistory = new AlbumHistory(); } DigikamView::~DigikamView() { saveViewState(); delete d->albumHistory; d->albumManager->setItemHandler(0); delete d; } void DigikamView::applySettings(const AlbumSettings* settings) { d->iconView->applySettings(settings); } void DigikamView::setupConnections() { // -- DigikamApp connections ---------------------------------- connect(d->parent, SIGNAL(signalEscapePressed()), this, SLOT(slotEscapePreview())); connect(d->parent, SIGNAL(signalEscapePressed()), d->albumWidgetStack, 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())); connect(d->parent, SIGNAL(signalCopyAlbumItemsSelection()), d->iconView, SLOT(slotCopy())); connect(d->parent, SIGNAL(signalPasteAlbumItemsSelection()), d->iconView, SLOT(slotPaste())); // -- AlbumManager connections -------------------------------- connect(d->albumManager, SIGNAL(signalAlbumCurrentChanged(Album*)), this, SLOT(slotAlbumSelected(Album*))); connect(d->albumManager, SIGNAL(signalAlbumsCleared()), this, SLOT(slotAlbumsCleared())); connect(d->albumManager, SIGNAL(signalAlbumDeleted(Album*)), this, SLOT(slotAlbumDeleted(Album*))); connect(d->albumManager, SIGNAL(signalAllAlbumsLoaded()), this, SLOT(slotAllAlbumsLoaded())); connect(d->albumManager, SIGNAL(signalAlbumItemsSelected(bool) ), this, SLOT(slotImageSelected())); connect(d->albumManager, SIGNAL(signalAlbumRenamed(Album*)), this, SLOT(slotAlbumRenamed(Album*))); // -- IconView Connections ------------------------------------- connect(d->iconView, SIGNAL(signalItemsUpdated(const KURL::List&)), d->albumWidgetStack, SLOT(slotItemsUpdated(const KURL::List&))); connect(d->iconView, SIGNAL(signalItemsAdded()), this, SLOT(slotImageSelected())); connect(d->iconView, SIGNAL(signalItemsAdded()), this, SLOT(slotAlbumHighlight())); connect(d->iconView, SIGNAL(signalPreviewItem(AlbumIconItem*)), this, SLOT(slotTogglePreviewMode(AlbumIconItem*))); //connect(d->iconView, SIGNAL(signalItemDeleted(AlbumIconItem*)), // this, SIGNAL(signalNoCurrentItem())); connect(d->folderView, SIGNAL(signalAlbumModified()), d->iconView, SLOT(slotAlbumModified())); connect(d->iconView, SIGNAL(signalProgressBarMode(int, const QString&)), d->parent, SLOT(slotProgressBarMode(int, const QString&))); connect(d->iconView, SIGNAL(signalProgressValue(int)), d->parent, SLOT(slotProgressValue(int))); // -- Sidebar Connections ------------------------------------- connect(d->leftSideBar, SIGNAL(signalChangedTab(QWidget*)), this, SLOT(slotLeftSidebarChangedTab(QWidget*))); connect(d->rightSideBar, SIGNAL(signalFirstItem()), this, SLOT(slotFirstItem())); connect(d->rightSideBar, SIGNAL(signalNextItem()), this, SLOT(slotNextItem())); connect(d->rightSideBar, SIGNAL(signalPrevItem()), this, SLOT(slotPrevItem())); connect(d->rightSideBar, SIGNAL(signalLastItem()), this, SLOT(slotLastItem())); connect(this, SIGNAL(signalNoCurrentItem()), d->rightSideBar, SLOT(slotNoCurrentItem())); connect(d->rightSideBar, SIGNAL(signalProgressBarMode(int, const QString&)), d->parent, SLOT(slotProgressBarMode(int, const QString&))); connect(d->rightSideBar, SIGNAL(signalProgressValue(int)), d->parent, SLOT(slotProgressValue(int))); connect(d->tagFilterView, SIGNAL(signalProgressBarMode(int, const QString&)), d->parent, SLOT(slotProgressBarMode(int, const QString&))); connect(d->tagFilterView, SIGNAL(signalProgressValue(int)), d->parent, SLOT(slotProgressValue(int))); connect(d->tagFolderView, SIGNAL(signalProgressBarMode(int, const QString&)), d->parent, SLOT(slotProgressBarMode(int, const QString&))); connect(d->tagFolderView, SIGNAL(signalProgressValue(int)), d->parent, SLOT(slotProgressValue(int))); // -- Preview image widget Connections ------------------------ connect(d->albumWidgetStack, SIGNAL(signalNextItem()), this, SLOT(slotNextItem())); connect(d->albumWidgetStack, SIGNAL(signalPrevItem()), this, SLOT(slotPrevItem())); connect(d->albumWidgetStack, SIGNAL(signalEditItem()), this, SLOT(slotImageEdit())); connect(d->albumWidgetStack, SIGNAL(signalDeleteItem()), this, SLOT(slotImageDelete())); connect(d->albumWidgetStack, SIGNAL(signalToggledToPreviewMode(bool)), this, SLOT(slotToggledToPreviewMode(bool))); // -- Selection timer --------------- connect(d->selectionTimer, SIGNAL(timeout()), this, SLOT(slotDispatchImageSelected())); } void DigikamView::loadViewState() { KConfig *config = kapp->config(); config->setGroup("MainWindow"); if(config->hasKey("SplitterSizes")) d->splitter->setSizes(config->readIntListEntry("SplitterSizes")); d->initialAlbumID = config->readNumEntry("InitialAlbumID", 0); } void DigikamView::saveViewState() { KConfig *config = kapp->config(); config->setGroup("MainWindow"); config->writeEntry("SplitterSizes", d->splitter->sizes()); Album *album = AlbumManager::instance()->currentAlbum(); if(album) { config->writeEntry("InitialAlbumID", album->globalID()); } else { config->writeEntry("InitialAlbumID", 0); } } void DigikamView::slotFirstItem(void) { AlbumIconItem *currItem = dynamic_cast(d->iconView->firstItem()); d->iconView->clearSelection(); d->iconView->updateContents(); if (currItem) d->iconView->setCurrentItem(currItem); } void DigikamView::slotPrevItem(void) { AlbumIconItem *currItem = dynamic_cast(d->iconView->currentItem()); if (currItem) { if (currItem->prevItem()) { d->iconView->clearSelection(); d->iconView->updateContents(); d->iconView->setCurrentItem(currItem->prevItem()); } } } void DigikamView::slotNextItem(void) { AlbumIconItem *currItem = dynamic_cast(d->iconView->currentItem()); if (currItem) { if (currItem->nextItem()) { d->iconView->clearSelection(); d->iconView->updateContents(); d->iconView->setCurrentItem(currItem->nextItem()); } } } void DigikamView::slotLastItem(void) { AlbumIconItem *currItem = dynamic_cast(d->iconView->lastItem()); d->iconView->clearSelection(); d->iconView->updateContents(); if (currItem) d->iconView->setCurrentItem(currItem); } void DigikamView::slotAllAlbumsLoaded() { disconnect(d->albumManager, SIGNAL(signalAllAlbumsLoaded()), this, SLOT(slotAllAlbumsLoaded())); loadViewState(); Album *album = d->albumManager->findAlbum(d->initialAlbumID); d->albumManager->setCurrentAlbum(album); d->leftSideBar->loadViewState(); d->rightSideBar->loadViewState(); d->rightSideBar->populateTags(); slotAlbumSelected(album); } void DigikamView::slotSortAlbums(int order) { AlbumSettings* settings = AlbumSettings::instance(); if (!settings) return; settings->setAlbumSortOrder( (AlbumSettings::AlbumSortOrder) order); d->folderView->resort(); } void DigikamView::slotNewAlbum() { d->folderView->albumNew(); } void DigikamView::slotDeleteAlbum() { d->folderView->albumDelete(); } void DigikamView::slotNewTag() { d->tagFolderView->tagNew(); } void DigikamView::slotDeleteTag() { d->tagFolderView->tagDelete(); } void DigikamView::slotEditTag() { d->tagFolderView->tagEdit(); } void DigikamView::slotNewQuickSearch() { if (d->leftSideBar->getActiveTab() != d->searchFolderView) d->leftSideBar->setActiveTab(d->searchFolderView); d->searchFolderView->quickSearchNew(); } void DigikamView::slotNewAdvancedSearch() { if (d->leftSideBar->getActiveTab() != d->searchFolderView) d->leftSideBar->setActiveTab(d->searchFolderView); d->searchFolderView->extendedSearchNew(); } // ---------------------------------------------------------------- void DigikamView::slotAlbumDeleted(Album *delalbum) { d->albumHistory->deleteAlbum(delalbum); // display changed tags if (delalbum->type() == Album::TAG) d->iconView->updateContents(); /* // For what is this needed? Album *album; QWidget *widget; d->albumHistory->getCurrentAlbum(&album, &widget); changeAlbumFromHistory(album, widget); */ } void DigikamView::slotAlbumRenamed(Album *album) { // display changed names if (album == d->albumManager->currentAlbum()) d->iconView->updateContents(); } void DigikamView::slotAlbumHistoryBack(int steps) { Album *album; QWidget *widget; d->albumHistory->back(&album, &widget, steps); changeAlbumFromHistory(album, widget); } void DigikamView::slotAlbumHistoryForward(int steps) { Album *album; QWidget *widget; d->albumHistory->forward(&album, &widget, steps); changeAlbumFromHistory(album, widget); } void DigikamView::changeAlbumFromHistory(Album *album, QWidget *widget) { if (album && widget) { QListViewItem *item; item = (QListViewItem*)album->extraData(widget); if(!item) return; // AlbumFolderview, TagFolderView, SearchFolderView inherit from FolderView if (FolderView *v = dynamic_cast(widget)) { v->setSelected(item, true); v->ensureItemVisible(item); } else if (DateFolderView *v = dynamic_cast(widget)) { v->setSelected(item); } d->leftSideBar->setActiveTab(widget); d->parent->enableAlbumBackwardHistory(!d->albumHistory->isBackwardEmpty()); d->parent->enableAlbumForwardHistory(!d->albumHistory->isForwardEmpty()); } } void DigikamView::clearHistory() { d->albumHistory->clearHistory(); d->parent->enableAlbumBackwardHistory(false); d->parent->enableAlbumForwardHistory(false); } void DigikamView::getBackwardHistory(QStringList &titles) { d->albumHistory->getBackwardHistory(titles); } void DigikamView::getForwardHistory(QStringList &titles) { d->albumHistory->getForwardHistory(titles); } void DigikamView::slotSelectAlbum(const KURL &) { /* TODO if (url.isEmpty()) return; Album *album = d->albumManager->findPAlbum(url); if(album && album->getViewItem()) { AlbumFolderItem_Deprecated *item; item = static_cast(album->getViewItem()); mFolderView_Deprecated->setSelected(item); d->parent->enableAlbumBackwardHistory(!d->albumHistory->isBackwardEmpty()); d->parent->enableAlbumForwardHistory(!d->albumHistory->isForwardEmpty()); } */ } // ---------------------------------------------------------------- void DigikamView::slotAlbumSelected(Album* album) { //emit signalNoCurrentItem(); if (!album) { d->iconView->setAlbum(0); emit signalAlbumSelected(false); emit signalTagSelected(false); return; } if (album->type() == Album::PHYSICAL) { emit signalAlbumSelected(true); emit signalTagSelected(false); } else if (album->type() == Album::TAG) { emit signalAlbumSelected(false); emit signalTagSelected(true); } d->albumHistory->addAlbum(album, d->leftSideBar->getActiveTab()); d->parent->enableAlbumBackwardHistory(!d->albumHistory->isBackwardEmpty()); d->parent->enableAlbumForwardHistory(!d->albumHistory->isForwardEmpty()); d->iconView->setAlbum(album); if (album->isRoot()) d->albumWidgetStack->setPreviewMode(AlbumWidgetStack::WelcomePageMode); else d->albumWidgetStack->setPreviewMode(AlbumWidgetStack::PreviewAlbumMode); } void DigikamView::slotAlbumOpenInKonqui() { Album *album = d->albumManager->currentAlbum(); if (!album || album->type() != Album::PHYSICAL) return; PAlbum* palbum = dynamic_cast(album); new KRun(palbum->folderPath()); // KRun will delete itself. } void DigikamView::slotAlbumRefresh() { d->iconView->refreshItems(d->iconView->allItems()); } void DigikamView::slotImageSelected() { // delay to slotDispatchImageSelected d->needDispatchSelection = true; d->selectionTimer->start(75, true); } void DigikamView::slotDispatchImageSelected() { if (d->needDispatchSelection) { // the list of copies of ImageInfos of currently selected items, currentItem first QPtrList list = d->iconView->selectedImageInfos(true); if (list.isEmpty()) { d->albumWidgetStack->setPreviewItem(); emit signalImageSelected(list, false, false); emit signalNoCurrentItem(); } else { d->rightSideBar->itemChanged(list); AlbumIconItem *selectedItem = d->iconView->firstSelectedItem(); bool hasPrev = d->iconView->firstItem() != selectedItem; bool hasNext = d->iconView->lastItem() != selectedItem; // we fed a list of copies d->rightSideBar->takeImageInfoOwnership(true); if (!d->albumWidgetStack->previewMode() == AlbumWidgetStack::PreviewAlbumMode) d->albumWidgetStack->setPreviewItem(selectedItem->imageInfo(), hasPrev, hasNext); emit signalImageSelected(list, hasPrev, hasNext); } d->needDispatchSelection = false; } } void DigikamView::slotAlbumsCleared() { d->iconView->clear(); emit signalAlbumSelected(false); } // ---------------------------------------------------------------- void DigikamView::slotThumbSizePlus() { emit signalNoCurrentItem(); ThumbnailSize thumbSize; switch(d->iconView->thumbnailSize().size()) { case (ThumbnailSize::Small): { thumbSize = ThumbnailSize(ThumbnailSize::Medium); break; } case (ThumbnailSize::Medium): { thumbSize = ThumbnailSize(ThumbnailSize::Large); break; } case (ThumbnailSize::Large): { thumbSize = ThumbnailSize(ThumbnailSize::Huge); break; } case (ThumbnailSize::Huge): { thumbSize = ThumbnailSize(ThumbnailSize::Huge); break; } default: return; } if (thumbSize.size() == ThumbnailSize::Huge) { d->parent->enableThumbSizePlusAction(false); } d->parent->enableThumbSizeMinusAction(true); d->iconView->setThumbnailSize(thumbSize); AlbumSettings* settings = AlbumSettings::instance(); if (!settings) return; settings->setDefaultIconSize( (int)thumbSize.size() ); } void DigikamView::slotThumbSizeMinus() { emit signalNoCurrentItem(); ThumbnailSize thumbSize; switch(d->iconView->thumbnailSize().size()) { case (ThumbnailSize::Small): { thumbSize = ThumbnailSize(ThumbnailSize::Small); break; } case (ThumbnailSize::Medium): { thumbSize = ThumbnailSize(ThumbnailSize::Small); break; } case (ThumbnailSize::Large): { thumbSize = ThumbnailSize(ThumbnailSize::Medium); break; } case (ThumbnailSize::Huge): { thumbSize = ThumbnailSize(ThumbnailSize::Large); break; } default: return; } if (thumbSize.size() == ThumbnailSize::Small) { d->parent->enableThumbSizeMinusAction(false); } d->parent->enableThumbSizePlusAction(true); d->iconView->setThumbnailSize(thumbSize); AlbumSettings* settings = AlbumSettings::instance(); if (!settings) return; settings->setDefaultIconSize( (int)thumbSize.size() ); } void DigikamView::slotAlbumPropsEdit() { d->folderView->albumEdit(); } void DigikamView::slotAlbumSyncPicturesMetadata() { Album *album = d->albumManager->currentAlbum(); if (!album || album->type() != Album::PHYSICAL) return; BatchSyncMetadata *syncMetadata = new BatchSyncMetadata(this, album); connect(syncMetadata, SIGNAL(signalProgressBarMode(int, const QString&)), d->parent, SLOT(slotProgressBarMode(int, const QString&))); connect(syncMetadata, SIGNAL(signalProgressValue(int)), d->parent, SLOT(slotProgressValue(int))); connect(syncMetadata, SIGNAL(signalComplete()), this, SLOT(slotAlbumSyncPicturesMetadataDone())); connect(d->parent, SIGNAL(signalCancelButtonPressed()), syncMetadata, SLOT(slotAbort())); syncMetadata->parseAlbum(); } void DigikamView::slotAlbumSyncPicturesMetadataDone() { applySettings(AlbumSettings::instance()); } void DigikamView::slotAlbumAddImages() { Album *album = d->albumManager->currentAlbum(); if (!album || album->type() != Album::PHYSICAL) return; PAlbum* palbum = dynamic_cast(album); QString fileformats; QStringList patternList = QStringList::split('\n', KImageIO::pattern(KImageIO::Reading)); // All Pictures from list must been always the first entry given by KDE API QString allPictures = patternList[0]; // Add RAW file format to All Pictures" type mime and remplace current. allPictures.insert(allPictures.find("|"), QString(raw_file_extentions)); patternList.remove(patternList[0]); patternList.prepend(allPictures); // Added RAW file formats supported by dcraw program like a type mime. // Nota: we cannot use here "image/x-raw" type mime from KDE because it uncomplete // or unvailable(dcraw_0)(see file #121242 in B.K.O). patternList.append(QString("\n%1|Camera RAW files").arg(QString(raw_file_extentions))); fileformats = patternList.join("\n"); DDebug () << "fileformats=" << fileformats << endl; KURL::List urls = KFileDialog::getOpenURLs(AlbumManager::instance()->getLibraryPath(), fileformats, this, i18n("Select Image to Add")); if (!urls.isEmpty()) { KIO::Job* job = DIO::copy(urls, palbum->kurl()); connect(job, SIGNAL(result(KIO::Job *) ), this, SLOT(slotImageCopyResult(KIO::Job *))); } } void DigikamView::slotImageCopyResult(KIO::Job* job) { if (job->error()) job->showErrorDialog(this); } void DigikamView::slotAlbumImportFolder() { d->folderView->albumImportFolder(); } void DigikamView::slotAlbumHighlight() { // TODO: // Don't know what this is supposed to do. // Perhaps some flashing or other eye kandy /* Album *album = d->albumManager->currentAlbum(); if (!album || !album->type() == Album::PHYSICAL) return; d->folderView->setAlbumThumbnail(dynamic_cast(album)); */ } // ---------------------------------------------------------------- void DigikamView::slotEscapePreview() { if (d->albumWidgetStack->previewMode() == AlbumWidgetStack::PreviewAlbumMode || d->albumWidgetStack->previewMode() == AlbumWidgetStack::WelcomePageMode) return; AlbumIconItem *currItem = dynamic_cast(d->iconView->currentItem()); slotTogglePreviewMode(currItem); } void DigikamView::slotImagePreview() { AlbumIconItem *currItem = dynamic_cast(d->iconView->currentItem()); if (currItem) slotTogglePreviewMode(currItem); } // This method toogle between AlbumView and ImagePreview Modes, depending of context. void DigikamView::slotTogglePreviewMode(AlbumIconItem *iconItem) { if (d->albumWidgetStack->previewMode() == AlbumWidgetStack::PreviewAlbumMode && iconItem) { // We will go to ImagePreview Mode. bool hasPrev = d->iconView->firstItem() != iconItem; bool hasNext = d->iconView->lastItem() != iconItem; d->albumWidgetStack->setPreviewItem(iconItem->imageInfo(), hasPrev, hasNext); } else { // We go back to AlbumView Mode. d->albumWidgetStack->setPreviewMode( AlbumWidgetStack::PreviewAlbumMode ); } } void DigikamView::slotToggledToPreviewMode(bool t) { d->parent->toggledToPreviewMode(t); } +void DigikamView::slotSlideShow() +{ + KConfig* config = kapp->config(); + config->setGroup("ImageViewer Settings"); + bool startWithCurrent = config->readBoolEntry("SlideShowStartCurrent", false); + bool loop = config->readBoolEntry("SlideShowLoop", false); + bool printName = config->readBoolEntry("SlideShowPrintName", true); + int delay = config->readNumEntry("SlideShowDelay", 5); + + bool exifRotate = AlbumSettings::instance()->getExifRotate(); + KURL::List urlList; + + AlbumIconItem* item = 0; + if (startWithCurrent) + item = dynamic_cast(d->iconView->currentItem()); + else + item = dynamic_cast(d->iconView->firstItem()); + + while (item) + { + urlList.append(item->imageInfo()->kurl()); + + item = dynamic_cast(item->nextItem()); + } + + SlideShow *slide = new SlideShow(urlList, exifRotate, delay*1000, printName, loop); + slide->show(); +} + void DigikamView::slotImageEdit() { AlbumIconItem *currItem = dynamic_cast(d->iconView->currentItem()); if (currItem) imageEdit(currItem); } void DigikamView::imageEdit(AlbumIconItem *iconItem) { AlbumIconItem *item; if (!iconItem) { item = d->iconView->firstSelectedItem(); if (!item) return; } else { item = iconItem; } d->iconView->slotDisplayItem(item); } void DigikamView::slotImageExifOrientation(int orientation) { d->iconView->slotSetExifOrientation(orientation); } void DigikamView::slotImageRename(AlbumIconItem *iconItem) { AlbumIconItem *item; if (!iconItem) { item = d->iconView->firstSelectedItem(); if (!item) return; } else { item = iconItem; } d->iconView->slotRename(item); } void DigikamView::slotImageDelete() { d->iconView->slotDeleteSelectedItems(false); } void DigikamView::slotImageDeletePermanently() { d->iconView->slotDeleteSelectedItems(true); } void DigikamView::slotImageDeletePermanentlyDirectly() { d->iconView->slotDeleteSelectedItemsDirectly(false); } void DigikamView::slotImageTrashDirectly() { d->iconView->slotDeleteSelectedItemsDirectly(true); } void DigikamView::slotSelectAll() { d->iconView->selectAll(); } void DigikamView::slotSelectNone() { d->iconView->clearSelection(); } void DigikamView::slotSelectInvert() { d->iconView->invertSelection(); } void DigikamView::slotSortImages(int order) { AlbumSettings* settings = AlbumSettings::instance(); if (!settings) return; settings->setImageSortOrder((AlbumSettings::ImageSortOrder) order); d->iconView->slotUpdate(); } void DigikamView::slotLeftSidebarChangedTab(QWidget* w) { // setActive means that selection changes are propagated, nothing more. // Additionally, when it is set to true, the selectionChanged signal will be emitted. // So this is the place which causes the behavior that when the left sidebar // tab is changed, the current album is changed as well. d->dateFolderView->setActive(w == d->dateFolderView); d->folderView->setActive(w == d->folderView); d->tagFolderView->setActive(w == d->tagFolderView); d->searchFolderView->setActive(w == d->searchFolderView); } void DigikamView::slotAssignRating(int rating) { d->iconView->slotAssignRating(rating); } void DigikamView::slotAssignRatingNoStar() { d->iconView->slotAssignRating(0); } void DigikamView::slotAssignRatingOneStar() { d->iconView->slotAssignRating(1); } void DigikamView::slotAssignRatingTwoStar() { d->iconView->slotAssignRating(2); } void DigikamView::slotAssignRatingThreeStar() { d->iconView->slotAssignRating(3); } void DigikamView::slotAssignRatingFourStar() { d->iconView->slotAssignRating(4); } void DigikamView::slotAssignRatingFiveStar() { d->iconView->slotAssignRating(5); } } // namespace Digikam Index: trunk/extragear/graphics/digikam/digikam/digikamui.rc =================================================================== --- trunk/extragear/graphics/digikam/digikam/digikamui.rc (revision 632070) +++ trunk/extragear/graphics/digikam/digikam/digikamui.rc (revision 632071) @@ -1,131 +1,134 @@ - + &Album &Import &Export T&ag &Image Se&lect &View + &Tools &Batch Processes &Settings &Help Main Toolbar + + Index: trunk/extragear/graphics/digikam/digikam/Makefile.am =================================================================== --- trunk/extragear/graphics/digikam/digikam/Makefile.am (revision 632070) +++ trunk/extragear/graphics/digikam/digikam/Makefile.am (revision 632071) @@ -1,138 +1,139 @@ METASOURCES = AUTO INCLUDES = -I$(top_srcdir)/digikam/sqlite \ -I$(top_srcdir)/digikam/libs/histogram \ -I$(top_srcdir)/digikam/libs/levels \ -I$(top_srcdir)/digikam/libs/curves \ -I$(top_srcdir)/digikam/libs/themeengine \ -I$(top_srcdir)/digikam/libs/widgets/common \ -I$(top_srcdir)/digikam/libs/thumbbar \ -I$(top_srcdir)/digikam/libs/jpegutils \ -I$(top_srcdir)/digikam/libs/dcraw \ -I$(top_srcdir)/digikam/libs/dimg \ -I$(top_srcdir)/digikam/libs/dmetadata \ -I$(top_srcdir)/digikam/libs/imageproperties \ -I$(top_srcdir)/digikam/libs/threadimageio \ -I$(top_builddir)/digikam/libs/dialogs \ -I$(top_srcdir)/digikam/libs/dialogs \ -I$(top_srcdir)/digikam/utilities/cameragui \ -I$(top_srcdir)/digikam/utilities/imageeditor/editor \ -I$(top_srcdir)/digikam/utilities/imageeditor/canvas \ -I$(top_srcdir)/digikam/utilities/splashscreen \ -I$(top_srcdir)/digikam/utilities/setup \ + -I$(top_srcdir)/digikam/utilities/slideshow \ -I$(top_srcdir)/digikam/utilities/batch \ $(LIBKIPI_CFLAGS) $(GPHOTO_CFLAGS) $(all_includes) # -- shared digiKam library rules ----------------------------------------------- lib_LTLIBRARIES = libdigikam.la # NOTE from Gilles (30-11-06): kdateedit.cpp and metadatahub.cpp must be placed on the top # of source file list to unbreak compilation with './configure -enable-final' option. # I suspect a problem with X11 header included into albumfolderview.cpp witch redefine 'enum' type. libdigikam_la_SOURCES = kdateedit.cpp \ metadatahub.cpp \ album.cpp \ albumdb.cpp \ albumdb_sqlite2.cpp \ albumiconview.cpp \ albumicongroupitem.cpp \ albumiconitem.cpp \ albumitemhandler.cpp \ albumfiletip.cpp \ albumfolderview.cpp \ albumhistory.cpp \ albumlister.cpp \ albummanager.cpp \ albumpropsedit.cpp \ albumsettings.cpp \ albumthumbnailloader.cpp \ albumwidgetstack.cpp \ cameradragobject.cpp \ cameralist.cpp \ cameratype.cpp \ datefolderview.cpp \ dcopiface.cpp \ dcopiface.skel \ digikamapp.cpp \ digikamfirstrun.cpp \ digikamview.cpp \ dio.cpp \ dragobjects.cpp \ firstrun.cpp \ folderitem.cpp \ folderview.cpp \ iconview.cpp \ icongroupitem.cpp \ iconitem.cpp \ imageattributeswatch.cpp \ imageinfo.cpp \ imagepreviewwidget.cpp \ imagepreviewview.cpp \ kdatetimeedit.cpp \ kdatepickerpopup.cpp \ kipiinterface.cpp \ mediaplayerview.cpp \ monthwidget.cpp \ pixmapmanager.cpp \ ratingpopupmenu.cpp \ ratingwidget.cpp \ scanlib.cpp \ searchadvanceddialog.cpp \ searchfolderview.cpp \ searchquickdialog.cpp \ searchresultsview.cpp \ searchresultsitem.cpp \ searchwidgets.cpp \ syncjob.cpp \ tagcreatedlg.cpp \ tagfilterview.cpp \ tagfolderview.cpp \ tagspopupmenu.cpp \ upgradedb_sqlite2tosqlite3.cpp \ welcomepageview.cpp libdigikam_la_LIBADD = $(LIB_KIO) $(LIB_SQLITE3) $(LIB_KABC) $(LIB_KHTML) \ $(LIBKIPI_LIBS) $(LIB_KUTILS) $(EXIV2_LIBS) \ $(top_builddir)/digikam/sqlite/libsqlite.la \ $(top_builddir)/digikam/libs/thumbbar/libthumbbar.la \ $(top_builddir)/digikam/libs/themeengine/libthemeengine.la \ $(top_builddir)/digikam/libs/widgets/libwidgets.la \ $(top_builddir)/digikam/libs/dialogs/libdialog.la \ $(top_builddir)/digikam/libs/jpegutils/libjpegutils.la \ $(top_builddir)/digikam/libs/imageproperties/libimagepropertiesdigikam.la \ $(top_builddir)/digikam/libs/threadimageio/libthreadimageio.la \ $(top_builddir)/digikam/utilities/batch/libbatch.la \ $(top_builddir)/digikam/utilities/slideshow/libslideshow.la \ $(top_builddir)/digikam/utilities/cameragui/libcameragui.la \ $(top_builddir)/digikam/utilities/imageeditor/canvas/libdimgcanvas.la \ $(top_builddir)/digikam/utilities/imageeditor/editor/libdimgeditor.la \ $(top_builddir)/digikam/utilities/splashscreen/libsplashscreen.la \ $(top_builddir)/digikam/utilities/setup/libsetup.la libdigikam_la_LDFLAGS = $(all_libraries) $(KDE_RPATH) -no-undefined # -- main digiKam binary target file rules ---------------------------------------------- bin_PROGRAMS = digikam digikam_SOURCES = main.cpp digikam_LDADD = $(LIB_QT) $(LIB_KDECORE) $(LIB_KDEUI) \ $(LIBSOCKET) $(LIB_KFILE) $(LIB_KPARTS) $(LIB_KUTILS) \ libdigikam.la digikam_LDFLAGS = $(KDE_RPATH) $(all_libraries) $(LIB_KUTILS) rcdir = $(kde_datadir)/digikam rc_DATA = digikamui.rc dummy_digikam.cpp: echo > dummy_digikam.cpp xdg_apps_DATA = digikam.desktop include_HEADERS = digikam_export.h include ../../admin/Doxyfile.am noinst_HEADERS = dcopiface.h Index: trunk/extragear/graphics/digikam/digikam/digikamview.h =================================================================== --- trunk/extragear/graphics/digikam/digikam/digikamview.h (revision 632070) +++ trunk/extragear/graphics/digikam/digikam/digikamview.h (revision 632071) @@ -1,163 +1,164 @@ /* ============================================================ * Authors: Renchi Raju * Caulier Gilles * Date : 2002-16-10 * Description : implementation of album view interface. * * Copyright 2002-2005 by Renchi Raju and Gilles Caulier * Copyright 2006-2007 by Gilles Caulier * * 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 DIGIKAMVIEW_H #define DIGIKAMVIEW_H // Qt includes. #include #include #include class KURL; namespace KIO { class Job; } namespace Digikam { class AlbumIconItem; class AlbumSettings; class Album; class DigikamViewPriv; class ImageInfo; class DigikamView : public QHBox { Q_OBJECT public: DigikamView(QWidget *parent); ~DigikamView(); void applySettings(const AlbumSettings* settings); void clearHistory(); void getForwardHistory(QStringList &titles); void getBackwardHistory(QStringList &titles); signals: void signalAlbumSelected(bool val); void signalTagSelected(bool val); void signalImageSelected(const QPtrList& list, bool, bool); void signalNoCurrentItem(); void signalProgressBarMode(int, const QString&); void signalProgressValue(int); public slots: // View Action slots void slotThumbSizePlus(); void slotThumbSizeMinus(); // Album action slots void slotNewAlbum(); void slotSortAlbums(int order); void slotDeleteAlbum(); void slotSelectAlbum(const KURL &url); void slotAlbumPropsEdit(); void slotAlbumAddImages(); void slotAlbumOpenInKonqui(); void slotAlbumRefresh(); void slotAlbumImportFolder(); void slotAlbumHistoryBack(int steps=1); void slotAlbumHistoryForward(int steps=1); void slotAlbumDeleted(Album *album); void slotAlbumRenamed(Album *album); void slotAlbumSyncPicturesMetadata(); void slotAlbumSyncPicturesMetadataDone(); void slotAlbumSelected(Album* album); // Tag action slots void slotNewTag(); void slotDeleteTag(); void slotEditTag(); // Search action slots void slotNewQuickSearch(); void slotNewAdvancedSearch(); // Image action slots + void slotSlideShow(); void slotImagePreview(); void slotImageEdit(); void slotImageExifOrientation(int orientation); void slotImageRename(AlbumIconItem* iconItem=0); void slotImageDelete(); void slotImageDeletePermanently(); void slotImageDeletePermanentlyDirectly(); void slotImageTrashDirectly(); void slotSelectAll(); void slotSelectNone(); void slotSelectInvert(); void slotSortImages(int order); // Image Rating slots void slotAssignRating(int rating); void slotAssignRatingNoStar(); void slotAssignRatingOneStar(); void slotAssignRatingTwoStar(); void slotAssignRatingThreeStar(); void slotAssignRatingFourStar(); void slotAssignRatingFiveStar(); private: void setupConnections(); void loadViewState(); void saveViewState(); void changeAlbumFromHistory(Album *album, QWidget *widget); void imageEdit(AlbumIconItem* iconItem=0); private slots: void slotAllAlbumsLoaded(); void slotAlbumsCleared(); void slotAlbumHighlight(); void slotImageSelected(); void slotTogglePreviewMode(AlbumIconItem *iconItem=0); void slotToggledToPreviewMode(bool); void slotDispatchImageSelected(); void slotImageCopyResult(KIO::Job* job); void slotLeftSidebarChangedTab(QWidget* w); void slotFirstItem(void); void slotPrevItem(void); void slotNextItem(void); void slotLastItem(void); void slotEscapePreview(); private: DigikamViewPriv* d; }; } // namespace Digikam #endif // DIGIKAMVIEW_H Index: trunk/extragear/graphics/digikam/digikam/digikamappprivate.h =================================================================== --- trunk/extragear/graphics/digikam/digikam/digikamappprivate.h (revision 632070) +++ trunk/extragear/graphics/digikam/digikam/digikamappprivate.h (revision 632071) @@ -1,226 +1,228 @@ /* ============================================================ * Authors: Caulier Gilles * Date : 2007-31-01 * Description : main digiKam interface implementation * * Copyright 2007 by Gilles Caulier * * This program is free software; you can redistribute it * and/or modify it under the terms of the GNU General * Public License as published by the Free Software Foundation; * either version 2, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * ============================================================ */ // Qt includes. #include #include #include // KDE includes. #include #include #include #include #include // libKipi includes. #include // Local includes. #include "albummanager.h" #include "albumsettings.h" #include "cameralist.h" #include "imagepluginloader.h" #include "splashscreen.h" #include "kipiinterface.h" #include "statusprogressbar.h" #include "statusnavigatebar.h" #include "digikamview.h" namespace Digikam { class DigikamAppPriv { public: DigikamAppPriv() { fullScreen = false; validIccPath = true; cameraMediaList = 0; accelerators = 0; config = 0; newAction = 0; deleteAction = 0; imageDeletePermanentlyAction = 0; imageDeletePermanentlyDirectlyAction = 0; imageTrashDirectlyAction = 0; albumSortAction = 0; backwardActionMenu = 0; forwardActionMenu = 0; addImagesAction = 0; propsEditAction = 0; albumImportAction = 0; openInKonquiAction = 0; refreshAlbumAction = 0; syncAlbumMetadataAction = 0; newTagAction = 0; deleteTagAction = 0; editTagAction = 0; imagePreviewAction = 0; imageViewAction = 0; imageSetExifOrientation1Action = 0; imageSetExifOrientation2Action = 0; imageSetExifOrientation3Action = 0; imageSetExifOrientation4Action = 0; imageSetExifOrientation5Action = 0; imageSetExifOrientation6Action = 0; imageSetExifOrientation7Action = 0; imageSetExifOrientation8Action = 0; imageRenameAction = 0; imageDeleteAction = 0; imageSortAction = 0; imageExifOrientationActionMenu = 0; selectAllAction = 0; selectNoneAction = 0; selectInvertAction = 0; thumbSizePlusAction = 0; thumbSizeMinusAction = 0; fullScreenAction = 0; + slideShowAction = 0; rating0Star = 0; rating1Star = 0; rating2Star = 0; rating3Star = 0; rating4Star = 0; rating5Star = 0; quitAction = 0; tipAction = 0; kipiHelpAction = 0; donateMoneyAction = 0; cameraMenuAction = 0; themeMenuAction = 0; albumSettings = 0; albumManager = 0; dcopIface = 0; imagePluginsLoader = 0; kipiInterface = 0; cameraList = 0; statusProgressBar = 0; statusNavigateBar = 0; kipiPluginLoader = 0; view = 0; splashScreen = 0; } bool fullScreen; bool validIccPath; // KIPI plugins support QPtrList kipiFileActionsExport; QPtrList kipiFileActionsImport; QPtrList kipiImageActions; QPtrList kipiToolsActions; QPtrList kipiBatchActions; QPtrList kipiAlbumActions; QMap mediaItems; QString cameraGuiPath; KPopupMenu *cameraMediaList; KAccel *accelerators; KConfig *config; // Album Actions KAction *newAction; KAction *deleteAction; KAction *imageDeletePermanentlyAction; KAction *imageDeletePermanentlyDirectlyAction; KAction *imageTrashDirectlyAction; KToolBarPopupAction *backwardActionMenu; KToolBarPopupAction *forwardActionMenu; KAction *addImagesAction; KAction *propsEditAction; KAction *albumImportAction; KAction *openInKonquiAction; KAction *refreshAlbumAction; KAction *syncAlbumMetadataAction; // Tag Actions KAction *newTagAction; KAction *deleteTagAction; KAction *editTagAction; // Image Actions KToggleAction *imagePreviewAction; KAction *imageViewAction; KAction *imageSetExifOrientation1Action; KAction *imageSetExifOrientation2Action; KAction *imageSetExifOrientation3Action; KAction *imageSetExifOrientation4Action; KAction *imageSetExifOrientation5Action; KAction *imageSetExifOrientation6Action; KAction *imageSetExifOrientation7Action; KAction *imageSetExifOrientation8Action; KAction *imageRenameAction; KAction *imageDeleteAction; KActionMenu *imageExifOrientationActionMenu; // Selection Actions KAction *selectAllAction; KAction *selectNoneAction; KAction *selectInvertAction; // View Actions KAction *fullScreenAction; + KAction *slideShowAction; KAction *thumbSizePlusAction; KAction *thumbSizeMinusAction; KSelectAction *imageSortAction; KSelectAction *albumSortAction; KAction *rating0Star; KAction *rating1Star; KAction *rating2Star; KAction *rating3Star; KAction *rating4Star; KAction *rating5Star; // Application Actions KAction *quitAction; KAction *tipAction; KAction *kipiHelpAction; KAction *donateMoneyAction; KActionMenu *cameraMenuAction; KSelectAction *themeMenuAction; AlbumSettings *albumSettings; AlbumManager *albumManager; SplashScreen *splashScreen; DCOPIface *dcopIface; ImagePluginLoader *imagePluginsLoader; DigikamKipiInterface *kipiInterface; DigikamView *view; CameraList *cameraList; StatusProgressBar *statusProgressBar; StatusNavigateBar *statusNavigateBar; KIPI::PluginLoader *kipiPluginLoader; }; } // namespace Digikam Index: trunk/extragear/graphics/digikam/digikam/digikamapp.cpp =================================================================== --- trunk/extragear/graphics/digikam/digikam/digikamapp.cpp (revision 632070) +++ trunk/extragear/graphics/digikam/digikam/digikamapp.cpp (revision 632071) @@ -1,1760 +1,1764 @@ /* ============================================================ * Authors: Renchi Raju * Tom Albers * Caulier Gilles * Date : 2002-16-10 * Description : main digiKam interface implementation * * Copyright 2002-2005 by Renchi Raju and Gilles Caulier * Copyright 2006 by Tom Albers * Copyright 2006-2007 by Gilles Caulier * * This program is free software; you can redistribute it * and/or modify it under the terms of the GNU General * Public License as published by the Free Software Foundation; * either version 2, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * ============================================================ */ // Qt includes. #include #include #include #include #include // KDE includes. #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // libKipi includes. #include // Local includes. #include "ddebug.h" #include "album.h" #include "albumlister.h" #include "albumthumbnailloader.h" #include "cameratype.h" #include "cameraui.h" #include "setup.h" #include "setupplugins.h" #include "setupeditor.h" #include "setupicc.h" #include "setupimgplugins.h" #include "imagewindow.h" #include "imageinfo.h" #include "thumbnailsize.h" #include "themeengine.h" #include "scanlib.h" #include "loadingcacheinterface.h" #include "imageattributeswatch.h" #include "dcrawbinary.h" #include "batchthumbsgenerator.h" #include "batchalbumssyncmetadata.h" #include "dcopiface.h" #include "digikamappprivate.h" #include "digikamapp.h" #include "digikamapp.moc" using KIO::Job; using KIO::UDSEntryList; using KIO::UDSEntry; namespace Digikam { DigikamApp* DigikamApp::m_instance = 0; DigikamApp::DigikamApp() : KMainWindow( 0, "Digikam" ) { d = new DigikamAppPriv; m_instance = this; d->config = kapp->config(); if(d->config->readBoolEntry("Show Splash", true) && !kapp->isRestored()) { d->splashScreen = new SplashScreen("digikam-splash.png"); } d->albumSettings = new AlbumSettings(); d->albumSettings->readSettings(); d->albumManager = AlbumManager::instance(); AlbumLister::instance(); d->cameraMediaList = new KPopupMenu; connect(d->cameraMediaList, SIGNAL( aboutToShow() ), this, SLOT(slotCameraMediaMenu())); d->cameraList = new CameraList(this, locateLocal("appdata", "cameras.xml")); connect(d->cameraList, SIGNAL(signalCameraAdded(CameraType *)), this, SLOT(slotCameraAdded(CameraType *))); connect(d->cameraList, SIGNAL(signalCameraRemoved(CameraType *)), this, SLOT(slotCameraRemoved(CameraType *))); setupView(); setupStatusBar(); setupAccelerators(); setupActions(); applyMainWindowSettings(d->config); // Check ICC profiles repository availability if(d->splashScreen) d->splashScreen->message(i18n("Checking ICC repository"), AlignLeft, white); d->validIccPath = SetupICC::iccRepositoryIsValid(); // Check witch dcraw version available if(d->splashScreen) d->splashScreen->message(i18n("Checking dcraw version"), AlignLeft, white); DcrawBinary::instance()->checkSystem(); // Actual file scanning is done in main() - is this necessary here? d->albumManager->setLibraryPath(d->albumSettings->getAlbumLibraryPath()); // Read albums from database if(d->splashScreen) d->splashScreen->message(i18n("Reading database"), AlignLeft, white); d->albumManager->startScan(); // Load KIPI Plugins. loadPlugins(); // Load Themes populateThemes(); setAutoSaveSettings(); d->dcopIface = new DCOPIface(this, "camera"); connect(d->dcopIface, SIGNAL(signalCameraAutoDetect()), this, SLOT(slotDcopCameraAutoDetect())); connect(d->dcopIface, SIGNAL(signalDownloadImages( const QString & )), this, SLOT(slotDcopDownloadImages(const QString &))); } DigikamApp::~DigikamApp() { ImageAttributesWatch::shutDown(); if (ImageWindow::imagewindowCreated()) // close and delete ImageWindow::imagewindow()->close(true); if (d->view) delete d->view; d->albumSettings->saveSettings(); delete d->albumSettings; delete d->albumManager; delete AlbumLister::instance(); ImageAttributesWatch::cleanUp(); LoadingCacheInterface::cleanUp(); DcrawBinary::cleanUp(); AlbumThumbnailLoader::cleanUp(); m_instance = 0; delete d; } DigikamApp* DigikamApp::getinstance() { return m_instance; } void DigikamApp::show() { // Remove Splashscreen. if(d->splashScreen) { d->splashScreen->finish(this); delete d->splashScreen; d->splashScreen = 0; } // Display application window. KMainWindow::show(); // Report errors from ICC repository path. if(!d->validIccPath) { QString message = i18n("

ICC profiles path seems to be invalid.

" "

If you want to set it now, select \"Yes\", otherwise " "select \"No\". In this case, \"Color Management\" feature " "will be disabled until you solve this issue

"); if (KMessageBox::warningYesNo(this, message) == KMessageBox::Yes) { if (!setup(true)) { d->config->setGroup("Color Management"); d->config->writeEntry("EnableCM", false); d->config->sync(); } } else { d->config->setGroup("Color Management"); d->config->writeEntry("EnableCM", false); d->config->sync(); } } // Report errors from dcraw detection. DcrawBinary::instance()->checkReport(); } const QPtrList& DigikamApp::menuImageActions() { return d->kipiImageActions; } const QPtrList& DigikamApp::menuBatchActions() { return d->kipiBatchActions; } const QPtrList& DigikamApp::menuAlbumActions() { return d->kipiAlbumActions; } const QPtrList DigikamApp::menuImportActions() { QPtrList importMenu; importMenu = d->kipiFileActionsImport; importMenu.append( d->albumImportAction ); importMenu.append( d->addImagesAction ); return importMenu; } const QPtrList DigikamApp::menuExportActions() { return d->kipiFileActionsExport; } void DigikamApp::autoDetect() { // Called from main if command line option is set if(d->splashScreen) d->splashScreen->message(i18n("Auto-detect camera"), AlignLeft, white); QTimer::singleShot(0, this, SLOT(slotCameraAutoDetect())); } void DigikamApp::downloadFrom(const QString &cameraGuiPath) { // Called from main if command line option is set if (!cameraGuiPath.isNull()) { d->cameraGuiPath = cameraGuiPath; if(d->splashScreen) d->splashScreen->message(i18n("Opening Download Dialog"), AlignLeft, white); QTimer::singleShot(0, this, SLOT(slotDownloadImages())); } } bool DigikamApp::queryClose() { if (ImageWindow::imagewindowCreated()) { return ImageWindow::imagewindow()->queryClose(); } else return true; } void DigikamApp::setupView() { if(d->splashScreen) d->splashScreen->message(i18n("Initializing Main View"), AlignLeft, white); d->view = new DigikamView(this); setCentralWidget(d->view); d->view->applySettings(d->albumSettings); connect(d->view, SIGNAL(signalAlbumSelected(bool)), this, SLOT(slotAlbumSelected(bool))); connect(d->view, SIGNAL(signalTagSelected(bool)), this, SLOT(slotTagSelected(bool))); connect(d->view, SIGNAL(signalImageSelected(const QPtrList&, bool, bool)), this, SLOT(slotImageSelected(const QPtrList&, bool, bool))); } void DigikamApp::setupStatusBar() { d->statusProgressBar = new StatusProgressBar(statusBar()); d->statusProgressBar->setAlignment(Qt::AlignLeft|Qt::AlignVCenter); d->statusProgressBar->setMaximumHeight(fontMetrics().height()+2); statusBar()->addWidget(d->statusProgressBar, 100, true); d->statusNavigateBar = new StatusNavigateBar(statusBar()); d->statusNavigateBar->setMaximumHeight(fontMetrics().height()+2); statusBar()->addWidget(d->statusNavigateBar, 1, true); connect(d->statusNavigateBar, SIGNAL(signalFirstItem()), d->view, SLOT(slotFirstItem())); connect(d->statusNavigateBar, SIGNAL(signalNextItem()), d->view, SLOT(slotNextItem())); connect(d->statusNavigateBar, SIGNAL(signalPrevItem()), d->view, SLOT(slotPrevItem())); connect(d->statusNavigateBar, SIGNAL(signalLastItem()), d->view, SLOT(slotLastItem())); connect(d->statusProgressBar, SIGNAL(signalCancelButtonPressed()), this, SIGNAL(signalCancelButtonPressed())); } void DigikamApp::setupAccelerators() { d->accelerators = new KAccel(this); d->accelerators->insert("Exit Preview Mode", i18n("Exit Preview"), i18n("Exit out of the preview mode"), Key_Escape, this, SIGNAL(signalEscapePressed()), false, true); d->accelerators->insert("Next Image Key_Space", i18n("Next Image"), i18n("Next Image"), Key_Space, this, SIGNAL(signalNextItem()), false, true); d->accelerators->insert("Previous Image Key_Backspace", i18n("Previous Image"), i18n("Previous Image"), Key_Backspace, this, SIGNAL(signalPrevItem()), false, true); d->accelerators->insert("Next Image Key_Next", i18n("Next Image"), i18n("Next Image"), Key_Next, this, SIGNAL(signalNextItem()), false, true); d->accelerators->insert("Previous Image Key_Prior", i18n("Previous Image"), i18n("Previous Image"), Key_Prior, this, SIGNAL(signalPrevItem()), false, true); d->accelerators->insert("First Image Key_Home", i18n("First Image"), i18n("First Image"), Key_Home, this, SIGNAL(signalFirstItem()), false, true); d->accelerators->insert("Last Image Key_End", i18n("Last Image"), i18n("Last Image"), Key_End, this, SIGNAL(signalLastItem()), false, true); d->accelerators->insert("Copy Album Items Selection CTRL+Key_C", i18n("Copy Album Items Selection"), i18n("Copy Album Items Selection"), CTRL+Key_C, this, SIGNAL(signalCopyAlbumItemsSelection()), false, true); d->accelerators->insert("Paste Album Items Selection CTRL+Key_V", i18n("Paste Album Items Selection"), i18n("Paste Album Items Selection"), CTRL+Key_V, this, SIGNAL(signalPasteAlbumItemsSelection()), false, true); } void DigikamApp::setupActions() { // ----------------------------------------------------------------- d->cameraMenuAction = new KActionMenu(i18n("&Camera"), "digitalcam", actionCollection(), "camera_menu"); d->cameraMenuAction->setDelayed(false); // ----------------------------------------------------------------- d->themeMenuAction = new KSelectAction(i18n("&Themes"), 0, actionCollection(), "theme_menu"); connect(d->themeMenuAction, SIGNAL(activated(const QString&)), this, SLOT(slotChangeTheme(const QString&))); // ----------------------------------------------------------------- d->backwardActionMenu = new KToolBarPopupAction(i18n("&Back"), "back", ALT+Key_Left, d->view, SLOT(slotAlbumHistoryBack()), actionCollection(), "album_back"); d->backwardActionMenu->setEnabled(false); connect(d->backwardActionMenu->popupMenu(), SIGNAL(aboutToShow()), this, SLOT(slotAboutToShowBackwardMenu())); connect(d->backwardActionMenu->popupMenu(), SIGNAL(activated(int)), d->view, SLOT(slotAlbumHistoryBack(int))); d->forwardActionMenu = new KToolBarPopupAction(i18n("Forward"), "forward", ALT+Key_Right, d->view, SLOT(slotAlbumHistoryForward()), actionCollection(), "album_forward"); d->forwardActionMenu->setEnabled(false); connect(d->forwardActionMenu->popupMenu(), SIGNAL(aboutToShow()), this, SLOT(slotAboutToShowForwardMenu())); connect(d->forwardActionMenu->popupMenu(), SIGNAL(activated(int)), d->view, SLOT(slotAlbumHistoryForward(int))); d->newAction = new KAction(i18n("&New Album..."), "albumfolder-new", KStdAccel::shortcut(KStdAccel::New), d->view, SLOT(slotNewAlbum()), actionCollection(), "album_new"); d->newAction->setWhatsThis(i18n("This option creates a new empty Album in the database.")); d->albumSortAction = new KSelectAction(i18n("&Sort Albums"), 0, 0, actionCollection(), "album_sort"); connect(d->albumSortAction, SIGNAL(activated(int)), d->view, SLOT(slotSortAlbums(int))); // Use same list order as in albumsettings enum QStringList sortActionList; sortActionList.append(i18n("By Folder")); sortActionList.append(i18n("By Collection")); sortActionList.append(i18n("By Date")); d->albumSortAction->setItems(sortActionList); d->deleteAction = new KAction(i18n("Delete Album"), "editdelete", 0, d->view, SLOT(slotDeleteAlbum()), actionCollection(), "album_delete"); d->addImagesAction = new KAction( i18n("Add Images..."), "albumfolder-importimages", CTRL+Key_I, d->view, SLOT(slotAlbumAddImages()), actionCollection(), "album_addImages"); d->addImagesAction->setWhatsThis(i18n("This option adds new items to the current Album.")); d->albumImportAction = new KAction( i18n("Import Folders..."), "albumfolder-importdir", 0, d->view, SLOT(slotAlbumImportFolder()), actionCollection(), "album_importFolder"); d->propsEditAction = new KAction( i18n("Edit Album Properties..."), "albumfolder-properties", 0, d->view, SLOT(slotAlbumPropsEdit()), actionCollection(), "album_propsEdit"); d->propsEditAction->setWhatsThis(i18n("This option allows you to set the Album Properties information " "about the Collection.")); d->refreshAlbumAction = new KAction( i18n("Refresh"), "rebuild", Key_F5, d->view, SLOT(slotAlbumRefresh()), actionCollection(), "album_refresh"); d->refreshAlbumAction->setWhatsThis(i18n("This option refresh all album content.")); d->syncAlbumMetadataAction = new KAction( i18n("Sync Pictures Metadata"), "rebuild", 0, d->view, SLOT(slotAlbumSyncPicturesMetadata()), actionCollection(), "album_syncmetadata"); d->syncAlbumMetadataAction->setWhatsThis(i18n("This option sync pictures metadata from current " "album with digiKam database contents.")); d->openInKonquiAction = new KAction( i18n("Open in Konqueror"), "konqueror", 0, d->view, SLOT(slotAlbumOpenInKonqui()), actionCollection(), "album_openinkonqui"); // ----------------------------------------------------------- d->newTagAction = new KAction(i18n("New &Tag..."), "tag-new", 0, d->view, SLOT(slotNewTag()), actionCollection(), "tag_new"); d->editTagAction = new KAction(i18n("Edit Tag Properties..."), "tag-properties", 0, d->view, SLOT(slotEditTag()), actionCollection(), "tag_edit"); d->deleteTagAction = new KAction(i18n("Delete Tag"), "tag-delete", 0, d->view, SLOT(slotDeleteTag()), actionCollection(), "tag_delete"); // ----------------------------------------------------------- d->imagePreviewAction = new KToggleAction(i18n("View..."), "viewimage", Key_F3, d->view, SLOT(slotImagePreview()), actionCollection(), "image_view"); d->imageViewAction = new KAction(i18n("Edit..."), "editimage", Key_F4, d->view, SLOT(slotImageEdit()), actionCollection(), "image_edit"); d->imageViewAction->setWhatsThis(i18n("This option allows you to open the editor with the " "current selected item.")); d->imageRenameAction = new KAction(i18n("Rename..."), "pencil", Key_F2, d->view, SLOT(slotImageRename()), actionCollection(), "image_rename"); d->imageRenameAction->setWhatsThis(i18n("This option allows you to rename the filename " "of the current selected item")); // Pop up dialog to ask user whether to move to trash d->imageDeleteAction = new KAction(i18n("Delete"), "edittrash", Key_Delete, d->view, SLOT(slotImageDelete()), actionCollection(), "image_delete"); // Pop up dialog to ask user whether to permanently delete d->imageDeletePermanentlyAction = new KAction(i18n("Delete Permanently"), "editdelete", SHIFT+Key_Delete, d->view, SLOT(slotImageDeletePermanently()), actionCollection(), "image_delete_permanently"); // These two actions are hidden, no menu entry, no toolbar entry, no shortcut. // Power users may add them. d->imageDeletePermanentlyDirectlyAction = new KAction(i18n("Delete Permanently without Confirmation"), "editdelete", 0, d->view, SLOT(slotImageDeletePermanentlyDirectly()), actionCollection(), "image_delete_permanently_directly"); d->imageTrashDirectlyAction = new KAction(i18n("Move to Trash without Confirmation"), "edittrash", 0, d->view, SLOT(slotImageTrashDirectly()), actionCollection(), "image_trash_directly"); d->imageSortAction = new KSelectAction(i18n("&Sort Images"), 0, 0, actionCollection(), "image_sort"); connect(d->imageSortAction, SIGNAL(activated(int)), d->view, SLOT(slotSortImages(int))); // Use same list order as in albumsettings enum QStringList sortImagesActionList; sortImagesActionList.append(i18n("By Name")); sortImagesActionList.append(i18n("By Path")); sortImagesActionList.append(i18n("By Date")); sortImagesActionList.append(i18n("By File Size")); sortImagesActionList.append(i18n("By Rating")); d->imageSortAction->setItems(sortImagesActionList); // ----------------------------------------------------------------- QSignalMapper *exifOrientationMapper = new QSignalMapper( d->view ); connect( exifOrientationMapper, SIGNAL( mapped( int ) ), d->view, SLOT( slotImageExifOrientation( int ) ) ); d->imageExifOrientationActionMenu = new KActionMenu(i18n("Correct Exif Orientation Tag"), actionCollection(), "image_set_exif_orientation"); d->imageExifOrientationActionMenu->setDelayed(false); d->imageSetExifOrientation1Action = new KAction(i18n("Normal"),0,d->imageExifOrientationActionMenu); d->imageSetExifOrientation2Action = new KAction(i18n("Flipped Horizontally"),0,d->imageExifOrientationActionMenu); d->imageSetExifOrientation3Action = new KAction(i18n("Rotated 180 Degrees"),0,d->imageExifOrientationActionMenu); d->imageSetExifOrientation4Action = new KAction(i18n("Flipped Vertically"),0,d->imageExifOrientationActionMenu); d->imageSetExifOrientation5Action = new KAction(i18n("Rotated 90 Degrees / Horiz. Flipped"), 0, d->imageExifOrientationActionMenu); d->imageSetExifOrientation6Action = new KAction(i18n("Rotated 90 Degrees"),0,d->imageExifOrientationActionMenu); d->imageSetExifOrientation7Action = new KAction(i18n("Rotated 90 Degrees / Vert. Flipped"), 0, d->imageExifOrientationActionMenu); d->imageSetExifOrientation8Action = new KAction(i18n("Rotated 270 Degrees"),0,d->imageExifOrientationActionMenu); d->imageExifOrientationActionMenu->insert(d->imageSetExifOrientation1Action); d->imageExifOrientationActionMenu->insert(d->imageSetExifOrientation2Action); d->imageExifOrientationActionMenu->insert(d->imageSetExifOrientation3Action); d->imageExifOrientationActionMenu->insert(d->imageSetExifOrientation4Action); d->imageExifOrientationActionMenu->insert(d->imageSetExifOrientation5Action); d->imageExifOrientationActionMenu->insert(d->imageSetExifOrientation6Action); d->imageExifOrientationActionMenu->insert(d->imageSetExifOrientation7Action); d->imageExifOrientationActionMenu->insert(d->imageSetExifOrientation8Action); connect( d->imageSetExifOrientation1Action, SIGNAL( activated() ), exifOrientationMapper, SLOT( map() ) ); connect( d->imageSetExifOrientation2Action, SIGNAL( activated() ), exifOrientationMapper, SLOT( map() ) ); connect( d->imageSetExifOrientation3Action, SIGNAL( activated() ), exifOrientationMapper, SLOT( map() ) ); connect( d->imageSetExifOrientation4Action, SIGNAL( activated() ), exifOrientationMapper, SLOT( map() ) ); connect( d->imageSetExifOrientation5Action, SIGNAL( activated() ), exifOrientationMapper, SLOT( map() ) ); connect( d->imageSetExifOrientation6Action, SIGNAL( activated() ), exifOrientationMapper, SLOT( map() ) ); connect( d->imageSetExifOrientation7Action, SIGNAL( activated() ), exifOrientationMapper, SLOT( map() ) ); connect( d->imageSetExifOrientation8Action, SIGNAL( activated() ), exifOrientationMapper, SLOT( map() ) ); exifOrientationMapper->setMapping( d->imageSetExifOrientation1Action, 1); exifOrientationMapper->setMapping( d->imageSetExifOrientation2Action, 2); exifOrientationMapper->setMapping( d->imageSetExifOrientation3Action, 3); exifOrientationMapper->setMapping( d->imageSetExifOrientation4Action, 4); exifOrientationMapper->setMapping( d->imageSetExifOrientation5Action, 5); exifOrientationMapper->setMapping( d->imageSetExifOrientation6Action, 6); exifOrientationMapper->setMapping( d->imageSetExifOrientation7Action, 7); exifOrientationMapper->setMapping( d->imageSetExifOrientation8Action, 8); // ----------------------------------------------------------------- d->selectAllAction = new KAction(i18n("Select All"), 0, CTRL+Key_A, d->view, SLOT(slotSelectAll()), actionCollection(), "selectAll"); d->selectNoneAction = new KAction(i18n("Select None"), 0, CTRL+Key_U, d->view, SLOT(slotSelectNone()), actionCollection(), "selectNone"); d->selectInvertAction = new KAction(i18n("Invert Selection"), 0, CTRL+Key_Asterisk, d->view, SLOT(slotSelectInvert()), actionCollection(), "selectInvert"); // ----------------------------------------------------------- KStdAction::keyBindings(this, SLOT(slotEditKeys()), actionCollection()); KStdAction::configureToolbars(this, SLOT(slotConfToolbars()), actionCollection()); KStdAction::preferences(this, SLOT(slotSetup()), actionCollection()); // ----------------------------------------------------------- d->thumbSizePlusAction = new KAction(i18n("Increase Thumbnail Size"), "viewmag+", CTRL+Key_Plus, d->view, SLOT(slotThumbSizePlus()), actionCollection(), "album_thumbSizeIncrease"); d->thumbSizePlusAction->setWhatsThis(i18n("This option allows you to increase " "the Album thumbnails size.")); d->thumbSizeMinusAction = new KAction(i18n("Decrease Thumbnail Size"), "viewmag-", CTRL+Key_Minus, d->view, SLOT(slotThumbSizeMinus()), actionCollection(), "album_thumbSizeDecrease"); d->thumbSizeMinusAction->setWhatsThis(i18n("This option allows you to decrease " "the Album thumbnails size.")); #if KDE_IS_VERSION(3,2,0) d->fullScreenAction = KStdAction::fullScreen(this, SLOT(slotToggleFullScreen()), actionCollection(), this, "full_screen"); #else d->fullScreenAction = new KToggleAction(i18n("Full Screen Mode"), "window_fullscreen", CTRL+SHIFT+Key_F, this, SLOT(slotToggleFullScreen()), actionCollection(), "full_screen"); d->fullScreenAction->setWhatsThis(i18n("This option allows you to toggle the main window " "in full screen mode.")); #endif + d->slideShowAction = new KAction(i18n("Slide Show"), "slideshow", 0, + d->view, SLOT(slotSlideShow()), + actionCollection(), "slideshow"); + d->quitAction = KStdAction::quit(this, SLOT(slotExit()), actionCollection(), "app_exit"); d->kipiHelpAction = new KAction(i18n("Kipi Plugins Handbook"), "kipi", 0, this, SLOT(slotShowKipiHelp()), actionCollection(), "help_kipi"); d->tipAction = KStdAction::tipOfDay(this, SLOT(slotShowTip()), actionCollection(), "help_tipofday"); d->donateMoneyAction = new KAction(i18n("Donate Money..."), 0, 0, this, SLOT(slotDonateMoney()), actionCollection(), "help_donatemoney"); // -- Rating actions --------------------------------------------------------------- d->rating0Star = new KAction(i18n("Assign Rating \"No Star\""), CTRL+Key_0, d->view, SLOT(slotAssignRatingNoStar()), actionCollection(), "imageview_ratenostar"); d->rating1Star = new KAction(i18n("Assign Rating \"One Star\""), CTRL+Key_1, d->view, SLOT(slotAssignRatingOneStar()), actionCollection(), "imageview_rateonestar"); d->rating2Star = new KAction(i18n("Assign Rating \"Two Stars\""), CTRL+Key_2, d->view, SLOT(slotAssignRatingTwoStar()), actionCollection(), "imageview_ratetwostar"); d->rating3Star = new KAction(i18n("Assign Rating \"Three Stars\""), CTRL+Key_3, d->view, SLOT(slotAssignRatingThreeStar()), actionCollection(), "imageview_ratethreestar"); d->rating4Star = new KAction(i18n("Assign Rating \"Four Stars\""), CTRL+Key_4, d->view, SLOT(slotAssignRatingFourStar()), actionCollection(), "imageview_ratefourstar"); d->rating5Star = new KAction(i18n("Assign Rating \"Five Stars\""), CTRL+Key_5, d->view, SLOT(slotAssignRatingFiveStar()), actionCollection(), "imageview_ratefivestar"); // ----------------------------------------------------------- KAction* findAction = KStdAction::find(d->view, SLOT(slotNewQuickSearch()), actionCollection(), "search_quick"); findAction->setText(i18n("Quick Search...")); findAction->setIconSet(BarIcon("filefind")); KAction* advFindAction = KStdAction::find(d->view, SLOT(slotNewAdvancedSearch()), actionCollection(), "search_advanced"); advFindAction->setText(i18n("Advanced Search...")); advFindAction->setShortcut("Ctrl+Alt+F"); new KAction(i18n("Scan for New Images"), "reload_page", 0, this, SLOT(slotDatabaseRescan()), actionCollection(), "database_rescan"); new KAction(i18n("Rebuild all Thumbnails..."), "reload_page", 0, this, SLOT(slotRebuildAllThumbs()), actionCollection(), "thumbs_rebuild"); new KAction(i18n("Sync all Pictures Metadata..."), "reload_page", 0, this, SLOT(slotSyncAllPicturesMetadata()), actionCollection(), "sync_metadata"); // ----------------------------------------------------------- // Provides a menu entry that allows showing/hiding the toolbar(s) setStandardToolBarMenuEnabled(true); // Provides a menu entry that allows showing/hiding the statusbar createStandardStatusBarAction(); // Load Cameras -- do this before the createGUI so that the cameras // are plugged into the toolbar at startup if (d->splashScreen) d->splashScreen->message(i18n("Loading cameras"), AlignLeft, white); loadCameras(); createGUI(QString::fromLatin1( "digikamui.rc" ), false); // Initialize Actions --------------------------------------- d->deleteAction->setEnabled(false); d->addImagesAction->setEnabled(false); d->propsEditAction->setEnabled(false); d->openInKonquiAction->setEnabled(false); d->imageViewAction->setEnabled(false); d->imagePreviewAction->setEnabled(false); d->imageRenameAction->setEnabled(false); d->imageDeleteAction->setEnabled(false); d->imageExifOrientationActionMenu->setEnabled(false); d->albumSortAction->setCurrentItem((int)d->albumSettings->getAlbumSortOrder()); d->imageSortAction->setCurrentItem((int)d->albumSettings->getImageSortOrder()); int size = d->albumSettings->getDefaultIconSize(); if (size == ThumbnailSize::Huge) { enableThumbSizePlusAction(false); enableThumbSizeMinusAction(true); } else if (size == ThumbnailSize::Small) { enableThumbSizePlusAction(true); enableThumbSizeMinusAction(false); } else { enableThumbSizePlusAction(true); enableThumbSizeMinusAction(true); } } void DigikamApp::enableThumbSizePlusAction(bool val) { d->thumbSizePlusAction->setEnabled(val); } void DigikamApp::enableThumbSizeMinusAction(bool val) { d->thumbSizeMinusAction->setEnabled(val); } void DigikamApp::enableAlbumBackwardHistory(bool enable) { d->backwardActionMenu->setEnabled(enable); } void DigikamApp::enableAlbumForwardHistory(bool enable) { d->forwardActionMenu->setEnabled(enable); } void DigikamApp::slotAboutToShowBackwardMenu() { d->backwardActionMenu->popupMenu()->clear(); QStringList titles; d->view->getBackwardHistory(titles); if(!titles.isEmpty()) { int id = 1; QStringList::Iterator iter = titles.begin(); for(; iter != titles.end(); ++iter,++id) { d->backwardActionMenu->popupMenu()->insertItem(*iter, id); } } } void DigikamApp::slotAboutToShowForwardMenu() { d->forwardActionMenu->popupMenu()->clear(); QStringList titles; d->view->getForwardHistory(titles); if(!titles.isEmpty()) { int id = 1; QStringList::Iterator iter = titles.begin(); for(; iter != titles.end(); ++iter,++id) { d->forwardActionMenu->popupMenu()->insertItem(*iter, id); } } } void DigikamApp::slotAlbumSelected(bool val) { Album *album = d->albumManager->currentAlbum(); if(album && !val) { // No PAlbum is selected d->deleteAction->setEnabled(false); d->addImagesAction->setEnabled(false); d->propsEditAction->setEnabled(false); d->openInKonquiAction->setEnabled(false); d->newAction->setEnabled(false); d->albumImportAction->setEnabled(false); } else if(!album && !val) { // Groupitem selected (Collection/date) d->deleteAction->setEnabled(false); d->addImagesAction->setEnabled(false); d->propsEditAction->setEnabled(false); d->openInKonquiAction->setEnabled(false); d->newAction->setEnabled(false); d->albumImportAction->setEnabled(false); KAction *action; for (action = d->kipiFileActionsImport.first(); action; action = d->kipiFileActionsImport.next()) { action->setEnabled(false); } for (action = d->kipiFileActionsExport.first(); action; action = d->kipiFileActionsExport.next()) { action->setEnabled(false); } } else if(album && !album->isRoot() && album->type() == Album::PHYSICAL) { // Normal Album selected d->deleteAction->setEnabled(true); d->addImagesAction->setEnabled(true); d->propsEditAction->setEnabled(true); d->openInKonquiAction->setEnabled(true); d->newAction->setEnabled(true); d->albumImportAction->setEnabled(true); KAction *action; for (action = d->kipiFileActionsImport.first(); action; action = d->kipiFileActionsImport.next()) { action->setEnabled(true); } for (action = d->kipiFileActionsExport.first(); action; action = d->kipiFileActionsExport.next()) { action->setEnabled(true); } } else if(album && album->isRoot() && album->type() == Album::PHYSICAL) { // Root Album selected d->deleteAction->setEnabled(false); d->addImagesAction->setEnabled(false); d->propsEditAction->setEnabled(false); if(album->type() == Album::PHYSICAL) { d->newAction->setEnabled(true); d->openInKonquiAction->setEnabled(true); d->albumImportAction->setEnabled(true); } else { d->newAction->setEnabled(false); d->openInKonquiAction->setEnabled(false); d->albumImportAction->setEnabled(false); } KAction *action; for (action = d->kipiFileActionsImport.first(); action; action = d->kipiFileActionsImport.next()) { action->setEnabled(false); } for (action = d->kipiFileActionsExport.first(); action; action = d->kipiFileActionsExport.next()) { action->setEnabled(true); } } } void DigikamApp::slotTagSelected(bool val) { Album *album = d->albumManager->currentAlbum(); if(!val) { d->deleteTagAction->setEnabled(false); d->editTagAction->setEnabled(false); } else if(!album->isRoot()) { d->deleteTagAction->setEnabled(true); d->editTagAction->setEnabled(true); KAction *action; for (action = d->kipiFileActionsImport.first(); action; action = d->kipiFileActionsImport.next()) { action->setEnabled(false); } for (action = d->kipiFileActionsExport.first(); action; action = d->kipiFileActionsExport.next()) { action->setEnabled(true); } } else { d->deleteTagAction->setEnabled(false); d->editTagAction->setEnabled(false); KAction *action; for (action = d->kipiFileActionsImport.first(); action; action = d->kipiFileActionsImport.next()) { action->setEnabled(false); } for (action = d->kipiFileActionsExport.first(); action; action = d->kipiFileActionsExport.next()) { action->setEnabled(true); } } } void DigikamApp::slotImageSelected(const QPtrList& list, bool hasPrev, bool hasNext) { QPtrList selection = list; bool val = selection.isEmpty() ? false : true; d->imageViewAction->setEnabled(val); d->imagePreviewAction->setEnabled(val); d->imageRenameAction->setEnabled(val); d->imageDeleteAction->setEnabled(val); d->imageExifOrientationActionMenu->setEnabled(val); switch (selection.count()) { case 0: d->statusProgressBar->setText(i18n("No item selected")); break; case 1: d->statusProgressBar->setText(selection.first()->kurl().fileName()); break; default: d->statusProgressBar->setText(i18n("%1 items selected").arg(selection.count())); break; } d->statusNavigateBar->setNavigateBarState(hasPrev, hasNext); } void DigikamApp::slotProgressBarMode(int mode, const QString& text) { d->statusProgressBar->progressBarMode(mode, text); } void DigikamApp::slotProgressValue(int count) { d->statusProgressBar->setProgressValue(count); } void DigikamApp::slotExit() { close(); } QString DigikamApp::convertToLocalUrl( const QString& folder ) { // This function is copied from k3b. KURL url( folder ); if( !url.isLocalFile() ) { #if KDE_IS_VERSION(3,4,91) // Support for system:/ and media:/ (c) Stephan Kulow KURL mlu = KIO::NetAccess::mostLocalURL( url, 0 ); if (mlu.isLocalFile()) return mlu.path(); DWarning() << folder << " mlu " << mlu << endl; QString path = mlu.path(); if ( mlu.protocol() == "system" && path.startsWith("/media") ) path = path.mid(7); else if (mlu.protocol() == "media") path = path.mid(1); else return folder; // nothing to see - go on DDebug() << "parsed import path is: " << path << endl; DCOPRef ref("kded", "mediamanager"); DCOPReply reply = ref.call("properties", path); if (reply.isValid()) { QStringList slreply; reply.get(slreply); if ((slreply.count()>=9) && !slreply[9].isEmpty()) return slreply[9]; else return slreply[6]; } else { DWarning() << "dcop call failed\n"; } return path; #else #ifndef UDS_LOCAL_PATH #define UDS_LOCAL_PATH (72 | KIO::UDS_STRING) #else using namespace KIO; #endif KIO::UDSEntry e; if( KIO::NetAccess::stat( url, e, 0 ) ) { const KIO::UDSEntry::ConstIterator end = e.end(); for( KIO::UDSEntry::ConstIterator it = e.begin(); it != end; ++it ) { if( (*it).m_uds == UDS_LOCAL_PATH && !(*it).m_str.isEmpty() ) return KURL::fromPathOrURL( (*it).m_str ).path(); } } #endif } return url.path(); } void DigikamApp::slotDcopDownloadImages( const QString& folder ) { if (!folder.isNull()) { // activate window when called by media menu and DCOP if (isMinimized()) KWin::deIconifyWindow(winId()); KWin::activateWindow(winId()); slotDownloadImages(folder); } } void DigikamApp::slotDcopCameraAutoDetect() { // activate window when called by media menu and DCOP if (isMinimized()) KWin::deIconifyWindow(winId()); KWin::activateWindow(winId()); slotCameraAutoDetect(); } void DigikamApp::slotDownloadImages( const QString& folder) { if (!folder.isNull()) { d->cameraGuiPath = folder; QTimer::singleShot(0, this, SLOT(slotDownloadImages())); } } void DigikamApp::slotDownloadImages() { if (d->cameraGuiPath.isNull()) return; // Fetch the contents of the device. This is needed to make sure that the // media:/device gets mounted. KIO::ListJob *job = KIO::listDir(KURL(d->cameraGuiPath), false, false); KIO::NetAccess::synchronousRun(job,0); QString localUrl = convertToLocalUrl(d->cameraGuiPath); DDebug() << "slotDownloadImages: convertToLocalUrl " << d->cameraGuiPath << " to " << localUrl << endl; if (localUrl.isNull()) return; bool alreadyThere = false; for (uint i = 0 ; i != actionCollection()->count() ; i++) { if (actionCollection()->action(i)->name() == d->cameraGuiPath) alreadyThere = true; } if (!alreadyThere) { KAction *cAction = new KAction( i18n("Browse %1").arg(KURL(d->cameraGuiPath).prettyURL()), "kipi", 0, this, SLOT(slotDownloadImages()), actionCollection(), d->cameraGuiPath.latin1() ); d->cameraMenuAction->insert(cAction, 0); } // the CameraUI will delete itself when it has finished CameraUI* cgui = new CameraUI(this, i18n("Images found in %1").arg(d->cameraGuiPath), "directory browse","Fixed", localUrl, QDateTime::currentDateTime()); cgui->show(); connect(cgui, SIGNAL(signalLastDestination(const KURL&)), d->view, SLOT(slotSelectAlbum(const KURL&))); connect(cgui, SIGNAL(signalAlbumSettingsChanged()), this, SLOT(slotSetupChanged())); } void DigikamApp::slotCameraConnect() { CameraType* ctype = d->cameraList->find(QString::fromUtf8(sender()->name())); if (ctype) { // check not to open two dialogs for the same camera if (ctype->currentCameraUI() && !ctype->currentCameraUI()->isClosed()) { // show and raise dialog if (ctype->currentCameraUI()->isMinimized()) KWin::deIconifyWindow(ctype->currentCameraUI()->winId()); KWin::activateWindow(ctype->currentCameraUI()->winId()); } else { // the CameraUI will delete itself when it has finished CameraUI* cgui = new CameraUI(this, ctype->title(), ctype->model(), ctype->port(), ctype->path(), ctype->lastAccess()); ctype->setCurrentCameraUI(cgui); cgui->show(); connect(cgui, SIGNAL(signalLastDestination(const KURL&)), d->view, SLOT(slotSelectAlbum(const KURL&))); connect(cgui, SIGNAL(signalAlbumSettingsChanged()), this, SLOT(slotSetupChanged())); } } } void DigikamApp::slotCameraAdded(CameraType *ctype) { if (!ctype) return; KAction *cAction = new KAction(ctype->title(), "camera", 0, this, SLOT(slotCameraConnect()), actionCollection(), ctype->title().utf8()); d->cameraMenuAction->insert(cAction, 0); ctype->setAction(cAction); } void DigikamApp::slotCameraMediaMenu() { d->mediaItems.clear(); d->cameraMediaList->clear(); d->cameraMediaList->insertItem(i18n("No Media Devices Found"), 0); d->cameraMediaList->setItemEnabled(0, false); KURL kurl("media:/"); KIO::ListJob *job = KIO::listDir(kurl, false, false); connect( job, SIGNAL(entries(KIO::Job*,const KIO::UDSEntryList&)), this, SLOT(slotCameraMediaMenuEntries(KIO::Job*,const KIO::UDSEntryList&)) ); } void DigikamApp::slotCameraMediaMenuEntries( Job *, const UDSEntryList & list ) { int i = 0; for(KIO::UDSEntryList::ConstIterator it = list.begin() ; it != list.end() ; ++it) { QString name; QString path; for ( UDSEntry::const_iterator et = (*it).begin() ; et != (*it).end() ; ++et ) { if ( (*et).m_uds == KIO::UDS_NAME) name = ( *et ).m_str; if ( (*et).m_uds == KIO::UDS_URL) path = ( *et ).m_str; //DDebug() << ( *et ).m_str << endl; } if (!name.isEmpty() && !path.isEmpty()) { //DDebug() << "slotCameraMediaMenuEntries: Adding " << name << ", path " << path << endl; if (i == 0) d->cameraMediaList->clear(); d->mediaItems[i] = path; d->cameraMediaList->insertItem(name, this, SLOT(slotDownloadImagesFromMedia(int)), 0, i); d->cameraMediaList->setItemParameter(i, i); i++; } } } void DigikamApp::slotDownloadImagesFromMedia( int id ) { slotDownloadImages( d->mediaItems[id] ); } void DigikamApp::slotCameraRemoved(CameraType *ctype) { if (!ctype) return; KAction *cAction = ctype->action(); if (cAction) d->cameraMenuAction->remove(cAction); } void DigikamApp::slotCameraAutoDetect() { bool retry = false; CameraType* ctype = d->cameraList->autoDetect(retry); if (!ctype && retry) { QTimer::singleShot(0, this, SLOT(slotCameraAutoDetect())); return; } if (ctype && ctype->action()) { ctype->action()->activate(); } } void DigikamApp::slotSetup() { setup(); } bool DigikamApp::setup(bool iccSetupPage) { Setup setup(this, 0, iccSetupPage ? Setup::IccProfiles : Setup::LastPageUsed); // To show the number of KIPI plugins in the setup dialog. KIPI::PluginLoader::PluginList list = d->kipiPluginLoader->pluginList(); setup.kipiPluginsPage()->initPlugins((int)list.count()); if (setup.exec() != QDialog::Accepted) return false; setup.kipiPluginsPage()->applyPlugins(); d->imagePluginsLoader->loadPluginsFromList(setup.imagePluginsPage()->getImagePluginsListEnable()); slotSetupChanged(); return true; } void DigikamApp::slotSetupCamera() { Setup setup(this, 0, Setup::Camera); // For to show the number of KIPI plugins in the setup dialog. KIPI::PluginLoader::PluginList list = d->kipiPluginLoader->pluginList(); setup.kipiPluginsPage()->initPlugins((int)list.count()); if (setup.exec() != QDialog::Accepted) return; setup.kipiPluginsPage()->applyPlugins(); d->imagePluginsLoader->loadPluginsFromList(setup.imagePluginsPage()->getImagePluginsListEnable()); slotSetupChanged(); } void DigikamApp::slotSetupChanged() { // raw loading options might have changed LoadingCacheInterface::cleanCache(); if(d->albumSettings->getAlbumLibraryPath() != d->albumManager->getLibraryPath()) d->view->clearHistory(); d->albumManager->setLibraryPath(d->albumSettings->getAlbumLibraryPath()); d->albumManager->startScan(); d->view->applySettings(d->albumSettings); if (ImageWindow::imagewindowCreated()) ImageWindow::imagewindow()->applySettings(); d->config->sync(); } void DigikamApp::slotEditKeys() { KKeyDialog* dialog = new KKeyDialog(); dialog->insert( actionCollection(), i18n( "General" ) ); KIPI::PluginLoader::PluginList list = d->kipiPluginLoader->pluginList(); for( KIPI::PluginLoader::PluginList::Iterator it = list.begin() ; it != list.end() ; ++it ) { KIPI::Plugin* plugin = (*it)->plugin(); if ( plugin ) dialog->insert( plugin->actionCollection(), (*it)->comment() ); } dialog->configure(); delete dialog; } void DigikamApp::slotConfToolbars() { saveMainWindowSettings(KGlobal::config()); KEditToolbar *dlg = new KEditToolbar(actionCollection(), "digikamui.rc"); if(dlg->exec()); { createGUI(QString::fromLatin1( "digikamui.rc" ), false); applyMainWindowSettings(KGlobal::config()); plugActionList( QString::fromLatin1("file_actions_import"), d->kipiFileActionsImport ); plugActionList( QString::fromLatin1("image_actions"), d->kipiImageActions ); plugActionList( QString::fromLatin1("tool_actions"), d->kipiToolsActions ); plugActionList( QString::fromLatin1("batch_actions"), d->kipiBatchActions ); plugActionList( QString::fromLatin1("album_actions"), d->kipiAlbumActions ); plugActionList( QString::fromLatin1("file_actions_export"), d->kipiFileActionsExport ); } delete dlg; } void DigikamApp::slotToggleFullScreen() { if (d->fullScreen) { #if QT_VERSION >= 0x030300 setWindowState( windowState() & ~WindowFullScreen ); #else showNormal(); #endif d->fullScreen = false; } else { showFullScreen(); d->fullScreen = true; } } void DigikamApp::slotShowTip() { #if KDE_IS_VERSION(3,2,0) QStringList tipsFiles; tipsFiles.append("digikam/tips"); tipsFiles.append("digikamimageplugins/tips"); tipsFiles.append("kipi/tips"); KTipDialog::showMultiTip(this, tipsFiles, true); #else KTipDialog::showTip(this, "digikam/tips", true); #endif } void DigikamApp::slotShowKipiHelp() { KApplication::kApplication()->invokeHelp( QString::null, "kipi-plugins" ); } void DigikamApp::loadPlugins() { QStringList ignores; d->kipiInterface = new DigikamKipiInterface( this, "Digikam_KIPI_interface" ); ignores.append( "HelloWorld" ); ignores.append( "KameraKlient" ); d->kipiPluginLoader = new KIPI::PluginLoader( ignores, d->kipiInterface ); connect( d->kipiPluginLoader, SIGNAL( replug() ), this, SLOT( slotKipiPluginPlug() ) ); d->kipiPluginLoader->loadPlugins(); d->kipiInterface->slotCurrentAlbumChanged(d->albumManager->currentAlbum()); // Setting the initial menu options after all plugins have been loaded d->view->slotAlbumSelected(d->albumManager->currentAlbum()); d->imagePluginsLoader = new ImagePluginLoader(this, d->splashScreen); } void DigikamApp::slotKipiPluginPlug() { unplugActionList( QString::fromLatin1("file_actions_export") ); unplugActionList( QString::fromLatin1("file_actions_import") ); unplugActionList( QString::fromLatin1("image_actions") ); unplugActionList( QString::fromLatin1("tool_actions") ); unplugActionList( QString::fromLatin1("batch_actions") ); unplugActionList( QString::fromLatin1("album_actions") ); d->kipiImageActions.clear(); d->kipiFileActionsExport.clear(); d->kipiFileActionsImport.clear(); d->kipiToolsActions.clear(); d->kipiBatchActions.clear(); d->kipiAlbumActions.clear(); KIPI::PluginLoader::PluginList list = d->kipiPluginLoader->pluginList(); int cpt = 0; for( KIPI::PluginLoader::PluginList::Iterator it = list.begin() ; it != list.end() ; ++it ) { KIPI::Plugin* plugin = (*it)->plugin(); if ( !plugin || !(*it)->shouldLoad() ) continue; ++cpt; if(d->splashScreen) d->splashScreen->message(i18n("Loading: %1").arg((*it)->name())); plugin->setup( this ); QPtrList* popup = 0; // Plugin category identification using KAction method based. KActionPtrList actions = plugin->actions(); for( KActionPtrList::Iterator it2 = actions.begin(); it2 != actions.end(); ++it2 ) { if ( plugin->category(*it2) == KIPI::IMAGESPLUGIN ) popup = &d->kipiImageActions; else if ( plugin->category(*it2) == KIPI::EXPORTPLUGIN ) popup = &d->kipiFileActionsExport; else if ( plugin->category(*it2) == KIPI::IMPORTPLUGIN ) popup = &d->kipiFileActionsImport; else if ( plugin->category(*it2) == KIPI::TOOLSPLUGIN ) popup = &d->kipiToolsActions; else if ( plugin->category(*it2) == KIPI::BATCHPLUGIN ) popup = &d->kipiBatchActions; else if ( plugin->category(*it2) == KIPI::COLLECTIONSPLUGIN ) popup = &d->kipiAlbumActions; // Plug the KIPI plugins actions in according with the KAction method. if ( popup ) popup->append( *it2 ); else DDebug() << "No menu found for a plugin!!!" << endl; } plugin->actionCollection()->readShortcutSettings(); } if(d->splashScreen) d->splashScreen->message(i18n("1 Kipi Plugin Loaded", "%n Kipi Plugins Loaded", cpt)); // 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_actions"), d->kipiImageActions ); plugActionList( QString::fromLatin1("tool_actions"), d->kipiToolsActions ); plugActionList( QString::fromLatin1("batch_actions"), d->kipiBatchActions ); plugActionList( QString::fromLatin1("album_actions"), d->kipiAlbumActions ); } void DigikamApp::loadCameras() { d->cameraList->load(); d->cameraMenuAction->popupMenu()->insertSeparator(); d->cameraMenuAction->popupMenu()->insertItem(i18n("Media Browse"), d->cameraMediaList); d->cameraMenuAction->popupMenu()->insertSeparator(); d->cameraMenuAction->insert(new KAction(i18n("Add Camera..."), 0, this, SLOT(slotSetupCamera()), actionCollection(), "camera_add")); } void DigikamApp::populateThemes() { if(d->splashScreen) d->splashScreen->message(i18n("Loading themes"), AlignLeft, white); ThemeEngine::instance()->scanThemes(); QStringList themes(ThemeEngine::instance()->themeNames()); d->themeMenuAction->setItems(themes); int index = themes.findIndex(d->albumSettings->getCurrentTheme()); if (index == -1) index = themes.findIndex(i18n("Default")); d->themeMenuAction->setCurrentItem(index); ThemeEngine::instance()->slotChangeTheme(d->themeMenuAction->currentText()); } void DigikamApp::slotChangeTheme(const QString& theme) { d->albumSettings->setCurrentTheme(theme); ThemeEngine::instance()->slotChangeTheme(theme); } void DigikamApp::slotDatabaseRescan() { ScanLib sLib; sLib.startScan(); } void DigikamApp::slotRebuildAllThumbs() { QString msg = i18n("Rebuild all albums items thumbnails can take a while.\n" "Do you want to continue?"); int result = KMessageBox::warningContinueCancel(this, msg); if (result != KMessageBox::Continue) return; BatchThumbsGenerator *thumbsGenerator = new BatchThumbsGenerator(this); connect(thumbsGenerator, SIGNAL(signalRebuildAllThumbsDone()), this, SLOT(slotRebuildAllThumbsDone())); thumbsGenerator->exec(); } void DigikamApp::slotRebuildAllThumbsDone() { d->view->applySettings(d->albumSettings); } void DigikamApp::slotSyncAllPicturesMetadata() { QString msg = i18n("Sync all pictures metadata from all albums with digiKam database " "can take a while.\nDo you want to continue?"); int result = KMessageBox::warningContinueCancel(this, msg); if (result != KMessageBox::Continue) return; BatchAlbumsSyncMetadata *syncMetadata = new BatchAlbumsSyncMetadata(this); connect(syncMetadata, SIGNAL(signalComplete()), this, SLOT(slotSyncAllPicturesMetadataDone())); syncMetadata->exec(); } void DigikamApp::slotSyncAllPicturesMetadataDone() { d->view->applySettings(d->albumSettings); } void DigikamApp::slotDonateMoney() { KApplication::kApplication()->invokeBrowser("http://www.digikam.org/?q=donation"); } void DigikamApp::toggledToPreviewMode(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->thumbSizePlusAction->setEnabled(!t); d->thumbSizeMinusAction->setEnabled(!t); d->albumSortAction->setEnabled(!t); d->imageSortAction->setEnabled(!t); } } // namespace Digikam