lua-users home
lua-l archive

Working with C++ and Lua on the same datastructure

[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]


Hello all,
I'm pretty new to Lua, and as it is an excellent piece of software, I now want to use it for scripting my C++ programs. I've read a good deal of the Programming in Lua book (okay, mostly Part 1 (The Language) and Part 4 (The C API)), and now I've a conceptual question. For example, I want to create a scriptable GUI system. In C++, I'd write a class like
 class WindowT
 {
 public:
 std::string Name;
 unsigned long BackgroundColor;
 WindowT* Parent;
 ArrayT<WindowT*> Children;
 // ...
 // Many more attributes like position, size, border color...
 // ...
 virtual void OnDraw()
 {
 // C++ code here to draw the window (and it's children)
 // to the screen.
 // ...
 }
 virtual void OnActivatedEvent()
 {
 // Run some Lua script here!
 }
 // A lot more C++ related details follow here
 // that are not relevant for this example though.
 };
In words, there is a hierarchy of windows, each of which has a name, a background color, a parent, children, etc. Given this, I want to have C++ code in OnDraw() to render each window to the screen (and possibly C++ code for several other methods), but I also want to execute Lua scripts e.g. as the event handlers. For example, say we have a window "MainFrame" that has three children (sub-windows) with names "InfoText", "ButtonOK" and "ButtonCancel", then I would like to be able to have a Lua script that can e.g. modify the background color of the "MainFrame" window when the OnActivatedEvent() of the "ButtonCancel" subwindow is run.
My question is, how can I achieve this??
I've been thinking about implementing OnActivatedEvent() by first copying all C++ data of the entire window hierachy into a Lua table (identifying the individual windows by name, storing their data in sub-tables), then calling the associated Lua function, and finally copying back the entire window hierachy state from the Lua table to the C++ datastructures. This is of course a really bad and nonsense "solution". Another, much better approach is probably to add SetX() and GetX() methods for each attribute X of class WindowT, and then make these methods available to the Lua function that is called from OnActivatedEvent(). Nonetheless, I was still wondering how this is "normally" done, i.e. if maybe there is a much better solution to what looks like a common problem to me.
In order words, my question rephrased:
How can I have a complex C++ datastructure, and work with it *both* in C++ *and* in Lua code??
I'd be very grateful for any info. Thank you very much for your help!
Best regards,
Carsten

AltStyle によって変換されたページ (->オリジナル) /