79 lines
2.2 KiB
C
79 lines
2.2 KiB
C
|
|
||
|
// LuaWindow.h
|
||
|
|
||
|
// Declares the cLuaWindow class representing a virtual window that plugins may create and open for the player
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
#pragma once
|
||
|
|
||
|
#include "UI/Window.h"
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
// fwd: Plugin_NewLua.h
|
||
|
class cPlugin_NewLua;
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
// tolua_begin
|
||
|
|
||
|
/** A window that has been created by a Lua plugin and is handled entirely by that plugin
|
||
|
This object needs extra care with its lifetime management:
|
||
|
- It is created by Lua, so Lua expects to garbage-collect it later
|
||
|
- normal cWindow objects are deleted in their ClosedByPlayer() function if the last player closes them
|
||
|
To overcome this, this object overloads the Destroy functions, which doesn't let the ClosedByPlayer()
|
||
|
delete the window, but rather leaves it dangling, with only Lua having the reference to it.
|
||
|
Additionally, to forbid Lua from deleting this object while it is used by players, the manual bindings for
|
||
|
cPlayer:OpenWindow check if the window is of this class, and if so, make a global Lua reference for this object.
|
||
|
This reference needs to be unreferenced in the Destroy() function.
|
||
|
*/
|
||
|
class cLuaWindow :
|
||
|
public cWindow
|
||
|
{
|
||
|
typedef cWindow super;
|
||
|
|
||
|
public:
|
||
|
/// Create a window of the specified type, with a slot grid of a_SlotsX * a_SlotsY size
|
||
|
cLuaWindow(cWindow::WindowType a_WindowType, int a_SlotsX, int a_SlotsY, const AString & a_Title);
|
||
|
|
||
|
virtual ~cLuaWindow();
|
||
|
|
||
|
/// Returns the internal representation of the contents that are manipulated by Lua
|
||
|
cItemGrid & GetContents(void) { return m_Contents; }
|
||
|
|
||
|
// tolua_end
|
||
|
|
||
|
/** Sets the plugin reference and the internal Lua object reference index
|
||
|
used for preventing Lua's GC to collect this class while the window is open
|
||
|
*/
|
||
|
void SetLuaRef(cPlugin_NewLua * a_Plugin, int a_LuaRef);
|
||
|
|
||
|
/// Returns true if SetLuaRef() has been called
|
||
|
bool IsLuaReferenced(void) const;
|
||
|
|
||
|
protected:
|
||
|
/// Contents of the non-inventory part
|
||
|
cItemGrid m_Contents;
|
||
|
|
||
|
/// The plugin that has opened the window and owns the m_LuaRef
|
||
|
cPlugin_NewLua * m_Plugin;
|
||
|
|
||
|
/// The Lua object reference, used for keeping the object alive as long as any player has the window open
|
||
|
int m_LuaRef;
|
||
|
|
||
|
// cWindow overrides:
|
||
|
virtual void Destroy(void) override;
|
||
|
} ; // tolua_export
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|