mirror of
https://github.com/monero-project/monero-gui.git
synced 2024-12-23 12:09:57 +00:00
OSHelper: file preselection support (Windows and Mac)
Co-authored-by: selsta <selsta@sent.at>
This commit is contained in:
parent
ba24fd79bb
commit
088d32e712
3 changed files with 55 additions and 8 deletions
|
@ -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);
|
||||
|
|
|
@ -35,6 +35,7 @@ class MacOSHelper
|
|||
|
||||
public:
|
||||
static bool isCapsLock();
|
||||
static bool openFolderAndSelectItem(const QUrl &path);
|
||||
};
|
||||
|
||||
#endif //MACOSHELPER_H
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue