forked from qt-creator/qt-creator
Lua: Improve REPL Pane
* Replaced item editor with label to allow copy&paste * Fixed removing global object * Removed printing of readline prompt * Removed keypress handler as it was unstable Change-Id: I8091252400a3532ecc818404ad5a8edfa9451327 Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
@@ -24,6 +24,7 @@
|
|||||||
#include <QLineEdit>
|
#include <QLineEdit>
|
||||||
#include <QListView>
|
#include <QListView>
|
||||||
#include <QStringListModel>
|
#include <QStringListModel>
|
||||||
|
#include <QStyledItemDelegate>
|
||||||
|
|
||||||
using namespace Core;
|
using namespace Core;
|
||||||
using namespace Utils;
|
using namespace Utils;
|
||||||
@@ -59,7 +60,28 @@ public:
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
class LuaTerminal : public QListView
|
class ItemDelegate : public QStyledItemDelegate
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
using QStyledItemDelegate::QStyledItemDelegate;
|
||||||
|
|
||||||
|
QWidget *createEditor(
|
||||||
|
QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override
|
||||||
|
{
|
||||||
|
auto label = new QLabel(parent);
|
||||||
|
const QString text = index.data().toString();
|
||||||
|
label->setText(text);
|
||||||
|
label->setFont(option.font);
|
||||||
|
label->setTextInteractionFlags(
|
||||||
|
Qt::TextInteractionFlag::TextSelectableByMouse
|
||||||
|
| Qt::TextInteractionFlag::TextSelectableByKeyboard);
|
||||||
|
label->setAutoFillBackground(true);
|
||||||
|
label->setSelection(0, text.size());
|
||||||
|
return label;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class LuaReplView : public QListView
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
@@ -69,10 +91,11 @@ class LuaTerminal : public QListView
|
|||||||
QStringListModel m_model;
|
QStringListModel m_model;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
LuaTerminal(QWidget *parent = nullptr)
|
LuaReplView(QWidget *parent = nullptr)
|
||||||
: QListView(parent)
|
: QListView(parent)
|
||||||
{
|
{
|
||||||
setModel(&m_model);
|
setModel(&m_model);
|
||||||
|
setItemDelegate(new ItemDelegate);
|
||||||
}
|
}
|
||||||
|
|
||||||
void showEvent(QShowEvent *) override
|
void showEvent(QShowEvent *) override
|
||||||
@@ -83,8 +106,6 @@ public:
|
|||||||
resetTerminal();
|
resetTerminal();
|
||||||
}
|
}
|
||||||
|
|
||||||
void keyPressEvent(QKeyEvent *e) override { emit keyPressed(e); }
|
|
||||||
|
|
||||||
void handleRequestResult(const QString &result)
|
void handleRequestResult(const QString &result)
|
||||||
{
|
{
|
||||||
auto cb = m_readCallback;
|
auto cb = m_readCallback;
|
||||||
@@ -102,11 +123,9 @@ public:
|
|||||||
const auto ilua = QString::fromUtf8(f.readAll());
|
const auto ilua = QString::fromUtf8(f.readAll());
|
||||||
m_luaState = LuaEngine::instance().runScript(ilua, "ilua.lua", [this](sol::state &lua) {
|
m_luaState = LuaEngine::instance().runScript(ilua, "ilua.lua", [this](sol::state &lua) {
|
||||||
lua["print"] = [this](sol::variadic_args va) {
|
lua["print"] = [this](sol::variadic_args va) {
|
||||||
const QStringList msgs = LuaEngine::variadicToStringList(va)
|
const QString msgs
|
||||||
.join("\t")
|
= LuaEngine::variadicToStringList(va).join("\t").replace("\r\n", "\n");
|
||||||
.replace("\r\n", "\n")
|
m_model.setStringList(m_model.stringList() << msgs);
|
||||||
.split('\n');
|
|
||||||
m_model.setStringList(m_model.stringList() + msgs);
|
|
||||||
scrollToBottom();
|
scrollToBottom();
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -114,7 +133,6 @@ public:
|
|||||||
sol::function wrap = async["wrap"];
|
sol::function wrap = async["wrap"];
|
||||||
|
|
||||||
lua["readline_cb"] = [this](const QString &prompt, sol::function callback) {
|
lua["readline_cb"] = [this](const QString &prompt, sol::function callback) {
|
||||||
m_model.setStringList(m_model.stringList() << prompt);
|
|
||||||
scrollToBottom();
|
scrollToBottom();
|
||||||
emit inputRequested(prompt);
|
emit inputRequested(prompt);
|
||||||
m_readCallback = callback;
|
m_readCallback = callback;
|
||||||
@@ -128,14 +146,12 @@ public:
|
|||||||
|
|
||||||
signals:
|
signals:
|
||||||
void inputRequested(const QString &prompt);
|
void inputRequested(const QString &prompt);
|
||||||
void keyPressed(QKeyEvent *e);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class LineEdit : public FancyLineEdit
|
class LineEdit : public FancyLineEdit
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
using FancyLineEdit::FancyLineEdit;
|
using FancyLineEdit::FancyLineEdit;
|
||||||
void keyPressEvent(QKeyEvent *e) override { FancyLineEdit::keyPressEvent(e); }
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class LuaPane : public Core::IOutputPane
|
class LuaPane : public Core::IOutputPane
|
||||||
@@ -144,7 +160,7 @@ class LuaPane : public Core::IOutputPane
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
QWidget *m_ui{nullptr};
|
QWidget *m_ui{nullptr};
|
||||||
LuaTerminal *m_terminal{nullptr};
|
LuaReplView *m_terminal{nullptr};
|
||||||
|
|
||||||
public:
|
public:
|
||||||
LuaPane(QObject *parent = nullptr)
|
LuaPane(QObject *parent = nullptr)
|
||||||
@@ -160,7 +176,7 @@ public:
|
|||||||
using namespace Layouting;
|
using namespace Layouting;
|
||||||
|
|
||||||
if (!m_ui && parent) {
|
if (!m_ui && parent) {
|
||||||
m_terminal = new LuaTerminal;
|
m_terminal = new LuaReplView;
|
||||||
LineEdit *inputEdit = new LineEdit;
|
LineEdit *inputEdit = new LineEdit;
|
||||||
QLabel *prompt = new QLabel;
|
QLabel *prompt = new QLabel;
|
||||||
|
|
||||||
@@ -182,16 +198,12 @@ public:
|
|||||||
});
|
});
|
||||||
connect(
|
connect(
|
||||||
m_terminal,
|
m_terminal,
|
||||||
&LuaTerminal::inputRequested,
|
&LuaReplView::inputRequested,
|
||||||
this,
|
this,
|
||||||
[prompt, inputEdit](const QString &p) {
|
[prompt, inputEdit](const QString &p) {
|
||||||
prompt->setText(p);
|
prompt->setText(p);
|
||||||
inputEdit->setReadOnly(false);
|
inputEdit->setReadOnly(false);
|
||||||
});
|
});
|
||||||
connect(m_terminal, &LuaTerminal::keyPressed, this, [inputEdit](QKeyEvent *e) {
|
|
||||||
inputEdit->keyPressEvent(e);
|
|
||||||
inputEdit->setFocus();
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return m_ui;
|
return m_ui;
|
||||||
@@ -228,7 +240,6 @@ private:
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
LuaPlugin() {}
|
LuaPlugin() {}
|
||||||
~LuaPlugin() override = default;
|
|
||||||
|
|
||||||
void initialize() final
|
void initialize() final
|
||||||
{
|
{
|
||||||
@@ -249,8 +260,7 @@ public:
|
|||||||
|
|
||||||
Core::JsExpander::registerGlobalObject("Lua", [] { return new LuaJsExtension(); });
|
Core::JsExpander::registerGlobalObject("Lua", [] { return new LuaJsExtension(); });
|
||||||
|
|
||||||
m_pane = new LuaPane;
|
m_pane = new LuaPane(this);
|
||||||
ExtensionSystem::PluginManager::addObject(m_pane);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool delayedInitialize() final
|
bool delayedInitialize() final
|
||||||
|
Reference in New Issue
Block a user