┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
path: root/src/panels/information/metadatawidget.cpp
diff options
context:
space:
mode:
authorPeter Penz <[email protected]>2009-10-10 14:13:50 +0000
committerPeter Penz <[email protected]>2009-10-10 14:13:50 +0000
commiteaeee9f7d68d120b1982f24e73d8183db3418261 (patch)
treea890f309955e93cd2e44c8f95aa04ce4988939fb /src/panels/information/metadatawidget.cpp
parentec6144e5cf91bfe7d0c0343e2f47db85aa1160b0 (diff)
Start of refactoring so that the metadata widget can be moved outside of Dolphin for other applications. The temporary removed code will be integrated again within the next 10 days (-> currently no meta data is shown and cannot be updated).
svn path=/trunk/KDE/kdebase/apps/; revision=1033585
Diffstat (limited to 'src/panels/information/metadatawidget.cpp')
-rw-r--r--src/panels/information/metadatawidget.cpp398
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"