diff options
author | Kae <80987908+Novaenia@users.noreply.github.com> | 2023-07-02 17:19:54 +1000 |
---|---|---|
committer | Kae <80987908+Novaenia@users.noreply.github.com> | 2023-07-02 17:19:54 +1000 |
commit | 2386a9534289baf73ce299f33e110f612ff55e38 (patch) | |
tree | 19dca601d4bb7fa0bae23944485ad87024a034ef /source/frontend/StarScriptPane.cpp | |
parent | 73841ee041b8b52f5fde16dc272228704697bcb8 (diff) |
Input Binding support
Diffstat (limited to 'source/frontend/StarScriptPane.cpp')
-rw-r--r-- | source/frontend/StarScriptPane.cpp | 113 |
1 files changed, 10 insertions, 103 deletions
diff --git a/source/frontend/StarScriptPane.cpp b/source/frontend/StarScriptPane.cpp index e2e8a33..38659f1 100644 --- a/source/frontend/StarScriptPane.cpp +++ b/source/frontend/StarScriptPane.cpp @@ -20,64 +20,34 @@ namespace Star { -ScriptPane::ScriptPane(UniverseClientPtr client, Json config, EntityId sourceEntityId) { +ScriptPane::ScriptPane(UniverseClientPtr client, Json config, EntityId sourceEntityId) : BaseScriptPane(config) { auto& root = Root::singleton(); auto assets = root.assets(); m_client = move(client); - - if (config.type() == Json::Type::Object && config.contains("baseConfig")) { - auto baseConfig = assets->fetchJson(config.getString("baseConfig")); - m_config = jsonMerge(baseConfig, config); - } else { - m_config = assets->fetchJson(config); - } m_sourceEntityId = sourceEntityId; - m_reader.registerCallback("close", [this](Widget*) { dismiss(); }); - - for (auto const& callbackName : jsonToStringList(m_config.get("scriptWidgetCallbacks", JsonArray{}))) { - m_reader.registerCallback(callbackName, [this, callbackName](Widget* widget) { - m_script.invoke(callbackName, widget->name(), widget->data()); - }); - } - - m_reader.construct(assets->fetchJson(m_config.get("gui")), this); - - for (auto pair : m_config.getObject("canvasClickCallbacks", {})) - m_canvasClickCallbacks.set(findChild<CanvasWidget>(pair.first), pair.second.toString()); - for (auto pair : m_config.getObject("canvasKeyCallbacks", {})) - m_canvasKeyCallbacks.set(findChild<CanvasWidget>(pair.first), pair.second.toString()); - - m_script.setScripts(jsonToStringList(m_config.get("scripts", JsonArray()))); - m_script.addCallbacks("pane", makePaneCallbacks()); - m_script.addCallbacks("widget", LuaBindings::makeWidgetCallbacks(this, &m_reader)); - m_script.addCallbacks("config", LuaBindings::makeConfigCallbacks( [this](String const& name, Json const& def) { - return m_config.query(name, def); - })); m_script.addCallbacks("player", LuaBindings::makePlayerCallbacks(m_client->mainPlayer().get())); m_script.addCallbacks("status", LuaBindings::makeStatusControllerCallbacks(m_client->mainPlayer()->statusController())); m_script.addCallbacks("celestial", LuaBindings::makeCelestialCallbacks(m_client.get())); - m_script.setUpdateDelta(m_config.getUInt("scriptDelta", 1)); } void ScriptPane::displayed() { - Pane::displayed(); auto world = m_client->worldClient(); - if (world && world->inWorld()) - m_script.init(world.get()); - - m_script.invoke("displayed"); + if (world && world->inWorld()) { + m_script.setLuaRoot(world->luaRoot()); + m_script.addCallbacks("world", LuaBindings::makeWorldCallbacks(world.get())); + } + BaseScriptPane::displayed(); } void ScriptPane::dismissed() { - Pane::dismissed(); - m_script.invoke("dismissed"); - m_script.uninit(); + BaseScriptPane::dismissed(); + m_script.removeCallbacks("world"); } void ScriptPane::tick() { - Pane::tick(); + BaseScriptPane::tick(); if (m_sourceEntityId != NullEntityId && !m_client->worldClient()->playerCanReachEntity(m_sourceEntityId)) dismiss(); @@ -98,17 +68,6 @@ void ScriptPane::tick() { m_script.update(m_script.updateDt()); } -bool ScriptPane::sendEvent(InputEvent const& event) { - // Intercept GuiClose before the canvas child so GuiClose always closes - // ScriptPanes without having to support it in the script. - if (context()->actions(event).contains(InterfaceAction::GuiClose)) { - dismiss(); - return true; - } - - return Pane::sendEvent(event); -} - PanePtr ScriptPane::createTooltip(Vec2I const& screenPosition) { auto result = m_script.invoke<Json>("createTooltip", screenPosition); if (result && !result.value().isNull()) { @@ -133,61 +92,9 @@ PanePtr ScriptPane::createTooltip(Vec2I const& screenPosition) { } } -Maybe<String> ScriptPane::cursorOverride(Vec2I const& screenPosition) { - auto result = m_script.invoke<Maybe<String>>("cursorOverride", screenPosition); - if (result) - return *result; - else - return {}; -} - LuaCallbacks ScriptPane::makePaneCallbacks() { - LuaCallbacks callbacks; - + LuaCallbacks callbacks = BaseScriptPane::makePaneCallbacks(); callbacks.registerCallback("sourceEntity", [this]() { return m_sourceEntityId; }); - callbacks.registerCallback("dismiss", [this]() { dismiss(); }); - - callbacks.registerCallback("playSound", - [this](String const& audio, Maybe<int> loops, Maybe<float> volume) { - auto assets = Root::singleton().assets(); - auto config = Root::singleton().configuration(); - auto audioInstance = make_shared<AudioInstance>(*assets->audio(audio)); - audioInstance->setVolume(volume.value(1.0)); - audioInstance->setLoops(loops.value(0)); - auto& guiContext = GuiContext::singleton(); - guiContext.playAudio(audioInstance); - m_playingSounds.append({audio, move(audioInstance)}); - }); - - callbacks.registerCallback("stopAllSounds", [this](String const& audio) { - m_playingSounds.filter([audio](pair<String, AudioInstancePtr> const& p) { - if (p.first == audio) { - p.second->stop(); - return false; - } - return true; - }); - }); - - callbacks.registerCallback("setTitle", [this](String const& title, String const& subTitle) { - setTitleString(title, subTitle); - }); - - callbacks.registerCallback("setTitleIcon", [this](String const& image) { - if (auto icon = as<ImageWidget>(titleIcon())) - icon->setImage(image); - }); - - callbacks.registerCallback("addWidget", [this](Json const& newWidgetConfig, Maybe<String> const& newWidgetName) { - String name = newWidgetName.value(strf("{}", Random::randu64())); - WidgetPtr newWidget = m_reader.makeSingle(name, newWidgetConfig); - this->addChild(name, newWidget); - }); - - callbacks.registerCallback("removeWidget", [this](String const& widgetName) { - this->removeChild(widgetName); - }); - return callbacks; } |