diff options
Diffstat (limited to 'src/main')
| -rw-r--r-- | src/main/oshelper.cpp | 54 |
1 files changed, 46 insertions, 8 deletions
diff --git a/src/main/oshelper.cpp b/src/main/oshelper.cpp index 313fd233..4402db6d 100644 --- a/src/main/oshelper.cpp +++ b/src/main/oshelper.cpp @@ -37,7 +37,8 @@ #ifdef Q_OS_MAC #include "qt/macoshelper.h" #endif -#ifdef Q_OS_WIN32 +#ifdef Q_OS_WIN +#include <Shlobj.h> #include <windows.h> #endif #if defined(Q_OS_LINUX) && !defined(Q_OS_ANDROID) @@ -49,6 +50,33 @@ // #undef those Xlib #defines that conflict with QEvent::Type enum #endif +#if defined(Q_OS_WIN) +bool openFolderAndSelectItem(const QString &filePath) +{ + struct scope { + ~scope() { ::CoTaskMemFree(pidl); } + PIDLIST_ABSOLUTE pidl = nullptr; + } scope; + + SFGAOF flags; + HRESULT result = ::SHParseDisplayName(filePath.toStdWString().c_str(), nullptr, &scope.pidl, 0, &flags); + if (result != S_OK) + { + qWarning() << "SHParseDisplayName failed" << result << "file path" << filePath; + return false; + } + + result = ::SHOpenFolderAndSelectItems(scope.pidl, 0, nullptr, 0); + if (result != S_OK) + { + qWarning() << "SHOpenFolderAndSelectItems failed" << result << "file path" << filePath; + return false; + } + + return true; +} +#endif + OSHelper::OSHelper(QObject *parent) : QObject(parent) { @@ -56,15 +84,25 @@ OSHelper::OSHelper(QObject *parent) : QObject(parent) bool OSHelper::openContainingFolder(const QString &filePath) const { - QUrl prepared; - prepared.setScheme("file"); - prepared.setPath(QFileInfo(filePath).absolutePath()); - if (!prepared.isValid()) +#if defined(Q_OS_WIN) + if (openFolderAndSelectItem(QDir::toNativeSeparators(filePath))) + { + return true; + } +#elif defined(Q_OS_MAC) + if (MacOSHelper::openFolderAndSelectItem(QUrl::fromLocalFile(filePath))) + { + return true; + } +#endif + + QUrl url = QUrl::fromLocalFile(QFileInfo(filePath).absolutePath()); + if (!url.isValid()) { - qWarning() << "malformed file path" << filePath << prepared.errorString(); + qWarning() << "Malformed file path" << filePath << url.errorString(); return false; } - return QDesktopServices::openUrl(prepared); + return QDesktopServices::openUrl(url); } QString OSHelper::temporaryFilename() const @@ -92,7 +130,7 @@ bool OSHelper::removeTemporaryWallet(const QString &fileName) const bool OSHelper::isCapsLock() const { // platform dependent method of determining if CAPS LOCK is on -#if defined(Q_OS_WIN32) // MS Windows version +#if defined(Q_OS_WIN) // MS Windows version return GetKeyState(VK_CAPITAL) == 1; #elif defined(Q_OS_LINUX) && !defined(Q_OS_ANDROID) // X11 version Display * d = XOpenDisplay((char*)0); |
