96 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			96 lines
		
	
	
		
			2.9 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"
 | 
						|
#include "ItemGrid.h"
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
// fwd: PluginLua.h
 | 
						|
class cPluginLua;
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
/** 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 :  // tolua_export
 | 
						|
	public cItemGrid::cListener,
 | 
						|
	// tolua_begin
 | 
						|
	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(cPluginLua * a_Plugin, int a_LuaRef);
 | 
						|
	
 | 
						|
	/// Returns true if SetLuaRef() has been called
 | 
						|
	bool IsLuaReferenced(void) const;
 | 
						|
	
 | 
						|
	/// Sets the callback function (Lua reference) to call when the window is about to close
 | 
						|
	void SetOnClosing(cPluginLua * a_Plugin, int a_FnRef);
 | 
						|
	
 | 
						|
	/// Sets the callback function (Lua reference) to call when a slot is changed
 | 
						|
	void SetOnSlotChanged(cPluginLua * a_Plugin, int a_FnRef);
 | 
						|
	
 | 
						|
protected:
 | 
						|
	/// Contents of the non-inventory part
 | 
						|
	cItemGrid m_Contents;
 | 
						|
	
 | 
						|
	/// The plugin that has opened the window and owns the m_LuaRef
 | 
						|
	cPluginLua * m_Plugin;
 | 
						|
	
 | 
						|
	/// The Lua object reference, used for keeping the object alive as long as any player has the window open
 | 
						|
	int m_LuaRef;
 | 
						|
	
 | 
						|
	/// The Lua reference for the callback to call when the window is closing for any player
 | 
						|
	int m_OnClosingFnRef;
 | 
						|
	
 | 
						|
	/// The Lua reference for the callback to call when a slot has changed
 | 
						|
	int m_OnSlotChangedFnRef;
 | 
						|
	
 | 
						|
	// cWindow overrides:
 | 
						|
	virtual bool ClosedByPlayer(cPlayer & a_Player, bool a_CanRefuse) override;
 | 
						|
	virtual void Destroy(void) override;
 | 
						|
	
 | 
						|
	// cItemGrid::cListener overrides:
 | 
						|
	virtual void OnSlotChanged(cItemGrid * a_ItemGrid, int a_SlotNum) override;
 | 
						|
} ;  // tolua_export
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 |