]> 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 a634f249cba03d7cfb14bd19346de42fdd237b38..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;
 
@@ -87,13 +84,15 @@ public:
     {
     public:
         LoadFilesThread(SharedData* sharedData, QMutex* mutex);
-        void setFiles(const KUrl::List& urls);
+        ~LoadFilesThread();
+        void loadFiles(const KUrl::List& urls);
         virtual void run();
 
     private:
         SharedData* m_sharedData;
         QMutex* m_mutex;
         KUrl::List m_urls;
+        bool m_canceled;
     };
 
     LoadFilesThread* loadFilesThread;
@@ -101,24 +100,31 @@ 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)
+{
+}
+
+MetaDataWidget::Private::LoadFilesThread::~LoadFilesThread()
 {
+    // this thread may very well be deleted during execution. We need
+    // to protect it from crashes here
+    m_canceled = true;
+    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()
@@ -133,6 +139,8 @@ void MetaDataWidget::Private::LoadFilesThread::run()
     unsigned int rating = 0;
     QString comment;
     Q_FOREACH( const KUrl &url, urls ) {
+        if ( m_canceled )
+            return;
         Nepomuk::Resource file( url, Soprano::Vocabulary::Xesam::File() );
         files.insert( url, file );
         fileRes.append( file );
@@ -166,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);
@@ -182,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;
@@ -221,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
@@ -231,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
@@ -260,7 +268,6 @@ bool MetaDataWidget::areTagsVisible() const
 
 void MetaDataWidget::setFile(const KUrl& url)
 {
-    kDebug() << url;
     KUrl::List urls;
     urls.append( url );
     setFiles( urls );
@@ -269,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
@@ -280,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
@@ -332,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
 }