From aaaa543a3250ab80e786fac8e26ea0d42ad8c927 Mon Sep 17 00:00:00 2001 From: Andre Hartmann Date: Tue, 26 Dec 2017 21:41:23 +0100 Subject: [PATCH] Locator: Allow simple calculations by using QJSEngine Task-number: QTCREATORBUG-14380 Change-Id: I807441ce00991856b3510a6793b454eb3c6a6c30 Reviewed-by: Orgad Shaneh Reviewed-by: Eike Ziller --- src/plugins/coreplugin/coreplugin.qbs | 2 + .../coreplugin/locator/javascriptfilter.cpp | 123 ++++++++++++++++++ .../coreplugin/locator/javascriptfilter.h | 58 +++++++++ src/plugins/coreplugin/locator/locator.cpp | 6 + src/plugins/coreplugin/locator/locator.h | 2 + src/plugins/coreplugin/locator/locator.pri | 8 +- 6 files changed, 197 insertions(+), 2 deletions(-) create mode 100644 src/plugins/coreplugin/locator/javascriptfilter.cpp create mode 100644 src/plugins/coreplugin/locator/javascriptfilter.h diff --git a/src/plugins/coreplugin/coreplugin.qbs b/src/plugins/coreplugin/coreplugin.qbs index 109993bb115..ce47658daad 100644 --- a/src/plugins/coreplugin/coreplugin.qbs +++ b/src/plugins/coreplugin/coreplugin.qbs @@ -343,6 +343,8 @@ Project { "filesystemfilter.ui", "ilocatorfilter.cpp", "ilocatorfilter.h", + "javascriptfilter.cpp", + "javascriptfilter.h", "locatorconstants.h", "locatorfiltersfilter.cpp", "locatorfiltersfilter.h", diff --git a/src/plugins/coreplugin/locator/javascriptfilter.cpp b/src/plugins/coreplugin/locator/javascriptfilter.cpp new file mode 100644 index 00000000000..02803ecf728 --- /dev/null +++ b/src/plugins/coreplugin/locator/javascriptfilter.cpp @@ -0,0 +1,123 @@ +/**************************************************************************** +** +** Copyright (C) 2018 Andre Hartmann +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#include "javascriptfilter.h" + +#include +#include +#include + +namespace Core { +namespace Internal { + +JavaScriptFilter::JavaScriptFilter() +{ + setId("JavaScriptFilter"); + setDisplayName(tr("Evaluate JavaScript")); + setIncludedByDefault(false); + setShortcutString("="); +} + +JavaScriptFilter::~JavaScriptFilter() +{ +} + +void JavaScriptFilter::prepareSearch(const QString &entry) +{ + Q_UNUSED(entry); + + setupEngine(); +} + +QList JavaScriptFilter::matchesFor( + QFutureInterface &future, const QString &entry) +{ + Q_UNUSED(future); + + const QString result = m_engine->evaluate(entry).toString(); + const QString expression = entry + " = " + result; + + QList entries; + entries.append({this, expression, QVariant()}); + entries.append({this, tr("Copy to clipboard: %1").arg(result), result}); + entries.append({this, tr("Copy to clipboard: %1").arg(expression), expression}); + + return entries; +} + +void JavaScriptFilter::accept(Core::LocatorFilterEntry selection, QString *newText, + int *selectionStart, int *selectionLength) const +{ + Q_UNUSED(newText); + Q_UNUSED(selectionStart); + Q_UNUSED(selectionLength); + + if (selection.internalData.isNull()) + return; + + QClipboard *clipboard = QGuiApplication::clipboard(); + clipboard->setText(selection.internalData.toString()); +} + +void JavaScriptFilter::refresh(QFutureInterface &future) +{ + Q_UNUSED(future); + // Nothing to refresh +} + +void JavaScriptFilter::setupEngine() +{ + if (m_engine) + return; + + m_engine = new QJSEngine(this); + m_engine->evaluate( + "function abs(x) { return Math.abs(x); }\n" + "function acos(x) { return Math.acos(x); }\n" + "function asin(x) { return Math.asin(x); }\n" + "function atan(x) { return Math.atan(x); }\n" + "function atan2(x, y) { return Math.atan2(x, y); }\n" + "function bin(x) { return '0b' + x.toString(2); }\n" + "function ceil(x) { return Math.ceil(x); }\n" + "function cos(x) { return Math.cos(x); }\n" + "function exp(x) { return Math.exp(x); }\n" + "function e() { return Math.E; }\n" + "function floor(x) { return Math.floor(x); }\n" + "function hex(x) { return '0x' + x.toString(16); }\n" + "function log(x) { return Math.log(x); }\n" + "function max(x, y) { return Math.max(x, y); }\n" + "function min(x, y) { return Math.min(x, y); }\n" + "function oct(x) { return '0' + x.toString(8); }\n" + "function pi() { return Math.PI; }\n" + "function pow(x, y) { return Math.pow(x, y); }\n" + "function random() { return Math.random(); }\n" + "function round(x) { return Math.round(x); }\n" + "function sin(x) { return Math.sin(x); }\n" + "function sqrt(x) { return Math.sqrt(x); }\n" + "function tan(x) { return Math.tan(x); }\n"); +} + +} // namespace Internal +} // namespace Core diff --git a/src/plugins/coreplugin/locator/javascriptfilter.h b/src/plugins/coreplugin/locator/javascriptfilter.h new file mode 100644 index 00000000000..50f5e85c3b1 --- /dev/null +++ b/src/plugins/coreplugin/locator/javascriptfilter.h @@ -0,0 +1,58 @@ +/**************************************************************************** +** +** Copyright (C) 2018 Andre Hartmann +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#pragma once + +#include + +QT_BEGIN_NAMESPACE +class QJSEngine; +QT_END_NAMESPACE + +namespace Core { +namespace Internal { + +class JavaScriptFilter : public Core::ILocatorFilter +{ + Q_OBJECT +public: + JavaScriptFilter(); + ~JavaScriptFilter(); + + virtual void prepareSearch(const QString &entry) override; + QList matchesFor(QFutureInterface &future, + const QString &entry) override; + void accept(Core::LocatorFilterEntry selection, QString *newText, + int *selectionStart, int *selectionLength) const override; + void refresh(QFutureInterface &future) override; + +private: + void setupEngine(); + + QJSEngine *m_engine = nullptr; +}; + +} // namespace Internal +} // namespace Core diff --git a/src/plugins/coreplugin/locator/locator.cpp b/src/plugins/coreplugin/locator/locator.cpp index 6daab8026e8..e57f20241ac 100644 --- a/src/plugins/coreplugin/locator/locator.cpp +++ b/src/plugins/coreplugin/locator/locator.cpp @@ -27,6 +27,7 @@ #include "externaltoolsfilter.h" #include "filesystemfilter.h" +#include "javascriptfilter.h" #include "locatorconstants.h" #include "locatorfiltersfilter.h" #include "locatormanager.h" @@ -75,11 +76,13 @@ Locator::Locator() Locator::~Locator() { + m_corePlugin->removeObject(m_javaScriptFilter); m_corePlugin->removeObject(m_openDocumentsFilter); m_corePlugin->removeObject(m_fileSystemFilter); m_corePlugin->removeObject(m_executeFilter); m_corePlugin->removeObject(m_settingsPage); m_corePlugin->removeObject(m_externalToolsFilter); + delete m_javaScriptFilter; delete m_openDocumentsFilter; delete m_fileSystemFilter; delete m_executeFilter; @@ -119,6 +122,9 @@ void Locator::initialize(CorePlugin *corePlugin, const QStringList &, QString *) new LocatorManager(this); + m_javaScriptFilter = new JavaScriptFilter; + m_corePlugin->addObject(m_javaScriptFilter); + m_openDocumentsFilter = new OpenDocumentsFilter; m_corePlugin->addObject(m_openDocumentsFilter); diff --git a/src/plugins/coreplugin/locator/locator.h b/src/plugins/coreplugin/locator/locator.h index 325bcc11304..5d5d379a887 100644 --- a/src/plugins/coreplugin/locator/locator.h +++ b/src/plugins/coreplugin/locator/locator.h @@ -42,6 +42,7 @@ namespace Internal { class CorePlugin; class OpenDocumentsFilter; class FileSystemFilter; +class JavaScriptFilter; class LocatorSettingsPage; class ExternalToolsFilter; @@ -85,6 +86,7 @@ private: QList m_customFilters; QMap m_filterActionMap; QTimer m_refreshTimer; + JavaScriptFilter *m_javaScriptFilter = nullptr; OpenDocumentsFilter *m_openDocumentsFilter = nullptr; FileSystemFilter *m_fileSystemFilter = nullptr; ExecuteFilter *m_executeFilter = nullptr; diff --git a/src/plugins/coreplugin/locator/locator.pri b/src/plugins/coreplugin/locator/locator.pri index e80765bfc5f..183d7fde515 100644 --- a/src/plugins/coreplugin/locator/locator.pri +++ b/src/plugins/coreplugin/locator/locator.pri @@ -1,3 +1,5 @@ +QT *= qml + HEADERS += \ $$PWD/locator.h \ $$PWD/commandlocator.h \ @@ -13,7 +15,8 @@ HEADERS += \ $$PWD/executefilter.h \ $$PWD/locatorsearchutils.h \ $$PWD/locatorsettingspage.h \ - $$PWD/externaltoolsfilter.h + $$PWD/externaltoolsfilter.h \ + $$PWD/javascriptfilter.h SOURCES += \ $$PWD/locator.cpp \ @@ -29,7 +32,8 @@ SOURCES += \ $$PWD/executefilter.cpp \ $$PWD/locatorsearchutils.cpp \ $$PWD/locatorsettingspage.cpp \ - $$PWD/externaltoolsfilter.cpp + $$PWD/externaltoolsfilter.cpp \ + $$PWD/javascriptfilter.cpp FORMS += \ $$PWD/filesystemfilter.ui \