1
0
Fork 0

Scripting: clean up a bit and user more of cppbind.

This commit is contained in:
Thomas Geymayer 2013-12-08 19:23:47 +01:00
parent cac6407a8e
commit 3a170e1a39
3 changed files with 27 additions and 66 deletions

View file

@ -204,7 +204,7 @@ naRef to_nasal_helper(naContext c, const sc::ElementWeakPtr& el)
naRef initNasalCanvas(naRef globals, naContext c) naRef initNasalCanvas(naRef globals, naContext c)
{ {
NasalEvent::init("canvas.Event") NasalEvent::init("canvas.Event")
.member("type", &sc::Event::getTypeString) .member("type", &sc::Event::getTypeString)
.member("target", &sc::Event::getTarget) .member("target", &sc::Event::getTarget)
.member("currentTarget", &sc::Event::getCurrentTarget) .member("currentTarget", &sc::Event::getCurrentTarget)

View file

@ -22,6 +22,7 @@
#include "NasalClipboard.hxx" #include "NasalClipboard.hxx"
#include "NasalSys.hxx" #include "NasalSys.hxx"
#include <simgear/nasal/cppbind/NasalCallContext.hxx>
#include <boost/algorithm/string/case_conv.hpp> #include <boost/algorithm/string/case_conv.hpp>
#include <cstddef> #include <cstddef>
@ -30,21 +31,21 @@
* Nasal wrappers for setting/getting clipboard text * Nasal wrappers for setting/getting clipboard text
*/ */
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
static NasalClipboard::Type parseType(naContext c, int argc, naRef* args, int i) static NasalClipboard::Type parseType(const nasal::CallContext& ctx, size_t i)
{ {
if( argc > i ) if( ctx.argc > i )
{ {
if( naIsNum(args[i]) ) if( ctx.isNumeric(i) )
{ {
if( static_cast<int>(args[i].num) == NasalClipboard::CLIPBOARD ) if( ctx.requireArg<int>(i) == NasalClipboard::CLIPBOARD )
return NasalClipboard::CLIPBOARD; return NasalClipboard::CLIPBOARD;
if( static_cast<int>(args[i].num) == NasalClipboard::PRIMARY ) if( ctx.requireArg<int>(i) == NasalClipboard::PRIMARY )
return NasalClipboard::PRIMARY; return NasalClipboard::PRIMARY;
} }
naRuntimeError naRuntimeError
( (
c, ctx.c,
"clipboard: invalid arg " "clipboard: invalid arg "
"(expected clipboard.CLIPBOARD or clipboard.SELECTION)" "(expected clipboard.CLIPBOARD or clipboard.SELECTION)"
); );
@ -54,55 +55,35 @@ static NasalClipboard::Type parseType(naContext c, int argc, naRef* args, int i)
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
static naRef f_setClipboardText(naContext c, naRef me, int argc, naRef* args) static naRef f_setClipboardText(const nasal::CallContext& ctx)
{ {
if( argc < 1 || argc > 2 ) if( ctx.argc < 1 || ctx.argc > 2 )
naRuntimeError( c, "clipboard.setText() expects 1 or 2 arguments: " naRuntimeError( ctx.c, "clipboard.setText() expects 1 or 2 arguments: "
"text, [, type = clipboard.CLIPBOARD]" ); "text, [, type = clipboard.CLIPBOARD]" );
if( !naIsString(args[0]) )
naRuntimeError(c, "clipboard.setText() invalid arg (arg 0 not a string)");
return return
naNum naNum
( (
NasalClipboard::getInstance()->setText( naStr_data(args[0]), NasalClipboard::getInstance()->setText( ctx.requireArg<std::string>(0),
parseType(c, argc, args, 1) ) parseType(ctx, 1) )
); );
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
static naRef f_getClipboardText(naContext c, naRef me, int argc, naRef* args) static naRef f_getClipboardText(const nasal::CallContext& ctx)
{ {
if( argc > 1 ) if( ctx.argc > 1 )
naRuntimeError(c, "clipboard.getText() accepts max 1 arg: " naRuntimeError(ctx.c, "clipboard.getText() accepts max 1 arg: "
"[type = clipboard.CLIPBOARD]" ); "[type = clipboard.CLIPBOARD]");
const std::string& text = return ctx.to_nasal
NasalClipboard::getInstance()->getText(parseType(c, argc, args, 0)); (
NasalClipboard::getInstance()->getText(parseType(ctx, 0))
// TODO create some nasal helper functions (eg. stringToNasal) );
// some functions are available spread over different files (eg.
// NasalPositioned.cxx)
return naStr_fromdata(naNewString(c), text.c_str(), text.length());
} }
//------------------------------------------------------------------------------
// Table of extension functions
static struct {const char* name; naCFunction func; } funcs[] = {
{ "setText", f_setClipboardText },
{ "getText", f_getClipboardText }
};
// Table of extension symbols
static struct {const char* name; naRef val; } symbols[] = {
{ "CLIPBOARD", naNum(NasalClipboard::CLIPBOARD) },
{ "SELECTION", naNum(NasalClipboard::PRIMARY) }
};
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
NasalClipboard::Ptr NasalClipboard::_clipboard; NasalClipboard::Ptr NasalClipboard::_clipboard;
naRef NasalClipboard::_clipboard_hash;
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
NasalClipboard::~NasalClipboard() NasalClipboard::~NasalClipboard()
@ -113,33 +94,14 @@ NasalClipboard::~NasalClipboard()
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
void NasalClipboard::init(FGNasalSys *nasal) void NasalClipboard::init(FGNasalSys *nasal)
{ {
naContext ctx = naNewContext();
_clipboard = create(); _clipboard = create();
_clipboard_hash = naNewHash(ctx);
nasal->globalsSet("clipboard", _clipboard_hash); nasal::Hash clipboard = nasal->getGlobals().createHash("clipboard");
for( size_t i = 0; i < sizeof(funcs)/sizeof(funcs[0]); ++i ) clipboard.set("setText", f_setClipboardText);
{ clipboard.set("getText", f_getClipboardText);
nasal->hashset clipboard.set("CLIPBOARD", NasalClipboard::CLIPBOARD);
( clipboard.set("SELECTION", NasalClipboard::PRIMARY);
_clipboard_hash,
funcs[i].name,
naNewFunc(ctx, naNewCCode(ctx, funcs[i].func))
);
SG_LOG(SG_NASAL, SG_DEBUG, "Adding clipboard function: " << funcs[i].name);
}
for( size_t i = 0; i < sizeof(symbols)/sizeof(symbols[0]); ++i )
{
nasal->hashset(_clipboard_hash, symbols[i].name, symbols[i].val);
SG_LOG(SG_NASAL, SG_DEBUG, "Adding clipboard symbol: " << symbols[i].name);
}
naFreeContext(ctx);
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------

View file

@ -60,7 +60,6 @@ class NasalClipboard
protected: protected:
static Ptr _clipboard; static Ptr _clipboard;
static naRef _clipboard_hash;
/** /**
* Implementation supplied by actual platform implementation * Implementation supplied by actual platform implementation