载入中...
搜索中...
未找到
ScriptEditorTool.cpp
浏览该文件的文档.
2
3#include <simplesquirrel/simplesquirrel.hpp>
4
5namespace eve::editor {
6
9 ssq::Object activate;
10 ssq::Object deactivate;
11 ssq::Object pointer;
12 ssq::Object key;
13 ssq::Object update;
14 ssq::Object cancel;
15};
16
17namespace {
18
19template <typename... Args>
20void invoke(const ssq::Object &callback, const Args &...args) {
21 if (callback.isEmpty()) return;
22 ssq::Function function = callback.toFunction();
23 if (function.isEmpty()) return;
24 HSQUIRRELVM vm = function.getHandle();
25 const SQInteger top = sq_gettop(vm);
26 sq_pushobject(vm, function.getRaw());
27 sq_pushroottable(vm);
28 (ssq::detail::pushValue(vm, args), ...);
29 sq_call(vm, sizeof...(Args) + 1, SQFalse, SQTrue);
30 sq_settop(vm, top);
31}
32
33template <typename... Args>
34int invokeFlags(const ssq::Object &callback, const Args &...args) {
35 if (callback.isEmpty()) return 0;
36 ssq::Function function = callback.toFunction();
37 if (function.isEmpty()) return 0;
38 HSQUIRRELVM vm = function.getHandle();
39 const SQInteger top = sq_gettop(vm);
40 sq_pushobject(vm, function.getRaw());
41 sq_pushroottable(vm);
42 (ssq::detail::pushValue(vm, args), ...);
43 int flags = 0;
44 if (SQ_SUCCEEDED(sq_call(vm, sizeof...(Args) + 1, SQTrue, SQTrue))) {
45 SQInteger result = 0;
46 if (SQ_SUCCEEDED(sq_getinteger(vm, -1, &result))) flags = static_cast<int>(result);
47 }
48 sq_settop(vm, top);
49 return flags;
50}
51
52ToolResponse responseFromFlags(int flags) {
53 return {(flags & 1) != 0, (flags & 2) != 0, (flags & 4) != 0};
54}
55
56} // namespace
57
58ScriptEditorTool::ScriptEditorTool(std::string id, std::string label) : impl_(new Impl) {
59 impl_->descriptor.id = std::move(id);
60 impl_->descriptor.label = std::move(label);
61}
62
64
65const ToolDescriptor &ScriptEditorTool::descriptor() const { return impl_->descriptor; }
66void ScriptEditorTool::setShortcut(const std::string &shortcut) { impl_->descriptor.shortcut = shortcut; }
67void ScriptEditorTool::setActivateCallback(ssq::Object callback) { impl_->activate = std::move(callback); }
68void ScriptEditorTool::setDeactivateCallback(ssq::Object callback) { impl_->deactivate = std::move(callback); }
69void ScriptEditorTool::setPointerCallback(ssq::Object callback) { impl_->pointer = std::move(callback); }
70void ScriptEditorTool::setKeyCallback(ssq::Object callback) { impl_->key = std::move(callback); }
71void ScriptEditorTool::setUpdateCallback(ssq::Object callback) { impl_->update = std::move(callback); }
72void ScriptEditorTool::setCancelCallback(ssq::Object callback) { impl_->cancel = std::move(callback); }
73
74void ScriptEditorTool::activate(EditorContext &) { invoke(impl_->activate); }
75void ScriptEditorTool::deactivate(EditorContext &) { invoke(impl_->deactivate); }
76void ScriptEditorTool::cancel(EditorContext &) { invoke(impl_->cancel); }
77void ScriptEditorTool::update(EditorContext &, float dt) { invoke(impl_->update, dt); }
78
80 return responseFromFlags(invokeFlags(impl_->pointer, static_cast<int>(event.phase),
81 event.pointerId, event.button, event.x, event.y,
82 event.deltaX, event.deltaY, event.pressure,
83 event.shift, event.control, event.alt));
84}
85
87 return responseFromFlags(invokeFlags(impl_->key, event.key, event.pressed, event.repeated,
88 event.shift, event.control, event.alt));
89}
90
91} // namespace eve::editor
SQInteger top
struct SQVM * HSQUIRRELVM
std::string label
HSQUIRRELVM vm
Definition ECS.cpp:20
MigrationFunction function
ViewPreparation callback
Context supplied by EditorSession to tools.
Definition EditorTool.h:71
ToolResponse keyEvent(EditorContext &context, const EditorKeyEvent &event) override
Key event.
void update(EditorContext &context, float dt) override
Updates .
const ToolDescriptor & descriptor() const override
Descriptor.
void activate(EditorContext &context) override
Activate.
void setActivateCallback(ssq::Object callback)
Set a closure invoked when the tool becomes active.
~ScriptEditorTool() override
Releases ScriptEditorTool resources.
void setKeyCallback(ssq::Object callback)
Set a closure invoked for normalized key input.
void deactivate(EditorContext &context) override
Deactivate.
void setUpdateCallback(ssq::Object callback)
Set a closure invoked every active frame with delta time.
void cancel(EditorContext &context) override
Cancel.
ScriptEditorTool(std::string id, std::string label)
Constructs a ScriptEditorTool.
void setShortcut(const std::string &shortcut)
Set the shortcut shown by hosts.
ToolResponse pointerEvent(EditorContext &context, const EditorPointerEvent &event) override
Pointer event.
void setDeactivateCallback(ssq::Object callback)
Set a closure invoked when the tool becomes inactive.
void setPointerCallback(ssq::Object callback)
Set a closure invoked for normalized pointer input.
void setCancelCallback(ssq::Object callback)
Set a closure invoked when the current gesture is cancelled.
void pushValue(HSQUIRRELVM vm, const eve::rx::Value &v)
Definition Rx.cpp:91
Keyboard input normalized by the editor host.
Definition EditorTool.h:40
Pointer input normalized by an editor viewport adapter.
Definition EditorTool.h:20
UI-facing metadata supplied by a tool implementation.
Definition EditorTool.h:98
Result returned by a tool after processing input.
Definition EditorTool.h:50