diff options
author | Kae <80987908+Novaenia@users.noreply.github.com> | 2023-07-04 19:27:16 +1000 |
---|---|---|
committer | Kae <80987908+Novaenia@users.noreply.github.com> | 2023-07-04 19:27:16 +1000 |
commit | e3461e90531345650fe70ada38d875a68f87f416 (patch) | |
tree | 41b923b02ca8dbac1b075654052c972545aab16e /source/frontend/StarWidgetLuaBindings.cpp | |
parent | ab72b03ad8679437ebf01ead65d9f0d3195e6bae (diff) |
Start of Interface callbacks, starting with a bindCanvas function for the whole screen
Diffstat (limited to 'source/frontend/StarWidgetLuaBindings.cpp')
-rw-r--r-- | source/frontend/StarWidgetLuaBindings.cpp | 139 |
1 files changed, 71 insertions, 68 deletions
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; |