From 37441945c43c2b20b5a79a9675ac0fc1be1220ff Mon Sep 17 00:00:00 2001 From: Juraj Oravec Date: Tue, 1 Oct 2024 23:33:15 +0200 Subject: [PATCH] Use KIO::OpenFileManagerWindowJob to open folder BUG: 460997 FIXED-IN: 24.12.0 Signed-off-by: Juraj Oravec --- CMakeLists.txt | 9 +++++---- src/lib/CMakeLists.txt | 1 + src/lib/downloads/downloaditem.cpp | 20 ++++---------------- src/lib/tools/qztools.cpp | 30 ++++++++++++++++++++++++++++++ src/lib/tools/qztools.h | 2 ++ 5 files changed, 42 insertions(+), 20 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 93331fcfa..32b356c1e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -107,6 +107,9 @@ if (EXISTS "${CMAKE_SOURCE_DIR}/po") find_package(KF6I18n REQUIRED) endif() +# Mandatory: KIO +find_package(KF6KIO ${KF_MIN_VERSION} REQUIRED) + # Optional: GnomeKeyring find_package(PkgConfig) if (PKG_CONFIG_FOUND) @@ -116,11 +119,9 @@ if (PKG_CONFIG_FOUND) endif() endif() -# Optional: KWallet, KIO, KCrash, KCoreAddons +# Optional: KWallet, KCrash, KCoreAddons find_package(KF6Wallet ${KF_MIN_VERSION} CONFIG) set_package_properties(KF6Wallet PROPERTIES DESCRIPTION "KDE Frameworks Integration plugin" TYPE OPTIONAL) -find_package(KF6KIO ${KF_MIN_VERSION} CONFIG) -set_package_properties(KF6KIO PROPERTIES DESCRIPTION "KDE Frameworks Integration plugin" TYPE OPTIONAL) find_package(KF6Crash ${KF_MIN_VERSION} CONFIG) set_package_properties(KF6Crash PROPERTIES DESCRIPTION "KDE Frameworks Integration plugin" TYPE OPTIONAL) find_package(KF6CoreAddons ${KF_MIN_VERSION} CONFIG) @@ -129,7 +130,7 @@ find_package(KF6Purpose ${KF_MIN_VERSION} CONFIG) set_package_properties(KF6Purpose PROPERTIES DESCRIPTION "KDE Frameworks Integration plugin" TYPE OPTIONAL) find_package(KF6JobWidgets ${KF_MIN_VERSION} CONFIG) set_package_properties(KF6JobWidgets PROPERTIES DESCRIPTION "KDE Frameworks Integration plugin" TYPE OPTIONAL) -if (KF6Wallet_FOUND AND KF6KIO_FOUND AND KF6Crash_FOUND AND KF6CoreAddons_FOUND AND KF6Purpose_FOUND AND KF6JobWidgets_FOUND) +if (KF6Wallet_FOUND AND KF6Crash_FOUND AND KF6CoreAddons_FOUND AND KF6Purpose_FOUND AND KF6JobWidgets_FOUND) set(ENABLE_KDE_FRAMEWORKS_INTEGRATION_PLUGIN TRUE) endif() diff --git a/src/lib/CMakeLists.txt b/src/lib/CMakeLists.txt index b484e940d..19d6d410c 100644 --- a/src/lib/CMakeLists.txt +++ b/src/lib/CMakeLists.txt @@ -603,6 +603,7 @@ target_link_libraries(FalkonPrivate Qt6::WebChannel Qt6::Core5Compat KF6::Archive + KF6::KIOGui ${OPENSSL_CRYPTO_LIBRARY} ) diff --git a/src/lib/downloads/downloaditem.cpp b/src/lib/downloads/downloaditem.cpp index 126740fab..c018c1bf6 100644 --- a/src/lib/downloads/downloaditem.cpp +++ b/src/lib/downloads/downloaditem.cpp @@ -39,11 +39,6 @@ #include #include -#ifdef Q_OS_WIN -#include "Shlwapi.h" -#include "shellapi.h" -#endif - //#define DOWNMANAGER_DEBUG DownloadItem::DownloadItem(QListWidgetItem *item, QWebEngineDownloadRequest* downloadItem, const QString &path, const QString &fileName, bool openFile, DownloadManager* manager) @@ -354,19 +349,12 @@ void DownloadItem::openFile() void DownloadItem::openFolder() { -#ifdef Q_OS_WIN - QString winFileName = QSL("%1/%2").arg(m_path, m_fileName); - + QString fileName = m_fileName; if (m_downloading) { - winFileName.append(QSL(".download")); + fileName.append(QSL(".download")); } - - winFileName.replace(QLatin1Char('/'), QSL("\\")); - QString shExArg = QSL("/e,/select,\"") + winFileName + QSL("\""); - ShellExecute(NULL, NULL, TEXT("explorer.exe"), shExArg.toStdWString().c_str(), NULL, SW_SHOW); -#else - QDesktopServices::openUrl(QUrl::fromLocalFile(m_path)); -#endif + QFileInfo info(m_path, fileName); + QzTools::openFolder({QUrl::fromLocalFile(info.absoluteFilePath())}); } QUrl DownloadItem::url() const diff --git a/src/lib/tools/qztools.cpp b/src/lib/tools/qztools.cpp index 6d85dd49c..d2acc011d 100644 --- a/src/lib/tools/qztools.cpp +++ b/src/lib/tools/qztools.cpp @@ -45,6 +45,8 @@ #include #include +#include + #ifdef QZ_WS_X11 #include #endif @@ -1037,3 +1039,31 @@ void QzTools::paintDropIndicator(QWidget *widget, const QRect &r) p.drawLine(x + i, r.top(), x + i, r.bottom()); } } + +void QzTools::openFolder(const QList &urls) +{ + /* Filter the URL list for existing files, otherwise it will cause crash */ + QList validUrls; + for (const QUrl &url : urls) { + if (QFileInfo::exists(url.toLocalFile())) { + validUrls.append(url); + } + else { + qWarning() << "OpenFolder Filtered:" << url; + } + } + + if (validUrls.isEmpty()) { + return; + } + + auto *job = new KIO::OpenFileManagerWindowJob(); + job->setHighlightUrls(validUrls); + job->start(); + + QObject::connect(job, &KJob::result, job, [&](KJob *job) { + if (job->error() != 0) { + qWarning() << "OpenFileManagerWindowJob:" << job->errorString(); + } + }); +} diff --git a/src/lib/tools/qztools.h b/src/lib/tools/qztools.h index 9dd18dbbc..a2f292436 100644 --- a/src/lib/tools/qztools.h +++ b/src/lib/tools/qztools.h @@ -98,6 +98,8 @@ public: } static void paintDropIndicator(QWidget *widget, const QRect &r); + + static void openFolder(const QList &urls); }; #endif // QZTOOLS_H