forked from Public/monero-gui
Transfer: implement 'Grab QR code from screen' functionality
This commit is contained in:
@@ -27,10 +27,16 @@
|
||||
// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
#include "oshelper.h"
|
||||
|
||||
#include <unordered_set>
|
||||
|
||||
#include <QCoreApplication>
|
||||
#include <QGuiApplication>
|
||||
#include <QFileDialog>
|
||||
#include <QScreen>
|
||||
#include <QStandardPaths>
|
||||
#include <QTemporaryFile>
|
||||
#include <QWindow>
|
||||
#include <QDir>
|
||||
#include <QDebug>
|
||||
#include <QDesktopServices>
|
||||
@@ -55,6 +61,40 @@
|
||||
#include "qt/utils.h"
|
||||
#endif
|
||||
|
||||
#include "QR-Code-scanner/Decoder.h"
|
||||
#include "qt/ScopeGuard.h"
|
||||
|
||||
namespace
|
||||
{
|
||||
|
||||
QPixmap screenshot()
|
||||
{
|
||||
#ifdef Q_OS_MAC
|
||||
return MacOSHelper::screenshot();
|
||||
#else
|
||||
std::unordered_set<QWindow *> hidden;
|
||||
const QWindowList windows = QGuiApplication::allWindows();
|
||||
for (QWindow *window : windows)
|
||||
{
|
||||
if (window->isVisible())
|
||||
{
|
||||
hidden.emplace(window);
|
||||
window->hide();
|
||||
}
|
||||
}
|
||||
const auto unhide = sg::make_scope_guard([&hidden]() {
|
||||
for (QWindow *window : hidden)
|
||||
{
|
||||
window->show();
|
||||
}
|
||||
});
|
||||
|
||||
return QGuiApplication::primaryScreen()->grabWindow(0);
|
||||
#endif
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
#if defined(Q_OS_WIN)
|
||||
bool openFolderAndSelectItem(const QString &filePath)
|
||||
{
|
||||
@@ -99,6 +139,26 @@ QString OSHelper::downloadLocation() const
|
||||
return QStandardPaths::writableLocation(QStandardPaths::DownloadLocation);
|
||||
}
|
||||
|
||||
QList<QString> OSHelper::grabQrCodesFromScreen() const
|
||||
{
|
||||
QList<QString> codes;
|
||||
|
||||
try
|
||||
{
|
||||
const QImage image = screenshot().toImage();
|
||||
const std::vector<std::string> decoded = QrDecoder().decode(image);
|
||||
std::for_each(decoded.begin(), decoded.end(), [&codes](const std::string &code) {
|
||||
codes.push_back(QString::fromStdString(code));
|
||||
});
|
||||
}
|
||||
catch (const std::exception &e)
|
||||
{
|
||||
qWarning() << e.what();
|
||||
}
|
||||
|
||||
return codes;
|
||||
}
|
||||
|
||||
bool OSHelper::openContainingFolder(const QString &filePath) const
|
||||
{
|
||||
QString canonicalFilePath = QFileInfo(filePath).canonicalFilePath();
|
||||
|
||||
Reference in New Issue
Block a user