File indexing completed on 2024-04-14 04:35:07

0001 /*
0002     SPDX-FileCopyrightText: 2013 Vishesh Handa <me@vhanda.in>
0003     SPDX-FileCopyrightText: 2009 Peter Penz <peter.penz@gmx.at>
0004 
0005     SPDX-License-Identifier: LGPL-2.0-or-later
0006 */
0007 
0008 #include "filemetadataconfigwidget.h"
0009 #include "filemetadataprovider.h"
0010 
0011 #include <KConfig>
0012 #include <KConfigGroup>
0013 
0014 #include <QDebug>
0015 #include <QEvent>
0016 #include <QListWidget>
0017 #include <QVBoxLayout>
0018 
0019 using namespace Baloo;
0020 
0021 class Baloo::FileMetaDataConfigWidgetPrivate
0022 {
0023 public:
0024     explicit FileMetaDataConfigWidgetPrivate(FileMetaDataConfigWidget *parent);
0025     ~FileMetaDataConfigWidgetPrivate();
0026 
0027     FileMetaDataConfigWidgetPrivate(const FileMetaDataConfigWidgetPrivate&) = delete;
0028     FileMetaDataConfigWidget& operator=(const FileMetaDataConfigWidgetPrivate&) = delete;
0029 
0030     void init();
0031     void loadMetaData();
0032     void addItem(const QString &property);
0033 
0034     /**
0035      * Is invoked after the meta data model has finished the loading of
0036      * meta data. The meta data labels will be added to the configuration
0037      * list.
0038      */
0039     void slotLoadingFinished();
0040 
0041     int m_visibleDataTypes;
0042     KFileItemList m_fileItems;
0043     FileMetaDataProvider *m_provider;
0044     QListWidget *m_metaDataList;
0045 
0046 private:
0047     FileMetaDataConfigWidget *const q;
0048 };
0049 
0050 FileMetaDataConfigWidgetPrivate::FileMetaDataConfigWidgetPrivate(FileMetaDataConfigWidget *parent)
0051     : m_visibleDataTypes(0)
0052     , m_fileItems()
0053     , m_provider(nullptr)
0054     , m_metaDataList(nullptr)
0055     , q(parent)
0056 {
0057     m_metaDataList = new QListWidget(q);
0058     m_metaDataList->setSelectionMode(QAbstractItemView::NoSelection);
0059     m_metaDataList->setSortingEnabled(true);
0060 
0061     auto layout = new QVBoxLayout(q);
0062     layout->addWidget(m_metaDataList);
0063 
0064     m_provider = new FileMetaDataProvider(q);
0065     m_provider->setReadOnly(true);
0066     QObject::connect(m_provider, SIGNAL(loadingFinished()), q, SLOT(slotLoadingFinished()));
0067 }
0068 
0069 FileMetaDataConfigWidgetPrivate::~FileMetaDataConfigWidgetPrivate() = default;
0070 
0071 void FileMetaDataConfigWidgetPrivate::loadMetaData()
0072 {
0073     m_metaDataList->clear();
0074     m_provider->setItems(m_fileItems);
0075 }
0076 
0077 void FileMetaDataConfigWidgetPrivate::addItem(const QString &key)
0078 {
0079     // Meta information provided by Baloo that is already
0080     // available from KFileItem as "fixed item" (see above)
0081     // should not be shown as second entry.
0082     static const char *const hiddenProperties[] = {
0083         "comment", // = fixed item kfileitem#comment
0084         "contentSize", // = fixed item kfileitem#size
0085 
0086         nullptr // mandatory last entry
0087     };
0088 
0089     int i = 0;
0090     while (hiddenProperties[i] != nullptr) {
0091         if (key == QLatin1String(hiddenProperties[i])) {
0092             // the item is hidden
0093             return;
0094         }
0095         ++i;
0096     }
0097 
0098     // the item is not hidden, add it to the list
0099     KConfig config(QStringLiteral("baloofileinformationrc"), KConfig::NoGlobals);
0100     KConfigGroup settings = config.group(QStringLiteral("Show"));
0101 
0102     const QString label = m_provider->label(key);
0103 
0104     auto item = new QListWidgetItem(label, m_metaDataList);
0105     item->setData(Qt::UserRole, key);
0106     const bool show = settings.readEntry(key, true);
0107     item->setCheckState(show ? Qt::Checked : Qt::Unchecked);
0108 }
0109 
0110 void FileMetaDataConfigWidgetPrivate::slotLoadingFinished()
0111 {
0112     // Get all meta information labels that are available for
0113     // the currently shown file item and add them to the list.
0114     Q_ASSERT(m_provider != nullptr);
0115 
0116     m_metaDataList->clear();
0117 
0118     QVariantMap data = m_provider->data();
0119     // Always show these 3
0120     data.remove(QStringLiteral("rating"));
0121     data.remove(QStringLiteral("tags"));
0122     data.remove(QStringLiteral("userComment"));
0123 
0124     QVariantMap::const_iterator it = data.constBegin();
0125     while (it != data.constEnd()) {
0126         addItem(it.key());
0127         ++it;
0128     }
0129 
0130     addItem(QStringLiteral("rating"));
0131     addItem(QStringLiteral("tags"));
0132     addItem(QStringLiteral("userComment"));
0133 }
0134 
0135 FileMetaDataConfigWidget::FileMetaDataConfigWidget(QWidget *parent)
0136     : QWidget(parent)
0137     , d(new FileMetaDataConfigWidgetPrivate(this))
0138 {
0139 }
0140 
0141 FileMetaDataConfigWidget::~FileMetaDataConfigWidget() = default;
0142 
0143 void FileMetaDataConfigWidget::setItems(const KFileItemList &items)
0144 {
0145     d->m_fileItems = items;
0146     d->loadMetaData();
0147 }
0148 
0149 KFileItemList FileMetaDataConfigWidget::items() const
0150 {
0151     return d->m_fileItems;
0152 }
0153 
0154 void FileMetaDataConfigWidget::save()
0155 {
0156     KConfig config(QStringLiteral("baloofileinformationrc"), KConfig::NoGlobals);
0157     KConfigGroup showGroup = config.group(QStringLiteral("Show"));
0158 
0159     const int count = d->m_metaDataList->count();
0160     for (int i = 0; i < count; ++i) {
0161         QListWidgetItem *item = d->m_metaDataList->item(i);
0162         const bool show = (item->checkState() == Qt::Checked);
0163         const QString key = item->data(Qt::UserRole).toString();
0164         showGroup.writeEntry(key, show);
0165     }
0166 
0167     showGroup.sync();
0168 }
0169 
0170 bool FileMetaDataConfigWidget::event(QEvent *event)
0171 {
0172     if (event->type() == QEvent::Polish) {
0173         qDebug() << "GOT POLISH EVENT!!!";
0174         // loadMetaData() must be invoked asynchronously, as the list
0175         // must finish it's initialization first
0176         QMetaObject::invokeMethod(this, "loadMetaData", Qt::QueuedConnection);
0177     }
0178     return QWidget::event(event);
0179     ;
0180 }
0181 
0182 QSize FileMetaDataConfigWidget::sizeHint() const
0183 {
0184     return d->m_metaDataList->sizeHint();
0185 }
0186 
0187 #include "moc_filemetadataconfigwidget.cpp"