summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArno <arno@disconnect.de>2015-08-13 13:51:13 +0200
committerArno <arno@disconnect.de>2015-08-13 13:51:13 +0200
commite223bc238ea3e2dbeaabcc4c9218558d26273de5 (patch)
tree6597a2126b007f3dcbec993072f5984fbe7198b0
parentdc2927587eb758754babf98adb764c3bbdccd024 (diff)
downloadSheMov-e223bc238ea3e2dbeaabcc4c9218558d26273de5.tar.gz
SheMov-e223bc238ea3e2dbeaabcc4c9218558d26273de5.tar.bz2
SheMov-e223bc238ea3e2dbeaabcc4c9218558d26273de5.zip
Fix crash in deleteFiles
This was a hard one. SmDirWatcher raced against the model. Stop and quit the watcher before actually deleting files. That can take a while if file operations are in progress, so show the busy cursor.
-rw-r--r--filesystemwidget.cpp11
-rw-r--r--smdirmodel.cpp11
-rw-r--r--smdirmodel.h9
3 files changed, 29 insertions, 2 deletions
diff --git a/filesystemwidget.cpp b/filesystemwidget.cpp
index 619944a..0e6e591 100644
--- a/filesystemwidget.cpp
+++ b/filesystemwidget.cpp
@@ -260,7 +260,11 @@ void FilesystemWidget::goBack(){
}
void FilesystemWidget::deleteFiles(){
+ qApp->setOverrideCursor(Qt::WaitCursor);
TimerHandler h(mFileModel->refreshTimer());
+ WatcherHandler wh(mFileModel->watcher());
+ qApp->processEvents();
+ qApp->restoreOverrideCursor();
QModelIndexList selected = mFileView->selectionModel()->selectedRows();
if(selected.isEmpty()){
return;
@@ -270,8 +274,11 @@ void FilesystemWidget::deleteFiles(){
int retval = QMessageBox::question(this, tr("Question"), message, QMessageBox::Yes | QMessageBox::No);
if(retval == QMessageBox::Yes){
foreach(QModelIndex idx, selected){
- QFileInfo fi(idx.data(SmDirModel::FullPathRole).toString());
- deleteRecursive(fi);
+ QModelIndex real = mFileProxy->mapToSource(idx);
+ if(real.isValid()){
+ QFileInfo fi(real.data(SmDirModel::FullPathRole).toString());
+ deleteRecursive(fi);
+ }
}
}
}
diff --git a/smdirmodel.cpp b/smdirmodel.cpp
index 32bc241..b9394d8 100644
--- a/smdirmodel.cpp
+++ b/smdirmodel.cpp
@@ -215,3 +215,14 @@ TimerHandler::~TimerHandler(){
mTimer->start();
}
}
+
+WatcherHandler::WatcherHandler(SmDirWatcher *watcher) : mWatcher(watcher){
+ mWatcher->quit();
+ mWatcher->wait();
+ mWatcher->blockSignals(true);
+}
+
+WatcherHandler::~WatcherHandler(){
+ mWatcher->blockSignals(false);
+ mWatcher->start();
+}
diff --git a/smdirmodel.h b/smdirmodel.h
index a775553..f8e647b 100644
--- a/smdirmodel.h
+++ b/smdirmodel.h
@@ -71,4 +71,13 @@ class TimerHandler {
QTimer *mTimer;
};
+class WatcherHandler {
+ public:
+ WatcherHandler(SmDirWatcher *watcher);
+ ~WatcherHandler();
+
+ private:
+ SmDirWatcher *mWatcher;
+};
+
#endif // SMDIRMODEL_H