diff options
Diffstat (limited to 'src/panels/information/metadatawidget.cpp')
| -rw-r--r-- | src/panels/information/metadatawidget.cpp | 709 |
1 files changed, 0 insertions, 709 deletions
diff --git a/src/panels/information/metadatawidget.cpp b/src/panels/information/metadatawidget.cpp deleted file mode 100644 index 67e3d1e44..000000000 --- a/src/panels/information/metadatawidget.cpp +++ /dev/null @@ -1,709 +0,0 @@ -/*************************************************************************** - * Copyright (C) 2008 by Sebastian Trueg <[email protected]> * - * Copyright (C) 2009 by Peter Penz <[email protected]> * - * * - * 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 of the License, 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. * - * * - * You should have received a copy of the GNU General Public License * - * along with this program; if not, write to the * - * Free Software Foundation, Inc., * - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * - ***************************************************************************/ - -#include "metadatawidget.h" - -#include <kconfig.h> -#include <kconfiggroup.h> -#include <kfileitem.h> -#include <kglobalsettings.h> -#include <klocale.h> - -#include <QFontMetrics> -#include <QGridLayout> -#include <QLabel> -#include <QList> -#include <QString> - -#include <config-nepomuk.h> -#ifdef HAVE_NEPOMUK - #define DISABLE_NEPOMUK_LEGACY - - #include "commentwidget_p.h" - #include "nepomukmassupdatejob_p.h" - #include "taggingwidget_p.h" - - #include <Nepomuk/KRatingWidget> - #include <Nepomuk/Resource> - #include <Nepomuk/ResourceManager> - #include <Nepomuk/Types/Property> - #include <Nepomuk/Variant> - - #include <QMutex> - #include <QSpacerItem> - #include <QThread> -#endif - -#include <kdebug.h> - -class MetaDataWidget::Private -{ -public: - struct Row - { - QLabel* label; - QWidget* infoWidget; - }; - - Private(MetaDataWidget* parent); - ~Private(); - - void addRow(QLabel* label, QWidget* infoWidget); - void removeMetaInfoRows(); - void setRowVisible(QWidget* infoWidget, bool visible); - - /** - * Initializes the configuration file "kmetainformationrc" - * with proper default settings for the first start in - * an uninitialized environment. - */ - void initMetaInfoSettings(); - - /** - * Parses the configuration file "kmetainformationrc" and - * updates the visibility of all rows. - */ - void updateRowsVisibility(); - - void slotLoadingFinished(); - void slotRatingChanged(unsigned int rating); - void slotTagsChanged(const QList<Nepomuk::Tag>& tags); - void slotCommentChanged(const QString& comment); - void slotMetaDataUpdateDone(); - - /** - * Disables the metadata widget and starts the job that - * changes the meta data asynchronously. After the job - * has been finished, the metadata widget gets enabled again. - */ - void startChangeDataJob(KJob* job); - - bool m_isSizeVisible; - MetaDataTypes m_hiddenData; - QList<KFileItem> m_fileItems; - QList<Row> m_rows; - - QGridLayout* m_gridLayout; - - QLabel* m_typeInfo; - QLabel* m_sizeLabel; - QLabel* m_sizeInfo; - QLabel* m_modifiedInfo; - QLabel* m_ownerInfo; - QLabel* m_permissionsInfo; - -#ifdef HAVE_NEPOMUK - KRatingWidget* m_ratingWidget; - TaggingWidget* m_taggingWidget; - CommentWidget* m_commentWidget; - - // shared data between the GUI-thread and - // the loader-thread (see LoadFilesThread): - QMutex m_mutex; - struct SharedData - { - int rating; - QString comment; - QList<Nepomuk::Tag> tags; - QList<QString> metaInfoLabels; - QList<QString> metaInfoValues; - QMap<KUrl, Nepomuk::Resource> files; - } m_sharedData; - - /** - * Loads the meta data of files and writes - * the result into a shared data pool that - * can be used by the widgets in the GUI thread. - */ - class LoadFilesThread : public QThread - { - public: - LoadFilesThread(SharedData* m_sharedData, QMutex* m_mutex); - virtual ~LoadFilesThread(); - void loadFiles(const KUrl::List& urls); - virtual void run(); - - private: - /** - * Assures that the settings for the meta information - * are initialized with proper default values. - */ - void initMetaInfoSettings(KConfigGroup& group); - - /** - * Temporary helper method for KDE 4.3 as we currently don't get - * translated labels for Nepmok literals: Replaces camelcase labels - * like "fileLocation" by "File Location:". - */ - QString tunedLabel(const QString& label) const; - - private: - SharedData* m_sharedData; - QMutex* m_mutex; - KUrl::List m_urls; - bool m_canceled; - }; - - LoadFilesThread* m_loadFilesThread; -#endif - -private: - MetaDataWidget* const q; -}; - -MetaDataWidget::Private::Private(MetaDataWidget* parent) : - m_isSizeVisible(true), - m_hiddenData(None), - m_fileItems(), - m_rows(), - m_gridLayout(0), - m_typeInfo(0), - m_sizeLabel(0), - m_sizeInfo(0), - m_modifiedInfo(0), - m_ownerInfo(0), - m_permissionsInfo(0), -#ifdef HAVE_NEPOMUK - m_ratingWidget(0), - m_taggingWidget(0), - m_commentWidget(0), - m_loadFilesThread(0), -#endif - q(parent) -{ - m_gridLayout = new QGridLayout(parent); - m_gridLayout->setMargin(0); - - m_typeInfo = new QLabel(parent); - m_sizeLabel = new QLabel(parent); - m_sizeInfo = new QLabel(parent); - m_modifiedInfo = new QLabel(parent); - m_ownerInfo = new QLabel(parent); - m_permissionsInfo = new QLabel(parent); - - addRow(new QLabel(i18nc("@label", "Type:"), parent), m_typeInfo); - addRow(m_sizeLabel, m_sizeInfo); - addRow(new QLabel(i18nc("@label", "Modified:"), parent), m_modifiedInfo); - addRow(new QLabel(i18nc("@label", "Owner:"), parent), m_ownerInfo); - addRow(new QLabel(i18nc("@label", "Permissions:"), parent), m_permissionsInfo); - -#ifdef HAVE_NEPOMUK - if (Nepomuk::ResourceManager::instance()->init() == 0) { - const QFontMetrics fontMetrics(KGlobalSettings::smallestReadableFont()); - m_ratingWidget = new KRatingWidget(parent); - m_ratingWidget->setFixedHeight(fontMetrics.height()); - connect(m_ratingWidget, SIGNAL(ratingChanged(unsigned int)), - q, SLOT(slotRatingChanged(unsigned int))); - - m_taggingWidget = new TaggingWidget(parent); - connect(m_taggingWidget, SIGNAL(tagsChanged(const QList<Nepomuk::Tag>&)), - q, SLOT(slotTagsChanged(const QList<Nepomuk::Tag>&))); - - m_commentWidget = new CommentWidget(parent); - connect(m_commentWidget, SIGNAL(commentChanged(const QString&)), - q, SLOT(slotCommentChanged(const QString&))); - - addRow(new QLabel(i18nc("@label", "Rating:"), parent), m_ratingWidget); - addRow(new QLabel(i18nc("@label", "Tags:"), parent), m_taggingWidget); - addRow(new QLabel(i18nc("@label", "Comment:"), parent), m_commentWidget); - - m_loadFilesThread = new LoadFilesThread(&m_sharedData, &m_mutex); - connect(m_loadFilesThread, SIGNAL(finished()), q, SLOT(slotLoadingFinished())); - } - - m_sharedData.rating = 0; -#endif - - initMetaInfoSettings(); - updateRowsVisibility(); -} - -MetaDataWidget::Private::~Private() -{ -#ifdef HAVE_NEPOMUK - delete m_loadFilesThread; -#endif -} - -void MetaDataWidget::Private::addRow(QLabel* label, QWidget* infoWidget) -{ - Row row; - row.label = label; - row.infoWidget = infoWidget; - m_rows.append(row); - - const QFont smallFont = KGlobalSettings::smallestReadableFont(); - // use a brighter color for the label and a small font size - QPalette palette = label->palette(); - QColor textColor = palette.color(QPalette::Text); - textColor.setAlpha(128); - palette.setColor(QPalette::WindowText, textColor); - label->setPalette(palette); - label->setFont(smallFont); - label->setWordWrap(true); - label->setAlignment(Qt::AlignTop | Qt::AlignRight); - - QLabel* infoLabel = qobject_cast<QLabel*>(infoWidget); - if (infoLabel != 0) { - infoLabel->setFont(smallFont); - infoLabel->setWordWrap(true); - infoLabel->setAlignment(Qt::AlignTop | Qt::AlignLeft); - } - - // add the row to grid layout - const int rowIndex = m_rows.count(); - m_gridLayout->addWidget(label, rowIndex, 0, Qt::AlignRight); - const int spacerWidth = QFontMetrics(smallFont).size(Qt::TextSingleLine, " ").width(); - m_gridLayout->addItem(new QSpacerItem(spacerWidth, 1), rowIndex, 1); - m_gridLayout->addWidget(infoWidget, rowIndex, 2, Qt::AlignLeft); -} - -void MetaDataWidget::Private::setRowVisible(QWidget* infoWidget, bool visible) -{ - foreach (const Row& row, m_rows) { - if (row.infoWidget == infoWidget) { - row.label->setVisible(visible); - row.infoWidget->setVisible(visible); - return; - } - } -} - - -void MetaDataWidget::Private::initMetaInfoSettings() -{ - KConfig config("kmetainformationrc", KConfig::NoGlobals); - KConfigGroup settings = config.group("Show"); - if (!settings.readEntry("initialized", false)) { - // The resource file is read the first time. Assure - // that some meta information is disabled per default. - - static const char* disabledProperties[] = { - "asText", "contentSize", "created", "depth", "description", "fileExtension", - "fileName", "fileSize", "hasTag", "isPartOf", "lastModified", "mimeType", "name", - "numericRating", "parentUrl", "permissions", "plainTextContent", "owner", - "sourceModified", "url", - 0 // mandatory last entry - }; - - int i = 0; - while (disabledProperties[i] != 0) { - settings.writeEntry(disabledProperties[i], false); - ++i; - } - - // mark the group as initialized - settings.writeEntry("initialized", true); - } -} - -void MetaDataWidget::Private::updateRowsVisibility() -{ - KConfig config("kmetainformationrc", KConfig::NoGlobals); - KConfigGroup settings = config.group("Show"); - - setRowVisible(m_typeInfo, - !(m_hiddenData & MetaDataWidget::TypeData) && - settings.readEntry("type", true)); - - // Cache in m_isSizeVisible whether the size should be shown. This - // is necessary as the size is temporary hidden when the target - // file item is a directory. - m_isSizeVisible = !(m_hiddenData & MetaDataWidget::SizeData) && - settings.readEntry("size", true); - setRowVisible(m_sizeInfo, m_isSizeVisible); - - setRowVisible(m_modifiedInfo, - !(m_hiddenData & MetaDataWidget::ModifiedData) && - settings.readEntry("modified", true)); - - setRowVisible(m_ownerInfo, - !(m_hiddenData & MetaDataWidget::OwnerData) && - settings.readEntry("owner", true)); - - setRowVisible(m_permissionsInfo, - !(m_hiddenData & MetaDataWidget::PermissionsData) && - settings.readEntry("permissions", true)); - -#ifdef HAVE_NEPOMUK - if (Nepomuk::ResourceManager::instance()->init() == 0) { - setRowVisible(m_ratingWidget, - !(m_hiddenData & MetaDataWidget::RatingData) && - settings.readEntry("rating", true)); - - setRowVisible(m_taggingWidget, - !(m_hiddenData & MetaDataWidget::TagsData) && - settings.readEntry("tags", true)); - - setRowVisible(m_commentWidget, - !(m_hiddenData & MetaDataWidget::CommentData) && - settings.readEntry("comment", true)); - } -#endif -} - -void MetaDataWidget::Private::slotLoadingFinished() -{ -#ifdef HAVE_NEPOMUK - QMutexLocker locker(&m_mutex); - m_ratingWidget->setRating(m_sharedData.rating); - m_commentWidget->setText(m_sharedData.comment); - m_taggingWidget->setTags(m_sharedData.tags); - - // Show the remaining meta information as text. The number - // of required rows may very. Existing rows are reused to - // prevent flickering. - int index = 8; // TODO: don't hardcode this value here - const int rowCount = m_rows.count(); - Q_ASSERT(rowCount >= index); - - Q_ASSERT(m_sharedData.metaInfoLabels.count() == m_sharedData.metaInfoValues.count()); - const int metaInfoCount = m_sharedData.metaInfoLabels.count(); - for (int i = 0; i < metaInfoCount; ++i) { - if (index < rowCount) { - // adjust texts of the current row - m_rows[index].label->setText(m_sharedData.metaInfoLabels[i]); - QLabel* infoValueLabel = qobject_cast<QLabel*>(m_rows[index].infoWidget); - Q_ASSERT(infoValueLabel != 0); - infoValueLabel->setText(m_sharedData.metaInfoValues[i]); - } else { - // create new row - QLabel* infoLabel = new QLabel(m_sharedData.metaInfoLabels[i], q); - QLabel* infoValue = new QLabel(m_sharedData.metaInfoValues[i], q); - addRow(infoLabel, infoValue); - } - ++index; - } - if (metaInfoCount > 0) { - --index; - } - - // remove rows that are not needed anymore - for (int i = rowCount - 1; i > index; --i) { - delete m_rows[i].label; - delete m_rows[i].infoWidget; - m_rows.pop_back(); - } - - emit q->loadingFinished(); -#endif -} - -void MetaDataWidget::Private::slotRatingChanged(unsigned int rating) -{ -#ifdef HAVE_NEPOMUK - QMutexLocker locker(&m_mutex); - Nepomuk::MassUpdateJob* job = - Nepomuk::MassUpdateJob::rateResources(m_sharedData.files.values(), rating); - locker.unlock(); - startChangeDataJob(job); -#endif - emit q->ratingChanged(rating); -} - -void MetaDataWidget::Private::slotTagsChanged(const QList<Nepomuk::Tag>& tags) -{ -#ifdef HAVE_NEPOMUK - m_taggingWidget->setTags(tags); - - QMutexLocker locker(&m_mutex); - Nepomuk::MassUpdateJob* job = - Nepomuk::MassUpdateJob::tagResources(m_sharedData.files.values(), tags); - locker.unlock(); - startChangeDataJob(job); -#endif - emit q->tagsChanged(tags); -} - -void MetaDataWidget::Private::slotCommentChanged(const QString& comment) -{ -#ifdef HAVE_NEPOMUK - QMutexLocker locker(&m_mutex); - Nepomuk::MassUpdateJob* job = - Nepomuk::MassUpdateJob::commentResources(m_sharedData.files.values(), comment); - locker.unlock(); - startChangeDataJob(job); -#endif - emit q->commentChanged(comment); -} - -void MetaDataWidget::Private::slotMetaDataUpdateDone() -{ - q->setEnabled(true); -} - -void MetaDataWidget::Private::startChangeDataJob(KJob* job) -{ - connect(job, SIGNAL(result(KJob*)), - q, SLOT(slotMetaDataUpdateDone())); - q->setEnabled(false); // no updates during execution - job->start(); -} - -#ifdef HAVE_NEPOMUK -MetaDataWidget::Private::LoadFilesThread::LoadFilesThread( - MetaDataWidget::Private::SharedData* m_sharedData, - QMutex* m_mutex) : - m_sharedData(m_sharedData), - m_mutex(m_mutex), - m_urls(), - m_canceled(false) -{ -} - -MetaDataWidget::Private::LoadFilesThread::~LoadFilesThread() -{ - // This thread may very well be deleted during execution. We need - // to protect it from crashes here. - m_canceled = true; - wait(); -} - -void MetaDataWidget::Private::LoadFilesThread::loadFiles(const KUrl::List& urls) -{ - QMutexLocker locker(m_mutex); - m_urls = urls; - m_canceled = false; - start(); -} - -void MetaDataWidget::Private::LoadFilesThread::run() -{ - QMutexLocker locker(m_mutex); - const KUrl::List urls = m_urls; - locker.unlock(); - - KConfig config("kmetainformationrc", KConfig::NoGlobals); - KConfigGroup settings = config.group("Show"); - - bool first = true; - unsigned int rating = 0; - QString comment; - QList<Nepomuk::Tag> tags; - QList<QString> metaInfoLabels; - QList<QString> metaInfoValues; - QMap<KUrl, Nepomuk::Resource> files; - foreach (const KUrl& url, urls) { - if (m_canceled) { - return; - } - - Nepomuk::Resource file(url); - files.insert(url, file); - - if (!first && (rating != file.rating())) { - rating = 0; // reset rating - } else if (first) { - rating = file.rating(); - } - - if (!first && (comment != file.description())) { - comment.clear(); // reset comment - } else if (first) { - comment = file.description(); - } - - if (!first && (tags != file.tags())) { - tags.clear(); // reset tags - } else if (first) { - tags = file.tags(); - } - - if (first && (urls.count() == 1)) { - // TODO: show shared meta information instead - // of not showing anything on multiple selections - QHash<QUrl, Nepomuk::Variant> properties = file.properties(); - QHash<QUrl, Nepomuk::Variant>::const_iterator it = properties.constBegin(); - while (it != properties.constEnd()) { - Nepomuk::Types::Property prop(it.key()); - if (settings.readEntry(prop.name(), true)) { - // TODO #1: use Nepomuk::formatValue(res, prop) if available - // instead of it.value().toString() - // TODO #2: using tunedLabel() is a workaround for KDE 4.3 (4.4?) until - // we get translated labels - metaInfoLabels.append(tunedLabel(prop.label())); - metaInfoValues.append(it.value().toString()); - } - ++it; - } - } - - first = false; - } - - locker.relock(); - m_sharedData->rating = rating; - m_sharedData->comment = comment; - m_sharedData->tags = tags; - m_sharedData->metaInfoLabels = metaInfoLabels; - m_sharedData->metaInfoValues = metaInfoValues; - m_sharedData->files = files; -} - -QString MetaDataWidget::Private::LoadFilesThread::tunedLabel(const QString& label) const -{ - QString tunedLabel; - const int labelLength = label.length(); - if (labelLength > 0) { - tunedLabel.reserve(labelLength); - tunedLabel = label[0].toUpper(); - for (int i = 1; i < labelLength; ++i) { - if (label[i].isUpper() && !label[i - 1].isSpace() && !label[i - 1].isUpper()) { - tunedLabel += ' '; - tunedLabel += label[i].toLower(); - } else { - tunedLabel += label[i]; - } - } - } - return tunedLabel + ':'; -} - -#endif // HAVE_NEPOMUK - -MetaDataWidget::MetaDataWidget(QWidget* parent) : - QWidget(parent), - d(new Private(this)) -{ -} - -MetaDataWidget::~MetaDataWidget() -{ - delete d; -} - -void MetaDataWidget::setItem(const KFileItem& item) -{ - // update values for "type", "size", "modified", - // "owner" and "permissions" synchronously - d->m_sizeLabel->setText(i18nc("@label", "Size:")); - if (item.isDir()) { - d->m_typeInfo->setText(i18nc("@label", "Folder")); - d->setRowVisible(d->m_sizeInfo, false); - } else { - d->m_typeInfo->setText(item.mimeComment()); - d->m_sizeInfo->setText(KIO::convertSize(item.size())); - d->setRowVisible(d->m_sizeInfo, d->m_isSizeVisible); - } - d->m_modifiedInfo->setText(item.timeString()); - d->m_ownerInfo->setText(item.user()); - d->m_permissionsInfo->setText(item.permissionsString()); - - setItems(KFileItemList() << item); -} - -void MetaDataWidget::setItems(const KFileItemList& items) -{ - d->m_fileItems = items; - - if (items.count() > 1) { - // calculate the size of all items and show this - // information to the user - d->m_sizeLabel->setText(i18nc("@label", "Total Size:")); - d->setRowVisible(d->m_sizeInfo, d->m_isSizeVisible); - - quint64 totalSize = 0; - foreach (const KFileItem& item, items) { - if (!item.isDir() && !item.isLink()) { - totalSize += item.size(); - } - } - d->m_sizeInfo->setText(KIO::convertSize(totalSize)); - } - -#ifdef HAVE_NEPOMUK - if (Nepomuk::ResourceManager::instance()->init() == 0) { - QList<KUrl> urls; - foreach (const KFileItem& item, items) { - const KUrl url = item.nepomukUri(); - if (url.isValid()) { - urls.append(url); - } - } - d->m_loadFilesThread->loadFiles(urls); - } -#endif -} - -void MetaDataWidget::setItem(const KUrl& url) -{ - KFileItem item(KFileItem::Unknown, KFileItem::Unknown, url); - item.refresh(); - setItem(item); -} - -void MetaDataWidget::setItems(const QList<KUrl>& urls) -{ - KFileItemList items; - foreach (const KUrl& url, urls) { - KFileItem item(KFileItem::Unknown, KFileItem::Unknown, url); - item.refresh(); - items.append(item); - } - setItems(items); -} - -KFileItemList MetaDataWidget::items() const -{ - return d->m_fileItems; -} - -void MetaDataWidget::setHiddenData(MetaDataTypes data) -{ - d->m_hiddenData = data; - d->updateRowsVisibility(); -} - -MetaDataWidget::MetaDataTypes MetaDataWidget::hiddenData() const -{ - return d->m_hiddenData; -} - -unsigned int MetaDataWidget::rating() const -{ -#ifdef HAVE_NEPOMUK - QMutexLocker locker(&d->m_mutex); - return d->m_sharedData.rating; -#else - return 0; -#endif -} - -QList<Nepomuk::Tag> MetaDataWidget::tags() const -{ -#ifdef HAVE_NEPOMUK - QMutexLocker locker(&d->m_mutex); - return d->m_sharedData.tags; -#else - return QList<Nepomuk::Tag>(); -#endif -} - -QString MetaDataWidget::comment() const -{ -#ifdef HAVE_NEPOMUK - QMutexLocker locker(&d->m_mutex); - return d->m_sharedData.comment; -#else - return QString(); -#endif -} - -#include "metadatawidget.moc" |
