aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorluigi1111 <luigi1111w@gmail.com>2019-12-19 19:20:53 -0500
committerluigi1111 <luigi1111w@gmail.com>2019-12-19 19:20:53 -0500
commit4042186fac32ec13bbaca55b666faf026288d4c0 (patch)
treea063e92f852b157717288d258fc946995d141cc5
parentabd98b95f6e7d98544a0c1becc5aa719abfaeadb (diff)
parent088d32e712a2c6e51a04f919c0ade96b643a49e3 (diff)
downloadmonzero-gui-4042186fac32ec13bbaca55b666faf026288d4c0.tar.gz
monzero-gui-4042186fac32ec13bbaca55b666faf026288d4c0.tar.xz
monzero-gui-4042186fac32ec13bbaca55b666faf026288d4c0.zip
Merge pull request #2580
ba24fd7 SettingsInfo: open containing folder on wallet log path click (xiphon) 088d32e OSHelper: file preselection support (Windows and Mac) (xiphon)
-rw-r--r--pages/settings/SettingsInfo.qml33
-rw-r--r--src/main/oshelper.cpp58
-rw-r--r--src/main/oshelper.h1
-rw-r--r--src/qt/macoshelper.h1
-rw-r--r--src/qt/macoshelper.mm8
5 files changed, 92 insertions, 9 deletions
diff --git a/pages/settings/SettingsInfo.qml b/pages/settings/SettingsInfo.qml
index 5139ab73..75420d72 100644
--- a/pages/settings/SettingsInfo.qml
+++ b/pages/settings/SettingsInfo.qml
@@ -132,14 +132,21 @@ Rectangle {
MoneroComponents.TextBlock {
Layout.fillWidth: true
- Layout.maximumWidth: 360
color: MoneroComponents.Style.dimmedFontColor
font.pixelSize: 14
- text: {
- var wallet_path = walletPath();
- if(isIOS)
- wallet_path = moneroAccountsDir + wallet_path;
- return wallet_path;
+ property string walletPath: (isIOS ? moneroAccountsDir : "") + appWindow.walletPath()
+ text: "\
+ <style type='text/css'>\
+ a {cursor:pointer;text-decoration: none; color: #FF6C3C}\
+ </style>\
+ <a href='#'>%1</a>".arg(walletPath)
+ textFormat: Text.RichText
+ onLinkActivated: oshelper.openContainingFolder(walletPath)
+
+ MouseArea {
+ anchors.fill: parent
+ acceptedButtons: Qt.NoButton
+ cursorShape: parent.hoveredLink ? Qt.PointingHandCursor : Qt.ArrowCursor
}
}
@@ -261,7 +268,19 @@ Rectangle {
Layout.fillWidth: true
color: MoneroComponents.Style.dimmedFontColor
font.pixelSize: 14
- text: walletLogPath
+ text: "\
+ <style type='text/css'>\
+ a {cursor:pointer;text-decoration: none; color: #FF6C3C}\
+ </style>\
+ <a href='#'>%1</a>".arg(walletLogPath)
+ textFormat: Text.RichText
+ onLinkActivated: oshelper.openContainingFolder(walletLogPath)
+
+ MouseArea {
+ anchors.fill: parent
+ acceptedButtons: Qt.NoButton
+ cursorShape: parent.hoveredLink ? Qt.PointingHandCursor : Qt.ArrowCursor
+ }
}
Rectangle {
diff --git a/src/main/oshelper.cpp b/src/main/oshelper.cpp
index c1326c0f..4402db6d 100644
--- a/src/main/oshelper.cpp
+++ b/src/main/oshelper.cpp
@@ -30,11 +30,15 @@
#include <QTemporaryFile>
#include <QDir>
#include <QDebug>
+#include <QDesktopServices>
+#include <QFileInfo>
#include <QString>
+#include <QUrl>
#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)
@@ -46,11 +50,61 @@
// #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)
{
}
+bool OSHelper::openContainingFolder(const QString &filePath) const
+{
+#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 << url.errorString();
+ return false;
+ }
+ return QDesktopServices::openUrl(url);
+}
+
QString OSHelper::temporaryFilename() const
{
QString tempFileName;
@@ -76,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/main/oshelper.h b/src/main/oshelper.h
index 4d378a9d..72f284af 100644
--- a/src/main/oshelper.h
+++ b/src/main/oshelper.h
@@ -39,6 +39,7 @@ class OSHelper : public QObject
public:
explicit OSHelper(QObject *parent = 0);
+ Q_INVOKABLE bool openContainingFolder(const QString &filePath) const;
Q_INVOKABLE QString temporaryFilename() const;
Q_INVOKABLE QString temporaryPath() const;
Q_INVOKABLE bool removeTemporaryWallet(const QString &walletName) const;
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;
+}