commit
3cf378c5e7
@ -0,0 +1,3 @@
|
|||||||
|
FILE(GLOB HEADERS *.h)
|
||||||
|
|
||||||
|
INSTALL(FILES ${HEADERS} DESTINATION include/nel/gui COMPONENT headers)
|
@ -0,0 +1,153 @@
|
|||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
#ifndef NL_ACTION_HANDLER_H
|
||||||
|
#define NL_ACTION_HANDLER_H
|
||||||
|
|
||||||
|
#include "nel/misc/types_nl.h"
|
||||||
|
#include <libxml/parser.h>
|
||||||
|
#include "nel/misc/types_nl.h"
|
||||||
|
#include "nel/misc/debug.h"
|
||||||
|
#include "nel/misc/xml_auto_ptr.h"
|
||||||
|
#include <map>
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
|
||||||
|
class CCtrlBase;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* interface for action handlers
|
||||||
|
* \author Nicolas Brigand
|
||||||
|
* \author Nevrax France
|
||||||
|
* \date 2002
|
||||||
|
*/
|
||||||
|
class IActionHandler
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
// Execute the answer to the action
|
||||||
|
// Params has the following form : paramName=theParam|paramName2=theParam2|...
|
||||||
|
virtual void execute (CCtrlBase * /* pCaller */, const std::string &/* sParams */) { }
|
||||||
|
|
||||||
|
virtual ~IActionHandler() {}
|
||||||
|
|
||||||
|
static std::string getParam (const std::string &Params, const std::string &ParamName);
|
||||||
|
|
||||||
|
static void getAllParams (const std::string &Params, std::vector< std::pair<std::string,std::string> > &AllParams);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
interface for action handlers factory
|
||||||
|
no release in this factory : a handler must be destroyed by the control that created it
|
||||||
|
*/
|
||||||
|
class CAHManager
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
typedef std::map< std::string, IActionHandler* > TFactoryMap;
|
||||||
|
typedef std::map< IActionHandler*, std::string > TNameMap;
|
||||||
|
|
||||||
|
static CAHManager* getInstance()
|
||||||
|
{
|
||||||
|
if (_GlobalInstance == NULL)
|
||||||
|
_GlobalInstance = new CAHManager;
|
||||||
|
return _GlobalInstance;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// return pointer to action handler or null if it doesn't exist
|
||||||
|
IActionHandler *getActionHandler(const std::string &name) const
|
||||||
|
{
|
||||||
|
TFactoryMap::const_iterator it = FactoryMap.find(name);
|
||||||
|
if( it == FactoryMap.end() )
|
||||||
|
{
|
||||||
|
nlwarning( "Couldn't find action handler %s", name.c_str() );
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return it->second;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Return the name of the action handler given its pointer
|
||||||
|
const std::string &getActionHandlerName(IActionHandler *pAH) const
|
||||||
|
{
|
||||||
|
TNameMap::const_iterator it = NameMap.find(pAH);
|
||||||
|
return it != NameMap.end() ? it->second : EmptyName;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// map of action handler factories
|
||||||
|
TFactoryMap FactoryMap;
|
||||||
|
TNameMap NameMap;
|
||||||
|
std::string EmptyName;
|
||||||
|
|
||||||
|
/// return the Action Handler 'name'. if name is of form 'ah:params', then params are filled (NB: else not changed)
|
||||||
|
IActionHandler *getAH(const std::string &name, std::string ¶ms);
|
||||||
|
IActionHandler *getAH(const std::string &name, class CStringShared ¶ms);
|
||||||
|
|
||||||
|
/** common method to parse Action Handler from a xml node
|
||||||
|
* \param ahId eg: "onclick_l"
|
||||||
|
* \param paramId eg: "params_l".
|
||||||
|
* \param params returned parameters.
|
||||||
|
* NB: if paramId is NULL, empty or does not exist in the xmlNode, then the optional param in ahId (eg: "show:phrase_book")
|
||||||
|
* is taken
|
||||||
|
* NB: if none of the optional param in ahId, or the specified param are filled/found, then params is not changed
|
||||||
|
*/
|
||||||
|
void parseAH(xmlNodePtr cur, const char *ahId, const char *paramId, IActionHandler *&ahRet, std::string ¶ms);
|
||||||
|
void parseAH(xmlNodePtr cur, const char *ahId, const char *paramId, IActionHandler *&ahRet, class CStringShared ¶ms);
|
||||||
|
|
||||||
|
/// Get the AH name from ptr
|
||||||
|
const std::string &getAHName(IActionHandler *pAH){ return getActionHandlerName(pAH); }
|
||||||
|
|
||||||
|
void runActionHandler(const std::string &AHName, CCtrlBase *pCaller, const std::string &Params=std::string("") );
|
||||||
|
void runActionHandler(IActionHandler *ah, CCtrlBase *pCaller, const std::string &Params=std::string("") );
|
||||||
|
|
||||||
|
// Submit a generic event
|
||||||
|
void submitEvent( const std::string &evt );
|
||||||
|
static void setEditorMode( bool b ){ editorMode = b; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
CAHManager(){}
|
||||||
|
static CAHManager *_GlobalInstance;
|
||||||
|
static bool editorMode;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
/// Ah name must all be lower case
|
||||||
|
#define REGISTER_ACTION_HANDLER(handler ,name) \
|
||||||
|
class handler##Factory : public handler \
|
||||||
|
{ \
|
||||||
|
public: \
|
||||||
|
handler##Factory () \
|
||||||
|
{ \
|
||||||
|
nlassert(name!=NULL); \
|
||||||
|
const char *c= name; \
|
||||||
|
while(*c!='\0') \
|
||||||
|
{ \
|
||||||
|
nlassert(islower(*c) || !isalpha(*c)); \
|
||||||
|
c++; \
|
||||||
|
} \
|
||||||
|
CAHManager *pAHFM = CAHManager::getInstance(); \
|
||||||
|
pAHFM->FactoryMap.insert(CAHManager::TFactoryMap::value_type(name,this)); \
|
||||||
|
pAHFM->NameMap.insert(CAHManager::TNameMap::value_type(this,name)); \
|
||||||
|
}; \
|
||||||
|
}; \
|
||||||
|
handler##Factory handler##FactoryInstance ; \
|
||||||
|
\
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif //NL_ACTION_HANDLER_H
|
@ -0,0 +1,190 @@
|
|||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef RZ_CTRL_BASE_H
|
||||||
|
#define RZ_CTRL_BASE_H
|
||||||
|
|
||||||
|
#include "nel/misc/types_nl.h"
|
||||||
|
#include "nel/gui/view_base.h"
|
||||||
|
#include "nel/gui/event_descriptor.h"
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
class CCtrlBase : public CViewBase
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
// Tooltip mode
|
||||||
|
enum TToolTipParentType
|
||||||
|
{
|
||||||
|
TTMouse= 0, // The tooltip is displayed relatively to the mouse when it appears
|
||||||
|
TTCtrl= 1, // The tooltip is displayed relatively to the ctrl it comes from when it apeears
|
||||||
|
TTWindow= 2, // The tooltip is displayed relatively to the window where the control lies.
|
||||||
|
TTSpecialWindow= 3, // The tooltip is displayed relatively to a special user window
|
||||||
|
|
||||||
|
NumToolTipParentRef
|
||||||
|
};
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
/// Constructor
|
||||||
|
CCtrlBase(const TCtorParam ¶m) : CViewBase(param)
|
||||||
|
{
|
||||||
|
_ToolTipInstant= true;
|
||||||
|
_ToolTipParent= TTCtrl;
|
||||||
|
// see interface.txt for meaning of auto
|
||||||
|
_ToolTipParentPosRef= Hotspot_TTAuto;
|
||||||
|
_ToolTipPosRef= Hotspot_TTAuto;
|
||||||
|
resizer = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Destructor
|
||||||
|
virtual ~CCtrlBase();
|
||||||
|
|
||||||
|
static std::string tooltipParentToString( TToolTipParentType type );
|
||||||
|
static TToolTipParentType stringToToolTipParent( const std::string &str );
|
||||||
|
|
||||||
|
std::string getProperty( const std::string &name ) const;
|
||||||
|
|
||||||
|
void setProperty( const std::string &name, const std::string &value );
|
||||||
|
|
||||||
|
xmlNodePtr serialize( xmlNodePtr parentNode, const char *type ) const;
|
||||||
|
|
||||||
|
// special parse
|
||||||
|
virtual bool parse(xmlNodePtr cur, CInterfaceGroup *parentGroup);
|
||||||
|
|
||||||
|
|
||||||
|
/// Handle all events (implemented by derived classes) (return true to signal event handled)
|
||||||
|
virtual bool handleEvent (const NLGUI::CEventDescriptor &event);
|
||||||
|
|
||||||
|
virtual CCtrlBase *getSubCtrl (sint32 /* x */, sint32 /* y */) { return this; }
|
||||||
|
|
||||||
|
/// Debug
|
||||||
|
virtual uint32 getMemory() { return (uint32)(sizeof(*this)+_Id.size()); }
|
||||||
|
|
||||||
|
|
||||||
|
/// Get the ContextHelp for this control. Default is to return _ContextHelp
|
||||||
|
virtual void getContextHelp(ucstring &help) const {help= _ContextHelp;}
|
||||||
|
/// Get the ContextHelp for this control, with tooltip specific code. Default behaviour is identical to getContextHelp.
|
||||||
|
virtual void getContextHelpToolTip(ucstring &help) const { getContextHelp(help); }
|
||||||
|
// Get the name of the context help window. Default to "context_help"
|
||||||
|
virtual std::string getContextHelpWindowName() const;
|
||||||
|
/// Get the ContextHelp ActionHandler. If "", noop
|
||||||
|
const std::string &getContextHelpActionHandler() const {return _OnContextHelp;}
|
||||||
|
/// Get the ContextHelp ActionHandler Params
|
||||||
|
const std::string &getContextHelpAHParams() const {return _OnContextHelpParams;}
|
||||||
|
/// true if both are empty
|
||||||
|
bool emptyContextHelp() const;
|
||||||
|
// Should return true if the context help should be displayed instantly
|
||||||
|
bool wantInstantContextHelp() const { return _ToolTipInstant; }
|
||||||
|
/// Set true if ToolTip should be displayed instantly
|
||||||
|
void setInstantContextHelp(bool instant) { _ToolTipInstant = instant;}
|
||||||
|
|
||||||
|
/** If ctrl has a non rectangle shape, perform further test to know
|
||||||
|
* if control should be taken in account for context help
|
||||||
|
*/
|
||||||
|
virtual bool preciseHitTest(sint32 /* x */, sint32 /* y */) const { return true; }
|
||||||
|
|
||||||
|
|
||||||
|
/// return the type of anchor for the tooltip of this control
|
||||||
|
TToolTipParentType getToolTipParent() const { return _ToolTipParent;}
|
||||||
|
const std::string &getToolTipSpecialParent() const {return _ToolTipSpecialParent.toString();}
|
||||||
|
/// Set the type of anchor for the tooltip of this control
|
||||||
|
void setToolTipParent(TToolTipParentType type) { _ToolTipParent = type; }
|
||||||
|
void setToolTipSpecialParent(const std::string &parent) { _ToolTipSpecialParent = parent; }
|
||||||
|
/// Get the ToolTip pos references (parent relevant only if getToolTipParent()!=TTMouse)
|
||||||
|
THotSpot getToolTipParentPosRef() const { return _ToolTipParentPosRef;}
|
||||||
|
THotSpot getToolTipPosRef() const { return _ToolTipPosRef;}
|
||||||
|
THotSpot getToolTipParentPosRefAlt() const { return _ToolTipParentPosRefAlt;}
|
||||||
|
THotSpot getToolTipPosRefAlt() const { return _ToolTipPosRefAlt;}
|
||||||
|
/// Set the ToolTip pos references (parent relevant only if getToolTipParent()!=TTMouse)
|
||||||
|
void setToolTipParentPosRef(THotSpot pos) { _ToolTipParentPosRef = pos;}
|
||||||
|
void setToolTipPosRef(THotSpot pos) { _ToolTipPosRef = pos;}
|
||||||
|
|
||||||
|
/// replace the default contextHelp
|
||||||
|
ucstring getDefaultContextHelp() const {return _ContextHelp;}
|
||||||
|
void setDefaultContextHelp(const ucstring &help) {_ContextHelp= help;}
|
||||||
|
void setOnContextHelp(const std::string &help) {_OnContextHelp= help;}
|
||||||
|
void setOnContextHelpAHParams(const std::string &p) {_OnContextHelpParams= p;}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// called when this element or a son has been captured
|
||||||
|
virtual void elementCaptured(CCtrlBase * /* capturedElement */) {}
|
||||||
|
|
||||||
|
virtual bool isCtrl() const { return true; }
|
||||||
|
|
||||||
|
// Made for CtrlResizer to take the precedence over son controls.
|
||||||
|
virtual uint getDeltaDepth() const { return 0; }
|
||||||
|
|
||||||
|
// true if this ctrl is capturable (true by default, false for tooltip)
|
||||||
|
virtual bool isCapturable() const {return true;}
|
||||||
|
|
||||||
|
bool isResizer() const{ return resizer; }
|
||||||
|
|
||||||
|
// from CInterfaceElement
|
||||||
|
virtual void visit(CInterfaceElementVisitor *visitor);
|
||||||
|
|
||||||
|
/** test if virtual desktop change is possible while this element is captured by the mouse
|
||||||
|
* Useful for resizers
|
||||||
|
*/
|
||||||
|
virtual bool canChangeVirtualDesktop() const { return true; }
|
||||||
|
|
||||||
|
// called when keyboard capture has been lost
|
||||||
|
virtual void onKeyboardCaptureLost() {}
|
||||||
|
|
||||||
|
REFLECT_EXPORT_START(CCtrlBase, CViewBase)
|
||||||
|
REFLECT_UCSTRING("tooltip", getDefaultContextHelp, setDefaultContextHelp);
|
||||||
|
REFLECT_EXPORT_END
|
||||||
|
|
||||||
|
// special for mouse over : return true and fill the name of the cursor to display
|
||||||
|
virtual bool getMouseOverShape(std::string &/* texName */, uint8 &/* rot */, NLMISC::CRGBA &/* col */) { return false; }
|
||||||
|
|
||||||
|
virtual void serial(NLMISC::IStream &f);
|
||||||
|
|
||||||
|
uint32 getDepth( CInterfaceGroup *group );
|
||||||
|
|
||||||
|
protected:
|
||||||
|
// This is the ContextHelp filled by default in parse()
|
||||||
|
ucstring _ContextHelp;
|
||||||
|
CStringShared _OnContextHelp;
|
||||||
|
CStringShared _OnContextHelpParams;
|
||||||
|
CStringShared _ToolTipSpecialParent;
|
||||||
|
TToolTipParentType _ToolTipParent;
|
||||||
|
bool _ToolTipInstant : 1;
|
||||||
|
THotSpot _ToolTipParentPosRef : 6;
|
||||||
|
THotSpot _ToolTipPosRef : 6;
|
||||||
|
THotSpot _ToolTipParentPosRefAlt : 6;
|
||||||
|
THotSpot _ToolTipPosRefAlt : 6;
|
||||||
|
protected:
|
||||||
|
void convertTooltipHotSpot(const char *prop, THotSpot &parentHS, THotSpot &childHS);
|
||||||
|
static std::string TooltipHotSpotToString( THotSpot parent, THotSpot child );
|
||||||
|
|
||||||
|
void mapAHString( const std::string &key, const std::string &value );
|
||||||
|
std::string getAHString( const std::string &key ) const;
|
||||||
|
|
||||||
|
static std::map< std::string, std::map< std::string, std::string > > AHCache;
|
||||||
|
|
||||||
|
bool resizer;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // RZ_VIEW_BASE_H
|
||||||
|
|
||||||
|
/* End of ctrl_base.h */
|
@ -0,0 +1,270 @@
|
|||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef NL_CTRL_BASE_BUTTON_H
|
||||||
|
#define NL_CTRL_BASE_BUTTON_H
|
||||||
|
|
||||||
|
#include "nel/gui/ctrl_base.h"
|
||||||
|
#include "nel/gui/action_handler.h"
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
/**
|
||||||
|
* Base Class For Buttons.
|
||||||
|
* \author Lionel Berenguier
|
||||||
|
* \author Nevrax France
|
||||||
|
* \date 2003
|
||||||
|
*/
|
||||||
|
class CCtrlBaseButton : public CCtrlBase
|
||||||
|
{
|
||||||
|
|
||||||
|
public:
|
||||||
|
enum EType { PushButton = 0, ToggleButton, RadioButton, ButtonTypeCount };
|
||||||
|
|
||||||
|
/// Constructor
|
||||||
|
CCtrlBaseButton(const TCtorParam ¶m);
|
||||||
|
|
||||||
|
std::string getProperty( const std::string &name ) const;
|
||||||
|
void setProperty( const std::string &name, const std::string &value );
|
||||||
|
xmlNodePtr serialize( xmlNodePtr parentNode, const char *type ) const;
|
||||||
|
|
||||||
|
virtual bool parse (xmlNodePtr cur,CInterfaceGroup * parentGroup);
|
||||||
|
virtual bool handleEvent (const NLGUI::CEventDescriptor& event);
|
||||||
|
|
||||||
|
/// \name Misc
|
||||||
|
// @{
|
||||||
|
void setType (EType t) { _Type = t; }
|
||||||
|
EType getType() { return _Type; }
|
||||||
|
std::string getTypeString() const;
|
||||||
|
void setTypeFromString( const std::string &type );
|
||||||
|
|
||||||
|
void setClickWhenPushed(bool click) { _ClickWhenPushed = click; }
|
||||||
|
bool getClickWhenPushed() const { return _ClickWhenPushed; }
|
||||||
|
|
||||||
|
void setPushed (bool state);
|
||||||
|
bool getPushed () const { return _Pushed; }
|
||||||
|
|
||||||
|
void setFrozen (bool state);
|
||||||
|
bool getFrozen () const { return _Frozen; }
|
||||||
|
|
||||||
|
// Set half tone mode for the display of frozen buttons. Default is true.
|
||||||
|
void setFrozenHalfTone(bool enabled);
|
||||||
|
bool getFrozenHalfTone() const { return _FrozenHalfTone; }
|
||||||
|
|
||||||
|
// if the radio is a radio button, then all radio button are unselected
|
||||||
|
void unselect();
|
||||||
|
// @}
|
||||||
|
|
||||||
|
|
||||||
|
/// \name Colors
|
||||||
|
// @{
|
||||||
|
void setColor(NLMISC::CRGBA col) { _ColorNormal = col; }
|
||||||
|
void setColorPushed(NLMISC::CRGBA col) { _ColorPushed = col; }
|
||||||
|
void setColorOver(NLMISC::CRGBA col) { _ColorOver = col; }
|
||||||
|
|
||||||
|
NLMISC::CRGBA getColor() const { return _ColorNormal; }
|
||||||
|
NLMISC::CRGBA getColorPushed() const { return _ColorPushed; }
|
||||||
|
NLMISC::CRGBA getColorOver() const { return _ColorOver; }
|
||||||
|
|
||||||
|
// Override because mustupdate 3 states
|
||||||
|
void setModulateGlobalColorAll(bool state);
|
||||||
|
void setModulateGlobalColorNormal(bool state) {_ModulateGlobalColorNormal= state;}
|
||||||
|
void setModulateGlobalColorPushed(bool state) {_ModulateGlobalColorPushed= state;}
|
||||||
|
void setModulateGlobalColorOver(bool state) {_ModulateGlobalColorOver= state;}
|
||||||
|
|
||||||
|
virtual sint32 getAlpha() const { return _ColorNormal.A; }
|
||||||
|
virtual void setAlpha (sint32 a) { _ColorOver.A = _ColorNormal.A = _ColorPushed.A = (uint8)a; }
|
||||||
|
|
||||||
|
std::string getColorAsString() const
|
||||||
|
{ return NLMISC::toString(_ColorNormal.R) + " " + NLMISC::toString(_ColorNormal.G) + " " +
|
||||||
|
NLMISC::toString(_ColorNormal.B) + " " + NLMISC::toString(_ColorNormal.A); }
|
||||||
|
std::string getColorOverAsString() const
|
||||||
|
{ return NLMISC::toString(_ColorOver.R) + " " + NLMISC::toString(_ColorOver.G) + " " +
|
||||||
|
NLMISC::toString(_ColorOver.B) + " " + NLMISC::toString(_ColorOver.A); }
|
||||||
|
std::string getColorPushedAsString() const
|
||||||
|
{ return NLMISC::toString(_ColorPushed.R) + " " + NLMISC::toString(_ColorPushed.G) + " " +
|
||||||
|
NLMISC::toString(_ColorPushed.B) + " " + NLMISC::toString(_ColorPushed.A); }
|
||||||
|
|
||||||
|
void setColorAsString(const std::string &col) { _ColorNormal = convertColor (col.c_str()); }
|
||||||
|
void setColorOverAsString(const std::string &col) { _ColorOver = convertColor (col.c_str()); }
|
||||||
|
void setColorPushedAsString(const std::string &col) { _ColorPushed = convertColor (col.c_str()); }
|
||||||
|
// @}
|
||||||
|
|
||||||
|
///\name radio button specific
|
||||||
|
//@{
|
||||||
|
/** Initialize radio button reference
|
||||||
|
* Advanced:
|
||||||
|
* NB: must call initRBRef() for radio button if button is created without parse().
|
||||||
|
* NB: setParent() must be called before (else assert)
|
||||||
|
*/
|
||||||
|
void initRBRef();
|
||||||
|
//@}
|
||||||
|
void initRBRefFromRadioButton(CCtrlBaseButton * pBut);
|
||||||
|
|
||||||
|
|
||||||
|
/// \name Handlers
|
||||||
|
// @{
|
||||||
|
// Event part
|
||||||
|
void setActionOnLeftClick (const std::string &actionHandlerName) { _AHOnLeftClickString = actionHandlerName; _AHOnLeftClick = CAHManager::getInstance()->getAH(actionHandlerName, _AHLeftClickParams); }
|
||||||
|
void setActionOnLeftClickParams(const std::string ¶ms) { _AHOnLeftClickStringParams = params; }
|
||||||
|
void setActionOnRightClick (const std::string &actionHandlerName) { _AHOnRightClick = CAHManager::getInstance()->getAH(actionHandlerName, _AHRightClickParams); }
|
||||||
|
void setActionOnClockTick (const std::string &ahName) { _AHOnClockTick = CAHManager::getInstance()->getAH(ahName, _AHClockTickParams); }
|
||||||
|
void setParamsOnLeftClick (const std::string ¶msHandlerName) { _AHLeftClickParams = paramsHandlerName; }
|
||||||
|
void setParamsOnRightClick (const std::string ¶msHandlerName) { _AHRightClickParams = paramsHandlerName; }
|
||||||
|
void setParamsOnClockTick (const std::string &ahParamsName) { _AHClockTickParams = ahParamsName; }
|
||||||
|
|
||||||
|
// get Event part
|
||||||
|
std::string _getActionOnOver() const{ return CAHManager::getInstance()->getAHName( _AHOnOver ); }
|
||||||
|
std::string _getActionOnLeftClick() const { return CAHManager::getInstance()->getAHName( _AHOnLeftClick ); }
|
||||||
|
std::string _getActionOnLeftLongClick() const { return CAHManager::getInstance()->getAHName( _AHOnLeftLongClick ); }
|
||||||
|
std::string _getActionOnDblLeftClick() const { return CAHManager::getInstance()->getAHName( _AHOnLeftDblClick ); }
|
||||||
|
std::string _getActionOnRightClick() const { return CAHManager::getInstance()->getAHName( _AHOnRightClick ); }
|
||||||
|
std::string _getActionOnClockTick() const { return CAHManager::getInstance()->getAHName( _AHOnClockTick ); }
|
||||||
|
|
||||||
|
IActionHandler *getActionOnLeftClick () const { return _AHOnLeftClick; }
|
||||||
|
IActionHandler *getActionOnRightClick () const { return _AHOnRightClick; }
|
||||||
|
IActionHandler *getActionOnClockTick () const { return _AHOnClockTick; }
|
||||||
|
std::string _getParamsOnOver() const{ return _AHOverParams.toString(); }
|
||||||
|
std::string _getParamsOnLeftClick () const { return _AHLeftClickParams.toString(); }
|
||||||
|
const std::string &getParamsOnLeftClick () const { return _AHLeftClickParams; }
|
||||||
|
const std::string &getParamsOnRightClick () const { return _AHRightClickParams; }
|
||||||
|
const std::string &getParamsOnClockTick () const { return _AHClockTickParams; }
|
||||||
|
|
||||||
|
// run action on left click
|
||||||
|
void runLeftClickAction();
|
||||||
|
|
||||||
|
// Context menu accessor/ One for each button
|
||||||
|
void setListMenuLeft (const std::string &cm) { _ListMenuLeft = cm; }
|
||||||
|
void setListMenuRight (const std::string &cm) { _ListMenuRight = cm; }
|
||||||
|
void setListMenuBoth (const std::string &cm) { _ListMenuLeft= _ListMenuRight= cm; }
|
||||||
|
std::string getListMenuLeft () { return _ListMenuLeft.toString(); }
|
||||||
|
std::string getListMenuRight () { return _ListMenuRight.toString(); }
|
||||||
|
// @}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int luaRunLeftClickAction(CLuaState &ls);
|
||||||
|
REFLECT_EXPORT_START(CCtrlBaseButton, CCtrlBase)
|
||||||
|
REFLECT_BOOL("pushed", getPushed, setPushed);
|
||||||
|
REFLECT_STRING("col_normal", getColorAsString, setColorAsString);
|
||||||
|
REFLECT_STRING("col_over", getColorOverAsString, setColorOverAsString);
|
||||||
|
REFLECT_STRING("col_pushed", getColorPushedAsString, setColorPushedAsString);
|
||||||
|
REFLECT_RGBA("col_normal_rgba", getColor, setColor);
|
||||||
|
REFLECT_RGBA("col_over_rgba", getColorOver, setColorOver);
|
||||||
|
REFLECT_RGBA("col_pushed_rgba", getColorPushed, setColorPushed);
|
||||||
|
REFLECT_BOOL("frozen", getFrozen, setFrozen);
|
||||||
|
REFLECT_BOOL("frozen_half_tone", getFrozenHalfTone, setFrozenHalfTone);
|
||||||
|
REFLECT_STRING("onclick_l", _getActionOnLeftClick, setActionOnLeftClick);
|
||||||
|
REFLECT_STRING("params_l", _getParamsOnLeftClick, setParamsOnLeftClick);
|
||||||
|
REFLECT_LUA_METHOD("runLeftClickAction", luaRunLeftClickAction);
|
||||||
|
REFLECT_EXPORT_END
|
||||||
|
|
||||||
|
protected:
|
||||||
|
EType _Type;
|
||||||
|
|
||||||
|
// State
|
||||||
|
bool _Pushed : 1;
|
||||||
|
bool _Over : 1;
|
||||||
|
bool _OverWhenPushed : 1;
|
||||||
|
bool _Frozen : 1;
|
||||||
|
bool _FrozenHalfTone : 1;
|
||||||
|
bool _ClickWhenPushed : 1;
|
||||||
|
bool _ModulateGlobalColorNormal : 1;
|
||||||
|
bool _ModulateGlobalColorPushed : 1;
|
||||||
|
bool _ModulateGlobalColorOver : 1;
|
||||||
|
bool _LeftLongClickHandled : 1; // Is it already handled ?
|
||||||
|
bool _LeftDblClickHandled : 1;
|
||||||
|
|
||||||
|
|
||||||
|
///\name radio button specific
|
||||||
|
//@{
|
||||||
|
CCtrlBaseButton *_RBRefBut; // The reference button. If NULL the control do not own the reference
|
||||||
|
// There is only one radio button per group that own the reference (the first one)
|
||||||
|
CCtrlBaseButton **_RBRef; // The pointer onto the reference button
|
||||||
|
//@}
|
||||||
|
|
||||||
|
|
||||||
|
// Colors
|
||||||
|
NLMISC::CRGBA _ColorNormal;
|
||||||
|
NLMISC::CRGBA _ColorPushed;
|
||||||
|
NLMISC::CRGBA _ColorOver;
|
||||||
|
|
||||||
|
///\name Long click specific
|
||||||
|
//@{
|
||||||
|
sint64 _LeftLongClickDate; // Time we left click down
|
||||||
|
//@}
|
||||||
|
|
||||||
|
// for double click : last date at which last left click occurred
|
||||||
|
static sint64 _LastLeftClickDate;
|
||||||
|
static NLMISC::CRefPtr<CCtrlBaseButton> _LastLeftClickButton;
|
||||||
|
|
||||||
|
///\name Action Handler
|
||||||
|
//@{
|
||||||
|
IActionHandler *_AHOnOver;
|
||||||
|
CStringShared _AHOverParams;
|
||||||
|
std::string _AHOnLeftClickString;
|
||||||
|
std::string _AHOnLeftClickStringParams;
|
||||||
|
IActionHandler *_AHOnLeftClick;
|
||||||
|
CStringShared _AHLeftClickParams;
|
||||||
|
IActionHandler *_AHOnLeftDblClick;
|
||||||
|
CStringShared _AHLeftDblClickParams;
|
||||||
|
IActionHandler *_AHOnRightClick;
|
||||||
|
CStringShared _AHRightClickParams;
|
||||||
|
IActionHandler *_AHOnClockTick;
|
||||||
|
CStringShared _AHClockTickParams;
|
||||||
|
IActionHandler *_AHOnLeftLongClick;
|
||||||
|
CStringShared _AHLeftLongClickParams;
|
||||||
|
//@}
|
||||||
|
CStringShared _ListMenuLeft;
|
||||||
|
CStringShared _ListMenuRight;
|
||||||
|
|
||||||
|
// get the colors modulated on request
|
||||||
|
NLMISC::CRGBA getCurrentColorNormal(NLMISC::CRGBA globalColor) const
|
||||||
|
{
|
||||||
|
NLMISC::CRGBA rgba = _ColorNormal;
|
||||||
|
if(_ModulateGlobalColorNormal)
|
||||||
|
rgba.modulateFromColor(rgba, globalColor);
|
||||||
|
return rgba;
|
||||||
|
}
|
||||||
|
NLMISC::CRGBA getCurrentColorPushed(NLMISC::CRGBA globalColor) const
|
||||||
|
{
|
||||||
|
NLMISC::CRGBA rgba = _ColorPushed;
|
||||||
|
if(_ModulateGlobalColorPushed)
|
||||||
|
rgba.modulateFromColor(rgba, globalColor);
|
||||||
|
return rgba;
|
||||||
|
}
|
||||||
|
NLMISC::CRGBA getCurrentColorOver(NLMISC::CRGBA globalColor) const
|
||||||
|
{
|
||||||
|
NLMISC::CRGBA rgba = _ColorOver;
|
||||||
|
if(_ModulateGlobalColorOver)
|
||||||
|
rgba.modulateFromColor(rgba, globalColor);
|
||||||
|
return rgba;
|
||||||
|
}
|
||||||
|
|
||||||
|
// call it at draw
|
||||||
|
void updateOver(bool &lastOver);
|
||||||
|
virtual void elementCaptured(CCtrlBase *capturedElement);
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // NL_CTRL_BASE_BUTTON_H
|
||||||
|
|
||||||
|
/* End of ctrl_base_button.h */
|
@ -0,0 +1,108 @@
|
|||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef RZ_CTRL_BUTTON_H
|
||||||
|
#define RZ_CTRL_BUTTON_H
|
||||||
|
|
||||||
|
#include "nel/gui/ctrl_base_button.h"
|
||||||
|
#include "nel/gui/view_renderer.h"
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
class CEventDescriptor;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <Class description>
|
||||||
|
* \author Nicolas Brigand
|
||||||
|
* \author Nevrax France
|
||||||
|
* \date 2002
|
||||||
|
*/
|
||||||
|
class CCtrlButton : public CCtrlBaseButton
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
/// Constructor
|
||||||
|
CCtrlButton(const TCtorParam ¶m) : CCtrlBaseButton(param)
|
||||||
|
{
|
||||||
|
_Scale = false;
|
||||||
|
_Align = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setAlignFromString( const std::string &s );
|
||||||
|
|
||||||
|
std::string getProperty( const std::string &name ) const;
|
||||||
|
void setProperty( const std::string &name, const std::string &value );
|
||||||
|
xmlNodePtr serialize( xmlNodePtr parentNode, const char *type ) const;
|
||||||
|
|
||||||
|
// Init part
|
||||||
|
virtual bool parse (xmlNodePtr cur,CInterfaceGroup * parentGroup);
|
||||||
|
|
||||||
|
virtual void updateCoords();
|
||||||
|
|
||||||
|
virtual uint32 getMemory() { return (uint32)(sizeof(*this)+_Id.size()); }
|
||||||
|
|
||||||
|
virtual bool getMouseOverShape(std::string &/* texName */, uint8 &/* rot */, NLMISC::CRGBA &/* col */);
|
||||||
|
|
||||||
|
// Display part
|
||||||
|
virtual void draw();
|
||||||
|
|
||||||
|
void setTexture (const std::string&name);
|
||||||
|
void setTexturePushed (const std::string&name);
|
||||||
|
void setTextureOver (const std::string&name);
|
||||||
|
|
||||||
|
void fitTexture();
|
||||||
|
|
||||||
|
std::string getTexture () const;
|
||||||
|
std::string getTexturePushed () const;
|
||||||
|
std::string getTextureOver() const;
|
||||||
|
|
||||||
|
bool isTextureValid() const { return _TextureIdNormal != -1; }
|
||||||
|
|
||||||
|
// test if the texture must scale
|
||||||
|
bool getScale() const { return _Scale; }
|
||||||
|
void setScale(bool scale) { _Scale = scale; }
|
||||||
|
|
||||||
|
|
||||||
|
/// \from CInterfaceElement
|
||||||
|
sint32 getMaxUsedW() const;
|
||||||
|
sint32 getMinUsedW() const;
|
||||||
|
|
||||||
|
REFLECT_EXPORT_START(CCtrlButton, CCtrlBaseButton)
|
||||||
|
REFLECT_STRING("texture", getTexture, setTexture);
|
||||||
|
REFLECT_STRING("texture_pushed", getTexturePushed, setTexturePushed);
|
||||||
|
REFLECT_STRING("texture_over", getTextureOver, setTextureOver);
|
||||||
|
REFLECT_BOOL("scale", getScale, setScale);
|
||||||
|
REFLECT_EXPORT_END
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
CViewRenderer::CTextureId _TextureIdNormal;
|
||||||
|
CViewRenderer::CTextureId _TextureIdPushed;
|
||||||
|
CViewRenderer::CTextureId _TextureIdOver;
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
bool _Scale;
|
||||||
|
sint32 _Align; /// 1st bit - Left/Right (0/1) 2nd bit - Bottom/Top (0/1)
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // RZ_CTRL_BUTTON_H
|
||||||
|
|
||||||
|
/* End of ctrl_button.h */
|
@ -0,0 +1,110 @@
|
|||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef RZ_CTRL_COL_PICK_H
|
||||||
|
#define RZ_CTRL_COL_PICK_H
|
||||||
|
|
||||||
|
#include "nel/misc/types_nl.h"
|
||||||
|
#include "nel/gui/ctrl_base.h"
|
||||||
|
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class handling a Color Picker
|
||||||
|
* \author Matthieu 'TrapII' Besson
|
||||||
|
* \author Nevrax France
|
||||||
|
* \date 2003
|
||||||
|
*/
|
||||||
|
class CCtrlColPick : public CCtrlBase
|
||||||
|
{
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
CCtrlColPick(const TCtorParam ¶m);
|
||||||
|
~CCtrlColPick();
|
||||||
|
|
||||||
|
std::string getProperty( const std::string &name ) const;
|
||||||
|
void setProperty( const std::string &name, const std::string &value );
|
||||||
|
xmlNodePtr serialize( xmlNodePtr parentNode, const char *type ) const;
|
||||||
|
|
||||||
|
virtual bool parse(xmlNodePtr cur, CInterfaceGroup * parentGroup);
|
||||||
|
|
||||||
|
virtual void updateCoords();
|
||||||
|
virtual void draw();
|
||||||
|
virtual bool handleEvent (const NLGUI::CEventDescriptor &event);
|
||||||
|
|
||||||
|
sint32 getColorR () const { return _ColorSelect.R; }
|
||||||
|
sint32 getColorG () const { return _ColorSelect.G; }
|
||||||
|
sint32 getColorB () const { return _ColorSelect.B; }
|
||||||
|
sint32 getColorA () const { return _ColorSelect.A; }
|
||||||
|
|
||||||
|
void setColorR (sint32 r) { _ColorSelect.R = (uint8)r; }
|
||||||
|
void setColorG (sint32 g) { _ColorSelect.G = (uint8)g; }
|
||||||
|
void setColorB (sint32 b) { _ColorSelect.B = (uint8)b; }
|
||||||
|
void setColorA (sint32 a) { _ColorSelect.A = (uint8)a; }
|
||||||
|
|
||||||
|
|
||||||
|
std::string getColor () const; // Get Color Selected
|
||||||
|
void setColor (const std::string &col); // Set Color Selected
|
||||||
|
|
||||||
|
std::string getColorOver () const; // Get Color Over
|
||||||
|
void setColorOver (const std::string &col); // Set Color Over
|
||||||
|
|
||||||
|
REFLECT_EXPORT_START(CCtrlColPick, CCtrlBase)
|
||||||
|
REFLECT_SINT32("r", getColorR, setColorR);
|
||||||
|
REFLECT_SINT32("g", getColorG, setColorG);
|
||||||
|
REFLECT_SINT32("b", getColorB, setColorB);
|
||||||
|
REFLECT_SINT32("a", getColorA, setColorA);
|
||||||
|
REFLECT_STRING("color", getColor, setColor);
|
||||||
|
REFLECT_STRING("color_over", getColorOver, setColorOver);
|
||||||
|
REFLECT_EXPORT_END
|
||||||
|
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
void selectColor (sint32 x, sint32 y);
|
||||||
|
NLMISC::CRGBA getColor (sint32 x, sint32 y);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
bool _MouseDown;
|
||||||
|
|
||||||
|
sint32 _Texture;
|
||||||
|
|
||||||
|
NLMISC::CRGBA _ColorSelect; // Last Color selected
|
||||||
|
NLMISC::CRGBA _ColorOver; // Color Under Mouse Pointer
|
||||||
|
|
||||||
|
std::string _AHOnChange;
|
||||||
|
std::string _AHOnChangeParams;
|
||||||
|
|
||||||
|
CInterfaceProperty _ColSelR;
|
||||||
|
CInterfaceProperty _ColSelG;
|
||||||
|
CInterfaceProperty _ColSelB;
|
||||||
|
CInterfaceProperty _ColSelA;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif // RZ_CTRL_COL_PICK_H
|
||||||
|
|
||||||
|
/* End of ctrl_col_pick.h */
|
||||||
|
|
||||||
|
|
@ -0,0 +1,64 @@
|
|||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef CTRL_DRAGGABLE_H
|
||||||
|
#define CTRL_DRAGGABLE_H
|
||||||
|
|
||||||
|
#include "nel/gui/ctrl_base.h"
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
|
||||||
|
class CCtrlDraggable : public CCtrlBase
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
DECLARE_UI_CLASS( CCtrlDraggable )
|
||||||
|
|
||||||
|
CCtrlDraggable( const TCtorParam ¶m );
|
||||||
|
virtual ~CCtrlDraggable(){};
|
||||||
|
|
||||||
|
static CCtrlDraggable *getDraggedSheet(){ return _LastDraggedSheet; }
|
||||||
|
bool isDragged() const{ return dragged; }
|
||||||
|
void setDragged( bool dragged ){ this->dragged = dragged; }
|
||||||
|
bool isDraggable() const{ return draggable; }
|
||||||
|
void setDraggable( bool draggable ){ this->draggable = draggable; }
|
||||||
|
|
||||||
|
void abortDragging()
|
||||||
|
{
|
||||||
|
dragged = false;
|
||||||
|
_LastDraggedSheet = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Necessary because of reflection, no other purpose
|
||||||
|
void draw(){}
|
||||||
|
|
||||||
|
REFLECT_EXPORT_START(CCtrlDraggable, CCtrlBase)
|
||||||
|
REFLECT_BOOL("dragable", isDraggable, setDraggable);
|
||||||
|
REFLECT_EXPORT_END
|
||||||
|
|
||||||
|
protected:
|
||||||
|
static void setDraggedSheet( CCtrlDraggable *draggable ){ _LastDraggedSheet = draggable; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
static CCtrlDraggable *_LastDraggedSheet;
|
||||||
|
bool dragged;
|
||||||
|
bool draggable;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1,94 @@
|
|||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef RZ_CTRL_POLYGON_H
|
||||||
|
#define RZ_CTRL_POLYGON_H
|
||||||
|
|
||||||
|
#include "nel/gui/ctrl_base.h"
|
||||||
|
#include "nel/gui/view_renderer.h"
|
||||||
|
#include "nel/misc/geom_ext.h"
|
||||||
|
#include "nel/misc/polygon.h"
|
||||||
|
|
||||||
|
namespace NLMISC
|
||||||
|
{
|
||||||
|
class CVector2f;
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
|
||||||
|
/** Display of an arbitrary polygon in the ui.
|
||||||
|
* polygons are clipped & batched.
|
||||||
|
*
|
||||||
|
* Derives from CCtrlBase in order to provide button / tooltip capability
|
||||||
|
*
|
||||||
|
* \author Nicolas Vizerie
|
||||||
|
* \author Nevrax France
|
||||||
|
* \date 1/2006
|
||||||
|
*/
|
||||||
|
class CCtrlPolygon : public CCtrlBase
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CCtrlPolygon();
|
||||||
|
virtual uint32 getMemory() { return (uint32)(sizeof(*this)+_Id.size()); }
|
||||||
|
virtual void updateCoords();
|
||||||
|
virtual void draw();
|
||||||
|
/** Change the vertices. This is costly because concav / complex polys are split in a list of triangles
|
||||||
|
*/
|
||||||
|
void setVertices(const std::vector<NLMISC::CVector> &vertices);
|
||||||
|
const std::vector<NLMISC::CVector> &getVertices() const { return _Poly.Vertices; }
|
||||||
|
// test if current position in inside the current (transformed) poly (in window space)
|
||||||
|
bool contains(const NLMISC::CVector2f &pos) const;
|
||||||
|
// color
|
||||||
|
void setColorRGBA(NLMISC::CRGBA col) { _Color = col; }
|
||||||
|
NLMISC::CRGBA getColorRGBA() const { return _Color; }
|
||||||
|
// from CViewBase
|
||||||
|
virtual sint32 getAlpha() const { return (sint32) _Color.A; }
|
||||||
|
virtual void setAlpha(sint32 a);
|
||||||
|
/** Change the matrix for this poly. Changing the matrix is usually cheaper than changing
|
||||||
|
* The vertices because complex poly do not have to be split again
|
||||||
|
*/
|
||||||
|
//void setMatrix(const NLMISC::CMatrix &mat);
|
||||||
|
//const NLMISC::CMatrix &getMatrix() const { return _Matrix; }
|
||||||
|
// test if last call to 'setVertices' was for a valid poly (e.g one that doesn't overlapp itself)
|
||||||
|
bool isValid() const { return _Valid; }
|
||||||
|
virtual bool handleEvent (const NLGUI::CEventDescriptor &event);
|
||||||
|
|
||||||
|
// no capturable by default (just tooltip capability wanted)
|
||||||
|
virtual bool isCapturable() const { return false; }
|
||||||
|
private:
|
||||||
|
NLMISC::CPolygon _Poly;
|
||||||
|
NLMISC::CPolygon2D _XFormPoly;
|
||||||
|
//NLMISC::CMatrix _Matrix;
|
||||||
|
bool _Valid;
|
||||||
|
bool _Touched;
|
||||||
|
NLMISC::CRGBA _Color;
|
||||||
|
std::vector<NLMISC::CTriangle> _Tris;
|
||||||
|
std::vector<NLMISC::CTriangle> _RealTris; // clipped tris in screen coordinates
|
||||||
|
private:
|
||||||
|
void updateBoudingRect();
|
||||||
|
protected:
|
||||||
|
// TMP TMP : have to solve matrix imprecision for display in map -> do the full computation for now ...
|
||||||
|
virtual void computeScaledVertex(NLMISC::CVector2f &dest, const NLMISC::CVector2f &src);
|
||||||
|
public:
|
||||||
|
void touch();
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1,116 @@
|
|||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef RZ_CTRL_QUAD_H
|
||||||
|
#define RZ_CTRL_QUAD_H
|
||||||
|
|
||||||
|
#include "nel/gui/ctrl_base.h"
|
||||||
|
#include "nel/gui/view_renderer.h"
|
||||||
|
#include "nel/misc/geom_ext.h"
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
|
||||||
|
/** Display of an arbitrary textured quad in the UI. The applied texture is filtered.
|
||||||
|
* Unlike CViewBitmap, the texture is always scaled here, and this ui element coordinates
|
||||||
|
* are driven by the quad vertices coordinates (see setQuad).
|
||||||
|
*
|
||||||
|
* Derives from CCtrlBase for tooltipping support
|
||||||
|
*
|
||||||
|
* \author Nicolas Vizerie
|
||||||
|
* \author Nevrax France
|
||||||
|
* \date 12/2005
|
||||||
|
*/
|
||||||
|
class CCtrlQuad : public CCtrlBase
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
enum TWrapMode { Repeat = 0, Clamp, CustomUVs, WrapModeCount };
|
||||||
|
|
||||||
|
|
||||||
|
CCtrlQuad();
|
||||||
|
|
||||||
|
// from CInterfaceElement
|
||||||
|
bool parse(xmlNodePtr cur,CInterfaceGroup *parentGroup);
|
||||||
|
virtual void updateCoords();
|
||||||
|
virtual void draw();
|
||||||
|
virtual uint32 getMemory() { return (uint32)(sizeof(*this)+_Id.size()); }
|
||||||
|
|
||||||
|
// from CViewBase
|
||||||
|
virtual sint32 getAlpha() const { return (sint32) _Color.A; }
|
||||||
|
virtual void setAlpha (sint32 a);
|
||||||
|
|
||||||
|
// texture
|
||||||
|
void setTexture(const std::string &texName);
|
||||||
|
std::string getTexture () const;
|
||||||
|
|
||||||
|
// color
|
||||||
|
void setColorRGBA(NLMISC::CRGBA col) { _Color = col; }
|
||||||
|
NLMISC::CRGBA getColorRGBA() const { return _Color; }
|
||||||
|
|
||||||
|
/** Set a new quad relative to parent pos
|
||||||
|
* x,y, w, h & hotspot are updated to fit the bounding rect of the quad
|
||||||
|
*/
|
||||||
|
void setQuad(const NLMISC::CQuad &quad);
|
||||||
|
void setQuad(const NLMISC::CVector &start, const NLMISC::CVector &end, float thickness);
|
||||||
|
/** Fit the given texture size (no hotspot for now, always centered)
|
||||||
|
* NB : current texture is not modified.
|
||||||
|
*/
|
||||||
|
void setQuad(const std::string &texName, const NLMISC::CVector &pos, float angle = 0.f, float offCenter = 0.f);
|
||||||
|
void setQuad(const NLMISC::CVector &pos, float radius, float angle = 0.f);
|
||||||
|
const NLMISC::CQuad &getQuad() const { return _Quad; }
|
||||||
|
|
||||||
|
void setAdditif(bool additif);
|
||||||
|
bool getAdditif() const { return _Additif; }
|
||||||
|
|
||||||
|
void setFiltered(bool filtered);
|
||||||
|
bool getFiltered() const { return _Filtered; }
|
||||||
|
|
||||||
|
void setPattern(float umin, float umax, TWrapMode wrapMode);
|
||||||
|
|
||||||
|
/** Set uvs for each corners -> this will change the wrap mode to CustomUVs
|
||||||
|
* Use setPattern(0.f, 0.f, CCtrlQuad::Repeat) to return to previous behavior
|
||||||
|
*/
|
||||||
|
void setCustomUVs(const NLMISC::CUV uvs[4]);
|
||||||
|
|
||||||
|
|
||||||
|
// from CCtrlBase, no op by default
|
||||||
|
virtual bool handleEvent (const NLGUI::CEventDescriptor &event);
|
||||||
|
|
||||||
|
// see if this control contains the given point (in parent coords)
|
||||||
|
bool contains(const NLMISC::CVector2f &pos) const;
|
||||||
|
|
||||||
|
// no capturable by default (just tooltip capability wanted)
|
||||||
|
virtual bool isCapturable() const { return false; }
|
||||||
|
|
||||||
|
|
||||||
|
private:
|
||||||
|
NLMISC::CRGBA _Color;
|
||||||
|
NLMISC::CQuad _Quad;
|
||||||
|
NLMISC::CQuadUV _RealQuad; // absolute coords
|
||||||
|
float _ClampedUCorrection;
|
||||||
|
CViewRenderer::CTextureId _TextureId; /// Accelerator
|
||||||
|
bool _Additif;
|
||||||
|
bool _Filtered;
|
||||||
|
float _UMin;
|
||||||
|
float _UMax;
|
||||||
|
TWrapMode _WrapMode;
|
||||||
|
NLMISC::CUV _CustomUVs[4];
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1,206 @@
|
|||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef RZ_CTRL_SCROLL_H
|
||||||
|
#define RZ_CTRL_SCROLL_H
|
||||||
|
|
||||||
|
#include "nel/misc/types_nl.h"
|
||||||
|
#include "nel/gui/ctrl_scroll_base.h"
|
||||||
|
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class handling scollbar function
|
||||||
|
* \author Matthieu 'TrapII' Besson
|
||||||
|
* \author Nevrax France
|
||||||
|
* \date 2002
|
||||||
|
*/
|
||||||
|
class CCtrlScroll : public CCtrlScrollBase, public NLMISC::ICDBNode::IPropertyObserver
|
||||||
|
{
|
||||||
|
|
||||||
|
public:
|
||||||
|
DECLARE_UI_CLASS( CCtrlScroll )
|
||||||
|
CCtrlScroll(const TCtorParam ¶m);
|
||||||
|
~CCtrlScroll();
|
||||||
|
|
||||||
|
std::string getProperty( const std::string &name ) const;
|
||||||
|
void setProperty( const std::string &name, const std::string &value );
|
||||||
|
xmlNodePtr serialize( xmlNodePtr parentNode, const char *type ) const;
|
||||||
|
|
||||||
|
virtual bool parse(xmlNodePtr cur, CInterfaceGroup * parentGroup);
|
||||||
|
|
||||||
|
virtual void updateCoords();
|
||||||
|
virtual void draw();
|
||||||
|
virtual bool handleEvent (const NLGUI::CEventDescriptor &event);
|
||||||
|
|
||||||
|
void setTarget (CInterfaceGroup *pIG);
|
||||||
|
// Return the delta value the track has moved
|
||||||
|
sint32 moveTrackX (sint32 dx);
|
||||||
|
sint32 moveTrackY (sint32 dy);
|
||||||
|
|
||||||
|
/** Move the Target Ofs with a Delta, and recompute TrackPos from this Ofs.
|
||||||
|
* Useful for finer controled group scrolling when the list is very big (with mouseWheel or scroll buttons)
|
||||||
|
*/
|
||||||
|
void moveTargetX (sint32 dx);
|
||||||
|
void moveTargetY (sint32 dy);
|
||||||
|
|
||||||
|
void setAlign (sint32 nAlign) { _Aligned = nAlign; }
|
||||||
|
// invert the factor for target
|
||||||
|
void setInverted(bool invert) { _Inverted = invert; }
|
||||||
|
|
||||||
|
void setTextureBottomOrLeft (const std::string &txName);
|
||||||
|
void setTextureMiddle (const std::string &txName);
|
||||||
|
void setTextureTopOrRight (const std::string &txName);
|
||||||
|
std::string getTextureBottomOrLeft() const;
|
||||||
|
std::string getTextureMiddle() const;
|
||||||
|
std::string getTextureTopOrRight() const;
|
||||||
|
|
||||||
|
void setTextureBottomOrLeft (sint32 txid) { _TxIdB = txid; }
|
||||||
|
void setTextureMiddle (sint32 txid) { _TxIdM = txid; }
|
||||||
|
void setTextureMiddleTile (uint8 tile) { _TileM = tile; } // 0 - not tiled (1 BL) (2 BR) (3 TL) (4 TR)
|
||||||
|
void setTextureTopOrRight (sint32 txid) { _TxIdT = txid; }
|
||||||
|
|
||||||
|
// number scroller
|
||||||
|
sint32 getValue() const { return _IsDBLink ? _DBLink.getSInt32() : _Value; }
|
||||||
|
// NB: the value is clamped (see setMinMax) and stepped (see setStepValue())
|
||||||
|
void setValue(sint32 value);
|
||||||
|
void setMinMax(sint32 nMin, sint32 nMax) { _Min = nMin; _Max = nMax; }
|
||||||
|
void setStepValue(uint32 step) { _StepValue= step; }
|
||||||
|
|
||||||
|
void setTrackPos(sint32 pos);
|
||||||
|
sint32 getTrackPos() const { return _TrackPos; }
|
||||||
|
sint32 getTrackSize() const { return _TrackSize; }
|
||||||
|
// dummy set for track size (forlua export)
|
||||||
|
void setTrackSize(sint32 /* trackSize */) { throw NLMISC::Exception("TrackSize is read-only"); }
|
||||||
|
|
||||||
|
|
||||||
|
void setFrozen (bool state);
|
||||||
|
bool getFrozen () const { return _Frozen; }
|
||||||
|
|
||||||
|
int luaSetTarget(CLuaState &ls);
|
||||||
|
int luaEnsureVisible(CLuaState &ls);
|
||||||
|
|
||||||
|
// name
|
||||||
|
void setName(const std::string & val) {_Name = val;}
|
||||||
|
std::string getName() const {return _Name;}
|
||||||
|
|
||||||
|
// max
|
||||||
|
void setMax(sint32 max) {_Max = max;}
|
||||||
|
sint32 getMax() const {return _Max;}
|
||||||
|
|
||||||
|
REFLECT_EXPORT_START(CCtrlScroll, CCtrlScrollBase)
|
||||||
|
REFLECT_LUA_METHOD("setTarget", luaSetTarget)
|
||||||
|
REFLECT_LUA_METHOD("ensureVisible", luaEnsureVisible);
|
||||||
|
REFLECT_SINT32("value", getValue, setValue);
|
||||||
|
REFLECT_SINT32("trackPos", getTrackPos, setTrackPos);
|
||||||
|
REFLECT_SINT32("trackSize", getTrackSize, setTrackSize);
|
||||||
|
REFLECT_STRING("name", getName, setName);
|
||||||
|
REFLECT_SINT32("max", getMax, setMax);
|
||||||
|
REFLECT_EXPORT_END
|
||||||
|
|
||||||
|
/** Ensure that a child element be visible into the frame through which
|
||||||
|
* its parent group is displayed.
|
||||||
|
* Example : Had we a list of items for which we want some item 'itemPtr' to have its top position
|
||||||
|
* matching the middle of the list, we would do :
|
||||||
|
* this->ensureVisible(itemPtr, Hotspot_Tx, Hotspot_Mx);
|
||||||
|
*
|
||||||
|
* The scrollbar will be moved accordingly.
|
||||||
|
*/
|
||||||
|
void ensureVisible(CInterfaceElement *childElement, THotSpot childHotSpot, THotSpot parentHotSpot);
|
||||||
|
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
CInterfaceProperty _DBLink; // If this is a value scroller we can link it with db
|
||||||
|
sint32 _Value; // Or we can use a normal value
|
||||||
|
sint32 _InitialValue;
|
||||||
|
|
||||||
|
sint32 _Min, _Max;
|
||||||
|
std::string _AHOnScroll;
|
||||||
|
std::string _AHOnScrollParams;
|
||||||
|
//
|
||||||
|
std::string _AHOnScrollEnd;
|
||||||
|
std::string _AHOnScrollEndParams;
|
||||||
|
//
|
||||||
|
//
|
||||||
|
std::string _AHOnScrollCancel;
|
||||||
|
std::string _AHOnScrollCancelParams;
|
||||||
|
|
||||||
|
|
||||||
|
sint32 _Aligned; // 0-Top 1-Bottom 2-Left 3-Right
|
||||||
|
|
||||||
|
sint32 _TrackDispPos;
|
||||||
|
sint32 _TrackPos;
|
||||||
|
sint32 _TrackSize;
|
||||||
|
sint32 _TrackSizeMin;
|
||||||
|
|
||||||
|
sint32 _MouseDownOffsetX;
|
||||||
|
sint32 _MouseDownOffsetY;
|
||||||
|
|
||||||
|
sint32 _TxIdB; // Same as Left if Horizontal sb
|
||||||
|
sint32 _TxIdM;
|
||||||
|
sint32 _TxIdT; // Same as Right if Horizontal sb
|
||||||
|
|
||||||
|
uint8 _TileM;
|
||||||
|
|
||||||
|
sint32 _LastTargetHReal;
|
||||||
|
sint32 _LastTargetMaxHReal;
|
||||||
|
sint32 _LastTargetOfsY;
|
||||||
|
sint32 _LastTargetWReal;
|
||||||
|
sint32 _LastTargetMaxWReal;
|
||||||
|
sint32 _LastTargetOfsX;
|
||||||
|
|
||||||
|
bool _Vertical : 1; // true if vertical track bar
|
||||||
|
bool _IsDBLink : 1;
|
||||||
|
bool _ObserverOn : 1;
|
||||||
|
bool _Inverted : 1;
|
||||||
|
bool _MouseDown : 1;
|
||||||
|
bool _CallingAH : 1;
|
||||||
|
bool _Cancelable : 1; // true if the slider may be cancelled when pressed on the mouse right button
|
||||||
|
bool _Frozen : 1;
|
||||||
|
|
||||||
|
// For Target Scroller only: the target offset step in pixel.
|
||||||
|
sint32 _TargetStepX;
|
||||||
|
sint32 _TargetStepY;
|
||||||
|
|
||||||
|
// For Value Scroller only: indicate the step the scroll bar has. 0 or 1 means no step
|
||||||
|
uint32 _StepValue;
|
||||||
|
|
||||||
|
// Slider's name
|
||||||
|
std::string _Name;
|
||||||
|
|
||||||
|
void computeTargetOfsFromPos();
|
||||||
|
|
||||||
|
// from IPropertyObserver
|
||||||
|
virtual void update(NLMISC::ICDBNode *node);
|
||||||
|
|
||||||
|
// step the value, and clamp it
|
||||||
|
void normalizeValue(sint32 &value);
|
||||||
|
|
||||||
|
void runAH(const std::string &name, const std::string ¶ms);
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // RZ_CTRL_SCROLL_H
|
||||||
|
|
||||||
|
/* End of ctrl_scroll.h */
|
||||||
|
|
||||||
|
|
@ -0,0 +1,60 @@
|
|||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
#ifndef CTRL_SCROLL_BASE_H
|
||||||
|
#define CTRL_SCROLL_BASE_H
|
||||||
|
|
||||||
|
#include "nel/gui/ctrl_base.h"
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
|
||||||
|
class CInterfaceGroup;
|
||||||
|
|
||||||
|
class CCtrlScrollBase : public CCtrlBase
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
DECLARE_UI_CLASS( CCtrlScrollBase )
|
||||||
|
|
||||||
|
CCtrlScrollBase( const TCtorParam ¶m );
|
||||||
|
virtual ~CCtrlScrollBase();
|
||||||
|
|
||||||
|
virtual void setTarget( CInterfaceGroup *pIG );
|
||||||
|
CInterfaceGroup* getTarget(){ return _Target; }
|
||||||
|
virtual sint32 moveTrackX( sint32 dx );
|
||||||
|
virtual sint32 moveTrackY( sint32 dy );
|
||||||
|
|
||||||
|
/** Move the Target Ofs with a Delta, and recompute TrackPos from this Ofs.
|
||||||
|
* Useful for finer controled group scrolling when the list is very big (with mouseWheel or scroll buttons)
|
||||||
|
*/
|
||||||
|
virtual void moveTargetX( sint32 dx );
|
||||||
|
virtual void moveTargetY( sint32 dy );
|
||||||
|
|
||||||
|
|
||||||
|
// Necessary because of reflection, no other purpose
|
||||||
|
void draw(){}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
CInterfaceGroup *_Target; // If NULL the scroller is a value scroller
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,83 @@
|
|||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef CL_SHEET_CTRL_SELECTION_H
|
||||||
|
#define CL_SHEET_CTRL_SELECTION_H
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
class IActionHandler;
|
||||||
|
|
||||||
|
/** Infos about a selection group
|
||||||
|
*/
|
||||||
|
class CSheetSelectionGroup
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CSheetSelectionGroup(std::string name) : _Name(name), _Active(false), _TextureIndex(-1), _Color(NLMISC::CRGBA::White), _GlobalColorEnabled(true) {}
|
||||||
|
void setTexture(const std::string &texName);
|
||||||
|
sint32 getTextureIndex() const { return _TextureIndex; }
|
||||||
|
sint32 getTextureWidth() const { return _TextureWidth; }
|
||||||
|
sint32 getTextureHeight() const { return _TextureHeight; }
|
||||||
|
void setColor(NLMISC::CRGBA color) { _Color = color; }
|
||||||
|
NLMISC::CRGBA getColor() const { return _Color; }
|
||||||
|
void setActive(bool active) { _Active = active; }
|
||||||
|
bool isActive() const { return _Active; }
|
||||||
|
const std::string &getName() const { return _Name; }
|
||||||
|
void enableGlobalColor(bool enabled) { _GlobalColorEnabled = enabled; }
|
||||||
|
bool isGlobalColorEnabled() const { return _GlobalColorEnabled; }
|
||||||
|
private:
|
||||||
|
std::string _Name;
|
||||||
|
bool _Active;
|
||||||
|
sint32 _TextureIndex; // index for the selection texture
|
||||||
|
sint32 _TextureWidth;
|
||||||
|
sint32 _TextureHeight;
|
||||||
|
NLMISC::CRGBA _Color; // color that modulate the texture of selection
|
||||||
|
bool _GlobalColorEnabled;
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Class to manage selection of sheet.
|
||||||
|
* Sheet are managed by groups, identified by their ID.
|
||||||
|
*/
|
||||||
|
class CCtrlSheetSelection
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
// Add a group, and returns its index, or -1 if already created.
|
||||||
|
sint addGroup(const std::string &name);
|
||||||
|
// Get a group by its name (must exist)
|
||||||
|
CSheetSelectionGroup *getGroup(const std::string &name);
|
||||||
|
const CSheetSelectionGroup *getGroup(const std::string &name) const;
|
||||||
|
// Get a group by its index
|
||||||
|
CSheetSelectionGroup *getGroup(uint index);
|
||||||
|
const CSheetSelectionGroup *getGroup(uint index) const;
|
||||||
|
// Get the index of a group from its name, return -1 if not a group
|
||||||
|
sint getGroupIndex(const std::string &name) const;
|
||||||
|
// Deactivate all groups
|
||||||
|
void deactivateAll();
|
||||||
|
// delete all groups
|
||||||
|
void deleteGroups();
|
||||||
|
private:
|
||||||
|
//
|
||||||
|
typedef std::vector<CSheetSelectionGroup> TGroupVect;
|
||||||
|
typedef std::map<std::string, uint> TGroupNameToIndex;
|
||||||
|
private:
|
||||||
|
TGroupVect _Groups;
|
||||||
|
TGroupNameToIndex _GroupNameToIndex;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1,170 @@
|
|||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef NL_CTRL_TEXT_BUTTON_H
|
||||||
|
#define NL_CTRL_TEXT_BUTTON_H
|
||||||
|
|
||||||
|
#include "nel/gui/ctrl_base_button.h"
|
||||||
|
#include "nel/gui/view_renderer.h"
|
||||||
|
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
class CEventDescriptor;
|
||||||
|
class CViewText;
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
/**
|
||||||
|
* Text Button that can be either Push or Toggle button. Localized, auto-resize
|
||||||
|
* \author Lionel Berenguier
|
||||||
|
* \author Nevrax France
|
||||||
|
* \date 2002
|
||||||
|
*/
|
||||||
|
class CCtrlTextButton : public CCtrlBaseButton
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
/// Constructor
|
||||||
|
CCtrlTextButton(const TCtorParam ¶m);
|
||||||
|
|
||||||
|
std::string getProperty( const std::string &name ) const;
|
||||||
|
void setProperty( const std::string &name, const std::string &value );
|
||||||
|
xmlNodePtr serialize( xmlNodePtr parentNode, const char *type ) const;
|
||||||
|
|
||||||
|
// Init part
|
||||||
|
virtual bool parse (xmlNodePtr cur,CInterfaceGroup * parentGroup);
|
||||||
|
|
||||||
|
virtual void updateCoords();
|
||||||
|
|
||||||
|
virtual uint32 getMemory() { return (uint32)(sizeof(*this)+_Id.size()); }
|
||||||
|
|
||||||
|
// Display part
|
||||||
|
virtual void draw();
|
||||||
|
|
||||||
|
// Hide/Show the text also.
|
||||||
|
virtual void setActive(bool state);
|
||||||
|
|
||||||
|
// Add also our ViewText
|
||||||
|
virtual void onAddToGroup();
|
||||||
|
|
||||||
|
|
||||||
|
/// \from CInterfaceElement
|
||||||
|
sint32 getMaxUsedW() const;
|
||||||
|
sint32 getMinUsedW() const;
|
||||||
|
|
||||||
|
// Special Text Colors accessors
|
||||||
|
// Colors
|
||||||
|
NLMISC::CRGBA getTextColorNormal() const {return _TextColorNormal;}
|
||||||
|
void setTextColorNormal(NLMISC::CRGBA v) {_TextColorNormal= v;}
|
||||||
|
NLMISC::CRGBA getTextColorPushed() const {return _TextColorPushed;}
|
||||||
|
void setTextColorPushed(NLMISC::CRGBA v) {_TextColorPushed= v;}
|
||||||
|
NLMISC::CRGBA getTextColorOver() const {return _TextColorOver;}
|
||||||
|
void setTextColorOver(NLMISC::CRGBA v) {_TextColorOver= v;}
|
||||||
|
// Shadow Colors
|
||||||
|
NLMISC::CRGBA getTextShadowColorNormal() const {return _TextShadowColorNormal;}
|
||||||
|
void setTextShadowColorNormal(NLMISC::CRGBA v) {_TextShadowColorNormal= v;}
|
||||||
|
NLMISC::CRGBA getTextShadowColorPushed() const {return _TextShadowColorPushed;}
|
||||||
|
void setTextShadowColorPushed(NLMISC::CRGBA v) {_TextShadowColorPushed= v;}
|
||||||
|
NLMISC::CRGBA getTextShadowColorOver() const {return _TextShadowColorOver;}
|
||||||
|
void setTextShadowColorOver(NLMISC::CRGBA v) {_TextShadowColorOver= v;}
|
||||||
|
// Global Modulate Colors
|
||||||
|
bool getTextModulateGlobalColorNormal() const {return _TextModulateGlobalColorNormal;}
|
||||||
|
void setTextModulateGlobalColorNormal(bool v) {_TextModulateGlobalColorNormal= v;}
|
||||||
|
bool getTextModulateGlobalColorPushed() const {return _TextModulateGlobalColorPushed;}
|
||||||
|
void setTextModulateGlobalColorPushed(bool v) {_TextModulateGlobalColorPushed= v;}
|
||||||
|
bool getTextModulateGlobalColorOver() const {return _TextModulateGlobalColorOver;}
|
||||||
|
void setTextModulateGlobalColorOver(bool v) {_TextModulateGlobalColorOver= v;}
|
||||||
|
// Set text (noop if text id)
|
||||||
|
void setText (const ucstring &text);
|
||||||
|
ucstring getText () const;
|
||||||
|
|
||||||
|
void setHardText (const std::string &text);
|
||||||
|
std::string getHardText () const;
|
||||||
|
|
||||||
|
CViewText* getViewText();
|
||||||
|
void setViewText(CViewText* text) {_ViewText=text;}
|
||||||
|
|
||||||
|
void setTextX(sint32 x);
|
||||||
|
sint32 getTextX() const { return _TextX; }
|
||||||
|
|
||||||
|
void setWMargin(sint32 w) { _WMargin = w; }
|
||||||
|
sint32 getWMargin() const { return _WMargin; }
|
||||||
|
|
||||||
|
sint32 getWMin() const { return _WMin; }
|
||||||
|
void setWMin( sint32 wmin ) { _WMin = wmin; }
|
||||||
|
|
||||||
|
// Compute Size according to bitmap and Text (Ensure as big as possible button)
|
||||||
|
sint32 getWMax() const;
|
||||||
|
|
||||||
|
int luaGetViewText(CLuaState &ls);
|
||||||
|
|
||||||
|
REFLECT_EXPORT_START(CCtrlTextButton, CCtrlBaseButton)
|
||||||
|
REFLECT_UCSTRING("uc_hardtext", getText, setText);
|
||||||
|
REFLECT_STRING("hardtext", getHardText, setHardText);
|
||||||
|
REFLECT_SINT32("text_x", getTextX, setTextX)
|
||||||
|
REFLECT_SINT32("wmargin", getWMargin, setWMargin)
|
||||||
|
REFLECT_SINT32("wmin", getWMin, setWMin)
|
||||||
|
REFLECT_LUA_METHOD("getViewText", luaGetViewText)
|
||||||
|
REFLECT_EXPORT_END
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
enum {NumTexture= 3};
|
||||||
|
|
||||||
|
CViewRenderer::CTextureId _TextureIdNormal[NumTexture];
|
||||||
|
CViewRenderer::CTextureId _TextureIdPushed[NumTexture];
|
||||||
|
CViewRenderer::CTextureId _TextureIdOver[NumTexture];
|
||||||
|
|
||||||
|
// setup
|
||||||
|
void setup();
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
CViewText *_ViewText;
|
||||||
|
|
||||||
|
bool _Setuped;
|
||||||
|
bool _IsViewTextId;
|
||||||
|
bool _ForceTextOver; // text is displayed over the "over" texture
|
||||||
|
// Size of Bitmaps
|
||||||
|
sint32 _BmpLeftW, _BmpMiddleW, _BmpRightW, _BmpH;
|
||||||
|
// Value to add to TextW to get button W.
|
||||||
|
sint32 _WMargin;
|
||||||
|
// Min W Value
|
||||||
|
sint32 _WMin;
|
||||||
|
sint32 _TextY;
|
||||||
|
sint32 _TextX;
|
||||||
|
THotSpot _TextPosRef;
|
||||||
|
THotSpot _TextParentPosRef;
|
||||||
|
// Special Colors for text
|
||||||
|
NLMISC::CRGBA _TextColorNormal;
|
||||||
|
NLMISC::CRGBA _TextColorPushed;
|
||||||
|
NLMISC::CRGBA _TextColorOver;
|
||||||
|
NLMISC::CRGBA _TextShadowColorNormal;
|
||||||
|
NLMISC::CRGBA _TextShadowColorPushed;
|
||||||
|
NLMISC::CRGBA _TextShadowColorOver;
|
||||||
|
bool _TextModulateGlobalColorNormal;
|
||||||
|
bool _TextModulateGlobalColorPushed;
|
||||||
|
bool _TextModulateGlobalColorOver;
|
||||||
|
bool _TextHeaderColor;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // NL_CTRL_TEXT_BUTTON_H
|
||||||
|
|
||||||
|
/* End of ctrl_text_button.h */
|
@ -0,0 +1,71 @@
|
|||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef DBMANAGER_H
|
||||||
|
#define DBMANAGER_H
|
||||||
|
|
||||||
|
#include "nel/misc/cdb_manager.h"
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
Database Manager
|
||||||
|
|
||||||
|
Provides access to a simple CDB based tree hierarchical data store
|
||||||
|
*/
|
||||||
|
class CDBManager : public NLMISC::CCDBManager
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
static CDBManager* getInstance();
|
||||||
|
static void release();
|
||||||
|
|
||||||
|
/**
|
||||||
|
Retrieves a leaf node from the database.
|
||||||
|
@param name - name of the data leaf node we are querying.
|
||||||
|
@param create - when true if a node cannot be found it is created.
|
||||||
|
*/
|
||||||
|
NLMISC::CCDBNodeLeaf* getDbProp( const std::string &name, bool create = true );
|
||||||
|
|
||||||
|
/**
|
||||||
|
Deletes a node from the database.
|
||||||
|
@param name - name of the node.
|
||||||
|
*/
|
||||||
|
void delDbProp( const std::string &name );
|
||||||
|
|
||||||
|
/**
|
||||||
|
Returns a leaf node's content as an sint32
|
||||||
|
@param name - name of the leaf node.
|
||||||
|
*/
|
||||||
|
sint32 getDbValue32( const std::string &name );
|
||||||
|
|
||||||
|
/**
|
||||||
|
Returns the root branch of the database.
|
||||||
|
*/
|
||||||
|
NLMISC::CCDBNodeBranch* getDB() const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
CDBManager();
|
||||||
|
~CDBManager();
|
||||||
|
|
||||||
|
static CDBManager *instance;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1,169 @@
|
|||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef NL_DBGROUP_COMBO_BOX_H
|
||||||
|
#define NL_DBGROUP_COMBO_BOX_H
|
||||||
|
|
||||||
|
#include "nel/misc/types_nl.h"
|
||||||
|
#include "nel/gui/interface_group.h"
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
class CCtrlBaseButton;
|
||||||
|
class CViewText;
|
||||||
|
class CGroupMenu;
|
||||||
|
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
/**
|
||||||
|
* Widget: ComboBox of text
|
||||||
|
* \author Lionel Berenguier
|
||||||
|
* \author Nevrax France
|
||||||
|
* \date 2002
|
||||||
|
*/
|
||||||
|
class CDBGroupComboBox : public CInterfaceGroup
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
/// Constructor
|
||||||
|
CDBGroupComboBox(const TCtorParam ¶m);
|
||||||
|
~CDBGroupComboBox();
|
||||||
|
|
||||||
|
std::string getProperty( const std::string &name ) const;
|
||||||
|
void setProperty( const std::string &name, const std::string &value );
|
||||||
|
xmlNodePtr serialize( xmlNodePtr parentNode, const char *type ) const;
|
||||||
|
|
||||||
|
/// CInterfaceGroup Interface
|
||||||
|
virtual bool parse (xmlNodePtr cur, CInterfaceGroup *parentGroup);
|
||||||
|
virtual void updateCoords ();
|
||||||
|
virtual void checkCoords ();
|
||||||
|
|
||||||
|
// Combo Texts
|
||||||
|
void resetTexts();
|
||||||
|
void addText(const ucstring &text);
|
||||||
|
void setText(uint i, const ucstring &text);
|
||||||
|
void insertText(uint i, const ucstring &text);
|
||||||
|
const ucstring &getText(uint i) const;
|
||||||
|
const uint &getTextId(uint i) const;
|
||||||
|
uint getTextPos(uint nId) const;
|
||||||
|
const ucstring &getTexture(uint i) const;
|
||||||
|
void removeText(uint nPos);
|
||||||
|
uint getNumTexts() const {return (uint)_Texts.size();}
|
||||||
|
void sortText();
|
||||||
|
|
||||||
|
// selection
|
||||||
|
void setSelection(sint32 val);
|
||||||
|
void setSelectionNoTrigger(sint32 val);
|
||||||
|
sint32 getSelection() const;
|
||||||
|
|
||||||
|
// selection number
|
||||||
|
void setSelectionNb(sint32 /* val */){}
|
||||||
|
sint32 getSelectionNb() const {return (sint32)_Texts.size();}
|
||||||
|
|
||||||
|
// selection text
|
||||||
|
void setSelectionText(const std::string & val);
|
||||||
|
std::string getSelectionText() const;
|
||||||
|
|
||||||
|
// view text
|
||||||
|
void setViewText(const ucstring & text);
|
||||||
|
ucstring getViewText() const;
|
||||||
|
|
||||||
|
void setTexture(uint i, const ucstring &texture);
|
||||||
|
|
||||||
|
sint32 evalContentWidth() const;
|
||||||
|
|
||||||
|
|
||||||
|
int luaAddText(CLuaState &ls);
|
||||||
|
int luaRemoveSelection(CLuaState &ls);
|
||||||
|
int luaRemoveText(CLuaState &ls);
|
||||||
|
int luaRemoveTextByIndex(CLuaState &ls);
|
||||||
|
int luaResetTexts(CLuaState &ls);
|
||||||
|
int luaSetText(CLuaState &ls);
|
||||||
|
int luaInsertText(CLuaState &ls);
|
||||||
|
int luaGetText(CLuaState &ls);
|
||||||
|
int luaGetNumTexts(CLuaState &ls);
|
||||||
|
int luaSetTexture(CLuaState &ls);
|
||||||
|
|
||||||
|
|
||||||
|
REFLECT_EXPORT_START(CDBGroupComboBox, CInterfaceGroup)
|
||||||
|
REFLECT_SINT32("selection", getSelection, setSelection)
|
||||||
|
REFLECT_LUA_METHOD("addText", luaAddText)
|
||||||
|
REFLECT_LUA_METHOD("setText", luaSetText)
|
||||||
|
REFLECT_LUA_METHOD("insertText", luaInsertText)
|
||||||
|
REFLECT_LUA_METHOD("setTexture", luaSetTexture)
|
||||||
|
REFLECT_LUA_METHOD("getText", luaGetText)
|
||||||
|
REFLECT_LUA_METHOD("getNumTexts", luaGetNumTexts)
|
||||||
|
REFLECT_LUA_METHOD("removeSelection", luaRemoveSelection)
|
||||||
|
REFLECT_LUA_METHOD("removeText", luaRemoveText)
|
||||||
|
REFLECT_LUA_METHOD("removeTextByIndex", luaRemoveTextByIndex)
|
||||||
|
REFLECT_LUA_METHOD("resetTexts", luaResetTexts)
|
||||||
|
REFLECT_SINT32 ("selectionNb", getSelectionNb, setSelectionNb)
|
||||||
|
REFLECT_STRING ("selection_text", getSelectionText, setSelectionText)
|
||||||
|
REFLECT_UCSTRING ("view_text", getViewText, setViewText)
|
||||||
|
REFLECT_EXPORT_END
|
||||||
|
|
||||||
|
|
||||||
|
protected:
|
||||||
|
friend class CHandlerComboBoxSelectStart;
|
||||||
|
|
||||||
|
bool _LinkedToDB; // if not linked to db, then _NotLinkedToDBSelection is used instead
|
||||||
|
bool _Setuped;
|
||||||
|
bool _DirtySelection;
|
||||||
|
sint32 _CacheSelection;
|
||||||
|
|
||||||
|
// sint32
|
||||||
|
CInterfaceProperty _Selection;
|
||||||
|
sint32 _NotLinkedToDBSelection;
|
||||||
|
std::vector<std::pair<uint, ucstring> > _Texts;
|
||||||
|
std::vector<ucstring> _Textures;
|
||||||
|
|
||||||
|
// Action Handler called on combo click
|
||||||
|
std::string _AHOnSelectStart;
|
||||||
|
|
||||||
|
// Action handler called when the content is changed
|
||||||
|
std::string _AHOnChange;
|
||||||
|
std::string _AHOnChangeParams;
|
||||||
|
bool _CallingOnChangeActionHandler; // avoid infinite loop here
|
||||||
|
|
||||||
|
|
||||||
|
// Children
|
||||||
|
CViewText *_ViewText;
|
||||||
|
CCtrlBaseButton *_SelectButton;
|
||||||
|
|
||||||
|
bool _IsExternViewText;
|
||||||
|
ucstring _ExternViewText;
|
||||||
|
|
||||||
|
|
||||||
|
private:
|
||||||
|
void setup();
|
||||||
|
void dirt();
|
||||||
|
public:
|
||||||
|
// private : fill a menu with current content
|
||||||
|
void fillMenu(CGroupMenu *groupMenu) const;
|
||||||
|
|
||||||
|
|
||||||
|
static std::string measureMenu;
|
||||||
|
static std::string selectMenu;
|
||||||
|
static std::string selectMenuOut;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // NL_DBGROUP_COMBO_BOX_H
|
||||||
|
|
||||||
|
/* End of dbgroup_combo_box.h */
|
@ -0,0 +1,100 @@
|
|||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef NL_DBGROUP_SELECT_NUMBER_H
|
||||||
|
#define NL_DBGROUP_SELECT_NUMBER_H
|
||||||
|
|
||||||
|
#include "nel/misc/types_nl.h"
|
||||||
|
#include "nel/gui/interface_group.h"
|
||||||
|
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
class CCtrlBaseButton;
|
||||||
|
class CViewText;
|
||||||
|
class CViewBitmap;
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
/**
|
||||||
|
* Widget to select a number
|
||||||
|
* \author Lionel Berenguier
|
||||||
|
* \author Nevrax France
|
||||||
|
* \date 2002
|
||||||
|
*/
|
||||||
|
class CDBGroupSelectNumber : public CInterfaceGroup
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
/// Constructor
|
||||||
|
CDBGroupSelectNumber(const TCtorParam ¶m);
|
||||||
|
~CDBGroupSelectNumber();
|
||||||
|
|
||||||
|
std::string getProperty( const std::string &name ) const;
|
||||||
|
void setProperty( const std::string &name, const std::string &value );
|
||||||
|
xmlNodePtr serialize( xmlNodePtr parentNode, const char *type ) const;
|
||||||
|
|
||||||
|
/// CInterfaceGroup Interface
|
||||||
|
virtual bool parse (xmlNodePtr cur, CInterfaceGroup *parentGroup);
|
||||||
|
virtual void updateCoords ();
|
||||||
|
virtual void checkCoords();
|
||||||
|
virtual void draw ();
|
||||||
|
virtual void clearViews ();
|
||||||
|
virtual bool handleEvent (const NLGUI::CEventDescriptor &eventDesc);
|
||||||
|
|
||||||
|
// mod interface
|
||||||
|
void changeValue(sint delta);
|
||||||
|
|
||||||
|
sint32 getMinValue () const { return _MinValue; }
|
||||||
|
void setMinValue (sint32 m) { _MinValue = m; }
|
||||||
|
sint32 getMaxValue () const { return _MaxValue; }
|
||||||
|
void setMaxValue (sint32 m) { _MaxValue = m; }
|
||||||
|
|
||||||
|
sint32 getCurrentValue () const { return _Number.getSInt32(); }
|
||||||
|
void setCurrentValue (sint32 val) { _Number.setSInt32(val); }
|
||||||
|
|
||||||
|
REFLECT_EXPORT_START(CDBGroupSelectNumber, CInterfaceGroup)
|
||||||
|
REFLECT_SINT32("min", getMinValue, setMinValue);
|
||||||
|
REFLECT_SINT32("max", getMaxValue, setMaxValue);
|
||||||
|
REFLECT_EXPORT_END
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
// sint32
|
||||||
|
CInterfaceProperty _Number;
|
||||||
|
bool _LoopMode;
|
||||||
|
sint _MinValue;
|
||||||
|
sint _MaxValue;
|
||||||
|
sint _DeltaMultiplier;
|
||||||
|
|
||||||
|
// Children
|
||||||
|
CViewBitmap *_SlotNumber;
|
||||||
|
CViewText *_TextNumber;
|
||||||
|
CCtrlBaseButton *_ButtonUp;
|
||||||
|
CCtrlBaseButton *_ButtonDown;
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
void setup();
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // NL_DBGROUP_SELECT_NUMBER_H
|
||||||
|
|
||||||
|
/* End of dbgroup_select_number.h */
|
@ -0,0 +1,115 @@
|
|||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef RZ_DBVIEW_BAR_H
|
||||||
|
#define RZ_DBVIEW_BAR_H
|
||||||
|
|
||||||
|
#include "nel/misc/types_nl.h"
|
||||||
|
#include "nel/gui/view_bitmap.h"
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* class implementing a bitmap used as the front texture of a progress bar
|
||||||
|
* the bitmap is drawn from _X to _W * _Range/_RangeMax
|
||||||
|
* \author Nicolas Brigand
|
||||||
|
* \author Nevrax France
|
||||||
|
* \date 2002
|
||||||
|
*/
|
||||||
|
class CDBViewBar : public CViewBitmap
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
enum TViewBar { ViewBar_UltraMini, ViewBar_Mini, ViewBar_Normal, ViewBar_MiniThick };
|
||||||
|
public:
|
||||||
|
|
||||||
|
/// Constructor
|
||||||
|
CDBViewBar(const TCtorParam ¶m)
|
||||||
|
: CViewBitmap(param),
|
||||||
|
_Slot(TCtorParam())
|
||||||
|
{
|
||||||
|
_Color= NLMISC::CRGBA::White;
|
||||||
|
_ValueInt= 0;
|
||||||
|
_RangeInt = 255;
|
||||||
|
_ReferenceInt= 0;
|
||||||
|
_Type = ViewBar_Normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setType (TViewBar vb);
|
||||||
|
|
||||||
|
std::string getProperty( const std::string &name ) const;
|
||||||
|
void setProperty( const std::string &name, const std::string &value );
|
||||||
|
xmlNodePtr serialize( xmlNodePtr parentNode, const char *type ) const;
|
||||||
|
bool parse(xmlNodePtr cur,CInterfaceGroup * parentGroup);
|
||||||
|
virtual uint32 getMemory() { return (uint32)(sizeof(*this)+_Id.size()); }
|
||||||
|
virtual void updateCoords ();
|
||||||
|
virtual void draw ();
|
||||||
|
|
||||||
|
/// Nbs: Values by Int are not used if the Links are setuped
|
||||||
|
void setValue (sint32 r) { _ValueInt = r; }
|
||||||
|
void setRange (sint32 r) { _RangeInt = r; }
|
||||||
|
void setReference (sint32 r) { _ReferenceInt = r; }
|
||||||
|
sint32 getValue () const { return _ValueInt; }
|
||||||
|
sint32 getRange () const { return _RangeInt; }
|
||||||
|
sint32 getReference () const { return _ReferenceInt; }
|
||||||
|
|
||||||
|
void setValueDbLink (const std::string &r);
|
||||||
|
void setRangeDbLink (const std::string &r);
|
||||||
|
void setReferenceDbLink (const std::string &r);
|
||||||
|
std::string getValueDbLink () const;
|
||||||
|
std::string getRangeDbLink () const;
|
||||||
|
std::string getReferenceDbLink () const;
|
||||||
|
|
||||||
|
// Reflect ValueInt (ie not used if the link is setuped)
|
||||||
|
REFLECT_EXPORT_START(CDBViewBar, CViewBitmap)
|
||||||
|
REFLECT_SINT32 ("value", getValue, setValue);
|
||||||
|
REFLECT_SINT32 ("range", getRange, setRange);
|
||||||
|
REFLECT_SINT32 ("reference", getReference, setReference);
|
||||||
|
REFLECT_STRING ("value_dblink", getValueDbLink, setValueDbLink);
|
||||||
|
REFLECT_STRING ("range_dblink", getRangeDbLink, setRangeDbLink);
|
||||||
|
REFLECT_STRING ("reference_dblink", getReferenceDbLink, setReferenceDbLink);
|
||||||
|
REFLECT_EXPORT_END
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
CViewBitmap _Slot;
|
||||||
|
TViewBar _Type;
|
||||||
|
sint32 _HBar;
|
||||||
|
NLMISC::CRGBA _ColorNegative;
|
||||||
|
|
||||||
|
// Value of the progression in arbitrary units. should be integer
|
||||||
|
CInterfaceProperty _Value;
|
||||||
|
// Max range of the progression in arbitrary units. should be integer
|
||||||
|
CInterfaceProperty _Range;
|
||||||
|
// Reference of the progression (substracted from value and range).
|
||||||
|
CInterfaceProperty _Reference;
|
||||||
|
|
||||||
|
/// Nbs: Values by Int are not used if the Links are setuped. NB: not overwritten by links
|
||||||
|
sint32 _ValueInt;
|
||||||
|
sint32 _RangeInt;
|
||||||
|
sint32 _ReferenceInt;
|
||||||
|
|
||||||
|
void parseValProp(xmlNodePtr cur, CInterfaceProperty &dbProp, sint32 &intProp, const char *name);
|
||||||
|
sint64 getCurrentValProp(const CInterfaceProperty &dbProp, sint32 intProp);
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // RZ_DBVIEW_BAR_H
|
||||||
|
|
||||||
|
/* End of dbview_bar.h */
|
@ -0,0 +1,110 @@
|
|||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef RZ_DBVIEW_BAR3_H
|
||||||
|
#define RZ_DBVIEW_BAR3_H
|
||||||
|
|
||||||
|
#include "nel/misc/types_nl.h"
|
||||||
|
#include "nel/gui/view_bitmap.h"
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* class implementing a 3 Bar widget
|
||||||
|
* \author Matthieu 'TrapII' Besson
|
||||||
|
* \author Nevrax France
|
||||||
|
* \date 2002
|
||||||
|
*/
|
||||||
|
class CDBViewBar3 : public CViewBitmap
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
/// Constructor
|
||||||
|
CDBViewBar3(const TCtorParam ¶m);
|
||||||
|
|
||||||
|
std::string getProperty( const std::string &name ) const;
|
||||||
|
void setProperty( const std::string &name, const std::string &value );
|
||||||
|
xmlNodePtr serialize( xmlNodePtr parentNode, const char *type ) const;
|
||||||
|
bool parse(xmlNodePtr cur,CInterfaceGroup * parentGroup);
|
||||||
|
virtual uint32 getMemory() { return (uint32)(sizeof(*this)+_Id.size()); }
|
||||||
|
virtual void updateCoords ();
|
||||||
|
|
||||||
|
void setMini (bool mini);
|
||||||
|
|
||||||
|
virtual void draw ();
|
||||||
|
|
||||||
|
/// Nbs: Values by Int are not used if the Links are setuped
|
||||||
|
void setValue0 (sint32 r) { _ValueInt[0] = r; }
|
||||||
|
void setValue1 (sint32 r) { _ValueInt[1] = r; }
|
||||||
|
void setValue2 (sint32 r) { _ValueInt[2] = r; }
|
||||||
|
void setRange0 (sint32 r) { _RangeInt[0] = r; }
|
||||||
|
void setRange1 (sint32 r) { _RangeInt[1] = r; }
|
||||||
|
void setRange2 (sint32 r) { _RangeInt[2] = r; }
|
||||||
|
sint32 getValue0 () const { return _ValueInt[0]; }
|
||||||
|
sint32 getValue1 () const { return _ValueInt[1]; }
|
||||||
|
sint32 getValue2 () const { return _ValueInt[2]; }
|
||||||
|
sint32 getRange0 () const { return _RangeInt[0]; }
|
||||||
|
sint32 getRange1 () const { return _RangeInt[1]; }
|
||||||
|
sint32 getRange2 () const { return _RangeInt[2]; }
|
||||||
|
|
||||||
|
// Reflect ValueInt (ie not used if the link is setuped)
|
||||||
|
REFLECT_EXPORT_START(CDBViewBar3, CViewBitmap)
|
||||||
|
REFLECT_SINT32 ("value1", getValue0, setValue0);
|
||||||
|
REFLECT_SINT32 ("value2", getValue1, setValue1);
|
||||||
|
REFLECT_SINT32 ("value3", getValue2, setValue2);
|
||||||
|
REFLECT_SINT32 ("range1", getRange0, setRange0);
|
||||||
|
REFLECT_SINT32 ("range2", getRange1, setRange1);
|
||||||
|
REFLECT_SINT32 ("range3", getRange2, setRange2);
|
||||||
|
REFLECT_EXPORT_END
|
||||||
|
|
||||||
|
static void forceLink();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
CViewBitmap _Slot;
|
||||||
|
|
||||||
|
// Value of the progression in arbitrary units. should be integer
|
||||||
|
CInterfaceProperty _Value[3];
|
||||||
|
// Max range of the progression in arbitrary units. should be integer
|
||||||
|
CInterfaceProperty _Range[3];
|
||||||
|
|
||||||
|
/// Nbs: Values by Int are not used if the Links are setuped. NB: not overwritten by links
|
||||||
|
sint32 _ValueInt[3];
|
||||||
|
sint32 _RangeInt[3];
|
||||||
|
|
||||||
|
|
||||||
|
NLMISC::CRGBA _Colors[3];
|
||||||
|
NLMISC::CRGBA _ColorsNegative[3];
|
||||||
|
|
||||||
|
bool _Mini;
|
||||||
|
|
||||||
|
// Height of the bitmap
|
||||||
|
sint32 _BarH;
|
||||||
|
|
||||||
|
void parseValProp(xmlNodePtr cur, CInterfaceProperty &dbProp, sint32 &intProp, const char *name);
|
||||||
|
void setValProp( const std::string &value, CInterfaceProperty &dbProp, sint32 &intProp );
|
||||||
|
sint32 getCurrentValProp(const CInterfaceProperty &dbProp, sint32 intProp);
|
||||||
|
std::string getValProp( const CInterfaceProperty &prop, sint32 intProp ) const;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // RZ_DBVIEW_BAR3_H
|
||||||
|
|
||||||
|
/* End of dbview_bar3.h */
|
@ -0,0 +1,67 @@
|
|||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef NL_DBVIEW_DIGIT_H
|
||||||
|
#define NL_DBVIEW_DIGIT_H
|
||||||
|
|
||||||
|
#include "nel/misc/types_nl.h"
|
||||||
|
#include "nel/gui/view_base.h"
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
/**
|
||||||
|
* A number displayed with special bitmaps
|
||||||
|
* \author Lionel Berenguier
|
||||||
|
* \author Nevrax France
|
||||||
|
* \date 2002
|
||||||
|
*/
|
||||||
|
class CDBViewDigit : public CViewBase
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
/// Constructor
|
||||||
|
CDBViewDigit(const TCtorParam ¶m);
|
||||||
|
|
||||||
|
std::string getProperty( const std::string &name ) const;
|
||||||
|
void setProperty( const std::string &name, const std::string &value );
|
||||||
|
xmlNodePtr serialize( xmlNodePtr parentNode, const char *type ) const;
|
||||||
|
|
||||||
|
virtual bool parse (xmlNodePtr cur, CInterfaceGroup * parentGroup);
|
||||||
|
virtual void draw ();
|
||||||
|
virtual void updateCoords();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
CInterfaceProperty _Number;
|
||||||
|
sint32 _Cache;
|
||||||
|
sint32 _NumDigit;
|
||||||
|
NLMISC::CRGBA _Color;
|
||||||
|
// space between each digit
|
||||||
|
sint32 _WSpace;
|
||||||
|
// The texture digit for the current number
|
||||||
|
sint32 _DigitId[10];
|
||||||
|
uint _DivBase;
|
||||||
|
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // NL_DBVIEW_DIGIT_H
|
||||||
|
|
||||||
|
/* End of dbview_digit.h */
|
@ -0,0 +1,77 @@
|
|||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef NL_DBVIEW_NUMBER_H
|
||||||
|
#define NL_DBVIEW_NUMBER_H
|
||||||
|
|
||||||
|
#include "nel/misc/types_nl.h"
|
||||||
|
#include "nel/gui/view_text.h"
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
/**
|
||||||
|
* Display a text from a database number
|
||||||
|
* \author Lionel Berenguier
|
||||||
|
* \author Nevrax France
|
||||||
|
* \date 2002
|
||||||
|
*/
|
||||||
|
class CDBViewNumber : public CViewText
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
/// Constructor
|
||||||
|
CDBViewNumber(const TCtorParam ¶m);
|
||||||
|
|
||||||
|
std::string getProperty( const std::string &name ) const;
|
||||||
|
void setProperty( const std::string &name, const std::string &value );
|
||||||
|
xmlNodePtr serialize( xmlNodePtr parentNode, const char *type ) const;
|
||||||
|
virtual bool parse (xmlNodePtr cur, CInterfaceGroup * parentGroup);
|
||||||
|
virtual void checkCoords();
|
||||||
|
virtual void draw ();
|
||||||
|
|
||||||
|
void link (const std::string &dbprop)
|
||||||
|
{
|
||||||
|
_Number.link (dbprop.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
static void forceLink();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
sint64 getVal() { if (_Modulo == 0) return (_Number.getSInt64() / _Divisor);
|
||||||
|
else return (_Number.getSInt64() / _Divisor)%_Modulo; }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
CInterfaceProperty _Number;
|
||||||
|
sint64 _Cache;
|
||||||
|
bool _Positive; // only positive values are displayed
|
||||||
|
bool _Format; // the number will be formatted (like "1,000,000") if >= 10k
|
||||||
|
sint64 _Divisor, _Modulo;
|
||||||
|
// string to append to the value (eg: meters)
|
||||||
|
CStringShared _Suffix;
|
||||||
|
CStringShared _Prefix;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // NL_DBVIEW_NUMBER_H
|
||||||
|
|
||||||
|
/* End of dbview_number.h */
|
@ -0,0 +1,65 @@
|
|||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef NL_DBVIEW_QUANTITY_H
|
||||||
|
#define NL_DBVIEW_QUANTITY_H
|
||||||
|
|
||||||
|
#include "nel/misc/types_nl.h"
|
||||||
|
#include "nel/gui/view_text.h"
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
/**
|
||||||
|
* Display a text in the form of val / max or "empty"
|
||||||
|
* \author Lionel Berenguier
|
||||||
|
* \author Nevrax France
|
||||||
|
* \date 2002
|
||||||
|
*/
|
||||||
|
class CDBViewQuantity : public CViewText
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
/// Constructor
|
||||||
|
CDBViewQuantity(const TCtorParam ¶m);
|
||||||
|
|
||||||
|
std::string getProperty( const std::string &name ) const;
|
||||||
|
void setProperty( const std::string &name, const std::string &value );
|
||||||
|
xmlNodePtr serialize( xmlNodePtr parentNode, const char *type ) const;
|
||||||
|
virtual bool parse (xmlNodePtr cur, CInterfaceGroup * parentGroup);
|
||||||
|
virtual void draw ();
|
||||||
|
|
||||||
|
static void forceLink();
|
||||||
|
|
||||||
|
|
||||||
|
protected:
|
||||||
|
CInterfaceProperty _Number;
|
||||||
|
CInterfaceProperty _NumberMax;
|
||||||
|
sint32 _Cache;
|
||||||
|
sint32 _CacheMax;
|
||||||
|
ucstring _EmptyText;
|
||||||
|
|
||||||
|
void buildTextFromCache();
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // NL_DBVIEW_QUANTITY_H
|
||||||
|
|
||||||
|
/* End of dbview_quantity.h */
|
@ -0,0 +1,661 @@
|
|||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef RZ_GROUP_CONTAINER_H
|
||||||
|
#define RZ_GROUP_CONTAINER_H
|
||||||
|
|
||||||
|
#include "nel/gui/interface_group.h"
|
||||||
|
#include "nel/gui/group_container_base.h"
|
||||||
|
#include "nel/misc/smart_ptr.h"
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
class CEventDescriptorLocalised;
|
||||||
|
class CCtrlButton;
|
||||||
|
class CCtrlScroll;
|
||||||
|
class CViewText;
|
||||||
|
class CViewBitmap;
|
||||||
|
class CGroupList;
|
||||||
|
class COptionsContainerInsertion;
|
||||||
|
class COptionsContainerMove;
|
||||||
|
class COptionsLayer;
|
||||||
|
class CGroupContainer;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
/**
|
||||||
|
* class describing a resizer for the container
|
||||||
|
* \author Matthieu 'TrapII' Besson
|
||||||
|
* \date 2003
|
||||||
|
*/
|
||||||
|
class CCtrlResizer : public CCtrlBase
|
||||||
|
{
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
CCtrlResizer(const TCtorParam ¶m);
|
||||||
|
virtual void draw ();
|
||||||
|
virtual bool handleEvent (const NLGUI::CEventDescriptor &event);
|
||||||
|
// Add a big delta so when the user is over the Resizer, always take it whatever other controls under
|
||||||
|
virtual uint getDeltaDepth() const { return 100; }
|
||||||
|
|
||||||
|
// get real resizer pos : if parent has pop_min_w == pop_max_w, then horizontal resizer will be discarded
|
||||||
|
// if parent has pop_min_h == pop_max_h, then vertical resizer will be discarded
|
||||||
|
THotSpot getRealResizerPos() const;
|
||||||
|
THotSpot getResizerPos() const { return _ResizerPos; }
|
||||||
|
void setResizerPos(THotSpot resizerPos) { _ResizerPos = resizerPos; }
|
||||||
|
|
||||||
|
bool IsMaxH; // Do this resizer is a MaxH resizer ?
|
||||||
|
|
||||||
|
// Max sizes for the parent
|
||||||
|
sint32 WMin, WMax;
|
||||||
|
sint32 HMin, HMax;
|
||||||
|
|
||||||
|
// from CCtrlBase
|
||||||
|
virtual bool canChangeVirtualDesktop() const { return !_MouseDown; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
sint32 resizeW (sint32 dx);
|
||||||
|
sint32 resizeH (sint32 dy);
|
||||||
|
|
||||||
|
private:
|
||||||
|
THotSpot _ResizerPos; // how the resizer should resize its parent
|
||||||
|
bool _MouseDown;
|
||||||
|
sint32 _MouseDownX;
|
||||||
|
sint32 _MouseDownY;
|
||||||
|
sint32 _XBias;
|
||||||
|
sint32 _YBias;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
/**
|
||||||
|
* Class describing a Mover for the container
|
||||||
|
* Clicking on it can also open the container
|
||||||
|
* This can be used to move a container if it is movable.
|
||||||
|
* If the container is popable, it will first pull it of the hierarchy, then it becomes movable.
|
||||||
|
* It can also be used to change the position of a group container that is inserted in the list of another container.
|
||||||
|
* \author Lionel Berenguier
|
||||||
|
* \date 2003
|
||||||
|
*/
|
||||||
|
class CCtrlMover : public CCtrlBase
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
CCtrlMover(const TCtorParam ¶m, bool canMove, bool canOpen);
|
||||||
|
~CCtrlMover();
|
||||||
|
virtual void draw ();
|
||||||
|
virtual bool handleEvent (const NLGUI::CEventDescriptor &event);
|
||||||
|
bool canMove() { return _CanMove; }
|
||||||
|
|
||||||
|
bool isMoving() const {return _Moving;}
|
||||||
|
bool isMovingInParentList() const { return _MovingInParentList; }
|
||||||
|
|
||||||
|
// from CCtrlBase
|
||||||
|
virtual bool canChangeVirtualDesktop() const { return !_Moving; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
sint32 _MoveStartX, _MoveStartY;
|
||||||
|
sint32 _MoveDeltaXReal, _MoveDeltaYReal;
|
||||||
|
sint64 _ScrollTime;
|
||||||
|
sint32 _StartIndex;
|
||||||
|
sint32 _InsertionIndex;
|
||||||
|
// clip window from parent list
|
||||||
|
sint32 _ParentListTop;
|
||||||
|
sint32 _ParentListBottom;
|
||||||
|
//
|
||||||
|
sint64 _WaitToOpenCloseDate;
|
||||||
|
//
|
||||||
|
bool _CanMove : 1;
|
||||||
|
bool _CanOpen : 1;
|
||||||
|
bool _Moving : 1;
|
||||||
|
bool _MovingInParentList : 1;
|
||||||
|
bool _HasMoved : 1;
|
||||||
|
bool _ParentScrollingUp : 1;
|
||||||
|
bool _ParentScrollingDown : 1;
|
||||||
|
bool _StopScrolling : 1; // stop scrolling at next draw
|
||||||
|
bool _WaitToOpenClose : 1;
|
||||||
|
//
|
||||||
|
static COptionsContainerInsertion *getInsertionOptions();
|
||||||
|
private:
|
||||||
|
void setPoped(CGroupContainer *gc, sint32 x, sint32 y, const NLGUI::CEventDescriptorMouse &eventDesc);
|
||||||
|
void setMovingInParent(CGroupContainer *gc, sint32 x, sint32 y, const NLGUI::CEventDescriptorMouse &eventDesc);
|
||||||
|
void updateInsertionIndex(const CGroupList *gl, sint32 posY);
|
||||||
|
void stopMove();
|
||||||
|
bool runTitleActionHandler();
|
||||||
|
void handleScrolling();
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
/**
|
||||||
|
* class describing a group of views controls and other groups
|
||||||
|
* \author Matthieu 'TrapII' Besson
|
||||||
|
* \author Nevrax France
|
||||||
|
* \date 2002
|
||||||
|
*/
|
||||||
|
class CGroupContainer : public CGroupContainerBase
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
enum { NumResizers = 8 };
|
||||||
|
public:
|
||||||
|
// observer to know when children have moved. This can be used to keep external datas in sync
|
||||||
|
struct IChildrenObs
|
||||||
|
{
|
||||||
|
virtual void childrenMoved(uint srcIndex, uint destIndex, CGroupContainer *children) = 0;
|
||||||
|
};
|
||||||
|
public:
|
||||||
|
CGroupContainer(const TCtorParam ¶m);
|
||||||
|
~CGroupContainer();
|
||||||
|
|
||||||
|
std::string getProperty( const std::string &name ) const;
|
||||||
|
void setProperty( const std::string &name, const std::string &value );
|
||||||
|
xmlNodePtr serialize( xmlNodePtr parentNode, const char *type ) const;
|
||||||
|
xmlNodePtr serializeTreeData( xmlNodePtr parentNode ) const;
|
||||||
|
|
||||||
|
virtual bool parse (xmlNodePtr cur, CInterfaceGroup *parentGroup);
|
||||||
|
|
||||||
|
virtual void updateCoords ();
|
||||||
|
|
||||||
|
virtual void draw ();
|
||||||
|
|
||||||
|
virtual void clearViews ();
|
||||||
|
|
||||||
|
virtual bool handleEvent (const NLGUI::CEventDescriptor &eventDesc);
|
||||||
|
|
||||||
|
virtual void launch ();
|
||||||
|
|
||||||
|
virtual void setActive (bool state);
|
||||||
|
|
||||||
|
virtual bool getViewsUnder (sint32 x, sint32 y, sint32 clipX, sint32 clipY, sint32 clipW, sint32 clipH, std::vector<CViewBase*> &vVB); // Return true if x,y under the group
|
||||||
|
|
||||||
|
virtual bool getCtrlsUnder (sint32 x, sint32 y, sint32 clipX, sint32 clipY, sint32 clipW, sint32 clipH, std::vector<CCtrlBase*> &vICL);
|
||||||
|
|
||||||
|
void open();
|
||||||
|
|
||||||
|
void close();
|
||||||
|
|
||||||
|
void setup(); // Create the container
|
||||||
|
|
||||||
|
/** If insertion order is -1, pIC is added at the end of the container
|
||||||
|
* otherwise it is inserted after containers of a lower order
|
||||||
|
*/
|
||||||
|
void attachContainer (CGroupContainer *pIC, sint insertionOrder = -1);
|
||||||
|
// Insert a container at the given index.
|
||||||
|
bool attachContainerAtIndex(CGroupContainer *pIC, uint index);
|
||||||
|
|
||||||
|
// Before a container is detached from parent, it should be pop in
|
||||||
|
void detachContainer (CGroupContainer *pIC);
|
||||||
|
void removeAllContainers();
|
||||||
|
|
||||||
|
void setOpen(bool opened)
|
||||||
|
{
|
||||||
|
if (opened)
|
||||||
|
{
|
||||||
|
open();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
bool isOpen() const { return _Opened; }
|
||||||
|
|
||||||
|
// Force Open for container setActive and open()
|
||||||
|
virtual void forceOpen();
|
||||||
|
|
||||||
|
/// Set the title open and close
|
||||||
|
virtual bool isMovable() const {return _Movable;}
|
||||||
|
void setMovable(bool b);
|
||||||
|
|
||||||
|
void setContent (CInterfaceGroup *pC);
|
||||||
|
|
||||||
|
std::string getTitle () const;
|
||||||
|
void setTitle (const std::string &title);
|
||||||
|
std::string getTitleOpened () const;
|
||||||
|
void setTitleOpened (const std::string &title);
|
||||||
|
std::string getTitleClosed () const;
|
||||||
|
void setTitleClosed (const std::string &title);
|
||||||
|
std::string getTitleColorAsString() const;
|
||||||
|
void setTitleColorAsString(const std::string &col);
|
||||||
|
|
||||||
|
void setHeaderColor (const std::string &ptr) { _HeaderColor.link(ptr.c_str()); }
|
||||||
|
|
||||||
|
// Get the header color draw. NB: depends if grayed, and if active.
|
||||||
|
NLMISC::CRGBA getDrawnHeaderColor () const;
|
||||||
|
|
||||||
|
ucstring getUCTitleOpened () const;
|
||||||
|
void setUCTitleOpened (const ucstring &title);
|
||||||
|
ucstring getUCTitleClosed () const;
|
||||||
|
void setUCTitleClosed (const ucstring &title);
|
||||||
|
ucstring getUCTitle () const;
|
||||||
|
void setUCTitle (const ucstring &title);
|
||||||
|
|
||||||
|
void setPopable(bool popable) { _Popable = popable; }
|
||||||
|
bool isPopable() const { return _Popable; }
|
||||||
|
bool isPopuped() const { return _Poped; }
|
||||||
|
|
||||||
|
|
||||||
|
void setMovableInParentList(bool /* movable */) { _MovableInParentList = true; }
|
||||||
|
bool isMovableInParentList() const { return _MovableInParentList; }
|
||||||
|
|
||||||
|
// high light the border of the container
|
||||||
|
void setHighLighted(bool hightlighted, uint8 alpha=255) { _HighLighted = hightlighted; _HighLightedAlpha = alpha; }
|
||||||
|
bool isHighLighted() const { return _HighLighted; }
|
||||||
|
|
||||||
|
// y offset for content of container
|
||||||
|
sint32 getContentYOffset() const { return (sint32) _ContentYOffset; }
|
||||||
|
void setContentYOffset(sint32 value);
|
||||||
|
|
||||||
|
// Window requires attention
|
||||||
|
void requireAttention();
|
||||||
|
|
||||||
|
// Lua exports
|
||||||
|
int luaBlink(CLuaState &ls);
|
||||||
|
int luaSetHeaderColor(CLuaState &ls);
|
||||||
|
|
||||||
|
REFLECT_EXPORT_START(CGroupContainer, CGroupContainerBase)
|
||||||
|
REFLECT_LUA_METHOD("blink", luaBlink);
|
||||||
|
REFLECT_LUA_METHOD("setHeaderColor", luaSetHeaderColor);
|
||||||
|
REFLECT_STRING("title", getTitle, setTitle);
|
||||||
|
REFLECT_STRING("title_opened", getTitleOpened, setTitleOpened);
|
||||||
|
REFLECT_STRING("title_closed", getTitleClosed, setTitleClosed);
|
||||||
|
REFLECT_UCSTRING("uc_title_opened", getUCTitleOpened, setUCTitleOpened);
|
||||||
|
REFLECT_UCSTRING("uc_title_closed", getUCTitleClosed, setUCTitleClosed);
|
||||||
|
REFLECT_UCSTRING("uc_title", getUCTitle, setUCTitle);
|
||||||
|
REFLECT_STRING("title_color", getTitleColorAsString, setTitleColorAsString);
|
||||||
|
REFLECT_SINT32("pop_min_h", getPopupMinH, setPopupMinH);
|
||||||
|
REFLECT_SINT32("pop_max_h", getPopupMaxH, setPopupMaxH);
|
||||||
|
REFLECT_SINT32("pop_min_w", getPopupMinW, setPopupMinW);
|
||||||
|
REFLECT_SINT32("pop_max_w", getPopupMaxW, setPopupMaxW);
|
||||||
|
REFLECT_SINT32("title_delta_max_w", getTitleDeltaMaxW, setTitleDeltaMaxW);
|
||||||
|
REFLECT_SINT32("content_y_offset", getContentYOffset, setContentYOffset);
|
||||||
|
REFLECT_BOOL("openable", isOpenable, setOpenable);
|
||||||
|
REFLECT_BOOL("opened", isOpen, setOpen);
|
||||||
|
REFLECT_BOOL("lockable", isLockable, setLockable);
|
||||||
|
REFLECT_BOOL("locked", isLocked, setLocked);
|
||||||
|
|
||||||
|
REFLECT_BOOL("header_active", getHeaderActive, setHeaderActive);
|
||||||
|
REFLECT_BOOL("right_button_enabled", getRightButtonEnabled, setRightButtonEnabled);
|
||||||
|
REFLECT_EXPORT_END
|
||||||
|
|
||||||
|
sint32 getLayerSetup() const { return _LayerSetup; }
|
||||||
|
|
||||||
|
// if this window is popable, pop it at its actual position
|
||||||
|
void popupCurrentPos();
|
||||||
|
// Popup at previous memorized position
|
||||||
|
void popup();
|
||||||
|
/** Popin the window and possibly put it back in its father container, using the order defined in the list of the container.
|
||||||
|
* \param putBackInFather When true, put the window back in its former father container, otherwise, the container is unliked from the hierachy (parents are NULL)
|
||||||
|
* \param insertPos If this is equal to -1, then the window is inserted at its previous position. Otherwise it is inserted before the given position in the list
|
||||||
|
*/
|
||||||
|
void popin(sint32 insertPos = -1, bool putBackInFatherContainer = true);
|
||||||
|
|
||||||
|
// get the mover control associated with that control, or NULL if none
|
||||||
|
CCtrlMover *getCtrlMover() const { return _Mover; }
|
||||||
|
|
||||||
|
// true if there is a mover and if the window is being moved
|
||||||
|
bool isMoving() const { return _Mover && _Mover->isMoving(); }
|
||||||
|
|
||||||
|
/** Force the container to blink (to tell the user that an event has happened).
|
||||||
|
* This uses the global color, so the container must use it
|
||||||
|
* This state is automatically disabled if the container is opened
|
||||||
|
* \param numBlinks 0 If the container should blink endlessly, the number of blink otherwise
|
||||||
|
*/
|
||||||
|
virtual void enableBlink(uint numBlinks = 0);
|
||||||
|
virtual void disableBlink();
|
||||||
|
virtual bool isBlinking() const { return _Blinking; }
|
||||||
|
|
||||||
|
CGroupList *getList() const { return _List; }
|
||||||
|
|
||||||
|
CInterfaceGroup *getHeaderOpened() const { return _HeaderOpened; }
|
||||||
|
CInterfaceGroup *getHeaderClosed() const { return _HeaderClosed; }
|
||||||
|
CInterfaceGroup *getContent() const { return _Content; }
|
||||||
|
|
||||||
|
void setChildrenObs(IChildrenObs *obs) { _ChildrenObs = obs; }
|
||||||
|
IChildrenObs *getChildrenObs() const { return _ChildrenObs; }
|
||||||
|
|
||||||
|
// Get current father container (if any).
|
||||||
|
CGroupContainer *getFatherContainer() const;
|
||||||
|
// Get current father container (if any). If the container is popup, it gives the proprietary container
|
||||||
|
CGroupContainer *getProprietaryContainer() const;
|
||||||
|
|
||||||
|
|
||||||
|
bool isOpenable() const { return _Openable; }
|
||||||
|
void setOpenable(bool openable);
|
||||||
|
|
||||||
|
bool getHeaderActive() const { return _HeaderActive; }
|
||||||
|
void setHeaderActive(bool active) { _HeaderActive = active; }
|
||||||
|
|
||||||
|
bool getRightButtonEnabled() const { return _EnabledRightButton; }
|
||||||
|
void setRightButtonEnabled(bool enabled);
|
||||||
|
|
||||||
|
CCtrlScroll *getScroll() const { return _ScrollBar; }
|
||||||
|
|
||||||
|
bool isSavable() const { return _Savable; }
|
||||||
|
void setSavable(bool savable) { _Savable = savable; }
|
||||||
|
bool isActiveSavable() const { return _ActiveSavable; }
|
||||||
|
|
||||||
|
bool isLocalize() const { return _Localize; }
|
||||||
|
void setLocalize(bool localize) { _Localize = localize; }
|
||||||
|
|
||||||
|
void setPopupX(sint32 x) { _PopupX = x; }
|
||||||
|
void setPopupY(sint32 y) { _PopupY = y; }
|
||||||
|
void setPopupW(sint32 w) { _PopupW = w; }
|
||||||
|
void setPopupH(sint32 h) { _PopupH = h; }
|
||||||
|
|
||||||
|
sint32 getPopupX() const { return _PopupX; }
|
||||||
|
sint32 getPopupY() const { return _PopupY; }
|
||||||
|
sint32 getPopupW() const { return _PopupW; }
|
||||||
|
sint32 getPopupH() const { return _PopupH; }
|
||||||
|
|
||||||
|
sint32 getRefW() const { return _RefW; }
|
||||||
|
|
||||||
|
/** Increase the rollover alpha for the current frame.
|
||||||
|
* Example of use : an edit box that has focus in a group container
|
||||||
|
*/
|
||||||
|
void rollOverAlphaUp();
|
||||||
|
// force the rollover alpha to its max value, depending on there's keyboard focus or not
|
||||||
|
void forceRolloverAlpha();
|
||||||
|
|
||||||
|
bool isOpenWhenPopup() const { return _OpenWhenPopup; }
|
||||||
|
|
||||||
|
/// Locking of window (prevent it from being moved)
|
||||||
|
void setLockable(bool lockable);
|
||||||
|
bool isLockable() const { return _Lockable; }
|
||||||
|
void setLocked(bool locked);
|
||||||
|
|
||||||
|
// to be called by the 'deactive check' handler
|
||||||
|
static void validateCanDeactivate(bool validate) { _ValidateCanDeactivate = validate; }
|
||||||
|
const std::string &getAHOnDeactiveCheck() const { return CAHManager::getInstance()->getAHName(_AHOnDeactiveCheck); }
|
||||||
|
const std::string &getAHOnDeactiveCheckParams() const { return _AHOnDeactiveCheckParams; }
|
||||||
|
//
|
||||||
|
const std::string &getAHOnCloseButton() const { return CAHManager::getInstance()->getAHName(_AHOnCloseButton); }
|
||||||
|
const std::string &getAHOnCloseButtonParams() const { return _AHOnCloseButtonParams; }
|
||||||
|
//
|
||||||
|
IActionHandler *getAHOnMovePtr() const { return _AHOnMove; }
|
||||||
|
const std::string &getAHOnMove() const { return CAHManager::getInstance()->getAHName(_AHOnMove); }
|
||||||
|
const std::string &getAHOnMoveParams() const { return _AHOnMoveParams; }
|
||||||
|
//
|
||||||
|
IActionHandler *getAHOnResizePtr() const { return _AHOnResize; }
|
||||||
|
const std::string &getAHOnResize() const { return CAHManager::getInstance()->getAHName(_AHOnResize); }
|
||||||
|
const std::string &getAHOnResizeParams() const { return _AHOnResizeParams; }
|
||||||
|
//
|
||||||
|
IActionHandler *getAHOnBeginMovePtr() const { return _AHOnBeginMove; }
|
||||||
|
const std::string &getAHOnBeginMove() const { return CAHManager::getInstance()->getAHName(_AHOnBeginMove); }
|
||||||
|
const std::string &getAHOnBeginMoveParams() const { return _AHOnBeginMoveParams; }
|
||||||
|
|
||||||
|
//
|
||||||
|
void setOnCloseButtonHandler(const std::string &h) { _AHOnCloseButton = CAHManager::getInstance()->getAH(h,_AHOnCloseButtonParams); }
|
||||||
|
void setOnCloseButtonParams(const std::string &p) { _AHOnCloseButtonParams = p; }
|
||||||
|
|
||||||
|
void setModalParentList (const std::string &name);
|
||||||
|
bool checkIfModal(const NLGUI::CEventDescriptor& event); // Return true if we can handle the event (and prevent from selecting a window)
|
||||||
|
bool isGrayed() const;
|
||||||
|
bool blinkAllSons();
|
||||||
|
|
||||||
|
// true if the resizer is enabled.
|
||||||
|
bool getEnabledResizer() const {return _EnabledResizer;}
|
||||||
|
|
||||||
|
sint32 getPopupMinW() const {return _PopupMinW;}
|
||||||
|
sint32 getPopupMaxW() const {return _PopupMaxW;}
|
||||||
|
sint32 getPopupMinH() const {return _PopupMinH;}
|
||||||
|
sint32 getPopupMaxH() const {return _PopupMaxH;}
|
||||||
|
sint32 getMinW() const {return _MinW;}
|
||||||
|
void setMinW(sint32 minW) { _MinW = minW;}
|
||||||
|
void setMaxW(sint32 maxW) { _MaxW = maxW;}
|
||||||
|
sint32 getMaxW() const {return _MaxW;}
|
||||||
|
void setPopupMinW(sint32 minW);
|
||||||
|
void setPopupMaxW(sint32 maxW);
|
||||||
|
void setPopupMinH(sint32 minW);
|
||||||
|
void setPopupMaxH(sint32 maxW);
|
||||||
|
|
||||||
|
|
||||||
|
// backup the current position of this container
|
||||||
|
void backupPosition();
|
||||||
|
// restore the current position of this container
|
||||||
|
void restorePosition();
|
||||||
|
// get x for backup position
|
||||||
|
sint32 getBackupX() const { return _BackupX; }
|
||||||
|
sint32 getBackupY() const { return _BackupY; }
|
||||||
|
// Set backup position
|
||||||
|
void setBackupPosition(sint32 x, sint32 y);
|
||||||
|
// clear backup
|
||||||
|
void clearBackup() { _PositionBackuped = false; }
|
||||||
|
// Test if position has been backuped (flag cleared by 'restorePosition()')
|
||||||
|
bool isPositionBackuped() const { return _PositionBackuped; }
|
||||||
|
// check if the container has been moved, resized, or popuped by the user (and eventually clear that flag)
|
||||||
|
bool getTouchFlag(bool clearFlag) const;
|
||||||
|
// from CInterfaceGroup
|
||||||
|
virtual void restoreAllContainersBackupPosition() { restorePosition(); }
|
||||||
|
|
||||||
|
// when isModal() is true, the whole interface cannot switch desktop
|
||||||
|
bool isModal() const { return _Modal; }
|
||||||
|
void setModal(bool modal) { _Modal = modal; }
|
||||||
|
|
||||||
|
// return true if the container has a modal parent window setuped => the whole interface cannot switch desktop
|
||||||
|
bool isModalSon() const { return !_ModalParents.empty(); }
|
||||||
|
|
||||||
|
// return the help web page of this container. "" if none
|
||||||
|
const std::string &getHelpPage() const { return _HelpPage; }
|
||||||
|
// set the help web page of this container. "" if none. NB: the help button is not updated
|
||||||
|
void setHelpPage(const std::string &newPage);
|
||||||
|
|
||||||
|
void setTitleDeltaMaxW(sint32 delta) { _TitleDeltaMaxW = delta; }
|
||||||
|
sint32 getTitleDeltaMaxW() const { return _TitleDeltaMaxW; }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
uint8 _ICurrentRolloverAlphaContainer;
|
||||||
|
uint8 _HighLightedAlpha;
|
||||||
|
float _CurrentRolloverAlphaContainer;
|
||||||
|
float _CurrentRolloverAlphaContent;
|
||||||
|
sint32 _LayerSetup;
|
||||||
|
ucstring _TitleTextOpened;
|
||||||
|
ucstring _TitleTextClosed;
|
||||||
|
CViewText *_TitleOpened;
|
||||||
|
CViewText *_TitleClosed;
|
||||||
|
sint32 _TitleDeltaMaxW;
|
||||||
|
CViewBitmap *_ViewOpenState; // Arrow showing if we are opened or not (if we are openable)
|
||||||
|
CCtrlButton *_RightButton; // Multi usage button : deactive or popup or popin
|
||||||
|
CCtrlButton *_HelpButton; // Help button
|
||||||
|
|
||||||
|
CGroupList *_List;
|
||||||
|
CCtrlScroll *_ScrollBar;
|
||||||
|
CGroupContainer *_OldFatherContainer;
|
||||||
|
|
||||||
|
// NB: _ModalParentNames is a list of modal parent, separated by '|'
|
||||||
|
std::string _ModalParentNames; // Modal handling between container (container can be linked together,
|
||||||
|
std::vector<CGroupContainer*> _ModalSons; // when the son is active the parent is not active
|
||||||
|
std::vector<CGroupContainer*> _ModalParents; // (but the rest of the interface is))
|
||||||
|
|
||||||
|
uint _InsertionOrder;
|
||||||
|
uint _BlinkDT;
|
||||||
|
uint _NumBlinks;
|
||||||
|
|
||||||
|
CInterfaceGroup *_Content; // Read From Script
|
||||||
|
CInterfaceGroup *_HeaderOpened; // Read From Script
|
||||||
|
CInterfaceGroup *_HeaderClosed; // Read From Script
|
||||||
|
|
||||||
|
CCtrlResizer *_Resizer[NumResizers]; // up to 8 resizers are available
|
||||||
|
|
||||||
|
//
|
||||||
|
CCtrlMover *_Mover;
|
||||||
|
|
||||||
|
IChildrenObs *_Obs;
|
||||||
|
|
||||||
|
// If layer==0 constraint on resize
|
||||||
|
sint32 _PopupMinW;
|
||||||
|
sint32 _PopupMaxW;
|
||||||
|
sint32 _PopupMinH;
|
||||||
|
sint32 _PopupMaxH;
|
||||||
|
// If layer>0 constraint on resize
|
||||||
|
sint32 _MinW;
|
||||||
|
sint32 _MaxW;
|
||||||
|
|
||||||
|
// backuped position
|
||||||
|
sint32 _BackupX;
|
||||||
|
sint32 _BackupY;
|
||||||
|
|
||||||
|
// old position at which the window was popup, -1 values means that the window hasn't been turned into a popup yet
|
||||||
|
sint32 _PopupX;
|
||||||
|
sint32 _PopupY;
|
||||||
|
sint32 _PopupW;
|
||||||
|
sint32 _PopupH;
|
||||||
|
//
|
||||||
|
sint32 _RefW;
|
||||||
|
|
||||||
|
|
||||||
|
sint32 _MoverDeltaW;
|
||||||
|
|
||||||
|
// action handler
|
||||||
|
IActionHandler *_AHOnOpen;
|
||||||
|
CStringShared _AHOnOpenParams;
|
||||||
|
IActionHandler *_AHOnClose;
|
||||||
|
CStringShared _AHOnCloseParams;
|
||||||
|
IActionHandler *_AHOnCloseButton;
|
||||||
|
CStringShared _AHOnCloseButtonParams;
|
||||||
|
IActionHandler *_AHOnMove;
|
||||||
|
CStringShared _AHOnMoveParams;
|
||||||
|
IActionHandler *_AHOnResize;
|
||||||
|
CStringShared _AHOnResizeParams;
|
||||||
|
IActionHandler *_AHOnBeginMove;
|
||||||
|
CStringShared _AHOnBeginMoveParams;
|
||||||
|
|
||||||
|
// action handler to test whether the windows can be deactivated (when the close button is pressed)
|
||||||
|
IActionHandler *_AHOnDeactiveCheck;
|
||||||
|
CStringShared _AHOnDeactiveCheckParams;
|
||||||
|
|
||||||
|
|
||||||
|
// Observer to know when children have moved
|
||||||
|
IChildrenObs *_ChildrenObs;
|
||||||
|
|
||||||
|
// list of container that are poped up
|
||||||
|
std::vector<CGroupContainer *> _PopedCont;
|
||||||
|
|
||||||
|
// Open management
|
||||||
|
bool _Openable : 1; // Is the container can be manually opened or closed ?
|
||||||
|
bool _Opened : 1; // Is the container currently opened or closed ?
|
||||||
|
bool _OpenWhenPopup : 1; // Does the container must open when poped up ? (layer>0)
|
||||||
|
// and close when poped in...
|
||||||
|
bool _OpenAtStart : 1; // Mgt : to setup _Opened state at start
|
||||||
|
bool _OpenedBeforePopup : 1; // Mgt : Is the container opened before poped up ? (layer>0)
|
||||||
|
|
||||||
|
// Move management
|
||||||
|
bool _Movable : 1; // Is the container movable ?
|
||||||
|
bool _MovableInParentList: 1;
|
||||||
|
bool _Lockable : 1;
|
||||||
|
bool _MovingInParentList : 1; // Mgt : currently moving ?
|
||||||
|
|
||||||
|
// Pop up / pop in
|
||||||
|
bool _Popable : 1;
|
||||||
|
bool _Poped : 1;
|
||||||
|
|
||||||
|
bool _EnabledResizer : 1;
|
||||||
|
|
||||||
|
bool _HighLighted : 1;
|
||||||
|
bool _Blinking : 1;
|
||||||
|
bool _BlinkState : 1;
|
||||||
|
|
||||||
|
bool _Savable : 1;
|
||||||
|
bool _ActiveSavable : 1;
|
||||||
|
|
||||||
|
// Display title background or not
|
||||||
|
bool _HeaderActive : 1;
|
||||||
|
bool _EnabledRightButton : 1; // Is the Button Deactive/Popup/Popin is enabled ?
|
||||||
|
//
|
||||||
|
enum TTileClass {TitleText=0, TitleTextFormated, TitleTextId, TitleTextDynString};
|
||||||
|
uint8 _TitleClass : 2;
|
||||||
|
//
|
||||||
|
mutable bool _TouchFlag : 1;
|
||||||
|
bool _PositionBackuped : 1;
|
||||||
|
bool _Modal : 1; // the container is modal and prevent from switching virtual desktop
|
||||||
|
//
|
||||||
|
bool _EnabledHelpButton : 1; // Is the Button Help is enabled ?
|
||||||
|
//
|
||||||
|
bool _TitleOverExtendViewText : 1; // Does the title over extend view text
|
||||||
|
bool _Localize : 1;
|
||||||
|
|
||||||
|
CInterfaceProperty _HeaderColor;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
sint8 _ContentYOffset;
|
||||||
|
|
||||||
|
// Special Top Resizer Height (for Inventory and ChatGroup). <0 (default) => take default option value
|
||||||
|
sint8 _ResizerTopSize;
|
||||||
|
uint8 _ICurrentRolloverAlphaContent;
|
||||||
|
|
||||||
|
|
||||||
|
static bool _ValidateCanDeactivate;
|
||||||
|
|
||||||
|
CStringShared _OptionsName;
|
||||||
|
|
||||||
|
// Web Page used for help
|
||||||
|
CStringShared _HelpPage;
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
sint32 getLayer();
|
||||||
|
void updateResizerSize(CCtrlResizer *cr);
|
||||||
|
void updateRightButton();
|
||||||
|
void updateHelpButton();
|
||||||
|
void updateMover();
|
||||||
|
void updateViewOpenState();
|
||||||
|
void updateTitle();
|
||||||
|
|
||||||
|
void createResizer(uint index, THotSpot posRef, THotSpot type, sint32 offsetX, sint32 offsetY, bool bMaxH);
|
||||||
|
void createResizerMaxH();
|
||||||
|
void removeResizerMaxH();
|
||||||
|
|
||||||
|
TTileClass convertTitleClass(const char *ptr);
|
||||||
|
|
||||||
|
static COptionsContainerMove *getMoveOptions();
|
||||||
|
|
||||||
|
COptionsLayer *getContainerOptions(sint32 ls=-1); // Depends if overload by OptionsName or default used
|
||||||
|
|
||||||
|
bool hasKeyboardFocus() const;
|
||||||
|
|
||||||
|
// private for modal system
|
||||||
|
void addModalParent (CGroupContainer *pParent);
|
||||||
|
void addModalSon (CGroupContainer *pSon);
|
||||||
|
|
||||||
|
// Avoid each frame setup layer0, layer1 etc...
|
||||||
|
enum {NumLayerName=10};
|
||||||
|
static const std::string _OptionLayerName[NumLayerName];
|
||||||
|
|
||||||
|
public:
|
||||||
|
// for use by CCtrlMover
|
||||||
|
// Tell that this group is moving in its parent list
|
||||||
|
void setMovingInParentList(bool enable);
|
||||||
|
CGroupList *getPreviousParentList() const { return _OldFatherContainer ? _OldFatherContainer->_List : NULL; }
|
||||||
|
CCtrlScroll *getPreviousParentScrollBar() const { return _OldFatherContainer ? _OldFatherContainer->_ScrollBar : NULL; }
|
||||||
|
CGroupContainer *getPreviousContainer() const { return _OldFatherContainer; }
|
||||||
|
// set the 'hasMoved' flag
|
||||||
|
void touch(bool touched = true) { _TouchFlag = touched; }
|
||||||
|
|
||||||
|
friend class CICDeactive;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // RZ_INTERFACE_CONTAINER_H
|
||||||
|
|
||||||
|
/* End of interface_container.h */
|
@ -0,0 +1,117 @@
|
|||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef GROUP_CONTAINER_BASE_H
|
||||||
|
#define GROUP_CONTAINER_BASE_H
|
||||||
|
|
||||||
|
#include "nel/gui/interface_group.h"
|
||||||
|
#include "nel/misc/rgba.h"
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
|
||||||
|
class CGroupContainerBase : public CInterfaceGroup
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
DECLARE_UI_CLASS( CGroupContainerBase )
|
||||||
|
|
||||||
|
CGroupContainerBase( const TCtorParam ¶m );
|
||||||
|
virtual ~CGroupContainerBase();
|
||||||
|
|
||||||
|
virtual void removeAllContainers();
|
||||||
|
virtual void setLocked( bool locked );
|
||||||
|
bool isLocked() const { return _Locked; }
|
||||||
|
|
||||||
|
uint8 getContainerAlpha() const { return _ContainerAlpha; }
|
||||||
|
uint8 getContentAlpha() const { return _ContentAlpha; }
|
||||||
|
uint8 getRolloverAlphaContent() const { return _RolloverAlphaContent; }
|
||||||
|
uint8 getRolloverAlphaContainer() const { return _RolloverAlphaContainer; }
|
||||||
|
|
||||||
|
void setContainerAlpha( uint8 alpha );
|
||||||
|
void setContentAlpha( uint8 alpha );
|
||||||
|
void setRolloverAlphaContent( uint8 alpha );
|
||||||
|
void setRolloverAlphaContainer( uint8 alpha );
|
||||||
|
|
||||||
|
// for export
|
||||||
|
sint32 getContainerAlphaAsSInt32() const{ return (sint32)_ContainerAlpha; }
|
||||||
|
sint32 getContentAlphaAsSInt32() const{ return (sint32)_ContentAlpha; }
|
||||||
|
sint32 getRolloverAlphaContentAsSInt32() const{ return (sint32)_RolloverAlphaContent; }
|
||||||
|
sint32 getRolloverAlphaContainerAsSInt32() const{ return (sint32)_RolloverAlphaContainer; }
|
||||||
|
|
||||||
|
// sin32 versions for export
|
||||||
|
void setContainerAlpha( sint32 alpha ){ setContainerAlpha((uint8) alpha); }
|
||||||
|
void setContentAlpha( sint32 alpha ){ setContentAlpha((uint8) alpha); }
|
||||||
|
void setRolloverAlphaContent( sint32 alpha ){ setRolloverAlphaContent((uint8) alpha); }
|
||||||
|
void setRolloverAlphaContainer( sint32 alpha ){ setRolloverAlphaContainer((uint8) alpha); }
|
||||||
|
|
||||||
|
void setUseGlobalAlpha( bool use );
|
||||||
|
bool isUsingGlobalAlpha() const{ return _UseGlobalAlpha; }
|
||||||
|
|
||||||
|
std::string getAHOnAlphaSettingsChanged() const{ return CAHManager::getInstance()->getAHName( _AHOnAlphaSettingsChanged ); }
|
||||||
|
std::string getAHOnAlphaSettingsChangedParams() const{ return _AHOnAlphaSettingsChangedParams; }
|
||||||
|
|
||||||
|
void setAHOnAlphaSettingsChanged( const std::string &h ){ _AHOnAlphaSettingsChanged = CAHManager::getInstance()->getAH( h, _AHOnAlphaSettingsChangedParams ); }
|
||||||
|
void setAHOnAlphaSettingsChangedParams( const std::string &p ){ _AHOnAlphaSettingsChangedParams = p; }
|
||||||
|
|
||||||
|
REFLECT_EXPORT_START( CGroupContainerBase, CInterfaceGroup )
|
||||||
|
REFLECT_SINT32("container_alpha", getContainerAlphaAsSInt32, setContainerAlpha);
|
||||||
|
REFLECT_SINT32("content_alpha", getContentAlphaAsSInt32, setContentAlpha);
|
||||||
|
REFLECT_SINT32("rollover_content_alpha", getRolloverAlphaContentAsSInt32, setRolloverAlphaContent);
|
||||||
|
REFLECT_SINT32("rollover_container_alpha", getRolloverAlphaContainerAsSInt32, setRolloverAlphaContainer);
|
||||||
|
REFLECT_BOOL("use_global_alpha_settings", isUsingGlobalAlpha, setUseGlobalAlpha);
|
||||||
|
REFLECT_STRING("on_alpha_settings_changed", getAHOnAlphaSettingsChanged, setAHOnAlphaSettingsChanged);
|
||||||
|
REFLECT_STRING("on_alpha_settings_changed_aparams", getAHOnAlphaSettingsChangedParams, setAHOnAlphaSettingsChangedParams);
|
||||||
|
REFLECT_EXPORT_END
|
||||||
|
|
||||||
|
virtual bool isMoving() const{ return false; }
|
||||||
|
|
||||||
|
// Get the header color draw. NB: depends if grayed, and if active.
|
||||||
|
virtual NLMISC::CRGBA getDrawnHeaderColor () const{ return NLMISC::CRGBA(); };
|
||||||
|
|
||||||
|
uint8 getCurrentContainerAlpha() const{ return _CurrentContainerAlpha; }
|
||||||
|
uint8 getCurrentContentAlpha() const{ return _CurrentContentAlpha; }
|
||||||
|
|
||||||
|
virtual bool isGrayed() const{ return false; }
|
||||||
|
virtual bool getTouchFlag(bool clearFlag) const{ return false; }
|
||||||
|
virtual void backupPosition(){}
|
||||||
|
virtual void restorePosition(){}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void triggerAlphaSettingsChangedAH();
|
||||||
|
|
||||||
|
uint8 _CurrentContainerAlpha;
|
||||||
|
uint8 _CurrentContentAlpha;
|
||||||
|
uint8 _ContainerAlpha;
|
||||||
|
uint8 _ContentAlpha;
|
||||||
|
uint8 _RolloverAlphaContainer; // Alpha for the window when mouse not over it
|
||||||
|
uint8 _RolloverAlphaContent; // Alpha for the content when mouse not over it
|
||||||
|
bool _Locked : 1; // Is the container locked (ie override movable, openable ...)
|
||||||
|
bool _UseGlobalAlpha : 1;
|
||||||
|
|
||||||
|
IActionHandler *_AHOnAlphaSettingsChanged;
|
||||||
|
CStringShared _AHOnAlphaSettingsChangedParams;
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1,368 @@
|
|||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef RZ_CTRL_EDITBOX_H
|
||||||
|
#define RZ_CTRL_EDITBOX_H
|
||||||
|
|
||||||
|
#include "nel/gui/interface_group.h"
|
||||||
|
#include "nel/gui/group_editbox_base.h"
|
||||||
|
#include "nel/3d/u_texture.h"
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
class CEventDescriptor;
|
||||||
|
class CViewText;
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
class CGroupEditBox : public CGroupEditBoxBase
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
class IComboKeyHandler
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual ~IComboKeyHandler(){}
|
||||||
|
virtual bool isComboKeyChat( const NLGUI::CEventDescriptorKey &edk ) const = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
enum TEntryType { Text, Integer, PositiveInteger, Float, PositiveFloat, Alpha, AlphaNum, AlphaNumSpace, Password, Filename, PlayerName }; // the type of entry this edit bot can deal with
|
||||||
|
|
||||||
|
DECLARE_UI_CLASS( CGroupEditBox )
|
||||||
|
/// Constructor
|
||||||
|
CGroupEditBox(const TCtorParam ¶m);
|
||||||
|
/// Dtor
|
||||||
|
~CGroupEditBox();
|
||||||
|
|
||||||
|
std::string getProperty( const std::string &name ) const;
|
||||||
|
void setProperty( const std::string &name, const std::string &value );
|
||||||
|
xmlNodePtr serialize( xmlNodePtr parentNode, const char *type ) const;
|
||||||
|
|
||||||
|
bool parse(xmlNodePtr cur,CInterfaceGroup * parentGroup);
|
||||||
|
virtual uint32 getMemory() { return (uint32)(sizeof(*this)+_Id.size()); }
|
||||||
|
|
||||||
|
virtual void draw();
|
||||||
|
|
||||||
|
virtual bool handleEvent (const NLGUI::CEventDescriptor& eventDesc);
|
||||||
|
|
||||||
|
/// Accessors
|
||||||
|
ucstring getInputString() const { return _InputString; }
|
||||||
|
const ucstring &getInputStringRef() const { return _InputString; }
|
||||||
|
const ucstring &getPrompt() const { return _Prompt; }
|
||||||
|
|
||||||
|
/** Set the prompt
|
||||||
|
* NB : line returns are encoded as '\n', not '\r\n'
|
||||||
|
*/
|
||||||
|
void setPrompt(const ucstring &s) { _Prompt = s; }
|
||||||
|
void setInputString(const ucstring &str);
|
||||||
|
void setInputStringRef(const ucstring &str) {_InputString = str; };
|
||||||
|
void setInputStringAsInt(sint32 val);
|
||||||
|
sint32 getInputStringAsInt() const;
|
||||||
|
void setInputStringAsInt64(sint64 val);
|
||||||
|
sint64 getInputStringAsInt64() const;
|
||||||
|
void setInputStringAsFloat(float val);
|
||||||
|
float getInputStringAsFloat() const;
|
||||||
|
void setInputStringAsStdString(const std::string &str);
|
||||||
|
std::string getInputStringAsStdString() const;
|
||||||
|
void setInputStringAsUtf8(const std::string &str);
|
||||||
|
std::string getInputStringAsUtf8() const;
|
||||||
|
void setColor(NLMISC::CRGBA col);
|
||||||
|
|
||||||
|
|
||||||
|
/// force the selection of all the text
|
||||||
|
void setSelectionAll();
|
||||||
|
|
||||||
|
virtual void checkCoords();
|
||||||
|
virtual void updateCoords();
|
||||||
|
virtual void clearViews ();
|
||||||
|
|
||||||
|
virtual void setActive (bool state);
|
||||||
|
|
||||||
|
static CGroupEditBox *getMenuFather() { return _MenuFather; }
|
||||||
|
|
||||||
|
void setCommand(const ucstring &command, bool execute);
|
||||||
|
|
||||||
|
// Stop parent from blinking
|
||||||
|
void stopParentBlink() { if (_Parent) _Parent->disableBlink(); }
|
||||||
|
|
||||||
|
// Get / set cursor position
|
||||||
|
sint32 getCursorPos () const {return _CursorPos;}
|
||||||
|
void setCursorPos (sint32 pos) {_CursorPos=pos;}
|
||||||
|
|
||||||
|
// Get / set cursor at previous line end
|
||||||
|
bool isCursorAtPreviousLineEnd () const {return _CursorAtPreviousLineEnd;}
|
||||||
|
void setCursorAtPreviousLineEnd (bool setCursor) {_CursorAtPreviousLineEnd=setCursor;}
|
||||||
|
|
||||||
|
// Get / set current selection position
|
||||||
|
static sint32 getSelectCursorPos () {return _SelectCursorPos;}
|
||||||
|
static void setSelectCursorPos (sint32 pos) {_SelectCursorPos=pos;}
|
||||||
|
|
||||||
|
// Get the view text
|
||||||
|
const CViewText *getViewText () const {return _ViewText;}
|
||||||
|
|
||||||
|
// Get the historic information
|
||||||
|
sint32 getMaxHistoric() const {return _MaxHistoric;}
|
||||||
|
sint32 getCurrentHistoricIndex () const {return _CurrentHistoricIndex;}
|
||||||
|
void setCurrentHistoricIndex (sint32 index) {_CurrentHistoricIndex=index;}
|
||||||
|
const ucstring &getHistoric(uint32 index) const {return _Historic[index];}
|
||||||
|
uint32 getNumHistoric() const {return (uint32)_Historic.size ();}
|
||||||
|
|
||||||
|
// Get on change action handler
|
||||||
|
const std::string &getAHOnChange() const {return _AHOnChange;}
|
||||||
|
const std::string &getParamsOnChange() const {return _ParamsOnChange;}
|
||||||
|
|
||||||
|
void cutSelection();
|
||||||
|
|
||||||
|
/// From CInterfaceElement
|
||||||
|
sint32 getMaxUsedW() const;
|
||||||
|
sint32 getMinUsedW() const;
|
||||||
|
|
||||||
|
// Copy the selection into buffer
|
||||||
|
void copy();
|
||||||
|
// Paste the selection into buffer
|
||||||
|
void paste();
|
||||||
|
// Write the string into buffer
|
||||||
|
void writeString(const ucstring &str, bool replace = true, bool atEnd = true);
|
||||||
|
|
||||||
|
// Expand the expression (true if there was a '/' at the start of the line)
|
||||||
|
bool expand();
|
||||||
|
|
||||||
|
// Back space
|
||||||
|
void back();
|
||||||
|
|
||||||
|
// ignore the next char/key event -> useful when a key set the focus on an editbox (keydown is received, the focus, then keychar is received by the editbox again, but is irrelevant)
|
||||||
|
void bypassNextKey() { _BypassNextKey = true; }
|
||||||
|
|
||||||
|
// True if the editBox loose the focus on enter
|
||||||
|
bool getLooseFocusOnEnter() const {return _LooseFocusOnEnter;}
|
||||||
|
//
|
||||||
|
virtual void clearAllEditBox();
|
||||||
|
// From CInterfaceElement
|
||||||
|
virtual bool wantSerialConfig() const;
|
||||||
|
// From CInterfaceElement
|
||||||
|
virtual void serialConfig(NLMISC::IStream &f);
|
||||||
|
// From CInterfaceElement
|
||||||
|
virtual void onQuit();
|
||||||
|
// From CInterfaceElement
|
||||||
|
virtual void onLoadConfig();
|
||||||
|
|
||||||
|
// from CCtrlBase
|
||||||
|
virtual void elementCaptured(CCtrlBase *capturedElement);
|
||||||
|
|
||||||
|
// from CCtrlBase
|
||||||
|
virtual void onKeyboardCaptureLost();
|
||||||
|
|
||||||
|
// set the input string as "default". will be reseted at first click (used for user information)
|
||||||
|
void setDefaultInputString(const ucstring &str);
|
||||||
|
|
||||||
|
// For Interger and PositiveInteger, can specify min and max values
|
||||||
|
void setIntegerMinValue(sint32 minValue) {_IntegerMinValue=minValue;}
|
||||||
|
void setIntegerMaxValue(sint32 maxValue) {_IntegerMaxValue=maxValue;}
|
||||||
|
void setPositiveIntegerMinValue(uint32 minValue) {_PositiveIntegerMinValue=minValue;}
|
||||||
|
void setPositiveIntegerMaxValue(uint32 maxValue) {_PositiveIntegerMaxValue=maxValue;}
|
||||||
|
|
||||||
|
void setFocusOnText();
|
||||||
|
|
||||||
|
int luaSetSelectionAll(CLuaState &ls);
|
||||||
|
int luaSetupDisplayText(CLuaState &ls);
|
||||||
|
int luaSetFocusOnText(CLuaState &ls);
|
||||||
|
int luaCancelFocusOnText(CLuaState &ls);
|
||||||
|
REFLECT_EXPORT_START(CGroupEditBox, CGroupEditBoxBase)
|
||||||
|
REFLECT_LUA_METHOD("setupDisplayText", luaSetupDisplayText);
|
||||||
|
REFLECT_LUA_METHOD("setSelectionAll", luaSetSelectionAll);
|
||||||
|
REFLECT_LUA_METHOD("setFocusOnText", luaSetFocusOnText);
|
||||||
|
REFLECT_LUA_METHOD("cancelFocusOnText", luaCancelFocusOnText);
|
||||||
|
REFLECT_STRING("input_string", getInputStringAsStdString, setInputStringAsStdString);
|
||||||
|
REFLECT_UCSTRING("uc_input_string", getInputString, setInputString);
|
||||||
|
REFLECT_EXPORT_END
|
||||||
|
|
||||||
|
/** Restore the original value of the edit box.
|
||||||
|
* This value is captured when the edit box get focus
|
||||||
|
* (return true if no undo was available)
|
||||||
|
* Will always fails ifthe edito box do not have the focus
|
||||||
|
*/
|
||||||
|
bool undo();
|
||||||
|
|
||||||
|
/** Cancel last undo operation
|
||||||
|
* Return true if redo operation is available
|
||||||
|
*/
|
||||||
|
bool redo();
|
||||||
|
|
||||||
|
/// freeze the control (loose focus, and cannot edit)
|
||||||
|
void setFrozen (bool state);
|
||||||
|
bool getFrozen () const { return _Frozen; }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
// Cursor infos
|
||||||
|
float _BlinkTime;
|
||||||
|
sint32 _CursorPos;
|
||||||
|
uint32 _MaxNumChar;
|
||||||
|
uint32 _MaxNumReturn;
|
||||||
|
uint32 _MaxFloatPrec; // used in setInputStringAsFloat() only
|
||||||
|
sint32 _MaxCharsSize;
|
||||||
|
sint32 _FirstVisibleChar;
|
||||||
|
sint32 _LastVisibleChar;
|
||||||
|
|
||||||
|
// Text selection
|
||||||
|
static sint32 _SelectCursorPos;
|
||||||
|
bool _SelectingText;
|
||||||
|
NLMISC::CRGBA _TextSelectColor;
|
||||||
|
NLMISC::CRGBA _BackSelectColor;
|
||||||
|
|
||||||
|
// Text info
|
||||||
|
ucstring _Prompt;
|
||||||
|
ucstring _InputString;
|
||||||
|
CViewText *_ViewText;
|
||||||
|
|
||||||
|
// undo / redo
|
||||||
|
ucstring _StartInputString; // value of the input string when focus was acuired first
|
||||||
|
ucstring _ModifiedInputString;
|
||||||
|
|
||||||
|
|
||||||
|
// Historic info
|
||||||
|
typedef std::deque<ucstring> THistoric;
|
||||||
|
THistoric _Historic;
|
||||||
|
uint32 _MaxHistoric;
|
||||||
|
sint32 _CurrentHistoricIndex;
|
||||||
|
sint32 _PrevNumLine;
|
||||||
|
|
||||||
|
// Action Handler
|
||||||
|
std::string _AHOnChange;
|
||||||
|
std::string _ParamsOnChange;
|
||||||
|
std::string _ListMenuRight;
|
||||||
|
|
||||||
|
std::string _AHOnFocusLost;
|
||||||
|
std::string _AHOnFocusLostParams;
|
||||||
|
|
||||||
|
// entry type
|
||||||
|
TEntryType _EntryType;
|
||||||
|
|
||||||
|
|
||||||
|
bool _Setupped : 1; // setup
|
||||||
|
bool _BypassNextKey : 1;
|
||||||
|
bool _BlinkState : 1;
|
||||||
|
bool _CursorAtPreviousLineEnd : 1; // force the cursor to be displayed at the end of the previous line end (if END has beeen pressed while in a string split accross 2 lines)
|
||||||
|
bool _LooseFocusOnEnter : 1;
|
||||||
|
bool _ResetFocusOnHide : 1;
|
||||||
|
bool _BackupFatherContainerPos : 1; // Backup father container position when characters are typed.
|
||||||
|
// If the edit box is at the bottom of the screen and if it expands on y
|
||||||
|
// because of multiline, thz parent container will be moved to top
|
||||||
|
// The good position can be restored by a press on enter then
|
||||||
|
bool _WantReturn : 1; // Want return char, don't call the enter action handler
|
||||||
|
bool _Savable : 1; // should content be saved ?
|
||||||
|
bool _DefaultInputString : 1; // Is the current input string the default one (should not be edited)
|
||||||
|
bool _Frozen : 1; // is the control frozen? (cannot edit in it)
|
||||||
|
|
||||||
|
bool _CanRedo : 1;
|
||||||
|
bool _CanUndo : 1;
|
||||||
|
|
||||||
|
std::vector<char> _NegativeFilter;
|
||||||
|
|
||||||
|
sint _CursorTexID;
|
||||||
|
sint32 _CursorWidth;
|
||||||
|
|
||||||
|
sint32 _IntegerMinValue;
|
||||||
|
sint32 _IntegerMaxValue;
|
||||||
|
uint32 _PositiveIntegerMinValue;
|
||||||
|
uint32 _PositiveIntegerMaxValue;
|
||||||
|
|
||||||
|
sint32 _ViewTextDeltaX;
|
||||||
|
|
||||||
|
private:
|
||||||
|
void setupDisplayText();
|
||||||
|
void makeTopWindow();
|
||||||
|
void handleEventChar(const NLGUI::CEventDescriptorKey &event);
|
||||||
|
void handleEventString(const NLGUI::CEventDescriptorKey &event);
|
||||||
|
void setup();
|
||||||
|
void triggerOnChangeAH();
|
||||||
|
void appendStringFromClipboard(const ucstring &str);
|
||||||
|
|
||||||
|
ucstring getSelection();
|
||||||
|
|
||||||
|
static CGroupEditBox *_MenuFather;
|
||||||
|
|
||||||
|
static bool isValidAlphaNumSpace(ucchar c)
|
||||||
|
{
|
||||||
|
if (c > 255) return false;
|
||||||
|
char ac = (char) c;
|
||||||
|
return (ac >= '0' && ac <= '9') ||
|
||||||
|
(ac >= 'a' && ac <= 'z') ||
|
||||||
|
(ac >= 'A' && ac <= 'Z') ||
|
||||||
|
ac==' ';
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool isValidAlphaNum(ucchar c)
|
||||||
|
{
|
||||||
|
if (c > 255) return false;
|
||||||
|
char ac = (char) c;
|
||||||
|
return (ac >= '0' && ac <= '9') ||
|
||||||
|
(ac >= 'a' && ac <= 'z') ||
|
||||||
|
(ac >= 'A' && ac <= 'Z');
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool isValidAlpha(ucchar c)
|
||||||
|
{
|
||||||
|
if (c > 255) return false;
|
||||||
|
char ac = (char) c;
|
||||||
|
return (ac >= 'a' && ac <= 'z') ||
|
||||||
|
(ac >= 'A' && ac <= 'Z');
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool isValidPlayerNameChar(ucchar c)
|
||||||
|
{
|
||||||
|
// valid player name (with possible shard prefix / suffix format
|
||||||
|
return isValidAlpha(c) || c=='.' || c=='(' || c==')';
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool isValidFilenameChar(ucchar c)
|
||||||
|
{
|
||||||
|
if (c == '\\' ||
|
||||||
|
c == '/' ||
|
||||||
|
c == ':' ||
|
||||||
|
c == '*' ||
|
||||||
|
c == '?' ||
|
||||||
|
c == '\"' ||
|
||||||
|
c == '<' ||
|
||||||
|
c == '>' ||
|
||||||
|
c == '|') return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
//
|
||||||
|
bool isFiltered(ucchar c)
|
||||||
|
{
|
||||||
|
uint length = (uint)_NegativeFilter.size();
|
||||||
|
for (uint k = 0; k < length; ++k)
|
||||||
|
{
|
||||||
|
if ((ucchar) _NegativeFilter[k] == c) return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
static IComboKeyHandler *comboKeyHandler;
|
||||||
|
|
||||||
|
public:
|
||||||
|
static void setComboKeyHandler( IComboKeyHandler *handler ){ comboKeyHandler = handler; }
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // RZ_CTRL_EDITBOX_H
|
||||||
|
|
||||||
|
/* End of ctrl_editbox.h */
|
@ -0,0 +1,67 @@
|
|||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef GROUP_EDITBOX_BASE_H
|
||||||
|
#define GROUP_EDITBOX_BASE_H
|
||||||
|
|
||||||
|
#include "nel/gui/interface_group.h"
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
|
||||||
|
class CGroupEditBoxBase : public CInterfaceGroup
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
DECLARE_UI_CLASS( CGroupEditBoxBase )
|
||||||
|
|
||||||
|
CGroupEditBoxBase( const TCtorParam ¶m );
|
||||||
|
~CGroupEditBoxBase();
|
||||||
|
|
||||||
|
// True if the editBox can recover the focus on enter. if not, it does not erase OldCapturedKeyboard when loose focus
|
||||||
|
bool getRecoverFocusOnEnter() const{ return _RecoverFocusOnEnter; }
|
||||||
|
void setRecoverFocusOnEnter( bool state ){ _RecoverFocusOnEnter = state; }
|
||||||
|
|
||||||
|
std::string getAHOnFocus(){ return _AHOnFocus; }
|
||||||
|
std::string getAHOnFocusParams(){ return _AHOnFocusParams; }
|
||||||
|
|
||||||
|
// disable any current selection
|
||||||
|
static void disableSelection(){ _CurrSelection = NULL; }
|
||||||
|
|
||||||
|
// Get / set current selection
|
||||||
|
static CGroupEditBoxBase *getCurrSelection(){ return _CurrSelection; }
|
||||||
|
static void setCurrSelection( CGroupEditBoxBase *selection ){ _CurrSelection = selection; }
|
||||||
|
|
||||||
|
void draw(){}
|
||||||
|
|
||||||
|
REFLECT_EXPORT_START( CGroupEditBoxBase, CInterfaceGroup )
|
||||||
|
REFLECT_BOOL( "enter_recover_focus", getRecoverFocusOnEnter, setRecoverFocusOnEnter );
|
||||||
|
REFLECT_EXPORT_END
|
||||||
|
|
||||||
|
protected:
|
||||||
|
bool _RecoverFocusOnEnter : 1;
|
||||||
|
|
||||||
|
std::string _AHOnFocus;
|
||||||
|
std::string _AHOnFocusParams;
|
||||||
|
|
||||||
|
static CGroupEditBoxBase *_CurrSelection; // the edit box for which the selection is currently active, or NULL if there's none
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,118 @@
|
|||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef NL_GROUP_FRAME_H
|
||||||
|
#define NL_GROUP_FRAME_H
|
||||||
|
|
||||||
|
#include "nel/misc/types_nl.h"
|
||||||
|
#include "nel/gui/interface_group.h"
|
||||||
|
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
/** A Group with a background and a frame displayed
|
||||||
|
* \author Lionel Berenguier
|
||||||
|
* \author Nevrax France
|
||||||
|
* \date 2002
|
||||||
|
*/
|
||||||
|
class CGroupFrame : public CInterfaceGroup
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
/// Constructor
|
||||||
|
CGroupFrame(const TCtorParam ¶m);
|
||||||
|
|
||||||
|
std::string getProperty( const std::string &name ) const;
|
||||||
|
void setProperty( const std::string &name, const std::string &value );
|
||||||
|
xmlNodePtr serialize( xmlNodePtr parentNode, const char *type ) const;
|
||||||
|
|
||||||
|
virtual bool parse (xmlNodePtr cur, CInterfaceGroup *parentGroup);
|
||||||
|
virtual void draw ();
|
||||||
|
|
||||||
|
void copyOptionFrom(const CGroupFrame &other);
|
||||||
|
void setupOptions();
|
||||||
|
|
||||||
|
|
||||||
|
void setColorAsString(const std::string & col);
|
||||||
|
std::string getColorAsString() const;
|
||||||
|
|
||||||
|
REFLECT_EXPORT_START(CGroupFrame, CInterfaceGroup)
|
||||||
|
REFLECT_STRING ("color", getColorAsString, setColorAsString);
|
||||||
|
REFLECT_EXPORT_END
|
||||||
|
|
||||||
|
|
||||||
|
static void resetDisplayTypes() { _DispTypes.clear(); }
|
||||||
|
|
||||||
|
// ******************
|
||||||
|
protected:
|
||||||
|
|
||||||
|
bool _DisplayFrame;
|
||||||
|
|
||||||
|
NLMISC::CRGBA _Color;
|
||||||
|
|
||||||
|
uint8 _DispType;
|
||||||
|
|
||||||
|
std::string _Options;
|
||||||
|
|
||||||
|
// Fields Defined in the XML => must not herit them from extends=""
|
||||||
|
bool _DisplayFrameDefined : 1;
|
||||||
|
bool _ColorDefined : 1;
|
||||||
|
bool _DispTypeDefined : 1;
|
||||||
|
|
||||||
|
// Static stuff
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
TextTL= 0,
|
||||||
|
TextTM,
|
||||||
|
TextTR,
|
||||||
|
TextML,
|
||||||
|
TextMM,
|
||||||
|
TextMR,
|
||||||
|
TextBL,
|
||||||
|
TextBM,
|
||||||
|
TextBR
|
||||||
|
};
|
||||||
|
|
||||||
|
struct SDisplayType
|
||||||
|
{
|
||||||
|
std::string Name;
|
||||||
|
sint32 BorderIds[9];
|
||||||
|
uint8 TileBorder[9]; // Dont works for TextTL, TextTR, TextBL, TextBR
|
||||||
|
sint32 LeftBorder; // enum
|
||||||
|
sint32 RightBorder;
|
||||||
|
sint32 TopBorder;
|
||||||
|
sint32 BottomBorder;
|
||||||
|
|
||||||
|
// -----------------------
|
||||||
|
SDisplayType()
|
||||||
|
{
|
||||||
|
for (uint i = 0; i < 9; ++i)
|
||||||
|
TileBorder[i] = 0;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
static std::vector<SDisplayType> _DispTypes;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // NL_GROUP_FRAME_H
|
||||||
|
|
||||||
|
/* End of group_frame.h */
|
@ -0,0 +1,93 @@
|
|||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
#ifndef CL_GROUP_HEADER_H
|
||||||
|
#define CL_GROUP_HEADER_H
|
||||||
|
|
||||||
|
#include "nel/gui/group_list.h"
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
|
||||||
|
class CGroupHeaderEntry;
|
||||||
|
|
||||||
|
// *****************************************************************************************************************
|
||||||
|
/** Display a header with movable entries.
|
||||||
|
* Usually used with a table to change the size of each column (much like the windows file explorer in 'details' mode)
|
||||||
|
*
|
||||||
|
* \author Nicolas Vizerie
|
||||||
|
* \author Nevrax France
|
||||||
|
* \date 2006
|
||||||
|
*/
|
||||||
|
class CGroupHeader : public CGroupList
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
REFLECT_EXPORT_START(CGroupHeader, CGroupList)
|
||||||
|
REFLECT_LUA_METHOD("enlargeColumns", luaEnlargeColumns);
|
||||||
|
REFLECT_LUA_METHOD("resizeColumnsAndContainer", luaResizeColumnsAndContainer);
|
||||||
|
REFLECT_EXPORT_END
|
||||||
|
|
||||||
|
CGroupHeader(const TCtorParam ¶m);
|
||||||
|
|
||||||
|
std::string getProperty( const std::string &name ) const;
|
||||||
|
void setProperty( const std::string &name, const std::string &value );
|
||||||
|
xmlNodePtr serialize( xmlNodePtr parentNode, const char *type ) const;
|
||||||
|
|
||||||
|
// from CInterfaceGroup
|
||||||
|
virtual bool parse(xmlNodePtr cur, CInterfaceGroup * parentGroup);
|
||||||
|
sint32 getHeaderMaxSize() const { return _HeaderMaxSize; }
|
||||||
|
// get the entries in this header
|
||||||
|
void getEntries(std::vector<CGroupHeaderEntry *> &dest);
|
||||||
|
// ensure that max. content of columns is visible (without the total width becoming more than 'getHeaderMaxSize()'
|
||||||
|
void enlargeColumns(sint32 margin);
|
||||||
|
// ensure that content of each column is visible
|
||||||
|
void resizeColumnsAndContainer(sint32 margin);
|
||||||
|
private:
|
||||||
|
sint32 _HeaderMaxSize;
|
||||||
|
int luaEnlargeColumns(CLuaState &ls);
|
||||||
|
int luaResizeColumnsAndContainer(CLuaState &ls);
|
||||||
|
};
|
||||||
|
|
||||||
|
// *****************************************************************************************************************
|
||||||
|
// an entry in a header, includes a "mover control" to move it inside its parent header
|
||||||
|
// NOTE : when not used inside a CGroupHeader, will work, but there will be no 'max_size'
|
||||||
|
class CGroupHeaderEntry : public CInterfaceGroup
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CGroupHeaderEntry(const TCtorParam ¶m);
|
||||||
|
xmlNodePtr serialize( xmlNodePtr parentNode, const char *type ) const;
|
||||||
|
// from CInterfaceGroup
|
||||||
|
virtual bool parse(xmlNodePtr cur, CInterfaceGroup * parentGroup);
|
||||||
|
sint32 getMinSize() const { return _MinSize; }
|
||||||
|
virtual void updateCoords();
|
||||||
|
CInterfaceGroup *getTargetColumn() const;
|
||||||
|
|
||||||
|
const std::string &getAHOnResize() const { return _AHOnResize; }
|
||||||
|
const std::string &getAHOnResizeParams() const { return _AHOnResizeParams; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
sint32 _MinSize;
|
||||||
|
sint32 _ResizerSize;
|
||||||
|
std::string _TargetColumnId;
|
||||||
|
std::string _AHOnResize;
|
||||||
|
std::string _AHOnResizeParams;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,669 @@
|
|||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
#ifndef CL_GROUP_HTML_H
|
||||||
|
#define CL_GROUP_HTML_H
|
||||||
|
|
||||||
|
#define CURL_STATICLIB 1
|
||||||
|
#include <curl/curl.h>
|
||||||
|
|
||||||
|
#include "nel/misc/types_nl.h"
|
||||||
|
#include "nel/gui/interface_group.h"
|
||||||
|
#include "nel/gui/group_scrolltext.h"
|
||||||
|
#include "nel/gui/group_tree.h"
|
||||||
|
#include "nel/gui/ctrl_button.h"
|
||||||
|
#include "nel/gui/group_table.h"
|
||||||
|
|
||||||
|
typedef std::map<std::string, std::string> TStyle;
|
||||||
|
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#include "libwww/WWWInit.h"
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
class CCtrlButton;
|
||||||
|
class CCtrlScroll;
|
||||||
|
class CGroupList;
|
||||||
|
class CDBGroupComboBox;
|
||||||
|
class CGroupParagraph;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// HTML group
|
||||||
|
/**
|
||||||
|
* Widget to have a resizable scrolltext and its scrollbar
|
||||||
|
* \author Cyril 'Hulud' Corvazier
|
||||||
|
* \author Nevrax France
|
||||||
|
* \date 2002
|
||||||
|
*/
|
||||||
|
class CGroupHTML : public CGroupScrollText
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
friend void TextAdd (struct _HText *me, const char * buf, int len);
|
||||||
|
friend void TextBeginElement (_HText *me, int element_number, const BOOL *present, const char ** value);
|
||||||
|
friend void TextEndElement (_HText *me, int element_number);
|
||||||
|
friend void TextLink (struct _HText *me, int element_number, int attribute_number, struct _HTChildAnchor *anchor, const BOOL *present, const char **value);
|
||||||
|
friend void TextBuild (HText * me, HTextStatus status);
|
||||||
|
friend void TextBeginUnparsedElement(HText *me, const char *buffer, int length);
|
||||||
|
friend void TextEndUnparsedElement(HText *me, const char *buffer, int length);
|
||||||
|
friend int requestTerminater (HTRequest * request, HTResponse * response, void * param, int status);
|
||||||
|
|
||||||
|
/// Web browser options for CGroupHTML
|
||||||
|
struct SWebOptions
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/// Id of the browser ( e.g.: Chrome, Firefox, Ryzom )
|
||||||
|
std::string appName;
|
||||||
|
/// Version of the browser
|
||||||
|
std::string appVersion;
|
||||||
|
/// Language code of the browser( e.g.: en, hu )
|
||||||
|
std::string languageCode;
|
||||||
|
/// List of domains the widget can consider secure.
|
||||||
|
std::vector< std::string > trustedDomains;
|
||||||
|
|
||||||
|
SWebOptions()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
static SWebOptions options;
|
||||||
|
|
||||||
|
// Constructor
|
||||||
|
CGroupHTML(const TCtorParam ¶m);
|
||||||
|
~CGroupHTML();
|
||||||
|
|
||||||
|
std::string getProperty( const std::string &name ) const;
|
||||||
|
void setProperty( const std::string &name, const std::string &value );
|
||||||
|
xmlNodePtr serialize( xmlNodePtr parentNode, const char *type ) const;
|
||||||
|
|
||||||
|
// CInterfaceGroup Interface
|
||||||
|
virtual bool parse (xmlNodePtr cur, CInterfaceGroup *parentGroup);
|
||||||
|
virtual void draw ();
|
||||||
|
|
||||||
|
// Events
|
||||||
|
virtual bool handleEvent (const NLGUI::CEventDescriptor& eventDesc);
|
||||||
|
|
||||||
|
// Browse
|
||||||
|
virtual void browse (const char *url);
|
||||||
|
|
||||||
|
// Refresh
|
||||||
|
void refresh();
|
||||||
|
|
||||||
|
// submit form
|
||||||
|
void submitForm (uint formId, const char *submitButtonName);
|
||||||
|
|
||||||
|
// Browse error
|
||||||
|
void browseError (const char *msg);
|
||||||
|
|
||||||
|
// stop browse
|
||||||
|
void stopBrowse ();
|
||||||
|
|
||||||
|
bool isBrowsing();
|
||||||
|
|
||||||
|
void clean() { stopBrowse(); updateRefreshButton(); removeContent(); }
|
||||||
|
|
||||||
|
// Update coords
|
||||||
|
void updateCoords();
|
||||||
|
|
||||||
|
// New paragraph
|
||||||
|
void newParagraph(uint beginSpace);
|
||||||
|
|
||||||
|
// End of the paragraph
|
||||||
|
void endParagraph();
|
||||||
|
|
||||||
|
// Timeout
|
||||||
|
void setTimeout(float tm) {_TimeoutValue= std::max(0.f, tm);}
|
||||||
|
float getTimeout() const {return (float)_TimeoutValue;}
|
||||||
|
|
||||||
|
// Some constants
|
||||||
|
NLMISC::CRGBA BgColor;
|
||||||
|
NLMISC::CRGBA ErrorColor;
|
||||||
|
NLMISC::CRGBA LinkColor;
|
||||||
|
NLMISC::CRGBA TextColor;
|
||||||
|
NLMISC::CRGBA H1Color;
|
||||||
|
NLMISC::CRGBA H2Color;
|
||||||
|
NLMISC::CRGBA H3Color;
|
||||||
|
NLMISC::CRGBA H4Color;
|
||||||
|
NLMISC::CRGBA H5Color;
|
||||||
|
NLMISC::CRGBA H6Color;
|
||||||
|
bool ErrorColorGlobalColor;
|
||||||
|
bool LinkColorGlobalColor;
|
||||||
|
bool TextColorGlobalColor;
|
||||||
|
bool H1ColorGlobalColor;
|
||||||
|
bool H2ColorGlobalColor;
|
||||||
|
bool H3ColorGlobalColor;
|
||||||
|
bool H4ColorGlobalColor;
|
||||||
|
bool H5ColorGlobalColor;
|
||||||
|
bool H6ColorGlobalColor;
|
||||||
|
uint TextFontSize;
|
||||||
|
uint H1FontSize;
|
||||||
|
uint H2FontSize;
|
||||||
|
uint H3FontSize;
|
||||||
|
uint H4FontSize;
|
||||||
|
uint H5FontSize;
|
||||||
|
uint H6FontSize;
|
||||||
|
uint TDBeginSpace;
|
||||||
|
uint PBeginSpace;
|
||||||
|
uint LIBeginSpace;
|
||||||
|
uint ULBeginSpace;
|
||||||
|
uint LIIndent;
|
||||||
|
uint ULIndent;
|
||||||
|
float LineSpaceFontFactor;
|
||||||
|
std::string DefaultButtonGroup;
|
||||||
|
std::string DefaultFormTextGroup;
|
||||||
|
std::string DefaultFormTextAreaGroup;
|
||||||
|
std::string DefaultFormSelectGroup;
|
||||||
|
std::string DefaultCheckBoxBitmapNormal;
|
||||||
|
std::string DefaultCheckBoxBitmapPushed;
|
||||||
|
std::string DefaultCheckBoxBitmapOver;
|
||||||
|
std::string DefaultBackgroundBitmapView;
|
||||||
|
std::string CurrentLinkTitle;
|
||||||
|
|
||||||
|
// Browser home
|
||||||
|
std::string Home;
|
||||||
|
|
||||||
|
// Undo browse: Browse the precedent url browsed. no op if none
|
||||||
|
void browseUndo ();
|
||||||
|
// Redo browse: Browse the precedent url undoed. no op if none
|
||||||
|
void browseRedo ();
|
||||||
|
// clear undo/redo
|
||||||
|
void clearUndoRedo();
|
||||||
|
|
||||||
|
|
||||||
|
std::string getURL() const { return _URL; }
|
||||||
|
void setURL(const std::string &url);
|
||||||
|
|
||||||
|
|
||||||
|
int luaBrowse(CLuaState &ls);
|
||||||
|
int luaRefresh(CLuaState &ls);
|
||||||
|
int luaRemoveContent(CLuaState &ls);
|
||||||
|
int luaInsertText(CLuaState &ls);
|
||||||
|
int luaAddString(CLuaState &ls);
|
||||||
|
int luaAddImage(CLuaState &ls);
|
||||||
|
int luaBeginElement(CLuaState &ls);
|
||||||
|
int luaEndElement(CLuaState &ls);
|
||||||
|
int luaShowDiv(CLuaState &ls);
|
||||||
|
|
||||||
|
REFLECT_EXPORT_START(CGroupHTML, CGroupScrollText)
|
||||||
|
REFLECT_LUA_METHOD("browse", luaBrowse)
|
||||||
|
REFLECT_LUA_METHOD("refresh", luaRefresh)
|
||||||
|
REFLECT_LUA_METHOD("removeContent", luaRemoveContent)
|
||||||
|
REFLECT_LUA_METHOD("insertText", luaInsertText)
|
||||||
|
REFLECT_LUA_METHOD("addString", luaAddString)
|
||||||
|
REFLECT_LUA_METHOD("addImage", luaAddImage)
|
||||||
|
REFLECT_LUA_METHOD("beginElement", luaBeginElement)
|
||||||
|
REFLECT_LUA_METHOD("endElement", luaEndElement)
|
||||||
|
REFLECT_LUA_METHOD("showDiv", luaShowDiv)
|
||||||
|
REFLECT_STRING("url", getURL, setURL)
|
||||||
|
REFLECT_FLOAT("timeout", getTimeout, setTimeout)
|
||||||
|
REFLECT_EXPORT_END
|
||||||
|
|
||||||
|
protected :
|
||||||
|
|
||||||
|
// \name callback from libwww
|
||||||
|
|
||||||
|
// Begin of the parsing of a HTML document
|
||||||
|
virtual void beginBuild ();
|
||||||
|
|
||||||
|
// End of the parsing of a HTML document
|
||||||
|
virtual void endBuild ();
|
||||||
|
|
||||||
|
// A new text block has been parsed
|
||||||
|
virtual void addText (const char * buf, int len);
|
||||||
|
|
||||||
|
// A link has been parsed
|
||||||
|
virtual void addLink (uint element_number, uint attribute_number, HTChildAnchor *anchor, const BOOL *present, const char **value);
|
||||||
|
|
||||||
|
// A new begin HTML element has been parsed (<IMG> for exemple)
|
||||||
|
virtual void beginElement (uint element_number, const BOOL *present, const char **value);
|
||||||
|
|
||||||
|
// A new end HTML element has been parsed (</IMG> for exemple)
|
||||||
|
virtual void endElement (uint element_number);
|
||||||
|
|
||||||
|
// A new begin unparsed element has been found
|
||||||
|
virtual void beginUnparsedElement(const char *buffer, int length);
|
||||||
|
|
||||||
|
// A new end unparsed element has been found
|
||||||
|
virtual void endUnparsedElement(const char *buffer, int length);
|
||||||
|
|
||||||
|
// Add GET params to the url
|
||||||
|
virtual void addHTTPGetParams (std::string &url, bool trustedDomain);
|
||||||
|
|
||||||
|
// Add POST params to the libwww list
|
||||||
|
virtual void addHTTPPostParams (HTAssocList *formfields, bool trustedDomain);
|
||||||
|
|
||||||
|
// the current request is terminated
|
||||||
|
virtual void requestTerminated(HTRequest *request);
|
||||||
|
|
||||||
|
// Get Home URL
|
||||||
|
virtual std::string home();
|
||||||
|
|
||||||
|
// Parse style html tag
|
||||||
|
TStyle parseStyle(const std::string &str_styles);
|
||||||
|
|
||||||
|
// Handle some work at each pass
|
||||||
|
virtual void handle ();
|
||||||
|
|
||||||
|
// \name internal methods
|
||||||
|
|
||||||
|
// Add a group in the current parent group
|
||||||
|
void addGroup (CInterfaceGroup *group, uint beginSpace);
|
||||||
|
|
||||||
|
// Get the current parent group
|
||||||
|
CInterfaceGroup *getCurrentGroup();
|
||||||
|
|
||||||
|
// Update current paragraph dependent data
|
||||||
|
void paragraphChange ();
|
||||||
|
|
||||||
|
// Clear the contexts info
|
||||||
|
void clearContext();
|
||||||
|
|
||||||
|
// Translate a char
|
||||||
|
bool translateChar(ucchar &output, ucchar input, ucchar lastChar) const;
|
||||||
|
|
||||||
|
// Add a string in the current paragraph
|
||||||
|
void addString(const ucstring &str);
|
||||||
|
|
||||||
|
// Add an image in the current paragraph
|
||||||
|
void addImage(const char *image, bool globalColor, bool reloadImg=false);
|
||||||
|
|
||||||
|
// Add a text area in the current paragraph
|
||||||
|
CInterfaceGroup *addTextArea (const std::string &templateName, const char *name, uint rows, uint cols, bool multiLine, const ucstring &content);
|
||||||
|
|
||||||
|
// Add a combo box in the current paragraph
|
||||||
|
CDBGroupComboBox *addComboBox(const std::string &templateName, const char *name);
|
||||||
|
|
||||||
|
// Add a button in the current paragraph. actionHandler, actionHandlerParams and tooltip can be NULL.
|
||||||
|
CCtrlButton *addButton(CCtrlButton::EType type, const std::string &name, const std::string &normalBitmap, const std::string &pushedBitmap,
|
||||||
|
const std::string &overBitmap, bool useGlobalColor, const char *actionHandler, const char *actionHandlerParams, const char *tooltip);
|
||||||
|
|
||||||
|
// Set the background color
|
||||||
|
void setBackgroundColor (const NLMISC::CRGBA &bgcolor);
|
||||||
|
|
||||||
|
// Set the background
|
||||||
|
void setBackground (const std::string &bgtex, bool scale, bool tile);
|
||||||
|
|
||||||
|
// Force the current string to be in a single string
|
||||||
|
void flushString();
|
||||||
|
|
||||||
|
// Set the title
|
||||||
|
void setTitle (const ucstring &title);
|
||||||
|
|
||||||
|
// Lookup a url in local file system
|
||||||
|
bool lookupLocalFile (std::string &result, const char *url, bool isUrl);
|
||||||
|
|
||||||
|
// Delete page content and prepare next page
|
||||||
|
void removeContent ();
|
||||||
|
|
||||||
|
// Current URL
|
||||||
|
std::string _URL;
|
||||||
|
|
||||||
|
// Current DOMAIN
|
||||||
|
bool _TrustedDomain;
|
||||||
|
|
||||||
|
// Title prefix
|
||||||
|
ucstring _TitlePrefix;
|
||||||
|
|
||||||
|
// Title string
|
||||||
|
ucstring _TitleString;
|
||||||
|
|
||||||
|
// Need to browse next update coords..
|
||||||
|
bool _BrowseNextTime;
|
||||||
|
bool _PostNextTime;
|
||||||
|
uint _PostFormId;
|
||||||
|
std::string _PostFormSubmitButton;
|
||||||
|
|
||||||
|
// Browsing..
|
||||||
|
bool _Browsing;
|
||||||
|
bool _Connecting;
|
||||||
|
double _TimeoutValue; // the timeout in seconds
|
||||||
|
double _ConnectingTimeout;
|
||||||
|
|
||||||
|
// minimal embeded lua script support
|
||||||
|
// Note : any embeded script is executed immediately after the closing
|
||||||
|
// element has been found
|
||||||
|
// True when the <lua> element has been encountered
|
||||||
|
bool _ParsingLua;
|
||||||
|
bool _IgnoreText;
|
||||||
|
// the script to execute
|
||||||
|
std::string _LuaScript;
|
||||||
|
|
||||||
|
bool _Object;
|
||||||
|
std::string _ObjectScript;
|
||||||
|
|
||||||
|
// Someone is conecting. We got problem with libwww : 2 connection requests can deadlock the client.
|
||||||
|
static CGroupHTML *_ConnectingLock;
|
||||||
|
|
||||||
|
// LibWWW data
|
||||||
|
class CLibWWWData *_LibWWW;
|
||||||
|
|
||||||
|
// Current paragraph
|
||||||
|
std::string _DivName;
|
||||||
|
CGroupParagraph* _Paragraph;
|
||||||
|
inline CGroupParagraph *getParagraph()
|
||||||
|
{
|
||||||
|
return _Paragraph;
|
||||||
|
/*if (_Paragraph.empty())
|
||||||
|
return NULL;
|
||||||
|
return _Paragraph.back();*/
|
||||||
|
}
|
||||||
|
|
||||||
|
// PRE mode
|
||||||
|
std::vector<bool> _PRE;
|
||||||
|
inline bool getPRE() const
|
||||||
|
{
|
||||||
|
if (_PRE.empty())
|
||||||
|
return false;
|
||||||
|
return _PRE.back();
|
||||||
|
}
|
||||||
|
|
||||||
|
// UL mode
|
||||||
|
std::vector<bool> _UL;
|
||||||
|
inline bool getUL() const
|
||||||
|
{
|
||||||
|
if (_UL.empty())
|
||||||
|
return false;
|
||||||
|
return _UL.back();
|
||||||
|
}
|
||||||
|
|
||||||
|
// A mode
|
||||||
|
std::vector<bool> _A;
|
||||||
|
inline bool getA() const
|
||||||
|
{
|
||||||
|
if (_A.empty())
|
||||||
|
return false;
|
||||||
|
return _A.back();
|
||||||
|
}
|
||||||
|
|
||||||
|
// IL mode
|
||||||
|
bool _LI;
|
||||||
|
|
||||||
|
// Current text color
|
||||||
|
std::vector<NLMISC::CRGBA> _TextColor;
|
||||||
|
inline const NLMISC::CRGBA &getTextColor() const
|
||||||
|
{
|
||||||
|
if (_TextColor.empty())
|
||||||
|
return TextColor;
|
||||||
|
return _TextColor.back();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Current global color flag
|
||||||
|
std::vector<bool> _GlobalColor;
|
||||||
|
inline bool getGlobalColor() const
|
||||||
|
{
|
||||||
|
if (_GlobalColor.empty())
|
||||||
|
return false;
|
||||||
|
return _GlobalColor.back();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Current font size
|
||||||
|
std::vector<uint> _FontSize;
|
||||||
|
inline uint getFontSize() const
|
||||||
|
{
|
||||||
|
if (_FontSize.empty())
|
||||||
|
return TextFontSize;
|
||||||
|
return _FontSize.back();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Current link
|
||||||
|
std::vector<std::string> _Link;
|
||||||
|
inline const char *getLink() const
|
||||||
|
{
|
||||||
|
if (_Link.empty())
|
||||||
|
return "";
|
||||||
|
return _Link.back().c_str();
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<std::string> _LinkTitle;
|
||||||
|
inline const char *getLinkTitle() const
|
||||||
|
{
|
||||||
|
if (_LinkTitle.empty())
|
||||||
|
return "";
|
||||||
|
return _LinkTitle.back().c_str();
|
||||||
|
}
|
||||||
|
std::vector<std::string> _LinkClass;
|
||||||
|
inline const char *getLinkClass() const
|
||||||
|
{
|
||||||
|
if (_LinkClass.empty())
|
||||||
|
return "";
|
||||||
|
return _LinkClass.back().c_str();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Divs (i.e. interface group)
|
||||||
|
std::vector<class CInterfaceGroup*> _Divs;
|
||||||
|
inline CInterfaceGroup *getDiv() const
|
||||||
|
{
|
||||||
|
if (_Divs.empty())
|
||||||
|
return NULL;
|
||||||
|
return _Divs.back();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Tables
|
||||||
|
std::vector<class CGroupTable*> _Tables;
|
||||||
|
inline CGroupTable *getTable() const
|
||||||
|
{
|
||||||
|
if (_Tables.empty())
|
||||||
|
return NULL;
|
||||||
|
return _Tables.back();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Cells
|
||||||
|
std::vector<class CGroupCell*> _Cells;
|
||||||
|
|
||||||
|
// TR
|
||||||
|
std::vector<bool> _TR;
|
||||||
|
inline bool getTR() const
|
||||||
|
{
|
||||||
|
if (_TR.empty())
|
||||||
|
return false;
|
||||||
|
return _TR.back();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Forms
|
||||||
|
class CForm
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
class CEntry
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CEntry ()
|
||||||
|
{
|
||||||
|
TextArea = NULL;
|
||||||
|
Checkbox = NULL;
|
||||||
|
ComboBox = NULL;
|
||||||
|
InitialSelection = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Variable name
|
||||||
|
std::string Name;
|
||||||
|
|
||||||
|
// Variable value
|
||||||
|
ucstring Value;
|
||||||
|
|
||||||
|
// Text area group
|
||||||
|
CInterfaceGroup *TextArea;
|
||||||
|
|
||||||
|
// Checkbox
|
||||||
|
CCtrlButton *Checkbox;
|
||||||
|
|
||||||
|
// Combobox group
|
||||||
|
CDBGroupComboBox *ComboBox;
|
||||||
|
|
||||||
|
// select values (for the <select> tag)
|
||||||
|
std::vector<std::string> SelectValues;
|
||||||
|
sint InitialSelection; // initial selection for the combo box
|
||||||
|
};
|
||||||
|
|
||||||
|
// The action the form has to perform
|
||||||
|
std::string Action;
|
||||||
|
|
||||||
|
// The text area associated with the form
|
||||||
|
std::vector<CEntry> Entries;
|
||||||
|
};
|
||||||
|
std::vector<CForm> _Forms;
|
||||||
|
std::vector<CInterfaceGroup *> _Groups;
|
||||||
|
|
||||||
|
// Cells parameters
|
||||||
|
class CCellParams
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CCellParams () : BgColor(0,0,0,0)
|
||||||
|
{
|
||||||
|
Align = CGroupCell::Left;
|
||||||
|
VAlign = CGroupCell::Top;
|
||||||
|
LeftMargin = 0;
|
||||||
|
NoWrap = false;
|
||||||
|
}
|
||||||
|
NLMISC::CRGBA BgColor;
|
||||||
|
std::string Style;
|
||||||
|
CGroupCell::TAlign Align;
|
||||||
|
CGroupCell::TVAlign VAlign;
|
||||||
|
sint32 LeftMargin;
|
||||||
|
bool NoWrap;
|
||||||
|
};
|
||||||
|
std::vector<CCellParams> _CellParams;
|
||||||
|
|
||||||
|
// Indentation
|
||||||
|
uint _Indent;
|
||||||
|
|
||||||
|
// Current node is a title
|
||||||
|
bool _Title;
|
||||||
|
|
||||||
|
// Current node must be localized
|
||||||
|
bool _Localize;
|
||||||
|
|
||||||
|
// Current node is a text area
|
||||||
|
bool _TextArea;
|
||||||
|
std::string _TextAreaTemplate;
|
||||||
|
ucstring _TextAreaContent;
|
||||||
|
std::string _TextAreaName;
|
||||||
|
uint _TextAreaRow;
|
||||||
|
uint _TextAreaCols;
|
||||||
|
|
||||||
|
// current mode is in select option
|
||||||
|
bool _SelectOption;
|
||||||
|
ucstring _SelectOptionStr;
|
||||||
|
|
||||||
|
// Current node is a object
|
||||||
|
std::string _ObjectType;
|
||||||
|
std::string _ObjectData;
|
||||||
|
std::string _ObjectMD5Sum;
|
||||||
|
std::string _ObjectAction;
|
||||||
|
std::string _TextAreaScript;
|
||||||
|
|
||||||
|
// Get last char
|
||||||
|
ucchar getLastChar() const;
|
||||||
|
|
||||||
|
// Current link view
|
||||||
|
class CViewLink *_CurrentViewLink;
|
||||||
|
class CViewBitmap *_CurrentViewImage;
|
||||||
|
|
||||||
|
// Current group table
|
||||||
|
class CGroupCell *_CurrentCell;
|
||||||
|
|
||||||
|
// The main group
|
||||||
|
class CGroupListAdaptor *_GroupListAdaptor;
|
||||||
|
|
||||||
|
// For auto selecting the node in a BrowseTree bound to this HTML web page
|
||||||
|
std::string _BrowseTree;
|
||||||
|
// select the tree node that has the correct url
|
||||||
|
const std::string &selectTreeNodeRecurs(CGroupTree::SNode *node, const std::string &url);
|
||||||
|
// search if the action / params match the url. look recurs into procedures
|
||||||
|
bool actionLaunchUrlRecurs(const std::string &ah, const std::string ¶ms, const std::string &url);
|
||||||
|
|
||||||
|
// Browse undo and redo
|
||||||
|
enum {MaxUrlUndoRedo= 256};
|
||||||
|
std::string _BrowseUndoButton;
|
||||||
|
std::string _BrowseRedoButton;
|
||||||
|
std::string _BrowseRefreshButton;
|
||||||
|
// _BrowseUrl is different from _URL, in that _URL may change in handle()
|
||||||
|
std::string _AskedUrl;
|
||||||
|
std::deque<std::string> _BrowseUndo;
|
||||||
|
std::deque<std::string> _BrowseRedo;
|
||||||
|
void pushUrlUndoRedo(const std::string &url);
|
||||||
|
void doBrowse(const char *url);
|
||||||
|
void updateUndoRedoButtons();
|
||||||
|
void updateRefreshButton();
|
||||||
|
|
||||||
|
// For Killing request. Associate each CGroupHTML object with a unique ID.
|
||||||
|
uint32 _GroupHtmlUID;
|
||||||
|
static uint32 _GroupHtmlUIDPool;
|
||||||
|
typedef std::map<uint32, NLMISC::CRefPtr<CGroupHTML> > TGroupHtmlByUIDMap;
|
||||||
|
static TGroupHtmlByUIDMap _GroupHtmlByUID;
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
// decode all HTML entities
|
||||||
|
static ucstring decodeHTMLEntities(const ucstring &str);
|
||||||
|
|
||||||
|
// ImageDownload system
|
||||||
|
enum TDataType {ImgType= 0, BnpType};
|
||||||
|
|
||||||
|
struct CDataDownload
|
||||||
|
{
|
||||||
|
CDataDownload(CURL *c, const std::string &u, FILE *f, TDataType t, CViewBase *i, const std::string &s, const std::string &m) : curl(c), url(u), luaScript(s), md5sum(m), type(t), fp(f)
|
||||||
|
{
|
||||||
|
if (t == ImgType) imgs.push_back(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
CURL *curl;
|
||||||
|
std::string url;
|
||||||
|
std::string luaScript;
|
||||||
|
std::string md5sum;
|
||||||
|
TDataType type;
|
||||||
|
FILE *fp;
|
||||||
|
std::vector<CViewBase *> imgs;
|
||||||
|
};
|
||||||
|
|
||||||
|
std::vector<CDataDownload> Curls;
|
||||||
|
CURLM *MultiCurl;
|
||||||
|
int RunningCurls;
|
||||||
|
|
||||||
|
void initImageDownload();
|
||||||
|
void checkImageDownload();
|
||||||
|
void addImageDownload(const std::string &url, CViewBase *img);
|
||||||
|
std::string localImageName(const std::string &url);
|
||||||
|
|
||||||
|
bool isTrustedDomain(const std::string &domain);
|
||||||
|
void setImage(CViewBase *view, const std::string &file);
|
||||||
|
|
||||||
|
// BnpDownload system
|
||||||
|
void initBnpDownload();
|
||||||
|
void checkBnpDownload();
|
||||||
|
bool addBnpDownload(const std::string &url, const std::string &action, const std::string &script, const std::string &md5sum);
|
||||||
|
std::string localBnpName(const std::string &url);
|
||||||
|
|
||||||
|
void releaseDownloads();
|
||||||
|
void checkDownloads();
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
// adapter group that store y offset for inputs inside an html form
|
||||||
|
class CGroupHTMLInputOffset : public CInterfaceGroup
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
sint32 Offset;
|
||||||
|
CGroupHTMLInputOffset(const TCtorParam ¶m);
|
||||||
|
xmlNodePtr serialize( xmlNodePtr parentNode, const char *type ) const;
|
||||||
|
virtual bool parse (xmlNodePtr cur, CInterfaceGroup *parentGroup);
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1,270 @@
|
|||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef NL_GROUP_LIST_H
|
||||||
|
#define NL_GROUP_LIST_H
|
||||||
|
|
||||||
|
#include "nel/misc/types_nl.h"
|
||||||
|
#include "nel/gui/group_frame.h"
|
||||||
|
#include "nel/gui/view_text.h"
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
class CGroupList : public CInterfaceGroup
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
enum EAlign
|
||||||
|
{
|
||||||
|
Bottom = 0,
|
||||||
|
Top,
|
||||||
|
Left,
|
||||||
|
Right
|
||||||
|
};
|
||||||
|
|
||||||
|
///constructor
|
||||||
|
CGroupList(const TCtorParam ¶m);
|
||||||
|
|
||||||
|
// dtor
|
||||||
|
~CGroupList();
|
||||||
|
/**
|
||||||
|
* add a child element to the group at the last position
|
||||||
|
* 'order' of the element is set to the last order + 1
|
||||||
|
* \param child : pointer to the child element
|
||||||
|
*/
|
||||||
|
void addChild (CViewBase* child, bool deleteOnRemove=true);
|
||||||
|
|
||||||
|
|
||||||
|
/** add a child before the element at the given index.
|
||||||
|
* 'order' of the element is set to 0
|
||||||
|
* \return true if there was enough room for that child
|
||||||
|
*/
|
||||||
|
bool addChildAtIndex(CViewBase *child, uint index, bool deleteOnRemove = true);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* add a text child element to the group, using the text template
|
||||||
|
* \param line : text to be added
|
||||||
|
* \param color : text color
|
||||||
|
*/
|
||||||
|
void addTextChild (const ucstring& line,const NLMISC::CRGBA &textColor, bool multiLine = true);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* add a text child element to the group, using the text template
|
||||||
|
* \param line : text to be added
|
||||||
|
*/
|
||||||
|
void addTextChild (const ucstring& line, bool multiLine = true);
|
||||||
|
|
||||||
|
/// Same as adding a text child but the text will be taken from the string manager
|
||||||
|
void addTextChildID (uint32 id, bool multiLine = true);
|
||||||
|
// the same, but with id taken from the database
|
||||||
|
void addTextChildID (const std::string &dbPath, bool multiLine = true);
|
||||||
|
|
||||||
|
|
||||||
|
bool delChild (CViewBase* child, bool noWarning=false, bool forceDontDelete = false);
|
||||||
|
|
||||||
|
bool delChild(uint index, bool forceDontDelete = false);
|
||||||
|
|
||||||
|
CViewBase *getChild(uint index) const { return _Elements[index].Element; }
|
||||||
|
int luaGetChild(CLuaState &ls);
|
||||||
|
|
||||||
|
void deleteAllChildren();
|
||||||
|
|
||||||
|
void removeHead();
|
||||||
|
|
||||||
|
// Get the number of children
|
||||||
|
uint getNumChildren() const { return (uint)_Elements.size(); }
|
||||||
|
|
||||||
|
// Get the number of active children
|
||||||
|
uint getNumActiveChildren() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* set the template that will be used to add text;
|
||||||
|
* \templ : a CViewText object. Only its font size, color and shadow are required.
|
||||||
|
*/
|
||||||
|
void setTextTemplate(const CViewText& templ);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* set the template that will be used to add text;
|
||||||
|
* \templ : a CViewText object. Only its font size, color and shadow are required.
|
||||||
|
*/
|
||||||
|
CViewText * getTextTemplatePtr()
|
||||||
|
{
|
||||||
|
return &_Templ;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string getProperty( const std::string &name ) const;
|
||||||
|
void setProperty( const std::string &name, const std::string &value );
|
||||||
|
xmlNodePtr serialize( xmlNodePtr parentNode, const char *type ) const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* parse the element and initalize it
|
||||||
|
* \paral cur : pointer to the node describing this element
|
||||||
|
* \param parentGroup : the parent group of this element
|
||||||
|
* \return true if success
|
||||||
|
*/
|
||||||
|
virtual bool parse (xmlNodePtr cur, CInterfaceGroup * parentGroup);
|
||||||
|
//virtual uint32 getMemory();
|
||||||
|
/**
|
||||||
|
* init or reset the children element coords. Orverloaded from CInterfaceGroup because we begin with the last inserted element here
|
||||||
|
*/
|
||||||
|
virtual void updateCoords();
|
||||||
|
|
||||||
|
virtual void draw();
|
||||||
|
|
||||||
|
virtual bool handleEvent (const NLGUI::CEventDescriptor& eventDesc);
|
||||||
|
|
||||||
|
virtual void clearViews();
|
||||||
|
virtual void clearControls();
|
||||||
|
virtual void clearGroups();
|
||||||
|
|
||||||
|
void setSpace (sint32 s) { _Space = s; }
|
||||||
|
|
||||||
|
virtual CInterfaceElement* getElement (const std::string &id)
|
||||||
|
{ return CInterfaceGroup::getElement (id); }
|
||||||
|
|
||||||
|
sint32 getNbElement() { return (sint32)_Elements.size(); }
|
||||||
|
sint32 getSpace() { return _Space; }
|
||||||
|
|
||||||
|
void setDynamicDisplaySize (bool dds) { _DynamicDisplaySize = dds; }
|
||||||
|
bool getDynamicDisplaySize() { return _DynamicDisplaySize; }
|
||||||
|
|
||||||
|
void forceSizeW (sint32 newSizeW);
|
||||||
|
void forceSizeH (sint32 newSizeH);
|
||||||
|
|
||||||
|
void setMinW(sint32 minW);
|
||||||
|
void setMinH(sint32 minH);
|
||||||
|
sint32 getMinW() const {return _MinW;}
|
||||||
|
sint32 getMinH() const {return _MinH;}
|
||||||
|
|
||||||
|
// set the rank for the element at the given index (used to reinsert container after they have been turned into popups)
|
||||||
|
void setOrder(uint index, uint order) { _Elements[index].Order = order; }
|
||||||
|
uint getOrder(uint index) const { return _Elements[index].Order; }
|
||||||
|
|
||||||
|
// get element of index or -1 if not found
|
||||||
|
sint32 getElementIndex(CViewBase* child) const;
|
||||||
|
int luaGetElementIndex(CLuaState &ls);
|
||||||
|
|
||||||
|
// swap 2 entries in the list (and also their orders)
|
||||||
|
void swapChildren(uint index1, uint index2);
|
||||||
|
int luaUpChild(CLuaState &ls);
|
||||||
|
int luaDownChild(CLuaState &ls);
|
||||||
|
|
||||||
|
// deleteOnRemove flag
|
||||||
|
void setDelOnRemove(uint index, bool delOnRemove);
|
||||||
|
bool getDelOnRemove(uint index) const;
|
||||||
|
|
||||||
|
// children number
|
||||||
|
void setChildrenNb(sint32 /* val */){}
|
||||||
|
sint32 getChildrenNb() const {return (sint32)_Elements.size();}
|
||||||
|
|
||||||
|
int luaAddChild(CLuaState &ls);
|
||||||
|
int luaAddChildAtIndex(CLuaState &ls);
|
||||||
|
int luaDetachChild(CLuaState &ls);
|
||||||
|
int luaClear(CLuaState &ls); // synonimous for deleteAllChildren
|
||||||
|
int luaAddTextChild(CLuaState &ls);
|
||||||
|
int luaAddColoredTextChild(CLuaState &ls);
|
||||||
|
int luaDelChild(CLuaState &ls);
|
||||||
|
|
||||||
|
REFLECT_EXPORT_START(CGroupList, CInterfaceGroup)
|
||||||
|
REFLECT_LUA_METHOD("addTextChild", luaAddTextChild)
|
||||||
|
REFLECT_LUA_METHOD("addColoredTextChild", luaAddColoredTextChild)
|
||||||
|
REFLECT_LUA_METHOD("addChild", luaAddChild);
|
||||||
|
REFLECT_LUA_METHOD("addChildAtIndex", luaAddChildAtIndex);
|
||||||
|
REFLECT_LUA_METHOD("detachChild", luaDetachChild);
|
||||||
|
REFLECT_LUA_METHOD("clear", luaClear);
|
||||||
|
REFLECT_LUA_METHOD("delChild", luaDelChild);
|
||||||
|
REFLECT_LUA_METHOD("upChild", luaUpChild);
|
||||||
|
REFLECT_LUA_METHOD("downChild", luaDownChild);
|
||||||
|
REFLECT_LUA_METHOD("getChild", luaGetChild);
|
||||||
|
REFLECT_LUA_METHOD("getElementIndex", luaGetElementIndex);
|
||||||
|
REFLECT_SINT32 ("childrenNb", getChildrenNb, setChildrenNb);
|
||||||
|
REFLECT_EXPORT_END
|
||||||
|
|
||||||
|
|
||||||
|
protected:
|
||||||
|
std::string _HardText;
|
||||||
|
uint32 _TextId;
|
||||||
|
|
||||||
|
//max number of elements
|
||||||
|
sint32 _MaxElements;
|
||||||
|
|
||||||
|
// Where to add next element
|
||||||
|
EAlign _AddElt;
|
||||||
|
|
||||||
|
// Where to align the newly added element
|
||||||
|
EAlign _Align;
|
||||||
|
|
||||||
|
// Space between two elements in pixel
|
||||||
|
sint32 _Space;
|
||||||
|
|
||||||
|
// Text template
|
||||||
|
CViewText _Templ;
|
||||||
|
|
||||||
|
// Current id of the view
|
||||||
|
sint32 _IdCounter;
|
||||||
|
|
||||||
|
// Used for context menu to display the same size as the whole content
|
||||||
|
bool _DynamicDisplaySize;
|
||||||
|
|
||||||
|
// Do we have a color under the element pointed by the mouse
|
||||||
|
bool _Over;
|
||||||
|
|
||||||
|
// If over is true so we have a color
|
||||||
|
NLMISC::CRGBA _OverColor;
|
||||||
|
|
||||||
|
// Current elt over the pointer
|
||||||
|
sint32 _OverElt;
|
||||||
|
|
||||||
|
struct CElementInfo
|
||||||
|
{
|
||||||
|
uint Order; // Used to sort the window by their insertion order.
|
||||||
|
// This is used to put back a window at the right place if it was turned into a popup.
|
||||||
|
CViewBase *Element;
|
||||||
|
bool EltDeleteOnRemove;
|
||||||
|
};
|
||||||
|
friend struct CRemoveViewPred;
|
||||||
|
friend struct CRemoveCtrlPred;
|
||||||
|
friend struct CRemoveGroupPred;
|
||||||
|
|
||||||
|
// The list is forced to be at least this size in updateCoords().
|
||||||
|
sint32 _MinW;
|
||||||
|
sint32 _MinH;
|
||||||
|
|
||||||
|
|
||||||
|
// To conserve elements in the order they have been added
|
||||||
|
// (the element drawn are stored in _views, _contrlos or _childrengroups of cinterfacegroup
|
||||||
|
std::vector<CElementInfo> _Elements;
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
void setHSGroup (CViewBase *child, EAlign addElt, EAlign align);
|
||||||
|
void setHSParent(CViewBase *view, EAlign addElt, EAlign align, uint space);
|
||||||
|
void setupSizes();
|
||||||
|
void onTextChanged();
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // NL_GROUP_LIST_H
|
||||||
|
|
||||||
|
/* End of group_list.h */
|
||||||
|
|
||||||
|
|
@ -0,0 +1,401 @@
|
|||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef RZ_GROUP_MENU_H
|
||||||
|
#define RZ_GROUP_MENU_H
|
||||||
|
|
||||||
|
#include "nel/gui/interface_group.h"
|
||||||
|
#include "nel/gui/group_modal.h"
|
||||||
|
#include "nel/gui/group_submenu_base.h"
|
||||||
|
#include "nel/gui/view_text.h"
|
||||||
|
#include "nel/gui/ctrl_text_button.h"
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
class CCtrlScroll;
|
||||||
|
class CViewBitmap;
|
||||||
|
class CGroupList;
|
||||||
|
class CGroupMenu;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* CViewTextMenu is an element of a sub menu
|
||||||
|
* \author Matthieu 'TrapII' Besson
|
||||||
|
* \author Nevrax France
|
||||||
|
* \date 2002
|
||||||
|
*/
|
||||||
|
class CViewTextMenu : public CViewText
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
CViewTextMenu(const TCtorParam ¶m) : CViewText(param)
|
||||||
|
{
|
||||||
|
_Grayed = false;
|
||||||
|
_Checked = false;
|
||||||
|
_Checkable = false;
|
||||||
|
_CheckBox = NULL;
|
||||||
|
Over = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool getGrayed() const;
|
||||||
|
void setGrayed (bool g);
|
||||||
|
bool getChecked() const { return _Checked; }
|
||||||
|
void setChecked(bool c);
|
||||||
|
bool getCheckable() const { return _Checkable; }
|
||||||
|
void setCheckable(bool c);
|
||||||
|
void setCheckBox(CViewBitmap *checkBox) { _CheckBox = checkBox; }
|
||||||
|
CViewBitmap * getCheckBox() const { return _CheckBox; }
|
||||||
|
bool getFormatted () const { return getMultiLine (); }
|
||||||
|
|
||||||
|
virtual sint32 getAlpha() const;
|
||||||
|
virtual void setAlpha (sint32 a);
|
||||||
|
|
||||||
|
REFLECT_EXPORT_START(CViewTextMenu, CViewText)
|
||||||
|
REFLECT_BOOL("grayed", getGrayed, setGrayed);
|
||||||
|
REFLECT_BOOL("checked", getChecked, setChecked);
|
||||||
|
REFLECT_EXPORT_END
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
bool Over;
|
||||||
|
NLMISC::CRGBA OldColor;
|
||||||
|
NLMISC::CRGBA OldShadowColor;
|
||||||
|
NLMISC::CRGBA OldColorOver;
|
||||||
|
NLMISC::CRGBA OldShadowColorOver;
|
||||||
|
NLMISC::CRGBA OldColorGrayed;
|
||||||
|
NLMISC::CRGBA OldShadowColorGrayed;
|
||||||
|
|
||||||
|
private:
|
||||||
|
CViewBitmap *_CheckBox;
|
||||||
|
bool _Grayed;
|
||||||
|
bool _Checked;
|
||||||
|
bool _Checkable;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* CGroupSubMenu describe an element of a contextual menu (contains text lines and sub menu)
|
||||||
|
* \author Matthieu 'TrapII' Besson
|
||||||
|
* \author Nevrax France
|
||||||
|
* \date 2002
|
||||||
|
*/
|
||||||
|
|
||||||
|
class CGroupSubMenu : public CGroupSubMenuBase
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
CGroupSubMenu(const TCtorParam ¶m);
|
||||||
|
virtual ~CGroupSubMenu();
|
||||||
|
|
||||||
|
virtual bool parse (xmlNodePtr cur, CInterfaceGroup *parent=NULL);
|
||||||
|
|
||||||
|
virtual void checkCoords();
|
||||||
|
|
||||||
|
virtual void updateCoords ();
|
||||||
|
|
||||||
|
virtual void draw ();
|
||||||
|
|
||||||
|
virtual bool handleEvent (const NLGUI::CEventDescriptor &eventDesc);
|
||||||
|
|
||||||
|
virtual CInterfaceElement* getElement (const std::string &id);
|
||||||
|
|
||||||
|
// retrieve the index of a line from its id (-1 if not found)
|
||||||
|
sint getLineFromId(const std::string &id);
|
||||||
|
|
||||||
|
CViewTextMenu* addLine (const ucstring &name, const std::string &ah,
|
||||||
|
const std::string ¶ms, const std::string &id="",
|
||||||
|
const std::string &cond = std::string(), const std::string &texture="",
|
||||||
|
bool checkable = false, bool checked = false, bool formatted = false
|
||||||
|
);
|
||||||
|
CViewTextMenu* addLineAtIndex(uint index, const ucstring &name, const std::string &ah,
|
||||||
|
const std::string ¶ms, const std::string &id="",
|
||||||
|
const std::string &cond = std::string(), const std::string &texture="",
|
||||||
|
bool checkable = false, bool checked = false, bool formatted = false
|
||||||
|
);
|
||||||
|
void addSeparator(const std::string &id = "");
|
||||||
|
void addSeparatorAtIndex(uint index, const std::string &id = "");
|
||||||
|
|
||||||
|
|
||||||
|
uint getNumLine() const { return (uint)_Lines.size(); }
|
||||||
|
void removeLine(uint index);
|
||||||
|
const std::string getActionHandler(uint lineIndex) const;
|
||||||
|
const std::string getActionHandlerParam(uint lineIndex) const;
|
||||||
|
|
||||||
|
void openSubMenu (sint32 nb);
|
||||||
|
|
||||||
|
void hideSubMenus ();
|
||||||
|
|
||||||
|
// reset all entries of the sub menu
|
||||||
|
void reset();
|
||||||
|
|
||||||
|
virtual void setActive (bool state);
|
||||||
|
|
||||||
|
// Tell if the line is a separator or not
|
||||||
|
bool isSeparator (uint i) const;
|
||||||
|
|
||||||
|
/** Set a user defined group at the given line
|
||||||
|
* 'ownership' tells whether this menu should remove the group when it is deleted
|
||||||
|
* Setting a user group on a line with a separator is illegal
|
||||||
|
*/
|
||||||
|
void setUserGroupRight(uint line, CInterfaceGroup *group, bool ownership);
|
||||||
|
CInterfaceGroup *getUserGroupRight(uint line) const;
|
||||||
|
//
|
||||||
|
void setUserGroupLeft(uint line, CInterfaceGroup *group, bool ownership);
|
||||||
|
CInterfaceGroup *getUserGroupLeft(uint line) const;
|
||||||
|
|
||||||
|
void removeAllUserGroups();
|
||||||
|
|
||||||
|
uint getNumLines() const { return (uint)_Lines.size(); }
|
||||||
|
|
||||||
|
// return pointer to submenu or NULL if there's none
|
||||||
|
CGroupSubMenu *getSubMenu(uint index) const;
|
||||||
|
void setSubMenu(uint index, CGroupSubMenu *sub);
|
||||||
|
|
||||||
|
// if a menu isn't selectable, can't click on it, and there's no selection when the mouse is over it (but can click on its widgets, such as a usergroup)
|
||||||
|
void setSelectable(uint lineIndex, bool selectable);
|
||||||
|
bool getSelectable(uint lineIndex) const;
|
||||||
|
|
||||||
|
// Gray a line.
|
||||||
|
void setGrayedLine(uint line, bool g);
|
||||||
|
|
||||||
|
// Hide a line.
|
||||||
|
void setHiddenLine(uint line, bool h);
|
||||||
|
|
||||||
|
// Max Visible Line (-1 == no limit)
|
||||||
|
void setMaxVisibleLine(sint32 mvl);
|
||||||
|
sint32 getMaxVisibleLine() { return _MaxVisibleLine; }
|
||||||
|
|
||||||
|
// Get the Line Id (not the full Id)
|
||||||
|
const std::string &getLineId(uint index);
|
||||||
|
|
||||||
|
int luaGetNumLine(CLuaState &ls);
|
||||||
|
int luaGetSubMenu(CLuaState &ls);
|
||||||
|
int luaAddSubMenu(CLuaState &ls);
|
||||||
|
int luaGetLineId(CLuaState &ls);
|
||||||
|
int luaGetLineFromId(CLuaState &ls);
|
||||||
|
int luaIsSeparator(CLuaState &ls);
|
||||||
|
int luaAddLine(CLuaState &ls);
|
||||||
|
int luaAddLineAtIndex(CLuaState &ls);
|
||||||
|
int luaAddSeparator(CLuaState &ls);
|
||||||
|
int luaAddSeparatorAtIndex(CLuaState &ls);
|
||||||
|
int luaRemoveLine(CLuaState &ls);
|
||||||
|
int luaSetUserGroupRight(CLuaState &ls);
|
||||||
|
int luaGetUserGroupRight(CLuaState &ls);
|
||||||
|
int luaSetUserGroupLeft(CLuaState &ls);
|
||||||
|
int luaGetUserGroupLeft(CLuaState &ls);
|
||||||
|
int luaReset(CLuaState &ls);
|
||||||
|
int luaSetMaxVisibleLine(CLuaState &ls);
|
||||||
|
//
|
||||||
|
REFLECT_EXPORT_START(CGroupSubMenu, CGroupSubMenuBase)
|
||||||
|
REFLECT_LUA_METHOD("getNumLine", luaGetNumLine);
|
||||||
|
REFLECT_LUA_METHOD("getLineId", luaGetLineId); // return the id of a line from its index
|
||||||
|
REFLECT_LUA_METHOD("getLineFromId", luaGetLineFromId); // return -1 if line with id is not found
|
||||||
|
REFLECT_LUA_METHOD("getSubMenu", luaGetSubMenu);
|
||||||
|
REFLECT_LUA_METHOD("addSubMenu", luaAddSubMenu);
|
||||||
|
REFLECT_LUA_METHOD("isSeparator", luaIsSeparator);
|
||||||
|
REFLECT_LUA_METHOD("addLine", luaAddLine); // name, ah, ah_params, id
|
||||||
|
REFLECT_LUA_METHOD("addLineAtIndex", luaAddLineAtIndex); // index, name, ah, ah_params, id
|
||||||
|
REFLECT_LUA_METHOD("addSeparator", luaAddSeparator);
|
||||||
|
REFLECT_LUA_METHOD("addSeparatorAtIndex", luaAddSeparatorAtIndex);
|
||||||
|
REFLECT_LUA_METHOD("removeLine", luaRemoveLine);
|
||||||
|
REFLECT_LUA_METHOD("reset", luaReset);
|
||||||
|
REFLECT_LUA_METHOD("setUserGroupRight", luaSetUserGroupRight); // line, group ptr
|
||||||
|
REFLECT_LUA_METHOD("getUserGroupRight", luaGetUserGroupRight); // line
|
||||||
|
REFLECT_LUA_METHOD("setUserGroupLeft", luaSetUserGroupLeft); // line, group ptr
|
||||||
|
REFLECT_LUA_METHOD("getUserGroupLeft", luaGetUserGroupLeft);// line
|
||||||
|
REFLECT_LUA_METHOD("setMaxVisibleLine", luaSetMaxVisibleLine);
|
||||||
|
REFLECT_EXPORT_END
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
struct SSubMenuEntry
|
||||||
|
{
|
||||||
|
CViewTextMenu *ViewText; // Backup of the children that are in grouplist
|
||||||
|
CInterfaceGroup *Separator;
|
||||||
|
std::string AHName;
|
||||||
|
std::string AHParams;
|
||||||
|
std::string Id;
|
||||||
|
std::string Cond; // condition to know if the entry is grayed
|
||||||
|
CViewBitmap *CheckBox;
|
||||||
|
CViewBitmap *RightArrow;
|
||||||
|
CInterfaceGroup *UserGroupRight; // not for separator, inserted before checkbox & submenu arrow
|
||||||
|
CInterfaceGroup *UserGroupLeft;
|
||||||
|
bool UserGroupRightOwnership;
|
||||||
|
bool UserGroupLeftOwnership;
|
||||||
|
bool Selectable;
|
||||||
|
sint32 HReal; // max H of the view text and the other user group
|
||||||
|
sint32 TextDY; // Y of the view text to set
|
||||||
|
SSubMenuEntry()
|
||||||
|
{
|
||||||
|
ViewText = NULL;
|
||||||
|
Separator = NULL;
|
||||||
|
CheckBox = NULL;
|
||||||
|
RightArrow = NULL;
|
||||||
|
UserGroupRight = NULL;
|
||||||
|
UserGroupLeft = NULL;
|
||||||
|
UserGroupRightOwnership = false;
|
||||||
|
Selectable = true;
|
||||||
|
HReal= 0;
|
||||||
|
TextDY= 0;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
CGroupList *_GroupList;
|
||||||
|
CCtrlScroll *_ScrollBar;
|
||||||
|
CViewBitmap *_SelectionView;
|
||||||
|
std::vector<SSubMenuEntry> _Lines;
|
||||||
|
std::vector<CGroupSubMenu*> _SubMenus;
|
||||||
|
|
||||||
|
CGroupMenu *_GroupMenu; // Master parent
|
||||||
|
sint32 _Selected;
|
||||||
|
|
||||||
|
sint32 _MaxVisibleLine; // -1 == no limit
|
||||||
|
|
||||||
|
friend class CGroupMenu;
|
||||||
|
private:
|
||||||
|
/** Clone this menu, and set its new father
|
||||||
|
* If appendToMenu is NULL, the menu is just copied
|
||||||
|
* otherwise, no copy is made, but this menu entries are appended to the already created 'appendMenu' menu.
|
||||||
|
* NB : user groups are not duplicated
|
||||||
|
*/
|
||||||
|
CGroupSubMenu *cloneMenu(CGroupSubMenu *appendToMenu, CGroupMenu *newFather, CInterfaceGroup *initGroup = NULL) const;
|
||||||
|
void initOptions(CInterfaceGroup *parent);
|
||||||
|
CViewBitmap *createCheckBox(bool checked);
|
||||||
|
CViewBitmap *createRightArrow(CInterfaceElement *parentPos, bool center);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* class describing a menu composed of one or more CGroupListSubMenu
|
||||||
|
* \author Matthieu 'TrapII' Besson
|
||||||
|
* \author Nevrax France
|
||||||
|
* \date 2002
|
||||||
|
*/
|
||||||
|
class CGroupMenu : public CGroupModal
|
||||||
|
{
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
CGroupMenu(const TCtorParam ¶m);
|
||||||
|
virtual ~CGroupMenu();
|
||||||
|
|
||||||
|
TCaseMode getCaseMode() { return _CaseMode; }
|
||||||
|
|
||||||
|
std::string getProperty( const std::string &name ) const;
|
||||||
|
void setProperty( const std::string &name, const std::string &value );
|
||||||
|
xmlNodePtr serialize( xmlNodePtr parentNode, const char *type ) const;
|
||||||
|
|
||||||
|
virtual bool parse (xmlNodePtr cur, CInterfaceGroup *parentGroup);
|
||||||
|
|
||||||
|
virtual void draw ();
|
||||||
|
|
||||||
|
void recurseDraw(CGroupSubMenu *pSubMenu);
|
||||||
|
|
||||||
|
virtual bool handleEvent (const NLGUI::CEventDescriptor &eventDesc);
|
||||||
|
|
||||||
|
virtual CInterfaceElement* getElement (const std::string &id);
|
||||||
|
|
||||||
|
virtual void setActive (bool state);
|
||||||
|
|
||||||
|
virtual bool isWindowUnder (sint32 x, sint32 y);
|
||||||
|
|
||||||
|
// add line with a string, for backward compatibility
|
||||||
|
void addLine (const std::string &name, const std::string &ah, const std::string ¶ms,
|
||||||
|
const std::string &id = std::string(),
|
||||||
|
const std::string &cond = std::string(), const std::string &texture="",
|
||||||
|
bool checkable = false, bool checked = false);
|
||||||
|
uint getNumLine() const;
|
||||||
|
void deleteLine(uint index);
|
||||||
|
const std::string getActionHandler(uint lineIndex) const;
|
||||||
|
const std::string getActionHandlerParam(uint lineIndex) const;
|
||||||
|
|
||||||
|
|
||||||
|
void addLine (const ucstring &name, const std::string &ah = "", const std::string ¶ms = "",
|
||||||
|
const std::string &id = std::string(),
|
||||||
|
const std::string &cond = std::string(), const std::string &texture="",
|
||||||
|
bool checkable = false, bool checked = false
|
||||||
|
);
|
||||||
|
void addLineAtIndex (uint index, const ucstring &name, const std::string &ah = "", const std::string ¶ms = "",
|
||||||
|
const std::string &id = std::string(),
|
||||||
|
const std::string &cond = std::string(), const std::string &texture="",
|
||||||
|
bool checkable = false, bool checked = false
|
||||||
|
);
|
||||||
|
void setUserGroupRight(uint line, CInterfaceGroup *gr, bool ownerShip = true);
|
||||||
|
void setUserGroupLeft(uint line, CInterfaceGroup *gr, bool ownerShip = true);
|
||||||
|
|
||||||
|
// clear all sub menus
|
||||||
|
void reset ();
|
||||||
|
|
||||||
|
// set the minW of the RootMenu.
|
||||||
|
void setMinW(sint32 minW);
|
||||||
|
|
||||||
|
// Gray a line on the RootMenu
|
||||||
|
void setGrayedLine(uint line, bool g);
|
||||||
|
|
||||||
|
CGroupSubMenu *getRootMenu() const { return _RootMenu; }
|
||||||
|
|
||||||
|
// Max Visible Line (-1 == no limit)
|
||||||
|
void setMaxVisibleLine(sint32 mvl) { _RootMenu->setMaxVisibleLine(mvl); }
|
||||||
|
sint32 getMaxVisibleLine() { return _RootMenu->getMaxVisibleLine(); }
|
||||||
|
|
||||||
|
// special for menu launched from a modal....
|
||||||
|
bool getCloseSubMenuUsingPopModal() const {return _CloseSubMenuUsingPopModal;}
|
||||||
|
void setCloseSubMenuUsingPopModal(bool state) {_CloseSubMenuUsingPopModal= state;}
|
||||||
|
|
||||||
|
int luaGetRootMenu(CLuaState &ls);
|
||||||
|
int luaSetMinW(CLuaState &ls);
|
||||||
|
|
||||||
|
REFLECT_EXPORT_START(CGroupMenu, CGroupModal)
|
||||||
|
REFLECT_LUA_METHOD("getRootMenu", luaGetRootMenu);
|
||||||
|
REFLECT_LUA_METHOD("setMinW", luaSetMinW);
|
||||||
|
REFLECT_EXPORT_END
|
||||||
|
|
||||||
|
protected:
|
||||||
|
TCaseMode _CaseMode;
|
||||||
|
|
||||||
|
CGroupSubMenu *_RootMenu;
|
||||||
|
|
||||||
|
std::string _Extends;
|
||||||
|
|
||||||
|
// Text lookup
|
||||||
|
NLMISC::CRGBA _Color;
|
||||||
|
NLMISC::CRGBA _ShadowColor;
|
||||||
|
|
||||||
|
bool _CloseSubMenuUsingPopModal;
|
||||||
|
bool _Shadow;
|
||||||
|
bool _Formatted;
|
||||||
|
uint8 _Space;
|
||||||
|
sint32 _FontSize;
|
||||||
|
|
||||||
|
NLMISC::CRGBA _ColorOver; // Color of the text when the mouse is over it
|
||||||
|
NLMISC::CRGBA _ShadowColorOver; // Color of the shadow when the mouse is over it
|
||||||
|
NLMISC::CRGBA _HighLightOver; // Background color of the selection
|
||||||
|
|
||||||
|
NLMISC::CRGBA _ColorGrayed; // Color of the text when it is unusable
|
||||||
|
NLMISC::CRGBA _ShadowColorGrayed; // Color of the shadow when it is unusable
|
||||||
|
|
||||||
|
friend class CGroupSubMenu;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // RZ_GROUP_MENU_H
|
||||||
|
|
||||||
|
/* End of group_menu.h */
|
||||||
|
|
||||||
|
|
@ -0,0 +1,77 @@
|
|||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef NL_GROUP_MODAL_H
|
||||||
|
#define NL_GROUP_MODAL_H
|
||||||
|
|
||||||
|
#include "nel/misc/types_nl.h"
|
||||||
|
#include "nel/gui/group_frame.h"
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
/**
|
||||||
|
* A group with special modal options
|
||||||
|
* \author Lionel Berenguier
|
||||||
|
* \author Nevrax France
|
||||||
|
* \date 2002
|
||||||
|
*/
|
||||||
|
class CGroupModal : public CGroupFrame
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
bool SpawnOnMousePos : 1;
|
||||||
|
bool ExitClickOut : 1;
|
||||||
|
bool ExitClickL : 1;
|
||||||
|
bool ExitClickR : 1;
|
||||||
|
bool ForceInsideScreen : 1;
|
||||||
|
bool ExitKeyPushed : 1;
|
||||||
|
sint32 SpawnMouseX, SpawnMouseY;
|
||||||
|
std::string Category;
|
||||||
|
|
||||||
|
std::string OnClickOut; // Launched when clicking out of the window, and BEFORE a new control has been cpatured
|
||||||
|
std::string OnClickOutParams;
|
||||||
|
std::string OnPostClickOut; // Launched when clicking out of the window, and AFTER a new control has been captured
|
||||||
|
std::string OnPostClickOutParams;
|
||||||
|
public:
|
||||||
|
|
||||||
|
/// Constructor
|
||||||
|
CGroupModal(const TCtorParam ¶m);
|
||||||
|
|
||||||
|
std::string getProperty( const std::string &name ) const;
|
||||||
|
void setProperty( const std::string &name, const std::string &value );
|
||||||
|
xmlNodePtr serialize( xmlNodePtr parentNode, const char *type ) const;
|
||||||
|
|
||||||
|
virtual bool parse (xmlNodePtr cur, CInterfaceGroup *parentGroup);
|
||||||
|
virtual void updateCoords ();
|
||||||
|
void setBaseX(sint32 x) { _MouseDeltaX = x;}
|
||||||
|
void setBaseY(sint32 y) { _MouseDeltaY = y;}
|
||||||
|
|
||||||
|
REFLECT_EXPORT_START(CGroupModal, CGroupFrame)
|
||||||
|
REFLECT_EXPORT_END
|
||||||
|
|
||||||
|
// ******************
|
||||||
|
protected:
|
||||||
|
sint32 _MouseDeltaX, _MouseDeltaY;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // NL_GROUP_MODAL_H
|
||||||
|
|
||||||
|
/* End of group_modal.h */
|
@ -0,0 +1,313 @@
|
|||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef NL_GROUP_PARAGRAPH_H
|
||||||
|
#define NL_GROUP_PARAGRAPH_H
|
||||||
|
|
||||||
|
#include "nel/misc/types_nl.h"
|
||||||
|
#include "nel/gui/group_frame.h"
|
||||||
|
#include "nel/gui/view_text.h"
|
||||||
|
#include "nel/gui/view_link.h"
|
||||||
|
#include "nel/gui/ctrl_button.h"
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
|
||||||
|
class CCtrlLink : public CCtrlButton
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CCtrlLink (const TCtorParam ¶m) : CCtrlButton(param)
|
||||||
|
{}
|
||||||
|
};
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
class CGroupParagraph : public CInterfaceGroup
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
enum EAlign
|
||||||
|
{
|
||||||
|
Bottom = 0,
|
||||||
|
Top,
|
||||||
|
Left,
|
||||||
|
Right
|
||||||
|
};
|
||||||
|
|
||||||
|
///constructor
|
||||||
|
CGroupParagraph(const TCtorParam ¶m);
|
||||||
|
|
||||||
|
// dtor
|
||||||
|
~CGroupParagraph();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* add a child element to the group at the last position
|
||||||
|
* 'order' of the element is set to the last order + 1
|
||||||
|
* \param child : pointer to the child element
|
||||||
|
*/
|
||||||
|
void addChild (CViewBase* child, bool deleteOnRemove=true);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* add a link element to the group at the last position
|
||||||
|
* \param child : pointer to the child element
|
||||||
|
*/
|
||||||
|
void addChildLink (CViewLink* child, bool deleteOnRemove=true);
|
||||||
|
|
||||||
|
/** add a child before the element at the given index.
|
||||||
|
* 'order' of the element is set to 0
|
||||||
|
* \return true if there was enough room for that child
|
||||||
|
*/
|
||||||
|
bool addChildAtIndex(CViewBase *child, uint index, bool deleteOnRemove = true);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* add a text child element to the group, using the text template
|
||||||
|
* \param line : text to be added
|
||||||
|
* \param color : text color
|
||||||
|
*/
|
||||||
|
void addTextChild (const ucstring& line,const NLMISC::CRGBA &textColor, bool multiLine = true);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* add a text child element to the group, using the text template
|
||||||
|
* \param line : text to be added
|
||||||
|
*/
|
||||||
|
void addTextChild (const ucstring& line, bool multiLine = true);
|
||||||
|
|
||||||
|
/// Same as adding a text child but the text will be taken from the string manager
|
||||||
|
void addTextChildID (uint32 id, bool multiLine = true);
|
||||||
|
// the same, but with id taken from the database
|
||||||
|
void addTextChildID (const std::string &dbPath, bool multiLine = true);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
void delChild (CViewBase* child);
|
||||||
|
|
||||||
|
void delChild(uint index);
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
CViewBase *getChild(uint index) const { return _Elements[index].Element; }
|
||||||
|
|
||||||
|
void deleteAllChildren();
|
||||||
|
|
||||||
|
// void removeHead();
|
||||||
|
|
||||||
|
// Get the number of children
|
||||||
|
uint getNumChildren() const { return (uint)_Elements.size(); }
|
||||||
|
|
||||||
|
// Get the number of active children
|
||||||
|
uint getNumActiveChildren() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* set the template that will be used to add text;
|
||||||
|
* \templ : a CViewText object. Only its font size, color and shadow are required.
|
||||||
|
*/
|
||||||
|
void setTextTemplate(const CViewText& templ);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* set the template that will be used to add text;
|
||||||
|
* \templ : a CViewText object. Only its font size, color and shadow are required.
|
||||||
|
*/
|
||||||
|
CViewText * getTextTemplatePtr()
|
||||||
|
{
|
||||||
|
return &_Templ;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string getProperty( const std::string &name ) const;
|
||||||
|
void setProperty( const std::string &name, const std::string &value );
|
||||||
|
xmlNodePtr serialize( xmlNodePtr parentNode, const char *type ) const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* parse the element and initalize it
|
||||||
|
* \paral cur : pointer to the node describing this element
|
||||||
|
* \param parentGroup : the parent group of this element
|
||||||
|
* \return true if success
|
||||||
|
*/
|
||||||
|
virtual bool parse (xmlNodePtr cur, CInterfaceGroup * parentGroup);
|
||||||
|
//virtual uint32 getMemory();
|
||||||
|
/**
|
||||||
|
* init or reset the children element coords. Orverloaded from CInterfaceGroup because we begin with the last inserted element here
|
||||||
|
*/
|
||||||
|
virtual void updateCoords();
|
||||||
|
|
||||||
|
virtual void checkCoords();
|
||||||
|
|
||||||
|
virtual void draw();
|
||||||
|
|
||||||
|
virtual bool handleEvent (const NLGUI::CEventDescriptor& eventDesc);
|
||||||
|
|
||||||
|
virtual void clearViews();
|
||||||
|
virtual void clearControls();
|
||||||
|
virtual void clearGroups();
|
||||||
|
|
||||||
|
void setSpace (sint32 s) { _Space = s; }
|
||||||
|
|
||||||
|
virtual CInterfaceElement* getElement (const std::string &id)
|
||||||
|
{ return CInterfaceGroup::getElement (id); }
|
||||||
|
|
||||||
|
sint32 getNbElement() { return (sint32)_Elements.size(); }
|
||||||
|
sint32 getSpace() { return _Space; }
|
||||||
|
|
||||||
|
void forceSizeW (sint32 newSizeW);
|
||||||
|
void forceSizeH (sint32 newSizeH);
|
||||||
|
|
||||||
|
void setMinW(sint32 minW);
|
||||||
|
void setMinH(sint32 minH);
|
||||||
|
sint32 getMinW() const {return _MinW;}
|
||||||
|
sint32 getMinH() const {return _MinH;}
|
||||||
|
|
||||||
|
// set the rank for the element at the given index (used to reinsert container after they have been turned into popups)
|
||||||
|
void setOrder(uint index, uint order) { _Elements[index].Order = order; }
|
||||||
|
uint getOrder(uint index) const { return _Elements[index].Order; }
|
||||||
|
|
||||||
|
// get element of index or -1 if not found
|
||||||
|
sint32 getElementIndex(CViewBase* child) const;
|
||||||
|
|
||||||
|
// swap 2 entries in the list (and also their orders)
|
||||||
|
// void swapChildren(uint index1, uint index2);
|
||||||
|
|
||||||
|
// deleteOnRemove flag
|
||||||
|
void setDelOnRemove(uint index, bool delOnRemove);
|
||||||
|
bool getDelOnRemove(uint index) const;
|
||||||
|
|
||||||
|
void setTopSpace(uint topSpace)
|
||||||
|
{
|
||||||
|
_TopSpace = topSpace;
|
||||||
|
setResizeFromChildHMargin(topSpace);
|
||||||
|
invalidateContent();
|
||||||
|
};
|
||||||
|
|
||||||
|
uint getTopSpace()
|
||||||
|
{
|
||||||
|
return _TopSpace;
|
||||||
|
};
|
||||||
|
|
||||||
|
void setIndent(uint indent) { _Indent = indent; }
|
||||||
|
|
||||||
|
void setFirstViewIndent(sint indent)
|
||||||
|
{
|
||||||
|
_FirstViewIndentView = indent;
|
||||||
|
invalidateContent();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the HTML group used for links
|
||||||
|
void setBrowseGroup (CInterfaceElement *group)
|
||||||
|
{
|
||||||
|
_BrowseGroup = group;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// \from CInterfaceElement
|
||||||
|
void onInvalidateContent();
|
||||||
|
sint32 getMaxUsedW() const;
|
||||||
|
sint32 getMinUsedW() const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
// Content validated
|
||||||
|
bool _ContentValidated;
|
||||||
|
|
||||||
|
// Where to add next element
|
||||||
|
EAlign _AddElt;
|
||||||
|
|
||||||
|
// Where to align the newly added element
|
||||||
|
EAlign _Align;
|
||||||
|
|
||||||
|
// Space between two elements in pixel
|
||||||
|
sint32 _Space;
|
||||||
|
|
||||||
|
// Text template
|
||||||
|
CViewText _Templ;
|
||||||
|
|
||||||
|
// Current id of the view
|
||||||
|
sint32 _IdCounter;
|
||||||
|
|
||||||
|
// Do we have a color under the element pointed by the mouse
|
||||||
|
bool _Over;
|
||||||
|
|
||||||
|
// If over is true so we have a color
|
||||||
|
NLMISC::CRGBA _OverColor;
|
||||||
|
|
||||||
|
// Current elt over the pointer
|
||||||
|
sint32 _OverElt;
|
||||||
|
|
||||||
|
struct CElementInfo
|
||||||
|
{
|
||||||
|
uint Order; // Used to sort the window by their insertion order.
|
||||||
|
// This is used to put back a window at the right place if it was turned into a popup.
|
||||||
|
CViewBase *Element;
|
||||||
|
bool EltDeleteOnRemove;
|
||||||
|
};
|
||||||
|
friend struct CRemoveViewPred;
|
||||||
|
friend struct CRemoveCtrlPred;
|
||||||
|
friend struct CRemoveGroupPred;
|
||||||
|
|
||||||
|
// The list is forced to be at least this size in updateCoords().
|
||||||
|
sint32 _MinW;
|
||||||
|
sint32 _MinH;
|
||||||
|
|
||||||
|
|
||||||
|
// To conserve elements in the order they have been added
|
||||||
|
// (the element drawn are stored in _views, _contrlos or _childrengroups of cinterfacegroup
|
||||||
|
std::vector<CElementInfo> _Elements;
|
||||||
|
|
||||||
|
// Last parent width
|
||||||
|
sint32 _LastW;
|
||||||
|
|
||||||
|
// Top space
|
||||||
|
uint _TopSpace;
|
||||||
|
|
||||||
|
// Indent
|
||||||
|
uint _Indent; // Left margin
|
||||||
|
sint _FirstViewIndentView; // Additionnal left margin for the first view
|
||||||
|
|
||||||
|
// A link structure
|
||||||
|
class CLink
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
CLink(CViewLink *link);
|
||||||
|
|
||||||
|
// The link view
|
||||||
|
CViewLink *Link;
|
||||||
|
|
||||||
|
// The three control button
|
||||||
|
CCtrlLink *CtrlLink[3];
|
||||||
|
};
|
||||||
|
|
||||||
|
// The links
|
||||||
|
std::vector<CLink> _Links;
|
||||||
|
|
||||||
|
// The HTML group used
|
||||||
|
CInterfaceElement *_BrowseGroup;
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::string _HardText;
|
||||||
|
uint32 _TextId;
|
||||||
|
|
||||||
|
void setupSizes();
|
||||||
|
void onTextChanged();
|
||||||
|
|
||||||
|
// void setHSGroup (CViewBase *child, EAlign addElt, EAlign align);
|
||||||
|
// void setHSParent(CViewBase *view, EAlign addElt, EAlign align, uint space);
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // NL_GROUP_PARAGRAPH_H
|
||||||
|
|
||||||
|
/* End of group_paragraph.h */
|
||||||
|
|
||||||
|
|
@ -0,0 +1,90 @@
|
|||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef CL_GROUP_SCROLLTEXT_H
|
||||||
|
#define CL_GROUP_SCROLLTEXT_H
|
||||||
|
|
||||||
|
#include "nel/misc/types_nl.h"
|
||||||
|
#include "nel/gui/interface_group.h"
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
class CCtrlBaseButton;
|
||||||
|
class CCtrlScroll;
|
||||||
|
class CGroupList;
|
||||||
|
|
||||||
|
// Can be used to build a chat window or anything that displays sequences of strings
|
||||||
|
/**
|
||||||
|
* Widget to have a resizable scrolltext and its scrollbar
|
||||||
|
* \author Nicolas Vizerie
|
||||||
|
* \author Nevrax France
|
||||||
|
* \date 2002
|
||||||
|
*/
|
||||||
|
class CGroupScrollText : public CInterfaceGroup
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/// Constructor
|
||||||
|
CGroupScrollText(const TCtorParam ¶m);
|
||||||
|
~CGroupScrollText();
|
||||||
|
|
||||||
|
std::string getProperty( const std::string &name ) const;
|
||||||
|
void setProperty( const std::string &name, const std::string &value );
|
||||||
|
xmlNodePtr serialize( xmlNodePtr parentNode, const char *type ) const;
|
||||||
|
|
||||||
|
/// CInterfaceGroup Interface
|
||||||
|
virtual bool parse (xmlNodePtr cur, CInterfaceGroup *parentGroup);
|
||||||
|
virtual void updateCoords ();
|
||||||
|
virtual void checkCoords ();
|
||||||
|
virtual void draw ();
|
||||||
|
virtual void clearViews ();
|
||||||
|
virtual bool handleEvent (const NLGUI::CEventDescriptor &eventDesc);
|
||||||
|
|
||||||
|
// get the list associated to this group
|
||||||
|
CGroupList *getList() const { return _List; }
|
||||||
|
|
||||||
|
// Get the scroll bar
|
||||||
|
CCtrlScroll *getScrollBar() const { return _ScrollBar; }
|
||||||
|
|
||||||
|
// from CCtrlBase
|
||||||
|
virtual void elementCaptured(CCtrlBase *capturedElement);
|
||||||
|
|
||||||
|
|
||||||
|
REFLECT_EXPORT_START(CGroupScrollText, CInterfaceGroup)
|
||||||
|
REFLECT_EXPORT_END
|
||||||
|
|
||||||
|
private:
|
||||||
|
CGroupList *_List;
|
||||||
|
CCtrlScroll *_ScrollBar;
|
||||||
|
CCtrlBaseButton *_ButtonAdd;
|
||||||
|
CCtrlBaseButton *_ButtonSub;
|
||||||
|
bool _Settuped;
|
||||||
|
bool _InvertScrollBar;
|
||||||
|
sint32 _ListHeight;
|
||||||
|
protected:
|
||||||
|
void setup();
|
||||||
|
void updateScrollBar();
|
||||||
|
public:
|
||||||
|
// private use for action handlers
|
||||||
|
sint32 _StartHeight;
|
||||||
|
sint64 _EllapsedTime;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1,48 @@
|
|||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
#ifndef GROUP_SUBMENU_BASE
|
||||||
|
#define GROUP_SUBMENU_BASE
|
||||||
|
|
||||||
|
#include "nel/gui/group_frame.h"
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
|
||||||
|
class CGroupSubMenuBase : public CGroupFrame
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
DECLARE_UI_CLASS( CGroupSubMenuBase )
|
||||||
|
|
||||||
|
CGroupSubMenuBase( const TCtorParam ¶m );
|
||||||
|
~CGroupSubMenuBase();
|
||||||
|
|
||||||
|
virtual void openSubMenu( sint32 nb );
|
||||||
|
virtual void hideSubMenus();
|
||||||
|
|
||||||
|
REFLECT_EXPORT_START( CGroupSubMenuBase, CGroupFrame )
|
||||||
|
REFLECT_EXPORT_END
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,188 @@
|
|||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef NL_GROUP_TAB_H
|
||||||
|
#define NL_GROUP_TAB_H
|
||||||
|
|
||||||
|
#include "nel/misc/types_nl.h"
|
||||||
|
#include "nel/gui/interface_group.h"
|
||||||
|
#include "nel/gui/ctrl_text_button.h"
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
class CCtrlTabButton;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
/**
|
||||||
|
* Group handling Ctrl Tab, to easily simulate Tab ctrl.
|
||||||
|
* NB: controlled groups doesn't have to be child of the GroupTab, they are searched in order:
|
||||||
|
* - in this group
|
||||||
|
* - in the parent group
|
||||||
|
* - in global
|
||||||
|
* \author Lionel Berenguier
|
||||||
|
* \author Nevrax France
|
||||||
|
* \date 2003
|
||||||
|
*/
|
||||||
|
class CGroupTab : public CInterfaceGroup
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
/// Constructor
|
||||||
|
CGroupTab(const TCtorParam ¶m);
|
||||||
|
|
||||||
|
std::string getProperty( const std::string &name ) const;
|
||||||
|
void setProperty( const std::string &name, const std::string &value );
|
||||||
|
xmlNodePtr serialize( xmlNodePtr parentNode, const char *type ) const;
|
||||||
|
|
||||||
|
virtual bool parse (xmlNodePtr cur, CInterfaceGroup *parentGroup);
|
||||||
|
virtual void updateCoords ();
|
||||||
|
|
||||||
|
// select the ctrl tab. -1 will invalidate all.
|
||||||
|
void select(sint index);
|
||||||
|
sint getSelection() const;
|
||||||
|
|
||||||
|
// select with a CCtrlTabButton ptr
|
||||||
|
void selectFromCtrl(CCtrlTabButton *button);
|
||||||
|
|
||||||
|
// select a default activated tab, if the current is a special ctrlTab
|
||||||
|
void selectDefault(CCtrlTabButton *ifSelectionIs);
|
||||||
|
|
||||||
|
// select a default activated tab, if the current is hid
|
||||||
|
void selectDefaultIfCurrentHid();
|
||||||
|
|
||||||
|
// add new tab
|
||||||
|
void addTab(CCtrlTabButton *tabB);
|
||||||
|
void addTab(CCtrlTabButton *tabB, sint index);
|
||||||
|
int luaAddTab(CLuaState &ls);
|
||||||
|
int luaAddTabWithOrder(CLuaState &ls);
|
||||||
|
|
||||||
|
// remove selected tab
|
||||||
|
void removeTab(sint index);
|
||||||
|
int luaRemoveTab(CLuaState &ls);
|
||||||
|
|
||||||
|
// remove all tabs
|
||||||
|
void removeAll();
|
||||||
|
int luaRemoveAll(CLuaState &ls);
|
||||||
|
|
||||||
|
// tab number
|
||||||
|
void setTabButtonNb(sint32 /* val */){}
|
||||||
|
sint32 getTabButtonNb() const {return (sint32)_Buttons.size();}
|
||||||
|
|
||||||
|
// selection index
|
||||||
|
void setIndexSelection(sint32 val){select((sint)val);}
|
||||||
|
sint32 getIndexSelection() const {return (sint32)_NextSelection;}
|
||||||
|
|
||||||
|
// selection index
|
||||||
|
void setAssociatedGroupSelection(const std::string & /* assG */){}
|
||||||
|
std::string getAssociatedGroupSelection() const;
|
||||||
|
|
||||||
|
// get group from index
|
||||||
|
CInterfaceGroup* getGroup(sint index);
|
||||||
|
int luaGetGroup(CLuaState &ls);
|
||||||
|
|
||||||
|
// get tab from index
|
||||||
|
CCtrlTabButton* getTabButton(sint index);
|
||||||
|
int luaGetTabButton(CLuaState &ls);
|
||||||
|
|
||||||
|
// first showed tab button
|
||||||
|
sint32 getFirstTabButton() const {return (sint32)_FirstTabIndex;}
|
||||||
|
|
||||||
|
// last showed tab button
|
||||||
|
sint32 getLastTabButton() const {return (sint32)_LastTabIndex;}
|
||||||
|
|
||||||
|
// update showed tab buttons on function of GroupTab width
|
||||||
|
void updateFirstTabButton();
|
||||||
|
int luaShowTabButton(CLuaState &ls);
|
||||||
|
|
||||||
|
void dummySet(sint32 /* value */){}
|
||||||
|
|
||||||
|
REFLECT_EXPORT_START(CGroupTab, CInterfaceGroup)
|
||||||
|
REFLECT_LUA_METHOD("addTab", luaAddTab)
|
||||||
|
REFLECT_LUA_METHOD("addTabWithOrder", luaAddTabWithOrder)
|
||||||
|
REFLECT_LUA_METHOD("removeTab", luaRemoveTab)
|
||||||
|
REFLECT_LUA_METHOD("removeAll", luaRemoveAll)
|
||||||
|
REFLECT_LUA_METHOD("getGroup", luaGetGroup)
|
||||||
|
REFLECT_LUA_METHOD("getTabButton", luaGetTabButton)
|
||||||
|
REFLECT_LUA_METHOD("showTabButton", luaShowTabButton)
|
||||||
|
REFLECT_SINT32 ("tabButtonNb", getTabButtonNb, setTabButtonNb)
|
||||||
|
REFLECT_SINT32 ("selection", getIndexSelection, setIndexSelection)
|
||||||
|
REFLECT_SINT32 ("firstTabButton", getFirstTabButton, dummySet)
|
||||||
|
REFLECT_SINT32 ("lastTabButton", getLastTabButton, dummySet)
|
||||||
|
REFLECT_STRING ("associatedGroupSelection", getAssociatedGroupSelection, setAssociatedGroupSelection)
|
||||||
|
REFLECT_EXPORT_END
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
std::vector<CCtrlTabButton*> _Buttons; // can't be NULL.
|
||||||
|
std::vector<CInterfaceGroup*> _Groups; // may be NULL
|
||||||
|
sint _Selection;
|
||||||
|
sint _NextSelection;
|
||||||
|
sint _BaseRenderLayer;
|
||||||
|
bool _Setuped;
|
||||||
|
bool _HideOutTabs;
|
||||||
|
sint _FirstTabIndex;
|
||||||
|
sint _LastTabIndex;
|
||||||
|
|
||||||
|
std::string _AHOnChange;
|
||||||
|
std::string _ParamsOnChange;
|
||||||
|
|
||||||
|
void setup();
|
||||||
|
};
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
/**
|
||||||
|
* Used with CGroupTab
|
||||||
|
*/
|
||||||
|
class CCtrlTabButton : public CCtrlTextButton
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
CCtrlTabButton(const TCtorParam ¶m);
|
||||||
|
|
||||||
|
void setProperty( const std::string &name, const std::string &value );
|
||||||
|
std::string getProperty( const std::string &name ) const;
|
||||||
|
xmlNodePtr serialize( xmlNodePtr parentNode, const char *type ) const;
|
||||||
|
|
||||||
|
virtual bool parse (xmlNodePtr cur, CInterfaceGroup *parentGroup);
|
||||||
|
|
||||||
|
virtual void setActive(bool state);
|
||||||
|
|
||||||
|
virtual bool handleEvent (const NLGUI::CEventDescriptor &event);
|
||||||
|
|
||||||
|
void setBlink (bool b);
|
||||||
|
|
||||||
|
std::string _AssociatedGroup;
|
||||||
|
IActionHandler *_AHOnLeftClick2;
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
sint32 _DefaultX;
|
||||||
|
bool _Blinking;
|
||||||
|
NLMISC::CRGBA _TextColorNormalBlink;
|
||||||
|
bool _TextModulateGlobalColorNormalBlink;
|
||||||
|
sint64 _BlinkDate;
|
||||||
|
bool _BlinkState;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // NL_GROUP_TAB_H
|
||||||
|
|
||||||
|
/* End of group_tab.h */
|
@ -0,0 +1,224 @@
|
|||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef NL_GROUP_TABLE_H
|
||||||
|
#define NL_GROUP_TABLE_H
|
||||||
|
|
||||||
|
#include "nel/misc/types_nl.h"
|
||||||
|
#include "nel/gui/group_frame.h"
|
||||||
|
#include "nel/gui/view_text.h"
|
||||||
|
#include "nel/gui/ctrl_button.h"
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This group is used to simulate HTML cells.
|
||||||
|
* They have specific parameters to be aligned like HTML cells.
|
||||||
|
* (Percent of the table size
|
||||||
|
*/
|
||||||
|
class CGroupCell: public CInterfaceGroup
|
||||||
|
{
|
||||||
|
friend class CGroupTable;
|
||||||
|
public:
|
||||||
|
CGroupCell(const TCtorParam ¶m);
|
||||||
|
|
||||||
|
enum TAlign
|
||||||
|
{
|
||||||
|
Left,
|
||||||
|
Center,
|
||||||
|
Right
|
||||||
|
};
|
||||||
|
|
||||||
|
enum TVAlign
|
||||||
|
{
|
||||||
|
Top,
|
||||||
|
Middle,
|
||||||
|
Bottom
|
||||||
|
};
|
||||||
|
|
||||||
|
/// \from CInterfaceElement
|
||||||
|
virtual void draw();
|
||||||
|
virtual sint32 getMaxUsedW() const;
|
||||||
|
virtual sint32 getMinUsedW() const;
|
||||||
|
|
||||||
|
std::string getProperty( const std::string &name ) const;
|
||||||
|
void setProperty( const std::string &name, const std::string &value );
|
||||||
|
xmlNodePtr serialize( xmlNodePtr parentNode, const char *type ) const;
|
||||||
|
|
||||||
|
// to be called by CGroupTable
|
||||||
|
bool parse (xmlNodePtr cur, CInterfaceGroup * parentGroup, uint columnIndex, uint rowIndex);
|
||||||
|
|
||||||
|
// If the cell is a new line. This is the first <td> after a <tr>
|
||||||
|
bool NewLine;
|
||||||
|
bool IgnoreMaxWidth;
|
||||||
|
bool IgnoreMinWidth;
|
||||||
|
bool AddChildW;
|
||||||
|
|
||||||
|
// The table width cell ratio. This is the <td width="50%"> parameter
|
||||||
|
float TableRatio;
|
||||||
|
|
||||||
|
// The Width you want in pixel. This is the <td width="100"> parameter
|
||||||
|
sint32 WidthWanted;
|
||||||
|
|
||||||
|
|
||||||
|
// The min height of the cell
|
||||||
|
sint32 Height;
|
||||||
|
|
||||||
|
// Memorize max width
|
||||||
|
sint32 WidthMax;
|
||||||
|
|
||||||
|
// The cell color
|
||||||
|
NLMISC::CRGBA BgColor;
|
||||||
|
|
||||||
|
// Texture
|
||||||
|
CViewRenderer::CTextureId _TextureId; /// Accelerator
|
||||||
|
bool _UserTexture;
|
||||||
|
bool _TextureTiled;
|
||||||
|
bool _TextureScaled;
|
||||||
|
|
||||||
|
// Alignment
|
||||||
|
TAlign Align;
|
||||||
|
TVAlign VAlign;
|
||||||
|
sint32 LeftMargin;
|
||||||
|
|
||||||
|
// The cell group
|
||||||
|
CInterfaceGroup *Group;
|
||||||
|
|
||||||
|
// The cell is nowrap
|
||||||
|
bool NoWrap;
|
||||||
|
|
||||||
|
void setTexture(const std::string & TxName);
|
||||||
|
void setTextureTile(bool tiled);
|
||||||
|
void setTextureScale(bool scaled);
|
||||||
|
|
||||||
|
static void setDebugUICell( bool d ){ DebugUICell = d; }
|
||||||
|
static bool getDebugUICell(){ return DebugUICell; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
void setEnclosedGroupDefaultParams();
|
||||||
|
static bool DebugUICell;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This group is used to simulate HTML table. Support "percent of the parent width" sizeRef mode.
|
||||||
|
*/
|
||||||
|
class CGroupTable : public CInterfaceGroup
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
///constructor
|
||||||
|
CGroupTable(const TCtorParam ¶m);
|
||||||
|
|
||||||
|
// dtor
|
||||||
|
~CGroupTable();
|
||||||
|
|
||||||
|
// Add a cell in the table
|
||||||
|
void addChild (CGroupCell* child);
|
||||||
|
|
||||||
|
// The ratio you want [0 ~1]. This is the <table width="50%"> parameter
|
||||||
|
float TableRatio;
|
||||||
|
|
||||||
|
// The Width you want in pixel. This is the <table width="100"> parameter
|
||||||
|
sint32 ForceWidthMin;
|
||||||
|
|
||||||
|
// Table borders
|
||||||
|
sint32 Border;
|
||||||
|
sint32 CellPadding;
|
||||||
|
sint32 CellSpacing;
|
||||||
|
|
||||||
|
// The table color
|
||||||
|
NLMISC::CRGBA BgColor;
|
||||||
|
uint8 CurrentAlpha;
|
||||||
|
|
||||||
|
bool ContinuousUpdate;
|
||||||
|
|
||||||
|
std::string getProperties( const std::string &name ) const;
|
||||||
|
void setProperty( const std::string &name, const std::string &value );
|
||||||
|
xmlNodePtr serialize( xmlNodePtr parentNode, const char *type ) const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
/// \from CInterfaceElement
|
||||||
|
void onInvalidateContent();
|
||||||
|
sint32 getMaxUsedW() const;
|
||||||
|
sint32 getMinUsedW() const;
|
||||||
|
void draw ();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* init or reset the children element coords. Orverloaded from CInterfaceGroup because we begin with the last inserted element here
|
||||||
|
*/
|
||||||
|
virtual void updateCoords();
|
||||||
|
|
||||||
|
virtual void checkCoords();
|
||||||
|
|
||||||
|
virtual bool parse (xmlNodePtr cur, CInterfaceGroup * parentGroup);
|
||||||
|
|
||||||
|
// Content validated
|
||||||
|
bool _ContentValidated;
|
||||||
|
|
||||||
|
// Last parent width
|
||||||
|
sint32 _LastParentW;
|
||||||
|
|
||||||
|
// Children
|
||||||
|
std::vector<CGroupCell *> _Cells;
|
||||||
|
|
||||||
|
// Table column
|
||||||
|
class CColumn
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CColumn()
|
||||||
|
{
|
||||||
|
Width = 0;
|
||||||
|
WidthMax = 0;
|
||||||
|
WidthWanted = 0;
|
||||||
|
TableRatio = 0;
|
||||||
|
Height = 0;
|
||||||
|
}
|
||||||
|
sint32 Width;
|
||||||
|
sint32 Height;
|
||||||
|
sint32 WidthWanted;
|
||||||
|
sint32 WidthMax;
|
||||||
|
float TableRatio;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Table row
|
||||||
|
class CRow
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CRow()
|
||||||
|
{
|
||||||
|
Height = 0;
|
||||||
|
}
|
||||||
|
sint32 Height;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Column table
|
||||||
|
std::vector<CColumn> _Columns;
|
||||||
|
|
||||||
|
// Column table
|
||||||
|
std::vector<CRow> _Rows;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // NL_GROUP_TABLE_H
|
||||||
|
|
||||||
|
/* End of group_table.h */
|
||||||
|
|
||||||
|
|
@ -0,0 +1,381 @@
|
|||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef NL_GROUP_TREE_H
|
||||||
|
#define NL_GROUP_TREE_H
|
||||||
|
|
||||||
|
#include "nel/misc/types_nl.h"
|
||||||
|
#include "nel/gui/group_frame.h"
|
||||||
|
#include "nel/misc/smart_ptr.h"
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
class CViewText;
|
||||||
|
class CViewBitmap;
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
class CGroupTree : public CInterfaceGroup
|
||||||
|
{
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
struct SNode;
|
||||||
|
// optional callback that is called when a node has been added
|
||||||
|
struct INodeAddedCallback
|
||||||
|
{
|
||||||
|
/** A node has just been added in the CGroupTree object
|
||||||
|
* \param node The logic node from which the ui node was built
|
||||||
|
* \param interfaceElement The ui node that was built
|
||||||
|
*/
|
||||||
|
virtual void nodeAdded(SNode *node, CInterfaceElement *interfaceElement) = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Logic structure to initialize the group tree (root node is not displayed and is always opened)
|
||||||
|
struct SNode : public CReflectableRefPtrTarget
|
||||||
|
{
|
||||||
|
typedef NLMISC::CRefPtr<SNode> TRefPtr;
|
||||||
|
// Common
|
||||||
|
std::string Id; // If not present auto-generated
|
||||||
|
bool Opened;
|
||||||
|
bool DisplayText; // If false instanciate a template
|
||||||
|
bool Show; // If false, the node is not displayed (true default, Root ignored)
|
||||||
|
sint32 YDecal;
|
||||||
|
// Text
|
||||||
|
ucstring Text; // Internationalized displayed text
|
||||||
|
sint32 FontSize; // If -1 (default), then take the groupTree one
|
||||||
|
NLMISC::CRGBA Color;
|
||||||
|
// Template
|
||||||
|
NLMISC::CSmartPtr<CInterfaceGroup> Template;
|
||||||
|
// Actions Handlers (for left button)
|
||||||
|
std::string AHName;
|
||||||
|
std::string AHCond;
|
||||||
|
std::string AHParams;
|
||||||
|
// Actions Handlers (for right button)
|
||||||
|
std::string AHNameRight;
|
||||||
|
std::string AHParamsRight;
|
||||||
|
// Actions Handlers (close/open node)
|
||||||
|
std::string AHNameClose;
|
||||||
|
std::string AHParamsClose;
|
||||||
|
// bitmap at this level of hierarchy
|
||||||
|
std::string Bitmap; // additionnal bitmap
|
||||||
|
// Hierarchy
|
||||||
|
std::vector<SNode*> Children;
|
||||||
|
SNode *Father;
|
||||||
|
// updated at display
|
||||||
|
SNode *LastVisibleSon; // filled at build time, meaningfull only if son is shown and opened, undefined otherwise
|
||||||
|
// Node added callback
|
||||||
|
INodeAddedCallback *NodeAddedCallback;
|
||||||
|
//
|
||||||
|
CGroupTree *ParentTree;
|
||||||
|
// ----------------------------
|
||||||
|
SNode();
|
||||||
|
~SNode();
|
||||||
|
void updateLastVisibleSon();
|
||||||
|
void detachChild(SNode *pNode);
|
||||||
|
void deleteChild(SNode *pNode);
|
||||||
|
void addChild (SNode *pNode);
|
||||||
|
bool isChild(SNode *pNode) const;
|
||||||
|
void addChildFront (SNode *pNode);
|
||||||
|
void addChildAtIndex (SNode *pNode, sint index);
|
||||||
|
void addChildSorted(SNode *pNode);
|
||||||
|
void addChildSortedByBitmap(SNode *pNode);
|
||||||
|
void setParentTree(CGroupTree *parent);
|
||||||
|
void setFather(SNode *father);
|
||||||
|
void closeAll();
|
||||||
|
void makeOrphan();
|
||||||
|
bool parse (xmlNodePtr cur, CGroupTree *parentGroup);
|
||||||
|
uint getNumBitmap() const { return Bitmap.empty() ? 0 : 1; }
|
||||||
|
SNode *getNodeFromId(const std::string &id);
|
||||||
|
|
||||||
|
// accessors
|
||||||
|
void setBitmap(const std::string &bitmap) { Bitmap = bitmap; }
|
||||||
|
std::string getBitmap() const { return Bitmap; }
|
||||||
|
void setOpened(bool opened) { Opened = opened; }
|
||||||
|
bool getOpened() const { return Opened; }
|
||||||
|
void setText(const ucstring &text) { Text = text; }
|
||||||
|
const ucstring& getText() const { return Text; }
|
||||||
|
sint32 getFontSize() const { return FontSize; }
|
||||||
|
void setFontSize(sint32 value) { FontSize = value; }
|
||||||
|
sint32 getYDecal() const { return YDecal; }
|
||||||
|
void setYDecal(sint32 value) { YDecal = value; }
|
||||||
|
|
||||||
|
|
||||||
|
std::string getId() const { return Id; }
|
||||||
|
void setId(const std::string &value) { Id = value; }
|
||||||
|
bool getShow() const { return Show; }
|
||||||
|
void setShow(bool value) { Show = value; }
|
||||||
|
std::string getAHName() const { return AHName; }
|
||||||
|
void setAHName(const std::string &value) { AHName = value; }
|
||||||
|
std::string getAHCond() const { return AHCond; }
|
||||||
|
void setAHCond(const std::string &value) { AHCond = value; }
|
||||||
|
std::string getAHParams() const { return AHParams; }
|
||||||
|
void setAHParams(const std::string &value) { AHParams = value; }
|
||||||
|
std::string getAHNameRight() const { return AHNameRight; }
|
||||||
|
void setAHNameRight(const std::string &value) { AHNameRight = value; }
|
||||||
|
std::string getAHParamsRight() const { return AHParamsRight; }
|
||||||
|
void setAHParamsRight(const std::string &value) { AHParamsRight = value; }
|
||||||
|
std::string getAHNameClose() const { return AHNameClose; }
|
||||||
|
void setAHNameClose(const std::string &value) { AHNameClose = value; }
|
||||||
|
std::string getAHParamsClose() const { return AHParamsClose; }
|
||||||
|
void setAHParamsClose(const std::string &value) { AHParamsClose = value; }
|
||||||
|
NLMISC::CRGBA getColor() const { return Color; }
|
||||||
|
void setColor(NLMISC::CRGBA color) { Color = color; }
|
||||||
|
// sort branch & sons alphabetically
|
||||||
|
void sort();
|
||||||
|
// sort branch & sons alphabetically & by bitmap name (blank bitmap being the first)
|
||||||
|
void sortByBitmap();
|
||||||
|
|
||||||
|
// lua bindings
|
||||||
|
int luaGetNumChildren(CLuaState &ls);
|
||||||
|
int luaGetChild(CLuaState &ls);
|
||||||
|
int luaDetachChild(CLuaState &ls);
|
||||||
|
int luaDeleteChild(CLuaState &ls);
|
||||||
|
int luaAddChild(CLuaState &ls);
|
||||||
|
int luaAddChildSorted(CLuaState &ls);
|
||||||
|
int luaAddChildSortedByBitmap(CLuaState &ls);
|
||||||
|
int luaIsChild(CLuaState &ls);
|
||||||
|
int luaAddChildFront (CLuaState &ls);
|
||||||
|
int luaAddChildAtIndex (CLuaState &ls);
|
||||||
|
int luaCloseAll(CLuaState &ls);
|
||||||
|
int luaGetFather(CLuaState &ls);
|
||||||
|
int luaSort(CLuaState &ls);
|
||||||
|
int luaSortByBitmap(CLuaState &ls);
|
||||||
|
int luaGetNodeFromId(CLuaState &ls);
|
||||||
|
int luaGetParentTree(CLuaState &ls);
|
||||||
|
|
||||||
|
// get node from first parameter on lua stack and throw necessary exception if not present
|
||||||
|
static SNode *luaGetNodeOnStack(CLuaState &ls, const char *funcName);
|
||||||
|
|
||||||
|
REFLECT_EXPORT_START(CGroupTree::SNode, CReflectable)
|
||||||
|
REFLECT_STRING("Id", getId, setId);
|
||||||
|
REFLECT_STRING("Bitmap", getBitmap, setBitmap);
|
||||||
|
REFLECT_SINT32("FontSize", getFontSize, setFontSize);
|
||||||
|
REFLECT_SINT32("YDecal", getYDecal, setYDecal);
|
||||||
|
REFLECT_STRING("AHName", getAHName, setAHName);
|
||||||
|
REFLECT_STRING("AHCond", getAHCond, setAHCond);
|
||||||
|
REFLECT_RGBA("Color", getColor, setColor);
|
||||||
|
REFLECT_STRING("AHParams", getAHParams, setAHParams);
|
||||||
|
REFLECT_STRING("AHNameRight", getAHNameRight, setAHNameRight);
|
||||||
|
REFLECT_STRING("AHParamsRight", getAHParamsRight, setAHParamsRight);
|
||||||
|
REFLECT_STRING("AHNameClose", getAHNameClose, setAHNameClose);
|
||||||
|
REFLECT_STRING("AHParamsClose", getAHParamsClose, setAHParamsClose);
|
||||||
|
REFLECT_BOOL("Opened", getOpened, setOpened);
|
||||||
|
REFLECT_BOOL("Show", getShow, setShow);
|
||||||
|
REFLECT_UCSTRING("Text", getText, setText);
|
||||||
|
// lua
|
||||||
|
REFLECT_LUA_METHOD("getNumChildren", luaGetNumChildren);
|
||||||
|
REFLECT_LUA_METHOD("getChild", luaGetChild);
|
||||||
|
REFLECT_LUA_METHOD("detachChild", luaDetachChild);
|
||||||
|
REFLECT_LUA_METHOD("deleteChild", luaDeleteChild);
|
||||||
|
REFLECT_LUA_METHOD("addChild", luaAddChild);
|
||||||
|
REFLECT_LUA_METHOD("addChildSorted", luaAddChildSorted);
|
||||||
|
REFLECT_LUA_METHOD("addChildSortedByBitmap", luaAddChildSortedByBitmap);
|
||||||
|
REFLECT_LUA_METHOD("addChildFront", luaAddChildFront);
|
||||||
|
REFLECT_LUA_METHOD("addChildAtIndex", luaAddChildAtIndex);
|
||||||
|
REFLECT_LUA_METHOD("isChild", luaIsChild);
|
||||||
|
REFLECT_LUA_METHOD("closeAll", luaCloseAll);
|
||||||
|
REFLECT_LUA_METHOD("getFather", luaGetFather);
|
||||||
|
REFLECT_LUA_METHOD("sort", luaSort);
|
||||||
|
REFLECT_LUA_METHOD("sortByBitmap", luaSortByBitmap);
|
||||||
|
REFLECT_LUA_METHOD("getNodeFromId", luaGetNodeFromId);
|
||||||
|
REFLECT_LUA_METHOD("getParentTree", luaGetParentTree);
|
||||||
|
REFLECT_EXPORT_END
|
||||||
|
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
///constructor
|
||||||
|
CGroupTree(const TCtorParam ¶m);
|
||||||
|
|
||||||
|
// dtor
|
||||||
|
virtual ~CGroupTree();
|
||||||
|
|
||||||
|
std::string getProperty( const std::string &name ) const;
|
||||||
|
void setProperty( const std::string &name, const std::string &value );
|
||||||
|
xmlNodePtr serialize( xmlNodePtr parentNode, const char *type ) const;
|
||||||
|
|
||||||
|
virtual bool parse (xmlNodePtr cur, CInterfaceGroup * parentGroup);
|
||||||
|
|
||||||
|
virtual void checkCoords();
|
||||||
|
|
||||||
|
virtual void updateCoords();
|
||||||
|
|
||||||
|
virtual void draw();
|
||||||
|
|
||||||
|
virtual bool handleEvent (const NLGUI::CEventDescriptor& eventDesc);
|
||||||
|
|
||||||
|
void reset();
|
||||||
|
|
||||||
|
// force rebuild the tree at next updateCoords()
|
||||||
|
void forceRebuild();
|
||||||
|
|
||||||
|
// For SNode
|
||||||
|
sint32 getIdNumber() { _IdGenerator++; return _IdGenerator; }
|
||||||
|
sint32 getFontSize() { return _FontSize; }
|
||||||
|
sint32 getYDecal() { return _YDecal; }
|
||||||
|
|
||||||
|
// Set root node and delete the last one the user must not delete all allocated sub node. Nb: selection is reseted
|
||||||
|
void setRootNode (SNode *);
|
||||||
|
// Remove all lines bitmaps and templates or texts
|
||||||
|
void removeAll();
|
||||||
|
|
||||||
|
// unselect current node in tree
|
||||||
|
void unselect();
|
||||||
|
|
||||||
|
// Select a node by its line index (depends on opened nodes). no-op if not possible (AH not here, line>size)
|
||||||
|
void selectLine(uint line, bool runAH = true);
|
||||||
|
// simulate right button click on the given line (this also select the line)
|
||||||
|
bool rightButton(uint line);
|
||||||
|
|
||||||
|
// Get the Selected Node Id. empty if none selected
|
||||||
|
const std::string &getSelectedNodeId() const;
|
||||||
|
|
||||||
|
// Select by the node Id. return false if not found (selection is not reseted)
|
||||||
|
// NB: if the node was already selected, no-op (no action handler launched)
|
||||||
|
bool selectNodeById(const std::string &nodeId, bool triggerAH = true);
|
||||||
|
|
||||||
|
// Get the root node (Opened State represent the current state)
|
||||||
|
SNode *getRootNode () const {return _RootNode;}
|
||||||
|
|
||||||
|
// get current SNode under the mouse (possibly NULL)
|
||||||
|
SNode *getNodeUnderMouse() const;
|
||||||
|
|
||||||
|
// Get/Change the NavigateOneBrnahc option. if false, then perform a reset before
|
||||||
|
bool getNavigateOneBranch() const {return _NavigateOneBranch;}
|
||||||
|
void changeNavigateOneBranch(bool newState);
|
||||||
|
|
||||||
|
// should be called by action handler when thy want to cancel the selection of the line that triggered them
|
||||||
|
void cancelNextSelectLine();
|
||||||
|
|
||||||
|
// Get selected node
|
||||||
|
SNode * getSelectedNode() { return _SelectedNode;}
|
||||||
|
|
||||||
|
// lua bindings
|
||||||
|
int luaGetRootNode(CLuaState &ls);
|
||||||
|
int luaSetRootNode(CLuaState &ls);
|
||||||
|
int luaForceRebuild(CLuaState &ls);
|
||||||
|
int luaSelectNodeById(CLuaState &ls);
|
||||||
|
int luaGetSelectedNodeId(CLuaState &ls);
|
||||||
|
int luaSelectLine(CLuaState &ls);
|
||||||
|
int luaUnselect(CLuaState &ls);
|
||||||
|
int luaGetNodeUnderMouse(CLuaState &ls);
|
||||||
|
int luaCancelNextSelectLine(CLuaState &ls);
|
||||||
|
|
||||||
|
// Reflection
|
||||||
|
REFLECT_EXPORT_START(CGroupTree, CInterfaceGroup)
|
||||||
|
REFLECT_BOOL ("navigate_one_branch", getNavigateOneBranch, changeNavigateOneBranch);
|
||||||
|
REFLECT_LUA_METHOD("getRootNode", luaGetRootNode);
|
||||||
|
REFLECT_LUA_METHOD("setRootNode", luaSetRootNode);
|
||||||
|
REFLECT_LUA_METHOD("forceRebuild", luaForceRebuild);
|
||||||
|
REFLECT_LUA_METHOD("getSelectedNodeId", luaGetSelectedNodeId);
|
||||||
|
REFLECT_LUA_METHOD("selectNodeById", luaSelectNodeById);
|
||||||
|
REFLECT_LUA_METHOD("selectLine", luaSelectLine);
|
||||||
|
REFLECT_LUA_METHOD("unselect", luaUnselect);
|
||||||
|
REFLECT_LUA_METHOD("getNodeUnderMouse", luaGetNodeUnderMouse);
|
||||||
|
REFLECT_LUA_METHOD("cancelNextSelectLine", luaCancelNextSelectLine);
|
||||||
|
REFLECT_EXPORT_END
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
void setupArbo();
|
||||||
|
sint32 _BmpW, _BmpH, _FontSize, _YDecal;
|
||||||
|
sint32 _XExtend;
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
// Display structure
|
||||||
|
struct SLine
|
||||||
|
{
|
||||||
|
CViewBase *TextOrTemplate;
|
||||||
|
std::vector<CViewBitmap*> Bmps;
|
||||||
|
SNode::TRefPtr Node;
|
||||||
|
uint8 Depth;
|
||||||
|
|
||||||
|
SLine()
|
||||||
|
{
|
||||||
|
TextOrTemplate = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
~SLine()
|
||||||
|
{
|
||||||
|
Bmps.clear();
|
||||||
|
}
|
||||||
|
uint getNumAdditionnalBitmap() const;
|
||||||
|
};
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
void rebuild();
|
||||||
|
void addTextLine (uint8 nDepth, SNode *pNode);
|
||||||
|
void addHierarchyBitmaps();
|
||||||
|
|
||||||
|
SNode *selectNodeByIdRecurse(SNode *pNode, const std::string &nodeId);
|
||||||
|
|
||||||
|
SNode *_RootNode;
|
||||||
|
sint32 _IdGenerator;
|
||||||
|
bool _MustRebuild;
|
||||||
|
std::vector<SLine> _Lines;
|
||||||
|
sint32 _OverLine;
|
||||||
|
NLMISC::CRGBA _OverColor;
|
||||||
|
NLMISC::CRGBA _OverColorBack;
|
||||||
|
SNode *_SelectedNode;
|
||||||
|
sint32 _SelectedLine;
|
||||||
|
NLMISC::CRGBA _SelectedColor;
|
||||||
|
|
||||||
|
// If a node is closed and a son of this node was selected, then this option force the ancestor being the new selection
|
||||||
|
bool _SelectAncestorOnClose;
|
||||||
|
bool _NavigateOneBranch;
|
||||||
|
bool _AvoidSelectNodeByIdIR;
|
||||||
|
|
||||||
|
// when an action handler is run, it can call 'cancelSelectLine' if no selection should be done for real
|
||||||
|
bool _CancelNextSelectLine;
|
||||||
|
|
||||||
|
|
||||||
|
// Bitmap For arbo
|
||||||
|
std::string _ArboOpenFirst;
|
||||||
|
std::string _ArboCloseJustOne;
|
||||||
|
std::string _ArboSonWithoutSon;
|
||||||
|
std::string _ArboSonLast;
|
||||||
|
std::string _ArboSon;
|
||||||
|
std::string _ArboLevel;
|
||||||
|
std::string _ArboXExtend;
|
||||||
|
|
||||||
|
// Special rectangle
|
||||||
|
bool _RectangleOutlineMode;
|
||||||
|
sint32 _RectangleX, _RectangleY;
|
||||||
|
sint32 _RectangleW, _RectangleH;
|
||||||
|
sint32 _RectangleDeltaRL;
|
||||||
|
|
||||||
|
sint32 getHrcIconXStart(sint32 depth);
|
||||||
|
sint32 getHrcIconXEnd(sint32 depth);
|
||||||
|
|
||||||
|
void drawSelection(sint x, sint y, sint w, NLMISC::CRGBA col);
|
||||||
|
|
||||||
|
CViewBitmap *createViewBitmap(uint line, const std::string &idPrefix, const std::string &texture);
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif // NL_GROUP_TREE_H
|
||||||
|
|
||||||
|
/* End of group_tree.h */
|
||||||
|
|
||||||
|
|
@ -0,0 +1,50 @@
|
|||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef RZ_GROUP_CONTAINER_H
|
||||||
|
#define RZ_GROUP_CONTAINER_H
|
||||||
|
|
||||||
|
#include "nel/gui/interface_group.h"
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
|
||||||
|
// Special group to handle the mouse wheel message
|
||||||
|
class CInterfaceGroupWheel : public CInterfaceGroup
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/// Constructor
|
||||||
|
CInterfaceGroupWheel(const TCtorParam ¶m);
|
||||||
|
|
||||||
|
std::string getProperty( const std::string &name ) const;
|
||||||
|
void setProperty( const std::string &name, const std::string &value );
|
||||||
|
xmlNodePtr serialize( xmlNodePtr parentNode, const char *type ) const;
|
||||||
|
|
||||||
|
/// Coming from CInterfaceElement
|
||||||
|
virtual bool parse(xmlNodePtr cur, CInterfaceGroup * parentGroup);
|
||||||
|
virtual bool handleEvent (const NLGUI::CEventDescriptor &event);
|
||||||
|
private:
|
||||||
|
IActionHandler *_AHWheelUp;
|
||||||
|
CStringShared _AHWheelUpParams;
|
||||||
|
IActionHandler *_AHWheelDown;
|
||||||
|
CStringShared _AHWheelDownParams;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1,36 @@
|
|||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
#ifndef INPUTEVENTLISTENER_H
|
||||||
|
#define INPUTEVENTLISTENER_H
|
||||||
|
|
||||||
|
#include "nel/misc/types_nl.h"
|
||||||
|
#include "nel/gui/event_descriptor.h"
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
@brief Interface for accepting GUI input events.
|
||||||
|
*/
|
||||||
|
class IInputEventListener
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual ~IInputEventListener(){}
|
||||||
|
virtual bool handleEvent( const CEventDescriptor &eventDesc ) = 0;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1,57 @@
|
|||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef INPUT_HANDLER_H
|
||||||
|
#define INPUT_HANDLER_H
|
||||||
|
|
||||||
|
#include "nel/misc/events.h"
|
||||||
|
#include "nel/gui/event_descriptor.h"
|
||||||
|
#include "nel/gui/input_event_listener.h"
|
||||||
|
|
||||||
|
namespace NLGUI{
|
||||||
|
|
||||||
|
/**
|
||||||
|
@brief The input event entry point of the GUI library.
|
||||||
|
|
||||||
|
Translates the NEL input events and forwards them.
|
||||||
|
*/
|
||||||
|
class CInputHandler
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CInputHandler();
|
||||||
|
~CInputHandler();
|
||||||
|
|
||||||
|
bool handleEvent( const NLMISC::CEvent &evnt );
|
||||||
|
bool handleSetFocusEvent( const NLMISC::CEvent &evnt );
|
||||||
|
bool handleKeyboardEvent( const NLMISC::CEvent &evnt );
|
||||||
|
bool handleMouseEvent( const NLMISC::CEvent &evnt );
|
||||||
|
bool handleMouseMoveEvent( const NLMISC::CEvent &evnt );
|
||||||
|
bool handleMouseButtonDownEvent( const NLMISC::CEvent &evnt );
|
||||||
|
bool handleMouseButtonUpEvent( const NLMISC::CEvent &evnt );
|
||||||
|
bool handleMouseDblClickEvent( const NLMISC::CEvent &evnt );
|
||||||
|
bool handleMouseWheelEvent( const NLMISC::CEvent &evnt );
|
||||||
|
|
||||||
|
void setListener( IInputEventListener* listener );
|
||||||
|
|
||||||
|
private:
|
||||||
|
IInputEventListener *listener;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,135 @@
|
|||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef RZ_INTERFACE_ANIM_H
|
||||||
|
#define RZ_INTERFACE_ANIM_H
|
||||||
|
|
||||||
|
#include "nel/gui/interface_property.h"
|
||||||
|
#include "nel/gui/interface_group.h"
|
||||||
|
#include "nel/gui/interface_link.h"
|
||||||
|
#include "nel/3d/animation_time.h"
|
||||||
|
#include "nel/3d/u_track.h"
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* class managing an animation track
|
||||||
|
* \author Matthieu 'TrapII' Besson
|
||||||
|
* \author Nevrax France
|
||||||
|
* \date 2003
|
||||||
|
*/
|
||||||
|
class CInterfaceTrack
|
||||||
|
{
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
CInterfaceTrack();
|
||||||
|
virtual ~CInterfaceTrack();
|
||||||
|
|
||||||
|
virtual bool parse (xmlNodePtr cur, CInterfaceGroup *parentGroup);
|
||||||
|
|
||||||
|
void update (double currentTime);
|
||||||
|
|
||||||
|
bool isDynamic () { return _Dynamic; }
|
||||||
|
|
||||||
|
void eval(); // Evaluate dynamic keys
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
enum ETrackType
|
||||||
|
{
|
||||||
|
Track_Linear,
|
||||||
|
Track_TCB,
|
||||||
|
Track_Bezier
|
||||||
|
};
|
||||||
|
|
||||||
|
struct SDynKey
|
||||||
|
{
|
||||||
|
std::string Time;
|
||||||
|
std::string Value;
|
||||||
|
std::string InTan;
|
||||||
|
std::string OutTan;
|
||||||
|
std::string Step;
|
||||||
|
std::string Tension;
|
||||||
|
std::string Continuity;
|
||||||
|
std::string Bias;
|
||||||
|
std::string EaseTo;
|
||||||
|
std::string EaseFrom;
|
||||||
|
};
|
||||||
|
|
||||||
|
bool _Dynamic;
|
||||||
|
std::vector<SDynKey> _DynKeys;
|
||||||
|
|
||||||
|
ETrackType _Type;
|
||||||
|
NL3D::UTrackKeyframer *_TrackKeyFramer;
|
||||||
|
std::vector<CInterfaceLink::CTargetInfo> _Targets;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* class managing an animation of the interface
|
||||||
|
* \author Matthieu 'TrapII' Besson
|
||||||
|
* \author Nevrax France
|
||||||
|
* \date 2003
|
||||||
|
*/
|
||||||
|
class CInterfaceAnim
|
||||||
|
{
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
CInterfaceAnim();
|
||||||
|
virtual ~CInterfaceAnim();
|
||||||
|
|
||||||
|
virtual bool parse (xmlNodePtr cur, CInterfaceGroup *parentGroup);
|
||||||
|
|
||||||
|
void update();
|
||||||
|
void start();
|
||||||
|
void stop();
|
||||||
|
|
||||||
|
bool isFinished() { return _Finished; }
|
||||||
|
bool isDisableButtons() { return _DisableButtons; }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
CInterfaceGroup *_Parent;
|
||||||
|
|
||||||
|
// Parsed properties
|
||||||
|
double _Duration;
|
||||||
|
bool _DisableButtons;
|
||||||
|
|
||||||
|
std::string _AHOnFinish;
|
||||||
|
std::string _AHOnFinishParams;
|
||||||
|
|
||||||
|
std::string _Id;
|
||||||
|
|
||||||
|
std::vector<CInterfaceTrack*> _Tracks;
|
||||||
|
|
||||||
|
// Current anim
|
||||||
|
double _CurrentTime;
|
||||||
|
bool _Finished;
|
||||||
|
bool _AnimHasToBeStopped;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // NL_INTERFACE_ANIM_H
|
||||||
|
|
||||||
|
/* End of interface_anim.h */
|
||||||
|
|
||||||
|
|
@ -0,0 +1,68 @@
|
|||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
#ifndef INTERFACE_COMMON_H
|
||||||
|
#define INTERFACE_COMMON_H
|
||||||
|
|
||||||
|
enum WindowsPriority
|
||||||
|
{
|
||||||
|
WIN_PRIORITY_WORLD_SPACE = 0,
|
||||||
|
WIN_PRIORITY_LOWEST = 1,
|
||||||
|
WIN_PRIORITY_LOW = 2,
|
||||||
|
WIN_PRIORITY_NORMAL = 3,
|
||||||
|
WIN_PRIORITY_HIGH = 4,
|
||||||
|
WIN_PRIORITY_HIGHEST = 5,
|
||||||
|
WIN_PRIORITY_MAX = 8
|
||||||
|
};
|
||||||
|
|
||||||
|
enum THotSpot
|
||||||
|
{
|
||||||
|
Hotspot_BL = 36, // 100100,
|
||||||
|
Hotspot_BM = 34, // 100010,
|
||||||
|
Hotspot_BR = 33, // 100001,
|
||||||
|
Hotspot_ML = 20, // 010100,
|
||||||
|
Hotspot_MM = 18, // 010010
|
||||||
|
Hotspot_MR = 17, // 010001
|
||||||
|
Hotspot_TL = 12, // 001100
|
||||||
|
Hotspot_TM = 10, // 001010
|
||||||
|
Hotspot_TR = 9, // 001001
|
||||||
|
Hotspot_xR = 1, // 000001
|
||||||
|
Hotspot_xM = 2, // 000010
|
||||||
|
Hotspot_xL = 4, // 000100
|
||||||
|
Hotspot_Bx = 32, // 100000
|
||||||
|
Hotspot_Mx = 16, // 010000
|
||||||
|
Hotspot_Tx = 8, // 001000
|
||||||
|
Hotspot_TTAuto = 0, // Special For Tooltip PosRef. Auto mode. see CCtrlBase and tooltip info
|
||||||
|
};
|
||||||
|
|
||||||
|
#define DECLARE_UI_CLASS(_class_) \
|
||||||
|
virtual std::string getClassName() {return #_class_;} \
|
||||||
|
static NLMISC::IClassable *creator() {return new _class_(CViewBase::TCtorParam());}
|
||||||
|
#define REGISTER_UI_CLASS(_class_) \
|
||||||
|
class CRegisterUIClassHelper_##_class_ \
|
||||||
|
{ \
|
||||||
|
public: \
|
||||||
|
CRegisterUIClassHelper_##_class_() \
|
||||||
|
{ \
|
||||||
|
NLMISC::CClassRegistry::init(); \
|
||||||
|
NLMISC::CClassRegistry::registerClass(#_class_, _class_::creator, typeid(_class_).name()); \
|
||||||
|
} \
|
||||||
|
} RegisterUIClassHelper_##_class_;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,637 @@
|
|||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef NL_INTERFACE_ELEMENT_H
|
||||||
|
#define NL_INTERFACE_ELEMENT_H
|
||||||
|
|
||||||
|
#include "nel/misc/types_nl.h"
|
||||||
|
#include "nel/misc/string_mapper.h"
|
||||||
|
#include "nel/misc/smart_ptr.h"
|
||||||
|
#include "nel/misc/vector.h"
|
||||||
|
#include "nel/gui/interface_property.h"
|
||||||
|
#include "nel/gui/reflect.h"
|
||||||
|
#include "nel/gui/interface_common.h"
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
class CGroupList;
|
||||||
|
class CInterfaceLink;
|
||||||
|
class CInterfaceElement;
|
||||||
|
class CInterfaceGroup;
|
||||||
|
class CViewBase;
|
||||||
|
class CCtrlBase;
|
||||||
|
class IActionHandler;
|
||||||
|
class CGroupParagraph;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A visitor to walk a tree of interface elements and apply a teartment on them.
|
||||||
|
*
|
||||||
|
* For each vsited element, visitElement() is called
|
||||||
|
* If the element is a control, then visitCtrl() is called, and then visitElement()
|
||||||
|
* If the element is a view, then visitView() is called, and then visitElement()
|
||||||
|
* If the element is a group, then visitGoup() is called, and then visitElement()
|
||||||
|
*
|
||||||
|
* \author Nicolas Vizerie
|
||||||
|
* \author Nevrax France
|
||||||
|
* \date 2003
|
||||||
|
*/
|
||||||
|
class CInterfaceElementVisitor
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual void visit(CInterfaceElement * /* elem */) {}
|
||||||
|
virtual void visitGroup(CInterfaceGroup * /* group */) {}
|
||||||
|
virtual void visitView(CViewBase * /* view */) {}
|
||||||
|
virtual void visitCtrl(CCtrlBase * /* ctrl */) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* class describing a localisable interface element, i.e. : an element with coordinates
|
||||||
|
* \author Nicolas Brigand
|
||||||
|
* \author Nevrax France
|
||||||
|
* \date 2002
|
||||||
|
*/
|
||||||
|
class CInterfaceElement : public CReflectableRefPtrTarget, public NLMISC::IStreamable
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
|
||||||
|
enum EStrech
|
||||||
|
{
|
||||||
|
none=0,
|
||||||
|
width=1,
|
||||||
|
height=2
|
||||||
|
};
|
||||||
|
|
||||||
|
/// Constructor
|
||||||
|
CInterfaceElement()
|
||||||
|
{
|
||||||
|
_Parent = NULL;
|
||||||
|
|
||||||
|
_XReal = _YReal = _WReal = _HReal = 0;
|
||||||
|
_X = _Y = _W = _H = 0;
|
||||||
|
//_Snap = 1;
|
||||||
|
|
||||||
|
_PosRef = Hotspot_BL;
|
||||||
|
_ParentPosRef = Hotspot_BL;
|
||||||
|
_ParentPos = NULL;
|
||||||
|
|
||||||
|
_SizeRef = 0;
|
||||||
|
_SizeDivW = 10;
|
||||||
|
_SizeDivH = 10;
|
||||||
|
_ParentSize = NULL;
|
||||||
|
|
||||||
|
_Links = NULL;
|
||||||
|
_Active= true;
|
||||||
|
// default to 3 pass
|
||||||
|
_InvalidCoords= 3;
|
||||||
|
|
||||||
|
_ModulateGlobalColor= true;
|
||||||
|
_RenderLayer= 0;
|
||||||
|
|
||||||
|
_AvoidResizeParent= false;
|
||||||
|
|
||||||
|
editorSelected = false;
|
||||||
|
|
||||||
|
serializable = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// dtor
|
||||||
|
virtual ~CInterfaceElement();
|
||||||
|
|
||||||
|
/** Cloning
|
||||||
|
* Cloning is actually performed using a serial / unserial in a memory stream
|
||||||
|
* NB Nico : if too slow, should use a CFastStream version instead, that is designedto work in memory only
|
||||||
|
*/
|
||||||
|
virtual CInterfaceElement *clone();
|
||||||
|
|
||||||
|
// help to serialize an action handler
|
||||||
|
static void serialAH(NLMISC::IStream &f, IActionHandler *&ah);
|
||||||
|
|
||||||
|
static std::string stripId( const std::string &fullId );
|
||||||
|
|
||||||
|
virtual std::string getProperty( const std::string &name ) const;
|
||||||
|
|
||||||
|
virtual void setProperty( const std::string &name, const std::string &value );
|
||||||
|
|
||||||
|
virtual xmlNodePtr serialize( xmlNodePtr parentNode, const char *type ) const;
|
||||||
|
|
||||||
|
/// Parse the element and initalize it
|
||||||
|
virtual bool parse (xmlNodePtr cur, CInterfaceGroup *parentGroup);
|
||||||
|
|
||||||
|
/// Debug info on memory
|
||||||
|
virtual uint32 getMemory () { return (uint32)(sizeof(*this)+_Id.size()); }
|
||||||
|
|
||||||
|
/// helper: display a parse error with the id of the lement
|
||||||
|
void parseError (CInterfaceGroup *parentGroup, const char *reason = NULL);
|
||||||
|
|
||||||
|
/// Accessors : GET
|
||||||
|
const std::string& getId() const { return _Id; }
|
||||||
|
std::string getShortId() const;
|
||||||
|
std::string getIdByValue() const { return _Id; }
|
||||||
|
|
||||||
|
CInterfaceGroup* getParent() const { return _Parent; }
|
||||||
|
|
||||||
|
CInterfaceElement* getParentPos() const { return _ParentPos; }
|
||||||
|
|
||||||
|
CInterfaceElement* getParentSize() const { return _ParentSize; }
|
||||||
|
|
||||||
|
/// Get the master group of this element (recurs call.
|
||||||
|
CInterfaceElement* getMasterGroup() const;
|
||||||
|
|
||||||
|
// get a possible group container
|
||||||
|
CInterfaceGroup* getParentContainer();
|
||||||
|
|
||||||
|
bool getActive() const { return _Active; }
|
||||||
|
|
||||||
|
sint32 getX() const { return _X; }
|
||||||
|
|
||||||
|
sint32 getY() const { return _Y; }
|
||||||
|
|
||||||
|
sint32 getW() const { return (_Active?_W:0); }
|
||||||
|
sint32 getW(bool bTestActive) const { return (bTestActive?(_Active?_W:0):_W); }
|
||||||
|
|
||||||
|
sint32 getH() const { return (_Active?_H:0); }
|
||||||
|
sint32 getH(bool bTestActive) const { return (bTestActive?(_Active?_H:0):_H); }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the max width used by the window.
|
||||||
|
*
|
||||||
|
* The view must return the largest width its content can take if it will be resized at maximum.
|
||||||
|
* Typical use : for a CTextView multiline, it returns the size of the whole string.
|
||||||
|
*
|
||||||
|
* This method is used by the container CCGroupTable that need to know this information about its children in its resizing algorithm.
|
||||||
|
*/
|
||||||
|
virtual sint32 getMaxUsedW() const { return INT_MAX; };
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the min width used by the window.
|
||||||
|
*
|
||||||
|
* The view must return the smallest width its content can take if it will be resized at minimum.
|
||||||
|
* Typical use : for a CTextView multiline without word clipping, it returns the size of the largest word.
|
||||||
|
*
|
||||||
|
* This method is used by the container CCGroupTable that need to know this information about its children in its resizing algorithm.
|
||||||
|
*/
|
||||||
|
virtual sint32 getMinUsedW() const { return 0; };
|
||||||
|
|
||||||
|
//bool isSnapped() const { return (_Snap>1); }
|
||||||
|
|
||||||
|
//sint32 getSnapping() const { return _Snap; }
|
||||||
|
|
||||||
|
sint32 getXReal() const { return _XReal; }
|
||||||
|
|
||||||
|
sint32 getYReal() const { return _YReal; }
|
||||||
|
|
||||||
|
sint32 getWReal() const { return (_Active?_WReal:0); }
|
||||||
|
|
||||||
|
sint32 getHReal() const { return (_Active?_HReal:0); }
|
||||||
|
|
||||||
|
THotSpot getPosRef () const { return _PosRef; }
|
||||||
|
|
||||||
|
THotSpot getParentPosRef () const { return _ParentPosRef; }
|
||||||
|
|
||||||
|
sint32 getSizeRef() const { return _SizeRef; } // none == 0, w == 1, h == 2, wh == 3
|
||||||
|
|
||||||
|
void setSizeRef(sint32 value) { _SizeRef = value; }
|
||||||
|
|
||||||
|
/// Accessors : SET
|
||||||
|
void setId (const std::string &newID) { _Id = newID; }
|
||||||
|
|
||||||
|
inline void setName(const std::string &name) { _Name = name; }
|
||||||
|
inline const std::string& getName() { return _Name; }
|
||||||
|
|
||||||
|
virtual void setIdRecurse(const std::string &newID);
|
||||||
|
|
||||||
|
void setParent (CInterfaceGroup *pIG) { _Parent = pIG; }
|
||||||
|
|
||||||
|
void setParentPos (CInterfaceElement *pIG) { _ParentPos = pIG; }
|
||||||
|
|
||||||
|
void setParentSize (CInterfaceElement *pIG) { _ParentSize = pIG; }
|
||||||
|
|
||||||
|
virtual void setActive (bool state);
|
||||||
|
|
||||||
|
void setX (sint32 x) { _X = x; }
|
||||||
|
void setXAndInvalidateCoords (sint32 x) { _X = x; invalidateCoords(); }
|
||||||
|
|
||||||
|
void setY (sint32 y) { _Y = y; }
|
||||||
|
void setYAndInvalidateCoords (sint32 y) { _Y = y; invalidateCoords(); }
|
||||||
|
|
||||||
|
void setW (sint32 w);
|
||||||
|
void setWAndInvalidateCoords (sint32 w) { setW(w); invalidateCoords(); }
|
||||||
|
|
||||||
|
void setH (sint32 h);
|
||||||
|
void setHAndInvalidateCoords (sint32 h) { setH(h); invalidateCoords(); }
|
||||||
|
|
||||||
|
void setPosRef (THotSpot hs) { _PosRef = hs; }
|
||||||
|
|
||||||
|
void setParentPosRef (THotSpot hs) { _ParentPosRef = hs; }
|
||||||
|
|
||||||
|
// Get the coordinate of a corner on screen
|
||||||
|
void getCorner(sint32 &px, sint32 &py, THotSpot hotSpot);
|
||||||
|
|
||||||
|
/** Test if the given coordinates are inside this element
|
||||||
|
*/
|
||||||
|
bool isIn(sint x, sint y) const;
|
||||||
|
|
||||||
|
/** Test if the given box intersect the element
|
||||||
|
*/
|
||||||
|
bool isIn(sint x, sint y, uint width, uint height) const;
|
||||||
|
|
||||||
|
/** Test if another interface element intersect this one
|
||||||
|
*/
|
||||||
|
bool isIn(const CInterfaceElement &other) const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* get the window containing the element
|
||||||
|
* \return NULL if the element is not on the window, otherwise returns a pointer to the window
|
||||||
|
*/
|
||||||
|
CInterfaceGroup* getRootWindow();
|
||||||
|
|
||||||
|
/** get the element Depth, ie the number of parent he has (0 if _Parent==NULL)
|
||||||
|
* \warning slow test. don't take into account CCtrlBase::getDeltaDepth() (since method not virtual)
|
||||||
|
*/
|
||||||
|
uint getParentDepth() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* true if the element and all its parents are active (recurs up to the root window)
|
||||||
|
*/
|
||||||
|
bool isActiveThroughParents() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* move the element (add dx and dy to its coords)
|
||||||
|
* \param dx : value added to _X
|
||||||
|
* \param dy : value added to _Y
|
||||||
|
*/
|
||||||
|
virtual void move (sint32 dx, sint32 dy);
|
||||||
|
|
||||||
|
//void resizeBR (sint32 sizex, sint32 sizey);
|
||||||
|
//void stopResizeBR();
|
||||||
|
//void startResizeBR();
|
||||||
|
|
||||||
|
// Some tools
|
||||||
|
|
||||||
|
void relativeSInt64Read (CInterfaceProperty &rIP, const std::string &prop, const char *val,
|
||||||
|
const std::string &defVal);
|
||||||
|
void relativeSInt32Read (CInterfaceProperty &rIP, const std::string &prop, const char *val,
|
||||||
|
const std::string &defVal);
|
||||||
|
void relativeBoolRead (CInterfaceProperty &rIP, const std::string &prop, const char *val,
|
||||||
|
const std::string &defVal);
|
||||||
|
void relativeRGBARead (CInterfaceProperty &rIP, const std::string &prop, const char *val,
|
||||||
|
const std::string &defVal);
|
||||||
|
|
||||||
|
// Parse tools
|
||||||
|
static std::string HotSpotToString( THotSpot spot );
|
||||||
|
static std::string HotSpotCoupleToString( THotSpot parentPosRef, THotSpot posRef );
|
||||||
|
static THotSpot convertHotSpot (const char *ptr); //
|
||||||
|
static void convertHotSpotCouple (const char *ptr, THotSpot &parentPosRef, THotSpot &posRef);
|
||||||
|
static NLMISC::CRGBA convertColor (const char *ptr);
|
||||||
|
static bool convertBool (const char *ptr);
|
||||||
|
static NLMISC::CVector convertVector (const char *ptr);
|
||||||
|
/** Convert a value that is in the form like width="50" or width="10%"
|
||||||
|
* if the value is absolute like '50' then 'pixels' is filled, else
|
||||||
|
* the ratio is remapped to the [0, 1] range and is copied in 'ratio'
|
||||||
|
*/
|
||||||
|
static void convertPixelsOrRatio(const char *ptr, sint32 &pixels, float &ratio);
|
||||||
|
|
||||||
|
// add an interface link to that element (kept in a smart ptr)
|
||||||
|
void addLink(CInterfaceLink *link);
|
||||||
|
|
||||||
|
// remove a link from that element; There's one less reference on the link (which is referenced by a smart ptr)
|
||||||
|
void removeLink(CInterfaceLink *link);
|
||||||
|
|
||||||
|
/** Update all links for this instance and its sons.
|
||||||
|
* Derivers should override this to update their sons.
|
||||||
|
*/
|
||||||
|
virtual void updateAllLinks();
|
||||||
|
|
||||||
|
|
||||||
|
/** This allow to force opening an element. By default it just activate the element.
|
||||||
|
* It allow to have different behaviour on more complex containers
|
||||||
|
*/
|
||||||
|
virtual void forceOpen() { setActive(true); }
|
||||||
|
|
||||||
|
virtual void enableBlink(uint /* numBlinks */ = 0) {}
|
||||||
|
virtual void disableBlink() {}
|
||||||
|
virtual bool getBlink() const { return false; }
|
||||||
|
|
||||||
|
// Options for views to be modulated by interface global color or not. Parsed with "global_color". Default: true
|
||||||
|
void setModulateGlobalColor(bool state) {_ModulateGlobalColor= state;}
|
||||||
|
bool getModulateGlobalColor() const {return _ModulateGlobalColor;}
|
||||||
|
|
||||||
|
|
||||||
|
void dummySet(sint32 value);
|
||||||
|
void dummySet(const std::string &value);
|
||||||
|
|
||||||
|
// lua methods
|
||||||
|
int luaUpdateCoords(CLuaState &ls);
|
||||||
|
int luaInvalidateCoords(CLuaState &ls);
|
||||||
|
int luaInvalidateContent(CLuaState &ls);
|
||||||
|
int luaCenter(CLuaState &ls);
|
||||||
|
int luaSetPosRef(CLuaState &ls);
|
||||||
|
int luaSetParentPos(CLuaState &ls);
|
||||||
|
|
||||||
|
// set sizeref as a string, like "wh", "wh5" ....
|
||||||
|
void setSizeRef(const std::string &sizeref);
|
||||||
|
std::string getSizeRefAsString() const;
|
||||||
|
std::string getSizeRefAsString( const sint32 &sizeRef, const sint32 &sizeDivW, const sint32 &sizeDivH ) const;
|
||||||
|
|
||||||
|
// export some properties
|
||||||
|
REFLECT_EXPORT_START(CInterfaceElement, CReflectable)
|
||||||
|
REFLECT_BOOL ("active", getActive, setActive);
|
||||||
|
REFLECT_BOOL ("global_color", getModulateGlobalColor, setModulateGlobalColor);
|
||||||
|
REFLECT_SINT32 ("x", getX, setXAndInvalidateCoords);
|
||||||
|
REFLECT_SINT32 ("y", getY, setYAndInvalidateCoords);
|
||||||
|
REFLECT_SINT32 ("w", getW, setWAndInvalidateCoords);
|
||||||
|
REFLECT_SINT32 ("h", getH, setHAndInvalidateCoords);
|
||||||
|
REFLECT_SINT32 ("x_real", getXReal, dummySet);
|
||||||
|
REFLECT_SINT32 ("y_real", getYReal, dummySet);
|
||||||
|
REFLECT_SINT32 ("w_real", getWReal, dummySet);
|
||||||
|
REFLECT_SINT32 ("h_real", getHReal, dummySet);
|
||||||
|
REFLECT_STRING ("id", getIdByValue, dummySet);
|
||||||
|
REFLECT_STRING ("sizeref", getSizeRefAsString, setSizeRef);
|
||||||
|
REFLECT_LUA_METHOD("updateCoords", luaUpdateCoords);
|
||||||
|
REFLECT_LUA_METHOD("invalidateCoords", luaInvalidateCoords);
|
||||||
|
REFLECT_LUA_METHOD("invalidateContent", luaInvalidateContent);
|
||||||
|
REFLECT_LUA_METHOD("center", luaCenter);
|
||||||
|
REFLECT_LUA_METHOD("setPosRef", luaSetPosRef);
|
||||||
|
REFLECT_LUA_METHOD("setParentPos", luaSetParentPos);
|
||||||
|
REFLECT_EXPORT_END
|
||||||
|
|
||||||
|
|
||||||
|
/* invalidate coords. set numPass==1 if you are SURE that only XReal/YReal need to be updated
|
||||||
|
* Default 3 is needed for:
|
||||||
|
* 1: update _W/_H and _WReal/_HReal according to Sons
|
||||||
|
* 2: update XReal/YReal (eg: according to Scroll offset)
|
||||||
|
*/
|
||||||
|
void invalidateCoords(uint8 numPass= 2);
|
||||||
|
uint8 getInvalidCoords() const {return _InvalidCoords;}
|
||||||
|
|
||||||
|
/* Invalidates the content of the window. This method invalidate the content of the window (for CViewText or CGroupTable).
|
||||||
|
* It invalidates the content of the parent too.
|
||||||
|
*/
|
||||||
|
void invalidateContent();
|
||||||
|
|
||||||
|
/* This call back is called when the content or the content of a child is been invalidated.
|
||||||
|
*/
|
||||||
|
virtual void onInvalidateContent() {}
|
||||||
|
|
||||||
|
// called by interfaceManager for master window only
|
||||||
|
void resetInvalidCoords();
|
||||||
|
|
||||||
|
/// Update the elements coords convert x,y,w,h (parentpos coord) to xreal,yreal,wreal,hreal (BL coord)
|
||||||
|
virtual void updateCoords();
|
||||||
|
/// Called each frame before draw to possibly invalidateCoords().
|
||||||
|
virtual void checkCoords();
|
||||||
|
|
||||||
|
/// Test if this element is son of the given element
|
||||||
|
bool isSonOf(const CInterfaceElement *other) const;
|
||||||
|
|
||||||
|
/// Called after first frame initialised
|
||||||
|
virtual void launch () {}
|
||||||
|
|
||||||
|
void setRenderLayer(sint8 rl) {_RenderLayer= rl;}
|
||||||
|
sint8 getRenderLayer() const { return _RenderLayer; }
|
||||||
|
|
||||||
|
void copyOptionFrom(const CInterfaceElement &other);
|
||||||
|
|
||||||
|
// center the element in middle of screen
|
||||||
|
void center();
|
||||||
|
|
||||||
|
// for debug only: draw wired quad to see where groups and hotspots are
|
||||||
|
enum TRenderWired
|
||||||
|
{
|
||||||
|
RenderView,
|
||||||
|
RenderCtrl,
|
||||||
|
RenderGroup
|
||||||
|
};
|
||||||
|
// if uiFilter is not empty, draw a quad only if the element id match
|
||||||
|
virtual void renderWiredQuads(TRenderWired type, const std::string &uiFilter);
|
||||||
|
|
||||||
|
void drawHotSpot(THotSpot hs, NLMISC::CRGBA col);
|
||||||
|
|
||||||
|
// Returns 'true' if that element can be downcasted to a view
|
||||||
|
virtual bool isView() const { return false; }
|
||||||
|
|
||||||
|
// Returns 'true' if that element can be downcasted to a ctrl
|
||||||
|
virtual bool isCtrl() const { return false; }
|
||||||
|
|
||||||
|
// Returns 'true' if that element can be downcasted to an interface group
|
||||||
|
virtual bool isGroup() const { return false; }
|
||||||
|
|
||||||
|
|
||||||
|
/** This is called before the config loading begins. This is the place to restore default state for config info.
|
||||||
|
*/
|
||||||
|
virtual void onLoadConfig() {}
|
||||||
|
/** Tells whether that element wants to save info in a config stream. If this returns true, then serialConfig
|
||||||
|
* is called.
|
||||||
|
*/
|
||||||
|
virtual bool wantSerialConfig() const { return false; }
|
||||||
|
// Serial config info about that element. This is called only if wantSerialConfig() returns true
|
||||||
|
virtual void serialConfig(NLMISC::IStream &f);
|
||||||
|
|
||||||
|
// visit the node of the ui tree
|
||||||
|
virtual void visit(CInterfaceElementVisitor *visitor);
|
||||||
|
|
||||||
|
/** When user is quitting the interface, this is called. Then the interface config is saved
|
||||||
|
* This is where the element get the opportunity to do some cleanup.
|
||||||
|
*/
|
||||||
|
virtual void onQuit() {}
|
||||||
|
|
||||||
|
/// Whent an element is added to a CInterfaceGroup via addCtrl, addGroup or addView, this is called after the add.
|
||||||
|
virtual void onAddToGroup() {}
|
||||||
|
|
||||||
|
/** typically used only in conjunction with CGroupInScene. Such groups move every Frames. so
|
||||||
|
* this function is called on each children elements to move the XReal/Yreal only (with a delta)
|
||||||
|
*/
|
||||||
|
virtual void onFrameUpdateWindowPos(sint dx, sint dy);
|
||||||
|
|
||||||
|
/// if true, InterfaceGroup child resize won't take this element into account
|
||||||
|
bool avoidResizeParent() const {return _AvoidResizeParent;}
|
||||||
|
void setAvoidResizeParent(bool state) {_AvoidResizeParent= state;}
|
||||||
|
|
||||||
|
virtual std::string getClassName()
|
||||||
|
{
|
||||||
|
nlassert(0); // forgot to implement serial & to register the class ?
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
bool isInGroup( CInterfaceGroup *group );
|
||||||
|
|
||||||
|
static void setEditorMode( bool b ){ editorMode = b; }
|
||||||
|
|
||||||
|
void setEditorSelected( bool b ){ editorSelected = b; }
|
||||||
|
bool isEditorSelected() const{ return editorSelected; }
|
||||||
|
|
||||||
|
void setPosParent( const std::string &id );
|
||||||
|
void setSizeParent( const std::string &id );
|
||||||
|
|
||||||
|
void setSerializable( bool b ){ serializable = b; }
|
||||||
|
bool IsSerializable() const{ return serializable; }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
bool editorSelected;
|
||||||
|
|
||||||
|
static bool editorMode;
|
||||||
|
|
||||||
|
///the parent
|
||||||
|
CInterfaceGroup* _Parent;
|
||||||
|
|
||||||
|
///the id of the element
|
||||||
|
std::string _Id;
|
||||||
|
|
||||||
|
std::string _Name;
|
||||||
|
|
||||||
|
///is the element active?
|
||||||
|
bool _Active;
|
||||||
|
|
||||||
|
// if 0, don't need updateCoords(), else tell the number of pass needed
|
||||||
|
uint8 _InvalidCoords;
|
||||||
|
|
||||||
|
// Real display coords
|
||||||
|
sint32 _XReal, _YReal, _WReal, _HReal;
|
||||||
|
|
||||||
|
// Relative coords
|
||||||
|
sint32 _X;
|
||||||
|
sint32 _Y;
|
||||||
|
sint32 _W;
|
||||||
|
sint32 _H;
|
||||||
|
|
||||||
|
//sint32 _Snap;
|
||||||
|
|
||||||
|
// position references e.g. : _PosRef=BL, _ParentPosref=MM : the bottom left corner of the element
|
||||||
|
// will be placed on the center (middle middle) of the parent window
|
||||||
|
THotSpot _PosRef;
|
||||||
|
THotSpot _ParentPosRef;
|
||||||
|
NLMISC::CRefPtr<CInterfaceElement> _ParentPos; // RefPtr in case of group destroyed in a parent group with posref on it
|
||||||
|
|
||||||
|
sint32 _SizeRef; // none == 0, w == 1, h == 2, wh == 3
|
||||||
|
sint32 _SizeDivW, _SizeDivH;
|
||||||
|
NLMISC::CRefPtr<CInterfaceElement> _ParentSize; // RefPtr in case of group destroyed in a parent group with posref on it
|
||||||
|
|
||||||
|
// Friend Class
|
||||||
|
friend class CGroupList;
|
||||||
|
friend class CGroupParagraph;
|
||||||
|
|
||||||
|
// True if must modulate the global color with the view
|
||||||
|
bool _ModulateGlobalColor;
|
||||||
|
// Index of layer to render it.
|
||||||
|
sint8 _RenderLayer;
|
||||||
|
|
||||||
|
// Used for CInterfaceGroup ChildResize feature
|
||||||
|
bool _AvoidResizeParent;
|
||||||
|
|
||||||
|
|
||||||
|
virtual void serial(NLMISC::IStream &f);
|
||||||
|
|
||||||
|
void parseSizeRef(const char *sizeRef);
|
||||||
|
void parseSizeRef(const char *sizeRefStr, sint32 &sizeref, sint32 &sizeDivW, sint32 &sizeDivH);
|
||||||
|
|
||||||
|
private:
|
||||||
|
//void snapSize();
|
||||||
|
bool serializable;
|
||||||
|
|
||||||
|
typedef NLMISC::CSmartPtr<CInterfaceLink> TLinkSmartPtr;
|
||||||
|
typedef std::vector<TLinkSmartPtr> TLinkVect;
|
||||||
|
TLinkVect *_Links; // links, or NULL if no link
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* class to compress string usage in the interface
|
||||||
|
* \author Matthieu 'Trap' Besson
|
||||||
|
* \author Nevrax France
|
||||||
|
* \date October 2003
|
||||||
|
*/
|
||||||
|
class CStringShared
|
||||||
|
{
|
||||||
|
|
||||||
|
public:
|
||||||
|
CStringShared()
|
||||||
|
{
|
||||||
|
_Id = NLMISC::CStringMapper::emptyId();
|
||||||
|
}
|
||||||
|
|
||||||
|
const CStringShared& operator=(const std::string &str)
|
||||||
|
{
|
||||||
|
_Id = _UIStringMapper->localMap(str);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
const CStringShared& operator=(const CStringShared &str)
|
||||||
|
{
|
||||||
|
_Id = str._Id;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
const std::string &toString() const
|
||||||
|
{
|
||||||
|
return _UIStringMapper->localUnmap(_Id);
|
||||||
|
}
|
||||||
|
|
||||||
|
operator const std::string &() const
|
||||||
|
{
|
||||||
|
return _UIStringMapper->localUnmap(_Id);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool empty() const
|
||||||
|
{
|
||||||
|
return _Id == NLMISC::CStringMapper::emptyId();
|
||||||
|
}
|
||||||
|
|
||||||
|
static CStringShared emptyString()
|
||||||
|
{
|
||||||
|
return CStringShared();
|
||||||
|
}
|
||||||
|
|
||||||
|
NLMISC::TStringId getStringId() const { return _Id; }
|
||||||
|
|
||||||
|
void serial(NLMISC::IStream &f)
|
||||||
|
{
|
||||||
|
std::string str;
|
||||||
|
if (f.isReading())
|
||||||
|
{
|
||||||
|
f.serial(str);
|
||||||
|
*this = str;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
str = this->toString();
|
||||||
|
f.serial(str);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void createStringMapper();
|
||||||
|
static void deleteStringMapper();
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
NLMISC::TStringId _Id;
|
||||||
|
static NLMISC::CStringMapper *_UIStringMapper;
|
||||||
|
};
|
||||||
|
|
||||||
|
inline bool operator==(const CStringShared &lhs, const CStringShared &rhs) { return lhs.getStringId() == rhs.getStringId(); }
|
||||||
|
inline bool operator!=(const CStringShared &lhs, const CStringShared &rhs) { return !(lhs == rhs); }
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
using namespace NLGUI;
|
||||||
|
|
||||||
|
#endif // NL_INTERFACE_ELEMENT_H
|
||||||
|
|
||||||
|
/* End of interface_element.h */
|
@ -0,0 +1,239 @@
|
|||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
#ifndef CL_INTERFACE_EXPR_H
|
||||||
|
#define CL_INTERFACE_EXPR_H
|
||||||
|
|
||||||
|
|
||||||
|
#include "nel/misc/ucstring.h"
|
||||||
|
#include "nel/misc/rgba.h"
|
||||||
|
|
||||||
|
namespace NLMISC{
|
||||||
|
class ICDBNode;
|
||||||
|
class CCDBNodeLeaf;
|
||||||
|
class CCDBNodeBranch;
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
|
||||||
|
struct CInterfaceExprUserType;
|
||||||
|
class CInterfaceExprNode;
|
||||||
|
|
||||||
|
/** a value that can be returned by a CInterfaceExpr instance
|
||||||
|
* It supports basic type;
|
||||||
|
* It can be extended by user defined types
|
||||||
|
*/
|
||||||
|
class CInterfaceExprValue
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
enum TType { Boolean = 0, Integer, Double, String, RGBA, UserType, NoType };
|
||||||
|
public:
|
||||||
|
// default ctor
|
||||||
|
CInterfaceExprValue() : _Type(NoType) {}
|
||||||
|
// copy ctor
|
||||||
|
CInterfaceExprValue(const CInterfaceExprValue &other);
|
||||||
|
// assignment operator
|
||||||
|
CInterfaceExprValue &operator = (const CInterfaceExprValue &other);
|
||||||
|
// dtor
|
||||||
|
~CInterfaceExprValue() { clean(); }
|
||||||
|
|
||||||
|
TType getType() const { return _Type; }
|
||||||
|
// get. Should be used only if the type is valid
|
||||||
|
bool getBool() const;
|
||||||
|
sint64 getInteger() const;
|
||||||
|
double getDouble() const;
|
||||||
|
std::string getString() const;
|
||||||
|
NLMISC::CRGBA getRGBA() const;
|
||||||
|
const ucstring &getUCString() const;
|
||||||
|
CInterfaceExprUserType *getUserType() const;
|
||||||
|
// set
|
||||||
|
void setBool(bool value) { clean(); _Type = Boolean; _BoolValue = value; }
|
||||||
|
void setInteger(sint64 value) { clean(); _Type = Integer; _IntegerValue = value; }
|
||||||
|
void setDouble(double value) { clean(); _Type = Double; _DoubleValue = value; }
|
||||||
|
void setString(const std::string &value) { clean(); _Type = String; _StringValue = value; }
|
||||||
|
void setUCString(const ucstring &value) { clean(); _Type = String; _StringValue = value; }
|
||||||
|
void setRGBA(NLMISC::CRGBA value) { clean(); _Type = RGBA; _RGBAValue = (uint32)(value.R+(value.G<<8)+(value.B<<16)+(value.A<<24)); }
|
||||||
|
void setUserType(CInterfaceExprUserType *value);
|
||||||
|
// reset this object to initial state (no type)
|
||||||
|
void clean();
|
||||||
|
// conversions. They return true if success
|
||||||
|
bool toBool();
|
||||||
|
bool toInteger();
|
||||||
|
bool toDouble();
|
||||||
|
bool toString();
|
||||||
|
bool toType(TType type);
|
||||||
|
bool toRGBA();
|
||||||
|
// test if the value if a bool, double, or integer
|
||||||
|
bool isNumerical() const;
|
||||||
|
/** evaluate a from a string
|
||||||
|
* \param expr : where to start the evaluation
|
||||||
|
* \return the position following the token, or NULL if the parsing failed
|
||||||
|
*/
|
||||||
|
const char *initFromString(const char *expr);
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
private:
|
||||||
|
TType _Type;
|
||||||
|
union
|
||||||
|
{
|
||||||
|
bool _BoolValue;
|
||||||
|
sint64 _IntegerValue;
|
||||||
|
double _DoubleValue;
|
||||||
|
CInterfaceExprUserType *_UserTypeValue;
|
||||||
|
uint32 _RGBAValue;
|
||||||
|
};
|
||||||
|
ucstring _StringValue; // well, can't fit in union, unless we do some horrible hack..
|
||||||
|
private:
|
||||||
|
const char *evalBoolean(const char *expr);
|
||||||
|
const char *evalNumber(const char *expr);
|
||||||
|
const char *evalString(const char *expr);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Base class for user defined types that are use by the 'CInterfaceExprValue' class
|
||||||
|
* Derivers should include the 'clone' method
|
||||||
|
*
|
||||||
|
* CInterfaceExprValue instances have ownership of this object.
|
||||||
|
*
|
||||||
|
* \author Nicolas Vizerie
|
||||||
|
* \author Nevrax France
|
||||||
|
* \date 2003
|
||||||
|
*/
|
||||||
|
struct CInterfaceExprUserType
|
||||||
|
{
|
||||||
|
// cloning method
|
||||||
|
virtual CInterfaceExprUserType *clone() const = 0;
|
||||||
|
// dtor
|
||||||
|
virtual ~CInterfaceExprUserType() {}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/** Evaluate expressions used in interface.
|
||||||
|
* It can retrieve values from the database.
|
||||||
|
* It can also build a list of database values it depends of.
|
||||||
|
*
|
||||||
|
* An expression can be :
|
||||||
|
*
|
||||||
|
* - a string : 'toto', 'abcd', 'a\nbcd', 'a\\t', the escape sequences are the one of C
|
||||||
|
* - a integer 1, 2, 3
|
||||||
|
* - a double 1.1, 2.2
|
||||||
|
* - a database entry : @ui:interface:toto:truc. If the address is a leaf, it returns the leaf value and put an observer on it. If not a leaf, it returns 0, but put an observer on it.
|
||||||
|
* - a database indirection @db:value[db:index] is replaced by @db:value0 if db:index == 0 for example
|
||||||
|
* - a user function call : fct(expr0, epxr1, ...).
|
||||||
|
*
|
||||||
|
* NB : The lua language has been integrated since then (2005), and should be more suited
|
||||||
|
* for most of the tasks.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* \author Nicolas Vizerie
|
||||||
|
* \author Nevrax France
|
||||||
|
* \date 2002
|
||||||
|
*/
|
||||||
|
class CInterfaceExpr
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
// list of argument for a function
|
||||||
|
typedef std::vector<CInterfaceExprValue> TArgList;
|
||||||
|
/** prototype of a user callable function
|
||||||
|
* It should return true if the result is meaningful. If not, the rest of the evaluation is stopped
|
||||||
|
*/
|
||||||
|
typedef bool (* TUserFct) (TArgList &args, CInterfaceExprValue &result);
|
||||||
|
public:
|
||||||
|
|
||||||
|
// release memory
|
||||||
|
static void release();
|
||||||
|
|
||||||
|
/** This try to eval the provided expression.
|
||||||
|
* - This returns a result
|
||||||
|
* - This eventually fill a vector with a set of database entries it has dependencies on
|
||||||
|
* \param expr The expression to evaluate
|
||||||
|
* \param result The result value
|
||||||
|
* \param nodes If not NULL, will be filled with the database nodes this expression depends on
|
||||||
|
* Node will only be inserted once, so we end up with a set of node (not ordered)
|
||||||
|
* \param noFctCalls when set to true, the terminal function calls will not be made, so the evaluation is only used to see which database entries the expression depends on.
|
||||||
|
*/
|
||||||
|
static bool eval(const std::string &expr, CInterfaceExprValue &result, std::vector<NLMISC::ICDBNode *> *nodes = NULL, bool noFctCalls = false);
|
||||||
|
|
||||||
|
/** Build a tree from the given expression so that it can be evaluated quickly.
|
||||||
|
* This is useful for a fixed expression that must be evaluated often
|
||||||
|
*/
|
||||||
|
static CInterfaceExprNode *buildExprTree(const std::string &expr);
|
||||||
|
|
||||||
|
|
||||||
|
/** Register a function that can have several arguments
|
||||||
|
* // NB : this is case sensitive
|
||||||
|
*/
|
||||||
|
static void registerUserFct(const char *name, TUserFct fct);
|
||||||
|
// Simple evaluations
|
||||||
|
static bool evalAsInt(const std::string &expr, sint64 &dest);
|
||||||
|
static bool evalAsDouble(const std::string &expr, double &dest);
|
||||||
|
static bool evalAsBool(const std::string &expr, bool &dest);
|
||||||
|
static bool evalAsString(const std::string &expr, std::string &dest);
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
private:
|
||||||
|
// map of user functions
|
||||||
|
typedef std::map<std::string, TUserFct> TUserFctMap;
|
||||||
|
private:
|
||||||
|
static TUserFctMap *_UserFct;
|
||||||
|
private:
|
||||||
|
/** eval the value of a single expression
|
||||||
|
* \return position to the next valid character
|
||||||
|
*/
|
||||||
|
static const char *evalExpr(const char *expr, CInterfaceExprValue &result, std::vector<NLMISC::ICDBNode *> *nodes, bool noFctCalls);
|
||||||
|
static const char *evalFct(const char *expr,CInterfaceExprValue &result,std::vector<NLMISC::ICDBNode *> *nodes, bool noFctCalls);
|
||||||
|
static const char *evalDBEntry(const char *expr,CInterfaceExprValue &result,std::vector<NLMISC::ICDBNode *> *nodes);
|
||||||
|
public:
|
||||||
|
static const char *unpackDBentry(const char *expr, std::vector<NLMISC::ICDBNode *> *nodes, std::string &dest, bool *hasIndirections = NULL);
|
||||||
|
|
||||||
|
/** Build tree of a single expression
|
||||||
|
* \return position to the next valid character
|
||||||
|
*/
|
||||||
|
private:
|
||||||
|
static const char *buildExprTree(const char *expr, CInterfaceExprNode *&result);
|
||||||
|
static const char *buildFctNode(const char *expr, CInterfaceExprNode *&result);
|
||||||
|
static const char *buildDBEntryNode(const char *expr,CInterfaceExprNode *&result);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// helper macro to register user functions at startup
|
||||||
|
#define REGISTER_INTERFACE_USER_FCT(name, fct) \
|
||||||
|
const struct __InterUserFctRegister__##fct\
|
||||||
|
{\
|
||||||
|
__InterUserFctRegister__##fct() { CInterfaceExpr::registerUserFct(name, fct); }\
|
||||||
|
} __InterUserFctRegisterInstance__##fct;
|
||||||
|
|
||||||
|
|
||||||
|
// helper macro to declare a user function
|
||||||
|
// the code must follow
|
||||||
|
// arguments are available in 'args', result should be put in 'result'
|
||||||
|
#define DECLARE_INTERFACE_USER_FCT(name) \
|
||||||
|
bool name(CInterfaceExpr::TArgList &args, CInterfaceExprValue &result)
|
||||||
|
|
||||||
|
|
||||||
|
// helper macro to declare a C constant mirroring
|
||||||
|
#define DECLARE_INTERFACE_CONSTANT(_name, _cconst) \
|
||||||
|
static DECLARE_INTERFACE_USER_FCT(_name) \
|
||||||
|
{ \
|
||||||
|
result.setInteger(_cconst); \
|
||||||
|
return true; \
|
||||||
|
} \
|
||||||
|
REGISTER_INTERFACE_USER_FCT(#_name, _name)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,118 @@
|
|||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef CL_INTERFACE_EXPR_NODE_H
|
||||||
|
#define CL_INTERFACE_EXPR_NODE_H
|
||||||
|
|
||||||
|
#include "interface_expr.h"
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
|
||||||
|
/** Base node of an interface expression parse tree
|
||||||
|
* \author Nicolas Vizerie
|
||||||
|
* \author Nevrax France
|
||||||
|
* \date 2003
|
||||||
|
*/
|
||||||
|
class CInterfaceExprNode
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual ~CInterfaceExprNode() {}
|
||||||
|
// eval result of expression, and eventually get the nodes the epression depends on
|
||||||
|
virtual void eval(CInterfaceExprValue &result) = 0;
|
||||||
|
// The same, but get db nodes the expression depends on (appended to vector)
|
||||||
|
virtual void evalWithDepends(CInterfaceExprValue &result, std::vector<NLMISC::ICDBNode *> &nodes) = 0;
|
||||||
|
// Get dependencies of the node (appended to vector)
|
||||||
|
virtual void getDepends(std::vector<NLMISC::ICDBNode *> &nodes) = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// *******************************************************************************************************
|
||||||
|
/** A constant value already parsed by interface (in a interface expr parse tree)
|
||||||
|
*/
|
||||||
|
class CInterfaceExprNodeValue : public CInterfaceExprNode
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CInterfaceExprValue Value;
|
||||||
|
public:
|
||||||
|
virtual void eval(CInterfaceExprValue &result);
|
||||||
|
virtual void evalWithDepends(CInterfaceExprValue &result, std::vector<NLMISC::ICDBNode *> &nodes);
|
||||||
|
virtual void getDepends(std::vector<NLMISC::ICDBNode *> &nodes);
|
||||||
|
};
|
||||||
|
|
||||||
|
// *******************************************************************************************************
|
||||||
|
/** A fct call (in a interface expr parse tree)
|
||||||
|
*/
|
||||||
|
class CInterfaceExprNodeValueFnCall : public CInterfaceExprNode
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CInterfaceExpr::TUserFct Func;
|
||||||
|
// list of parameters
|
||||||
|
std::vector<CInterfaceExprNode *> Params;
|
||||||
|
public:
|
||||||
|
virtual void eval(CInterfaceExprValue &result);
|
||||||
|
virtual void evalWithDepends(CInterfaceExprValue &result, std::vector<NLMISC::ICDBNode *> &nodes);
|
||||||
|
virtual void getDepends(std::vector<NLMISC::ICDBNode *> &nodes);
|
||||||
|
virtual ~CInterfaceExprNodeValueFnCall();
|
||||||
|
};
|
||||||
|
|
||||||
|
// *******************************************************************************************************
|
||||||
|
/** A db leaf read (in a interface expr parse tree)
|
||||||
|
*/
|
||||||
|
class CInterfaceExprNodeDBLeaf : public CInterfaceExprNode
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
class NLMISC::CCDBNodeLeaf *Leaf;
|
||||||
|
public:
|
||||||
|
virtual void eval(CInterfaceExprValue &result);
|
||||||
|
virtual void evalWithDepends(CInterfaceExprValue &result, std::vector<NLMISC::ICDBNode *> &nodes);
|
||||||
|
virtual void getDepends(std::vector<NLMISC::ICDBNode *> &nodes);
|
||||||
|
};
|
||||||
|
|
||||||
|
// *******************************************************************************************************
|
||||||
|
/** A db branch read (in a interface expr parse tree)
|
||||||
|
*/
|
||||||
|
class CInterfaceExprNodeDBBranch : public CInterfaceExprNode
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
class NLMISC::CCDBNodeBranch *Branch;
|
||||||
|
public:
|
||||||
|
virtual void eval(CInterfaceExprValue &result);
|
||||||
|
virtual void evalWithDepends(CInterfaceExprValue &result, std::vector<NLMISC::ICDBNode *> &nodes);
|
||||||
|
virtual void getDepends(std::vector<NLMISC::ICDBNode *> &nodes);
|
||||||
|
};
|
||||||
|
|
||||||
|
// *******************************************************************************************************
|
||||||
|
/** A dependant db read (in a interface expr parse tree)
|
||||||
|
* This is rarely used so no real optim there..
|
||||||
|
*/
|
||||||
|
class CInterfaceExprNodeDependantDBRead : public CInterfaceExprNode
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
std::string Expr;
|
||||||
|
public:
|
||||||
|
virtual void eval(CInterfaceExprValue &result);
|
||||||
|
virtual void evalWithDepends(CInterfaceExprValue &result, std::vector<NLMISC::ICDBNode *> &nodes);
|
||||||
|
virtual void getDepends(std::vector<NLMISC::ICDBNode *> &nodes);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1,422 @@
|
|||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef NL_INTERFACE_GROUP_H
|
||||||
|
#define NL_INTERFACE_GROUP_H
|
||||||
|
|
||||||
|
#include "nel/gui/ctrl_base.h"
|
||||||
|
#include "nel/gui/action_handler.h"
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
|
||||||
|
class CInterfaceGroup : public CCtrlBase
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
DECLARE_UI_CLASS(CInterfaceGroup)
|
||||||
|
|
||||||
|
/// Constructor
|
||||||
|
CInterfaceGroup(const TCtorParam ¶m);
|
||||||
|
|
||||||
|
/// Destructor
|
||||||
|
virtual ~CInterfaceGroup();
|
||||||
|
|
||||||
|
virtual void setIdRecurse(const std::string &id);
|
||||||
|
|
||||||
|
/// Coming from CInterfaceElement
|
||||||
|
virtual bool parse(xmlNodePtr cur, CInterfaceGroup * parentGroup);
|
||||||
|
|
||||||
|
std::string getProperty( const std::string &name ) const;
|
||||||
|
void setProperty( const std::string &name, const std::string &value );
|
||||||
|
xmlNodePtr serialize( xmlNodePtr parentNode, const char *type ) const;
|
||||||
|
xmlNodePtr serializeGroup( xmlNodePtr parentNode, const char *type ) const;
|
||||||
|
xmlNodePtr serializeSubGroups( xmlNodePtr parentNode ) const;
|
||||||
|
xmlNodePtr serializeControls( xmlNodePtr parentNode ) const;
|
||||||
|
xmlNodePtr serializeViews( xmlNodePtr parentNode ) const;
|
||||||
|
virtual xmlNodePtr serializeTreeData( xmlNodePtr parentNode ) const;
|
||||||
|
bool serializeLinks( xmlNodePtr parentNode ) const;
|
||||||
|
|
||||||
|
virtual uint32 getMemory ();
|
||||||
|
|
||||||
|
virtual CInterfaceElement* getElement (const std::string &id);
|
||||||
|
CInterfaceElement* findFromShortId(const std::string &id);
|
||||||
|
|
||||||
|
/// Dynamic creation
|
||||||
|
virtual void addView (CViewBase *child , sint eltOrder = -1);
|
||||||
|
virtual void addCtrl (CCtrlBase *child, sint eltOrder = -1);
|
||||||
|
virtual void addGroup (CInterfaceGroup *child, sint eltOrder = -1);
|
||||||
|
|
||||||
|
CViewBase* getView (const std::string &id);
|
||||||
|
CCtrlBase* getCtrl (const std::string &id);
|
||||||
|
CInterfaceGroup* getGroup(const std::string &id) const;
|
||||||
|
|
||||||
|
// Delete know type by ptr (return true if found and removed)
|
||||||
|
virtual bool delView (CViewBase *child, bool dontDelete = false);
|
||||||
|
virtual bool delCtrl (CCtrlBase *child, bool dontDelete = false);
|
||||||
|
virtual bool delGroup (CInterfaceGroup * child, bool dontDelete = false);
|
||||||
|
|
||||||
|
// Delete know type by name (return true if found and removed)
|
||||||
|
virtual bool delView (const std::string &id, bool dontDelete = false);
|
||||||
|
virtual bool delCtrl (const std::string &id, bool dontDelete = false);
|
||||||
|
virtual bool delGroup (const std::string &id, bool dontDelete = false);
|
||||||
|
|
||||||
|
// Delete unknow type by name or ptr. NB: additionaly, if it's a group, unmakeWindow() is called as necessary
|
||||||
|
bool delElement (const std::string &id, bool noWarning=false);
|
||||||
|
bool delElement (CInterfaceElement *pIE, bool noWarning=false);
|
||||||
|
|
||||||
|
uint getNumGroup() const { return (uint)_ChildrenGroups.size(); }
|
||||||
|
CInterfaceGroup *getGroup(uint index) const;
|
||||||
|
|
||||||
|
sint32 getMaxUsedW() const;
|
||||||
|
sint32 getMinUsedW() const;
|
||||||
|
|
||||||
|
/// Coming from CCtrlBase
|
||||||
|
virtual bool handleEvent (const NLGUI::CEventDescriptor &event);
|
||||||
|
|
||||||
|
void executeControl (const std::string &sControlName);
|
||||||
|
|
||||||
|
const std::vector<CInterfaceGroup*> & getGroups () { return _ChildrenGroups; }
|
||||||
|
const std::vector<CCtrlBase*> & getControls() { return _Controls; }
|
||||||
|
const std::vector<CViewBase*> & getViews() { return _Views; }
|
||||||
|
|
||||||
|
// test is a group is a direct child of this interface group
|
||||||
|
bool isChildGroup(const CInterfaceGroup *group) const;
|
||||||
|
|
||||||
|
virtual bool isWindowUnder (sint32 x, sint32 y); // Virtual for menu that is not square
|
||||||
|
CInterfaceGroup *getGroupUnder (sint32 x, sint32 y);
|
||||||
|
virtual bool getViewsUnder (sint32 x, sint32 y, sint32 clipX, sint32 clipY, sint32 clipW, sint32 clipH, std::vector<CViewBase*> &vVB); // Return true if x,y under the group
|
||||||
|
virtual bool getCtrlsUnder (sint32 x, sint32 y, sint32 clipX, sint32 clipY, sint32 clipW, sint32 clipH, std::vector<CCtrlBase*> &vICL);
|
||||||
|
virtual bool getGroupsUnder (sint32 x, sint32 y, sint32 clipX, sint32 clipY, sint32 clipW, sint32 clipH, std::vector<CInterfaceGroup *> &vIGL);
|
||||||
|
|
||||||
|
void absoluteToRelative (sint32 &x, sint32 &y);
|
||||||
|
|
||||||
|
/// Coming from CViewBase
|
||||||
|
virtual void draw ();
|
||||||
|
// Draw with no clip (if clip is done by parent)
|
||||||
|
virtual void drawNoClip();
|
||||||
|
|
||||||
|
/// Tool function to draw a single Element that should exist in the group (clipped by the group)
|
||||||
|
void drawElement (CViewBase *el);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* update the elements coords
|
||||||
|
*/
|
||||||
|
virtual void checkCoords();
|
||||||
|
virtual void updateCoords();
|
||||||
|
|
||||||
|
/// remove all views
|
||||||
|
virtual void clearViews();
|
||||||
|
|
||||||
|
/// remove all controls
|
||||||
|
virtual void clearControls();
|
||||||
|
|
||||||
|
/// remove all groups
|
||||||
|
virtual void clearGroups();
|
||||||
|
|
||||||
|
void setParentSizeMax(CInterfaceElement *pIE) { _ParentSizeMax = pIE; }
|
||||||
|
void setMaxW (sint32 maxw) { _MaxW = maxw; }
|
||||||
|
void setMaxH (sint32 maxh) { _MaxH = maxh; }
|
||||||
|
void setOfsX (sint32 x) { _OffsetX = x; }
|
||||||
|
void setOfsY (sint32 y) { _OffsetY = y; }
|
||||||
|
bool moveSBTrackY (CInterfaceGroup *target, sint32 dy);
|
||||||
|
bool moveSBTargetY (CInterfaceGroup *target, sint32 dy);
|
||||||
|
void setResizeFromChildW(bool resize) { _ResizeFromChildW = resize; }
|
||||||
|
void setResizeFromChildH(bool resize) { _ResizeFromChildH = resize; }
|
||||||
|
|
||||||
|
// Valid only for windows InterfaceGroup.
|
||||||
|
// escapable
|
||||||
|
void setEscapable(bool b) { _Escapable= b; }
|
||||||
|
bool getEscapable() const { return _Escapable; }
|
||||||
|
void setAHOnEscape(const std::string &ah) { _AHOnEscape = CAHManager::getInstance()->getAH(ah, _AHOnEscapeParams); }
|
||||||
|
const std::string &getAHOnEscape() const { return CAHManager::getInstance()->getAHName(_AHOnEscape); }
|
||||||
|
void setAHOnEscapeParams(const std::string &ah) { _AHOnEscapeParams = ah; }
|
||||||
|
const std::string &getAHOnEscapeParams() const { return _AHOnEscapeParams; }
|
||||||
|
// enterable
|
||||||
|
void setAHOnEnter(const std::string &ah) { _AHOnEnter = CAHManager::getInstance()->getAH(ah, _AHOnEnterParams); }
|
||||||
|
const std::string &getAHOnEnter() const { return CAHManager::getInstance()->getAHName(_AHOnEnter); }
|
||||||
|
void setAHOnEnterParams(const std::string &ah) { _AHOnEnterParams = ah; }
|
||||||
|
const std::string &getAHOnEnterParams() const { return _AHOnEnterParams; }
|
||||||
|
uint8 getPriority() const { return _Priority; }
|
||||||
|
void setPriority(uint8 nprio);
|
||||||
|
|
||||||
|
|
||||||
|
sint32 getMaxW () const { return _MaxW; }
|
||||||
|
sint32 getMaxH () const { return _MaxH; }
|
||||||
|
sint32 getMaxWReal () const { return _Active ? _MaxWReal : 0; }
|
||||||
|
sint32 getMaxHReal () const { return _Active ? _MaxHReal : 0; }
|
||||||
|
sint32 getOfsX () const { return _OffsetX; }
|
||||||
|
sint32 getOfsY () const { return _OffsetY; }
|
||||||
|
bool getResizeFromChildW() const { return _ResizeFromChildW; }
|
||||||
|
bool getResizeFromChildH() const { return _ResizeFromChildH; }
|
||||||
|
sint32 getResizeFromChildWMargin() const { return _ResizeFromChildWMargin; }
|
||||||
|
sint32 getResizeFromChildHMargin() const { return _ResizeFromChildHMargin; }
|
||||||
|
void setResizeFromChildWMargin(sint32 margin) { _ResizeFromChildWMargin = margin; }
|
||||||
|
void setResizeFromChildHMargin(sint32 margin) { _ResizeFromChildHMargin = margin; }
|
||||||
|
bool getOverlappable() const { return _Overlappable; }
|
||||||
|
|
||||||
|
virtual void setActive (bool state);
|
||||||
|
|
||||||
|
// eval dimension of children bbox
|
||||||
|
void evalChildrenBBox(bool resizeFromChildW, bool resizeFromChildH, sint &width, sint &height) const;
|
||||||
|
|
||||||
|
virtual void launch ();
|
||||||
|
|
||||||
|
|
||||||
|
// right & left clicks handler
|
||||||
|
void setLeftClickHandler(const std::string &handler);
|
||||||
|
void setRightClickHandler(const std::string &handler);
|
||||||
|
void setLeftClickHandlerParams(const std::string ¶ms) { _AHOnLeftClickParams = params; }
|
||||||
|
void setRightClickHandlerParams(const std::string ¶ms) { _AHOnRightClickParams = params; }
|
||||||
|
void setOnActiveHandler(const std::string &h) { _AHOnActive = CAHManager::getInstance()->getAH(h,_AHOnActiveParams); }
|
||||||
|
void setOnActiveParams(const std::string &p) { _AHOnActiveParams = p; }
|
||||||
|
void setOnDeactiveHandler(const std::string &h) { _AHOnDeactive = CAHManager::getInstance()->getAH(h,_AHOnDeactiveParams); }
|
||||||
|
void setOnDeactiveParams(const std::string &p) { _AHOnDeactiveParams = p; }
|
||||||
|
|
||||||
|
const std::string &getLeftClickHandler() const { return CAHManager::getInstance()->getAHName(_AHOnLeftClick); }
|
||||||
|
const std::string &getLeftClickHandlerParams() const { return _AHOnLeftClickParams; }
|
||||||
|
const std::string &getRightClickHandler() const { return CAHManager::getInstance()->getAHName(_AHOnRightClick); }
|
||||||
|
const std::string &getRightClickHandlerParams() const { return _AHOnRightClickParams; }
|
||||||
|
const std::string &getOnActiveHandler() const { return CAHManager::getInstance()->getAHName(_AHOnActive); }
|
||||||
|
const std::string &getOnActiveParams() const { return _AHOnActiveParams; }
|
||||||
|
const std::string &getOnDeactiveHandler() const { return CAHManager::getInstance()->getAHName(_AHOnDeactive); }
|
||||||
|
const std::string &getOnDeactiveParams() const { return _AHOnDeactiveParams; }
|
||||||
|
|
||||||
|
// find a sub view/ctrl/group in this group from its id
|
||||||
|
int luaFind(CLuaState &ls);
|
||||||
|
int luaGetEnclosingContainer(CLuaState &ls);
|
||||||
|
int luaDeleteLUAEnvTable(CLuaState &ls);
|
||||||
|
int luaAddGroup(CLuaState &ls);
|
||||||
|
int luaDelGroup(CLuaState &ls);
|
||||||
|
int luaGetNumGroups(CLuaState &ls);
|
||||||
|
int luaGetGroup(CLuaState &ls);
|
||||||
|
|
||||||
|
void setMaxSizeRef(const std::string &maxSizeRef);
|
||||||
|
std::string getMaxSizeRefAsString() const;
|
||||||
|
|
||||||
|
|
||||||
|
REFLECT_EXPORT_START(CInterfaceGroup, CCtrlBase)
|
||||||
|
REFLECT_LUA_METHOD("find", luaFind);
|
||||||
|
REFLECT_LUA_METHOD("deleteLUAEnvTable", luaDeleteLUAEnvTable);
|
||||||
|
REFLECT_LUA_METHOD("getEnclosingContainer", luaGetEnclosingContainer);
|
||||||
|
REFLECT_LUA_METHOD("addGroup", luaAddGroup);
|
||||||
|
REFLECT_LUA_METHOD("delGroup", luaDelGroup);
|
||||||
|
REFLECT_LUA_METHOD("getNumGroups", luaGetNumGroups);
|
||||||
|
REFLECT_LUA_METHOD("getGroup", luaGetGroup);
|
||||||
|
REFLECT_STRING ("left_click", getLeftClickHandler, setLeftClickHandler);
|
||||||
|
REFLECT_STRING ("right_click", getRightClickHandler, setRightClickHandler);
|
||||||
|
REFLECT_STRING ("left_click_params", getLeftClickHandlerParams, setLeftClickHandlerParams);
|
||||||
|
REFLECT_STRING ("right_click_params", getRightClickHandlerParams, setRightClickHandlerParams);
|
||||||
|
REFLECT_STRING ("on_active", getOnActiveHandler, setOnActiveHandler);
|
||||||
|
REFLECT_STRING ("on_active_params", getOnActiveParams, setOnActiveParams);
|
||||||
|
REFLECT_STRING ("on_deactive", getOnDeactiveHandler, setOnDeactiveHandler);
|
||||||
|
REFLECT_STRING ("on_deactive_params", getOnDeactiveParams, setOnDeactiveParams);
|
||||||
|
REFLECT_STRING ("on_enter", getAHOnEnter, setAHOnEnter);
|
||||||
|
REFLECT_STRING ("on_enter_params", getAHOnEnterParams, setAHOnEnterParams);
|
||||||
|
REFLECT_STRING ("on_escape", getAHOnEscape, setAHOnEscape);
|
||||||
|
REFLECT_STRING ("on_escape_params", getAHOnEscapeParams, setAHOnEscapeParams);
|
||||||
|
REFLECT_SINT32 ("ofsx", getOfsX, setOfsX);
|
||||||
|
REFLECT_SINT32 ("ofsy", getOfsY, setOfsY);
|
||||||
|
REFLECT_BOOL("child_resize_w", getResizeFromChildW, setResizeFromChildW);
|
||||||
|
REFLECT_SINT32("child_resize_wmargin", getResizeFromChildWMargin, setResizeFromChildWMargin);
|
||||||
|
REFLECT_BOOL("child_resize_h", getResizeFromChildH, setResizeFromChildH);
|
||||||
|
REFLECT_SINT32("child_resize_hmargin", getResizeFromChildHMargin, setResizeFromChildHMargin);
|
||||||
|
REFLECT_SINT32 ("ofsy", getOfsY, setOfsY);
|
||||||
|
REFLECT_STRING("max_sizeref", getMaxSizeRefAsString, setMaxSizeRef);
|
||||||
|
REFLECT_SINT32 ("max_w", getMaxW, setMaxW);
|
||||||
|
REFLECT_SINT32 ("max_h", getMaxH, setMaxH);
|
||||||
|
REFLECT_SINT32 ("max_w_real", getMaxWReal, dummySet);
|
||||||
|
REFLECT_SINT32 ("max_h_real", getMaxHReal, dummySet);
|
||||||
|
REFLECT_EXPORT_END
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// From CCtrlBase
|
||||||
|
virtual void updateAllLinks();
|
||||||
|
|
||||||
|
/// return true for some containers. false by default
|
||||||
|
virtual bool isMovable() const {return false;}
|
||||||
|
|
||||||
|
virtual sint32 getAlpha() const;
|
||||||
|
virtual void setAlpha (sint32 a);
|
||||||
|
|
||||||
|
/// Eval current clip coords. This is not incremental as with makeNewClip, and thus more slow. This also doesn't change the current clip window.
|
||||||
|
void getClip(sint32 &x, sint32 &y, sint32 &w, sint32 &h) const;
|
||||||
|
|
||||||
|
// quick way to know if the group is a CGroupContainer
|
||||||
|
bool isGroupContainer() const { return _IsGroupContainer; }
|
||||||
|
bool isGroupScrollText() const{ return _IsGroupScrollText; }
|
||||||
|
bool isGroupInScene() const{ return _IsGroupInScene; }
|
||||||
|
bool isGroupList() const{ return _IsGroupList; }
|
||||||
|
|
||||||
|
CInterfaceGroup* getEnclosingContainer();
|
||||||
|
|
||||||
|
sint getInsertionOrder(CViewBase *vb) const;
|
||||||
|
|
||||||
|
// for debug only
|
||||||
|
void dumpGroups();
|
||||||
|
void dumpEltsOrder();
|
||||||
|
|
||||||
|
virtual void renderWiredQuads(CInterfaceElement::TRenderWired type, const std::string &uiFilter);
|
||||||
|
|
||||||
|
virtual bool isGroup() const { return true; }
|
||||||
|
|
||||||
|
// clear all edit box in the ui
|
||||||
|
virtual void clearAllEditBox();
|
||||||
|
// restore all backuped positions for containers
|
||||||
|
virtual void restoreAllContainersBackupPosition();
|
||||||
|
|
||||||
|
virtual void dumpSize(uint depth = 0) const;
|
||||||
|
|
||||||
|
// From CInterfaceElement
|
||||||
|
virtual void visit(CInterfaceElementVisitor *visitor);
|
||||||
|
|
||||||
|
/// Visits only this group's sub-groups and then the group itself
|
||||||
|
virtual void visitGroupAndChildren( CInterfaceElementVisitor *visitor );
|
||||||
|
|
||||||
|
// Check cursor
|
||||||
|
void setUseCursor(bool use);
|
||||||
|
bool getUseCursor() const { return _UseCursor; }
|
||||||
|
|
||||||
|
|
||||||
|
// From CInterfaceElement
|
||||||
|
virtual void onFrameUpdateWindowPos(sint dx, sint dy);
|
||||||
|
// true for CGroupInScene for instance
|
||||||
|
bool isNeedFrameUpdatePos() const {return _NeedFrameUpdatePos;}
|
||||||
|
|
||||||
|
|
||||||
|
/// \name LUA specific
|
||||||
|
// @{
|
||||||
|
// Create a LUA Environement if don't exist, then push it on the LUA stack
|
||||||
|
void pushLUAEnvTable();
|
||||||
|
// Free the LUA Env Table
|
||||||
|
void deleteLUAEnvTable(bool recurse = false);
|
||||||
|
// Set the LUA script to execute at checkCoords time (empty to reset)
|
||||||
|
void setLuaScriptOnDraw(const std::string &script);
|
||||||
|
//
|
||||||
|
void executeLuaScriptOnDraw();
|
||||||
|
// Set the LUA script to execute when a list of DB change (of forms: "@DB1,@DB2" ....). The dbList is the key
|
||||||
|
void addLuaScriptOnDBChange(const std::string &dbList, const std::string &script);
|
||||||
|
// Remove the LUA script to execute when a list of DB change
|
||||||
|
void removeLuaScriptOnDBChange(const std::string &dbList);
|
||||||
|
// @}
|
||||||
|
|
||||||
|
virtual CInterfaceElement *clone();
|
||||||
|
virtual void serial(NLMISC::IStream &f);
|
||||||
|
|
||||||
|
// Return the current Depth, with no ZBias applied.
|
||||||
|
float getDepthForZSort() const { return _DepthForZSort; }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
void makeNewClip (sint32 &oldClipX, sint32 &oldClipY, sint32 &oldClipW, sint32 &oldClipH);
|
||||||
|
void restoreClip (sint32 oldSciX, sint32 oldSciY, sint32 oldSciW, sint32 oldSciH);
|
||||||
|
|
||||||
|
// Compute clip contribution for current window, and a previous clipping rectangle. This doesn't change the clip window in the driver.
|
||||||
|
void computeCurrentClipContribution(sint32 prevX, sint32 prevY, sint32 prevW, sint32 prevH,
|
||||||
|
sint32 &newX, sint32 &newY, sint32 &newW, sint32 &newH) const;
|
||||||
|
|
||||||
|
void delEltOrder (CViewBase *pElt);
|
||||||
|
|
||||||
|
// update coords one time
|
||||||
|
void doUpdateCoords();
|
||||||
|
|
||||||
|
// notify children controls & groups that 'active' has been called on one of their parent
|
||||||
|
void notifyActiveCalled(const NLGUI::CEventDescriptorActiveCalledOnParent &desc);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
/// children interface elements
|
||||||
|
std::vector<CInterfaceGroup*> _ChildrenGroups;
|
||||||
|
std::vector<CCtrlBase*> _Controls;
|
||||||
|
std::vector<CViewBase*> _Views;
|
||||||
|
|
||||||
|
std::vector<CViewBase*> _EltOrder;
|
||||||
|
|
||||||
|
/// Scroll properties
|
||||||
|
NLMISC::CRefPtr<CInterfaceElement> _ParentSizeMax; // RefPtr in case of group destroyed in a parent group with posref on it
|
||||||
|
sint32 _MaxW, _MaxH;
|
||||||
|
sint32 _MaxWReal, _MaxHReal;
|
||||||
|
sint32 _OffsetX, _OffsetY;
|
||||||
|
|
||||||
|
uint8 _Priority;
|
||||||
|
|
||||||
|
// Misc prop
|
||||||
|
bool _Overlappable : 1;
|
||||||
|
bool _ResizeFromChildW : 1;
|
||||||
|
bool _ResizeFromChildH : 1;
|
||||||
|
bool _Escapable : 1;
|
||||||
|
bool _UseCursor : 1;
|
||||||
|
bool _IsGroupContainer : 1; // faster than a virual call
|
||||||
|
bool _IsGroupScrollText : 1;
|
||||||
|
bool _IsGroupInScene : 1;
|
||||||
|
bool _IsGroupList : 1;
|
||||||
|
bool _NeedFrameUpdatePos : 1; // typically For CGroupInScene
|
||||||
|
sint32 _ResizeFromChildWMargin;
|
||||||
|
sint32 _ResizeFromChildHMargin;
|
||||||
|
sint32 _GroupSizeRef;
|
||||||
|
|
||||||
|
// Projected Depth with no ZBias applied
|
||||||
|
float _DepthForZSort;
|
||||||
|
|
||||||
|
// handler for activation
|
||||||
|
IActionHandler *_AHOnActive;
|
||||||
|
CStringShared _AHOnActiveParams;
|
||||||
|
IActionHandler *_AHOnDeactive;
|
||||||
|
CStringShared _AHOnDeactiveParams;
|
||||||
|
|
||||||
|
// right & left clicks
|
||||||
|
IActionHandler *_AHOnLeftClick;
|
||||||
|
CStringShared _AHOnLeftClickParams;
|
||||||
|
IActionHandler *_AHOnRightClick;
|
||||||
|
CStringShared _AHOnRightClickParams;
|
||||||
|
|
||||||
|
// enter params.
|
||||||
|
IActionHandler *_AHOnEnter;
|
||||||
|
CStringShared _AHOnEnterParams;
|
||||||
|
|
||||||
|
// escape AH
|
||||||
|
IActionHandler *_AHOnEscape;
|
||||||
|
CStringShared _AHOnEscapeParams;
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
void addToEltOrder(CViewBase *view, sint order);
|
||||||
|
|
||||||
|
/// \name LUA specific
|
||||||
|
// @{
|
||||||
|
// Lua Env Table created. Table is in the LUA_REGISTRYINDEX, with key as this CInterfaceGroup* userdata
|
||||||
|
bool _LUAEnvTableCreated;
|
||||||
|
// The LUA script to be executed on Draw (checkCoords)
|
||||||
|
CStringShared _LUAOnDraw;
|
||||||
|
// The InterfaceLink created specialy for Lua Script to be executed at some DB change
|
||||||
|
typedef std::map<std::string, NLMISC::CSmartPtr<CInterfaceLink> > TLUAOnDbChange;
|
||||||
|
TLUAOnDbChange _LUAOnDbChange;
|
||||||
|
void removeAllLUAOnDbChange();
|
||||||
|
protected:
|
||||||
|
void parseMaxSizeRef(const char *ptr);
|
||||||
|
// @}
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // NL_INTERFACE_GROUP_H
|
||||||
|
|
||||||
|
/* End of interface_group.h */
|
||||||
|
|
||||||
|
|
@ -0,0 +1,186 @@
|
|||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef CL_INTERFACE_LINK_H
|
||||||
|
#define CL_INTERFACE_LINK_H
|
||||||
|
|
||||||
|
#include "nel/misc/cdb_branch.h"
|
||||||
|
#include "nel/misc/cdb_branch_observing_handler.h"
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
class CReflectedProperty;
|
||||||
|
class CInterfaceExprValue;
|
||||||
|
class CInterfaceExprNode;
|
||||||
|
class CInterfaceElement;
|
||||||
|
class CInterfaceGroup;
|
||||||
|
|
||||||
|
/** A link in an interface.
|
||||||
|
* A link is an object that can read one or several values from the database, that can evaluate an expression
|
||||||
|
* on these database entries (simple computation, using the CInterfaceExpr class), and that can affect the result to
|
||||||
|
* an interface property that has been exported by an interface element (the export system uses reflect.h).
|
||||||
|
* The first time it is created, it places observers on the database entries that are needed by the expression, so each
|
||||||
|
* time a database value changes, the link is marked as 'triggered'
|
||||||
|
* When updateTrigeredLinks() is called, all links are effectively updated.
|
||||||
|
*
|
||||||
|
* Example of use : connecting a change in the db tree to the 'active' state of a window
|
||||||
|
*
|
||||||
|
* NB : an additionnal action handler can be provided
|
||||||
|
* NB : The links are owned by the interface element (using a smart pointer)
|
||||||
|
* NB : Several targets may be used.
|
||||||
|
*
|
||||||
|
* \author Nicolas Vizerie
|
||||||
|
* \author Nevrax France
|
||||||
|
* \date 2002
|
||||||
|
*/
|
||||||
|
class CInterfaceLink : public NLMISC::ICDBNode::IPropertyObserver
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
#ifdef NL_DEBUG
|
||||||
|
// for debugging purposes : if this link is 'named' e.g is owner by CInterfaceManager
|
||||||
|
// and was created by calling CInterfaceManager::addLink, contains the name of this link
|
||||||
|
std::string LinkName;
|
||||||
|
#endif
|
||||||
|
public:
|
||||||
|
struct CTargetInfo
|
||||||
|
{
|
||||||
|
CInterfaceElement *Elem;
|
||||||
|
std::string PropertyName;
|
||||||
|
/** Affect a value to this target.
|
||||||
|
* \return true if the affectation could be made
|
||||||
|
*/
|
||||||
|
bool affect(const CInterfaceExprValue &value);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/// Updates triggered interface links when triggered by the observed branch
|
||||||
|
class CInterfaceLinkUpdater : public NLMISC::CCDBBranchObservingHandler::IBranchObserverCallFlushObserver
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CInterfaceLinkUpdater();
|
||||||
|
~CInterfaceLinkUpdater();
|
||||||
|
void onObserverCallFlush();
|
||||||
|
};
|
||||||
|
|
||||||
|
public:
|
||||||
|
CInterfaceLink();
|
||||||
|
~CInterfaceLink(); // this object should only be destroyed by a CInterfaceElement
|
||||||
|
/** Make a link between the given interface element properties and a value that depends on database entries.
|
||||||
|
* The link is automatically added in the link list of the targets element (it calls CInterfaceElement::addLink), so when all target elements are removed, the link is.
|
||||||
|
* If there are no target element, the link is permanent (removed at exit)
|
||||||
|
* NB : The target is not updated during this call.
|
||||||
|
*/
|
||||||
|
bool init(const std::vector<CTargetInfo> &targets, const std::string &expr, const std::string &actionHandler, const std::string &ahParams, const std::string &ahCond, CInterfaceGroup *parent);
|
||||||
|
// force all the links that have been created to update their targets. This can be called when the interface has been loaded, and when the databse entries have been retrieved.
|
||||||
|
static void updateAllLinks();
|
||||||
|
// force all trigered links to be updated
|
||||||
|
static void updateTrigeredLinks();
|
||||||
|
// remove from the _LinksWithNoTarget list if the link has no target
|
||||||
|
void uninit();
|
||||||
|
|
||||||
|
// Force an update of the target of this link
|
||||||
|
void update();
|
||||||
|
/** Remove a target element. It won't be updated anymore by that link
|
||||||
|
* NB : this don't call removeLink() on the target
|
||||||
|
*/
|
||||||
|
void removeTarget(CInterfaceElement *elem);
|
||||||
|
// Get the number of targets of this link
|
||||||
|
uint getNumTargets() const { return (uint)_Targets.size(); }
|
||||||
|
// Get the i-th target
|
||||||
|
CInterfaceElement *getTarget(uint index) const { return _Targets[index]._InterfaceElement; }
|
||||||
|
|
||||||
|
static void removeAllLinks();
|
||||||
|
|
||||||
|
static void setTargetProperty (const std::string & Target, const CInterfaceExprValue &val);
|
||||||
|
|
||||||
|
static bool isUpdatingAllLinks() { return _UpdateAllLinks; }
|
||||||
|
|
||||||
|
/** From a target name of a link, retrieve the target element and its target target property
|
||||||
|
* \return true if the target is valid
|
||||||
|
*/
|
||||||
|
static bool splitLinkTarget(const std::string &target, CInterfaceGroup *parentGroup, std::string &propertyName, CInterfaceElement *&targetElm);
|
||||||
|
|
||||||
|
/** From several target names of a link (seprated by ','), retrieve the target elements and their target properties
|
||||||
|
* \return true if all targets are valid
|
||||||
|
*/
|
||||||
|
static bool splitLinkTargets(const std::string &targets, CInterfaceGroup *parentGroup, std::vector<CInterfaceLink::CTargetInfo> &targetsVect);
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
private:
|
||||||
|
friend struct CRemoveTargetPred;
|
||||||
|
// a target property
|
||||||
|
struct CTarget
|
||||||
|
{
|
||||||
|
CInterfaceElement *_InterfaceElement;
|
||||||
|
const CReflectedProperty *_Property;
|
||||||
|
};
|
||||||
|
private:
|
||||||
|
typedef std::list<CInterfaceLink *> TLinkList;
|
||||||
|
typedef NLMISC::CSmartPtr<CInterfaceLink> TLinkSmartPtr;
|
||||||
|
typedef std::vector<TLinkSmartPtr> TLinkVect;
|
||||||
|
typedef std::vector<NLMISC::ICDBNode *> TNodeVect;
|
||||||
|
private:
|
||||||
|
std::vector<CTarget> _Targets;
|
||||||
|
TNodeVect _ObservedNodes;
|
||||||
|
std::string _Expr;
|
||||||
|
CInterfaceExprNode *_ParseTree;
|
||||||
|
std::string _ActionHandler;
|
||||||
|
std::string _AHParams;
|
||||||
|
std::string _AHCond;
|
||||||
|
CInterfaceGroup *_AHParent;
|
||||||
|
static TLinkList _LinkList;
|
||||||
|
TLinkList::iterator _ListEntry;
|
||||||
|
bool _On;
|
||||||
|
static TLinkVect _LinksWithNoTarget; // there should be an owner for links with no targets
|
||||||
|
static bool _UpdateAllLinks;
|
||||||
|
///\ name triggered link mgt
|
||||||
|
//@{
|
||||||
|
// next/previous link that was trigered. NULL means end or start of list
|
||||||
|
// each ptr is duplicated because with manage 2 lists : one list in which links are added, and one list in which we update links.
|
||||||
|
// This way one link can trigger another with no prb
|
||||||
|
CInterfaceLink *_PrevTriggeredLink[2];
|
||||||
|
CInterfaceLink *_NextTriggeredLink[2];
|
||||||
|
bool _Triggered[2];
|
||||||
|
// global lists
|
||||||
|
static CInterfaceLink *_FirstTriggeredLink[2];
|
||||||
|
static CInterfaceLink *_LastTriggeredLink[2];
|
||||||
|
// iterators in current list being updated : they're global so that deleting a CInterfaceLink instance prevent them from becoming dangling pointers
|
||||||
|
static CInterfaceLink *_CurrUpdatedLink;
|
||||||
|
static CInterfaceLink *_NextUpdatedLink;
|
||||||
|
// Index of the list in which triggered link must be inserted
|
||||||
|
static uint _CurrentTriggeredLinkList;
|
||||||
|
|
||||||
|
//
|
||||||
|
void linkInTriggerList(uint list);
|
||||||
|
void unlinkFromTriggerList(uint list);
|
||||||
|
//@}
|
||||||
|
|
||||||
|
private:
|
||||||
|
/** Inherited from ICDBNode::IPropertyObserver
|
||||||
|
* This doesn't update the node directly, but mark it as 'triggered'
|
||||||
|
* The node is really updated during the call to 'updateTrigeredLinks()'
|
||||||
|
*/
|
||||||
|
virtual void update(NLMISC::ICDBNode *node);
|
||||||
|
void createObservers(const TNodeVect &nodes);
|
||||||
|
void removeObservers(const TNodeVect &nodes);
|
||||||
|
// debug : check that there are as many targets as reference to a link
|
||||||
|
void checkNbRefs();
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1,225 @@
|
|||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef RZ_INTERFACE_LAYER_H
|
||||||
|
#define RZ_INTERFACE_LAYER_H
|
||||||
|
|
||||||
|
#include "nel/misc/debug.h"
|
||||||
|
#include "nel/misc/smart_ptr.h"
|
||||||
|
#include "nel/misc/rgba.h"
|
||||||
|
#include "libxml/globals.h"
|
||||||
|
#include "nel/misc/xml_auto_ptr.h"
|
||||||
|
|
||||||
|
namespace NL3D
|
||||||
|
{
|
||||||
|
class UAnimationSet;
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
class CInterfaceOptionValue
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CInterfaceOptionValue()
|
||||||
|
{
|
||||||
|
_Color= NLMISC::CRGBA::White;
|
||||||
|
_Int= 0;
|
||||||
|
_Float= 0;
|
||||||
|
_Boolean= false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const std::string &getValStr () const {return _Str;}
|
||||||
|
sint32 getValSInt32() const {return _Int;}
|
||||||
|
float getValFloat () const {return _Float;}
|
||||||
|
NLMISC::CRGBA getValColor () const {return _Color;}
|
||||||
|
bool getValBool () const {return _Boolean;}
|
||||||
|
|
||||||
|
void init(const std::string &str);
|
||||||
|
|
||||||
|
// returned when InterfaceOptions param not found
|
||||||
|
static const CInterfaceOptionValue NullValue;
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
std::string _Str;
|
||||||
|
NLMISC::CRGBA _Color;
|
||||||
|
sint32 _Int;
|
||||||
|
float _Float;
|
||||||
|
bool _Boolean;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
class CInterfaceOptions : public NLMISC::CRefCount
|
||||||
|
{
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
// for factory construction
|
||||||
|
struct TCtorParam
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
|
CInterfaceOptions( const TCtorParam &/* param */ );
|
||||||
|
virtual ~CInterfaceOptions();
|
||||||
|
|
||||||
|
virtual bool parse (xmlNodePtr cur);
|
||||||
|
virtual xmlNodePtr serialize( xmlNodePtr parentNode, const std::string &name ) const;
|
||||||
|
|
||||||
|
// return NullValue if param not found
|
||||||
|
const CInterfaceOptionValue &getValue(const std::string &sParamName) const;
|
||||||
|
|
||||||
|
// shortcuts to getValue(paramName).getValXXX()
|
||||||
|
const std::string &getValStr (const std::string &sParamName) const;
|
||||||
|
sint32 getValSInt32 (const std::string &sParamName) const;
|
||||||
|
float getValFloat (const std::string &sParamName) const;
|
||||||
|
NLMISC::CRGBA getValColor (const std::string &sParamName) const;
|
||||||
|
bool getValBool (const std::string &sParamName) const;
|
||||||
|
|
||||||
|
// copy basic map only from other CInterfaceOptions (non virtual method)
|
||||||
|
void copyBasicMap(const CInterfaceOptions &other);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
std::map<std::string, CInterfaceOptionValue> _ParamValue;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
class COptionsLayer : public CInterfaceOptions
|
||||||
|
{
|
||||||
|
|
||||||
|
public:
|
||||||
|
COptionsLayer( const TCtorParam &/* param */ );
|
||||||
|
~COptionsLayer();
|
||||||
|
xmlNodePtr serialize( xmlNodePtr parentNode, const std::string &name ) const;
|
||||||
|
virtual bool parse (xmlNodePtr cur);
|
||||||
|
|
||||||
|
// Container optimizer
|
||||||
|
|
||||||
|
sint32 Tile_Blank;
|
||||||
|
sint32 Tile_M_Header, Tile_M_Scrollbar;
|
||||||
|
sint32 Tile_T, Tile_B, Tile_L, Tile_R;
|
||||||
|
sint32 Tile_B_Open, Tile_EM_Open, Tile_M_Open;
|
||||||
|
|
||||||
|
sint32 Scrollbar_Offset_X;
|
||||||
|
sint32 Scrollbar_W;
|
||||||
|
sint32 TxId_B_Scrollbar, W_B_Scrollbar, H_B_Scrollbar;
|
||||||
|
sint32 TxId_M_Scrollbar, W_M_Scrollbar, H_M_Scrollbar;
|
||||||
|
sint32 TxId_T_Scrollbar, W_T_Scrollbar, H_T_Scrollbar;
|
||||||
|
|
||||||
|
sint32 TxId_L_Header, W_L_Header, H_L_Header;
|
||||||
|
sint32 TxId_M_Header, W_M_Header, H_M_Header;
|
||||||
|
sint32 TxId_R_Header, W_R_Header, H_R_Header;
|
||||||
|
|
||||||
|
sint32 TxId_TL, W_TL, H_TL;
|
||||||
|
sint32 TxId_T, W_T, H_T;
|
||||||
|
sint32 TxId_TR, W_TR, H_TR;
|
||||||
|
sint32 TxId_L, W_L, H_L;
|
||||||
|
sint32 TxId_R, W_R, H_R;
|
||||||
|
sint32 TxId_Blank, W_Blank, H_Blank;
|
||||||
|
sint32 TxId_BL, W_BL, H_BL;
|
||||||
|
sint32 TxId_B, W_B, H_B;
|
||||||
|
sint32 TxId_BR, W_BR, H_BR;
|
||||||
|
|
||||||
|
sint32 TxId_BL_Open, W_BL_Open, H_BL_Open;
|
||||||
|
sint32 TxId_B_Open, W_B_Open, H_B_Open;
|
||||||
|
sint32 TxId_BR_Open, W_BR_Open, H_BR_Open;
|
||||||
|
sint32 TxId_EL_Open, W_EL_Open, H_EL_Open;
|
||||||
|
sint32 TxId_EM_Open, W_EM_Open, H_EM_Open;
|
||||||
|
sint32 TxId_ER_Open, W_ER_Open, H_ER_Open;
|
||||||
|
sint32 TxId_E_Open, W_E_Open, H_E_Open;
|
||||||
|
sint32 TxId_M_Open, W_M_Open, H_M_Open;
|
||||||
|
|
||||||
|
sint32 TxId_TL_HighLight;
|
||||||
|
sint32 TxId_T_HighLight;
|
||||||
|
sint32 TxId_TR_HighLight;
|
||||||
|
sint32 TxId_L_HighLight;
|
||||||
|
sint32 TxId_R_HighLight;
|
||||||
|
sint32 TxId_BL_HighLight;
|
||||||
|
sint32 TxId_B_HighLight;
|
||||||
|
sint32 TxId_BR_HighLight;
|
||||||
|
|
||||||
|
sint32 HeaderH;
|
||||||
|
};
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
class COptionsContainerInsertion : public CInterfaceOptions
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
COptionsContainerInsertion( const TCtorParam &/* param */ );
|
||||||
|
xmlNodePtr serialize( xmlNodePtr parentNode, const std::string &name ) const;
|
||||||
|
virtual bool parse (xmlNodePtr cur);
|
||||||
|
|
||||||
|
sint32 TxId_R_Arrow;
|
||||||
|
sint32 TxId_L_Arrow;
|
||||||
|
sint32 TxId_T_Arrow;
|
||||||
|
sint32 TxId_B_Arrow;
|
||||||
|
sint32 TxId_InsertionBar;
|
||||||
|
};
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
class COptionsContainerMove : public CInterfaceOptions
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
COptionsContainerMove( const TCtorParam &/* param */ );
|
||||||
|
xmlNodePtr serialize( xmlNodePtr parentNode, const std::string &name ) const;
|
||||||
|
virtual bool parse (xmlNodePtr cur);
|
||||||
|
|
||||||
|
sint32 TrackW;
|
||||||
|
sint32 TrackH;
|
||||||
|
sint32 TrackY;
|
||||||
|
sint32 TrackYWithTopResizer;
|
||||||
|
sint32 TrackHWithTopResizer;
|
||||||
|
sint32 ResizerSize;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
/**
|
||||||
|
* read a list of <param> with no name. id auto incremented
|
||||||
|
*/
|
||||||
|
class COptionsList : public CInterfaceOptions
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
COptionsList( const TCtorParam &/* param */ );
|
||||||
|
xmlNodePtr serialize( xmlNodePtr parentNode, const std::string &name ) const;
|
||||||
|
virtual bool parse (xmlNodePtr cur);
|
||||||
|
|
||||||
|
uint getNumParams() const {return _NumParams;}
|
||||||
|
|
||||||
|
// get a value by its index (from 0 to numParams)
|
||||||
|
const CInterfaceOptionValue &getValue(uint paramId) const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
uint _NumParams;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // NL_INTERFACE_LAYER_H
|
||||||
|
|
||||||
|
/* End of interface_layer.h */
|
||||||
|
|
||||||
|
|
@ -0,0 +1,389 @@
|
|||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef RZ_INTERFACE_PARSER_H
|
||||||
|
#define RZ_INTERFACE_PARSER_H
|
||||||
|
|
||||||
|
#include "nel/misc/types_nl.h"
|
||||||
|
#include "nel/3d/u_texture.h"
|
||||||
|
#include "nel/gui/ctrl_sheet_selection.h"
|
||||||
|
#include "nel/gui/interface_link.h"
|
||||||
|
#include "nel/misc/smart_ptr.h"
|
||||||
|
#include "nel/gui/lua_helper.h"
|
||||||
|
#include "nel/gui/proc.h"
|
||||||
|
#include "nel/gui/widget_manager.h"
|
||||||
|
#include "nel/gui/link_data.h"
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
class CInterfaceElement;
|
||||||
|
class CInterfaceGroup;
|
||||||
|
class CInterfaceOptions;
|
||||||
|
class CInterfaceLink;
|
||||||
|
class CCtrlBase;
|
||||||
|
class CGroupList;
|
||||||
|
class CGroupContainer;
|
||||||
|
class CInterfaceAnim;
|
||||||
|
class CViewPointer;
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
/**
|
||||||
|
* class managing the interface parsing
|
||||||
|
* \author Matthieu 'TrapII' Besson
|
||||||
|
* \author Nevrax France
|
||||||
|
* \date 2002
|
||||||
|
*/
|
||||||
|
|
||||||
|
class CInterfaceParser : public IParser
|
||||||
|
{
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
/// Interface for parser modules
|
||||||
|
/// Such modules can be plugged into CInterfaceParser, and
|
||||||
|
/// the modules then can parse GUI XMLs for widget classes that are not
|
||||||
|
/// generic enough to be in the GUI library.
|
||||||
|
class IParserModule
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
/// Various parsing stages
|
||||||
|
enum ParsingStage
|
||||||
|
{
|
||||||
|
None = 0, /// module cannot parse in any stage.
|
||||||
|
Unresolved = 1, /// module can parse in the first stage when styles, templates, etc have not been resolved yet
|
||||||
|
Resolved = 2, /// module can parse after resolving styles and templates
|
||||||
|
GroupChildren = 4 /// module can parse when parsing the group children
|
||||||
|
};
|
||||||
|
|
||||||
|
IParserModule(){
|
||||||
|
parser = NULL;
|
||||||
|
parsingStage = None;
|
||||||
|
}
|
||||||
|
virtual ~IParserModule(){}
|
||||||
|
|
||||||
|
bool canParseInStage( ParsingStage stage )
|
||||||
|
{
|
||||||
|
if( ( parsingStage & static_cast< uint >( stage ) ) != 0 )
|
||||||
|
return true;
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual bool parse( xmlNodePtr cur, CInterfaceGroup *parentGroup ) = 0;
|
||||||
|
void setParser( CInterfaceParser *p ){ parser = p; }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
CInterfaceParser *parser;
|
||||||
|
uint parsingStage;
|
||||||
|
};
|
||||||
|
|
||||||
|
/// Interface for event handlers which can be called when setting up the options.
|
||||||
|
class ISetupOptionCallbackClass
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual void setupOptions() = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
struct VariableData
|
||||||
|
{
|
||||||
|
std::string entry;
|
||||||
|
std::string type;
|
||||||
|
std::string value;
|
||||||
|
uint32 size;
|
||||||
|
|
||||||
|
VariableData()
|
||||||
|
{
|
||||||
|
size = 0;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
CInterfaceParser();
|
||||||
|
virtual ~CInterfaceParser();
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parsing methods
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** Load a set of xml files
|
||||||
|
* \param isFilename true if xmlFileNames array contains the names of the xml file, false, if each
|
||||||
|
* array is a script itself
|
||||||
|
*/
|
||||||
|
bool parseInterface (const std::vector<std::string> &xmlFileNames, bool reload, bool isFilename = true, bool checkInData = false);
|
||||||
|
|
||||||
|
bool parseXMLDocument (xmlNodePtr root, bool reload);
|
||||||
|
bool parseTemplateNode (xmlNodePtr node,xmlNodePtr instance,xmlNodePtr templ);
|
||||||
|
bool parseInstance(xmlNodePtr cur);
|
||||||
|
bool parseVector (xmlNodePtr cur);
|
||||||
|
bool parseVariable (xmlNodePtr cur, CInterfaceGroup * parentGroup);
|
||||||
|
bool parseOptions (xmlNodePtr cur, CInterfaceGroup * parentGroup);
|
||||||
|
bool parseGroup (xmlNodePtr cur, CInterfaceGroup * parentGroup, bool reload);
|
||||||
|
bool parseGroupChildren(xmlNodePtr cur, CInterfaceGroup * parentGroup, bool reload);
|
||||||
|
bool parseControl (xmlNodePtr cur, CInterfaceGroup * parentGroup, bool reload);
|
||||||
|
bool parseLink (xmlNodePtr cur, CInterfaceGroup * parentGroup);
|
||||||
|
bool parseView (xmlNodePtr cur, CInterfaceGroup * parentGroup, bool reload);
|
||||||
|
bool parseTreeNode (xmlNodePtr cur, CGroupContainer *parentGroup);
|
||||||
|
bool parseTree (xmlNodePtr cur, CWidgetManager::SMasterGroup *parentGroup);
|
||||||
|
bool parseDefine(xmlNodePtr cur);
|
||||||
|
bool parseProcedure(xmlNodePtr cur, bool reload);
|
||||||
|
bool parseSheetSelection(xmlNodePtr cur);
|
||||||
|
bool parseAnim(xmlNodePtr cur, CInterfaceGroup * parentGroup);
|
||||||
|
bool parseStyle(xmlNodePtr cur);
|
||||||
|
bool parseLUAScript (xmlNodePtr cur);
|
||||||
|
bool setupTree (xmlNodePtr cur, CWidgetManager::SMasterGroup *parentGroup);
|
||||||
|
bool setupTreeNode (xmlNodePtr cur, CGroupContainer *parentGroup);
|
||||||
|
void savePointerSettings( xmlNodePtr node );
|
||||||
|
void saveKeySettings( xmlNodePtr node );
|
||||||
|
|
||||||
|
void addModule( std::string name, IParserModule *module );
|
||||||
|
IParserModule* getModuleFor( std::string name ) const;
|
||||||
|
void removeAllModules();
|
||||||
|
|
||||||
|
// Called by each parse in parseXMLDocument
|
||||||
|
bool solveDefine(xmlNodePtr cur);
|
||||||
|
bool solveStyle(xmlNodePtr cur);
|
||||||
|
|
||||||
|
// Solve All define in a string. return false if some define not founs (defError contains this define)
|
||||||
|
bool solveDefine(const std::string &propVal, std::string &newPropVal, std::string &defError);
|
||||||
|
|
||||||
|
// Called after template & options parsing
|
||||||
|
void setupOptions();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initializer
|
||||||
|
*/
|
||||||
|
|
||||||
|
bool initCoordsAndLuaScript ();
|
||||||
|
|
||||||
|
/// Association builders : associate an element of the interface with the string ID of
|
||||||
|
/// another element used as reference for position values
|
||||||
|
void addParentPositionAssociation (CInterfaceElement *element, const std::string &parentID);
|
||||||
|
std::string getParentPosAssociation( CInterfaceElement *element ) const;
|
||||||
|
void addParentSizeAssociation (CInterfaceElement *element, const std::string &parentID);
|
||||||
|
std::string getParentSizeAssociation( CInterfaceElement *element ) const;
|
||||||
|
void addParentSizeMaxAssociation (CInterfaceElement *element, const std::string &parentID);
|
||||||
|
std::string getParentSizeMaxAssociation( CInterfaceElement *element ) const;
|
||||||
|
|
||||||
|
/// LUA Class Association builder : associate a lua script to a group (called for each group after every document parsed)
|
||||||
|
void addLuaClassAssociation(CInterfaceGroup *group, const std::string &luaScript);
|
||||||
|
std::string getLuaClassAssociation( CInterfaceGroup *group ) const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Accessors
|
||||||
|
*/
|
||||||
|
// access to control sheet selection
|
||||||
|
CCtrlSheetSelection &getCtrlSheetSelection() { return _CtrlSheetSelection; }
|
||||||
|
|
||||||
|
/// \name Parameter variable
|
||||||
|
// @{
|
||||||
|
const std::string& getDefine(const std::string &id) const;
|
||||||
|
bool isDefineExist(const std::string &id) const;
|
||||||
|
void setDefine(const std::string &id, const std::string &value);
|
||||||
|
// @}
|
||||||
|
|
||||||
|
/// \name Dynamic links mgt
|
||||||
|
// @{
|
||||||
|
/** Associate the given dynamic link with an ID
|
||||||
|
* \return true if succesful
|
||||||
|
*/
|
||||||
|
bool addLink(CInterfaceLink *link, const std::string &id);
|
||||||
|
/** remove the given link from its ID
|
||||||
|
* \return true if succesful
|
||||||
|
*/
|
||||||
|
bool removeLink(const std::string &id);
|
||||||
|
// @}
|
||||||
|
|
||||||
|
/** create a template from an instance consisting of a single group
|
||||||
|
* \param templateName name of the template in the xml
|
||||||
|
* \param templateParams array containing each template parameter and its name
|
||||||
|
* \param number of template parameters in the array
|
||||||
|
*/
|
||||||
|
CInterfaceGroup *createGroupInstance(const std::string &templateName, const std::string &parentID, const std::pair<std::string, std::string> *templateParams, uint numParams, bool updateLinks = true);
|
||||||
|
CInterfaceGroup *createGroupInstance(const std::string &templateName, const std::string &parentID, std::vector<std::pair<std::string, std::string> > &templateParams, bool updateLinks = true)
|
||||||
|
{
|
||||||
|
if (templateParams.size() > 0)
|
||||||
|
return createGroupInstance(templateName, parentID, &templateParams[0], (uint)templateParams.size(), updateLinks);
|
||||||
|
else
|
||||||
|
return createGroupInstance(templateName, parentID, NULL, 0, updateLinks);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** create a template from an instance consisting of a single control or group
|
||||||
|
* \param templateName name of the template in the xml
|
||||||
|
* \param templateParams array containing each template parameter and its name
|
||||||
|
* \param number of template parameters in the array
|
||||||
|
*/
|
||||||
|
CInterfaceElement *createUIElement(const std::string &templateName, const std::string &parentID, const std::pair<std::string,std::string> *templateParams, uint numParams, bool updateLinks /* = true */);
|
||||||
|
CInterfaceElement *createUIElement(const std::string &templateName, const std::string &parentID, std::vector<std::pair<std::string, std::string> > &templateParams, bool updateLinks = true)
|
||||||
|
{
|
||||||
|
if (templateParams.size() > 0)
|
||||||
|
return createUIElement(templateName, parentID, &templateParams[0], (uint)templateParams.size(), updateLinks);
|
||||||
|
else
|
||||||
|
return createUIElement(templateName, parentID, NULL, 0, updateLinks);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void freeXMLNodeAndSibblings(xmlNodePtr node);
|
||||||
|
|
||||||
|
// search a "tree" node in the hierarchy that match node. may return root! NULL if not found
|
||||||
|
static xmlNodePtr searchTreeNodeInHierarchy(xmlNodePtr root, const char *node);
|
||||||
|
|
||||||
|
/// \name Clearing mgt
|
||||||
|
// @{
|
||||||
|
void removeAllLinks();
|
||||||
|
void removeAllProcedures();
|
||||||
|
void removeAllDefines();
|
||||||
|
void removeAllTemplates();
|
||||||
|
void removeAllAnims();
|
||||||
|
void removeAll();
|
||||||
|
// @}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
/// Procedure list
|
||||||
|
typedef TProcedureMap::iterator ItProcedureMap;
|
||||||
|
typedef TProcedureMap::const_iterator CstItProcedureMap;
|
||||||
|
TProcedureMap _ProcedureMap;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
|
||||||
|
// get info on procedure. return 0 if procedure not found
|
||||||
|
uint getProcedureNumActions( const std::string &procName ) const;
|
||||||
|
|
||||||
|
// return false if procedure not found, or if bad action index. return false if has some param variable (@0...)
|
||||||
|
bool getProcedureAction( const std::string &procName, uint actionIndex, std::string &ah, std::string ¶ms ) const;
|
||||||
|
|
||||||
|
void setCacheUIParsing( bool b ){ cacheUIParsing = b; }
|
||||||
|
|
||||||
|
CInterfaceAnim* getAnim( const std::string &name ) const;
|
||||||
|
|
||||||
|
CProcedure* getProc( const std::string &name );
|
||||||
|
|
||||||
|
const TProcedureMap& getProcMap() const{ return _ProcedureMap; }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Temporary data for init
|
||||||
|
*/
|
||||||
|
|
||||||
|
/// vector storing parsed templates during init. At the end of init, only used template are kept
|
||||||
|
std::vector<xmlNodePtr> _Templates;
|
||||||
|
|
||||||
|
|
||||||
|
// map linking an element to its parent position used during init only
|
||||||
|
std::map<CInterfaceElement*,std::string> _ParentPositionsMap;
|
||||||
|
std::map<CInterfaceElement*,std::string> _ParentSizesMap;
|
||||||
|
std::map<CInterfaceElement*,std::string> _ParentSizesMaxMap;
|
||||||
|
|
||||||
|
// map linking a group to its lua script. used during init only
|
||||||
|
std::map<CInterfaceGroup*,std::string> _LuaClassAssociation;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Data of initialized interface
|
||||||
|
*/
|
||||||
|
|
||||||
|
/// Define Variable list
|
||||||
|
typedef std::map<std::string, std::string> TVarMap;
|
||||||
|
typedef TVarMap::iterator ItVarMap;
|
||||||
|
typedef TVarMap::const_iterator CstItVarMap;
|
||||||
|
TVarMap _DefineMap;
|
||||||
|
|
||||||
|
bool validDefineChar(char c) const;
|
||||||
|
|
||||||
|
class CStyleProperty
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
std::string Name;
|
||||||
|
std::string Value;
|
||||||
|
};
|
||||||
|
class CStyle
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
std::vector<CStyleProperty> Properties;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// mgt of sheet selections (inventory, buy, sell..)
|
||||||
|
CCtrlSheetSelection _CtrlSheetSelection;
|
||||||
|
|
||||||
|
// Map of dynamic links
|
||||||
|
typedef std::map<std::string, NLMISC::CSmartPtr<CInterfaceLink> > TLinkMap;
|
||||||
|
TLinkMap _LinkMap;
|
||||||
|
|
||||||
|
// Map of anims
|
||||||
|
typedef std::map<std::string, CInterfaceAnim *> TAnimMap;
|
||||||
|
TAnimMap _AnimMap;
|
||||||
|
|
||||||
|
// Map of styles.
|
||||||
|
typedef std::map<std::string, CStyle> TStyleMap;
|
||||||
|
TStyleMap _StyleMap;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
std::map< std::string, IParserModule* > moduleMap;
|
||||||
|
|
||||||
|
// List of script loaded (for reloadLua command)
|
||||||
|
std::set<std::string> _LuaFileScripts;
|
||||||
|
|
||||||
|
bool cacheUIParsing;
|
||||||
|
bool luaInitialized;
|
||||||
|
ISetupOptionCallbackClass *setupCallback;
|
||||||
|
|
||||||
|
uint32 linkId;
|
||||||
|
std::map< uint32, SLinkData > links;
|
||||||
|
|
||||||
|
bool editorMode;
|
||||||
|
std::map< std::string, VariableData > variableCache;
|
||||||
|
std::map< std::string, std::string > pointerSettings;
|
||||||
|
std::map< std::string, std::map< std::string, std::string > > keySettings;
|
||||||
|
|
||||||
|
public:
|
||||||
|
void initLUA();
|
||||||
|
void uninitLUA();
|
||||||
|
bool isLuaInitialized() const{ return luaInitialized; }
|
||||||
|
|
||||||
|
/// Load A .lua. false if parse error. string 'error' contains the eventual error desc (but warning still displayed)
|
||||||
|
bool loadLUA( const std::string &luaFile, std::string &error );
|
||||||
|
|
||||||
|
/// Reload all LUA scripts inserted through <lua>
|
||||||
|
void reloadAllLuaFileScripts();
|
||||||
|
|
||||||
|
void setSetupOptionsCallback( ISetupOptionCallbackClass *cb ){ setupCallback = cb; }
|
||||||
|
|
||||||
|
bool hasProc( const std::string &name ) const;
|
||||||
|
bool addProc( const std::string &name );
|
||||||
|
bool removeProc( const std::string &name );
|
||||||
|
|
||||||
|
const std::map< uint32, SLinkData >& getLinkMap() const{ return links; }
|
||||||
|
uint32 addLinkData( SLinkData &linkData );
|
||||||
|
void removeLinkData( uint32 id );
|
||||||
|
bool getLinkData( uint32 id, SLinkData &linkData );
|
||||||
|
void updateLinkData( uint32 id, const SLinkData &linkData );
|
||||||
|
|
||||||
|
void setEditorMode( bool b ){ editorMode = b; }
|
||||||
|
|
||||||
|
bool serializeVariables( xmlNodePtr parentNode ) const;
|
||||||
|
bool serializeProcs( xmlNodePtr parentNode ) const;
|
||||||
|
bool serializePointerSettings( xmlNodePtr parentNode ) const;
|
||||||
|
bool serializeKeySettings( xmlNodePtr parentNode ) const;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // RZ_INTERFACE_PARSER_H
|
@ -0,0 +1,106 @@
|
|||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef NL_INTERFACE_PROPERTY_H
|
||||||
|
#define NL_INTERFACE_PROPERTY_H
|
||||||
|
|
||||||
|
#include "nel/misc/types_nl.h"
|
||||||
|
#include "nel/misc/rgba.h"
|
||||||
|
#include "nel/misc/cdb.h"
|
||||||
|
#include "nel/misc/cdb_leaf.h"
|
||||||
|
#include "nel/misc/cdb_branch.h"
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* interface property
|
||||||
|
* class used to managed all the interface member values
|
||||||
|
* As the database contains only sint64, several methods are needed to do the conversion
|
||||||
|
* \author Nicolas Brigand
|
||||||
|
* \author Nevrax France
|
||||||
|
* \date 2002
|
||||||
|
*/
|
||||||
|
class CInterfaceProperty
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
//enum defining a hot spot
|
||||||
|
|
||||||
|
/// Constructor
|
||||||
|
CInterfaceProperty()
|
||||||
|
{
|
||||||
|
_VolatileValue = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
NLMISC::CCDBNodeLeaf* getNodePtr() const
|
||||||
|
{
|
||||||
|
return _VolatileValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setNodePtr(NLMISC::CCDBNodeLeaf *ptr)
|
||||||
|
{
|
||||||
|
_VolatileValue = ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool link (const char *DBProp);
|
||||||
|
bool link( NLMISC::CCDBNodeLeaf *dbNode );
|
||||||
|
bool link( NLMISC::CCDBNodeBranch *dbNode, const std::string &leafId, NLMISC::CCDBNodeLeaf *defaultLeaf = NULL );
|
||||||
|
|
||||||
|
/// float operations
|
||||||
|
void setDouble (double value) {setSInt64((sint64&) value);}
|
||||||
|
double getDouble () const {sint64 i = getSInt64(); return (double &) i; }
|
||||||
|
void readDouble (const char* value, const std::string& id);
|
||||||
|
|
||||||
|
/// sint32 operations
|
||||||
|
void setSInt32 (sint32 value) {_VolatileValue->setValue32 (value);}
|
||||||
|
sint32 getSInt32 () const {return _VolatileValue->getValue32();}
|
||||||
|
void readSInt32(const char* value, const std::string& id);
|
||||||
|
|
||||||
|
/// sint64 operations
|
||||||
|
void setSInt64 (sint64 value) {_VolatileValue->setValue64(value);}
|
||||||
|
sint64 getSInt64 () const {return _VolatileValue->getValue64();}
|
||||||
|
void readSInt64(const char* value, const std::string& id);
|
||||||
|
|
||||||
|
/// CRGBA operations
|
||||||
|
void setRGBA (const NLMISC::CRGBA & value);
|
||||||
|
NLMISC::CRGBA getRGBA () const;
|
||||||
|
void readRGBA (const char* value, const std::string& id);
|
||||||
|
|
||||||
|
/// HotSpot operations
|
||||||
|
|
||||||
|
void readHotSpot (const char* value, const std::string& id);
|
||||||
|
|
||||||
|
/// bool operations
|
||||||
|
void setBool (bool value);
|
||||||
|
bool getBool () const;
|
||||||
|
void readBool (const char* value, const std::string& id);
|
||||||
|
|
||||||
|
// Swap the content of this 2 property (no-op if one is NULL)
|
||||||
|
void swap32(CInterfaceProperty &o);
|
||||||
|
|
||||||
|
private:
|
||||||
|
/// volatile value of the property (pointer to a leaf of the database)
|
||||||
|
NLMISC::CCDBNodeLeaf* _VolatileValue;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // NL_INTERFACE_PROPERTY_H
|
||||||
|
|
||||||
|
/* End of interface_property.h */
|
@ -0,0 +1,283 @@
|
|||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef CL_LIB_WWW_H
|
||||||
|
#define CL_LIB_WWW_H
|
||||||
|
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#include "libwww/WWWInit.h"
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
class CCtrlBaseButton;
|
||||||
|
class CCtrlScroll;
|
||||||
|
class CGroupList;
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
|
||||||
|
// Init the libwww
|
||||||
|
void initLibWWW();
|
||||||
|
|
||||||
|
// Get an url and setup a local domain
|
||||||
|
const std::string &setCurrentDomain(const std::string &url);
|
||||||
|
|
||||||
|
extern std::string CurrentCookie;
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
|
||||||
|
// Some DTD table
|
||||||
|
|
||||||
|
// Here, modify the DTD table to change the HTML parser (add new tags for exemples)
|
||||||
|
|
||||||
|
#undef HTML_ATTR
|
||||||
|
#define HTML_ATTR(t,a) MY_HTML_##t##_##a
|
||||||
|
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
HTML_ATTR(A,ACCESSKEY) = 0,
|
||||||
|
HTML_ATTR(A,CHARSET),
|
||||||
|
HTML_ATTR(A,CLASS),
|
||||||
|
HTML_ATTR(A,COORDS),
|
||||||
|
HTML_ATTR(A,DIR),
|
||||||
|
HTML_ATTR(A,HREF),
|
||||||
|
HTML_ATTR(A,HREFLANG),
|
||||||
|
HTML_ATTR(A,ID),
|
||||||
|
HTML_ATTR(A,NAME),
|
||||||
|
HTML_ATTR(A,REL),
|
||||||
|
HTML_ATTR(A,REV),
|
||||||
|
HTML_ATTR(A,SHAPE),
|
||||||
|
HTML_ATTR(A,STYLE),
|
||||||
|
HTML_ATTR(A,TABINDEX),
|
||||||
|
HTML_ATTR(A,TARGET),
|
||||||
|
HTML_ATTR(A,TYPE),
|
||||||
|
HTML_ATTR(A,TITLE),
|
||||||
|
HTML_ATTR(A,Z_ACTION_CATEGORY),
|
||||||
|
HTML_ATTR(A,Z_ACTION_PARAMS),
|
||||||
|
HTML_ATTR(A,Z_ACTION_SHORTCUT),
|
||||||
|
};
|
||||||
|
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
HTML_ATTR(TABLE,ALIGN) = 0,
|
||||||
|
HTML_ATTR(TABLE,BGCOLOR),
|
||||||
|
HTML_ATTR(TABLE,BORDER),
|
||||||
|
HTML_ATTR(TABLE,CELLPADDING),
|
||||||
|
HTML_ATTR(TABLE,CELLSPACING),
|
||||||
|
HTML_ATTR(TABLE,CLASS),
|
||||||
|
HTML_ATTR(TABLE,DIR),
|
||||||
|
HTML_ATTR(TABLE,FRAME),
|
||||||
|
HTML_ATTR(TABLE,ID),
|
||||||
|
HTML_ATTR(TABLE,L_MARGIN),
|
||||||
|
HTML_ATTR(TABLE,LANG),
|
||||||
|
HTML_ATTR(TABLE,NOWRAP),
|
||||||
|
HTML_ATTR(TABLE,RULES),
|
||||||
|
HTML_ATTR(TABLE,SUMMARY),
|
||||||
|
HTML_ATTR(TABLE,STYLE),
|
||||||
|
HTML_ATTR(TABLE,TITLE),
|
||||||
|
HTML_ATTR(TABLE,VALIGN),
|
||||||
|
HTML_ATTR(TABLE,WIDTH)
|
||||||
|
};
|
||||||
|
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
HTML_ATTR(TR,ALIGN) = 0,
|
||||||
|
HTML_ATTR(TR,BGCOLOR),
|
||||||
|
HTML_ATTR(TR,L_MARGIN),
|
||||||
|
HTML_ATTR(TR,NOWRAP),
|
||||||
|
HTML_ATTR(TR,VALIGN),
|
||||||
|
};
|
||||||
|
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
HTML_ATTR(TD,ABBR) = 0,
|
||||||
|
HTML_ATTR(TD,ALIGN),
|
||||||
|
HTML_ATTR(TD,AXIS),
|
||||||
|
HTML_ATTR(TD,BGCOLOR),
|
||||||
|
HTML_ATTR(TD,CHAR),
|
||||||
|
HTML_ATTR(TD,CHAROFF),
|
||||||
|
HTML_ATTR(TD,CLASS),
|
||||||
|
HTML_ATTR(TD,COLSPAN),
|
||||||
|
HTML_ATTR(TD,DIR),
|
||||||
|
HTML_ATTR(TD,ID),
|
||||||
|
HTML_ATTR(TD,HEADERS),
|
||||||
|
HTML_ATTR(TD,HEIGHT),
|
||||||
|
HTML_ATTR(TD,L_MARGIN),
|
||||||
|
HTML_ATTR(TD,LANG),
|
||||||
|
HTML_ATTR(TD,NOWRAP),
|
||||||
|
HTML_ATTR(TD,ROWSPAN),
|
||||||
|
HTML_ATTR(TD,SCOPE),
|
||||||
|
HTML_ATTR(TD,STYLE),
|
||||||
|
HTML_ATTR(TD,TITLE),
|
||||||
|
HTML_ATTR(TD,VALIGN),
|
||||||
|
HTML_ATTR(TD,WIDTH),
|
||||||
|
};
|
||||||
|
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
HTML_ATTR(IMG,ALIGN) = 0,
|
||||||
|
HTML_ATTR(IMG,ALT),
|
||||||
|
HTML_ATTR(IMG,BORDER),
|
||||||
|
HTML_ATTR(IMG,CLASS),
|
||||||
|
HTML_ATTR(IMG,DIR),
|
||||||
|
HTML_ATTR(IMG,GLOBAL_COLOR),
|
||||||
|
HTML_ATTR(IMG,HEIGHT),
|
||||||
|
HTML_ATTR(IMG,HSPACE),
|
||||||
|
HTML_ATTR(IMG,ID),
|
||||||
|
HTML_ATTR(IMG,ISMAP),
|
||||||
|
HTML_ATTR(IMG,LANG),
|
||||||
|
HTML_ATTR(IMG,LONGDESC),
|
||||||
|
HTML_ATTR(IMG,SRC),
|
||||||
|
HTML_ATTR(IMG,STYLE),
|
||||||
|
HTML_ATTR(IMG,TITLE),
|
||||||
|
HTML_ATTR(IMG,USEMAP),
|
||||||
|
HTML_ATTR(IMG,VSPACE),
|
||||||
|
HTML_ATTR(IMG,WIDTH),
|
||||||
|
};
|
||||||
|
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
HTML_ATTR(INPUT,ACCEPT) = 0,
|
||||||
|
HTML_ATTR(INPUT,ACCESSKEY),
|
||||||
|
HTML_ATTR(INPUT,ALIGN),
|
||||||
|
HTML_ATTR(INPUT,ALT),
|
||||||
|
HTML_ATTR(INPUT,CHECKED),
|
||||||
|
HTML_ATTR(INPUT,CLASS),
|
||||||
|
HTML_ATTR(INPUT,DIR),
|
||||||
|
HTML_ATTR(INPUT,DISABLED),
|
||||||
|
HTML_ATTR(INPUT,GLOBAL_COLOR),
|
||||||
|
HTML_ATTR(INPUT,ID),
|
||||||
|
HTML_ATTR(INPUT,LANG),
|
||||||
|
HTML_ATTR(INPUT,MAXLENGTH),
|
||||||
|
HTML_ATTR(INPUT,NAME),
|
||||||
|
HTML_ATTR(INPUT,READONLY),
|
||||||
|
HTML_ATTR(INPUT,SIZE),
|
||||||
|
HTML_ATTR(INPUT,SRC),
|
||||||
|
HTML_ATTR(INPUT,STYLE),
|
||||||
|
HTML_ATTR(INPUT,TABINDEX),
|
||||||
|
HTML_ATTR(INPUT,TITLE),
|
||||||
|
HTML_ATTR(INPUT,TYPE),
|
||||||
|
HTML_ATTR(INPUT,USEMAP),
|
||||||
|
HTML_ATTR(INPUT,VALUE),
|
||||||
|
HTML_ATTR(INPUT,Z_BTN_TMPL),
|
||||||
|
HTML_ATTR(INPUT,Z_INPUT_TMPL),
|
||||||
|
HTML_ATTR(INPUT,Z_INPUT_WIDTH),
|
||||||
|
};
|
||||||
|
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
HTML_ATTR(TEXTAREA,CLASS) = 0,
|
||||||
|
HTML_ATTR(TEXTAREA,COLS),
|
||||||
|
HTML_ATTR(TEXTAREA,DIR),
|
||||||
|
HTML_ATTR(TEXTAREA,DISABLED),
|
||||||
|
HTML_ATTR(TEXTAREA,ID),
|
||||||
|
HTML_ATTR(TEXTAREA,LANG),
|
||||||
|
HTML_ATTR(TEXTAREA,NAME),
|
||||||
|
HTML_ATTR(TEXTAREA,READONLY),
|
||||||
|
HTML_ATTR(TEXTAREA,ROWS),
|
||||||
|
HTML_ATTR(TEXTAREA,STYLE),
|
||||||
|
HTML_ATTR(TEXTAREA,TABINDEX),
|
||||||
|
HTML_ATTR(TEXTAREA,TITLE),
|
||||||
|
HTML_ATTR(TEXTAREA,Z_INPUT_TMPL),
|
||||||
|
};
|
||||||
|
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
HTML_ATTR(P,QUICK_HELP_CONDITION) = 0,
|
||||||
|
HTML_ATTR(P,QUICK_HELP_EVENTS),
|
||||||
|
HTML_ATTR(P,QUICK_HELP_LINK),
|
||||||
|
HTML_ATTR(P,NAME),
|
||||||
|
};
|
||||||
|
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
HTML_ATTR(DIV,CLASS) = 0,
|
||||||
|
HTML_ATTR(DIV,ID),
|
||||||
|
HTML_ATTR(DIV,NAME),
|
||||||
|
HTML_ATTR(DIV,STYLE),
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#undef HTML_ATTR
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
|
||||||
|
// A smart ptr for LibWWW strings
|
||||||
|
class C3WSmartPtr
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
C3WSmartPtr ()
|
||||||
|
{
|
||||||
|
_Ptr = NULL;
|
||||||
|
}
|
||||||
|
C3WSmartPtr (const char *ptr)
|
||||||
|
{
|
||||||
|
_Ptr = ptr;
|
||||||
|
}
|
||||||
|
~C3WSmartPtr ()
|
||||||
|
{
|
||||||
|
clear();
|
||||||
|
}
|
||||||
|
void operator=(const char *str)
|
||||||
|
{
|
||||||
|
clear ();
|
||||||
|
_Ptr = str;
|
||||||
|
}
|
||||||
|
operator const char *() const
|
||||||
|
{
|
||||||
|
return _Ptr;
|
||||||
|
}
|
||||||
|
void clear()
|
||||||
|
{
|
||||||
|
if (_Ptr)
|
||||||
|
{
|
||||||
|
void *ptr = (void*)_Ptr;
|
||||||
|
HT_FREE(ptr);
|
||||||
|
}
|
||||||
|
_Ptr = NULL;
|
||||||
|
}
|
||||||
|
private:
|
||||||
|
const char *_Ptr;
|
||||||
|
};
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
|
||||||
|
// Read a width HTML parameter. "100" or "100%". Returns true if percent (0 ~ 1) else false
|
||||||
|
bool getPercentage (sint32 &width, float &percent, const char *str);
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
|
||||||
|
// Parse a HTML color
|
||||||
|
NLMISC::CRGBA getColor (const char *color);
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
|
||||||
|
void _VerifyLibWWW(const char *function, bool ok, const char *file, int line);
|
||||||
|
#define VerifyLibWWW(a,b) _VerifyLibWWW(a,(b)!=FALSE,__FILE__,__LINE__)
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
|
||||||
|
// Standard request terminator
|
||||||
|
int requestTerminater (HTRequest * request, HTResponse * response, void * param, int status) ;
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1,388 @@
|
|||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
#ifndef RZ_LUA_HELPER_H
|
||||||
|
#define RZ_LUA_HELPER_H
|
||||||
|
|
||||||
|
|
||||||
|
#include "nel/misc/types_nl.h"
|
||||||
|
#include "nel/misc/smart_ptr.h"
|
||||||
|
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#include "lua_loadlib.h"
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
|
||||||
|
class CLuaState;
|
||||||
|
|
||||||
|
namespace LuaHelperStuff
|
||||||
|
{
|
||||||
|
void formatLuaStackContext( std::string &stackContext );
|
||||||
|
std::string formatLuaErrorSysInfo( const std::string &error );
|
||||||
|
std::string formatLuaErrorNlWarn( const std::string &error );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
/** Helper class to see if a stack is restored at its initial size (or with n return results).
|
||||||
|
* Check that the stack size remains unchanged when the object goes out of scope
|
||||||
|
*/
|
||||||
|
class CLuaStackChecker
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CLuaStackChecker(CLuaState *state, int numWantedResults = 0);
|
||||||
|
~CLuaStackChecker();
|
||||||
|
/** Increment exception context counter
|
||||||
|
* When an exception is thrown, lua stack checker do any assert bu will
|
||||||
|
* rather restore the lua stack at its original size, and will
|
||||||
|
* let the exception a chance to propagate
|
||||||
|
*/
|
||||||
|
static void incrementExceptionContextCounter();
|
||||||
|
static void decrementExceptionContextCounter();
|
||||||
|
|
||||||
|
private:
|
||||||
|
CLuaState *_State;
|
||||||
|
int _FinalWantedSize;
|
||||||
|
static uint _ExceptionContextCounter;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
// **************************************************************************
|
||||||
|
/** Helper class to restore the lua stack to the desired size when this object goes out of scope
|
||||||
|
*/
|
||||||
|
class CLuaStackRestorer
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CLuaStackRestorer(CLuaState *state, int finalSize);
|
||||||
|
~CLuaStackRestorer();
|
||||||
|
private:
|
||||||
|
int _FinalSize;
|
||||||
|
CLuaState *_State;
|
||||||
|
};
|
||||||
|
|
||||||
|
////////////////
|
||||||
|
// EXCEPTIONS //
|
||||||
|
////////////////
|
||||||
|
|
||||||
|
class ELuaError : public NLMISC::Exception
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ELuaError() { CLuaStackChecker::incrementExceptionContextCounter(); }
|
||||||
|
virtual ~ELuaError() throw() { CLuaStackChecker::decrementExceptionContextCounter(); }
|
||||||
|
ELuaError(const std::string &reason) : Exception(reason) { CLuaStackChecker::incrementExceptionContextCounter(); }
|
||||||
|
// what(), plus append the Reason
|
||||||
|
virtual std::string luaWhat() const throw() {return NLMISC::toString("LUAError: %s", what());}
|
||||||
|
};
|
||||||
|
|
||||||
|
// A parse error occured
|
||||||
|
class ELuaParseError : public ELuaError
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ELuaParseError() {}
|
||||||
|
ELuaParseError(const std::string &reason) : ELuaError(reason) {}
|
||||||
|
virtual ~ELuaParseError() throw() { }
|
||||||
|
// what(), plus append the Reason
|
||||||
|
virtual std::string luaWhat() const throw() {return NLMISC::toString("ELuaParseError: %s", what());}
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Exception thrown when something went wrong inside a wrapped function called by lua
|
||||||
|
*/
|
||||||
|
class ELuaWrappedFunctionException : public ELuaError
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ELuaWrappedFunctionException(CLuaState *luaState);
|
||||||
|
ELuaWrappedFunctionException(CLuaState *luaState, const std::string &reason);
|
||||||
|
ELuaWrappedFunctionException(CLuaState *luaState, const char *format, ...);
|
||||||
|
virtual ~ELuaWrappedFunctionException() throw() { }
|
||||||
|
virtual const char *what() const throw() {return _Reason.c_str();}
|
||||||
|
protected:
|
||||||
|
void init(CLuaState *ls, const std::string &reason);
|
||||||
|
protected:
|
||||||
|
std::string _Reason;
|
||||||
|
};
|
||||||
|
|
||||||
|
// A execution error occured
|
||||||
|
class ELuaExecuteError : public ELuaError
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ELuaExecuteError() {}
|
||||||
|
ELuaExecuteError(const std::string &reason) : ELuaError(reason) {}
|
||||||
|
virtual ~ELuaExecuteError() throw() { }
|
||||||
|
// what(), plus append the Reason
|
||||||
|
virtual std::string luaWhat() const throw() {return NLMISC::toString("ELuaExecuteError: %s", what());}
|
||||||
|
};
|
||||||
|
|
||||||
|
// A bad cast occured when using lua_checkcast
|
||||||
|
class ELuaBadCast : public ELuaError
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ELuaBadCast() {}
|
||||||
|
ELuaBadCast(const std::string &reason) : ELuaError(reason) {}
|
||||||
|
// what(), plus append the Reason
|
||||||
|
virtual std::string luaWhat() const throw() {return NLMISC::toString("ELuaBadCast: %s", what());}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Error when trying to indexate an object that is not a table
|
||||||
|
class ELuaNotATable : public ELuaError
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ELuaNotATable() {}
|
||||||
|
ELuaNotATable(const std::string &reason) : ELuaError(reason) {}
|
||||||
|
// what(), plus append the Reason
|
||||||
|
virtual std::string luaWhat() const throw() {return NLMISC::toString("ELuaNotATable: %s", what());}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
// a function to be used with a CLuaState instance
|
||||||
|
typedef int (* TLuaWrappedFunction) (CLuaState &ls);
|
||||||
|
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
/** C++ version of a lua state
|
||||||
|
*/
|
||||||
|
class CLuaState : public NLMISC::CRefCount
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
typedef NLMISC::CRefPtr<CLuaState> TRefPtr;
|
||||||
|
|
||||||
|
// Create a new environement
|
||||||
|
CLuaState( bool debugger = false );
|
||||||
|
~CLuaState();
|
||||||
|
|
||||||
|
|
||||||
|
/// \name Registering
|
||||||
|
// @{
|
||||||
|
// register a wrapped function
|
||||||
|
void registerFunc(const char *name, TLuaWrappedFunction function);
|
||||||
|
// @}
|
||||||
|
|
||||||
|
|
||||||
|
/// \name Script execution
|
||||||
|
// @{
|
||||||
|
|
||||||
|
/** Parse a script and push as a function in top of the LUA stack
|
||||||
|
* \throw ELuaParseError
|
||||||
|
* \param dbgSrc is a string for debug. Should be a filename (preceded with '@'), or a short script.
|
||||||
|
*/
|
||||||
|
void loadScript(const std::string &code, const std::string &dbgSrc);
|
||||||
|
|
||||||
|
/** Execute a script from a string, possibly throwing an exception if there's a parse error
|
||||||
|
* \throw ELuaParseError, ELuaExecuteError
|
||||||
|
*/
|
||||||
|
void executeScript(const std::string &code, int numRet = 0);
|
||||||
|
|
||||||
|
/** Execute a script from a string. If an errors occurs it is printed in the log
|
||||||
|
* \return true if script execution was successful
|
||||||
|
*/
|
||||||
|
bool executeScriptNoThrow(const std::string &code, int numRet = 0);
|
||||||
|
|
||||||
|
/** Load a Script from a File (maybe in a BNP), and execute it
|
||||||
|
* \return false if file not found
|
||||||
|
* \throw ELuaParseError, ELuaExecuteError
|
||||||
|
*/
|
||||||
|
bool executeFile(const std::string &pathName);
|
||||||
|
|
||||||
|
/** execute a very Small Script (a function call for instance)
|
||||||
|
* It is different from doString() in such there is a cache (where the key is the script itself)
|
||||||
|
* so that the second time this script is executed, there is no parsing
|
||||||
|
* Note: I experienced optim with about 10 times faster than a executeScript() on a simple "a= a+1;" script
|
||||||
|
* \throw ELuaParseError, ELuaExecuteError
|
||||||
|
*/
|
||||||
|
void executeSmallScript(const std::string &script);
|
||||||
|
|
||||||
|
// @}
|
||||||
|
|
||||||
|
|
||||||
|
/// \name Stack Manipulation
|
||||||
|
// @{
|
||||||
|
// stack manipulation (indices start at 1)
|
||||||
|
void setTop(int index); // set new size of stack
|
||||||
|
void clear() { setTop(0); }
|
||||||
|
int getTop();
|
||||||
|
bool empty() { return getTop() == 0; }
|
||||||
|
void pushValue(int index); // copie nth element of stack to the top of the stack
|
||||||
|
void remove(int index); // remove nth element of stack
|
||||||
|
void insert(int index); // insert last element of the stack before the given position
|
||||||
|
void replace(int index); // replace nth element of the stack with the top of the stack
|
||||||
|
void pop(int numElem = 1); // remove n elements from the top of the stack
|
||||||
|
// test the type of an element in the stack
|
||||||
|
// return one of the following values :
|
||||||
|
// LUA_TNIL
|
||||||
|
// LUA_TNUMBER
|
||||||
|
// LUA_TBOOLEAN
|
||||||
|
// LUA_TSTRING
|
||||||
|
// LUA_TTABLE
|
||||||
|
// LUA_TFUNCTION
|
||||||
|
// LUA_TUSERDATA
|
||||||
|
// LUA_TTHREAD
|
||||||
|
// LUA_TLIGHTUSERDATA
|
||||||
|
int type(int index = -1);
|
||||||
|
const char *getTypename(int type);
|
||||||
|
bool isNil(int index = -1);
|
||||||
|
bool isBoolean(int index = -1);
|
||||||
|
bool isNumber(int index = -1);
|
||||||
|
bool isString(int index = -1);
|
||||||
|
bool isTable(int index = -1);
|
||||||
|
bool isFunction(int index = -1);
|
||||||
|
bool isCFunction(int index = -1);
|
||||||
|
bool isUserData(int index = -1);
|
||||||
|
bool isLightUserData(int index = -1);
|
||||||
|
// converting then getting a value from the stack
|
||||||
|
bool toBoolean(int index = -1);
|
||||||
|
lua_Number toNumber(int index = -1);
|
||||||
|
const char *toString(int index = -1);
|
||||||
|
void toString(int index, std::string &str); // convert to a std::string, with a NULL check.
|
||||||
|
size_t strlen(int index = -1);
|
||||||
|
lua_CFunction toCFunction(int index = -1);
|
||||||
|
void *toUserData(int index = -1);
|
||||||
|
const void *toPointer(int index = -1);
|
||||||
|
/** Helper functions : get value of the wanted type in the top table after conversion
|
||||||
|
* A default value is used if the stack entry is NULL.
|
||||||
|
* If conversion fails then an exception is thrown (with optional msg)
|
||||||
|
*/
|
||||||
|
bool getTableBooleanValue(const char *name, bool defaultValue= false);
|
||||||
|
double getTableNumberValue(const char *name, double defaultValue= 0);
|
||||||
|
const char *getTableStringValue(const char *name, const char *defaultValue= NULL);
|
||||||
|
// pushing value onto the stack
|
||||||
|
void push(bool value);
|
||||||
|
void push(lua_Number value);
|
||||||
|
void push(const char *str);
|
||||||
|
void push(const char *str, int length);
|
||||||
|
void push(const std::string &str);
|
||||||
|
void pushNil();
|
||||||
|
void push(lua_CFunction f);
|
||||||
|
void push(TLuaWrappedFunction function);
|
||||||
|
void pushLightUserData(void *); // push a light user data (use newUserData to push a full userdata)
|
||||||
|
// metatables
|
||||||
|
bool getMetaTable(int index = -1);
|
||||||
|
bool setMetaTable(int index = -1); // set the metatable at top of stack to the object at 'index' (usually -2), then pop the metatable
|
||||||
|
// even if asignment failed
|
||||||
|
// comparison
|
||||||
|
bool equal(int index1, int index2);
|
||||||
|
bool rawEqual(int index1, int index2);
|
||||||
|
bool lessThan(int index1, int index2);
|
||||||
|
// concatenation of the n element at the top of the stack (using lua semantic)
|
||||||
|
void concat(int numElem);
|
||||||
|
// tables
|
||||||
|
void newTable(); // create a new table at top of the stack
|
||||||
|
void getTable(int index); // get value from a table at index 'index' (key is at top)
|
||||||
|
void rawGet(int index);
|
||||||
|
void setTable(int index); // set (key, value) from top of the stack into the given table
|
||||||
|
// both key and value are poped
|
||||||
|
void rawSet(int index);
|
||||||
|
bool next(int index); // table traversal
|
||||||
|
// UserData
|
||||||
|
void *newUserData(uint size);
|
||||||
|
// seting value by int index in a table
|
||||||
|
void rawSetI(int index, int n);
|
||||||
|
void rawGetI(int index, int n);
|
||||||
|
/** Calling functions (it's up to the caller to clear the results)
|
||||||
|
* The function should have been pushed on the stack
|
||||||
|
*/
|
||||||
|
void call(int nargs, int nresults);
|
||||||
|
int pcall(int nargs, int nresults, int errfunc = 0);
|
||||||
|
/** Helper : Execute a function by name. Lookup for the function is done in the table at the index 'funcTableIndex'
|
||||||
|
* the behaviour is the same than with call of pcall.
|
||||||
|
*/
|
||||||
|
int pcallByName(const char *functionName, int nargs, int nresults, int funcTableIndex = LUA_GLOBALSINDEX, int errfunc = 0);
|
||||||
|
|
||||||
|
// push a C closure (pop n element from the stack and associate with the function)
|
||||||
|
void pushCClosure(lua_CFunction function, int n);
|
||||||
|
// @}
|
||||||
|
|
||||||
|
|
||||||
|
/// \name Misc
|
||||||
|
// @{
|
||||||
|
/** Retrieve pointer to a CLuaState environment from its lua_State pointer, or NULL
|
||||||
|
* if there no such environment
|
||||||
|
*/
|
||||||
|
static CLuaState *fromStatePointer(lua_State *state);
|
||||||
|
// Get state pointer. The state should not be closed (this object has ownership)
|
||||||
|
lua_State *getStatePointer() const {return _State;}
|
||||||
|
// check that an index is valid when accessing the stack
|
||||||
|
// an assertion is raised if the index is not valid
|
||||||
|
void checkIndex(int index);
|
||||||
|
|
||||||
|
// registering C function to use with a lua state pointer
|
||||||
|
void registerFunc(const char *name, lua_CFunction function);
|
||||||
|
|
||||||
|
// Garbage collector
|
||||||
|
int getGCCount(); // get memory in use in KB
|
||||||
|
int getGCThreshold(); // get max memory in KB
|
||||||
|
void setGCThreshold(int kb); // set max memory in KB (no-op with ref-counted version)
|
||||||
|
|
||||||
|
// handle garbage collector for ref-counted version of lua (no-op with standard version, in which case gc handling is automatic)
|
||||||
|
void handleGC();
|
||||||
|
|
||||||
|
/** For Debug: get the Stack context of execution (filename / line)
|
||||||
|
* \param stackLevel: get the context of execution of the given stackLevel.
|
||||||
|
* 0 for the current function
|
||||||
|
* 1 for the function that called 0
|
||||||
|
* 2 ....
|
||||||
|
* NB: if called from a C function called from LUA, remember that stackLevel 0 is the current function.
|
||||||
|
* Hence if you want to know what LUA context called you, pass stackLevel=1!
|
||||||
|
* \param ret string cleared if any error, else filled with formated FileName / LineNumber
|
||||||
|
*/
|
||||||
|
void getStackContext(std::string &ret, uint stackLevel);
|
||||||
|
// @}
|
||||||
|
|
||||||
|
// for debug : dump the current content of the stack (no recursion)
|
||||||
|
void dumpStack();
|
||||||
|
static void dumpStack(lua_State *ls);
|
||||||
|
void getStackAsString(std::string &dest);
|
||||||
|
|
||||||
|
|
||||||
|
private:
|
||||||
|
lua_State *_State;
|
||||||
|
|
||||||
|
#ifdef LUA_NEVRAX_VERSION
|
||||||
|
int _GCThreshold; // if refcounted gc is used, then garbage collector is handled manually
|
||||||
|
#endif
|
||||||
|
// Small Script Cache
|
||||||
|
uint _SmallScriptPool;
|
||||||
|
typedef std::map<std::string, uint> TSmallScriptCache;
|
||||||
|
TSmallScriptCache _SmallScriptCache;
|
||||||
|
static const char * _NELSmallScriptTableName;
|
||||||
|
|
||||||
|
private:
|
||||||
|
// this object isn't intended to be copied
|
||||||
|
CLuaState(const CLuaState &/* other */):NLMISC::CRefCount() { nlassert(0); }
|
||||||
|
CLuaState &operator=(const CLuaState &/* other */) { nlassert(0); return *this; }
|
||||||
|
|
||||||
|
void executeScriptInternal(const std::string &code, const std::string &dbgSrc, int numRet = 0);
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// Access to lua function
|
||||||
|
// one should not include lua.h directly because if a debugger is present, lua
|
||||||
|
// function pointer will be taken from a dynamic library.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//=============================================================================================
|
||||||
|
// include implementation
|
||||||
|
#define RZ_INCLUDE_LUA_HELPER_INLINE
|
||||||
|
#include "lua_helper_inline.h"
|
||||||
|
#undef RZ_INCLUDE_LUA_HELPER_INLINE
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1,193 @@
|
|||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
#ifndef NL_LUA_IHM_H
|
||||||
|
#define NL_LUA_IHM_H
|
||||||
|
|
||||||
|
#include "nel/misc/types_nl.h"
|
||||||
|
#include "nel/gui/lua_helper.h"
|
||||||
|
#include "nel/gui/interface_element.h"
|
||||||
|
|
||||||
|
#define IHM_LUA_METATABLE "__ui_metatable"
|
||||||
|
#define IHM_LUA_ENVTABLE "__ui_envtable"
|
||||||
|
|
||||||
|
namespace NLMISC
|
||||||
|
{
|
||||||
|
class CPolygon2D;
|
||||||
|
class CVector2f;
|
||||||
|
class CRGBA;
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
|
||||||
|
class CReflectable;
|
||||||
|
class CReflectedProperty;
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
/* Use this Exception for all LUA Error (eg: scripted passes bad number of paramters).
|
||||||
|
* Does not herit from Exception because avoid nlinfo, because sent twice (catch then resent)
|
||||||
|
* This is special to lua and IHM since it works with CLuaStackChecker, and also append to the error msg
|
||||||
|
* the FileName/LineNumber
|
||||||
|
*/
|
||||||
|
class ELuaIHMException : public ELuaWrappedFunctionException
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
static CLuaState *getLuaState();
|
||||||
|
public:
|
||||||
|
ELuaIHMException() : ELuaWrappedFunctionException(getLuaState())
|
||||||
|
{
|
||||||
|
}
|
||||||
|
ELuaIHMException(const std::string &reason) : ELuaWrappedFunctionException(getLuaState(), reason)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
ELuaIHMException(const char *format, ...) : ELuaWrappedFunctionException(getLuaState())
|
||||||
|
{
|
||||||
|
std::string reason;
|
||||||
|
NLMISC_CONVERT_VARGS (reason, format, NLMISC::MaxCStringSize);
|
||||||
|
init(getLuaState(), reason);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// ***************************************************************************
|
||||||
|
/**
|
||||||
|
* Define Functions to export from C to LUA
|
||||||
|
* \author Lionel Berenguier
|
||||||
|
* \author Nevrax France
|
||||||
|
* \date 2004
|
||||||
|
*/
|
||||||
|
class CLuaIHM
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
static void registerAll(CLuaState &ls);
|
||||||
|
|
||||||
|
/** CReflectableInterfaceElement management on stack, stored by a CRefPtr.
|
||||||
|
* May be called as well for ui element, because they derive from CReflectableRefPtrTarget
|
||||||
|
*/
|
||||||
|
static void pushReflectableOnStack(CLuaState &ls, class CReflectableRefPtrTarget *pRPT);
|
||||||
|
static bool isReflectableOnStack(CLuaState &ls, sint index);
|
||||||
|
static CReflectableRefPtrTarget *getReflectableOnStack(CLuaState &ls, sint index);
|
||||||
|
|
||||||
|
|
||||||
|
// ucstring
|
||||||
|
static bool pop(CLuaState &ls, ucstring &dest);
|
||||||
|
static void push(CLuaState &ls, const ucstring &value);
|
||||||
|
static bool isUCStringOnStack(CLuaState &ls, sint index);
|
||||||
|
static bool getUCStringOnStack(CLuaState &ls, sint index, ucstring &dest);
|
||||||
|
|
||||||
|
|
||||||
|
// RGBA
|
||||||
|
static bool pop(CLuaState &ls, NLMISC::CRGBA &dest);
|
||||||
|
|
||||||
|
// CVector2f
|
||||||
|
static bool pop(CLuaState &ls, NLMISC::CVector2f &dest);
|
||||||
|
|
||||||
|
// helper : get a 2D poly (a table of cvector2f) from a lua table (throw on fail)
|
||||||
|
static void getPoly2DOnStack(CLuaState &ls, sint index, NLMISC::CPolygon2D &dest);
|
||||||
|
|
||||||
|
// argument checkin helpers
|
||||||
|
static void checkArgCount(CLuaState &ls, const char* funcName, uint nArgs); // check that number of argument is exactly the one required
|
||||||
|
static void checkArgMin(CLuaState &ls, const char* funcName, uint nArgs); // check that number of argument is at least the one required
|
||||||
|
static void checkArgMax(CLuaState &ls, const char* funcName, uint nArgs); // check that number of argument is at most the one required
|
||||||
|
static void check(CLuaState &ls, bool ok, const std::string &failReason);
|
||||||
|
static void checkArgType(CLuaState &ls, const char *funcName, uint index, int argType);
|
||||||
|
static void checkArgTypeRGBA(CLuaState &ls, const char *funcName, uint index);
|
||||||
|
static void checkArgTypeUCString(CLuaState &ls, const char *funcName, uint index);
|
||||||
|
/** throw a lua expection (inside a C function called from lua) with the given reason, and the current call stack
|
||||||
|
* The various check... function call this function when their test fails
|
||||||
|
*/
|
||||||
|
static void fails(CLuaState &ls, const char *format, ...);
|
||||||
|
|
||||||
|
// pop a sint32 from a lua stack, throw an exception on fail
|
||||||
|
static bool popSINT32(CLuaState &ls, sint32 & dest);
|
||||||
|
bool popString(CLuaState &ls, std::string & dest);
|
||||||
|
|
||||||
|
/** read/write between values on a lua stack & a property exported from a 'CReflectable' derived object
|
||||||
|
* (throws on error)
|
||||||
|
*/
|
||||||
|
static void luaValueToReflectedProperty(CLuaState &ls, int stackIndex, CReflectable &target, const CReflectedProperty &property) throw(ELuaIHMException);
|
||||||
|
|
||||||
|
// push a reflected property on the stack
|
||||||
|
// NB : no check is done that 'property' is part of the class info of 'reflectedObject'
|
||||||
|
static void luaValueFromReflectedProperty(CLuaState &ls, CReflectable &reflectedObject, const CReflectedProperty &property);
|
||||||
|
|
||||||
|
private:
|
||||||
|
// Functions for the ui metatable
|
||||||
|
static class CInterfaceElement* getUIRelative( CInterfaceElement *pIE, const std::string &propName );
|
||||||
|
static int luaUIIndex( CLuaState &ls );
|
||||||
|
static int luaUINewIndex( CLuaState &ls );
|
||||||
|
static int luaUIEq( CLuaState &ls );
|
||||||
|
static int luaUINext( CLuaState &ls );
|
||||||
|
static int luaUIDtor( CLuaState &ls );
|
||||||
|
|
||||||
|
|
||||||
|
static void registerBasics(CLuaState &ls);
|
||||||
|
static void registerIHM(CLuaState &ls);
|
||||||
|
static void createLuaEnumTable(CLuaState &ls, const std::string &str);
|
||||||
|
|
||||||
|
public:
|
||||||
|
static void pushUIOnStack(CLuaState &ls, CInterfaceElement *pIE);
|
||||||
|
static bool isUIOnStack(CLuaState &ls, sint index);
|
||||||
|
static CInterfaceElement *getUIOnStack(CLuaState &ls, sint index);
|
||||||
|
static void checkArgTypeUIElement(CLuaState &ls, const char *funcName, uint index);
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
//////////////////////////////////////////// Exported functions //////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
static uint32 getLocalTime();
|
||||||
|
static double getPreciseLocalTime();
|
||||||
|
static std::string findReplaceAll(const std::string &str, const std::string &search, const std::string &replace);
|
||||||
|
static ucstring findReplaceAll(const ucstring &str, const ucstring &search, const ucstring &replace);
|
||||||
|
static ucstring findReplaceAll(const ucstring &str, const std::string &search, const std::string &replace);
|
||||||
|
static ucstring findReplaceAll(const ucstring &str, const std::string &search, const ucstring &replace);
|
||||||
|
static ucstring findReplaceAll(const ucstring &str, const ucstring &search, const std::string &replace);
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
static int luaMethodCall(lua_State *ls);
|
||||||
|
|
||||||
|
static int setOnDraw(CLuaState &ls); // params: CInterfaceGroup*, "script". return: none
|
||||||
|
static int addOnDbChange(CLuaState &ls); // params: CInterfaceGroup*, "dblist", "script". return: none
|
||||||
|
static int removeOnDbChange(CLuaState &ls);// params: CInterfaceGroup*. return: none
|
||||||
|
static int setCaptureKeyboard(CLuaState &ls);
|
||||||
|
static int resetCaptureKeyboard(CLuaState &ls);
|
||||||
|
static int getUIId(CLuaState &ls); // params: CInterfaceElement*. return: ui id (empty if error)
|
||||||
|
static int runAH(CLuaState &ls); // params: CInterfaceElement *, "ah", "params". return: none
|
||||||
|
static int getWindowSize(CLuaState &ls);
|
||||||
|
static int setTopWindow(CLuaState &ls); // set the top window
|
||||||
|
static int getTextureSize(CLuaState &ls);
|
||||||
|
static int disableModalWindow(CLuaState &ls);
|
||||||
|
static int deleteUI(CLuaState &ls); // params: CInterfaceElement*.... return: none
|
||||||
|
static int deleteReflectable(CLuaState &ls); // params: CInterfaceElement*.... return: none
|
||||||
|
static int getCurrentWindowUnder(CLuaState &ls); // params: none. return: CInterfaceElement* (nil if none)
|
||||||
|
static bool fileExists(const std::string &fileName);
|
||||||
|
static int runExprAndPushResult(CLuaState &ls, const std::string &expr); // Used by runExpr and runFct
|
||||||
|
static int runExpr(CLuaState &ls); // params: "expr". return: any of: nil,bool,string,number, RGBA, UCString
|
||||||
|
static int runFct(CLuaState &ls); // params: "expr", param1, param2.... return: any of: nil,bool,string,number, RGBA, UCString
|
||||||
|
static int runCommand(CLuaState &ls); // params: "command name", param1, param2 ... return true or false
|
||||||
|
static int isUCString(CLuaState &ls);
|
||||||
|
static int concatUCString(CLuaState &ls); // workaround for + operator that don't work in luabind for ucstrings ...
|
||||||
|
static int concatString(CLuaState &ls); // speedup concatenation of several strings
|
||||||
|
static int tableToString(CLuaState &ls); // concat element of a table to build a string
|
||||||
|
static int getPathContent(CLuaState &ls);
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // NL_LUA_IHM_H
|
||||||
|
|
||||||
|
/* End of lua_ihm.h */
|
@ -0,0 +1,78 @@
|
|||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
#ifndef LUA_MANAGER_H
|
||||||
|
#define LUA_MANAGER_H
|
||||||
|
|
||||||
|
#include "nel/misc/smart_ptr.h"
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
class CLuaState;
|
||||||
|
|
||||||
|
/**
|
||||||
|
Lua Manager
|
||||||
|
|
||||||
|
Provides a single global access point to the Lua state, and related stuff. :(
|
||||||
|
*/
|
||||||
|
class CLuaManager
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
~CLuaManager();
|
||||||
|
|
||||||
|
static CLuaManager& getInstance()
|
||||||
|
{
|
||||||
|
if( instance == NULL )
|
||||||
|
{
|
||||||
|
instance = new CLuaManager();
|
||||||
|
}
|
||||||
|
return *instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Enables attaching the Lua debugger in the CLuaState instance, only matters on startup.
|
||||||
|
static void enableLuaDebugging(){ debugLua = true; }
|
||||||
|
|
||||||
|
/// Returns the Lua state.
|
||||||
|
NLGUI::CLuaState* getLuaState() const{ return luaState; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
Executes a Lua script
|
||||||
|
@param luaScript - the script we want to execute ( the actual script, not the filename! )
|
||||||
|
@param smallScript - true if the script is very small, so it can be cached for the possible next execution.
|
||||||
|
*/
|
||||||
|
bool executeLuaScript( const std::string &luaScript, bool smallScript = false );
|
||||||
|
|
||||||
|
/// Resets the Lua state, that is deallocates it and allocates a new one.
|
||||||
|
void ResetLuaState();
|
||||||
|
|
||||||
|
/// Forces the Garbage Collector to run.
|
||||||
|
void forceGarbageCollect();
|
||||||
|
|
||||||
|
static void setEditorMode( bool b ){ editorMode = b; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
CLuaManager();
|
||||||
|
|
||||||
|
static CLuaManager *instance;
|
||||||
|
static bool debugLua;
|
||||||
|
static bool editorMode;
|
||||||
|
|
||||||
|
NLGUI::CLuaState *luaState;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1,303 @@
|
|||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
#ifndef RZ_LUA_OBJECT
|
||||||
|
#define RZ_LUA_OBJECT
|
||||||
|
|
||||||
|
|
||||||
|
#include "nel/misc/smart_ptr.h"
|
||||||
|
#include "nel/misc/rgba.h"
|
||||||
|
#include "nel/gui/lua_helper.h"
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
|
||||||
|
class CLuaEnumeration;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wrapper to a lua value
|
||||||
|
*
|
||||||
|
* Useful to navigate through lua tables without having to deal with the stack.
|
||||||
|
*
|
||||||
|
* The following types are tracked by reference :
|
||||||
|
* - lua table
|
||||||
|
* - lua user data
|
||||||
|
* - lua functions
|
||||||
|
*
|
||||||
|
* The following types are kept by value :
|
||||||
|
*
|
||||||
|
* - lua numbers
|
||||||
|
* - lua strings ?
|
||||||
|
* - lua boolean
|
||||||
|
* - lua light user datas
|
||||||
|
* - lua 'pointers'
|
||||||
|
*
|
||||||
|
* Each reference object has an id giving its path in order to track bugs more easily
|
||||||
|
*/
|
||||||
|
class CLuaObject
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CLuaObject() {}
|
||||||
|
~CLuaObject();
|
||||||
|
// Build this object by popping it from the given lua state
|
||||||
|
CLuaObject(CLuaState &state, const char *id ="");
|
||||||
|
CLuaObject(CLuaState &state, const std::string &id);
|
||||||
|
// Build this object from another object
|
||||||
|
CLuaObject(const CLuaObject &other);
|
||||||
|
// Copy refrence to another lua object
|
||||||
|
CLuaObject &operator=(const CLuaObject &other);
|
||||||
|
// Get id for that object
|
||||||
|
const std::string &getId() const { return _Id; }
|
||||||
|
// Set id for that object
|
||||||
|
void setId(const std::string &id) { _Id = id; }
|
||||||
|
// See if the obj
|
||||||
|
bool isValid() const;
|
||||||
|
// Pop a new value for this lua object from the top of the stack. The stack must not be empty
|
||||||
|
void pop(CLuaState &luaState, const char *id ="");
|
||||||
|
// Push the object that is being referenced on the stack
|
||||||
|
// An assertion is raised if 'pop' hasn't been called or
|
||||||
|
// if the lua state has been destroyed
|
||||||
|
void push() const;
|
||||||
|
// Get the lua state in which the object resides.
|
||||||
|
CLuaState *getLuaState() const;
|
||||||
|
// Release the object. 'pop' must be called to make the object valid again
|
||||||
|
void release();
|
||||||
|
// type queries
|
||||||
|
int type() const;
|
||||||
|
const char *getTypename() const;
|
||||||
|
bool isNil() const;
|
||||||
|
bool isNumber() const;
|
||||||
|
bool isBoolean() const;
|
||||||
|
bool isString() const;
|
||||||
|
bool isFunction() const;
|
||||||
|
bool isCFunction() const;
|
||||||
|
bool isTable() const;
|
||||||
|
bool isUserData() const;
|
||||||
|
bool isLightUserData() const;
|
||||||
|
bool isRGBA() const;
|
||||||
|
// equality
|
||||||
|
bool rawEqual(const CLuaObject &other) const;
|
||||||
|
// conversions (no throw) : the actual value of object is not modified!!
|
||||||
|
NLMISC::CRGBA toRGBA() const; // default to black if not a crgba
|
||||||
|
bool toBoolean() const;
|
||||||
|
lua_Number toNumber() const;
|
||||||
|
std::string toString() const;
|
||||||
|
lua_CFunction toCFunction() const;
|
||||||
|
void *toUserData() const;
|
||||||
|
const void *toPointer() const;
|
||||||
|
// implicit conversions (no throw)
|
||||||
|
operator bool() const;
|
||||||
|
operator float() const;
|
||||||
|
operator double() const;
|
||||||
|
operator std::string() const;
|
||||||
|
/** create a sub table for this object, with a string as a key
|
||||||
|
* This object must be a table or an exception if thrown
|
||||||
|
*/
|
||||||
|
CLuaObject newTable(const char *tableName) throw(ELuaNotATable);
|
||||||
|
|
||||||
|
|
||||||
|
/** Set a value in a table.
|
||||||
|
* If this object is not a table then an exception is thrown
|
||||||
|
* NB : value should came from the same lua environment
|
||||||
|
* \TODO other type of keys
|
||||||
|
*/
|
||||||
|
void setValue(const char *key, const CLuaObject &value) throw(ELuaNotATable);
|
||||||
|
void setValue(const std::string &key, const CLuaObject &value) throw(ELuaNotATable) { setValue(key.c_str(), value); }
|
||||||
|
void setValue(const char *key, const std::string &value) throw(ELuaNotATable);
|
||||||
|
void setValue(const char *key, const char *value) throw(ELuaNotATable);
|
||||||
|
void setValue(const char *key, bool value) throw(ELuaNotATable);
|
||||||
|
void setValue(const char *key, TLuaWrappedFunction value) throw(ELuaNotATable);
|
||||||
|
void setValue(const char *key, double value) throw(ELuaNotATable);
|
||||||
|
void setValue(const std::string &key, const std::string &value) throw(ELuaNotATable) { setValue(key.c_str(), value); }
|
||||||
|
void setNil(const char *key) throw(ELuaNotATable);
|
||||||
|
void setNil(const std::string &key) throw(ELuaNotATable) { setNil(key.c_str()); }
|
||||||
|
/** Erase a value in a table by its key.
|
||||||
|
* If this object is not a table then an exception is thrown.
|
||||||
|
* \TODO other type of keys
|
||||||
|
*/
|
||||||
|
void eraseValue(const char *key) throw(ELuaNotATable);
|
||||||
|
void eraseValue(const std::string &key) throw(ELuaNotATable) { eraseValue(key.c_str()); }
|
||||||
|
// test is this object is enumerable
|
||||||
|
bool isEnumerable() const;
|
||||||
|
// Enumeration of a table. If the object is not a table, an exception is thrown.
|
||||||
|
CLuaEnumeration enumerate() throw(ELuaNotATable);
|
||||||
|
// retrieve metatable of an object (or nil if object has no metatable)
|
||||||
|
CLuaObject getMetaTable() const;
|
||||||
|
// set metatable for this object
|
||||||
|
bool setMetaTable(CLuaObject &metatable);
|
||||||
|
/** Access to a sub element of a table (no throw).
|
||||||
|
* if the element is not a table, then 'nil' is returned
|
||||||
|
* TODO nico : add other key types if needed
|
||||||
|
* TODO nico : version that takes destination object as a reference in its parameter to avoid an object copy
|
||||||
|
*/
|
||||||
|
CLuaObject operator[](double key) const;
|
||||||
|
CLuaObject operator[](const char *key) const;
|
||||||
|
CLuaObject operator[](const std::string &key) const { return operator[](key.c_str()); }
|
||||||
|
/** Checked access to a sub element of a table. An exception is thrown is the element is not a table.
|
||||||
|
*/
|
||||||
|
CLuaObject at(const char *key) const throw (ELuaNotATable);
|
||||||
|
CLuaObject at(const std::string &key) const { return at(key.c_str()); }
|
||||||
|
|
||||||
|
// Test is that table has the given key. The object must be a table or an exception is thrown
|
||||||
|
bool hasKey(const char *key) const;
|
||||||
|
|
||||||
|
/** debug : recursively get value (useful for table)
|
||||||
|
* \param maxDepth (0 for no limit)
|
||||||
|
* \param alreadySeen pointer to lua tables that have already been displayed by the command (to avoid infinite recursion when a cycluic graph is encountered)
|
||||||
|
*/
|
||||||
|
std::string toStringRecurse(uint depth = 0, uint maxDepth = 20, std::set<const void *> *alreadySeen = NULL) const;
|
||||||
|
|
||||||
|
/** dump the value in the log (includes tables)
|
||||||
|
* \param alreadySeen pointer to lua tables that have already been displayed by the command (to avoid infinite recursion when a cycluic graph is encountered)
|
||||||
|
*/
|
||||||
|
void dump(uint maxDepth = 20, std::set<const void *> *alreadySeen = NULL) const;
|
||||||
|
// concatenate identifiers, adding a dot between them if necessary. If right is a number then brackets are added
|
||||||
|
static std::string concatId(const std::string &left, const std::string &right);
|
||||||
|
// If this object is a function, then call it and return true on success
|
||||||
|
bool callNoThrow(int numArgs, int numRet);
|
||||||
|
// Call a method of this table by name (no throw version)
|
||||||
|
bool callMethodByNameNoThrow(const char *name, int numArgs, int numRet);
|
||||||
|
private:
|
||||||
|
NLMISC::CRefPtr<CLuaState> _LuaState;
|
||||||
|
std::string _Id;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/** enumeration of the content of a lua table
|
||||||
|
*
|
||||||
|
* Example of use :
|
||||||
|
*
|
||||||
|
*\code
|
||||||
|
CLuaObject table;
|
||||||
|
table.pop(luaState); // retrieve table from the top of a lua stack
|
||||||
|
CLuaEnumeration enueration = table.enumerate();
|
||||||
|
while (enumeration.hasNext())
|
||||||
|
{
|
||||||
|
nlinfo('key = %s", enumeration.nextKey().toString().c_str());
|
||||||
|
nlinfo('value = %s", enumeration.nextValue().toString().c_str());
|
||||||
|
enumeration.next();
|
||||||
|
};
|
||||||
|
\endcode
|
||||||
|
*
|
||||||
|
* There is a macro called 'ENUM_LUA_TABLE' to automate that process.
|
||||||
|
* Previous code would then be written as follow :
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*\code
|
||||||
|
CLuaObject table;
|
||||||
|
table.pop(luaState); // retrieve table from the top of a lua stack
|
||||||
|
ENUM_LUA_TABLE(table, enumeration);
|
||||||
|
{
|
||||||
|
nlinfo('key = %s", enumeration.nextKey().toString().c_str());
|
||||||
|
nlinfo('value = %s", enumeration.nextValue().toString().c_str());
|
||||||
|
};
|
||||||
|
\endcode
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
class CLuaEnumeration
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
// is there a next key,value pair in the table
|
||||||
|
bool hasNext() { return _HasNext; }
|
||||||
|
// Return next key. Assertion if 'hasNext' is false
|
||||||
|
const CLuaObject &nextKey() const;
|
||||||
|
// Return next value. Assertion if 'hasNext' is false
|
||||||
|
CLuaObject &nextValue();
|
||||||
|
// Go to the next value. Assertion if there's no such value
|
||||||
|
void next();
|
||||||
|
private:
|
||||||
|
friend class CLuaObject;
|
||||||
|
// current value & key
|
||||||
|
CLuaObject _Table;
|
||||||
|
CLuaObject _Key;
|
||||||
|
CLuaObject _Value;
|
||||||
|
CLuaObject _NextFunction; // pointer to the global 'next' function
|
||||||
|
bool _HasNext;
|
||||||
|
// construction from a table on the stack
|
||||||
|
CLuaEnumeration(CLuaObject &table);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/** macro to ease lua table enumeration
|
||||||
|
* \param object A CLuaObject which must be a table, and on which enumeration is done. An exception will be thrown as 'CLuaObject::enumerate' is
|
||||||
|
* called if this is not the case
|
||||||
|
* \param enumerator The enumerator object
|
||||||
|
*/
|
||||||
|
#define ENUM_LUA_TABLE(object, enumerator) for(CLuaEnumeration enumerator = (object).enumerate(); enumerator.hasNext(); enumerator.next())
|
||||||
|
|
||||||
|
|
||||||
|
//opitmized lua string for fast comparison
|
||||||
|
class CLuaString
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
explicit CLuaString(const char *value = "")
|
||||||
|
{
|
||||||
|
nlassert( value != NULL );
|
||||||
|
_Str = value;
|
||||||
|
}
|
||||||
|
const std::string& getStr() const{ return _Str; }
|
||||||
|
private:
|
||||||
|
std::string _Str;
|
||||||
|
mutable CLuaState::TRefPtr _LuaState; // ref ptr so that statics get rebuilt on lua restart
|
||||||
|
mutable CLuaObject _InLua;
|
||||||
|
};
|
||||||
|
|
||||||
|
inline bool operator==(const char* lh, const CLuaString& rh)
|
||||||
|
{
|
||||||
|
return std::string(lh) == rh.getStr();
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool operator==( const CLuaString& lh, const CLuaString& rh)
|
||||||
|
{
|
||||||
|
return lh.getStr() == rh.getStr();
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool operator==(const CLuaString& lh, const char* rh)
|
||||||
|
{
|
||||||
|
return std::string(rh) == lh.getStr();
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool operator==( const CLuaString& lh, const std::string& rh)
|
||||||
|
{
|
||||||
|
return lh.getStr() == rh;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool operator==(const std::string& lh, const CLuaString& rh)
|
||||||
|
{
|
||||||
|
return lh == rh.getStr();
|
||||||
|
}
|
||||||
|
|
||||||
|
class CLuaHashMapTraits
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
static const size_t bucket_size = 4;
|
||||||
|
static const size_t min_buckets = 8;
|
||||||
|
CLuaHashMapTraits()
|
||||||
|
{}
|
||||||
|
|
||||||
|
// hasher for lua string -> they are unique pointers for each string, so just hash a pointer instead of a string...
|
||||||
|
size_t operator()(const char *value) const { return ((size_t) value) >> 3; }
|
||||||
|
|
||||||
|
// equality for lua string for hash_map -> they are unique pointer -> compare pointers instead of string content
|
||||||
|
bool operator()(const char *lhs, const char *rhs) const { return lhs < rhs; }
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1,93 @@
|
|||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef PARSER_H
|
||||||
|
#define PARSER_H
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
#include "nel/misc/types_nl.h"
|
||||||
|
#include "nel/gui/proc.h"
|
||||||
|
#include "nel/gui/link_data.h"
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
class CInterfaceElement;
|
||||||
|
class CInterfaceGroup;
|
||||||
|
class CInterfaceAnim;
|
||||||
|
class CCtrlSheetSelection;
|
||||||
|
class CInterfaceLink;
|
||||||
|
|
||||||
|
/// Interface for the GUI XML parser class.
|
||||||
|
class IParser
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
IParser();
|
||||||
|
virtual ~IParser();
|
||||||
|
|
||||||
|
static IParser* createParser();
|
||||||
|
|
||||||
|
virtual void addParentPositionAssociation( CInterfaceElement *element, const std::string &parentID ) = 0;
|
||||||
|
virtual void addParentSizeAssociation( CInterfaceElement *element, const std::string &parentID ) = 0;
|
||||||
|
virtual void addParentSizeMaxAssociation( CInterfaceElement *element, const std::string &parentID ) = 0;
|
||||||
|
virtual void addLuaClassAssociation( CInterfaceGroup *group, const std::string &luaScript ) = 0;
|
||||||
|
virtual std::string getParentPosAssociation( CInterfaceElement *element ) const = 0;
|
||||||
|
virtual std::string getParentSizeAssociation( CInterfaceElement *element ) const = 0;
|
||||||
|
virtual std::string getParentSizeMaxAssociation( CInterfaceElement *element ) const = 0;
|
||||||
|
virtual std::string getLuaClassAssociation( CInterfaceGroup *group ) const = 0;
|
||||||
|
virtual CInterfaceGroup* createGroupInstance( const std::string &templateName, const std::string &parentID, const std::pair< std::string, std::string > *templateParams, uint numParams, bool updateLinks = true ) = 0;
|
||||||
|
virtual CInterfaceGroup* createGroupInstance( const std::string &templateName, const std::string &parentID, std::vector< std::pair< std::string, std::string > > &templateParams, bool updateLinks = true ) = 0;
|
||||||
|
virtual bool parseGroupChildren( xmlNodePtr cur, CInterfaceGroup * parentGroup, bool reload ) = 0;
|
||||||
|
virtual uint getProcedureNumActions( const std::string &procName ) const = 0;
|
||||||
|
virtual bool getProcedureAction( const std::string &procName, uint actionIndex, std::string &ah, std::string ¶ms ) const = 0;
|
||||||
|
virtual const std::string& getDefine(const std::string &id) const = 0;
|
||||||
|
virtual CInterfaceAnim* getAnim( const std::string &name ) const = 0;
|
||||||
|
virtual CProcedure* getProc( const std::string &name ) = 0;
|
||||||
|
virtual const TProcedureMap& getProcMap() const = 0;
|
||||||
|
virtual bool parseInterface( const std::vector< std::string > &xmlFileNames, bool reload, bool isFilename = true, bool checkInData = false ) = 0;
|
||||||
|
virtual void initLUA() = 0;
|
||||||
|
virtual void uninitLUA() = 0;
|
||||||
|
virtual bool isLuaInitialized() const = 0;
|
||||||
|
virtual bool loadLUA( const std::string &luaFile, std::string &error ) = 0;
|
||||||
|
virtual void reloadAllLuaFileScripts() = 0;
|
||||||
|
virtual void removeAllTemplates() = 0;
|
||||||
|
virtual bool solveDefine( const std::string &propVal, std::string &newPropVal, std::string &defError ) = 0;
|
||||||
|
virtual CInterfaceElement* createUIElement( const std::string &templateName, const std::string &parentID, const std::pair< std::string,std::string> *templateParams, uint numParams, bool updateLinks ) = 0;
|
||||||
|
virtual CInterfaceElement* createUIElement( const std::string &templateName, const std::string &parentID, std::vector< std::pair< std::string, std::string > > &templateParams, bool updateLinks = true ) = 0;
|
||||||
|
virtual bool isDefineExist( const std::string &id ) const = 0;
|
||||||
|
virtual CCtrlSheetSelection &getCtrlSheetSelection() = 0;
|
||||||
|
virtual bool addLink( CInterfaceLink *link, const std::string &id ) = 0;
|
||||||
|
virtual bool removeLink( const std::string &id ) = 0;
|
||||||
|
virtual void removeAll() = 0;
|
||||||
|
virtual bool hasProc( const std::string &name ) const = 0;
|
||||||
|
virtual bool addProc( const std::string &name ) = 0;
|
||||||
|
virtual bool removeProc( const std::string &name ) = 0;
|
||||||
|
virtual void setEditorMode( bool b ) = 0;
|
||||||
|
virtual const std::map< uint32, SLinkData >& getLinkMap() const = 0;
|
||||||
|
virtual uint32 addLinkData( SLinkData &linkData ) = 0;
|
||||||
|
virtual void removeLinkData( uint32 id ) = 0;
|
||||||
|
virtual bool getLinkData( uint32 id, SLinkData &linkData ) = 0;
|
||||||
|
virtual void updateLinkData( uint32 id, const SLinkData &linkData ) = 0;
|
||||||
|
virtual bool serializeVariables( xmlNodePtr parentNode ) const = 0;
|
||||||
|
virtual bool serializeProcs( xmlNodePtr parentNode ) const = 0;
|
||||||
|
virtual bool serializePointerSettings( xmlNodePtr parentNode ) const = 0;
|
||||||
|
virtual bool serializeKeySettings( xmlNodePtr parentNode ) const = 0;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,150 @@
|
|||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef PROC_H
|
||||||
|
#define PROC_H
|
||||||
|
|
||||||
|
#include "nel/misc/types_nl.h"
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
#include <map>
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
class CParamBlock
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
// -1 if not a param id, but a string
|
||||||
|
sint32 NumParam;
|
||||||
|
std::string String;
|
||||||
|
|
||||||
|
CParamBlock()
|
||||||
|
{
|
||||||
|
NumParam = -1;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class CProcAction
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
// a condition to launch this action handler (is an expression)
|
||||||
|
std::vector< CParamBlock > CondBlocks;
|
||||||
|
|
||||||
|
// the action handler (may be proc!!)
|
||||||
|
std::string Action;
|
||||||
|
std::string Parameters;
|
||||||
|
std::string Conditions;
|
||||||
|
|
||||||
|
// A list of string/or param number => to build the final params at execution
|
||||||
|
std::vector< CParamBlock > ParamBlocks;
|
||||||
|
|
||||||
|
// build a paramBlock from a string
|
||||||
|
void buildParamBlock( const std::string ¶ms );
|
||||||
|
// from ParamBlock, and a paramList (skip the 0th), build params.
|
||||||
|
void buildParams( const std::vector< std::string > ¶mList, std::string ¶ms ) const;
|
||||||
|
|
||||||
|
void buildCondBlock( const std::string ¶ms );
|
||||||
|
|
||||||
|
void buildCond( const std::vector< std::string > ¶mList, std::string &cond ) const;
|
||||||
|
|
||||||
|
static void buildBlocks( const std::string &in, std::vector< CParamBlock > &out );
|
||||||
|
|
||||||
|
static void eval( const std::vector< std::string > &inArgs, const std::vector< CParamBlock > &inBlocks, std::string &out );
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class CActionNameIs
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CActionNameIs( const std::string &n )
|
||||||
|
{
|
||||||
|
name = n;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool operator()( const CProcAction &action )
|
||||||
|
{
|
||||||
|
if( action.Action == name )
|
||||||
|
return true;
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::string name;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class CProcedure
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
// List of the actions
|
||||||
|
std::vector< CProcAction > Actions;
|
||||||
|
|
||||||
|
bool hasAction( const std::string &name ) const
|
||||||
|
{
|
||||||
|
std::vector< CProcAction >::const_iterator itr
|
||||||
|
= std::find_if( Actions.begin(), Actions.end(), CActionNameIs( name ) );
|
||||||
|
if( itr != Actions.end() )
|
||||||
|
return true;
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool swap( uint32 i1, uint32 i2 )
|
||||||
|
{
|
||||||
|
if( i1 == i2 )
|
||||||
|
return false;
|
||||||
|
if( i1 >= Actions.size() )
|
||||||
|
return false;
|
||||||
|
if( i2 >= Actions.size() )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
CProcAction a = Actions[ i1 ];
|
||||||
|
Actions[ i1 ] = Actions[ i2 ];
|
||||||
|
Actions[ i2 ] = a;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool addAction( const std::string &name )
|
||||||
|
{
|
||||||
|
Actions.push_back( CProcAction() );
|
||||||
|
Actions.back().Action = name;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool removeAction( uint32 i )
|
||||||
|
{
|
||||||
|
if( i >= Actions.size() )
|
||||||
|
return false;
|
||||||
|
std::vector< CProcAction >::iterator itr = Actions.begin() + i;
|
||||||
|
Actions.erase( itr );
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef std::map< std::string, CProcedure > TProcedureMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,368 @@
|
|||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
#ifndef CL_REFLECT_H
|
||||||
|
#define CL_REFLECT_H
|
||||||
|
|
||||||
|
#include "nel/misc/rgba.h"
|
||||||
|
#include "nel/gui/lua_object.h"
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
class CReflectable;
|
||||||
|
class CLuaState;
|
||||||
|
struct CClassInfo;
|
||||||
|
|
||||||
|
/** A property of a reflectable object
|
||||||
|
* NB: multiple inheritance not supported
|
||||||
|
*/
|
||||||
|
class CReflectedProperty
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
enum TType { Boolean = 0,
|
||||||
|
SInt32,
|
||||||
|
UInt32,
|
||||||
|
Float,
|
||||||
|
String,
|
||||||
|
UCString,
|
||||||
|
RGBA,
|
||||||
|
LuaMethod
|
||||||
|
}; // other types will be added when needed
|
||||||
|
// define some pointer-to-member types
|
||||||
|
typedef bool (CReflectable::* TGetBool) () const;
|
||||||
|
typedef sint32 (CReflectable::* TGetSInt32) () const;
|
||||||
|
typedef uint32 (CReflectable::* TGetUInt32) () const;
|
||||||
|
typedef float (CReflectable::* TGetFloat) () const;
|
||||||
|
typedef std::string (CReflectable::* TGetString) () const;
|
||||||
|
typedef ucstring (CReflectable::* TGetUCString) () const;
|
||||||
|
typedef NLMISC::CRGBA (CReflectable::* TGetRGBA) () const;
|
||||||
|
//
|
||||||
|
typedef void (CReflectable::* TSetBool) (bool);
|
||||||
|
typedef void (CReflectable::* TSetSInt32) (sint32);
|
||||||
|
typedef void (CReflectable::* TSetUInt32) (uint32);
|
||||||
|
typedef void (CReflectable::* TSetFloat) (float);
|
||||||
|
typedef void (CReflectable::* TSetString) (const std::string &);
|
||||||
|
typedef void (CReflectable::* TSetUCString) (const ucstring &);
|
||||||
|
typedef void (CReflectable::* TSetRGBA) (NLMISC::CRGBA col);
|
||||||
|
//
|
||||||
|
typedef int (CReflectable:: *TLuaMethod) (CLuaState &luaState);
|
||||||
|
|
||||||
|
public:
|
||||||
|
TType Type;
|
||||||
|
// In each union we have method pointers to retrieve / set the data of the desired type (as told in 'Type')
|
||||||
|
union
|
||||||
|
{
|
||||||
|
TGetBool GetBool;
|
||||||
|
TGetSInt32 GetSInt32;
|
||||||
|
TGetUInt32 GetUInt32;
|
||||||
|
TGetFloat GetFloat;
|
||||||
|
TGetString GetString;
|
||||||
|
TGetUCString GetUCString;
|
||||||
|
TGetRGBA GetRGBA;
|
||||||
|
TLuaMethod GetLuaMethod; // lua method can only be obtained, not written ...
|
||||||
|
} GetMethod;
|
||||||
|
union
|
||||||
|
{
|
||||||
|
TSetBool SetBool;
|
||||||
|
TSetSInt32 SetSInt32;
|
||||||
|
TSetUInt32 SetUInt32;
|
||||||
|
TSetFloat SetFloat;
|
||||||
|
TSetString SetString;
|
||||||
|
TSetUCString SetUCString;
|
||||||
|
TSetRGBA SetRGBA;
|
||||||
|
} SetMethod;
|
||||||
|
// name of the property
|
||||||
|
std::string Name;
|
||||||
|
mutable CLuaObject LuaMethodRef; // cache pointer to function call if type == LuaMethod
|
||||||
|
const CClassInfo *ParentClass; // filled when 'registerClass' is called
|
||||||
|
};
|
||||||
|
|
||||||
|
// a vector of reflected properties
|
||||||
|
typedef std::vector<CReflectedProperty> TReflectedProperties;
|
||||||
|
|
||||||
|
|
||||||
|
struct CClassInfo;
|
||||||
|
|
||||||
|
/** Base class for a reflectable object
|
||||||
|
* NB: multiple inheritance not supported
|
||||||
|
*/
|
||||||
|
class CReflectable
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual ~CReflectable() {}
|
||||||
|
virtual const char *getReflectedClassName() const { return "CReflectable"; }
|
||||||
|
virtual const char *getRflectedParentClassName() const { return ""; }
|
||||||
|
|
||||||
|
/** When registering classes, the reflect system will call this function on each class
|
||||||
|
* to know which properties they exports.
|
||||||
|
* To defines which properties are exported use the REFLECT_EXPORT_** macros.
|
||||||
|
* By doing so, a new 'getReflectedProperties' function will be defined
|
||||||
|
*/
|
||||||
|
static void getReflectedProperties(TReflectedProperties &/* props */)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
// get class infos for this reflectable object
|
||||||
|
const CClassInfo *getClassInfo();
|
||||||
|
|
||||||
|
/** get a property from this object by name
|
||||||
|
* TODO nico : optimized version for lua string (found in CLuaIHM) would maybe fit better here ...
|
||||||
|
*/
|
||||||
|
const CReflectedProperty *getReflectedProperty(const std::string &propertyName, bool dspWarning= true) const;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct CLuaIndexedProperty
|
||||||
|
{
|
||||||
|
const CReflectedProperty *Prop;
|
||||||
|
CLuaString Id; // must keep id here, so that we are sure the string is not gc in lua and its pointer remains valid
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
struct CClassInfo
|
||||||
|
{
|
||||||
|
TReflectedProperties Properties; // the properties exported by this class
|
||||||
|
const CClassInfo *ParentClass; // pointer to infos of the parent class, or NULL if it is a root class
|
||||||
|
std::string ClassName;
|
||||||
|
/** For lua speedup (used by CLuaIHM) : because lua string are unique, we can use them to access property directly.
|
||||||
|
*/
|
||||||
|
typedef CHashMap<const char *, CLuaIndexedProperty, CLuaHashMapTraits> TLuaStrToPropMap;
|
||||||
|
mutable TLuaStrToPropMap LuaStrToProp;
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Simple reflection system.
|
||||||
|
* Used by the GUI and some other objects.
|
||||||
|
* It is used to export some properties so that we can easily manipulate them in the GUI scripts (either lua or with CInterfaceExpr).
|
||||||
|
* NB: multiple inheritance not supported
|
||||||
|
*
|
||||||
|
* Example of use : a class exporting a boolean
|
||||||
|
*
|
||||||
|
* class CTestClass : public CReflectable
|
||||||
|
* {
|
||||||
|
* public:
|
||||||
|
* void setValue(bool value) { _Value = value; }
|
||||||
|
* bool getValue() const { return _Value; }
|
||||||
|
* \\ export the bool value
|
||||||
|
* REFLECT_EXPORT_START(CTestClass, CReflectable)
|
||||||
|
* REFLECT_BOOL("myValue", setValue, getValue)
|
||||||
|
* REFLECT_EXPORT_END
|
||||||
|
* private:
|
||||||
|
* bool _Value;
|
||||||
|
* };
|
||||||
|
*
|
||||||
|
* The class must then be registered with :
|
||||||
|
*
|
||||||
|
* REGISTER_REFLECTABLE_CLASS(CTestClass, CReflectable)
|
||||||
|
*
|
||||||
|
* NB: It should be registered after its parents
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* \author Nicolas Vizerie
|
||||||
|
* \author Nevrax France
|
||||||
|
* \date 2002
|
||||||
|
*/
|
||||||
|
class CReflectSystem
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
typedef std::map<std::string, CClassInfo> TClassMap;
|
||||||
|
|
||||||
|
public:
|
||||||
|
// release memory
|
||||||
|
static void release();
|
||||||
|
|
||||||
|
/** register a class and its properties
|
||||||
|
* NB : class should be registered after their parent have been, or an assertion will be raised
|
||||||
|
*/
|
||||||
|
static void registerClass(const std::string &className, const std::string &parentName, const TReflectedProperties properties);
|
||||||
|
|
||||||
|
// retrieve a property of a reflectable class, or NULL if unknown
|
||||||
|
static const CReflectedProperty *getProperty(const std::string &className, const std::string &propertyName, bool dspWarning= true);
|
||||||
|
|
||||||
|
// get the list of class for debug or read purpose (NULL if no register has been called)
|
||||||
|
static const TClassMap *getClassMap() {return _ClassMap;}
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
private:
|
||||||
|
static TClassMap *_ClassMap; // each class and its infos
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/** Helper macros to export properties of a reflectable class
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** Start a declaration of a reflectable class exports
|
||||||
|
* Should be placed inside the class
|
||||||
|
*/
|
||||||
|
#define REFLECT_EXPORT_START(className, parentName) \
|
||||||
|
virtual const char *getReflectedClassName() const { return #className; } \
|
||||||
|
virtual const char *getReflectedParentClassName() const { return #parentName; } \
|
||||||
|
static void getReflectedProperties(TReflectedProperties &props) \
|
||||||
|
{ \
|
||||||
|
typedef className A; \
|
||||||
|
typedef bool (className::* TGetBoola) () const; \
|
||||||
|
typedef sint32 (className::* TGetSInt32a) () const; \
|
||||||
|
typedef uint32 (className::* TGetUInt32a) () const; \
|
||||||
|
typedef float (className::* TGetFloata) () const; \
|
||||||
|
typedef std::string (className::* TGetStringa) () const; \
|
||||||
|
typedef ucstring (className::* TGetUCStringa) () const; \
|
||||||
|
typedef NLMISC::CRGBA (className::* TGetRGBAa) () const; \
|
||||||
|
typedef void (className::* TSetBoola) (bool); \
|
||||||
|
typedef void (className::* TSetSInt32a) (sint32); \
|
||||||
|
typedef void (className::* TSetUInt32a) (uint32); \
|
||||||
|
typedef void (className::* TSetFloata) (float); \
|
||||||
|
typedef void (className::* TSetStringa) (const std::string &); \
|
||||||
|
typedef void (className::* TSetUCStringa) (const ucstring &); \
|
||||||
|
typedef void (className::* TSetRGBAa) (NLMISC::CRGBA col); \
|
||||||
|
typedef int (className:: *TLuaMethoda) (CLuaState &luaState); \
|
||||||
|
nlunreferenced(props);
|
||||||
|
|
||||||
|
|
||||||
|
// export a boolean value, by giving the name of the get and the set method
|
||||||
|
#define REFLECT_BOOL(exportName, getMethod, setMethod) \
|
||||||
|
{ \
|
||||||
|
CReflectedProperty prop; \
|
||||||
|
prop.Name = exportName; \
|
||||||
|
prop.Type = CReflectedProperty::Boolean; \
|
||||||
|
prop.GetMethod.GetBool = (CReflectedProperty::TGetBool) (TGetBoola) &A::getMethod; \
|
||||||
|
prop.SetMethod.SetBool = (CReflectedProperty::TSetBool) (TSetBoola) &A::setMethod; \
|
||||||
|
props.push_back(prop); \
|
||||||
|
}
|
||||||
|
|
||||||
|
// export a sint32 value, by giving the name of the get and the set method
|
||||||
|
#define REFLECT_SINT32(exportName, getMethod, setMethod) \
|
||||||
|
{ \
|
||||||
|
CReflectedProperty prop; \
|
||||||
|
prop.Name = exportName; \
|
||||||
|
prop.Type = CReflectedProperty::SInt32; \
|
||||||
|
prop.GetMethod.GetSInt32 = (CReflectedProperty::TGetSInt32) (TGetSInt32a) &A::getMethod; \
|
||||||
|
prop.SetMethod.SetSInt32 = (CReflectedProperty::TSetSInt32) (TSetSInt32a) &A::setMethod; \
|
||||||
|
props.push_back(prop); \
|
||||||
|
}
|
||||||
|
|
||||||
|
// export a sint32 value, by giving the name of the get and the set method
|
||||||
|
#define REFLECT_UINT32(exportName, getMethod, setMethod) \
|
||||||
|
{ \
|
||||||
|
CReflectedProperty prop; \
|
||||||
|
prop.Name = exportName; \
|
||||||
|
prop.Type = CReflectedProperty::UInt32; \
|
||||||
|
prop.GetMethod.GetUInt32 = (CReflectedProperty::TGetUInt32) (TGetUInt32a) &A::getMethod; \
|
||||||
|
prop.SetMethod.SetUInt32 = (CReflectedProperty::TSetUInt32) (TSetUInt32a) &A::setMethod; \
|
||||||
|
props.push_back(prop); \
|
||||||
|
}
|
||||||
|
|
||||||
|
// export a float value, by giving the name of the get and the set method
|
||||||
|
#define REFLECT_FLOAT(exportName, getMethod, setMethod) \
|
||||||
|
{ \
|
||||||
|
CReflectedProperty prop; \
|
||||||
|
prop.Name = exportName; \
|
||||||
|
prop.Type = CReflectedProperty::Float; \
|
||||||
|
prop.GetMethod.GetFloat = (CReflectedProperty::TGetFloat) (TGetFloata) &A::getMethod; \
|
||||||
|
prop.SetMethod.SetFloat = (CReflectedProperty::TSetFloat) (TSetFloata) &A::setMethod; \
|
||||||
|
props.push_back(prop); \
|
||||||
|
}
|
||||||
|
|
||||||
|
// export a string value, by giving the name of the get and the set method
|
||||||
|
#define REFLECT_STRING(exportName, getMethod, setMethod) \
|
||||||
|
{ \
|
||||||
|
CReflectedProperty prop; \
|
||||||
|
prop.Name = exportName; \
|
||||||
|
prop.Type = CReflectedProperty::String; \
|
||||||
|
prop.GetMethod.GetString = (CReflectedProperty::TGetString) (TGetStringa) &A::getMethod; \
|
||||||
|
prop.SetMethod.SetString = (CReflectedProperty::TSetString) (TSetStringa) &A::setMethod; \
|
||||||
|
props.push_back(prop); \
|
||||||
|
}
|
||||||
|
|
||||||
|
// export a unicode string value, by giving the name of the get and the set method
|
||||||
|
#define REFLECT_UCSTRING(exportName, getMethod, setMethod) \
|
||||||
|
{ \
|
||||||
|
CReflectedProperty prop; \
|
||||||
|
prop.Name = exportName; \
|
||||||
|
prop.Type = CReflectedProperty::UCString; \
|
||||||
|
prop.GetMethod.GetUCString = (CReflectedProperty::TGetUCString) (TGetUCStringa) &A::getMethod; \
|
||||||
|
prop.SetMethod.SetUCString = (CReflectedProperty::TSetUCString) (TSetUCStringa) &A::setMethod; \
|
||||||
|
props.push_back(prop); \
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// export a color value, by giving the name of the get and the set method
|
||||||
|
#define REFLECT_RGBA(exportName, getMethod, setMethod) \
|
||||||
|
{ \
|
||||||
|
CReflectedProperty prop; \
|
||||||
|
prop.Name = exportName; \
|
||||||
|
prop.Type = CReflectedProperty::RGBA; \
|
||||||
|
prop.GetMethod.GetRGBA = (CReflectedProperty::TGetRGBA) (TGetRGBAa) &A::getMethod; \
|
||||||
|
prop.SetMethod.SetRGBA = (CReflectedProperty::TSetRGBA) (TSetRGBAa) &A::setMethod; \
|
||||||
|
props.push_back(prop); \
|
||||||
|
}
|
||||||
|
|
||||||
|
// export a lua method
|
||||||
|
#define REFLECT_LUA_METHOD(exportName, method) \
|
||||||
|
{ \
|
||||||
|
CReflectedProperty prop; \
|
||||||
|
prop.Name = exportName; \
|
||||||
|
prop.Type = CReflectedProperty::LuaMethod; \
|
||||||
|
prop.GetMethod.GetLuaMethod = (CReflectedProperty::TLuaMethod) (TLuaMethoda) &A::method; \
|
||||||
|
props.push_back(prop); \
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ends an export declaration
|
||||||
|
#define REFLECT_EXPORT_END }
|
||||||
|
|
||||||
|
|
||||||
|
// This macro registers a reflectable class to the manager
|
||||||
|
#define REGISTER_REFLECTABLE_CLASS(className, parentName) \
|
||||||
|
{ \
|
||||||
|
TReflectedProperties props; \
|
||||||
|
className::getReflectedProperties(props); \
|
||||||
|
CReflectSystem::registerClass(#className, #parentName, props); \
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/** Reflectable refcounted object
|
||||||
|
* NB nico : added this intermediate class so that the binding from lua to the reflection
|
||||||
|
* system that are found in CLuaIHM can be reused for other objects as well
|
||||||
|
* NOTE: The class is named 'CReflectableRefPtrTarget' and not 'CReflectableRefCount'
|
||||||
|
* because the refcount part is only used for ref pointing in the ui
|
||||||
|
*/
|
||||||
|
class CReflectableRefPtrTarget : public CReflectable, public NLMISC::CRefCount
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual ~CReflectableRefPtrTarget();
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class CReflectableLuaRef
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CReflectableLuaRef(CReflectableRefPtrTarget *ptr = NULL) : Ptr(ptr), _ClassInfo(NULL) {}
|
||||||
|
NLMISC::CRefPtr<CReflectableRefPtrTarget> Ptr;
|
||||||
|
const CClassInfo &getClassInfo() const;
|
||||||
|
// IMPORTANT : luaStringPtr should have been obtained from lua, see remark in CClassInfo
|
||||||
|
const CReflectedProperty *getProp(const char *luaStringPtr) const;
|
||||||
|
private:
|
||||||
|
// cache to class definition of the pointee object (once a CReflectableLuaRef created in lua, it remains a *const* pointer)
|
||||||
|
mutable const CClassInfo *_ClassInfo;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,32 @@
|
|||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef REFLECT_REG_H
|
||||||
|
#define REFLECT_REG_H
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
/// Helper class to register reflectable classes
|
||||||
|
class CReflectableRegister
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
static void registerClasses();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1,29 @@
|
|||||||
|
#ifndef STRING_CASE_H
|
||||||
|
#define STRING_CASE_H
|
||||||
|
|
||||||
|
#include "nel/misc/types_nl.h"
|
||||||
|
#include "nel/misc/ucstring.h"
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
|
||||||
|
enum TCaseMode
|
||||||
|
{
|
||||||
|
CaseNormal = 0, // Nothing done
|
||||||
|
CaseLower, // All letters in lowercase
|
||||||
|
CaseUpper, // All letters in uppercase
|
||||||
|
CaseFirstStringLetterUp, // The first letter of the string is uppercase, the others are lowercase
|
||||||
|
CaseFirstSentenceLetterUp, // The first letter of the string and each sentences are uppercase, the others are lowercase. Sentences are seprated with '.'.
|
||||||
|
CaseFirstWordLetterUp, // The first letter of each word is uppercase, the others are lowercase
|
||||||
|
CaseCount
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
void setCase( ucstring &str, TCaseMode mode );
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
@ -0,0 +1,86 @@
|
|||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef RZ_VIEW_BASE_H
|
||||||
|
#define RZ_VIEW_BASE_H
|
||||||
|
|
||||||
|
#include "nel/misc/types_nl.h"
|
||||||
|
#include "nel/misc/factory.h"
|
||||||
|
#include "nel/gui/interface_element.h"
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
|
||||||
|
class CViewBase : public CInterfaceElement
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
// for factory construction
|
||||||
|
struct TCtorParam
|
||||||
|
{};
|
||||||
|
|
||||||
|
/// Constructor
|
||||||
|
CViewBase(const TCtorParam &/* param */) : CInterfaceElement()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Destructor
|
||||||
|
virtual ~CViewBase();
|
||||||
|
|
||||||
|
// Returns 'true' if that element can be downcasted to a view
|
||||||
|
virtual bool isView() const { return true; }
|
||||||
|
|
||||||
|
/// Draw the view from XReal, YReal, WReal, HReal (implemented by derived classes)
|
||||||
|
/// this coordinates are relative to the screen bottom left and begins the bottom left of the view
|
||||||
|
virtual void draw () = 0;
|
||||||
|
|
||||||
|
virtual void updateCoords() { CInterfaceElement::updateCoords(); }
|
||||||
|
|
||||||
|
/// Debug
|
||||||
|
virtual uint32 getMemory() { return (uint32)(sizeof(*this)+_Id.size()); }
|
||||||
|
|
||||||
|
/// Reflection
|
||||||
|
virtual sint32 getAlpha() const { return -1; } // Not obliged to implement this
|
||||||
|
virtual void setAlpha (sint32 /* a */) {} // Not obliged to implement this
|
||||||
|
|
||||||
|
|
||||||
|
void copyOptionFrom(const CViewBase &other)
|
||||||
|
{
|
||||||
|
CInterfaceElement::copyOptionFrom(other);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
REFLECT_EXPORT_START(CViewBase, CInterfaceElement)
|
||||||
|
REFLECT_SINT32 ("alpha", getAlpha, setAlpha);
|
||||||
|
REFLECT_EXPORT_END
|
||||||
|
|
||||||
|
virtual void dumpSize(uint depth = 0) const;
|
||||||
|
|
||||||
|
// from CInterfaceElement
|
||||||
|
virtual void visit(CInterfaceElementVisitor *visitor);
|
||||||
|
|
||||||
|
// special for mouse over : return true and fill the name of the cursor to display
|
||||||
|
virtual bool getMouseOverShape(std::string &/* texName */, uint8 &/* rot */, NLMISC::CRGBA &/* col */) { return false; }
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // RZ_VIEW_BASE_H
|
||||||
|
|
||||||
|
/* End of view_base.h */
|
@ -0,0 +1,150 @@
|
|||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef NL_VIEW_BITMAP_H
|
||||||
|
#define NL_VIEW_BITMAP_H
|
||||||
|
|
||||||
|
#include "nel/gui/view_base.h"
|
||||||
|
#include "nel/3d/u_texture.h"
|
||||||
|
#include "nel/gui/view_renderer.h"
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* class implementing a bitmap view
|
||||||
|
* \author Matthieu 'TrapII' Besson
|
||||||
|
* \author Nevrax France
|
||||||
|
* \date 2002
|
||||||
|
*/
|
||||||
|
class CViewBitmap : public CViewBase
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
DECLARE_UI_CLASS(CViewBitmap)
|
||||||
|
enum EType { Stretched = 0, Tiled, TypeCount };
|
||||||
|
public:
|
||||||
|
|
||||||
|
/// Constructor
|
||||||
|
CViewBitmap(const TCtorParam ¶m) : CViewBase(param)
|
||||||
|
{
|
||||||
|
_Color = NLMISC::CRGBA(255,255,255,255);
|
||||||
|
_Scale = false;
|
||||||
|
_Rot = 0;
|
||||||
|
_Flip = false;
|
||||||
|
_Tile = false;
|
||||||
|
_Align = 0;
|
||||||
|
_Type = Stretched;
|
||||||
|
_InheritGCAlpha = false;
|
||||||
|
|
||||||
|
// Default parameters for createTexture
|
||||||
|
_TxtOffsetX = 0;
|
||||||
|
_TxtOffsetY = 0;
|
||||||
|
_TxtWidth = -1;
|
||||||
|
_TxtHeight = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string getProperty( const std::string &name ) const;
|
||||||
|
void setProperty( const std::string &name, const std::string &value );
|
||||||
|
xmlNodePtr serialize( xmlNodePtr parentNode, const char *type ) const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* parse an xml node and initialize the base view mambers. Must call CViewBase::parse
|
||||||
|
* \param cur : pointer to the xml node to be parsed
|
||||||
|
* \param parentGroup : the parent group of the view
|
||||||
|
* \partam id : a refence to the string that will receive the view ID
|
||||||
|
* \return true if success
|
||||||
|
*/
|
||||||
|
bool parse(xmlNodePtr cur,CInterfaceGroup * parentGroup);
|
||||||
|
virtual uint32 getMemory() { return (uint32)(sizeof(*this)+_Id.size()); }
|
||||||
|
|
||||||
|
virtual void updateCoords ();
|
||||||
|
|
||||||
|
/// Draw the view
|
||||||
|
virtual void draw ();
|
||||||
|
|
||||||
|
bool getScale() const { return _Scale; }
|
||||||
|
void setScale (bool s) { _Scale = s; }
|
||||||
|
bool getTile() const { return _Tile; }
|
||||||
|
void setTile (bool s) { _Tile = s; }
|
||||||
|
void setColor (const NLMISC::CRGBA &r) { _Color = r; }
|
||||||
|
|
||||||
|
// Reflected
|
||||||
|
|
||||||
|
virtual void setTexture(const std::string & TxName);
|
||||||
|
virtual std::string getTexture () const;
|
||||||
|
|
||||||
|
/** Force the bitmap to match current texture size
|
||||||
|
* The 'scale' flag isnot modified
|
||||||
|
*/
|
||||||
|
void fitTexture();
|
||||||
|
|
||||||
|
bool isTextureValid() const { return _TextureId != -1; }
|
||||||
|
|
||||||
|
void setColorAsString(const std::string & col);
|
||||||
|
std::string getColorAsString() const;
|
||||||
|
|
||||||
|
void setColorAsInt(sint32 col);
|
||||||
|
sint32 getColorAsInt() const;
|
||||||
|
|
||||||
|
void setColorRGBA(NLMISC::CRGBA col);
|
||||||
|
NLMISC::CRGBA getColorRGBA() const;
|
||||||
|
|
||||||
|
virtual sint32 getAlpha() const { return _Color.A; }
|
||||||
|
virtual void setAlpha (sint32 a) { _Color.A = (uint8)a; }
|
||||||
|
|
||||||
|
REFLECT_EXPORT_START(CViewBitmap, CViewBase)
|
||||||
|
REFLECT_STRING ("color", getColorAsString, setColorAsString);
|
||||||
|
REFLECT_SINT32 ("color_as_int", getColorAsInt, setColorAsInt);
|
||||||
|
REFLECT_RGBA ("color_rgba", getColorRGBA, setColorRGBA);
|
||||||
|
REFLECT_SINT32 ("alpha", getAlpha, setAlpha);
|
||||||
|
REFLECT_STRING ("texture", getTexture, setTexture);
|
||||||
|
REFLECT_BOOL("scale", getScale, setScale);
|
||||||
|
REFLECT_EXPORT_END
|
||||||
|
|
||||||
|
/// \from CInterfaceElement
|
||||||
|
sint32 getMaxUsedW() const;
|
||||||
|
sint32 getMinUsedW() const;
|
||||||
|
|
||||||
|
virtual void serial(NLMISC::IStream &f);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
CViewRenderer::CTextureId _TextureId; /// Accelerator
|
||||||
|
NLMISC::CRGBA _Color;
|
||||||
|
sint32 _Rot;
|
||||||
|
sint32 _Align; /// 1st bit - Left/Right (0/1) 2nd bit - Bottom/Top (0/1)
|
||||||
|
EType _Type;
|
||||||
|
bool _Scale : 1;
|
||||||
|
bool _Flip : 1;
|
||||||
|
bool _Tile : 1;
|
||||||
|
bool _InheritGCAlpha : 1;
|
||||||
|
|
||||||
|
// For single texture
|
||||||
|
|
||||||
|
sint32 _TxtOffsetX; // Offset X of the single texture
|
||||||
|
sint32 _TxtOffsetY; // Offset Y of the single texture
|
||||||
|
sint32 _TxtWidth; // Width of the single texture
|
||||||
|
sint32 _TxtHeight; // Height of the single texture
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // NL_VIEW_BITMAP_H
|
||||||
|
|
||||||
|
/* End of view_bitmap.h */
|
@ -0,0 +1,183 @@
|
|||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef NL_VIEW_BITMAP_COMBO_H
|
||||||
|
#define NL_VIEW_BITMAP_COMBO_H
|
||||||
|
|
||||||
|
#include "nel/misc/cdb.h"
|
||||||
|
#include "nel/gui/view_base.h"
|
||||||
|
#include "nel/3d/u_texture.h"
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
|
||||||
|
/** Description of a combo box, this can be parsed from an xml node
|
||||||
|
* The bitmap layout is as follow :
|
||||||
|
*
|
||||||
|
* I W I W I W
|
||||||
|
* t G t G t G
|
||||||
|
* e a e a e a
|
||||||
|
* m p m p m p
|
||||||
|
* W S W W
|
||||||
|
* i e i i
|
||||||
|
* d l d d
|
||||||
|
* t e t t
|
||||||
|
* h c h h
|
||||||
|
* t
|
||||||
|
* e
|
||||||
|
* d
|
||||||
|
* +----+---+----+---+---+---+---+--...
|
||||||
|
* |ssss| |****| |***| |***|
|
||||||
|
* ItemHeight |ssss| |****| |***| |***
|
||||||
|
* +----+---+----+---+---+---+---+--...
|
||||||
|
* | | | | | | | |
|
||||||
|
* HGapSeleted | | | | | | | |
|
||||||
|
* +----+---+----+---+---+---+---+--...
|
||||||
|
* |****| |****| |***| |***|
|
||||||
|
* ItemHeight |****| |****| |***| |***|
|
||||||
|
* +----+---+----+---+---+---+---+--...
|
||||||
|
* | | | | | | | |
|
||||||
|
* HGap | | | | | | | |
|
||||||
|
* +----+---+----+---+---+---+---+--...
|
||||||
|
* |****| |****| |***| |***|
|
||||||
|
* ItemHeight |****| |****| |***| |***|
|
||||||
|
* . . . . . . . .
|
||||||
|
* . . . . . . . .
|
||||||
|
* s : selected item. . . . . . .
|
||||||
|
* * : where bitmap are displayed
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
struct CComboBoxDesc
|
||||||
|
{
|
||||||
|
bool parse(xmlNodePtr cur, CInterfaceElement *owner);
|
||||||
|
void addObserver(NLMISC::ICDBNode::IPropertyObserver *obs);
|
||||||
|
void getGridSize(uint &numRow,uint &numCol) const;
|
||||||
|
void getDimensions(uint &width, uint &height) const;
|
||||||
|
CInterfaceProperty NumRow;
|
||||||
|
CInterfaceProperty NumCol;
|
||||||
|
CInterfaceProperty CurrSelected;
|
||||||
|
CInterfaceProperty ItemWidth;
|
||||||
|
CInterfaceProperty ItemHeight;
|
||||||
|
CInterfaceProperty Unrolled;
|
||||||
|
CInterfaceProperty WGapSelected;
|
||||||
|
CInterfaceProperty WGap;
|
||||||
|
CInterfaceProperty HGapSelected;
|
||||||
|
CInterfaceProperty HGap;
|
||||||
|
CInterfaceProperty NumSel;
|
||||||
|
CInterfaceProperty Align;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A combo box with several bitmaps in it
|
||||||
|
* \author Nicolas Vizerie
|
||||||
|
* \author Nevrax France
|
||||||
|
* \date 2002
|
||||||
|
*/
|
||||||
|
class CViewBitmapCombo : public CViewBase, public NLMISC::ICDBNode::IPropertyObserver
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
typedef std::vector<sint32> TIdArray;
|
||||||
|
typedef std::vector<std::string> TStringArray;
|
||||||
|
typedef std::vector<NLMISC::CRGBA> TColorArray;
|
||||||
|
public:
|
||||||
|
/// ctor
|
||||||
|
CViewBitmapCombo(const TCtorParam ¶m);
|
||||||
|
|
||||||
|
|
||||||
|
std::string getProperty( const std::string &name ) const;
|
||||||
|
void setProperty( const std::string &name, const std::string &value );
|
||||||
|
xmlNodePtr serialize( xmlNodePtr parentNode, const char *type ) const;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* parse an xml node and initialize the base view members. Must call CViewBase::parse
|
||||||
|
* \param cur : pointer to the xml node to be parsed
|
||||||
|
* \param parentGroup : the parent group of the view
|
||||||
|
* \partam id : a refence to the string that will receive the view ID
|
||||||
|
* \return true if success
|
||||||
|
*/
|
||||||
|
bool parse(xmlNodePtr cur,CInterfaceGroup * parentGroup);
|
||||||
|
virtual uint32 getMemory() { return (uint32)(sizeof(*this)+_Id.size()); }
|
||||||
|
/**
|
||||||
|
* draw the view
|
||||||
|
*/
|
||||||
|
void draw();
|
||||||
|
|
||||||
|
// access to texture & colors
|
||||||
|
const TStringArray &getTexs() const { return _Texs; }
|
||||||
|
const TStringArray &getTexsOver() const { return _TexsOver; }
|
||||||
|
const TStringArray &getTexsPushed() const { return _TexsPushed; }
|
||||||
|
//
|
||||||
|
const TColorArray &getColors() const { return _Col; }
|
||||||
|
const TColorArray &getColorsOver() const { return _ColOver; }
|
||||||
|
const TColorArray &getColorsPushed() const { return _ColPushed; }
|
||||||
|
//
|
||||||
|
void setTexs(const char * const tex[], uint numTex);
|
||||||
|
void setTexsOver(const char * const tex[], uint numTex);
|
||||||
|
void setTexsPushed(const char * const tex[], uint numTex);
|
||||||
|
//
|
||||||
|
void setColors(const NLMISC::CRGBA colors[], uint numColors);
|
||||||
|
void setColorsOver(const NLMISC::CRGBA colors[], uint numColors);
|
||||||
|
void setColorsPushed(const NLMISC::CRGBA colors[], uint numColors);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////////
|
||||||
|
private:
|
||||||
|
//
|
||||||
|
TStringArray _Texs;
|
||||||
|
TStringArray _TexsOver;
|
||||||
|
TStringArray _TexsPushed;
|
||||||
|
TIdArray _TexsId;
|
||||||
|
TIdArray _TexsOverId;
|
||||||
|
TIdArray _TexsPushedId;
|
||||||
|
TColorArray _Col;
|
||||||
|
TColorArray _ColOver;
|
||||||
|
TColorArray _ColPushed;
|
||||||
|
CComboBoxDesc _CD;
|
||||||
|
CInterfaceElement *_Owner;
|
||||||
|
private:
|
||||||
|
void parseTexList(const std::string &names, TStringArray &dest);
|
||||||
|
void parseColList(const std::string &names, TColorArray &dest);
|
||||||
|
void getTexList( const TStringArray &arr, std::string &dest ) const;
|
||||||
|
void getColList( const TColorArray &arr, std::string &dest ) const;
|
||||||
|
void setupSize();
|
||||||
|
void getDimensions(uint &numRow, uint &numCol);
|
||||||
|
// From ICDBNode::IPropertyObserver
|
||||||
|
void update(NLMISC::ICDBNode *leaf);
|
||||||
|
// Return a color from the array, or white if it is empty
|
||||||
|
static NLMISC::CRGBA getCol(const TColorArray &array, uint index);
|
||||||
|
static const std::string *getTex(const TStringArray &array, uint index);
|
||||||
|
static sint32 getTexId(const TIdArray &array, uint index);
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1,143 @@
|
|||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef RZ_VIEW_POINTER_H
|
||||||
|
#define RZ_VIEW_POINTER_H
|
||||||
|
|
||||||
|
#include "nel/misc/types_nl.h"
|
||||||
|
#include "nel/misc/events.h"
|
||||||
|
#include "nel/gui/view_pointer_base.h"
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
class CCtrlBase;
|
||||||
|
class CGroupContainer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* class describing the pointer
|
||||||
|
* \author Matthieu 'Trap' Besson
|
||||||
|
* \author Nevrax France
|
||||||
|
* \date 2002
|
||||||
|
*/
|
||||||
|
|
||||||
|
class CViewPointer : public CViewPointerBase
|
||||||
|
{
|
||||||
|
|
||||||
|
public:
|
||||||
|
DECLARE_UI_CLASS( CViewPointer )
|
||||||
|
|
||||||
|
CViewPointer( const TCtorParam ¶m );
|
||||||
|
virtual ~CViewPointer(){}
|
||||||
|
|
||||||
|
bool parse (xmlNodePtr cur,CInterfaceGroup * parentGroup);
|
||||||
|
void draw();
|
||||||
|
|
||||||
|
// Set cursor mode
|
||||||
|
void setStringMode (bool stringCursor);
|
||||||
|
bool getStringMode() const {return _StringMode;}
|
||||||
|
|
||||||
|
// Set cursor string
|
||||||
|
void setString (const ucstring &str);
|
||||||
|
|
||||||
|
// TEMP PATCH
|
||||||
|
void setCursor (const std::string &name)
|
||||||
|
{
|
||||||
|
_TxDefault = name;
|
||||||
|
_TxIdDefault = -2;
|
||||||
|
}
|
||||||
|
// TEMP PATCH
|
||||||
|
|
||||||
|
/// Show or hide the pointer. Please, use SetMouseMode (bool freelook) instead.
|
||||||
|
void show(bool s) {_PointerVisible = s;}
|
||||||
|
|
||||||
|
static void setHWMouse( bool hw ){ hwMouse = hw; }
|
||||||
|
static void forceLink();
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
/// Drawing helpers
|
||||||
|
virtual bool drawResizer(CCtrlBase* pCB, NLMISC::CRGBA col){ return false; }
|
||||||
|
virtual bool drawRotate(CCtrlBase* pCB, NLMISC::CRGBA col){ return false; }
|
||||||
|
virtual bool drawScale(CCtrlBase* pCB, NLMISC::CRGBA col){ return false; }
|
||||||
|
virtual bool drawColorPicker(CCtrlBase* pCB, NLMISC::CRGBA col){ return false; }
|
||||||
|
virtual bool drawLink(CCtrlBase* pCB, NLMISC::CRGBA col){ return false; }
|
||||||
|
virtual bool drawBrowse(CCtrlBase* pCB, NLMISC::CRGBA col){ return false; }
|
||||||
|
virtual bool drawPan(CCtrlBase* pCB, NLMISC::CRGBA col){ return false; }
|
||||||
|
virtual bool drawCustom(CCtrlBase* pCB);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
// Look of the cursor in different situation
|
||||||
|
std::string _TxDefault;
|
||||||
|
std::string _TxMoveWindow;
|
||||||
|
std::string _TxResizeBRTL;
|
||||||
|
std::string _TxResizeBLTR;
|
||||||
|
std::string _TxResizeTB;
|
||||||
|
std::string _TxResizeLR;
|
||||||
|
std::string _TxRotate;
|
||||||
|
std::string _TxScale;
|
||||||
|
std::string _TxColPick;
|
||||||
|
std::string _TxPan;
|
||||||
|
std::string _TxCanPan;
|
||||||
|
std::string _TxPanR2;
|
||||||
|
std::string _TxCanPanR2;
|
||||||
|
|
||||||
|
sint32 _TxIdDefault;
|
||||||
|
sint32 _TxIdMoveWindow;
|
||||||
|
sint32 _TxIdResizeBRTL;
|
||||||
|
sint32 _TxIdResizeBLTR;
|
||||||
|
sint32 _TxIdResizeTB;
|
||||||
|
sint32 _TxIdResizeLR;
|
||||||
|
sint32 _TxIdRotate;
|
||||||
|
sint32 _TxIdScale;
|
||||||
|
sint32 _TxIdColPick;
|
||||||
|
sint32 _TxIdPan;
|
||||||
|
sint32 _TxIdCanPan;
|
||||||
|
sint32 _TxIdPanR2;
|
||||||
|
sint32 _TxIdCanPanR2;
|
||||||
|
|
||||||
|
NLMISC::CRGBA _Color;
|
||||||
|
|
||||||
|
sint32 _OffsetX;
|
||||||
|
sint32 _OffsetY;
|
||||||
|
|
||||||
|
CGroupContainer *_LastHightLight;
|
||||||
|
|
||||||
|
// Cursor mode
|
||||||
|
bool _StringMode;
|
||||||
|
bool _ForceStringMode;
|
||||||
|
CInterfaceGroup *_StringCursor;
|
||||||
|
CInterfaceGroup *_StringCursorHardware;
|
||||||
|
ucstring _ContextString;
|
||||||
|
|
||||||
|
// draw current cursor with the given texture, or, if in hardware mode, change the hardware cursor shape
|
||||||
|
void drawCursor(sint32 texId, NLMISC::CRGBA col, uint8 rot);
|
||||||
|
|
||||||
|
private:
|
||||||
|
// set the string into frame for software or hardware version
|
||||||
|
void setString (const ucstring &str, CInterfaceGroup *target);
|
||||||
|
|
||||||
|
static bool hwMouse;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // RZ_VIEW_POINTER_H
|
||||||
|
|
||||||
|
/* End of view_pointer.h */
|
@ -0,0 +1,85 @@
|
|||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef VIEW_POINTER_BASE_H
|
||||||
|
#define VIEW_POINTER_BASE_H
|
||||||
|
|
||||||
|
#include "nel/misc/events.h"
|
||||||
|
#include "nel/gui/view_base.h"
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
|
||||||
|
class CViewPointerBase : public CViewBase
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
DECLARE_UI_CLASS( CViewPointerBase )
|
||||||
|
|
||||||
|
CViewPointerBase( const TCtorParam ¶m );
|
||||||
|
virtual ~CViewPointerBase();
|
||||||
|
|
||||||
|
// Set the pointer position.
|
||||||
|
void setPointerPos (sint32 x, sint32 y);
|
||||||
|
void setPointerDispPos (sint32 x, sint32 y);
|
||||||
|
|
||||||
|
void resetPointerPos ();
|
||||||
|
void setPointerDown (bool pd);
|
||||||
|
void setPointerDownString (const std::string &s);
|
||||||
|
|
||||||
|
void getPointerPos (sint32 &x, sint32 &y);
|
||||||
|
void getPointerDispPos (sint32 &x, sint32 &y);
|
||||||
|
|
||||||
|
void getPointerOldPos (sint32 &x, sint32 &y);
|
||||||
|
void getPointerDownPos (sint32 &x, sint32 &y);
|
||||||
|
bool getPointerDown ();
|
||||||
|
std::string getPointerDownString ();
|
||||||
|
bool getPointerDrag ();
|
||||||
|
|
||||||
|
/// Is the pointer visible ?
|
||||||
|
bool show() const {return _PointerVisible;}
|
||||||
|
|
||||||
|
void draw(){}
|
||||||
|
|
||||||
|
/// set button state
|
||||||
|
void setButtonState(NLMISC::TMouseButton state) { _Buttons = state; }
|
||||||
|
/// get buttons state
|
||||||
|
NLMISC::TMouseButton getButtonState() const { return _Buttons; }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
// (x,y) is from the TopLeft corner of the window
|
||||||
|
sint32 _PointerX; // Current pointer position (raw, before snapping)
|
||||||
|
sint32 _PointerY;
|
||||||
|
sint32 _PointerOldX; // Previous frame pointer position
|
||||||
|
sint32 _PointerOldY;
|
||||||
|
bool _PointerDown; // Is the pointer down ?
|
||||||
|
sint32 _PointerDownX; // Pointer down position
|
||||||
|
sint32 _PointerDownY;
|
||||||
|
std::string _PointerDownString; // What is under the pointer at the down position
|
||||||
|
bool _PointerDrag; // Is the pointer down and we have moved ?
|
||||||
|
bool _PointerVisible; // Is the pointer visible or hidden ?
|
||||||
|
|
||||||
|
NLMISC::TMouseButton _Buttons;
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue