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
|
#ifdef Q_OS_MAC
|
||||||
#include "qt/macoshelper.h"
|
#include "qt/macoshelper.h"
|
||||||
#endif
|
#endif
|
||||||
#ifdef Q_OS_WIN32
|
#ifdef Q_OS_WIN
|
||||||
|
#include <Shlobj.h>
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#endif
|
#endif
|
||||||
#if defined(Q_OS_LINUX) && !defined(Q_OS_ANDROID)
|
#if defined(Q_OS_LINUX) && !defined(Q_OS_ANDROID)
|
||||||
|
@ -49,6 +50,33 @@
|
||||||
// #undef those Xlib #defines that conflict with QEvent::Type enum
|
// #undef those Xlib #defines that conflict with QEvent::Type enum
|
||||||
#endif
|
#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)
|
OSHelper::OSHelper(QObject *parent) : QObject(parent)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -56,15 +84,25 @@ OSHelper::OSHelper(QObject *parent) : QObject(parent)
|
||||||
|
|
||||||
bool OSHelper::openContainingFolder(const QString &filePath) const
|
bool OSHelper::openContainingFolder(const QString &filePath) const
|
||||||
{
|
{
|
||||||
QUrl prepared;
|
#if defined(Q_OS_WIN)
|
||||||
prepared.setScheme("file");
|
if (openFolderAndSelectItem(QDir::toNativeSeparators(filePath)))
|
||||||
prepared.setPath(QFileInfo(filePath).absolutePath());
|
|
||||||
if (!prepared.isValid())
|
|
||||||
{
|
{
|
||||||
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 false;
|
||||||
}
|
}
|
||||||
return QDesktopServices::openUrl(prepared);
|
return QDesktopServices::openUrl(url);
|
||||||
}
|
}
|
||||||
|
|
||||||
QString OSHelper::temporaryFilename() const
|
QString OSHelper::temporaryFilename() const
|
||||||
|
@ -92,7 +130,7 @@ bool OSHelper::removeTemporaryWallet(const QString &fileName) const
|
||||||
bool OSHelper::isCapsLock() const
|
bool OSHelper::isCapsLock() const
|
||||||
{
|
{
|
||||||
// platform dependent method of determining if CAPS LOCK is on
|
// 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;
|
return GetKeyState(VK_CAPITAL) == 1;
|
||||||
#elif defined(Q_OS_LINUX) && !defined(Q_OS_ANDROID) // X11 version
|
#elif defined(Q_OS_LINUX) && !defined(Q_OS_ANDROID) // X11 version
|
||||||
Display * d = XOpenDisplay((char*)0);
|
Display * d = XOpenDisplay((char*)0);
|
||||||
|
|
|
@ -35,6 +35,7 @@ class MacOSHelper
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static bool isCapsLock();
|
static bool isCapsLock();
|
||||||
|
static bool openFolderAndSelectItem(const QUrl &path);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif //MACOSHELPER_H
|
#endif //MACOSHELPER_H
|
||||||
|
|
|
@ -47,3 +47,11 @@ bool MacOSHelper::isCapsLock()
|
||||||
return (flags & NSAlphaShiftKeyMask);
|
return (flags & NSAlphaShiftKeyMask);
|
||||||
#endif
|
#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