forked from qt-creator/qt-creator
Lua: Cleanup Hooks
Change-Id: I8e3a1d66ea6125d2cc5ee9c8f8442cca0913fec6 Reviewed-by: <lie@spyro-soft.com> Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
@@ -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()
|
||||
|
@@ -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.
|
||||
|
@@ -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
|
||||
)
|
||||
|
@@ -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
|
||||
|
@@ -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
|
@@ -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"
|
||||
|
144
src/plugins/lua/bindings/textdocument.cpp
Normal file
144
src/plugins/lua/bindings/textdocument.cpp
Normal 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"
|
@@ -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",
|
||||
]
|
||||
|
||||
|
@@ -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(); });
|
||||
|
@@ -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
|
@@ -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 = {}
|
||||
|
10
src/plugins/lua/meta/textdocument.lua
Normal file
10
src/plugins/lua/meta/textdocument.lua
Normal 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
|
Reference in New Issue
Block a user