SVN commit 787933 by cgilles:
digiKam from trunk : Image Editor : thumbbar integration like in showfoto to be able to naviguate speedly between images from a same album. A fresh screenshot is available at this url: http://digikam3rdparty.free.fr/Screenshots/FullColorThemeSupport/thumbbarineditor.png CCMAIL: [hidden email] M +3 -1 digikamimagewindowui.rc M +189 -17 imagewindow.cpp M +5 -0 imagewindow.h --- trunk/extragear/graphics/digikam/utilities/imageeditor/editor/digikamimagewindowui.rc #787932:787933 @@ -1,5 +1,5 @@ <!DOCTYPE kpartgui SYSTEM "kpartgui.dtd"> -<gui version="24" name="digikamimagewindow" > +<gui version="25" name="digikamimagewindow" > <MenuBar> @@ -41,6 +41,8 @@ <Action name="editorwindow_zoomfit2window" /> <Action name="editorwindow_zoomfit2select" /> <Separator/> + <Action name="imageview_showthumbs" /> + <Separator/> <Action name="editorwindow_underexposure" /> <Action name="editorwindow_overexposure" /> <Action name="editorwindow_cmview" /> --- trunk/extragear/graphics/digikam/utilities/imageeditor/editor/imagewindow.cpp #787932:787933 @@ -56,6 +56,7 @@ #include <kmenubar.h> #include <ktoolbar.h> #include <kaction.h> +#include <ktoggleaction.h> #include <kactioncollection.h> #include <kstdaccel.h> #include <kstandardaction.h> @@ -80,6 +81,7 @@ #include "imageplugin.h" #include "imagepluginloader.h" #include "imageprint.h" +#include "imagepreviewbar.h" #include "albummanager.h" #include "album.h" #include "albumdb.h" @@ -125,12 +127,19 @@ fileDeletePermanentlyDirectlyAction = 0; fileTrashDirectlyAction = 0; rightSidebar = 0; + thumbBar = 0; + vSplitter = 0; + showBarAction = 0; + fullScreenHideThumbBar = true; } // If image editor is launched by camera interface, current // image cannot be saved. bool allowSaving; + bool fullScreenHideThumbBar; + QSplitter *vSplitter; + KUrl::List urlList; KUrl urlCurrent; @@ -147,9 +156,13 @@ KAction *fileDeletePermanentlyDirectlyAction; KAction *fileTrashDirectlyAction; + KToggleAction *showBarAction; + ImageInfoList imageInfoList; ImageInfo imageInfoCurrent; + ImagePreviewBar *thumbBar; + ImagePropertiesSideBarDB *rightSidebar; }; @@ -215,6 +228,7 @@ // No need to delete m_imagePluginLoader instance here, it will be done by main interface. delete d->rightSidebar; + delete d->thumbBar; delete d; } @@ -273,29 +287,70 @@ connect(ThemeEngine::instance(), SIGNAL(signalThemeChanged()), this, SLOT(slotThemeChanged())); + + connect(d->thumbBar, SIGNAL(signalUrlSelected(const KUrl&)), + this, SLOT(slotThumbBarItemSelected(const KUrl&))); } void ImageWindow::setupUserArea() { - QWidget* widget = new QWidget(this); - QHBoxLayout *lay = new QHBoxLayout(widget); - m_splitter = new QSplitter(widget); - m_canvas = new Canvas(m_splitter); + KSharedConfig::Ptr config = KGlobal::config(); + KConfigGroup group = config->group("ImageViewer Settings"); - m_canvas->makeDefaultEditingCanvas(); - + QWidget* widget = new QWidget(this); QSizePolicy rightSzPolicy(QSizePolicy::Preferred, QSizePolicy::Expanding); rightSzPolicy.setHorizontalStretch(2); rightSzPolicy.setVerticalStretch(1); - d->rightSidebar = new ImagePropertiesSideBarDB(widget, m_splitter, - Sidebar::DockRight, true); - d->rightSidebar->setObjectName("ImageEditor Right Sidebar"); - lay->addWidget(m_splitter); - lay->addWidget(d->rightSidebar); - lay->setSpacing(0); - lay->setMargin(0); + if(!group.readEntry("HorizontalThumbbar", false)) // Vertical thumbbar layout + { + QHBoxLayout *hlay = new QHBoxLayout(widget); + m_splitter = new QSplitter(widget); + d->thumbBar = new ImagePreviewBar(m_splitter, Qt::Vertical); + m_canvas = new Canvas(m_splitter); + m_canvas->setSizePolicy(rightSzPolicy); + m_canvas->makeDefaultEditingCanvas(); + + d->rightSidebar = new ImagePropertiesSideBarDB(widget, m_splitter, Sidebar::DockRight, true); + d->rightSidebar->setObjectName("ImageEditor Right Sidebar"); + + hlay->addWidget(m_splitter); + hlay->addWidget(d->rightSidebar); + hlay->setSpacing(0); + hlay->setMargin(0); + } + else // Horizontal thumbbar layout + { + m_splitter = new QSplitter(Qt::Horizontal, widget); + QWidget* widget2 = new QWidget(m_splitter); + QVBoxLayout *vlay = new QVBoxLayout(widget2); + d->vSplitter = new QSplitter(Qt::Vertical, widget2); + m_canvas = new Canvas(d->vSplitter); + d->thumbBar = new ImagePreviewBar(d->vSplitter, Qt::Horizontal); + + m_canvas->setSizePolicy(rightSzPolicy); + m_canvas->makeDefaultEditingCanvas(); + + d->vSplitter->setFrameStyle( QFrame::NoFrame ); + d->vSplitter->setFrameShadow( QFrame::Plain ); + d->vSplitter->setFrameShape( QFrame::NoFrame ); + d->vSplitter->setOpaqueResize(false); + + vlay->addWidget(d->vSplitter); + vlay->setSpacing(0); + vlay->setMargin(0); + + QHBoxLayout *hlay = new QHBoxLayout(widget); + d->rightSidebar = new ImagePropertiesSideBarDB(widget, m_splitter, Sidebar::DockRight, true); + d->rightSidebar->setObjectName("ImageEditor Right Sidebar"); + + hlay->addWidget(m_splitter); + hlay->addWidget(d->rightSidebar); + hlay->setSpacing(0); + hlay->setMargin(0); + } + m_splitter->setFrameStyle( QFrame::NoFrame ); m_splitter->setFrameShadow( QFrame::Plain ); m_splitter->setFrameShape( QFrame::NoFrame ); @@ -371,6 +426,13 @@ this, SLOT(slotTrashCurrentItemDirectly())); actionCollection()->addAction("image_trash_directly", d->fileTrashDirectlyAction); + // Extra 'View' menu actions --------------------------------------------- + + d->showBarAction = new KToggleAction(KIcon("view-choose"), i18n("Show Thumbnails"), this); + d->showBarAction->setShortcut(Qt::CTRL+Qt::Key_T); + connect(d->showBarAction, SIGNAL(triggered()), this, SLOT(slotToggleShowBar())); + actionCollection()->addAction("imageview_showthumbs", d->showBarAction); + // --------------------------------------------------------------------------------- actionCollection()->addAction("logo_action", new DLogoAction(this)); @@ -378,13 +440,58 @@ createGUI("digikamimagewindowui.rc"); } +void ImageWindow::readSettings() +{ + readStandardSettings(); + + KSharedConfig::Ptr config = KGlobal::config(); + KConfigGroup group = config->group("ImageViewer Settings"); + + d->showBarAction->setChecked(group.readEntry("Show Thumbnails", true)); + slotToggleShowBar(); + + QSizePolicy szPolicy(QSizePolicy::Preferred, QSizePolicy::Expanding); + szPolicy.setHorizontalStretch(2); + szPolicy.setVerticalStretch(1); + QList<int> list; + if(group.hasKey("Vertical Splitter Sizes") && d->vSplitter) + { + QByteArray state; + state = group.readEntry("Vertical Splitter State", state); + d->vSplitter->restoreState(QByteArray::fromBase64(state)); + } + else + m_canvas->setSizePolicy(szPolicy); +} + +void ImageWindow::saveSettings() +{ + saveStandardSettings(); + + KSharedConfig::Ptr config = KGlobal::config(); + KConfigGroup group = config->group("ImageViewer Settings"); + + group.writeEntry("Show Thumbnails", d->showBarAction->isChecked()); + + if (d->vSplitter) + group.writeEntry("Vertical Splitter State", d->vSplitter->saveState().toBase64()); + + config->sync(); +} + void ImageWindow::applySettings() { applyStandardSettings(); AlbumSettings *settings = AlbumSettings::instance(); m_canvas->setExifOrient(settings->getExifRotate()); + d->thumbBar->setExifRotate(settings->getExifRotate()); m_setExifOrientationTag = settings->getExifSetOrientation(); + + KSharedConfig::Ptr config = KGlobal::config(); + KConfigGroup group = config->group("ImageViewer Settings"); + d->fullScreenHideThumbBar = group.readEntry("FullScreenHideThumbBar", true); + refreshView(); } @@ -393,6 +500,24 @@ d->rightSidebar->refreshTagsView(); } +void ImageWindow::slotThumbBarItemSelected(const KUrl& url) +{ + if (d->urlCurrent == url) + return; + + if (!promptUserSave(d->urlCurrent)) + return; + + d->urlCurrent = url; + + m_saveAction->setEnabled(false); + m_revertAction->setEnabled(false); + m_undoAction->setEnabled(false); + m_redoAction->setEnabled(false); + + QTimer::singleShot(0, this, SLOT(slotLoadCurrent())); +} + void ImageWindow::loadURL(const KUrl::List& urlList, const KUrl& urlCurrent, const QString& caption, bool allowSaving) { @@ -423,13 +548,17 @@ // create URL list d->urlList = KUrl::List(); + d->thumbBar->clear(); for (ImageInfoList::iterator it = d->imageInfoList.begin(); it != d->imageInfoList.end(); ++it) { d->urlList.append(it->fileUrl()); + ImagePreviewBarItem *item = new ImagePreviewBarItem(d->thumbBar, *it); + if (imageInfoCurrent == *it) + d->thumbBar->setSelectedItem(item); } - d->urlCurrent = d->imageInfoCurrent.fileUrl(); + d->urlCurrent = d->imageInfoCurrent.fileUrl(); loadCurrentList(caption, allowSaving); } @@ -471,6 +600,10 @@ m_canvas->preload(d->urlList[index].path()); } + d->thumbBar->blockSignals(true); + d->thumbBar->setSelected(d->thumbBar->findItemByUrl(d->urlCurrent)); + d->thumbBar->blockSignals(false); + // Do this _after_ the canvas->load(), so that the main view histogram does not load // a smaller version if a raw image, and after that the DImgInterface loads the full version. // So first let DImgInterface create its loading task, only then any external objects. @@ -746,9 +879,24 @@ void ImageWindow::toggleGUI2FullScreen() { if (m_fullScreen) + { d->rightSidebar->restore(); + + // If Hide Thumbbar option is checked, restore it. + if (!d->showBarAction->isChecked()) + d->thumbBar->show(); + } else + { d->rightSidebar->backup(); + + // If Hide Thumbbar option is checked, catch it if necessary. + if (d->showBarAction->isChecked()) + { + if (d->fullScreenHideThumbBar) + d->thumbBar->hide(); + } + } } void ImageWindow::saveIsComplete() @@ -759,6 +907,7 @@ // put image in cache, the LoadingCacheInterface cares for the details LoadingCacheInterface::putImage(m_savingContext->destinationURL.path(), m_canvas->currentImage()); + d->thumbBar->refreshThumbs(KUrl::List() << d->urlCurrent); // notify main app that file changed emit signalFileModified(m_savingContext->destinationURL); @@ -843,6 +992,17 @@ if (++index != d->urlList.count()) m_canvas->preload(d->urlList[index].path()); } + + // Add the file to the list of thumbbar images if it's not there already + ImagePreviewBarItem *foundItem = d->thumbBar->findItemByInfo(d->imageInfoCurrent); + d->thumbBar->invalidateThumb(foundItem); + + if (!foundItem) + foundItem = new ImagePreviewBarItem(d->thumbBar, d->imageInfoCurrent); + + d->thumbBar->blockSignals(true); + d->thumbBar->setSelected(foundItem); + d->thumbBar->blockSignals(false); } else { @@ -961,7 +1121,11 @@ emit signalFileDeleted(d->urlCurrent); - KUrl CurrentToRemove = d->urlCurrent; + // Remove item from Thumbbar. + d->thumbBar->blockSignals(true); + d->thumbBar->removeItem(d->thumbBar->findItemByUrl(d->urlCurrent)); + d->thumbBar->blockSignals(false); + int index = d->urlList.indexOf(d->urlCurrent); if (index != -1) @@ -971,7 +1135,7 @@ // Try to get the next image in the current Album... ++index; - d->urlCurrent = d->urlList[index]; + d->urlCurrent = d->urlList[index]; d->imageInfoCurrent = d->imageInfoList[index]; d->urlList.removeAt(index); d->imageInfoList.removeAt(index); @@ -983,7 +1147,7 @@ // Try to get the previous image in the current Album. --index; - d->urlCurrent = d->urlList[index]; + d->urlCurrent = d->urlList[index]; d->imageInfoCurrent = d->imageInfoList[index]; d->urlList.removeAt(index); d->imageInfoList.removeAt(index); @@ -1222,4 +1386,12 @@ ThemeEngine::instance()->slotChangeTheme(theme); } +void ImageWindow::slotToggleShowBar() +{ + if (d->showBarAction->isChecked()) + d->thumbBar->show(); + else + d->thumbBar->hide(); +} + } // namespace Digikam --- trunk/extragear/graphics/digikam/utilities/imageeditor/editor/imagewindow.h #787932:787933 @@ -82,6 +82,9 @@ private: + void readSettings(); + void saveSettings(); + void loadCurrentList(const QString& caption, bool allowSaving); void closeEvent(QCloseEvent* e); @@ -113,6 +116,7 @@ void slotLast(); void slotFilePrint(); + void slotThumbBarItemSelected(const KUrl&); void slotLoadCurrent(); void slotDeleteCurrentItem(); void slotDeleteCurrentItemPermanently(); @@ -132,6 +136,7 @@ void slotFileMetadataChanged(const KUrl &); + void slotToggleShowBar(); void slotChangeTheme(const QString& theme); private: _______________________________________________ Digikam-devel mailing list [hidden email] https://mail.kde.org/mailman/listinfo/digikam-devel |
Free forum by Nabble | Edit this page |