X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FScripting%2FNasalCanvas.cxx;h=3e57389dd67b9753f99d566d67525faea57d6739;hb=ce09c320d32728dd9c5eb0d6b4ab9f4683242cbc;hp=c423c880fdc7c5b4921949fc0d8975eb21996cb7;hpb=859e92a8ed0523595c40efa0c2b792624ea6e5d5;p=flightgear.git diff --git a/src/Scripting/NasalCanvas.cxx b/src/Scripting/NasalCanvas.cxx index c423c880f..3e57389dd 100644 --- a/src/Scripting/NasalCanvas.cxx +++ b/src/Scripting/NasalCanvas.cxx @@ -22,23 +22,21 @@ # include "config.h" #endif -#include -#include - #include "NasalCanvas.hxx" #include +#include +#include #include
+#include -//#include -#include -#include -#include #include #include #include #include +#include +#include #include #include @@ -47,165 +45,214 @@ extern naRef propNodeGhostCreate(naContext c, SGPropertyNode* n); -//void initCanvasPython() -//{ -// using namespace boost::python; -// class_("Canvas"); -//} - namespace sc = simgear::canvas; -naRef canvasGetNode(naContext c, sc::Canvas* canvas) +template +naRef elementGetNode(naContext c, Element& element) { - return propNodeGhostCreate(c, canvas->getProps()); + return propNodeGhostCreate(c, element.getProps()); } +typedef nasal::Ghost NasalEvent; +typedef nasal::Ghost NasalMouseEvent; typedef nasal::Ghost NasalCanvas; +typedef nasal::Ghost NasalElement; typedef nasal::Ghost NasalGroup; +typedef nasal::Ghost NasalText; +typedef nasal::Ghost NasalWindow; -#if 0 -typedef osg::ref_ptr GUIEventPtr; +SGPropertyNode* from_nasal_helper(naContext c, naRef ref, SGPropertyNode**) +{ + SGPropertyNode* props = ghostToPropNode(ref); + if( !props ) + naRuntimeError(c, "Not a SGPropertyNode ghost."); + + return props; +} -class NasalCanvasEvent: - public NasalObject +CanvasMgr& requireCanvasMgr(naContext c) { - public: - - NasalCanvasEvent(): - NasalObject("CanvasEvent") - { - _members["type"] = &NasalCanvasEvent::getEventType; - } - - naRef getEventType(naContext c, const GUIEventPtr& event) - { -#define RET_EVENT_STR(type, str)\ - case osgGA::GUIEventAdapter::type:\ - return nasal::to_nasal(c, str); - - switch( event->getEventType() ) - { - RET_EVENT_STR(PUSH, "push"); - RET_EVENT_STR(RELEASE, "release"); - RET_EVENT_STR(DOUBLECLICK, "double-click"); - RET_EVENT_STR(DRAG, "drag"); - RET_EVENT_STR(MOVE, "move"); - RET_EVENT_STR(SCROLL, "scroll"); - RET_EVENT_STR(KEYUP, "key-up"); - RET_EVENT_STR(KEYDOWN, "key-down"); - -#undef RET_EVENT_STR - - default: - return naNil(); - } - } -}; -#endif -#if 0 -static const char* eventGhostGetMember(naContext c, void* g, naRef field, naRef* out) + CanvasMgr* canvas_mgr = + static_cast(globals->get_subsystem("Canvas")); + if( !canvas_mgr ) + naRuntimeError(c, "Failed to get Canvas subsystem"); + + return *canvas_mgr; +} + +GUIMgr& requireGUIMgr(naContext c) { - const char* fieldName = naStr_data(field); - osgGA::GUIEventAdapter* gea = (osgGA::GUIEventAdapter*) g; - - if (!strcmp(fieldName, "windowX")) *out = naNum(gea->getWindowX()); - else if (!strcmp(fieldName, "windowY")) *out = naNum(gea->getWindowY()); - else if (!strcmp(fieldName, "time")) *out = naNum(gea->getTime()); - else if (!strcmp(fieldName, "button")) *out = naNum(gea->getButton()); - else { - return 0; - } + GUIMgr* mgr = + static_cast(globals->get_subsystem("CanvasGUI")); + if( !mgr ) + naRuntimeError(c, "Failed to get CanvasGUI subsystem"); - return ""; + return *mgr; } -static naRef f_element_addButtonCallback(naContext c, naRef me, int argc, naRef* args) +/** + * Create new Canvas and get ghost for it. + */ +static naRef f_createCanvas(const nasal::CallContext& ctx) { - simgear::canvas::Element* e = elementGhost(me); - if (!e) { - naRuntimeError(c, "element.addButtonCallback called on non-canvas-element object"); - } - - return naNil(); + return NasalCanvas::create(ctx.c, requireCanvasMgr(ctx.c).createCanvas()); } -static naRef f_element_addDragCallback(naContext c, naRef me, int argc, naRef* args) +/** + * Create new Window and get ghost for it. + */ +static naRef f_createWindow(const nasal::CallContext& ctx) { - simgear::canvas::Element* e = elementGhost(me); - if (!e) { - naRuntimeError(c, "element.addDragCallback called on non-canvas-element object"); - } - - return naNil(); + return NasalWindow::create + ( + ctx.c, + requireGUIMgr(ctx.c).createWindow( ctx.getArg(0) ) + ); } -static naRef f_element_addMoveCallback(naContext c, naRef me, int argc, naRef* args) +/** + * Get ghost for existing Canvas. + */ +static naRef f_getCanvas(naContext c, naRef me, int argc, naRef* args) { - simgear::canvas::Element* e = elementGhost(me); - if (!e) { - naRuntimeError(c, "element.addMoveCallback called on non-canvas-element object"); + nasal::CallContext ctx(c, argc, args); + SGPropertyNode& props = *ctx.requireArg(0); + CanvasMgr& canvas_mgr = requireCanvasMgr(c); + + sc::CanvasPtr canvas; + if( canvas_mgr.getPropertyRoot() == props.getParent() ) + { + // get a canvas specified by its root node + canvas = canvas_mgr.getCanvas( props.getIndex() ); + if( !canvas || canvas->getProps() != &props ) + return naNil(); } - - return naNil(); + else + { + // get a canvas by name + if( props.hasValue("name") ) + canvas = canvas_mgr.getCanvas( props.getStringValue("name") ); + else if( props.hasValue("index") ) + canvas = canvas_mgr.getCanvas( props.getIntValue("index") ); + } + + return NasalCanvas::create(c, canvas); } -static naRef f_element_addScrollCallback(naContext c, naRef me, int argc, naRef* args) +naRef f_canvasCreateGroup(sc::Canvas& canvas, const nasal::CallContext& ctx) { - simgear::canvas::Element* e = elementGhost(me); - if (!e) { - naRuntimeError(c, "element.addScrollCallback called on non-canvas-element object"); - } - - return naNil(); + return NasalGroup::create + ( + ctx.c, + canvas.createGroup( ctx.getArg(0) ) + ); } -#endif -static naRef f_createCanvas(naContext c, naRef me, int argc, naRef* args) +/** + * Get group containing all gui windows + */ +naRef f_getDesktop(naContext c, naRef me, int argc, naRef* args) { - CanvasMgr* canvas_mgr = - static_cast(globals->get_subsystem("Canvas")); - if( !canvas_mgr ) - return naNil(); + return NasalGroup::create(c, requireGUIMgr(c).getDesktop()); +} + +naRef f_elementGetTransformedBounds(sc::Element& el, const nasal::CallContext& ctx) +{ + 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 NasalCanvas::create(c, canvas_mgr->createCanvas()); + return nasal::to_nasal(ctx.c, bb_vec); } -naRef f_canvasCreateGroup( sc::Canvas& canvas, - naContext c, - int argc, - naRef* args ) +naRef f_groupCreateChild(sc::Group& group, const nasal::CallContext& ctx) { - std::string name; - if( argc > 0 ) - name = nasal::from_nasal(c, args[0]); + return NasalElement::create + ( + ctx.c, + group.createChild( ctx.requireArg(0), + ctx.getArg(1) ) + ); +} - return NasalGroup::create(c, canvas.createGroup(name)); +naRef f_groupGetChild(sc::Group& group, const nasal::CallContext& ctx) +{ + return NasalElement::create + ( + ctx.c, + group.getChild( ctx.requireArg(0) ) + ); } -naRef initNasalCanvas(naRef globals, naContext c, naRef gcSave) +naRef f_groupGetElementById(sc::Group& group, const nasal::CallContext& ctx) { -#if 0 - elementPrototype = naNewHash(c); - hashset(c, gcSave, "elementProto", elementPrototype); - - hashset(c, elementPrototype, "addButtonCallback", naNewFunc(c, naNewCCode(c, f_element_addButtonCallback))); - hashset(c, elementPrototype, "addDragCallback", naNewFunc(c, naNewCCode(c, f_element_addDragCallback))); - hashset(c, elementPrototype, "addMoveCallback", naNewFunc(c, naNewCCode(c, f_element_addMoveCallback))); - hashset(c, elementPrototype, "addScrollCallback", naNewFunc(c, naNewCCode(c, f_element_addScrollCallback))); -#endif + return NasalElement::create + ( + ctx.c, + group.getElementById( ctx.requireArg(0) ) + ); +} + +naRef to_nasal_helper(naContext c, const sc::ElementWeakPtr& el) +{ + return NasalElement::create(c, el.lock()); +} + +naRef initNasalCanvas(naRef globals, naContext c) +{ + NasalEvent::init("canvas.Event") + .member("type", &sc::Event::getTypeString) + .member("target", &sc::Event::getTarget) + .member("currentTarget", &sc::Event::getCurrentTarget) + .method("stopPropagation", &sc::Event::stopPropagation); + NasalMouseEvent::init("canvas.MouseEvent") + .bases() + .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("click_count", &sc::MouseEvent::getCurrentClickCount); NasalCanvas::init("Canvas") - .member("_node_ghost", &canvasGetNode) + .member("_node_ghost", &elementGetNode) .member("size_x", &sc::Canvas::getSizeX) .member("size_y", &sc::Canvas::getSizeY) - .method<&f_canvasCreateGroup>("createGroup"); - nasal::Ghost::init("canvas.Element"); - nasal::Ghost::init("canvas.Group") - .bases(); + .method("_createGroup", &f_canvasCreateGroup) + .method("_getGroup", &sc::Canvas::getGroup) + .method("addEventListener", &sc::Canvas::addEventListener); + NasalElement::init("canvas.Element") + .member("_node_ghost", &elementGetNode) + .method("_getParent", &sc::Element::getParent) + .method("addEventListener", &sc::Element::addEventListener) + .method("getTransformedBounds", &f_elementGetTransformedBounds); + NasalGroup::init("canvas.Group") + .bases() + .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(); }