Allow to specify a group for a meta data item.

The sorting of the meta data items is now done by the group. Within the group the sorting is done by their translated labels.

svn path=/trunk/KDE/kdebase/apps/; revision=1102778
This commit is contained in:
Peter Penz 2010-03-13 15:32:48 +00:00
parent 54a1499586
commit 6b9c4f7b45
6 changed files with 76 additions and 27 deletions

View file

@ -51,7 +51,7 @@ void KLoadMetaDataThread::load(const KUrl::List& urls)
start();
}
QMap<KUrl, Nepomuk::Variant> KLoadMetaDataThread::data() const
QHash<KUrl, Nepomuk::Variant> KLoadMetaDataThread::data() const
{
return m_data;
}

View file

@ -56,7 +56,7 @@ public:
* valid results after the signal finished() has been
* emitted.
*/
QMap<KUrl, Nepomuk::Variant> data() const;
QHash<KUrl, Nepomuk::Variant> data() const;
/**
* Tells the thread that it should cancel as soon
@ -90,7 +90,7 @@ private:
private:
KMetaDataModel* m_model;
QMap<KUrl, Nepomuk::Variant> m_data;
QHash<KUrl, Nepomuk::Variant> m_data;
KUrl::List m_urls;
bool m_canceled;
};

View file

@ -33,7 +33,7 @@ public:
QList<KFileItem> m_fileItems;
#ifdef HAVE_NEPOMUK
QMap<KUrl, Nepomuk::Variant> m_data;
QHash<KUrl, Nepomuk::Variant> m_data;
QList<KLoadMetaDataThread*> m_metaDataThreads;
KLoadMetaDataThread* m_latestMetaDataThread;
@ -122,20 +122,34 @@ void KMetaDataModel::setItems(const KFileItemList& items)
#endif
}
QString KMetaDataModel::group(const KUrl& metaDataUri) const
{
QString group; // return value
const QString uri = metaDataUri.url();
if (uri == QLatin1String("http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#width")) {
group = QLatin1String("0sizeA");
} else if (uri == QLatin1String("http://www.semanticdesktop.org/ontologies/2007/03/22/nfo#height")) {
group = QLatin1String("0sizeB");
}
return group;
}
KFileItemList KMetaDataModel::items() const
{
return d->m_fileItems;
}
#ifdef HAVE_NEPOMUK
QMap<KUrl, Nepomuk::Variant> KMetaDataModel::data() const
QHash<KUrl, Nepomuk::Variant> KMetaDataModel::data() const
{
return d->m_data;
}
QMap<KUrl, Nepomuk::Variant> KMetaDataModel::loadData() const
QHash<KUrl, Nepomuk::Variant> KMetaDataModel::loadData() const
{
return QMap<KUrl, Nepomuk::Variant>();
return QHash<KUrl, Nepomuk::Variant>();
}
#endif

View file

@ -21,11 +21,10 @@
#include <kurl.h>
#include <QHash>
#include <QObject>
#include <QMap>
#include <QString>
#include <config-nepomuk.h>
#ifdef HAVE_NEPOMUK
#define DISABLE_NEPOMUK_LEGACY
@ -64,6 +63,15 @@ public:
void setItems(const KFileItemList& items);
KFileItemList items() const;
/**
* @return Returns the name of the group the meta data indicated
* by \p metaDataUri belongs to. All meta data items are
* sorted by the group. Items within the group are sorted
* by their translated labels. The group name is not shown
* to the user interface and does not need to get translated.
*/
virtual QString group(const KUrl& metaDataUri) const;
#ifdef HAVE_NEPOMUK
/**
* @return Meta data for the items that have been set by
@ -71,7 +79,7 @@ public:
* be invoked after the signal loadingFinished() has
* been received (otherwise no data will be returned).
*/
QMap<KUrl, Nepomuk::Variant> data() const;
QHash<KUrl, Nepomuk::Variant> data() const;
protected:
/**
@ -83,7 +91,7 @@ protected:
* blocked if the operation takes longer. The default implementation
* returns an empty list.
*/
virtual QMap<KUrl, Nepomuk::Variant> loadData() const;
virtual QHash<KUrl, Nepomuk::Variant> loadData() const;
#endif
signals:

View file

@ -47,7 +47,6 @@
#include <nepomuk/resourcemanager.h>
#include <nepomuk/property.h>
#include <nepomuk/tag.h>
#include <nepomuk/variant.h>
#include "nepomukmassupdatejob_p.h"
#include <QMutex>
@ -108,6 +107,7 @@ public:
*/
void startChangeDataJob(KJob* job);
QList<KUrl> sortedKeys(const QHash<KUrl, Nepomuk::Variant>& data) const;
QList<Nepomuk::Resource> resourceList() const;
#endif
@ -369,27 +369,26 @@ void KMetaDataWidget::Private::slotLoadingFinished()
// Show the remaining meta information as text. The number
// of required rows may very. Existing rows are reused to
// prevent flickering.
const KNfoTranslator& nfo = KNfoTranslator::instance();
int rowIndex = m_fixedRowCount;
QMap<KUrl, Nepomuk::Variant> data = m_model->data();
QMap<KUrl, Nepomuk::Variant>::const_iterator it = data.constBegin();
while (it != data.constEnd()) {
const KUrl key = it.key();
const Nepomuk::Variant value = it.value();
const QString itemLabel = nfo.translation(it.key());
const QHash<KUrl, Nepomuk::Variant> data = m_model->data();
const QList<KUrl> keys = sortedKeys(data);
foreach (const KUrl& key, keys) {
const Nepomuk::Variant value = data[key];
const QString itemLabel = nfo.translation(key);
bool appliedData = false;
if (m_nepomukActivated) {
const QString key = it.key().url();
if (key == QLatin1String("kfileitem#rating")) {
const QString keyString = key.url();
if (keyString == QLatin1String("kfileitem#rating")) {
m_ratingWidget->setRating(value.toInt());
appliedData = true;
} else if (key == QLatin1String("kfileitem#comment")) {
} else if (keyString == QLatin1String("kfileitem#comment")) {
m_commentWidget->setText(value.toString());
appliedData = true;
} else if (key == QLatin1String("kfileitem#tags")) {
} else if (keyString == QLatin1String("kfileitem#tags")) {
QList<Nepomuk::Variant> variants = value.toVariantList();
QList<Nepomuk::Tag> tags;
foreach (const Nepomuk::Variant& variant, variants) {
@ -423,8 +422,6 @@ void KMetaDataWidget::Private::slotLoadingFinished()
}
++rowIndex;
}
++it;
}
// remove rows that are not needed anymore
@ -503,6 +500,38 @@ void KMetaDataWidget::Private::startChangeDataJob(KJob* job)
job->start();
}
QList<KUrl> KMetaDataWidget::Private::sortedKeys(const QHash<KUrl, Nepomuk::Variant>& data) const
{
const KNfoTranslator& nfo = KNfoTranslator::instance();
// Create a map, where the translated label prefixed with the
// sort priority acts as key. The data of each entry is the URI
// of the data. By this the all URIs are sorted by the sort priority
// and sub sorted by the translated labels.
QMap<QString, KUrl> map;
QHash<KUrl, Nepomuk::Variant>::const_iterator hashIt = data.constBegin();
while (hashIt != data.constEnd()) {
const KUrl uri = hashIt.key();
QString key = q->model()->group(uri);
key += nfo.translation(uri);
map.insert(key, uri);
++hashIt;
}
// Apply the URIs from the map to the list that will get returned.
// The list will then be alphabetically ordered by the translated labels of the URIs.
QList<KUrl> list;
QMap<QString, KUrl>::const_iterator mapIt = map.constBegin();
while (mapIt != map.constEnd()) {
list.append(mapIt.value());
++mapIt;
}
return list;
}
QList<Nepomuk::Resource> KMetaDataWidget::Private::resourceList() const
{
QList<Nepomuk::Resource> list;

View file

@ -25,8 +25,6 @@
#include <QList>
#include <QWidget>
#include <config-nepomuk.h>
class KMetaDataModel;
class KUrl;