]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/metadatawidget.cpp
1) Make sure that size qprogressbar is really updated after each change
[dolphin.git] / src / metadatawidget.cpp
index 35f24bea5264cedc59c07ab54caa618a3c06fa37..9567c0e8272f3e9d36e8b74311237b8a048cef2a 100644 (file)
  *   51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA            *
  ***************************************************************************/
 
-#include <config-kmetadata.h>
-
 #include "metadatawidget.h"
 
-#include <klocale.h>
+#include "commentwidget.h"
 
-#include <QLabel>
-#include <QGridLayout>
-#include <QTextEdit>
+#include <config-nepomuk.h>
 
-#ifdef HAVE_KMETADATA
-#include <kmetadatatagwidget.h>
-#include <kmetadata/resourcemanager.h>
-#include <kmetadata/file.h>
-#include <kratingwidget.h>
-#include <kmetadatatagwidget.h>
+#include <klocale.h>
+#include <KDebug>
+#include <KMessageBox>
+
+#include <QtCore/QEvent>
+#include <QtGui/QLabel>
+#include <QtGui/QGridLayout>
+#include <QtGui/QTextEdit>
+
+#ifdef HAVE_NEPOMUK
+#include "nepomukmassupdatejob.h"
+#include <nepomuk/kmetadatatagwidget.h>
+#include <nepomuk/resourcemanager.h>
+#include <nepomuk/resource.h>
+#include <nepomuk/variant.h>
+#include <nepomuk/kratingwidget.h>
+#include <Soprano/Vocabulary/Xesam>
+#include "tagcloud/resourcetaggingwidget.h"
 #endif
 
 
 bool MetaDataWidget::metaDataAvailable()
 {
-#ifdef HAVE_KMETADATA
-    return !Nepomuk::KMetaData::ResourceManager::instance()->init();
+#ifdef HAVE_NEPOMUK
+    return !Nepomuk::ResourceManager::instance()->init();
 #else
     return false;
 #endif
@@ -49,58 +57,47 @@ bool MetaDataWidget::metaDataAvailable()
 class MetaDataWidget::Private
 {
 public:
-#ifdef HAVE_KMETADATA
-    void loadComment( const QString& comment ) {
-        editComment->blockSignals( true );
-        if ( comment.isEmpty() ) {
-            editComment->setFontItalic( true );
-            editComment->setText( i18n( "Click to add comment..." ) );
-        }
-        else {
-            editComment->setFontItalic( false );
-            editComment->setText( comment );
-        }
-        editComment->blockSignals( false );
-    }
-
-    KUrl fileUrl;
+#ifdef HAVE_NEPOMUK
+    void loadComment(const QString& comment);
 
-    Nepomuk::KMetaData::File file;
+    QMap<KUrl, Nepomuk::Resource> files;
 
-    QTextEdit* editComment;
+    CommentWidget* editComment;
     KRatingWidget* ratingWidget;
-    Nepomuk::KMetaData::TagWidget* tagWidget;
+    Nepomuk::ResourceTaggingWidget* tagWidget;
 #endif
 };
 
-
-MetaDataWidget::MetaDataWidget( QWidget* parent )
-    : QWidget( parent )
+#ifdef HAVE_NEPOMUK
+void MetaDataWidget::Private::loadComment(const QString& comment)
 {
-    d = new Private;
+    editComment->setComment( comment );
+}
+#endif
 
-#ifdef HAVE_KMETADATA
-    d->editComment = new QTextEdit( this );
-    d->tagWidget = new Nepomuk::KMetaData::TagWidget( this );
-    d->ratingWidget = new KRatingWidget( this );
-    connect( d->ratingWidget, SIGNAL(ratingChanged(int)), this, SLOT(slotRatingChanged(int)) );
-    connect( d->editComment, SIGNAL( textChanged() ), this, SLOT( slotCommentChanged() ) );
 
-    QVBoxLayout* lay = new QVBoxLayout( this );
-    lay->setMargin( 0 );
+MetaDataWidget::MetaDataWidget(QWidget* parent) :
+    QWidget(parent)
+{
+#ifdef HAVE_NEPOMUK
+    d = new Private;
+    d->editComment = new CommentWidget(this);
+    d->editComment->setFocusPolicy(Qt::ClickFocus);
+    d->ratingWidget = new KRatingWidget(this);
+    d->ratingWidget->setAlignment( Qt::AlignCenter );
+    d->tagWidget = new Nepomuk::ResourceTaggingWidget(this);
+    connect(d->ratingWidget, SIGNAL(ratingChanged(unsigned int)), this, SLOT(slotRatingChanged(unsigned int)));
+    connect(d->editComment, SIGNAL(commentChanged(const QString&)), this, SLOT(slotCommentChanged(const QString&)));
+    connect( d->tagWidget, SIGNAL( tagClicked( const Nepomuk::Tag& ) ), this, SLOT( slotTagClicked( const Nepomuk::Tag& ) ) );
+
+    QVBoxLayout* lay = new QVBoxLayout(this);
+    lay->setMargin(0);
+    lay->addWidget(d->ratingWidget);
+    lay->addWidget(d->editComment);
     QHBoxLayout* hbox = new QHBoxLayout;
-    hbox->addWidget( new QLabel( i18n( "Rating:" ), this ) );
-    hbox->addStretch( 1 );
-    hbox->addWidget( d->ratingWidget );
-    lay->addLayout( hbox );
-    lay->addWidget( d->editComment );
-    hbox = new QHBoxLayout;
-    hbox->addWidget( new QLabel( i18n( "Tags:" ), this ) );
-    hbox->addWidget( d->tagWidget, 1 );
-    lay->addLayout( hbox );
-
-    d->editComment->installEventFilter( this );
-    d->editComment->viewport()->installEventFilter( this );
+    lay->addWidget( d->tagWidget );
+#else
+    d = 0;
 #endif
 }
 
@@ -111,61 +108,90 @@ MetaDataWidget::~MetaDataWidget()
 }
 
 
-void MetaDataWidget::setFile( const KUrl& url )
+void MetaDataWidget::setFile(const KUrl& url)
 {
-#ifdef HAVE_KMETADATA
-    d->fileUrl = url;
-    d->file = Nepomuk::KMetaData::File( url.url() );
-    d->file.setLocation( url.url() );
-    d->ratingWidget->setRating( d->file.getRating() );
-    d->tagWidget->setTaggedResource( d->file );
-    d->loadComment( d->file.getComment() );
-#endif
+    kDebug() << url;
+    KUrl::List urls;
+    urls.append( url );
+    setFiles( urls );
 }
 
 
-void MetaDataWidget::setFiles( const KUrl::List urls )
+void MetaDataWidget::setFiles(const KUrl::List& urls)
 {
-    // FIXME: support multiple files
-    setFile( urls.first() );
+#ifdef HAVE_NEPOMUK
+    d->files.clear();
+    bool first = true;
+    QList<Nepomuk::Resource> fileRes;
+    Q_FOREACH( const KUrl &url, urls ) {
+        Nepomuk::Resource file( url, Soprano::Vocabulary::Xesam::File() );
+        d->files.insert( url, file );
+        fileRes.append( file );
+
+        if ( !first &&
+             d->ratingWidget->rating() != file.rating() ) {
+            d->ratingWidget->setRating( 0 ); // reset rating
+        }
+        else if ( first ) {
+            d->ratingWidget->setRating( (qint32)(file.rating()) );
+        }
+
+        if ( !first &&
+             d->editComment->comment() != file.description() ) {
+            d->loadComment( QString() );
+        }
+        else if ( first ) {
+            d->loadComment( file.description() );
+        }
+        first = false;
+    }
+    d->tagWidget->setResources( fileRes );
+#endif
 }
 
 
-void MetaDataWidget::slotCommentChanged()
+void MetaDataWidget::slotCommentChanged( const QString& s )
 {
-#ifdef HAVE_KMETADATA
-    d->file.setComment( d->editComment->toPlainText() );
+#ifdef HAVE_NEPOMUK
+    Nepomuk::MassUpdateJob* job = Nepomuk::MassUpdateJob::commentResources( d->files.values(), s );
+    connect( job, SIGNAL( result( KJob* ) ),
+             this, SLOT( metadataUpdateDone() ) );
+    setEnabled( false ); // no updates during execution
+    job->start();
 #endif
 }
 
 
-void MetaDataWidget::slotRatingChanged( int r )
+void MetaDataWidget::slotRatingChanged(unsigned int rating)
 {
-#ifdef HAVE_KMETADATA
-    d->file.setRating( r );
+#ifdef HAVE_NEPOMUK
+    Nepomuk::MassUpdateJob* job = Nepomuk::MassUpdateJob::rateResources( d->files.values(), rating );
+    connect( job, SIGNAL( result( KJob* ) ),
+             this, SLOT( metadataUpdateDone() ) );
+    setEnabled( false ); // no updates during execution
+    job->start();
 #endif
 }
 
 
-bool MetaDataWidget::eventFilter( QObject* obj, QEvent* event )
+void MetaDataWidget::metadataUpdateDone()
 {
-#ifdef HAVE_KMETADATA
-    if (  obj == d->editComment->viewport()
-          || obj == d->editComment ) {
-        if ( event->type() == QEvent::FocusOut ) {
-            // make sure the info text is displayed again
-            d->loadComment( d->editComment->toPlainText() );
-        }
-        else if ( event->type() == QEvent::FocusIn ) {
-            qDebug() << "JKGHLKGLKHÖLKJHLÖ" << endl;
-            d->editComment->setFontItalic( false );
-            if ( d->file.getComment().isEmpty() )
-                d->editComment->setText( QString() );
-        }
-    }
-#endif
+    setEnabled( true );
+}
+
+
+bool MetaDataWidget::eventFilter(QObject* obj, QEvent* event)
+{
+    return QWidget::eventFilter(obj, event);
+}
+
 
-    return QWidget::eventFilter( obj, event );
+void MetaDataWidget::slotTagClicked( const Nepomuk::Tag& tag )
+{
+    // FIXME
+#ifdef HAVE_NEPOMUK
+    KMessageBox::information( this, "FIXME: connect me to the dolphinmodel: tags:/" + tag.genericLabel() );
+#endif
 }
 
 #include "metadatawidget.moc"