diff options
| author | Sebastian Trueg <[email protected]> | 2008-04-01 12:27:06 +0000 |
|---|---|---|
| committer | Sebastian Trueg <[email protected]> | 2008-04-01 12:27:06 +0000 |
| commit | bd64849b07d79e799517acf1ed504532dd50e8cf (patch) | |
| tree | d5a10bf594a96d79e3aa23b57f746732f0bc67a9 /src | |
| parent | 18354deaae117d65525929a1de2337275e454232 (diff) | |
Implemented tagging of multiple files at the same time.
The result is always an intersection of the tags of all files.
Another possibility would be to only change the clicked tag. Feedback?
BUG: 160157
svn path=/trunk/KDE/kdebase/apps/; revision=792518
Diffstat (limited to 'src')
| -rw-r--r-- | src/metadatawidget.cpp | 2 | ||||
| -rw-r--r-- | src/tagcloud/resourcetaggingwidget.cpp | 51 | ||||
| -rw-r--r-- | src/tagcloud/resourcetaggingwidget.h | 1 |
3 files changed, 47 insertions, 7 deletions
diff --git a/src/metadatawidget.cpp b/src/metadatawidget.cpp index 8b9176707..e9acac7ce 100644 --- a/src/metadatawidget.cpp +++ b/src/metadatawidget.cpp @@ -145,7 +145,7 @@ void MetaDataWidget::setFiles(const KUrl::List& urls) } first = false; } - d->tagWidget->setResource( fileRes.first() ); + d->tagWidget->setResources( fileRes ); #endif } diff --git a/src/tagcloud/resourcetaggingwidget.cpp b/src/tagcloud/resourcetaggingwidget.cpp index b67e8f47d..8eba24a9c 100644 --- a/src/tagcloud/resourcetaggingwidget.cpp +++ b/src/tagcloud/resourcetaggingwidget.cpp @@ -25,14 +25,22 @@ #include <QtGui/QContextMenuEvent> #include <QtGui/QCursor> #include <QtGui/QLabel> +#include <QtCore/QSet> #include <KLocale> +namespace Nepomuk { + inline uint qHash( const Tag& res ) + { + return qHash( res.resourceUri().toString() ); + } +} + class Nepomuk::ResourceTaggingWidget::Private { public: - Nepomuk::Resource resource; + QList<Nepomuk::Resource> resources; TagCloud* resourceTagCloud; TaggingPopup* popup; @@ -41,20 +49,25 @@ public: void showTaggingPopup( const QPoint& ); void _k_slotShowTaggingPopup(); + static QList<Tag> intersectTags( const QList<Resource>& ); }; void Nepomuk::ResourceTaggingWidget::Private::showTaggingPopup( const QPoint& pos ) { popup->showAllTags(); - resourceTags = resource.tags(); + resourceTags = intersectTags( resources ); Q_FOREACH( Tag tag, resourceTags ) { popup->setTagSelected( tag, true ); } popup->exec( pos ); - resource.setTags( resourceTags ); + foreach( Resource res, resources ) { + res.setTags( resourceTags ); + } + + resourceTagCloud->showTags( resourceTags ); } @@ -64,6 +77,26 @@ void Nepomuk::ResourceTaggingWidget::Private::_k_slotShowTaggingPopup() } +QList<Nepomuk::Tag> Nepomuk::ResourceTaggingWidget::Private::intersectTags( const QList<Resource>& res ) +{ + if ( res.count() == 1 ) { + return res.first().tags(); + } + else if ( !res.isEmpty() ) { + // determine the tags used for all resources + QSet<Tag> tags = QSet<Tag>::fromList( res.first().tags() ); + QList<Resource>::const_iterator it = res.begin(); + for ( ++it; it != res.end(); ++it ) { + tags.intersect( QSet<Tag>::fromList( (*it).tags() ) ); + } + return tags.values(); + } + else { + return QList<Tag>(); + } +} + + Nepomuk::ResourceTaggingWidget::ResourceTaggingWidget( QWidget* parent ) : QWidget( parent ), d( new Private() ) @@ -101,8 +134,14 @@ Nepomuk::ResourceTaggingWidget::~ResourceTaggingWidget() void Nepomuk::ResourceTaggingWidget::setResource( const Nepomuk::Resource& res ) { - d->resource = res; - d->resourceTagCloud->showResourceTags( res ); + setResources( QList<Resource>() << res ); +} + + +void Nepomuk::ResourceTaggingWidget::setResources( const QList<Nepomuk::Resource>& resList ) +{ + d->resources = resList; + d->resourceTagCloud->showTags( d->intersectTags( resList ) ); } @@ -122,7 +161,7 @@ void Nepomuk::ResourceTaggingWidget::slotTagAdded( const Nepomuk::Tag& tag ) { // assign it right away d->resourceTags.append( tag ); - d->resource.addTag( tag ); +// d->resource.addTag( tag ); } diff --git a/src/tagcloud/resourcetaggingwidget.h b/src/tagcloud/resourcetaggingwidget.h index a75746348..692b2e207 100644 --- a/src/tagcloud/resourcetaggingwidget.h +++ b/src/tagcloud/resourcetaggingwidget.h @@ -41,6 +41,7 @@ namespace Nepomuk { public Q_SLOTS: void setResource( const Nepomuk::Resource& ); + void setResources( const QList<Nepomuk::Resource>& ); private Q_SLOTS: void slotTagToggled( const Nepomuk::Tag& tag, bool enabled ); |
