/***************************************************************************** * Copyright (C) 2009 by Peter Penz * * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Library General Public * * License as published by the Free Software Foundation; either * * version 2 of the License, or (at your option) any later version. * * * * This library 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 * * Library General Public License for more details. * * * * You should have received a copy of the GNU Library General Public License * * along with this library; see the file COPYING.LIB. If not, write to * * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * * Boston, MA 02110-1301, USA. * *****************************************************************************/ #include "kfilemetadataconfigurationwidget.h" #include #include #include #include #include "knfotranslator_p.h" #include #include "kfilemetadataprovider_p.h" #include #include #include #include class KFileMetaDataConfigurationWidget::Private { public: Private(KFileMetaDataConfigurationWidget* parent); ~Private(); void init(); void loadMetaData(); void addItem(const KUrl& uri); /** * Is invoked after the meta data model has finished the loading of * meta data. The meta data labels will be added to the configuration * list. */ void slotLoadingFinished(); int m_visibleDataTypes; KFileItemList m_fileItems; KFileMetaDataProvider* m_provider; QListWidget* m_metaDataList; private: KFileMetaDataConfigurationWidget* const q; }; KFileMetaDataConfigurationWidget::Private::Private(KFileMetaDataConfigurationWidget* parent) : m_visibleDataTypes(0), m_fileItems(), m_provider(0), m_metaDataList(0), q(parent) { m_metaDataList = new QListWidget(q); m_metaDataList->setSelectionMode(QAbstractItemView::NoSelection); m_metaDataList->setSortingEnabled(true); QVBoxLayout* layout = new QVBoxLayout(q); layout->addWidget(m_metaDataList); m_provider = new KFileMetaDataProvider(q); } KFileMetaDataConfigurationWidget::Private::~Private() { } void KFileMetaDataConfigurationWidget::Private::loadMetaData() { connect(m_provider, SIGNAL(loadingFinished()), q, SLOT(slotLoadingFinished())); m_provider->setItems(m_fileItems); } void KFileMetaDataConfigurationWidget::Private::addItem(const KUrl& uri) { // Meta information provided by Nepomuk that is already // available from KFileItem as "fixed item" (see above) // should not be shown as second entry. static const char* const hiddenProperties[] = { "http://www.semanticdesktop.org/ontologies/2007/01/19/nie#comment", // = fixed item kfileitem#comment "http://www.semanticdesktop.org/ontologies/2007/01/19/nie#contentSize", // = fixed item kfileitem#size "http://www.semanticdesktop.org/ontologies/2007/01/19/nie#lastModified", // = fixed item kfileitem#modified "http://www.semanticdesktop.org/ontologies/2007/01/19/nie#plainTextContent" // hide this property always "http://www.semanticdesktop.org/ontologies/2007/01/19/nie#mimeType", // = fixed item kfileitem#type "http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#fileName", // hide this property always "http://www.w3.org/1999/02/22-rdf-syntax-ns#type", // = fixed item kfileitem#type 0 // mandatory last entry }; int i = 0; const QString key = uri.url(); while (hiddenProperties[i] != 0) { if (key == QLatin1String(hiddenProperties[i])) { // the item is hidden return; } ++i; } // the item is not hidden, add it to the list KConfig config("kmetainformationrc", KConfig::NoGlobals); KConfigGroup settings = config.group("Show"); const QString label = (m_provider == 0) ? KNfoTranslator::instance().translation(uri) : m_provider->label(uri); QListWidgetItem* item = new QListWidgetItem(label, m_metaDataList); item->setData(Qt::UserRole, key); const bool show = settings.readEntry(key, true); item->setCheckState(show ? Qt::Checked : Qt::Unchecked); } void KFileMetaDataConfigurationWidget::Private::slotLoadingFinished() { // Get all meta information labels that are available for // the currently shown file item and add them to the list. Q_ASSERT(m_provider != 0); QHashIterator it(m_provider->data()); while (it.hasNext()) { it.next(); addItem(it.key()); } } KFileMetaDataConfigurationWidget::KFileMetaDataConfigurationWidget(QWidget* parent) : QWidget(parent), d(new Private(this)) { } KFileMetaDataConfigurationWidget::~KFileMetaDataConfigurationWidget() { delete d; } void KFileMetaDataConfigurationWidget::setItems(const KFileItemList& items) { d->m_fileItems = items; } KFileItemList KFileMetaDataConfigurationWidget::items() const { return d->m_fileItems; } void KFileMetaDataConfigurationWidget::save() { KConfig config("kmetainformationrc", KConfig::NoGlobals); KConfigGroup showGroup = config.group("Show"); const int count = d->m_metaDataList->count(); for (int i = 0; i < count; ++i) { QListWidgetItem* item = d->m_metaDataList->item(i); const bool show = (item->checkState() == Qt::Checked); const QString key = item->data(Qt::UserRole).toString(); showGroup.writeEntry(key, show); } showGroup.sync(); } bool KFileMetaDataConfigurationWidget::event(QEvent* event) { if (event->type() == QEvent::Polish) { // loadMetaData() must be invoked asynchronously, as the list // must finish it's initialization first QMetaObject::invokeMethod(this, "loadMetaData", Qt::QueuedConnection); } return QWidget::event(event);; } QSize KFileMetaDataConfigurationWidget::sizeHint() const { return d->m_metaDataList->sizeHint(); } #include "moc_kfilemetadataconfigurationwidget.cpp"