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 = {
editors = {
documentOpened = function(document) require 'init'.Hooks.onDocumentOpened(document) end,
documentClosed = function(document) require 'init'.Hooks.onDocumentClosed(document) end,
text = {
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()

View File

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

View File

@@ -1,4 +1,3 @@
add_qtc_plugin(Lua
PLUGIN_DEPENDS Core
PUBLIC_DEPENDS lua546 sol2 TextEditor
@@ -7,8 +6,6 @@ add_qtc_plugin(Lua
bindings/action.cpp
bindings/async.cpp
bindings/core.cpp
bindings/documents.cpp
bindings/documents.h
bindings/fetch.cpp
bindings/gui.cpp
bindings/hook.cpp
@@ -19,6 +16,7 @@ add_qtc_plugin(Lua
bindings/messagemanager.cpp
bindings/qtcprocess.cpp
bindings/settings.cpp
bindings/textdocument.cpp
bindings/utils.cpp
luaengine.cpp
luaengine.h
@@ -28,24 +26,6 @@ add_qtc_plugin(Lua
luaqttypes.cpp
luaqttypes.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
# 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)
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
DESTINATION ${IDE_DATA_PATH}/lua
FILES ${META_FILES}
)
install(
FILES ${META_FILES}
DIRECTORIES 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 "documents.h"
#include <coreplugin/editormanager/editormanager.h>
#include <texteditor/textdocument.h>
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 {
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) {
QObject::connect(
Core::EditorManager::instance(),
&Core::EditorManager::documentOpened,
[func](Core::IDocument *document) {
auto text_document = qobject_cast<TextEditor::TextDocument *>(document);
if (text_document) {
QTC_CHECK_EXPECTED(LuaEngine::void_safe_call(
func, std::make_unique<LuaTextDocument>(text_document)));
}
Utils::expected_str<void> res = LuaEngine::void_safe_call(func, document);
QTC_CHECK_EXPECTED(res);
});
});
@@ -66,11 +27,8 @@ void addHookModule()
Core::EditorManager::instance(),
&Core::EditorManager::documentClosed,
[func](Core::IDocument *document) {
auto text_document = qobject_cast<TextEditor::TextDocument *>(document);
if (text_document) {
QTC_CHECK_EXPECTED(LuaEngine::void_safe_call(
func, std::make_unique<LuaTextDocument>(text_document)));
}
Utils::expected_str<void> res = LuaEngine::void_safe_call(func, document);
QTC_CHECK_EXPECTED(res);
});
});
}
@@ -78,5 +36,3 @@ void addHookModule()
} // namespace Internal
} // 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",
"async.cpp",
"core.cpp",
"documents.cpp",
"documents.h",
"fetch.cpp",
"gui.cpp",
"hook.cpp",
@@ -45,6 +43,7 @@ QtcPlugin {
"messagemanager.cpp",
"qtcprocess.cpp",
"settings.cpp",
"textdocument.cpp",
"utils.cpp",
]

View File

@@ -35,7 +35,6 @@ namespace Lua::Internal {
void addActionModule();
void addAsyncModule();
void addCoreModule();
void addDocumentsModule();
void addFetchModule();
void addGuiModule();
void addHookModule();
@@ -46,6 +45,7 @@ void addMessageManagerModule();
void addProcessModule();
void addQtModule();
void addSettingsModule();
void addTextDocumentsModule();
void addUtilsModule();
class LuaJsExtension : public QObject
@@ -251,7 +251,6 @@ public:
addActionModule();
addAsyncModule();
addCoreModule();
addDocumentsModule();
addFetchModule();
addGuiModule();
addHookModule();
@@ -262,6 +261,7 @@ public:
addProcessModule();
addQtModule();
addSettingsModule();
addTextDocumentsModule();
addUtilsModule();
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
---@field documentOpened function function(document)
---@field documentClosed function function(document)
---@field documentOpened? function function(document)
---@field documentClosed? function function(document)
---@field text? TextEditorHooks
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
---@field editors? EditorHooks
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