Веб-сайт самохостера Lotigara

summaryrefslogtreecommitdiff
path: root/source/frontend
diff options
context:
space:
mode:
Diffstat (limited to 'source/frontend')
-rw-r--r--source/frontend/CMakeLists.txt4
-rw-r--r--source/frontend/StarBaseScriptPane.cpp183
-rw-r--r--source/frontend/StarBaseScriptPane.hpp45
-rw-r--r--source/frontend/StarBindingsMenu.cpp23
-rw-r--r--source/frontend/StarBindingsMenu.hpp24
-rw-r--r--source/frontend/StarMainInterface.cpp22
-rw-r--r--source/frontend/StarMainInterface.hpp2
-rw-r--r--source/frontend/StarOptionsMenu.cpp13
-rw-r--r--source/frontend/StarOptionsMenu.hpp4
-rw-r--r--source/frontend/StarScriptPane.cpp113
-rw-r--r--source/frontend/StarScriptPane.hpp21
11 files changed, 320 insertions, 134 deletions
diff --git a/source/frontend/CMakeLists.txt b/source/frontend/CMakeLists.txt
index cd06ce7..50c4229 100644
--- a/source/frontend/CMakeLists.txt
+++ b/source/frontend/CMakeLists.txt
@@ -13,6 +13,8 @@ INCLUDE_DIRECTORIES (
SET (star_frontend_HEADERS
StarActionBar.hpp
StarAiInterface.hpp
+ StarBaseScriptPane.hpp
+ StarBindingsMenu.hpp
StarBookmarkInterface.hpp
StarChat.hpp
StarCharCreation.hpp
@@ -59,6 +61,8 @@ SET (star_frontend_HEADERS
SET (star_frontend_SOURCES
StarActionBar.cpp
StarAiInterface.cpp
+ StarBaseScriptPane.cpp
+ StarBindingsMenu.cpp
StarBookmarkInterface.cpp
StarChat.cpp
StarCharCreation.cpp
diff --git a/source/frontend/StarBaseScriptPane.cpp b/source/frontend/StarBaseScriptPane.cpp
new file mode 100644
index 0000000..a174622
--- /dev/null
+++ b/source/frontend/StarBaseScriptPane.cpp
@@ -0,0 +1,183 @@
+#include "StarBaseScriptPane.hpp"
+#include "StarRoot.hpp"
+#include "StarAssets.hpp"
+#include "StarGuiReader.hpp"
+#include "StarJsonExtra.hpp"
+#include "StarConfigLuaBindings.hpp"
+#include "StarLuaGameConverters.hpp"
+#include "StarWidgetLuaBindings.hpp"
+#include "StarCanvasWidget.hpp"
+#include "StarItemTooltip.hpp"
+#include "StarItemGridWidget.hpp"
+#include "StarSimpleTooltip.hpp"
+#include "StarImageWidget.hpp"
+
+namespace Star {
+
+BaseScriptPane::BaseScriptPane(Json config) : Pane() {
+ auto& root = Root::singleton();
+ auto assets = root.assets();
+
+ 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_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.setUpdateDelta(m_config.getUInt("scriptDelta", 1));
+
+ m_callbacksAdded = false;
+}
+
+void BaseScriptPane::show() {
+ Pane::show();
+}
+
+void BaseScriptPane::displayed() {
+ Pane::displayed();
+ if (!m_callbacksAdded) {
+ 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_callbacksAdded = true;
+ }
+ m_script.init();
+ m_script.invoke("displayed");
+}
+
+void BaseScriptPane::dismissed() {
+ Pane::dismissed();
+ m_script.invoke("dismissed");
+ m_script.uninit();
+}
+
+void BaseScriptPane::tick() {
+ Pane::tick();
+
+ for (auto p : m_canvasClickCallbacks) {
+ for (auto const& clickEvent : p.first->pullClickEvents())
+ m_script.invoke(p.second, jsonFromVec2I(clickEvent.position), (uint8_t)clickEvent.button, clickEvent.buttonDown);
+ }
+ for (auto p : m_canvasKeyCallbacks) {
+ for (auto const& keyEvent : p.first->pullKeyEvents())
+ m_script.invoke(p.second, (int)keyEvent.key, keyEvent.keyDown);
+ }
+
+ m_playingSounds.filter([](pair<String, AudioInstancePtr> const& p) {
+ return p.second->finished() == false;
+ });
+
+ m_script.update(m_script.updateDt());
+}
+
+bool BaseScriptPane::sendEvent(InputEvent const& event) {
+ // Intercept GuiClose before the canvas child so GuiClose always closes
+ // BaseScriptPanes without having to support it in the script.
+ if (context()->actions(event).contains(InterfaceAction::GuiClose)) {
+ dismiss();
+ return true;
+ }
+
+ return Pane::sendEvent(event);
+}
+
+PanePtr BaseScriptPane::createTooltip(Vec2I const& screenPosition) {
+ auto result = m_script.invoke<Json>("createTooltip", screenPosition);
+ if (result && !result.value().isNull()) {
+ if (result->type() == Json::Type::String) {
+ return SimpleTooltipBuilder::buildTooltip(result->toString());
+ } else {
+ PanePtr tooltip = make_shared<Pane>();
+ m_reader.construct(*result, tooltip.get());
+ return tooltip;
+ }
+ } else {
+ ItemPtr item;
+ if (auto child = getChildAt(screenPosition)) {
+ if (auto itemSlot = as<ItemSlotWidget>(child))
+ item = itemSlot->item();
+ if (auto itemGrid = as<ItemGridWidget>(child))
+ item = itemGrid->itemAt(screenPosition);
+ }
+ if (item)
+ return ItemTooltipBuilder::buildItemTooltip(item);
+ return {};
+ }
+}
+
+Maybe<String> BaseScriptPane::cursorOverride(Vec2I const& screenPosition) {
+ auto result = m_script.invoke<Maybe<String>>("cursorOverride", screenPosition);
+ if (result)
+ return *result;
+ else
+ return {};
+}
+
+LuaCallbacks BaseScriptPane::makePaneCallbacks() {
+ LuaCallbacks callbacks;
+
+ 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;
+}
+
+}
diff --git a/source/frontend/StarBaseScriptPane.hpp b/source/frontend/StarBaseScriptPane.hpp
new file mode 100644
index 0000000..f88cd40
--- /dev/null
+++ b/source/frontend/StarBaseScriptPane.hpp
@@ -0,0 +1,45 @@
+#ifndef STAR_BASE_SCRIPT_PANE_HPP
+#define STAR_BASE_SCRIPT_PANE_HPP
+
+#include "StarPane.hpp"
+#include "StarLuaComponents.hpp"
+#include "StarGuiReader.hpp"
+
+namespace Star {
+
+STAR_CLASS(CanvasWidget);
+STAR_CLASS(BaseScriptPane);
+
+// A more 'raw' script pane that doesn't depend on a world being present.
+// Requires a derived class to provide a Lua root.
+class BaseScriptPane : public Pane {
+public:
+ BaseScriptPane(Json config);
+
+ virtual void show() override;
+ void displayed() override;
+ void dismissed() override;
+
+ void tick() override;
+
+ bool sendEvent(InputEvent const& event) override;
+
+ PanePtr createTooltip(Vec2I const& screenPosition) override;
+ Maybe<String> cursorOverride(Vec2I const& screenPosition) override;
+protected:
+ virtual LuaCallbacks makePaneCallbacks();
+ Json m_config;
+
+ GuiReader m_reader;
+
+ Map<CanvasWidgetPtr, String> m_canvasClickCallbacks;
+ Map<CanvasWidgetPtr, String> m_canvasKeyCallbacks;
+
+ bool m_callbacksAdded;
+ LuaUpdatableComponent<LuaBaseComponent> m_script;
+ List<pair<String, AudioInstancePtr>> m_playingSounds;
+};
+
+}
+
+#endif
diff --git a/source/frontend/StarBindingsMenu.cpp b/source/frontend/StarBindingsMenu.cpp
new file mode 100644
index 0000000..ec56e19
--- /dev/null
+++ b/source/frontend/StarBindingsMenu.cpp
@@ -0,0 +1,23 @@
+#include "StarBindingsMenu.hpp"
+#include "StarInputLuaBindings.hpp"
+
+namespace Star {
+
+BindingsMenu::BindingsMenu(Json const& config) : BaseScriptPane(config) {
+ m_script.setLuaRoot(make_shared<LuaRoot>());
+ m_script.addCallbacks("input", LuaBindings::makeInputCallbacks());
+}
+
+void BindingsMenu::show() {
+ BaseScriptPane::show();
+}
+
+void BindingsMenu::displayed() {
+ BaseScriptPane::displayed();
+}
+
+void BindingsMenu::dismissed() {
+ BaseScriptPane::dismissed();
+}
+
+} \ No newline at end of file
diff --git a/source/frontend/StarBindingsMenu.hpp b/source/frontend/StarBindingsMenu.hpp
new file mode 100644
index 0000000..53d08ed
--- /dev/null
+++ b/source/frontend/StarBindingsMenu.hpp
@@ -0,0 +1,24 @@
+#ifndef STAR_BINDINGS_MENU_HPP
+#define STAR_BINDINGS_MENU_HPP
+
+#include "StarBaseScriptPane.hpp"
+
+namespace Star {
+
+STAR_CLASS(BindingsMenu);
+
+class BindingsMenu : public BaseScriptPane {
+public:
+ BindingsMenu(Json const& config);
+
+ virtual void show() override;
+ void displayed() override;
+ void dismissed() override;
+
+private:
+
+};
+
+}
+
+#endif
diff --git a/source/frontend/StarMainInterface.cpp b/source/frontend/StarMainInterface.cpp
index 2664d2c..86c7bb6 100644
--- a/source/frontend/StarMainInterface.cpp
+++ b/source/frontend/StarMainInterface.cpp
@@ -357,7 +357,7 @@ bool MainInterface::handleInputEvent(InputEvent const& event) {
} else if (auto mouseDown = event.ptr<MouseButtonDownEvent>()) {
if (mouseDown->mouseButton == MouseButton::Left || mouseDown->mouseButton == MouseButton::Right
|| mouseDown->mouseButton == MouseButton::Middle)
- overlayClick(mouseDown->mousePosition, mouseDown->mouseButton);
+ return overlayClick(mouseDown->mousePosition, mouseDown->mouseButton);
} else if (auto mouseUp = event.ptr<MouseButtonUpEvent>()) {
if (mouseUp->mouseButton == MouseButton::Left)
@@ -1428,7 +1428,7 @@ bool MainInterface::overButton(PolyI buttonPoly, Vec2I const& mousePos) const {
return buttonPoly.contains(mousePos);
}
-void MainInterface::overlayClick(Vec2I const& mousePos, MouseButton mouseButton) {
+bool MainInterface::overlayClick(Vec2I const& mousePos, MouseButton mouseButton) {
PolyI mainBarPoly = m_config->mainBarPoly;
Vec2I barPos = mainBarPosition();
mainBarPoly.translate(barPos);
@@ -1436,17 +1436,17 @@ void MainInterface::overlayClick(Vec2I const& mousePos, MouseButton mouseButton)
if (overButton(m_config->mainBarInventoryButtonPoly, mousePos)) {
m_paneManager.toggleRegisteredPane(MainInterfacePanes::Inventory);
- return;
+ return true;
}
if (overButton(m_config->mainBarCraftButtonPoly, mousePos)) {
togglePlainCraftingWindow();
- return;
+ return true;
}
if (overButton(m_config->mainBarCodexButtonPoly, mousePos)) {
m_paneManager.toggleRegisteredPane(MainInterfacePanes::Codex);
- return;
+ return true;
}
if (overButton(m_config->mainBarDeployButtonPoly, mousePos)) {
@@ -1454,29 +1454,29 @@ void MainInterface::overlayClick(Vec2I const& mousePos, MouseButton mouseButton)
warpToOrbitedWorld(true);
else if (m_client->canBeamUp())
warpToOwnShip();
- return;
+ return true;
}
if (overButton(m_config->mainBarBeamButtonPoly, mousePos)) {
if (m_client->canBeamDown())
warpToOrbitedWorld();
- return;
+ return true;
}
if (overButton(m_config->mainBarQuestLogButtonPoly, mousePos)) {
m_paneManager.toggleRegisteredPane(MainInterfacePanes::QuestLog);
- return;
+ return true;
}
if (overButton(m_config->mainBarMmUpgradeButtonPoly, mousePos)) {
if (m_client->mainPlayer()->inventory()->essentialItem(EssentialItem::BeamAxe))
m_paneManager.toggleRegisteredPane(MainInterfacePanes::MmUpgrade);
- return;
+ return true;
}
if (overButton(m_config->mainBarCollectionsButtonPoly, mousePos)) {
m_paneManager.toggleRegisteredPane(MainInterfacePanes::Collections);
- return;
+ return true;
}
if (mouseButton == MouseButton::Left)
@@ -1485,6 +1485,8 @@ void MainInterface::overlayClick(Vec2I const& mousePos, MouseButton mouseButton)
m_client->mainPlayer()->beginAltFire();
if (mouseButton == MouseButton::Middle)
m_client->mainPlayer()->beginTrigger();
+
+ return false;
}
} \ No newline at end of file
diff --git a/source/frontend/StarMainInterface.hpp b/source/frontend/StarMainInterface.hpp
index aae2890..403b250 100644
--- a/source/frontend/StarMainInterface.hpp
+++ b/source/frontend/StarMainInterface.hpp
@@ -135,7 +135,7 @@ private:
bool overButton(PolyI buttonPoly, Vec2I const& mousePos) const;
- void overlayClick(Vec2I const& mousePos, MouseButton mouseButton);
+ bool overlayClick(Vec2I const& mousePos, MouseButton mouseButton);
GuiContext* m_guiContext;
MainInterfaceConfigConstPtr m_config;
diff --git a/source/frontend/StarOptionsMenu.cpp b/source/frontend/StarOptionsMenu.cpp
index 1805a06..cef2e7d 100644
--- a/source/frontend/StarOptionsMenu.cpp
+++ b/source/frontend/StarOptionsMenu.cpp
@@ -7,6 +7,7 @@
#include "StarLabelWidget.hpp"
#include "StarAssets.hpp"
#include "StarKeybindingsMenu.hpp"
+#include "StarBindingsMenu.hpp"
#include "StarGraphicsMenu.hpp"
namespace Star {
@@ -48,11 +49,16 @@ OptionsMenu::OptionsMenu(PaneManager* manager)
reader.registerCallback("showKeybindings", [=](Widget*) {
displayControls();
});
+ reader.registerCallback("showModBindings", [=](Widget*) {
+ displayModBindings();
+ });
reader.registerCallback("showGraphics", [=](Widget*) {
displayGraphics();
});
- reader.construct(assets->json("/interface/optionsmenu/optionsmenu.config:paneLayout"), this);
+ Json config = assets->json("/interface/optionsmenu/optionsmenu.config");
+
+ reader.construct(config.get("paneLayout"), this);
m_sfxSlider = fetchChild<SliderBarWidget>("sfxSlider");
m_musicSlider = fetchChild<SliderBarWidget>("musicSlider");
@@ -68,6 +74,7 @@ OptionsMenu::OptionsMenu(PaneManager* manager)
m_sfxSlider->setRange(m_sfxRange, assets->json("/interface/optionsmenu/optionsmenu.config:sfxDelta").toInt());
m_musicSlider->setRange(m_musicRange, assets->json("/interface/optionsmenu/optionsmenu.config:musicDelta").toInt());
+ m_modBindingsMenu = make_shared<BindingsMenu>(assets->json(config.getString("bindingsPanePath", "/interface/opensb/bindings/bindings.config")));
m_keybindingsMenu = make_shared<KeybindingsMenu>();
m_graphicsMenu = make_shared<GraphicsMenu>();
@@ -162,6 +169,10 @@ void OptionsMenu::displayControls() {
m_paneManager->displayPane(PaneLayer::ModalWindow, m_keybindingsMenu);
}
+void OptionsMenu::displayModBindings() {
+ m_paneManager->displayPane(PaneLayer::ModalWindow, m_modBindingsMenu);
+}
+
void OptionsMenu::displayGraphics() {
m_paneManager->displayPane(PaneLayer::ModalWindow, m_graphicsMenu);
}
diff --git a/source/frontend/StarOptionsMenu.hpp b/source/frontend/StarOptionsMenu.hpp
index 14158be..bd8c4ba 100644
--- a/source/frontend/StarOptionsMenu.hpp
+++ b/source/frontend/StarOptionsMenu.hpp
@@ -12,7 +12,7 @@ STAR_CLASS(ButtonWidget);
STAR_CLASS(LabelWidget);
STAR_CLASS(KeybindingsMenu);
STAR_CLASS(GraphicsMenu);
-
+STAR_CLASS(BindingsMenu);
STAR_CLASS(OptionsMenu);
class OptionsMenu : public Pane {
@@ -38,6 +38,7 @@ private:
void syncGuiToConf();
void displayControls();
+ void displayModBindings();
void displayGraphics();
SliderBarWidgetPtr m_sfxSlider;
@@ -58,6 +59,7 @@ private:
JsonObject m_origConfig;
JsonObject m_localChanges;
+ BindingsMenuPtr m_modBindingsMenu;
KeybindingsMenuPtr m_keybindingsMenu;
GraphicsMenuPtr m_graphicsMenu;
PaneManager* m_paneManager;
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;
}
diff --git a/source/frontend/StarScriptPane.hpp b/source/frontend/StarScriptPane.hpp
index 1ba7ea0..d994b68 100644
--- a/source/frontend/StarScriptPane.hpp
+++ b/source/frontend/StarScriptPane.hpp
@@ -1,9 +1,7 @@
#ifndef STAR_SCRIPT_PANE_HPP
#define STAR_SCRIPT_PANE_HPP
-#include "StarPane.hpp"
-#include "StarLuaComponents.hpp"
-#include "StarGuiReader.hpp"
+#include "StarBaseScriptPane.hpp"
namespace Star {
@@ -11,7 +9,7 @@ STAR_CLASS(CanvasWidget);
STAR_CLASS(ScriptPane);
STAR_CLASS(UniverseClient);
-class ScriptPane : public Pane {
+class ScriptPane : public BaseScriptPane {
public:
ScriptPane(UniverseClientPtr client, Json config, EntityId sourceEntityId = NullEntityId);
@@ -20,28 +18,15 @@ public:
void tick() override;
- bool sendEvent(InputEvent const& event) override;
-
PanePtr createTooltip(Vec2I const& screenPosition) override;
- Maybe<String> cursorOverride(Vec2I const& screenPosition) override;
bool openWithInventory() const;
private:
- LuaCallbacks makePaneCallbacks();
+ LuaCallbacks makePaneCallbacks() override;
UniverseClientPtr m_client;
EntityId m_sourceEntityId;
- Json m_config;
-
- GuiReader m_reader;
-
- Map<CanvasWidgetPtr, String> m_canvasClickCallbacks;
- Map<CanvasWidgetPtr, String> m_canvasKeyCallbacks;
-
- LuaWorldComponent<LuaUpdatableComponent<LuaBaseComponent>> m_script;
-
- List<pair<String, AudioInstancePtr>> m_playingSounds;
};
}