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

summaryrefslogtreecommitdiff
path: root/source/frontend
diff options
context:
space:
mode:
Diffstat (limited to 'source/frontend')
-rw-r--r--source/frontend/CMakeLists.txt2
-rw-r--r--source/frontend/StarInterfaceLuaBindings.cpp21
-rw-r--r--source/frontend/StarInterfaceLuaBindings.hpp16
-rw-r--r--source/frontend/StarMainInterface.cpp23
-rw-r--r--source/frontend/StarMainInterface.hpp5
-rw-r--r--source/frontend/StarScriptPane.cpp1
-rw-r--r--source/frontend/StarWidgetLuaBindings.cpp139
-rw-r--r--source/frontend/StarWidgetLuaBindings.hpp9
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);