+void MetaDataWidget::Private::slotLoadingFinished()
+{
+#ifdef HAVE_NEPOMUK
+ QMutexLocker locker(&mutex);
+ ratingWidget->setRating(sharedData.rating);
+ commentWidget->setText(sharedData.comment);
+ taggingWidget->setTags(sharedData.tags);
+#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();
+}
+
+void MetaDataWidget::Private::LoadFilesThread::run()
+{
+ QMutexLocker locker(m_mutex);
+ const KUrl::List urls = m_urls;
+ locker.unlock();
+
+ bool first = true;
+ unsigned int rating = 0;
+ QString comment;
+ QList<Nepomuk::Tag> tags;
+ foreach (const KUrl& url, urls) {
+ if (m_canceled) {
+ return;
+ }
+
+ Nepomuk::Resource file(url, Soprano::Vocabulary::Xesam::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();
+ }
+
+ first = false;
+ }
+
+ locker.relock();
+ m_sharedData->rating = rating;
+ m_sharedData->comment = comment;
+ m_sharedData->tags = tags;
+}
+#endif