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