OSHelper: file preselection support (Windows and Mac)

Co-authored-by: selsta <selsta@sent.at>
This commit is contained in:
xiphon 2019-12-12 01:21:49 +00:00
parent ba24fd79bb
commit 088d32e712
3 changed files with 55 additions and 8 deletions

View file

@ -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)))
{
qWarning() << "malformed file path" << filePath << prepared.errorString();
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 << 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);

View file

@ -35,6 +35,7 @@ class MacOSHelper
public:
static bool isCapsLock();
static bool openFolderAndSelectItem(const QUrl &path);
};
#endif //MACOSHELPER_H

View file

@ -47,3 +47,11 @@ bool MacOSHelper::isCapsLock()
return (flags & NSAlphaShiftKeyMask);
#endif
}
bool MacOSHelper::openFolderAndSelectItem(const QUrl &path)
{
NSURL *nspath = path.toNSURL();
NSArray *fileURLs = [NSArray arrayWithObjects:nspath, nil];
[[NSWorkspace sharedWorkspace] activateFileViewerSelectingURLs:fileURLs];
return true;
}