X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/d3a04321886e8ca39ab91a647a9547ebe4d52154..13b2fc55704fbc734cd4f9cbae56cfc2ef3ec0ce:/src/tagcloud/resourcetaggingwidget.cpp diff --git a/src/tagcloud/resourcetaggingwidget.cpp b/src/tagcloud/resourcetaggingwidget.cpp index e7d6dfa78..1ac829952 100644 --- a/src/tagcloud/resourcetaggingwidget.cpp +++ b/src/tagcloud/resourcetaggingwidget.cpp @@ -24,39 +24,50 @@ #include #include #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; QList resourceTags; - QAction* changeTagsAction; - 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(); - Q_FOREACH( Tag tag, resourceTags ) { + resourceTags = intersectTags( resources ); + Q_FOREACH( const Tag &tag, resourceTags ) { popup->setTagSelected( tag, true ); } popup->exec( pos ); - resource.setTags( resourceTags ); + foreach( Resource res, resources ) { + res.setTags( resourceTags ); + } + + resourceTagCloud->showTags( resourceTags ); } @@ -66,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() ) @@ -74,9 +105,10 @@ Nepomuk::ResourceTaggingWidget::ResourceTaggingWidget( QWidget* parent ) layout->setMargin( 0 ); d->resourceTagCloud = new TagCloud( this ); layout->addWidget( d->resourceTagCloud ); - - d->changeTagsAction = new QAction( i18n( "Change tags..." ), this ); - d->resourceTagCloud->setCustomNewTagAction( d->changeTagsAction ); + QLabel* changeTagsLabel = new QLabel( "

" + i18nc( "@label", "Change tags..." ) + "", this ); + connect( changeTagsLabel, SIGNAL( linkActivated( const QString ) ), + this, SLOT( _k_slotShowTaggingPopup() ) ); + layout->addWidget( changeTagsLabel ); // the popup tag cloud d->popup = new TaggingPopup; @@ -88,9 +120,6 @@ Nepomuk::ResourceTaggingWidget::ResourceTaggingWidget( QWidget* parent ) connect( d->popup, SIGNAL( tagAdded( const Nepomuk::Tag& ) ), this, SLOT( slotTagAdded( const Nepomuk::Tag& ) ) ); - connect( d->changeTagsAction, SIGNAL( activated() ), - this, SLOT( _k_slotShowTaggingPopup() ) ); - connect( d->resourceTagCloud, SIGNAL( tagClicked( const Nepomuk::Tag& ) ), this, SIGNAL( tagClicked( const Nepomuk::Tag& ) ) ); } @@ -105,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 ) ); } @@ -126,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 ); }