┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
path: root/src/panels/information/metadatawidget.cpp
diff options
context:
space:
mode:
authorPeter Penz <[email protected]>2009-01-14 19:26:23 +0000
committerPeter Penz <[email protected]>2009-01-14 19:26:23 +0000
commit307285e9635a4bf584d6e5d7478876b90ef870f0 (patch)
treedb36cbbdc7996ab86c38be8f96fe83597d350dfb /src/panels/information/metadatawidget.cpp
parent86d9c40ab71df5b8bd5063251337d5ca0c22380a (diff)
Group classes into folders, Dolphin is too big in the meantime for having a flat directory hierarchy. dolphin/src/CMakeLists.txt will be cleaned up later.
svn path=/trunk/KDE/kdebase/apps/; revision=911065
Diffstat (limited to 'src/panels/information/metadatawidget.cpp')
-rw-r--r--src/panels/information/metadatawidget.cpp281
1 files changed, 281 insertions, 0 deletions
diff --git a/src/panels/information/metadatawidget.cpp b/src/panels/information/metadatawidget.cpp
new file mode 100644
index 000000000..44a4c029f
--- /dev/null
+++ b/src/panels/information/metadatawidget.cpp
@@ -0,0 +1,281 @@
+/***************************************************************************
+ * Copyright (C) 2007 by Sebastian Trueg <[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 "commentwidget.h"
+
+#include <config-nepomuk.h>
+
+#include <klocale.h>
+#include <KDebug>
+#include <KMessageBox>
+
+#include <QtCore/QEvent>
+#include <QtCore/QMutex>
+#include <QtCore/QMutexLocker>
+#include <QtCore/QThread>
+#include <QtGui/QLabel>
+#include <QtGui/QGridLayout>
+#include <QtGui/QTextEdit>
+
+#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"
+#endif
+
+
+bool MetaDataWidget::metaDataAvailable()
+{
+#ifdef HAVE_NEPOMUK
+ return !Nepomuk::ResourceManager::instance()->init();
+#else
+ return false;
+#endif
+}
+
+
+class MetaDataWidget::Private
+{
+public:
+#ifdef HAVE_NEPOMUK
+ void loadComment(const QString& comment);
+
+ CommentWidget* editComment;
+ 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
+ {
+ public:
+ LoadFilesThread(SharedData* sharedData, QMutex* mutex);
+ void setFiles(const KUrl::List& urls);
+ virtual void run();
+
+ private:
+ SharedData* m_sharedData;
+ QMutex* m_mutex;
+ KUrl::List m_urls;
+ };
+
+ LoadFilesThread* loadFilesThread;
+#endif
+};
+
+#ifdef HAVE_NEPOMUK
+void MetaDataWidget::Private::loadComment(const QString& comment)
+{
+ editComment->setComment( comment );
+}
+
+MetaDataWidget::Private::LoadFilesThread::LoadFilesThread(
+ MetaDataWidget::Private::SharedData* sharedData,
+ QMutex* mutex) :
+ m_sharedData(sharedData),
+ m_mutex(mutex),
+ m_urls()
+{
+}
+
+void MetaDataWidget::Private::LoadFilesThread::setFiles(const KUrl::List& urls)
+{
+ QMutexLocker locker( m_mutex );
+ m_urls = urls;
+}
+
+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 ) {
+ Nepomuk::Resource file( url, Soprano::Vocabulary::Xesam::File() );
+ files.insert( url, file );
+ fileRes.append( file );
+
+ 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;
+ }
+
+ locker.relock();
+ m_sharedData->rating = rating;
+ m_sharedData->comment = comment;
+ m_sharedData->fileRes = fileRes;
+ m_sharedData->files = files;
+}
+#endif
+
+MetaDataWidget::MetaDataWidget(QWidget* parent) :
+ QWidget(parent)
+{
+#ifdef HAVE_NEPOMUK
+ d = new Private;
+ d->editComment = new CommentWidget(this);
+ d->editComment->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->editComment, 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->editComment);
+ lay->addWidget( d->tagWidget );
+#else
+ d = 0;
+#endif
+}
+
+
+MetaDataWidget::~MetaDataWidget()
+{
+#ifdef HAVE_NEPOMUK
+ delete d->loadFilesThread;
+#endif
+ delete d;
+}
+
+
+void MetaDataWidget::setFile(const KUrl& url)
+{
+ kDebug() << url;
+ KUrl::List urls;
+ urls.append( url );
+ setFiles( urls );
+}
+
+void MetaDataWidget::setFiles(const KUrl::List& urls)
+{
+#ifdef HAVE_NEPOMUK
+ d->loadFilesThread->setFiles( urls );
+ d->loadFilesThread->start();
+#else
+ Q_UNUSED( urls );
+#endif
+}
+
+
+void MetaDataWidget::slotCommentChanged( const QString& s )
+{
+#ifdef HAVE_NEPOMUK
+ QMutexLocker locker( &d->mutex );
+ Nepomuk::MassUpdateJob* job = Nepomuk::MassUpdateJob::commentResources( d->sharedData.files.values(), s );
+ connect( job, SIGNAL( result( KJob* ) ),
+ this, SLOT( metadataUpdateDone() ) );
+ setEnabled( false ); // no updates during execution
+ job->start();
+#else
+ Q_UNUSED( s );
+#endif
+}
+
+
+void MetaDataWidget::slotRatingChanged(unsigned int rating)
+{
+#ifdef HAVE_NEPOMUK
+ QMutexLocker locker( &d->mutex );
+ Nepomuk::MassUpdateJob* job = Nepomuk::MassUpdateJob::rateResources( d->sharedData.files.values(), rating );
+ connect( job, SIGNAL( result( KJob* ) ),
+ this, SLOT( metadataUpdateDone() ) );
+ setEnabled( false ); // no updates during execution
+ job->start();
+#else
+ Q_UNUSED( rating );
+#endif
+}
+
+
+void MetaDataWidget::metadataUpdateDone()
+{
+ setEnabled( true );
+}
+
+
+bool MetaDataWidget::eventFilter(QObject* obj, QEvent* event)
+{
+ return QWidget::eventFilter(obj, event);
+}
+
+
+void MetaDataWidget::slotTagClicked( const Nepomuk::Tag& tag )
+{
+ Q_UNUSED( tag );
+#ifdef HAVE_NEPOMUK
+ d->tagWidget->showTagPopup( QCursor::pos() );
+#endif
+}
+
+void MetaDataWidget::slotLoadingFinished()
+{
+#ifdef HAVE_NEPOMUK
+ QMutexLocker locker( &d->mutex );
+ d->ratingWidget->setRating( d->sharedData.rating );
+ d->loadComment( d->sharedData.comment );
+ d->tagWidget->setResources( d->sharedData.fileRes );
+#endif
+}
+
+#include "metadatawidget.moc"