File indexing completed on 2025-03-09 03:58:41

0001 /* ============================================================
0002  *
0003  * This file is a part of digiKam project
0004  * https://www.digikam.org
0005  *
0006  * Date        : 2003-01-23
0007  * Description : A widget to display a list of camera folders.
0008  *
0009  * SPDX-FileCopyrightText: 2003-2005 by Renchi Raju <renchi dot raju at gmail dot com>
0010  * SPDX-FileCopyrightText: 2006-2024 by Gilles Caulier <caulier dot gilles at gmail dot com>
0011  *
0012  * SPDX-License-Identifier: GPL-2.0-or-later
0013  *
0014  * ============================================================ */
0015 
0016 #include "camerafolderview.h"
0017 
0018 // KDE includes
0019 
0020 #include <klocalizedstring.h>
0021 
0022 // Local includes
0023 
0024 #include "digikam_debug.h"
0025 #include "camerafolderitem.h"
0026 
0027 namespace Digikam
0028 {
0029 
0030 class Q_DECL_HIDDEN CameraFolderView::Private
0031 {
0032 public:
0033 
0034     explicit Private()
0035       : cameraName(QLatin1String("Camera")),
0036         virtualFolder(nullptr),
0037         rootFolder(nullptr)
0038     {
0039     }
0040 
0041     QString           cameraName;
0042 
0043     CameraFolderItem* virtualFolder;
0044     CameraFolderItem* rootFolder;
0045 };
0046 
0047 CameraFolderView::CameraFolderView(QWidget* const parent)
0048     : QTreeWidget(parent),
0049       d(new Private)
0050 {
0051     setColumnCount(1);
0052     setRootIsDecorated(false);
0053     setUniformRowHeights(true);
0054     setAllColumnsShowFocus(true);
0055     setSelectionMode(QAbstractItemView::SingleSelection);
0056     setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
0057     setDragEnabled(false);
0058     setAcceptDrops(false);
0059     setDropIndicatorShown(false);
0060     setHeaderLabels(QStringList() << i18n("Camera Folders"));
0061 
0062     connect(this, SIGNAL(itemActivated(QTreeWidgetItem*,int)),
0063             this, SLOT(slotCurrentChanged(QTreeWidgetItem*,int)));
0064 
0065     connect(this, SIGNAL(itemClicked(QTreeWidgetItem*,int)),
0066             this, SLOT(slotCurrentChanged(QTreeWidgetItem*,int)));
0067 }
0068 
0069 CameraFolderView::~CameraFolderView()
0070 {
0071     delete d;
0072 }
0073 
0074 void CameraFolderView::addVirtualFolder(const QString& name, const QIcon& icon)
0075 {
0076     d->cameraName    = name;
0077     d->virtualFolder = new CameraFolderItem(this, d->cameraName, icon);
0078     d->virtualFolder->setExpanded(true);
0079     d->virtualFolder->setSelected(false);
0080 
0081     // item is not selectable.
0082 
0083     d->virtualFolder->setFlags(d->virtualFolder->flags() & (int)!Qt::ItemIsSelectable);
0084     d->virtualFolder->setDisabled(false);
0085 }
0086 
0087 void CameraFolderView::addRootFolder(const QString& folder, int nbItems, const QIcon &icon)
0088 {
0089     d->rootFolder = new CameraFolderItem(d->virtualFolder, folder, folder, icon);
0090     d->rootFolder->setExpanded(true);
0091 
0092     if (nbItems != -1)
0093     {
0094         d->rootFolder->setCount(nbItems);
0095     }
0096 }
0097 
0098 CameraFolderItem* CameraFolderView::addFolder(const QString& folder, const QString& subFolder,
0099                                               int nbItems, const QIcon &icon)
0100 {
0101     CameraFolderItem* const parentItem = findFolder(folder);
0102 
0103     if (parentItem)
0104     {
0105         QString path(folder);
0106 
0107         if (!folder.endsWith(QLatin1Char('/')))
0108         {
0109             path += QLatin1Char('/');
0110         }
0111 
0112         path += subFolder + QLatin1Char('/');
0113 
0114         if (!findFolder(path))
0115         {
0116             CameraFolderItem* item = new CameraFolderItem(parentItem, subFolder, path, icon);
0117 
0118             qCDebug(DIGIKAM_IMPORTUI_LOG) << "Adding subfolder:" << subFolder
0119                                           << "Folder path:" << item->folderPath();
0120 
0121             item->setCount(nbItems);
0122             item->setExpanded(true);
0123 
0124             return item;
0125         }
0126         else
0127         {
0128             return nullptr;
0129         }
0130     }
0131     else
0132     {
0133         qCWarning(DIGIKAM_IMPORTUI_LOG) << "Could not find parent for subfolder"
0134                                         << subFolder << "of folder" << folder;
0135         return nullptr;
0136     }
0137 }
0138 
0139 CameraFolderItem* CameraFolderView::findFolder(const QString& folderPath)
0140 {
0141     QTreeWidgetItemIterator it(this);
0142 
0143     while (*it)
0144     {
0145         CameraFolderItem* const lvItem = dynamic_cast<CameraFolderItem*>(*it);
0146 
0147         if (lvItem && (lvItem->folderPath() == folderPath))
0148         {
0149             return lvItem;
0150         }
0151 
0152         ++it;
0153     }
0154 
0155     return nullptr;
0156 }
0157 
0158 void CameraFolderView::slotCurrentChanged(QTreeWidgetItem* item, int)
0159 {
0160     if (!item)
0161     {
0162         Q_EMIT signalFolderChanged(nullptr);
0163     }
0164     else
0165     {
0166         Q_EMIT signalFolderChanged(dynamic_cast<CameraFolderItem*>(item));
0167     }
0168 }
0169 
0170 CameraFolderItem* CameraFolderView::virtualFolder() const
0171 {
0172     return d->virtualFolder;
0173 }
0174 
0175 CameraFolderItem* CameraFolderView::rootFolder() const
0176 {
0177     return d->rootFolder;
0178 }
0179 
0180 void CameraFolderView::clear()
0181 {
0182     QTreeWidget::clear();
0183     d->virtualFolder = nullptr;
0184     d->rootFolder    = nullptr;
0185 
0186     Q_EMIT signalCleared();
0187 }
0188 
0189 } // namespace Digikam
0190 
0191 #include "moc_camerafolderview.cpp"