]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/tagcloud/resourcetaggingwidget.cpp
use a smaller step size when using the scroll wheel
[dolphin.git] / src / tagcloud / resourcetaggingwidget.cpp
index e7d6dfa787bed1be9a80960fe03912b0baaac988..1e3fffe8f6b5172379b02b33b7a4a4ba43c8fdba 100644 (file)
 #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 );
 }
 
 
@@ -66,17 +83,46 @@ void Nepomuk::ResourceTaggingWidget::Private::_k_slotShowTaggingPopup()
 }
 
 
+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;
@@ -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<Resource>() << res );
+}
+
+
+void Nepomuk::ResourceTaggingWidget::setResources( const QList<Nepomuk::Resource>& 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"