Locator: Allow simple calculations by using QJSEngine

Task-number: QTCREATORBUG-14380
Change-Id: I807441ce00991856b3510a6793b454eb3c6a6c30
Reviewed-by: Orgad Shaneh <orgads@gmail.com>
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
This commit is contained in:
Andre Hartmann
2017-12-26 21:41:23 +01:00
committed by Eike Ziller
parent 76c25bcd6a
commit aaaa543a32
6 changed files with 197 additions and 2 deletions

View File

@@ -343,6 +343,8 @@ Project {
"filesystemfilter.ui",
"ilocatorfilter.cpp",
"ilocatorfilter.h",
"javascriptfilter.cpp",
"javascriptfilter.h",
"locatorconstants.h",
"locatorfiltersfilter.cpp",
"locatorfiltersfilter.h",

View File

@@ -0,0 +1,123 @@
/****************************************************************************
**
** Copyright (C) 2018 Andre Hartmann <aha_1980@gmx.de>
** 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 <QClipboard>
#include <QGuiApplication>
#include <QJSEngine>
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<LocatorFilterEntry> JavaScriptFilter::matchesFor(
QFutureInterface<Core::LocatorFilterEntry> &future, const QString &entry)
{
Q_UNUSED(future);
const QString result = m_engine->evaluate(entry).toString();
const QString expression = entry + " = " + result;
QList<LocatorFilterEntry> 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<void> &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

View File

@@ -0,0 +1,58 @@
/****************************************************************************
**
** Copyright (C) 2018 Andre Hartmann <aha_1980@gmx.de>
** 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 <coreplugin/locator/ilocatorfilter.h>
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<Core::LocatorFilterEntry> matchesFor(QFutureInterface<Core::LocatorFilterEntry> &future,
const QString &entry) override;
void accept(Core::LocatorFilterEntry selection, QString *newText,
int *selectionStart, int *selectionLength) const override;
void refresh(QFutureInterface<void> &future) override;
private:
void setupEngine();
QJSEngine *m_engine = nullptr;
};
} // namespace Internal
} // namespace Core

View File

@@ -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);

View File

@@ -42,6 +42,7 @@ namespace Internal {
class CorePlugin;
class OpenDocumentsFilter;
class FileSystemFilter;
class JavaScriptFilter;
class LocatorSettingsPage;
class ExternalToolsFilter;
@@ -85,6 +86,7 @@ private:
QList<ILocatorFilter *> m_customFilters;
QMap<Id, QAction *> m_filterActionMap;
QTimer m_refreshTimer;
JavaScriptFilter *m_javaScriptFilter = nullptr;
OpenDocumentsFilter *m_openDocumentsFilter = nullptr;
FileSystemFilter *m_fileSystemFilter = nullptr;
ExecuteFilter *m_executeFilter = nullptr;

View File

@@ -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 \