29 #ifndef KIO_NO_NEPOMUK
30 #define DISABLE_NEPOMUK_LEGACY
31 #include "nepomukmassupdatejob.h"
32 #include "tagwidget.h"
36 #include "resourcemanager.h"
61 plainText.reserve(richText.length());
64 for (
int i = 0; i < richText.length(); ++i) {
65 const QChar c = richText.at(i);
66 if (c == QLatin1Char(
'<')) {
68 }
else if (c == QLatin1Char(
'>')) {
85 class ValueWidget :
public QLabel
88 explicit ValueWidget(
QWidget* parent = 0);
89 virtual QSize sizeHint()
const;
92 ValueWidget::ValueWidget(
QWidget* parent) :
97 QSize ValueWidget::sizeHint()
const
99 QFontMetrics metrics(font());
104 return metrics.size(Qt::TextSingleLine, plainText(text()));
109 class KFileMetaDataProvider::Private
116 void slotLoadingFinished();
118 void slotRatingChanged(
unsigned int rating);
119 void slotTagsChanged(
const QList<Nepomuk::Tag>& tags);
120 void slotCommentChanged(
const QString& comment);
122 void slotMetaDataUpdateDone();
123 void slotTagClicked(
const Nepomuk::Tag& tag);
131 void startChangeDataJob(
KJob* job);
133 #ifndef KIO_NO_NEPOMUK
134 QList<Nepomuk::Resource> resourceList()
const;
136 QWidget* createTagWidget(
const QList<Nepomuk::Tag>& tags,
QWidget* parent);
144 static int subDirectoriesCount(
const QString &path);
147 bool m_nepomukActivated;
148 QList<KFileItem> m_fileItems;
150 #ifndef KIO_NO_NEPOMUK
151 QHash<KUrl, Nepomuk::Variant> m_data;
153 QList<KFileMetaDataReader*> m_metaDataReaders;
156 QWeakPointer<KRatingWidget> m_ratingWidget;
157 QWeakPointer<Nepomuk::TagWidget> m_tagWidget;
158 QWeakPointer<KCommentWidget> m_commentWidget;
167 m_nepomukActivated(false),
169 #ifndef KIO_NO_NEPOMUK
172 m_latestMetaDataReader(0),
179 #ifndef KIO_NO_NEPOMUK
180 m_nepomukActivated = Nepomuk::ResourceManager::instance()->initialized();
184 KFileMetaDataProvider::Private::~Private()
186 #ifndef KIO_NO_NEPOMUK
187 qDeleteAll(m_metaDataReaders);
191 void KFileMetaDataProvider::Private::slotLoadingFinished()
193 #ifndef KIO_NO_NEPOMUK
197 for (
int i = 0; i < m_metaDataReaders.count(); ++i) {
199 if (metaDataReader == finishedMetaDataReader) {
200 m_metaDataReaders.removeAt(i);
201 if (metaDataReader != m_latestMetaDataReader) {
204 metaDataReader->deleteLater();
210 m_data = m_latestMetaDataReader->
metaData();
211 m_latestMetaDataReader->deleteLater();
213 if (m_fileItems.count() == 1) {
216 const KFileItem& item = m_fileItems.first();
219 const int count = subDirectoriesCount(item.
url().
pathOrUrl());
221 m_data.insert(
KUrl(
"kfileitem#size"),
QString(
"Unknown"));
223 const QString itemCountString =
i18ncp(
"@item:intable",
"%1 item",
"%1 items", count);
224 m_data.insert(
KUrl(
"kfileitem#size"), itemCountString);
231 m_data.insert(
KUrl(
"kfileitem#owner"), item.
user());
233 }
else if (m_fileItems.count() > 1) {
236 foreach (
const KFileItem& item, m_fileItems) {
238 totalSize += item.
size();
245 emit q->loadingFinished();
248 void KFileMetaDataProvider::Private::slotRatingChanged(
unsigned int rating)
250 #ifndef KIO_NO_NEPOMUK
251 Nepomuk::MassUpdateJob* job = Nepomuk::MassUpdateJob::rateResources(resourceList(), rating);
252 startChangeDataJob(job);
258 void KFileMetaDataProvider::Private::slotTagsChanged(
const QList<Nepomuk::Tag>& tags)
260 #ifndef KIO_NO_NEPOMUK
261 if (!m_tagWidget.isNull()) {
262 m_tagWidget.data()->setSelectedTags(tags);
264 Nepomuk::MassUpdateJob* job = Nepomuk::MassUpdateJob::tagResources(resourceList(), tags);
265 startChangeDataJob(job);
272 void KFileMetaDataProvider::Private::slotCommentChanged(
const QString& comment)
274 #ifndef KIO_NO_NEPOMUK
275 Nepomuk::MassUpdateJob* job = Nepomuk::MassUpdateJob::commentResources(resourceList(), comment);
276 startChangeDataJob(job);
282 void KFileMetaDataProvider::Private::slotTagClicked(
const Nepomuk::Tag& tag)
284 #ifndef KIO_NO_NEPOMUK
285 emit q->urlActivated(tag.resourceUri());
291 void KFileMetaDataProvider::Private::slotLinkActivated(
const QString&
link)
293 emit q->urlActivated(
KUrl(link));
296 void KFileMetaDataProvider::Private::startChangeDataJob(
KJob* job)
298 connect(job, SIGNAL(result(
KJob*)),
299 q, SIGNAL(dataChangeFinished()));
300 emit q->dataChangeStarted();
304 #ifndef KIO_NO_NEPOMUK
305 QList<Nepomuk::Resource> KFileMetaDataProvider::Private::resourceList()
const
307 QList<Nepomuk::Resource>
list;
308 foreach (
const KFileItem& item, m_fileItems) {
311 list.append(Nepomuk::Resource(url));
316 QWidget* KFileMetaDataProvider::Private::createRatingWidget(
int rating,
QWidget* parent)
319 const Qt::Alignment align = (ratingWidget->
layoutDirection() == Qt::LeftToRight) ?
320 Qt::AlignLeft : Qt::AlignRight;
323 const QFontMetrics metrics(parent->font());
326 connect(ratingWidget, SIGNAL(ratingChanged(uint)),
327 q, SLOT(slotRatingChanged(uint)));
329 m_ratingWidget = ratingWidget;
334 QWidget* KFileMetaDataProvider::Private::createTagWidget(
const QList<Nepomuk::Tag>& tags,
QWidget* parent)
336 Nepomuk::TagWidget* tagWidget =
new Nepomuk::TagWidget(parent);
337 tagWidget->setModeFlags(m_readOnly
338 ? Nepomuk::TagWidget::MiniMode | Nepomuk::TagWidget::ReadOnly
339 : Nepomuk::TagWidget::MiniMode);
340 tagWidget->setSelectedTags(tags);
342 connect(tagWidget, SIGNAL(selectionChanged(QList<Nepomuk::Tag>)),
343 q, SLOT(slotTagsChanged(QList<Nepomuk::Tag>)));
344 connect(tagWidget, SIGNAL(tagClicked(Nepomuk::Tag)),
345 q, SLOT(slotTagClicked(Nepomuk::Tag)));
347 m_tagWidget = tagWidget;
352 QWidget* KFileMetaDataProvider::Private::createCommentWidget(
const QString& comment,
QWidget* parent)
355 commentWidget->
setText(comment);
358 connect(commentWidget, SIGNAL(commentChanged(
QString)),
359 q, SLOT(slotCommentChanged(
QString)));
361 m_commentWidget = commentWidget;
363 return commentWidget;
369 ValueWidget* valueWidget =
new ValueWidget(parent);
370 valueWidget->setWordWrap(
true);
371 valueWidget->setAlignment(Qt::AlignTop | Qt::AlignLeft);
372 valueWidget->setText(m_readOnly ? plainText(value) : value);
373 connect(valueWidget, SIGNAL(linkActivated(
QString)), q, SLOT(slotLinkActivated(
QString)));
390 d->m_fileItems =
items;
392 #ifndef KIO_NO_NEPOMUK
393 if (items.isEmpty()) {
396 Q_PRIVATE_SLOT(d,
void slotDataChangeStarted())
397 Q_PRIVATE_SLOT(d,
void slotDataChangeFinished())
407 d->m_latestMetaDataReader->setReadContextData(d->m_nepomukActivated);
408 connect(d->m_latestMetaDataReader, SIGNAL(finished()),
this, SLOT(slotLoadingFinished()));
409 d->m_metaDataReaders.append(d->m_latestMetaDataReader);
410 d->m_latestMetaDataReader->start();
416 struct TranslationItem {
417 const char*
const key;
418 const char*
const context;
419 const char*
const value;
422 static const TranslationItem translations[] = {
435 static QHash<QString, QString> hash;
436 if (hash.isEmpty()) {
437 const TranslationItem* item = &translations[0];
438 while (item->key != 0) {
439 hash.insert(item->key,
i18nc(item->context, item->value));
444 QString value = hash.value(metaDataUri.
url());
445 if (value.isEmpty()) {
457 if (uri == QLatin1String(
"kfileitem#type")) {
458 group = QLatin1String(
"0FileItemA");
459 }
else if (uri == QLatin1String(
"kfileitem#size")) {
460 group = QLatin1String(
"0FileItemB");
461 }
else if (uri == QLatin1String(
"http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#width")) {
462 group = QLatin1String(
"0SizeA");
463 }
else if (uri == QLatin1String(
"http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#height")) {
464 group = QLatin1String(
"0SizeB");
472 return d->m_fileItems;
477 d->m_readOnly = readOnly;
482 return d->m_readOnly;
485 #ifndef KIO_NO_NEPOMUK
492 const Nepomuk::Variant& value,
495 Q_ASSERT(parent != 0);
498 if (d->m_nepomukActivated) {
500 if (uri == QLatin1String(
"kfileitem#rating")) {
501 widget = d->createRatingWidget(value.toInt(), parent);
502 }
else if (uri == QLatin1String(
"kfileitem#tags")) {
504 QList<Nepomuk::Tag> tags;
505 foreach (
const QString& tagName, tagNames) {
506 tags.append(Nepomuk::Tag(tagName));
509 widget = d->createTagWidget(tags, parent);
510 }
else if (uri == QLatin1String(
"kfileitem#comment")) {
511 widget = d->createCommentWidget(value.toString(), parent);
516 widget = d->createValueWidget(value.toString(), parent);
519 widget->setForegroundRole(parent->foregroundRole());
520 widget->setFont(parent->font());
526 int KFileMetaDataProvider::Private::subDirectoriesCount(
const QString& path)
530 return dir.entryList(QDir::AllEntries|QDir::NoDotAndDotDot|QDir::System).count();
536 DIR*
dir = ::opendir(QFile::encodeName(path));
539 struct dirent *dirEntry = 0;
540 while ((dirEntry = ::readdir(dir))) {
541 if (dirEntry->d_name[0] ==
'.') {
542 if (dirEntry->d_name[1] ==
'\0') {
546 if (dirEntry->d_name[1] ==
'.' && dirEntry->d_name[2] ==
'\0') {
559 #include "kfilemetadataprovider_p.moc"