X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FScripting%2FNasalCanvas.cxx;h=32aa4f84dba6dade91338c2f1c303bfff366777a;hb=7f43a09fc57f542a33480bc995f2c78c7c971a6a;hp=b5b181e6f72c71e42b11a11c30a8873af1b8734c;hpb=91bc5e522a5feda140dac257022c0eb250b4950e;p=flightgear.git diff --git a/src/Scripting/NasalCanvas.cxx b/src/Scripting/NasalCanvas.cxx index b5b181e6f..32aa4f84d 100644 --- a/src/Scripting/NasalCanvas.cxx +++ b/src/Scripting/NasalCanvas.cxx @@ -24,6 +24,8 @@ #include "NasalCanvas.hxx" #include +#include +#include #include
#include @@ -33,6 +35,7 @@ #include #include +#include #include #include @@ -55,6 +58,19 @@ typedef nasal::Ghost NasalMouseEvent; typedef nasal::Ghost NasalCanvas; typedef nasal::Ghost NasalElement; typedef nasal::Ghost NasalGroup; +typedef nasal::Ghost NasalText; +typedef nasal::Ghost NasalWindow; + +naRef to_nasal_helper(naContext c, const osg::BoundingBox& bb) +{ + std::vector bb_vec(4); + bb_vec[0] = bb._min.x(); + bb_vec[1] = bb._min.y(); + bb_vec[2] = bb._max.x(); + bb_vec[3] = bb._max.y(); + + return nasal::to_nasal(c, bb_vec); +} SGPropertyNode* from_nasal_helper(naContext c, naRef ref, SGPropertyNode**) { @@ -75,12 +91,34 @@ CanvasMgr& requireCanvasMgr(naContext c) return *canvas_mgr; } +GUIMgr& requireGUIMgr(naContext c) +{ + GUIMgr* mgr = + static_cast(globals->get_subsystem("CanvasGUI")); + if( !mgr ) + naRuntimeError(c, "Failed to get CanvasGUI subsystem"); + + return *mgr; +} + /** * Create new Canvas and get ghost for it. */ -static naRef f_createCanvas(naContext c, naRef me, int argc, naRef* args) +static naRef f_createCanvas(const nasal::CallContext& ctx) +{ + return NasalCanvas::create(ctx.c, requireCanvasMgr(ctx.c).createCanvas()); +} + +/** + * Create new Window and get ghost for it. + */ +static naRef f_createWindow(const nasal::CallContext& ctx) { - return NasalCanvas::create(c, requireCanvasMgr(c).createCanvas()); + return NasalWindow::create + ( + ctx.c, + requireGUIMgr(ctx.c).createWindow( ctx.getArg(0) ) + ); } /** @@ -121,17 +159,12 @@ naRef f_canvasCreateGroup(sc::Canvas& canvas, const nasal::CallContext& ctx) ); } -naRef f_elementGetTransformedBounds(sc::Element& el, const nasal::CallContext& ctx) +/** + * Get group containing all gui windows + */ +naRef f_getDesktop(naContext c, naRef me, int argc, naRef* args) { - osg::BoundingBox bb = el.getTransformedBounds( osg::Matrix::identity() ); - - std::vector bb_vec(4); - bb_vec[0] = bb._min.x(); - bb_vec[1] = bb._min.y(); - bb_vec[2] = bb._max.x(); - bb_vec[3] = bb._max.y(); - - return nasal::to_nasal(ctx.c, bb_vec); + return NasalGroup::create(c, requireGUIMgr(c).getDesktop()); } naRef f_groupCreateChild(sc::Group& group, const nasal::CallContext& ctx) @@ -162,48 +195,77 @@ naRef f_groupGetElementById(sc::Group& group, const nasal::CallContext& ctx) ); } -// TODO allow directly exposing functions without parameters and return type -naRef f_eventStopPropagation(sc::Event& event, const nasal::CallContext& ctx) +template +naRef f_eventGetModifier(naContext, sc::MouseEvent& event) { - if( ctx.argc != 0 ) - naRuntimeError(ctx.c, "Event::stopPropagation no argument expected"); - event.stopPropagation(); - return naNil(); + return naNum((event.getModifiers() & Mask) != 0); } -naRef initNasalCanvas(naRef globals, naContext c, naRef gcSave) +naRef to_nasal_helper(naContext c, const sc::ElementWeakPtr& el) { + return NasalElement::create(c, el.lock()); +} + +naRef initNasalCanvas(naRef globals, naContext c) +{ + using osgGA::GUIEventAdapter; NasalEvent::init("canvas.Event") .member("type", &sc::Event::getTypeString) - .method_func<&f_eventStopPropagation>("stopPropagation"); + .member("target", &sc::Event::getTarget) + .member("currentTarget", &sc::Event::getCurrentTarget) + .method("stopPropagation", &sc::Event::stopPropagation); NasalMouseEvent::init("canvas.MouseEvent") .bases() - .member("x", &sc::MouseEvent::getPosX) - .member("y", &sc::MouseEvent::getPosY) + .member("screenX", &sc::MouseEvent::getScreenX) + .member("screenY", &sc::MouseEvent::getScreenY) + .member("clientX", &sc::MouseEvent::getClientX) + .member("clientY", &sc::MouseEvent::getClientY) + .member("localX", &sc::MouseEvent::getLocalX) + .member("localY", &sc::MouseEvent::getLocalY) .member("deltaX", &sc::MouseEvent::getDeltaX) .member("deltaY", &sc::MouseEvent::getDeltaY) + .member("button", &sc::MouseEvent::getButton) + .member("buttons", &sc::MouseEvent::getButtonMask) + .member("modifiers", &sc::MouseEvent::getModifiers) + .member("ctrlKey", &f_eventGetModifier) + .member("shiftKey", &f_eventGetModifier) + .member("altKey", &f_eventGetModifier) + .member("metaKey", &f_eventGetModifier) .member("click_count", &sc::MouseEvent::getCurrentClickCount); NasalCanvas::init("Canvas") .member("_node_ghost", &elementGetNode) .member("size_x", &sc::Canvas::getSizeX) .member("size_y", &sc::Canvas::getSizeY) - .method_func<&f_canvasCreateGroup>("_createGroup") - .method<&sc::Canvas::addEventListener>("addEventListener"); + .method("_createGroup", &f_canvasCreateGroup) + .method("_getGroup", &sc::Canvas::getGroup) + .method("addEventListener", &sc::Canvas::addEventListener); NasalElement::init("canvas.Element") .member("_node_ghost", &elementGetNode) - .method<&sc::Element::addEventListener>("addEventListener") - .method_func<&f_elementGetTransformedBounds>("getTransformedBounds"); + .method("_getParent", &sc::Element::getParent) + .method("addEventListener", &sc::Element::addEventListener) + .method("getBoundingBox", &sc::Element::getBoundingBox) + .method("getTightBoundingBox", &sc::Element::getTightBoundingBox); NasalGroup::init("canvas.Group") .bases() - .method_func<&f_groupCreateChild>("_createChild") - .method_func<&f_groupGetChild>("_getChild") - .method_func<&f_groupGetElementById>("_getElementById"); + .method("_createChild", &f_groupCreateChild) + .method("_getChild", &f_groupGetChild) + .method("_getElementById", &f_groupGetElementById); + NasalText::init("canvas.Text") + .bases() + .method("getNearestCursor", &sc::Text::getNearestCursor); + NasalWindow::init("canvas.Window") + .bases() + .member("_node_ghost", &elementGetNode) + .method("_getCanvasDecoration", &canvas::Window::getCanvasDecoration); + nasal::Hash globals_module(globals, c), canvas_module = globals_module.createHash("canvas"); canvas_module.set("_newCanvasGhost", f_createCanvas); + canvas_module.set("_newWindowGhost", f_createWindow); canvas_module.set("_getCanvasGhost", f_getCanvas); + canvas_module.set("_getDesktopGhost", f_getDesktop); return naNil(); }