aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorxiphon <xiphon@protonmail.com>2019-12-12 01:21:49 +0000
committerxiphon <xiphon@protonmail.com>2019-12-12 01:28:49 +0000
commit088d32e712a2c6e51a04f919c0ade96b643a49e3 (patch)
tree1a28761513ed460daeb77240f3d4391c8c0cfbf2 /src
parentba24fd79bb50ff82f0fd94a5c0bd06f2130f3bd7 (diff)
downloadmonzero-gui-088d32e712a2c6e51a04f919c0ade96b643a49e3.tar.gz
monzero-gui-088d32e712a2c6e51a04f919c0ade96b643a49e3.tar.xz
monzero-gui-088d32e712a2c6e51a04f919c0ade96b643a49e3.zip
OSHelper: file preselection support (Windows and Mac)
Co-authored-by: selsta <selsta@sent.at>
Diffstat (limited to 'src')
-rw-r--r--src/main/oshelper.cpp54
-rw-r--r--src/qt/macoshelper.h1
-rw-r--r--src/qt/macoshelper.mm8
3 files changed, 55 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);
diff --git a/src/qt/macoshelper.h b/src/qt/macoshelper.h
index bddf70c6..a6caa79b 100644
--- a/src/qt/macoshelper.h
+++ b/src/qt/macoshelper.h
@@ -35,6 +35,7 @@ class MacOSHelper
public:
static bool isCapsLock();
+ static bool openFolderAndSelectItem(const QUrl &path);
};
#endif //MACOSHELPER_H
diff --git a/src/qt/macoshelper.mm b/src/qt/macoshelper.mm
index 0b29f25f..a7fb061d 100644
--- a/src/qt/macoshelper.mm
+++ b/src/qt/macoshelper.mm
@@ -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;
+}