#include <config-nepomuk.h>
#include <klocale.h>
-#include <KDebug>
#include <KMessageBox>
#include <QtCore/QEvent>
{
public:
#ifdef HAVE_NEPOMUK
- void loadComment(const QString& comment);
-
- CommentWidget* editComment;
+ CommentWidget* commentWidget;
KRatingWidget* ratingWidget;
Nepomuk::ResourceTaggingWidget* tagWidget;
{
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;
};
#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()
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 );
{
#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);
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;
void MetaDataWidget::setCommentVisible(bool visible)
{
#ifdef HAVE_NEPOMUK
- d->editComment->setVisible(visible);
+ d->commentWidget->setVisible(visible);
#else
Q_UNUSED(visible);
#endif
bool MetaDataWidget::isCommentVisible() const
{
#ifdef HAVE_NEPOMUK
- return d->editComment->isVisible();
+ return d->commentWidget->isVisible();
#else
return false;
#endif
void MetaDataWidget::setFile(const KUrl& url)
{
- kDebug() << url;
KUrl::List urls;
urls.append( url );
setFiles( urls );
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
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
#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
}