X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/d3a04321886e8ca39ab91a647a9547ebe4d52154..148282e2d856b47ceb191eeef4c834118c8cdffd:/src/tagcloud/resourcetaggingwidget.cpp diff --git a/src/tagcloud/resourcetaggingwidget.cpp b/src/tagcloud/resourcetaggingwidget.cpp index e7d6dfa78..1e3fffe8f 100644 --- a/src/tagcloud/resourcetaggingwidget.cpp +++ b/src/tagcloud/resourcetaggingwidget.cpp @@ -20,43 +20,60 @@ #include "resourcetaggingwidget.h" #include "tagcloud.h" #include "taggingpopup.h" +#include "../nepomukmassupdatejob.h" #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(); + void _k_metadataUpdateDone(); + static QList intersectTags( const QList& ); + + ResourceTaggingWidget* q; }; 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 ); + MassUpdateJob* job = MassUpdateJob::tagResources( resources, resourceTags ); + connect( job, SIGNAL( result( KJob* ) ), + q, SLOT( _k_metadataUpdateDone() ) ); + q->setEnabled( false ); // no updates during execution + job->start(); + + resourceTagCloud->showTags( resourceTags ); } @@ -66,17 +83,46 @@ void Nepomuk::ResourceTaggingWidget::Private::_k_slotShowTaggingPopup() } +void Nepomuk::ResourceTaggingWidget::Private::_k_metadataUpdateDone() +{ + q->setEnabled( true ); +} + + +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() ) { + d->q = this; + QVBoxLayout* layout = new QVBoxLayout( this ); 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 +134,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 +148,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 +175,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 ); } @@ -135,4 +184,10 @@ void Nepomuk::ResourceTaggingWidget::contextMenuEvent( QContextMenuEvent* e ) d->showTaggingPopup( e->globalPos() ); } + +void Nepomuk::ResourceTaggingWidget::showTagPopup( const QPoint& pos ) +{ + d->showTaggingPopup( pos ); +} + #include "resourcetaggingwidget.moc"