diff options
Diffstat (limited to 'src/panels/information/metadatawidget.cpp')
| -rw-r--r-- | src/panels/information/metadatawidget.cpp | 398 |
1 files changed, 119 insertions, 279 deletions
diff --git a/src/panels/information/metadatawidget.cpp b/src/panels/information/metadatawidget.cpp index ea550ed52..5c97d5257 100644 --- a/src/panels/information/metadatawidget.cpp +++ b/src/panels/information/metadatawidget.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2007 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 * @@ -19,341 +19,181 @@ #include "metadatawidget.h" -#include "commentwidget.h" - -#include <config-nepomuk.h> - +#include <kfileitem.h> #include <klocale.h> -#include <KMessageBox> - -#include <QtCore/QEvent> -#include <QtCore/QMutex> -#include <QtCore/QMutexLocker> -#include <QtCore/QThread> -#include <QtGui/QLabel> -#include <QtGui/QGridLayout> -#include <QtGui/QTextEdit> +#include <config-nepomuk.h> #ifdef HAVE_NEPOMUK -#include "nepomukmassupdatejob.h" -#include <nepomuk/kmetadatatagwidget.h> -#include <nepomuk/resourcemanager.h> -#include <nepomuk/resource.h> -#include <nepomuk/variant.h> -#include <nepomuk/kratingwidget.h> -#include <Soprano/Vocabulary/Xesam> -#include "resourcetaggingwidget.h" +#include "commentwidget_p.h" +#include "nepomukmassupdatejob_p.h" +#include "taggingwidget_p.h" #endif +#include <nepomuk/kratingwidget.h> -bool MetaDataWidget::metaDataAvailable() -{ -#ifdef HAVE_NEPOMUK - return !Nepomuk::ResourceManager::instance()->init(); -#else - return false; -#endif -} - +#include <QGridLayout> +#include <QLabel> +#include <QList> +#include <QString> class MetaDataWidget::Private { public: -#ifdef HAVE_NEPOMUK - CommentWidget* commentWidget; - KRatingWidget* ratingWidget; - Nepomuk::ResourceTaggingWidget* tagWidget; - - // shared data between the GUI-thread and - // the loader-thread (see LoadFilesThread): - QMutex mutex; - struct SharedData - { - int rating; - QString comment; - QList<Nepomuk::Resource> fileRes; - QMap<KUrl, Nepomuk::Resource> files; - } 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 + struct Row { - public: - LoadFilesThread(SharedData* sharedData, QMutex* mutex); - ~LoadFilesThread(); - void loadFiles(const KUrl::List& urls); - virtual void run(); - - private: - SharedData* m_sharedData; - QMutex* m_mutex; - KUrl::List m_urls; - bool m_canceled; + QLabel* label; + QWidget* infoWidget; }; - LoadFilesThread* loadFilesThread; -#endif -}; - -#ifdef HAVE_NEPOMUK - -MetaDataWidget::Private::LoadFilesThread::LoadFilesThread( - MetaDataWidget::Private::SharedData* sharedData, - QMutex* mutex) : - m_sharedData(sharedData), - m_mutex(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(); -} + Private(MetaDataWidget* parent); + ~Private(); -void MetaDataWidget::Private::LoadFilesThread::run() -{ - QMutexLocker locker( m_mutex ); - const KUrl::List urls = m_urls; - locker.unlock(); - - bool first = true; - QList<Nepomuk::Resource> fileRes; - QMap<KUrl, Nepomuk::Resource> files; - unsigned int rating = 0; - QString comment; - Q_FOREACH( const KUrl &url, urls ) { - if ( m_canceled ) - return; - Nepomuk::Resource file( url, Soprano::Vocabulary::Xesam::File() ); - files.insert( url, file ); - fileRes.append( file ); + void addRow(QLabel* label, QWidget* infoWidget); + void setRowVisible(QWidget* infoWidget, bool visible); - if ( !first && rating != file.rating() ) { - rating = 0; // reset rating - } - else if ( first ) { - rating = file.rating(); - } - - if ( !first && comment != file.description() ) { - comment.clear(); - } - else if ( first ) { - comment = file.description(); - } - first = false; - } + QList<Row> m_rows; - locker.relock(); - m_sharedData->rating = rating; - m_sharedData->comment = comment; - m_sharedData->fileRes = fileRes; - m_sharedData->files = files; -} -#endif + QGridLayout* m_gridLayout; -MetaDataWidget::MetaDataWidget(QWidget* parent) : - QWidget(parent) -{ + QLabel* m_typeInfo; + QLabel* m_sizeLabel; + QLabel* m_sizeInfo; + QLabel* m_modifiedInfo; + QLabel* m_ownerInfo; + QLabel* m_permissionsInfo; #ifdef HAVE_NEPOMUK - d = new Private; - d->commentWidget = new CommentWidget(this); - d->commentWidget->setFocusPolicy(Qt::ClickFocus); - d->ratingWidget = new KRatingWidget(this); - d->ratingWidget->setAlignment( Qt::AlignCenter ); - d->tagWidget = new Nepomuk::ResourceTaggingWidget(this); - connect(d->ratingWidget, SIGNAL(ratingChanged(unsigned int)), this, SLOT(slotRatingChanged(unsigned int))); - connect(d->commentWidget, SIGNAL(commentChanged(const QString&)), this, SLOT(slotCommentChanged(const QString&))); - connect(d->tagWidget, SIGNAL(tagClicked(const Nepomuk::Tag&)), this, SLOT(slotTagClicked( const Nepomuk::Tag&))); - - d->sharedData.rating = 0; - d->loadFilesThread = new Private::LoadFilesThread(&d->sharedData, &d->mutex); - connect(d->loadFilesThread, SIGNAL(finished()), this, SLOT(slotLoadingFinished())); - - QVBoxLayout* lay = new QVBoxLayout(this); - lay->setMargin(0); - lay->addWidget(d->ratingWidget); - lay->addWidget(d->commentWidget); - lay->addWidget( d->tagWidget ); -#else - d = 0; + KRatingWidget* m_ratingWidget; + TaggingWidget* m_taggingWidget; + CommentWidget* m_commentWidget; #endif -} +private: + MetaDataWidget* const q; +}; -MetaDataWidget::~MetaDataWidget() -{ -#ifdef HAVE_NEPOMUK - delete d->loadFilesThread; -#endif - delete d; -} - -void MetaDataWidget::setRatingVisible(bool visible) -{ +MetaDataWidget::Private::Private(MetaDataWidget* parent) : + 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 - d->ratingWidget->setVisible(visible); -#else - Q_UNUSED(visible); + m_ratingWidget(0), + m_taggingWidget(0), + m_commentWidget(0), #endif -} - - -bool MetaDataWidget::isRatingVisible() const + q(parent) { -#ifdef HAVE_NEPOMUK - return d->ratingWidget->isVisible(); -#else - return false; -#endif -} - + m_gridLayout = new QGridLayout(parent); -void MetaDataWidget::setCommentVisible(bool visible) -{ + 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); #ifdef HAVE_NEPOMUK - d->commentWidget->setVisible(visible); -#else - Q_UNUSED(visible); + m_ratingWidget = new KRatingWidget(parent); + m_taggingWidget = new TaggingWidget(parent); + m_commentWidget = new CommentWidget(parent); #endif -} - -bool MetaDataWidget::isCommentVisible() const -{ + 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 - return d->commentWidget->isVisible(); -#else - return false; + 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); #endif } - -void MetaDataWidget::setTagsVisible(bool visible) +MetaDataWidget::Private::~Private() { -#ifdef HAVE_NEPOMUK - d->tagWidget->setVisible(visible); -#else - Q_UNUSED(visible); -#endif } - -bool MetaDataWidget::areTagsVisible() const +void MetaDataWidget::Private::addRow(QLabel* label, QWidget* infoWidget) { -#ifdef HAVE_NEPOMUK - return d->tagWidget->isVisible(); -#else - return false; -#endif -} + Row row; + row.label = label; + row.infoWidget = infoWidget; + m_rows.append(row); + QPalette palette = label->palette(); + QColor textColor = palette.color(QPalette::Text); + textColor.setAlpha(128); + palette.setColor(QPalette::WindowText, textColor); + label->setPalette(palette); -void MetaDataWidget::setFile(const KUrl& url) -{ - KUrl::List urls; - urls.append( url ); - setFiles( urls ); + const int rowIndex = m_rows.count(); + m_gridLayout->addWidget(label, rowIndex, 0, Qt::AlignLeft); + m_gridLayout->addWidget(infoWidget, rowIndex, 1, Qt::AlignRight); } -void MetaDataWidget::setFiles(const KUrl::List& urls) +void MetaDataWidget::Private::setRowVisible(QWidget* infoWidget, bool visible) { -#ifdef HAVE_NEPOMUK - // Assure that the currently edited text is stored before - // loading the meta data for new files. - const QString currentComment = d->commentWidget->editorText(); - if ( currentComment != d->commentWidget->comment() ) { - slotCommentChanged( currentComment ); + foreach (const Row& row, m_rows) { + if (row.infoWidget == infoWidget) { + row.label->setVisible(visible); + row.infoWidget->setVisible(visible); + return; + } } - - d->loadFilesThread->loadFiles( urls ); -#else - Q_UNUSED( urls ); -#endif } -void MetaDataWidget::slotCommentChanged( const QString& s ) +MetaDataWidget::MetaDataWidget(QWidget* parent) : + QWidget(parent), + d(new Private(this)) { -#ifdef HAVE_NEPOMUK - disconnect(d->commentWidget, SIGNAL(commentChanged(const QString&)), this, SLOT(slotCommentChanged(const QString&))); - - QMutexLocker locker( &d->mutex ); - Nepomuk::MassUpdateJob* job = Nepomuk::MassUpdateJob::commentResources( d->sharedData.files.values(), s ); - locker.unlock(); - connect( job, SIGNAL( result( KJob* ) ), - this, SLOT( metadataUpdateDone() ) ); - setEnabled( false ); // no updates during execution - job->start(); - - connect(d->commentWidget, SIGNAL(commentChanged(const QString&)), this, SLOT(slotCommentChanged(const QString&))); -#else - Q_UNUSED( s ); -#endif } - -void MetaDataWidget::slotRatingChanged(unsigned int rating) +MetaDataWidget::~MetaDataWidget() { -#ifdef HAVE_NEPOMUK - QMutexLocker locker( &d->mutex ); - Nepomuk::MassUpdateJob* job = Nepomuk::MassUpdateJob::rateResources( d->sharedData.files.values(), rating ); - locker.unlock(); - connect( job, SIGNAL( result( KJob* ) ), - this, SLOT( metadataUpdateDone() ) ); - setEnabled( false ); // no updates during execution - job->start(); -#else - Q_UNUSED( rating ); -#endif + delete d; } - -void MetaDataWidget::metadataUpdateDone() +void MetaDataWidget::setItem(const KFileItem& item) { - setEnabled( true ); -} - + // 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, true); + } + d->m_modifiedInfo->setText(item.timeString()); + d->m_ownerInfo->setText(item.user()); + d->m_permissionsInfo->setText(item.permissionsString()); -bool MetaDataWidget::eventFilter(QObject* obj, QEvent* event) -{ - return QWidget::eventFilter(obj, event); + setItems(KFileItemList() << item); } - -void MetaDataWidget::slotTagClicked( const Nepomuk::Tag& tag ) +void MetaDataWidget::setItems(const KFileItemList& items) { - Q_UNUSED( tag ); -#ifdef HAVE_NEPOMUK - d->tagWidget->showTagPopup( QCursor::pos() ); -#endif -} + 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, true); -void MetaDataWidget::slotLoadingFinished() -{ -#ifdef HAVE_NEPOMUK - QMutexLocker locker( &d->mutex ); - d->ratingWidget->setRating( d->sharedData.rating ); - d->commentWidget->setComment( d->sharedData.comment ); - d->tagWidget->setResources( d->sharedData.fileRes ); -#endif + quint64 totalSize = 0; + foreach (const KFileItem& item, items) { + if (!item.isDir() && !item.isLink()) { + totalSize += item.size(); + } + } + d->m_sizeInfo->setText(KIO::convertSize(totalSize)); + } } #include "metadatawidget.moc" |
