Lua: Cleanup Hooks

Change-Id: I8e3a1d66ea6125d2cc5ee9c8f8442cca0913fec6
Reviewed-by: <lie@spyro-soft.com>
Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
Marcus Tillmanns
2024-07-16 16:07:57 +02:00
parent 0e75f3f4f3
commit d2e14ffe86
12 changed files with 181 additions and 190 deletions

View File

@@ -19,8 +19,11 @@ It will try to install it if it is not found.
}, },
hooks = { hooks = {
editors = { editors = {
documentOpened = function(document) require 'init'.Hooks.onDocumentOpened(document) end, text = {
documentClosed = function(document) require 'init'.Hooks.onDocumentClosed(document) end, opened = function(document) require 'init'.Hooks.onDocumentOpened(document) end,
closed = function(document) require 'init'.Hooks.onDocumentClosed(document) end,
contentsChanged = function(document) require 'init'.Hooks.onDocumentContentsChanged(document) end,
}
} }
}, },
setup = function() setup = function()

View File

@@ -5,7 +5,7 @@ local Utils = require('Utils')
local S = require('Settings') local S = require('Settings')
local Gui = require('Gui') local Gui = require('Gui')
local a = require('async') local a = require('async')
local Documents = require('Documents') local TextDocument = require('TextDocument')
local function createCommand() local function createCommand()
local cmd = { Settings.binary.expandedValue:nativePath() } local cmd = { Settings.binary.expandedValue:nativePath() }
@@ -96,8 +96,8 @@ end
Hooks = {} Hooks = {}
local function onDocumentChanged() function Hooks.onDocumentContentsChanged(document)
print("onDocumentChanged() called") print("onDocumentContentsChanged() called", document)
-- TODO: -- TODO:
-- All the necessary checks before sending the request -- All the necessary checks before sending the request
-- Create request: -- Create request:
@@ -110,8 +110,7 @@ local function onDocumentChanged()
---Called when a document is opened. ---Called when a document is opened.
---@param document TextDocument ---@param document TextDocument
function Hooks.onDocumentOpened(document) function Hooks.onDocumentOpened(document)
print("TextDocument found: ", document) print("TextDocument found: ", document)
document:setChangedCallback(onDocumentChanged)
end end
---Called when a document is closed. ---Called when a document is closed.

View File

@@ -1,4 +1,3 @@
add_qtc_plugin(Lua add_qtc_plugin(Lua
PLUGIN_DEPENDS Core PLUGIN_DEPENDS Core
PUBLIC_DEPENDS lua546 sol2 TextEditor PUBLIC_DEPENDS lua546 sol2 TextEditor
@@ -7,8 +6,6 @@ add_qtc_plugin(Lua
bindings/action.cpp bindings/action.cpp
bindings/async.cpp bindings/async.cpp
bindings/core.cpp bindings/core.cpp
bindings/documents.cpp
bindings/documents.h
bindings/fetch.cpp bindings/fetch.cpp
bindings/gui.cpp bindings/gui.cpp
bindings/hook.cpp bindings/hook.cpp
@@ -19,6 +16,7 @@ add_qtc_plugin(Lua
bindings/messagemanager.cpp bindings/messagemanager.cpp
bindings/qtcprocess.cpp bindings/qtcprocess.cpp
bindings/settings.cpp bindings/settings.cpp
bindings/textdocument.cpp
bindings/utils.cpp bindings/utils.cpp
luaengine.cpp luaengine.cpp
luaengine.h luaengine.h
@@ -28,24 +26,6 @@ add_qtc_plugin(Lua
luaqttypes.cpp luaqttypes.cpp
luaqttypes.h luaqttypes.h
luatr.h luatr.h
meta/action.lua
meta/async.lua
meta/core.lua
meta/documents.lua
meta/fetch.lua
meta/gui.lua
meta/json.lua
meta/install.lua
meta/localsocket.lua
meta/lsp.lua
meta/messagemanager.lua
meta/process.lua
meta/qt.lua
meta/qtc.lua
meta/settings.lua
meta/simpletypes.lua
meta/utils.lua
meta/widgets.lua
wizards/wizards.qrc wizards/wizards.qrc
# generateqtbindings.cpp # Use this if you need to generate some code. # generateqtbindings.cpp # Use this if you need to generate some code.
) )
@@ -70,32 +50,7 @@ if (MSVC)
set_property(SOURCE bindings/settings.cpp PROPERTY COMPILE_FLAGS /bigobj) set_property(SOURCE bindings/settings.cpp PROPERTY COMPILE_FLAGS /bigobj)
endif() endif()
set(META_FILES
meta/action.lua
meta/async.lua
meta/core.lua
meta/documents.lua
meta/fetch.lua
meta/gui.lua
meta/json.lua
meta/localsocket.lua
meta/lsp.lua
meta/messagemanager.lua
meta/process.lua
meta/qt.lua
meta/qtc.lua
meta/settings.lua
meta/simpletypes.lua
meta/utils.lua
meta/widgets.lua
)
qtc_copy_to_builddir(copy_lua_meta_files qtc_copy_to_builddir(copy_lua_meta_files
DESTINATION ${IDE_DATA_PATH}/lua DIRECTORIES meta
FILES ${META_FILES}
)
install(
FILES ${META_FILES}
DESTINATION ${IDE_DATA_PATH}/lua/meta DESTINATION ${IDE_DATA_PATH}/lua/meta
) )

View File

@@ -1,30 +0,0 @@
// Copyright (C) 2024 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
#include "../luaengine.h"
#include "sol/sol.hpp"
#include "documents.h"
#include <texteditor/textdocument.h>
namespace Lua::Internal {
void addDocumentsModule()
{
LuaEngine::registerProvider("Documents", [](sol::state_view lua) -> sol::object {
sol::table documents = lua.create_table();
documents.new_usertype<LuaTextDocument>(
"TextDocument",
sol::no_constructor,
"setChangedCallback",
[](LuaTextDocument &self, sol::function callback) {
self.setChangedCallback(callback);
});
return documents;
});
}
} // namespace Lua::Internal

View File

@@ -1,40 +0,0 @@
// Copyright (C) 2024 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
#pragma once
#include "sol/sol.hpp"
#include <texteditor/textdocument.h>
namespace Lua {
class LuaTextDocument : public QObject
{
Q_OBJECT
public:
LuaTextDocument(TextEditor::TextDocument *document)
: m_document(document)
{
connect(
m_document,
&TextEditor::TextDocument::contentsChanged,
this,
&LuaTextDocument::contentsChanged);
return;
}
void setChangedCallback(sol::function lua_function) { m_changedCallback = lua_function; }
void contentsChanged()
{
if (m_changedCallback)
m_changedCallback();
}
private:
TextEditor::TextDocument *m_document;
sol::function m_changedCallback;
};
} // namespace Lua

View File

@@ -3,61 +3,22 @@
#include "../luaengine.h" #include "../luaengine.h"
#include "documents.h"
#include <coreplugin/editormanager/editormanager.h> #include <coreplugin/editormanager/editormanager.h>
#include <texteditor/textdocument.h> #include <texteditor/textdocument.h>
namespace Lua { namespace Lua {
class Hook : public QObject
{
Q_OBJECT
public:
Hook(QObject *source);
signals:
void trigger(sol::table &args);
};
Hook::Hook(QObject *source)
: QObject(source)
{}
namespace Internal { namespace Internal {
void addHookModule() void addHookModule()
{ {
LuaEngine::autoRegister([](sol::state_view lua) {
auto connection
= lua.new_usertype<QMetaObject::Connection>("QMetaConnection", sol::no_constructor);
auto hook = lua.new_usertype<Hook>(
"Hook",
sol::no_constructor,
"connect",
[](Hook *hook, const sol::function &func) -> QMetaObject::Connection {
QMetaObject::Connection con
= QObject::connect(hook, &Hook::trigger, [func](sol::table args) {
auto res = LuaEngine::void_safe_call(func, args);
QTC_CHECK_EXPECTED(res);
});
return con;
},
"disconnect",
[](Hook *, QMetaObject::Connection con) { QObject::disconnect(con); });
});
LuaEngine::registerHook("editors.documentOpened", [](const sol::protected_function &func) { LuaEngine::registerHook("editors.documentOpened", [](const sol::protected_function &func) {
QObject::connect( QObject::connect(
Core::EditorManager::instance(), Core::EditorManager::instance(),
&Core::EditorManager::documentOpened, &Core::EditorManager::documentOpened,
[func](Core::IDocument *document) { [func](Core::IDocument *document) {
auto text_document = qobject_cast<TextEditor::TextDocument *>(document); Utils::expected_str<void> res = LuaEngine::void_safe_call(func, document);
if (text_document) { QTC_CHECK_EXPECTED(res);
QTC_CHECK_EXPECTED(LuaEngine::void_safe_call(
func, std::make_unique<LuaTextDocument>(text_document)));
}
}); });
}); });
@@ -66,11 +27,8 @@ void addHookModule()
Core::EditorManager::instance(), Core::EditorManager::instance(),
&Core::EditorManager::documentClosed, &Core::EditorManager::documentClosed,
[func](Core::IDocument *document) { [func](Core::IDocument *document) {
auto text_document = qobject_cast<TextEditor::TextDocument *>(document); Utils::expected_str<void> res = LuaEngine::void_safe_call(func, document);
if (text_document) { QTC_CHECK_EXPECTED(res);
QTC_CHECK_EXPECTED(LuaEngine::void_safe_call(
func, std::make_unique<LuaTextDocument>(text_document)));
}
}); });
}); });
} }
@@ -78,5 +36,3 @@ void addHookModule()
} // namespace Internal } // namespace Internal
} // namespace Lua } // namespace Lua
#include "hook.moc"

View File

@@ -0,0 +1,144 @@
// Copyright (C) 2024 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
#include "../luaengine.h"
#include <coreplugin/editormanager/editormanager.h>
#include <texteditor/textdocument.h>
#include "sol/sol.hpp"
namespace Lua::Internal {
class TextDocumentRegistry : public QObject
{
Q_OBJECT
public:
static TextDocumentRegistry *instance()
{
static TextDocumentRegistry *instance = new TextDocumentRegistry();
return instance;
}
TextDocumentRegistry()
{
connect(
Core::EditorManager::instance(),
&Core::EditorManager::documentOpened,
this,
&TextDocumentRegistry::onDocumentOpened);
connect(
Core::EditorManager::instance(),
&Core::EditorManager::documentClosed,
this,
&TextDocumentRegistry::onDocumentClosed);
connect(
Core::EditorManager::instance(),
&Core::EditorManager::currentEditorChanged,
this,
[this](Core::IEditor *editor) {
if (!editor) {
emit currentDocumentChanged(nullptr);
return;
}
auto document = editor->document();
auto textDocument = qobject_cast<TextEditor::TextDocument *>(document);
if (textDocument) {
emit currentDocumentChanged(textDocument);
return;
}
emit currentDocumentChanged(nullptr);
});
}
void onDocumentOpened(Core::IDocument *document)
{
auto textDocument = qobject_cast<TextEditor::TextDocument *>(document);
if (!textDocument)
return;
connect(textDocument, &TextEditor::TextDocument::contentsChanged, this, [this, textDocument] {
emit documentContentsChanged(textDocument);
});
emit documentOpened(textDocument);
}
void onDocumentClosed(Core::IDocument *document)
{
auto textDocument = qobject_cast<TextEditor::TextDocument *>(document);
if (!textDocument)
return;
document->disconnect(this);
emit documentClosed(textDocument);
}
signals:
void documentOpened(TextEditor::TextDocument *document);
void currentDocumentChanged(TextEditor::TextDocument *document);
void documentClosed(TextEditor::TextDocument *document);
void documentContentsChanged(TextEditor::TextDocument *document);
};
void addTextDocumentsModule()
{
TextDocumentRegistry::instance();
LuaEngine::registerProvider("TextDocument", [](sol::state_view lua) -> sol::object {
sol::table documents = lua.create_table();
documents.new_usertype<TextEditor::TextDocument>(
"TextDocument", sol::no_constructor, "file", &TextEditor::TextDocument::filePath);
return documents;
});
LuaEngine::registerHook("editors.text.opened", [](sol::function func) {
QObject::connect(
TextDocumentRegistry::instance(),
&TextDocumentRegistry::documentOpened,
[func](TextEditor::TextDocument *document) {
Utils::expected_str<void> res = LuaEngine::void_safe_call(func, document);
QTC_CHECK_EXPECTED(res);
});
});
LuaEngine::registerHook("editors.text.closed", [](sol::function func) {
QObject::connect(
TextDocumentRegistry::instance(),
&TextDocumentRegistry::documentClosed,
[func](TextEditor::TextDocument *document) {
Utils::expected_str<void> res = LuaEngine::void_safe_call(func, document);
QTC_CHECK_EXPECTED(res);
});
});
LuaEngine::registerHook("editors.text.contentsChanged", [](sol::function func) {
QObject::connect(
TextDocumentRegistry::instance(),
&TextDocumentRegistry::documentContentsChanged,
[func](TextEditor::TextDocument *document) {
Utils::expected_str<void> res = LuaEngine::void_safe_call(func, document);
QTC_CHECK_EXPECTED(res);
});
});
LuaEngine::registerHook("editors.text.currentChanged", [](sol::function func) {
QObject::connect(
TextDocumentRegistry::instance(),
&TextDocumentRegistry::currentDocumentChanged,
[func](TextEditor::TextDocument *document) {
Utils::expected_str<void> res = LuaEngine::void_safe_call(func, document);
QTC_CHECK_EXPECTED(res);
});
});
}
} // namespace Lua::Internal
#include "textdocument.moc"

View File

@@ -33,8 +33,6 @@ QtcPlugin {
"action.cpp", "action.cpp",
"async.cpp", "async.cpp",
"core.cpp", "core.cpp",
"documents.cpp",
"documents.h",
"fetch.cpp", "fetch.cpp",
"gui.cpp", "gui.cpp",
"hook.cpp", "hook.cpp",
@@ -45,6 +43,7 @@ QtcPlugin {
"messagemanager.cpp", "messagemanager.cpp",
"qtcprocess.cpp", "qtcprocess.cpp",
"settings.cpp", "settings.cpp",
"textdocument.cpp",
"utils.cpp", "utils.cpp",
] ]

View File

@@ -35,7 +35,6 @@ namespace Lua::Internal {
void addActionModule(); void addActionModule();
void addAsyncModule(); void addAsyncModule();
void addCoreModule(); void addCoreModule();
void addDocumentsModule();
void addFetchModule(); void addFetchModule();
void addGuiModule(); void addGuiModule();
void addHookModule(); void addHookModule();
@@ -46,6 +45,7 @@ void addMessageManagerModule();
void addProcessModule(); void addProcessModule();
void addQtModule(); void addQtModule();
void addSettingsModule(); void addSettingsModule();
void addTextDocumentsModule();
void addUtilsModule(); void addUtilsModule();
class LuaJsExtension : public QObject class LuaJsExtension : public QObject
@@ -251,7 +251,6 @@ public:
addActionModule(); addActionModule();
addAsyncModule(); addAsyncModule();
addCoreModule(); addCoreModule();
addDocumentsModule();
addFetchModule(); addFetchModule();
addGuiModule(); addGuiModule();
addHookModule(); addHookModule();
@@ -262,6 +261,7 @@ public:
addProcessModule(); addProcessModule();
addQtModule(); addQtModule();
addSettingsModule(); addSettingsModule();
addTextDocumentsModule();
addUtilsModule(); addUtilsModule();
Core::JsExpander::registerGlobalObject("Lua", [] { return new LuaJsExtension(); }); Core::JsExpander::registerGlobalObject("Lua", [] { return new LuaJsExtension(); });

View File

@@ -1,12 +0,0 @@
---@meta Documents
local documents = {}
---@class TextDocument
local TextDocument = {}
---Set a callback that is called when the document is changed.
---@param callback function The callback function. The callback function should not take any arguments.
function TextDocument:setChangedCallback(callback) end
return documents

View File

@@ -34,10 +34,17 @@ QtcPluginDependency = {}
---@class EditorHooks ---@class EditorHooks
---@field documentOpened function function(document) ---@field documentOpened? function function(document)
---@field documentClosed function function(document) ---@field documentClosed? function function(document)
---@field text? TextEditorHooks
EditorHooks = {} EditorHooks = {}
---@class TextEditorHooks
---@field opened? function function(Documents.TextDocument)
---@field closed? function function(Documents.TextDocument)
---@field currentChanged? function function(Documents.TextDocument)
---@field contentsChanged? function function(Documents.TextDocument)
---@class Hooks ---@class Hooks
---@field editors? EditorHooks ---@field editors? EditorHooks
Hooks = {} Hooks = {}

View File

@@ -0,0 +1,10 @@
---@meta TextDocument
---@class TextDocument
local TextDocument = {}
---Returns the file path of the document.
---@return FilePath filePath The file path of the document.
function TextDocument:file() end
return TextDocument