#include "resourcetaggingwidget.h"
#include "tagcloud.h"
#include "taggingpopup.h"
+#include "../nepomukmassupdatejob.h"
#include <QtGui/QVBoxLayout>
#include <QtGui/QContextMenuEvent>
#include <QtGui/QCursor>
-#include <QtGui/QAction>
+#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;
QList<Tag> resourceTags;
- QAction* changeTagsAction;
-
void showTaggingPopup( const QPoint& );
void _k_slotShowTaggingPopup();
+ void _k_metadataUpdateDone();
+ static QList<Tag> intersectTags( const QList<Resource>& );
+
+ 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 );
}
}
+void Nepomuk::ResourceTaggingWidget::Private::_k_metadataUpdateDone()
+{
+ q->setEnabled( true );
+}
+
+
+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() )
{
+ 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( "<p align=center><a style=\"font-size:small;\" href=\"dummy\">" + i18nc( "@label", "Change Tags..." ) + "</a>", this );
+ connect( changeTagsLabel, SIGNAL( linkActivated( const QString ) ),
+ this, SLOT( _k_slotShowTaggingPopup() ) );
+ layout->addWidget( changeTagsLabel );
// the popup tag cloud
d->popup = new TaggingPopup;
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& ) ) );
}
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 ) );
}
{
// assign it right away
d->resourceTags.append( tag );
- d->resource.addTag( tag );
+// d->resource.addTag( tag );
}
d->showTaggingPopup( e->globalPos() );
}
+
+void Nepomuk::ResourceTaggingWidget::showTagPopup( const QPoint& pos )
+{
+ d->showTaggingPopup( pos );
+}
+
#include "resourcetaggingwidget.moc"