]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/panels/information/metadatawidget.cpp
Simplify how Nepomuk comments can be edited by the user:
[dolphin.git] / src / panels / information / metadatawidget.cpp
index c7f374093ad9364ac29dc40fd82d1c84e5fdfd5f..6a2f6073a42aa37e0addd68657029b7fbbdaa624 100644 (file)
@@ -24,7 +24,6 @@
 #include <config-nepomuk.h>
 
 #include <klocale.h>
-#include <KDebug>
 #include <KMessageBox>
 
 #include <QtCore/QEvent>
@@ -61,9 +60,7 @@ class MetaDataWidget::Private
 {
 public:
 #ifdef HAVE_NEPOMUK
-    void loadComment(const QString& comment);
-
-    CommentWidget* editComment;
+    CommentWidget* commentWidget;
     KRatingWidget* ratingWidget;
     Nepomuk::ResourceTaggingWidget* tagWidget;
 
@@ -88,7 +85,7 @@ public:
     public:
         LoadFilesThread(SharedData* sharedData, QMutex* mutex);
         ~LoadFilesThread();
-        void setFiles(const KUrl::List& urls);
+        void loadFiles(const KUrl::List& urls);
         virtual void run();
 
     private:
@@ -103,17 +100,14 @@ public:
 };
 
 #ifdef HAVE_NEPOMUK
-void MetaDataWidget::Private::loadComment(const QString& comment)
-{
-    editComment->setComment( comment );
-}
 
 MetaDataWidget::Private::LoadFilesThread::LoadFilesThread(
     MetaDataWidget::Private::SharedData* sharedData,
     QMutex* mutex) :
     m_sharedData(sharedData),
     m_mutex(mutex),
-    m_urls()
+    m_urls(),
+    m_canceled(false)
 {
 }
 
@@ -125,10 +119,12 @@ MetaDataWidget::Private::LoadFilesThread::~LoadFilesThread()
     wait();
 }
 
-void MetaDataWidget::Private::LoadFilesThread::setFiles(const KUrl::List& urls)
+void MetaDataWidget::Private::LoadFilesThread::loadFiles(const KUrl::List& urls)
 {
     QMutexLocker locker( m_mutex );
     m_urls = urls;
+    m_canceled = false;
+    start();
 }
 
 void MetaDataWidget::Private::LoadFilesThread::run()
@@ -178,14 +174,14 @@ MetaDataWidget::MetaDataWidget(QWidget* parent) :
 {
 #ifdef HAVE_NEPOMUK
     d = new Private;
-    d->editComment = new CommentWidget(this);
-    d->editComment->setFocusPolicy(Qt::ClickFocus);
+    d->commentWidget = new CommentWidget(this);
+    d->commentWidget->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& ) ) );
+    connect(d->commentWidget, SIGNAL(commentChanged(const QString&)), this, SLOT(slotCommentChanged(const QString&)));
+    connect(d->tagWidget, SIGNAL(tagClicked(const Nepomuk::Tag&)), this, SLOT(slotTagClicked( const Nepomuk::Tag&)));
 
     d->sharedData.rating = 0;
     d->loadFilesThread = new Private::LoadFilesThread(&d->sharedData, &d->mutex);
@@ -194,7 +190,7 @@ MetaDataWidget::MetaDataWidget(QWidget* parent) :
     QVBoxLayout* lay = new QVBoxLayout(this);
     lay->setMargin(0);
     lay->addWidget(d->ratingWidget);
-    lay->addWidget(d->editComment);
+    lay->addWidget(d->commentWidget);
     lay->addWidget( d->tagWidget );
 #else
     d = 0;
@@ -233,7 +229,7 @@ bool MetaDataWidget::isRatingVisible() const
 void MetaDataWidget::setCommentVisible(bool visible)
 {
 #ifdef HAVE_NEPOMUK
-    d->editComment->setVisible(visible);
+    d->commentWidget->setVisible(visible);
 #else
     Q_UNUSED(visible);
 #endif
@@ -243,7 +239,7 @@ void MetaDataWidget::setCommentVisible(bool visible)
 bool MetaDataWidget::isCommentVisible() const
 {
 #ifdef HAVE_NEPOMUK
-    return d->editComment->isVisible();
+    return d->commentWidget->isVisible();
 #else
     return false;
 #endif
@@ -272,7 +268,6 @@ bool MetaDataWidget::areTagsVisible() const
 
 void MetaDataWidget::setFile(const KUrl& url)
 {
-    kDebug() << url;
     KUrl::List urls;
     urls.append( url );
     setFiles( urls );
@@ -281,8 +276,14 @@ void MetaDataWidget::setFile(const KUrl& url)
 void MetaDataWidget::setFiles(const KUrl::List& urls)
 {
 #ifdef HAVE_NEPOMUK
-    d->loadFilesThread->setFiles( urls );
-    d->loadFilesThread->start();
+    // Assure that the currently edited text is stored before
+    // loading the meta data for new files.
+    const QString currentComment = d->commentWidget->editorText();
+    if ( currentComment != d->commentWidget->comment() ) {
+        slotCommentChanged( currentComment );
+    }
+
+    d->loadFilesThread->loadFiles( urls );
 #else
     Q_UNUSED( urls );
 #endif
@@ -292,12 +293,16 @@ void MetaDataWidget::setFiles(const KUrl::List& urls)
 void MetaDataWidget::slotCommentChanged( const QString& s )
 {
 #ifdef HAVE_NEPOMUK
+    disconnect(d->commentWidget, SIGNAL(commentChanged(const QString&)), this, SLOT(slotCommentChanged(const QString&)));
+
     QMutexLocker locker( &d->mutex );
     Nepomuk::MassUpdateJob* job = Nepomuk::MassUpdateJob::commentResources( d->sharedData.files.values(), s );
     connect( job, SIGNAL( result( KJob* ) ),
              this, SLOT( metadataUpdateDone() ) );
     setEnabled( false ); // no updates during execution
     job->start();
+
+    connect(d->commentWidget, SIGNAL(commentChanged(const QString&)), this, SLOT(slotCommentChanged(const QString&)));
 #else
     Q_UNUSED( s );
 #endif
@@ -344,7 +349,7 @@ void MetaDataWidget::slotLoadingFinished()
 #ifdef HAVE_NEPOMUK
     QMutexLocker locker( &d->mutex );
     d->ratingWidget->setRating( d->sharedData.rating );
-    d->loadComment( d->sharedData.comment );
+    d->commentWidget->setComment( d->sharedData.comment );
     d->tagWidget->setResources( d->sharedData.fileRes );
 #endif
 }