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:
Marcus Tillmanns
2024-06-25 09:19:15 +02:00
parent e001f4535b
commit 81ad004a52

View File

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