]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/tagcloud/resourcetaggingwidget.cpp
1) Make sure that size qprogressbar is really updated after each change
[dolphin.git] / src / tagcloud / resourcetaggingwidget.cpp
index e7d6dfa787bed1be9a80960fe03912b0baaac988..1ac829952210d878714abf74fc95ede554b19221 100644 (file)
 #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();
+    static QList<Tag> intersectTags( const QList<Resource>& );
 };
 
 
 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::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() )
@@ -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( "<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 +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<Resource>() << res );
+}
+
+
+void Nepomuk::ResourceTaggingWidget::setResources( const QList<Nepomuk::Resource>& 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 );
 }