X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/e801bddf91ef73f0e05a0e810b9543c355ab877f..148282e2d856b47ceb191eeef4c834118c8cdffd:/src/metadatawidget.cpp diff --git a/src/metadatawidget.cpp b/src/metadatawidget.cpp index 35f24bea5..218a6d1ce 100644 --- a/src/metadatawidget.cpp +++ b/src/metadatawidget.cpp @@ -17,29 +17,40 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * ***************************************************************************/ -#include - #include "metadatawidget.h" +#include "commentwidget.h" + +#include + #include +#include +#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include -#ifdef HAVE_KMETADATA -#include -#include -#include -#include -#include +#ifdef HAVE_NEPOMUK +#include "nepomukmassupdatejob.h" +#include +#include +#include +#include +#include +#include +#include "tagcloud/resourcetaggingwidget.h" #endif bool MetaDataWidget::metaDataAvailable() { -#ifdef HAVE_KMETADATA - return !Nepomuk::KMetaData::ResourceManager::instance()->init(); +#ifdef HAVE_NEPOMUK + return !Nepomuk::ResourceManager::instance()->init(); #else return false; #endif @@ -49,123 +60,222 @@ bool MetaDataWidget::metaDataAvailable() class MetaDataWidget::Private { public: -#ifdef HAVE_KMETADATA - void loadComment( const QString& comment ) { - editComment->blockSignals( true ); - if ( comment.isEmpty() ) { - editComment->setFontItalic( true ); - editComment->setText( i18n( "Click to add comment..." ) ); - } - else { - editComment->setFontItalic( false ); - editComment->setText( comment ); - } - editComment->blockSignals( false ); - } +#ifdef HAVE_NEPOMUK + void loadComment(const QString& comment); - KUrl fileUrl; - - Nepomuk::KMetaData::File file; - - QTextEdit* editComment; + CommentWidget* editComment; KRatingWidget* ratingWidget; - Nepomuk::KMetaData::TagWidget* tagWidget; + Nepomuk::ResourceTaggingWidget* tagWidget; + + // shared data between the GUI-thread and + // the loader-thread (see LoadFilesThread): + QMutex mutex; + struct SharedData + { + int rating; + QString comment; + QList fileRes; + QMap 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; +} -MetaDataWidget::MetaDataWidget( QWidget* parent ) - : QWidget( parent ) +void MetaDataWidget::Private::LoadFilesThread::run() { + QMutexLocker locker( m_mutex ); + const KUrl::List urls = m_urls; + locker.unlock(); + + bool first = true; + QList fileRes; + QMap 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())); -#ifdef HAVE_KMETADATA - d->editComment = new QTextEdit( this ); - d->tagWidget = new Nepomuk::KMetaData::TagWidget( this ); - d->ratingWidget = new KRatingWidget( this ); - connect( d->ratingWidget, SIGNAL(ratingChanged(int)), this, SLOT(slotRatingChanged(int)) ); - connect( d->editComment, SIGNAL( textChanged() ), this, SLOT( slotCommentChanged() ) ); - - QVBoxLayout* lay = new QVBoxLayout( this ); - lay->setMargin( 0 ); - QHBoxLayout* hbox = new QHBoxLayout; - hbox->addWidget( new QLabel( i18n( "Rating:" ), this ) ); - hbox->addStretch( 1 ); - hbox->addWidget( d->ratingWidget ); - lay->addLayout( hbox ); - lay->addWidget( d->editComment ); - hbox = new QHBoxLayout; - hbox->addWidget( new QLabel( i18n( "Tags:" ), this ) ); - hbox->addWidget( d->tagWidget, 1 ); - lay->addLayout( hbox ); - - d->editComment->installEventFilter( this ); - d->editComment->viewport()->installEventFilter( this ); + 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 ) +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_KMETADATA - d->fileUrl = url; - d->file = Nepomuk::KMetaData::File( url.url() ); - d->file.setLocation( url.url() ); - d->ratingWidget->setRating( d->file.getRating() ); - d->tagWidget->setTaggedResource( d->file ); - d->loadComment( d->file.getComment() ); +#ifdef HAVE_NEPOMUK + d->loadFilesThread->setFiles( urls ); + d->loadFilesThread->start(); +#else + Q_UNUSED( urls ); #endif } -void MetaDataWidget::setFiles( const KUrl::List urls ) +void MetaDataWidget::slotCommentChanged( const QString& s ) { - // FIXME: support multiple files - setFile( urls.first() ); +#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::slotCommentChanged() +void MetaDataWidget::slotRatingChanged(unsigned int rating) { -#ifdef HAVE_KMETADATA - d->file.setComment( d->editComment->toPlainText() ); +#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::slotRatingChanged( int r ) +void MetaDataWidget::metadataUpdateDone() { -#ifdef HAVE_KMETADATA - d->file.setRating( r ); -#endif + setEnabled( true ); } -bool MetaDataWidget::eventFilter( QObject* obj, QEvent* event ) +bool MetaDataWidget::eventFilter(QObject* obj, QEvent* event) { -#ifdef HAVE_KMETADATA - if ( obj == d->editComment->viewport() - || obj == d->editComment ) { - if ( event->type() == QEvent::FocusOut ) { - // make sure the info text is displayed again - d->loadComment( d->editComment->toPlainText() ); - } - else if ( event->type() == QEvent::FocusIn ) { - qDebug() << "JKGHLKGLKHÖLKJHLÖ" << endl; - d->editComment->setFontItalic( false ); - if ( d->file.getComment().isEmpty() ) - d->editComment->setText( QString() ); - } - } + return QWidget::eventFilter(obj, event); +} + + +void MetaDataWidget::slotTagClicked( const Nepomuk::Tag& tag ) +{ + Q_UNUSED( tag ); +#ifdef HAVE_NEPOMUK + d->tagWidget->showTagPopup( QCursor::pos() ); #endif +} - return QWidget::eventFilter( obj, event ); +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"