return folder;
}
+// static
+// Checks if this is the path of a folder in use.
+std::shared_ptr<Folder> Folder::findByPath(const FilePath& path) {
+ std::lock_guard<std::mutex> lock{mutex_};
+ auto it = cache_.find(path);
+ if(it != cache_.end()) {
+ auto folder = it->second.lock();
+ if(folder) {
+ return folder;
+ }
+ }
+ return nullptr;
+}
+
bool Folder::makeDirectory(const char* /*name*/, GError** /*error*/) {
// TODO:
// FIXME: what the API is used for in the original libfm C API?
return files_.empty();
}
+bool Folder::hasFileMonitor() const {
+ return (dirMonitor_ != nullptr);
+}
+
FileInfoList Folder::files() const {
FileInfoList ret;
ret.reserve(files_.size());
static std::shared_ptr<Folder> fromPath(const FilePath& path);
+ static std::shared_ptr<Folder> findByPath(const FilePath& path);
+
bool makeDirectory(const char* name, GError** error);
void queryFilesystemInfo();
bool isEmpty() const;
+ bool hasFileMonitor() const;
+
FileInfoList files() const;
const FilePath& path() const;
}
Q_EMIT finished();
+ bool tryReload = true;
+
// special handling for trash job
if(type_ == Trash && !job_->isCancelled()) {
auto trashJob = static_cast<Fm::TrashJob*>(job_);
"Do you want to delete them instead?")) == QMessageBox::Yes) {
deleteFiles(std::move(unsupportedFiles), false);
}
+ tryReload = false;
+ }
+ }
+
+ // reload the containing folder if it is in use but does not have a file monitor
+ if(tryReload) {
+ if(!srcPaths_.empty() && (type_ == Trash || type_ == Delete || type_ == Move)) {
+ auto parent_path = srcPaths_[0].parent();
+ if(parent_path != destPath_) { // otherwise, it will be done below
+ auto folder = Fm::Folder::findByPath(parent_path);
+ if(folder && folder->isValid() && folder->isLoaded() && !folder->hasFileMonitor()) {
+ folder->reload();
+ }
+ }
+ }
+ if(destPath_) {
+ auto folder = Fm::Folder::findByPath(destPath_);
+ if(folder && folder->isValid() && folder->isLoaded() && !folder->hasFileMonitor()) {
+ folder->reload();
+ }
}
}
}
bool changeFileName(const Fm::FilePath& filePath, const QString& newName, QWidget* parent, bool showMessage) {
- auto dest = filePath.parent().child(newName.toLocal8Bit().constData());
+ auto parent_path = filePath.parent();
+ auto dest = parent_path.child(newName.toLocal8Bit().constData());
Fm::GErrorPtr err;
if(!g_file_move(filePath.gfile().get(), dest.gfile().get(),
GFileCopyFlags(G_FILE_COPY_ALL_METADATA |
}
return false;
}
+
+ // reload the containing folder if it is in use but does not have a file monitor
+ auto folder = Fm::Folder::findByPath(parent_path);
+ if(folder && folder->isValid() && folder->isLoaded() && !folder->hasFileMonitor()) {
+ folder->reload();
+ }
+
return true;
}
QMessageBox::critical(parent ? parent->window() : nullptr, QObject::tr("Error"), err.message());
}
+ else { // reload the containing folder if it is in use but does not have a file monitor
+ auto folder = Fm::Folder::findByPath(parentDir);
+ if(folder && folder->isValid() && folder->isLoaded() && !folder->hasFileMonitor()) {
+ folder->reload();
+ }
+ }
}
uid_t uidFromName(QString name) {