X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FScripting%2FNasalCanvas.cxx;h=204cfa6828398fff179a88bc29275184f7d00ce9;hb=d51499382dc93a8b878e3de795a4471f4ce877ec;hp=bbafebd0a4be62150e6facdd354795c2f0973732;hpb=f703882ffa73e70f555caa1867c1650534d5e3dc;p=flightgear.git diff --git a/src/Scripting/NasalCanvas.cxx b/src/Scripting/NasalCanvas.cxx index bbafebd0a..204cfa682 100644 --- a/src/Scripting/NasalCanvas.cxx +++ b/src/Scripting/NasalCanvas.cxx @@ -22,243 +22,158 @@ # include "config.h" #endif -#include - #include "NasalCanvas.hxx" - -#include -#include +#include +#include
+#include #include #include -#include -#include - -static naRef canvasPrototype; -static naRef elementPrototype; -static naRef eventPrototype; - -static void canvasGhostDestroy(void* g); -static void elementGhostDestroy(void* g); -static void eventGhostDestroy(void* g); +#include +#include -static const char* canvasGhostGetMember(naContext c, void* g, naRef field, naRef* out); -naGhostType CanvasGhostType = { canvasGhostDestroy, "canvas", canvasGhostGetMember, 0 }; +#include +#include +#include +#include -static const char* elementGhostGetMember(naContext c, void* g, naRef field, naRef* out); -static void elementGhostSetMember(naContext c, void* g, naRef field, naRef value); -naGhostType ElementGhostType = { elementGhostDestroy, "canvas.element", - elementGhostGetMember, elementGhostSetMember }; +extern naRef propNodeGhostCreate(naContext c, SGPropertyNode* n); -static const char* eventGhostGetMember(naContext c, void* g, naRef field, naRef* out); -naGhostType EventGhostType = { eventGhostDestroy, "ga-event", eventGhostGetMember, 0 }; +namespace sc = simgear::canvas; -static void hashset(naContext c, naRef hash, const char* key, naRef val) +template +naRef elementGetNode(naContext c, Element& element) { - naRef s = naNewString(c); - naStr_fromdata(s, (char*)key, strlen(key)); - naHash_set(hash, s, val); + return propNodeGhostCreate(c, element.getProps()); } -static naRef stringToNasal(naContext c, const std::string& s) -{ - return naStr_fromdata(naNewString(c), - const_cast(s.c_str()), - s.length()); -} +typedef nasal::Ghost NasalCanvas; +typedef nasal::Ghost NasalElement; +typedef nasal::Ghost NasalGroup; + +#if 0 +typedef osg::ref_ptr GUIEventPtr; -static naRef eventTypeToNasal(naContext c, osgGA::GUIEventAdapter::EventType ty) +class NasalCanvasEvent: + public NasalObject { - switch (ty) { - case osgGA::GUIEventAdapter::PUSH: return stringToNasal(c, "push"); - case osgGA::GUIEventAdapter::RELEASE: return stringToNasal(c, "release"); - case osgGA::GUIEventAdapter::DOUBLECLICK: return stringToNasal(c, "double-click"); - case osgGA::GUIEventAdapter::DRAG: return stringToNasal(c, "drag"); - case osgGA::GUIEventAdapter::MOVE: return stringToNasal(c, "move"); - case osgGA::GUIEventAdapter::SCROLL: return stringToNasal(c, "scroll"); - case osgGA::GUIEventAdapter::KEYUP: return stringToNasal(c, "key-up"); - case osgGA::GUIEventAdapter::KEYDOWN: return stringToNasal(c, "key-down"); + public: - default: - ; // fall through - } - - return naNil(); -} + naRef getEventType(naContext c, const GUIEventPtr& event) + { +#define RET_EVENT_STR(type, str)\ + case osgGA::GUIEventAdapter::type:\ + return nasal::to_nasal(c, str); -static canvas::Element* elementGhost(naRef r) -{ - if (naGhost_type(r) == &ElementGhostType) - return (canvas::Element*) naGhost_ptr(r); - return 0; -} + 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"); -static Canvas* canvasGhost(naRef r) -{ - if (naGhost_type(r) == &CanvasGhostType) - return (Canvas*) naGhost_ptr(r); - return 0; -} +#undef RET_EVENT_STR -static void elementGhostDestroy(void* g) -{ -} + default: + return naNil(); + } + } +}; +#endif -static void canvasGhostDestroy(void* g) +SGPropertyNode& requireArg(naContext c, int argc, naRef* args, int index = 0) { -} + if( argc <= index ) + naRuntimeError(c, "missing argument #%d", index); -static void eventGhostDestroy(void* g) -{ - osgGA::GUIEventAdapter* gea = static_cast(g); - gea->unref(); -} + SGPropertyNode* props = ghostToPropNode(args[index]); + if( !props ) + naRuntimeError(c, "arg #%d: not a SGPropertyNode ghost"); -static const char* eventGhostGetMember(naContext c, void* g, naRef field, naRef* out) -{ - const char* fieldName = naStr_data(field); - osgGA::GUIEventAdapter* gea = (osgGA::GUIEventAdapter*) g; - - if (!strcmp(fieldName, "parents")) { - *out = naNewVector(c); - naVec_append(*out, eventPrototype); - } else if (!strcmp(fieldName, "type")) *out = eventTypeToNasal(c, gea->getEventType()); - else 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; - } - - return ""; + return *props; } -static const char* canvasGhostGetMember(naContext c, void* g, naRef field, naRef* out) +CanvasMgr& requireCanvasMgr(naContext c) { - const char* fieldName = naStr_data(field); - Canvas* cvs = (Canvas*) g; - - if (!strcmp(fieldName, "parents")) { - *out = naNewVector(c); - naVec_append(*out, canvasPrototype); - } else if (!strcmp(fieldName, "sizeX")) *out = naNum(cvs->getSizeX()); - else if (!strcmp(fieldName, "sizeY")) *out = naNum(cvs->getSizeY()); - else { - return 0; - } - - return ""; -} + CanvasMgr* canvas_mgr = + static_cast(globals->get_subsystem("Canvas")); + if( !canvas_mgr ) + naRuntimeError(c, "Failed to get Canvas subsystem"); -static const char* elementGhostGetMember(naContext c, void* g, naRef field, naRef* out) -{ - const char* fieldName = naStr_data(field); - canvas::Element* e = (canvas::Element*) g; - - if (!strcmp(fieldName, "parents")) { - *out = naNewVector(c); - naVec_append(*out, elementPrototype); - } else { - return 0; - } - - return ""; + return *canvas_mgr; } -static void elementGhostSetMember(naContext c, void* g, naRef field, naRef value) +/** + * Create new Canvas and get ghost for it. + */ +static naRef f_createCanvas(naContext c, naRef me, int argc, naRef* args) { - const char* fieldName = naStr_data(field); - canvas::Element* e = (canvas::Element*) g; + return NasalCanvas::create(c, requireCanvasMgr(c).createCanvas()); } - -static naRef f_canvas_getElement(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) { - Canvas* cvs = canvasGhost(me); - if (!cvs) { - naRuntimeError(c, "canvas.getElement called on non-canvas object"); - } - - return naNil(); -} + SGPropertyNode& props = requireArg(c, argc, args); + CanvasMgr& canvas_mgr = requireCanvasMgr(c); -static naRef f_element_addButtonCallback(naContext c, naRef me, int argc, naRef* args) -{ - canvas::Element* e = elementGhost(me); - if (!e) { - naRuntimeError(c, "element.addButtonCallback called on non-canvas-element object"); + 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(); -} - -static naRef f_element_addDragCallback(naContext c, naRef me, int argc, naRef* args) -{ - canvas::Element* e = elementGhost(me); - if (!e) { - naRuntimeError(c, "element.addDragCallback called on non-canvas-element object"); + 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 naNil(); -} -static naRef f_element_addMoveCallback(naContext c, naRef me, int argc, naRef* args) -{ - canvas::Element* e = elementGhost(me); - if (!e) { - naRuntimeError(c, "element.addMoveCallback called on non-canvas-element object"); - } - - return naNil(); + return NasalCanvas::create(c, canvas); } -static naRef f_element_addScrollCallback(naContext c, naRef me, int argc, naRef* args) +naRef f_canvasCreateGroup( sc::Canvas& canvas, + naContext c, + int argc, + naRef* args ) { - canvas::Element* e = elementGhost(me); - if (!e) { - naRuntimeError(c, "element.addScrollCallback called on non-canvas-element object"); - } - - return naNil(); -} + std::string name; + if( argc > 0 ) + name = nasal::from_nasal(c, args[0]); -static naRef f_canvas(naContext c, naRef me, int argc, naRef* args) -{ - return naNil(); + return NasalGroup::create(c, canvas.createGroup(name)); } -// Table of extension functions. Terminate with zeros. -static struct { const char* name; naCFunction func; } funcs[] = { - { "canvas", f_canvas }, - { 0, 0 } -}; - naRef initNasalCanvas(naRef globals, naContext c, naRef gcSave) { - canvasPrototype = naNewHash(c); - hashset(c, gcSave, "canvasProto", canvasPrototype); - - hashset(c, canvasPrototype, "getElement", naNewFunc(c, naNewCCode(c, f_canvas_getElement))); - - eventPrototype = naNewHash(c); - hashset(c, gcSave, "eventProto", eventPrototype); - // set any event methods - - 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))); - - for(int i=0; funcs[i].name; i++) { - hashset(c, globals, funcs[i].name, - naNewFunc(c, naNewCCode(c, funcs[i].func))); - } - + NasalCanvas::init("Canvas") + .member("_node_ghost", &elementGetNode) + .member("size_x", &sc::Canvas::getSizeX) + .member("size_y", &sc::Canvas::getSizeY) + .method_func<&f_canvasCreateGroup>("createGroup"); + NasalElement::init("canvas.Element") + .member("_node_ghost", &elementGetNode); + NasalGroup::init("canvas.Group") + .bases(); + + nasal::Hash globals_module(globals, c), + canvas_module = globals_module.createHash("canvas"); + + canvas_module.set("_newCanvasGhost", f_createCanvas); + canvas_module.set("_getCanvasGhost", f_getCanvas); + return naNil(); }