From: Sebastian Trueg Date: Tue, 1 Apr 2008 12:27:06 +0000 (+0000) Subject: Implemented tagging of multiple files at the same time. X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/commitdiff_plain/bd64849b07d79e799517acf1ed504532dd50e8cf 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 --- 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 #include #include +#include #include +namespace Nepomuk { + inline uint qHash( const Tag& res ) + { + return qHash( res.resourceUri().toString() ); + } +} + class Nepomuk::ResourceTaggingWidget::Private { public: - Nepomuk::Resource resource; + QList resources; TagCloud* resourceTagCloud; TaggingPopup* popup; @@ -41,20 +49,25 @@ public: void showTaggingPopup( const QPoint& ); void _k_slotShowTaggingPopup(); + static QList intersectTags( const QList& ); }; 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::ResourceTaggingWidget::Private::intersectTags( const QList& res ) +{ + if ( res.count() == 1 ) { + return res.first().tags(); + } + else if ( !res.isEmpty() ) { + // determine the tags used for all resources + QSet tags = QSet::fromList( res.first().tags() ); + QList::const_iterator it = res.begin(); + for ( ++it; it != res.end(); ++it ) { + tags.intersect( QSet::fromList( (*it).tags() ) ); + } + return tags.values(); + } + else { + return QList(); + } +} + + 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() << res ); +} + + +void Nepomuk::ResourceTaggingWidget::setResources( const QList& 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& ); private Q_SLOTS: void slotTagToggled( const Nepomuk::Tag& tag, bool enabled );