diff options
Diffstat (limited to 'source/frontend')
-rw-r--r-- | source/frontend/CMakeLists.txt | 2 | ||||
-rw-r--r-- | source/frontend/StarInterfaceLuaBindings.cpp | 21 | ||||
-rw-r--r-- | source/frontend/StarInterfaceLuaBindings.hpp | 16 | ||||
-rw-r--r-- | source/frontend/StarMainInterface.cpp | 23 | ||||
-rw-r--r-- | source/frontend/StarMainInterface.hpp | 5 | ||||
-rw-r--r-- | source/frontend/StarScriptPane.cpp | 1 | ||||
-rw-r--r-- | source/frontend/StarWidgetLuaBindings.cpp | 139 | ||||
-rw-r--r-- | source/frontend/StarWidgetLuaBindings.hpp | 9 |
8 files changed, 148 insertions, 68 deletions
diff --git a/source/frontend/CMakeLists.txt b/source/frontend/CMakeLists.txt index 50c4229..4772aa0 100644 --- a/source/frontend/CMakeLists.txt +++ b/source/frontend/CMakeLists.txt @@ -32,6 +32,7 @@ SET (star_frontend_HEADERS StarGraphicsMenu.hpp StarInventory.hpp StarInterfaceCursor.hpp + StarInterfaceLuaBindings.hpp StarItemTooltip.hpp StarJoinRequestDialog.hpp StarKeybindingsMenu.hpp @@ -80,6 +81,7 @@ SET (star_frontend_SOURCES StarGraphicsMenu.cpp StarInventory.cpp StarInterfaceCursor.cpp + StarInterfaceLuaBindings.cpp StarItemTooltip.cpp StarJoinRequestDialog.cpp StarKeybindingsMenu.cpp diff --git a/source/frontend/StarInterfaceLuaBindings.cpp b/source/frontend/StarInterfaceLuaBindings.cpp new file mode 100644 index 0000000..a9257aa --- /dev/null +++ b/source/frontend/StarInterfaceLuaBindings.cpp @@ -0,0 +1,21 @@ +#include "StarInterfaceLuaBindings.hpp" +#include "StarWidgetLuaBindings.hpp" +#include "StarJsonExtra.hpp" +#include "StarLuaGameConverters.hpp" +#include "StarMainInterface.hpp" + +namespace Star { + +LuaCallbacks LuaBindings::makeInterfaceCallbacks(MainInterface* mainInterface) { + LuaCallbacks callbacks; + + callbacks.registerCallback("bindCanvas", [mainInterface](String const& canvasName) -> Maybe<CanvasWidgetPtr> { + if (auto canvas = mainInterface->fetchCanvas(canvasName)) + return canvas; + return {}; + }); + + return callbacks; +} + +} diff --git a/source/frontend/StarInterfaceLuaBindings.hpp b/source/frontend/StarInterfaceLuaBindings.hpp new file mode 100644 index 0000000..8bc0f0a --- /dev/null +++ b/source/frontend/StarInterfaceLuaBindings.hpp @@ -0,0 +1,16 @@ +#ifndef STAR_INTERFACE_LUA_BINDINGS_HPP +#define STAR_INTERFACE_LUA_BINDINGS_HPP + +#include "StarLua.hpp" + +namespace Star { + +STAR_CLASS(MainInterface); + +namespace LuaBindings { + LuaCallbacks makeInterfaceCallbacks(MainInterface* mainInterface); +} + +} + +#endif diff --git a/source/frontend/StarMainInterface.cpp b/source/frontend/StarMainInterface.cpp index 0475663..592bc6e 100644 --- a/source/frontend/StarMainInterface.cpp +++ b/source/frontend/StarMainInterface.cpp @@ -24,6 +24,7 @@ #include "StarWireInterface.hpp" #include "StarTeamBar.hpp" #include "StarStatusPane.hpp" +#include "StarCanvasWidget.hpp" #include "StarLabelWidget.hpp" #include "StarItemSlotWidget.hpp" #include "StarPlayer.hpp" @@ -792,6 +793,12 @@ void MainInterface::update() { m_client->mainPlayer()->setBusyState(PlayerBusyState::Chatting); else m_client->mainPlayer()->setBusyState(PlayerBusyState::None); + + for (auto& pair : m_canvases) { + pair.second->setPosition(Vec2I()); + pair.second->setSize(Vec2I(m_guiContext->windowSize())); + pair.second->update(); + } } void MainInterface::renderInWorldElements() { @@ -820,6 +827,10 @@ void MainInterface::render() { renderMainBar(); renderDebug(); + RectI screenRect = RectI::withSize(Vec2I(), Vec2I(m_guiContext->windowSize())); + for (auto& pair : m_canvases) + pair.second->render(screenRect); + renderWindows(); renderCursor(); } @@ -912,6 +923,18 @@ void MainInterface::warpTo(WarpAction const& warpAction) { } } +CanvasWidgetPtr MainInterface::fetchCanvas(String const& canvasName) { + if (auto canvasPtr = m_canvases.ptr(canvasName)) + return *canvasPtr; + else { + CanvasWidgetPtr canvas = m_canvases.emplace(canvasName, make_shared<CanvasWidget>()).first->second; + canvas->setPosition(Vec2I()); + canvas->setSize(Vec2I(m_guiContext->windowSize())); + canvas->setIgnoreInterfaceScale(true); + return canvas; + } +} + PanePtr MainInterface::createEscapeDialog() { auto assets = Root::singleton().assets(); diff --git a/source/frontend/StarMainInterface.hpp b/source/frontend/StarMainInterface.hpp index 403b250..3e05b9b 100644 --- a/source/frontend/StarMainInterface.hpp +++ b/source/frontend/StarMainInterface.hpp @@ -42,6 +42,7 @@ STAR_CLASS(QuestTrackerPane); STAR_CLASS(ContainerInteractor); STAR_CLASS(ScriptPane); STAR_CLASS(ChatBubbleManager); +STAR_CLASS(CanvasWidget); STAR_STRUCT(GuiMessage); STAR_CLASS(MainInterface); @@ -114,6 +115,8 @@ public: void warpToOwnShip(); void warpTo(WarpAction const& warpAction); + CanvasWidgetPtr fetchCanvas(String const& canvasName); + private: PanePtr createEscapeDialog(); @@ -167,6 +170,8 @@ private: ScriptPanePtr m_collections; Map<EntityId, PanePtr> m_interactionScriptPanes; + StringMap<CanvasWidgetPtr> m_canvases; + ChatPtr m_chat; ClientCommandProcessorPtr m_clientCommandProcessor; RadioMessagePopupPtr m_radioMessagePopup; diff --git a/source/frontend/StarScriptPane.cpp b/source/frontend/StarScriptPane.cpp index 38659f1..b09211d 100644 --- a/source/frontend/StarScriptPane.cpp +++ b/source/frontend/StarScriptPane.cpp @@ -12,6 +12,7 @@ #include "StarPlayer.hpp" #include "StarUniverseClient.hpp" #include "StarWidgetLuaBindings.hpp" +#include "StarInterfaceLuaBindings.hpp" #include "StarCanvasWidget.hpp" #include "StarItemTooltip.hpp" #include "StarItemGridWidget.hpp" diff --git a/source/frontend/StarWidgetLuaBindings.cpp b/source/frontend/StarWidgetLuaBindings.cpp index eb3ff5b..fb84ff8 100644 --- a/source/frontend/StarWidgetLuaBindings.cpp +++ b/source/frontend/StarWidgetLuaBindings.cpp @@ -17,74 +17,77 @@ namespace Star { -template <> -struct LuaConverter<CanvasWidgetPtr> : LuaUserDataConverter<CanvasWidgetPtr> {}; - -template <> -struct LuaUserDataMethods<CanvasWidgetPtr> { - static LuaMethods<CanvasWidgetPtr> make() { - LuaMethods<CanvasWidgetPtr> methods; - - methods.registerMethodWithSignature<Vec2I, CanvasWidgetPtr>("size", mem_fn(&CanvasWidget::size)); - methods.registerMethodWithSignature<Vec2I, CanvasWidgetPtr>("mousePosition", mem_fn(&CanvasWidget::mousePosition)); - - methods.registerMethodWithSignature<void, CanvasWidgetPtr>("clear", mem_fn(&CanvasWidget::clear)); - - methods.registerMethod("drawImage", - [](CanvasWidgetPtr canvasWidget, String image, Vec2F position, Maybe<float> scale, Maybe<Color> color, Maybe<bool> centered) { - if (centered && *centered) - canvasWidget->drawImageCentered(image, position, scale.value(1.0f), color.value(Color::White).toRgba()); - else - canvasWidget->drawImage(image, position, scale.value(1.0f), color.value(Color::White).toRgba()); - }); - methods.registerMethod("drawImageDrawable", - [](CanvasWidgetPtr canvasWidget, String image, Vec2F position, MVariant<Vec2F, float> scale, Maybe<Color> color, Maybe<float> rotation) { - auto drawable = Drawable::makeImage(image, 1.0, true, {0.0, 0.0}, color.value(Color::White)); - if (auto s = scale.maybe<Vec2F>()) - drawable.transform(Mat3F::scaling(*s)); - else if(auto s = scale.maybe<float>()) - drawable.transform(Mat3F::scaling(*s)); - if (rotation) - drawable.rotate(*rotation); - canvasWidget->drawDrawable(drawable, position); - }); - methods.registerMethod("drawImageRect", - [](CanvasWidgetPtr canvasWidget, String image, RectF texCoords, RectF screenCoords, Maybe<Color> color) { - canvasWidget->drawImageRect(image, texCoords, screenCoords, color.value(Color::White).toRgba()); - }); - methods.registerMethod("drawTiledImage", - [](CanvasWidgetPtr canvasWidget, String image, Vec2D offset, RectF screenCoords, Maybe<float> scale, Maybe<Color> color) { - canvasWidget->drawTiledImage(image, scale.value(1.0f), offset, screenCoords, color.value(Color::White).toRgba()); - }); - methods.registerMethod("drawLine", - [](CanvasWidgetPtr canvasWidget, Vec2F begin, Vec2F end, Maybe<Color> color, Maybe<float> lineWidth) { - canvasWidget->drawLine(begin, end, color.value(Color::White).toRgba(), lineWidth.value(1.0f)); - }); - methods.registerMethod("drawRect", - [](CanvasWidgetPtr canvasWidget, RectF rect, Maybe<Color> color) { - canvasWidget->drawRect(rect, color.value(Color::White).toRgba()); - }); - methods.registerMethod("drawPoly", - [](CanvasWidgetPtr canvasWidget, PolyF poly, Maybe<Color> color, Maybe<float> lineWidth) { - canvasWidget->drawPoly(poly, color.value(Color::White).toRgba(), lineWidth.value(1.0f)); - }); - methods.registerMethod("drawTriangles", - [](CanvasWidgetPtr canvasWidget, List<PolyF> triangles, Maybe<Color> color) { - auto tris = triangles.transformed([](PolyF const& poly) { - if (poly.sides() != 3) - throw StarException("Triangle must have exactly 3 sides"); - return tuple<Vec2F, Vec2F, Vec2F>(poly.vertex(0), poly.vertex(1), poly.vertex(2)); - }); - canvasWidget->drawTriangles(tris, color.value(Color::White).toRgba()); - }); - methods.registerMethod("drawText", - [](CanvasWidgetPtr canvasWidget, String text, Json tp, unsigned fontSize, Maybe<Color> color, Maybe<float> lineSpacing, Maybe<String> font, Maybe<String> directives) { - canvasWidget->drawText(text, TextPositioning(tp), fontSize, color.value(Color::White).toRgba(), FontMode::Normal, lineSpacing.value(DefaultLineSpacing), font.value(""), directives.value("")); - }); - - return methods; - } -}; +LuaMethods<CanvasWidgetPtr> LuaUserDataMethods<CanvasWidgetPtr>::make() { + LuaMethods<CanvasWidgetPtr> methods; + + methods.registerMethodWithSignature<Vec2I, CanvasWidgetPtr>("size", mem_fn(&CanvasWidget::size)); + methods.registerMethodWithSignature<Vec2I, CanvasWidgetPtr>("mousePosition", mem_fn(&CanvasWidget::mousePosition)); + + methods.registerMethodWithSignature<void, CanvasWidgetPtr>("clear", mem_fn(&CanvasWidget::clear)); + + methods.registerMethod("drawDrawable", [](CanvasWidgetPtr canvasWidget, Drawable drawable) { + canvasWidget->drawDrawable(move(drawable), Vec2F()); + }); + + methods.registerMethod("drawDrawables", [](CanvasWidgetPtr canvasWidget, List<Drawable> drawables) { + for (auto& drawable : drawables) + canvasWidget->drawDrawable(move(drawable), Vec2F()); + }); + + methods.registerMethod("drawImage", + [](CanvasWidgetPtr canvasWidget, String image, Vec2F position, Maybe<float> scale, Maybe<Color> color, Maybe<bool> centered) { + if (centered && *centered) + canvasWidget->drawImageCentered(image, position, scale.value(1.0f), color.value(Color::White).toRgba()); + else + canvasWidget->drawImage(image, position, scale.value(1.0f), color.value(Color::White).toRgba()); + }); + methods.registerMethod("drawImageDrawable", + [](CanvasWidgetPtr canvasWidget, String image, Vec2F position, MVariant<Vec2F, float> scale, Maybe<Color> color, Maybe<float> rotation) { + auto drawable = Drawable::makeImage(image, 1.0, true, {0.0, 0.0}, color.value(Color::White)); + if (auto s = scale.maybe<Vec2F>()) + drawable.transform(Mat3F::scaling(*s)); + else if(auto s = scale.maybe<float>()) + drawable.transform(Mat3F::scaling(*s)); + if (rotation) + drawable.rotate(*rotation); + canvasWidget->drawDrawable(drawable, position); + }); + methods.registerMethod("drawImageRect", + [](CanvasWidgetPtr canvasWidget, String image, RectF texCoords, RectF screenCoords, Maybe<Color> color) { + canvasWidget->drawImageRect(image, texCoords, screenCoords, color.value(Color::White).toRgba()); + }); + methods.registerMethod("drawTiledImage", + [](CanvasWidgetPtr canvasWidget, String image, Vec2D offset, RectF screenCoords, Maybe<float> scale, Maybe<Color> color) { + canvasWidget->drawTiledImage(image, scale.value(1.0f), offset, screenCoords, color.value(Color::White).toRgba()); + }); + methods.registerMethod("drawLine", + [](CanvasWidgetPtr canvasWidget, Vec2F begin, Vec2F end, Maybe<Color> color, Maybe<float> lineWidth) { + canvasWidget->drawLine(begin, end, color.value(Color::White).toRgba(), lineWidth.value(1.0f)); + }); + methods.registerMethod("drawRect", + [](CanvasWidgetPtr canvasWidget, RectF rect, Maybe<Color> color) { + canvasWidget->drawRect(rect, color.value(Color::White).toRgba()); + }); + methods.registerMethod("drawPoly", + [](CanvasWidgetPtr canvasWidget, PolyF poly, Maybe<Color> color, Maybe<float> lineWidth) { + canvasWidget->drawPoly(poly, color.value(Color::White).toRgba(), lineWidth.value(1.0f)); + }); + methods.registerMethod("drawTriangles", + [](CanvasWidgetPtr canvasWidget, List<PolyF> triangles, Maybe<Color> color) { + auto tris = triangles.transformed([](PolyF const& poly) { + if (poly.sides() != 3) + throw StarException("Triangle must have exactly 3 sides"); + return tuple<Vec2F, Vec2F, Vec2F>(poly.vertex(0), poly.vertex(1), poly.vertex(2)); + }); + canvasWidget->drawTriangles(tris, color.value(Color::White).toRgba()); + }); + methods.registerMethod("drawText", + [](CanvasWidgetPtr canvasWidget, String text, Json tp, unsigned fontSize, Maybe<Color> color, Maybe<float> lineSpacing, Maybe<String> font, Maybe<String> directives) { + canvasWidget->drawText(text, TextPositioning(tp), fontSize, color.value(Color::White).toRgba(), FontMode::Normal, lineSpacing.value(DefaultLineSpacing), font.value(""), directives.value("")); + }); + + return methods; +} LuaCallbacks LuaBindings::makeWidgetCallbacks(Widget* parentWidget, GuiReader* reader) { LuaCallbacks callbacks; diff --git a/source/frontend/StarWidgetLuaBindings.hpp b/source/frontend/StarWidgetLuaBindings.hpp index fee5a96..48d6ab2 100644 --- a/source/frontend/StarWidgetLuaBindings.hpp +++ b/source/frontend/StarWidgetLuaBindings.hpp @@ -7,6 +7,15 @@ namespace Star { STAR_CLASS(Widget); +STAR_CLASS(CanvasWidget); + +template <> +struct LuaConverter<CanvasWidgetPtr> : LuaUserDataConverter<CanvasWidgetPtr> {}; + +template <> +struct LuaUserDataMethods<CanvasWidgetPtr> { + static LuaMethods<CanvasWidgetPtr> make(); +}; namespace LuaBindings { LuaCallbacks makeWidgetCallbacks(Widget* parentWidget, GuiReader* reader); |