mirror of
https://port.numenaute.org/aleajactaest/khanat-opennel-code.git
synced 2024-11-10 09:19:01 +00:00
CHANGED: #1471 CCtrlBaseButton is now part of the NLGUI namespace.
--HG-- branch : gui-refactoring
This commit is contained in:
parent
dfb1f0ed37
commit
bf7d3afd38
9 changed files with 678 additions and 647 deletions
|
@ -22,232 +22,235 @@
|
|||
#include "nel/gui/ctrl_base.h"
|
||||
#include "nel/gui/action_handler.h"
|
||||
|
||||
|
||||
// ***************************************************************************
|
||||
/**
|
||||
* Base Class For Buttons.
|
||||
* \author Lionel Berenguier
|
||||
* \author Nevrax France
|
||||
* \date 2003
|
||||
*/
|
||||
class CCtrlBaseButton : public CCtrlBase
|
||||
namespace NLGUI
|
||||
{
|
||||
|
||||
public:
|
||||
enum EType { PushButton = 0, ToggleButton, RadioButton, ButtonTypeCount };
|
||||
|
||||
/// Constructor
|
||||
CCtrlBaseButton(const TCtorParam ¶m);
|
||||
|
||||
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; }
|
||||
|
||||
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)
|
||||
// ***************************************************************************
|
||||
/**
|
||||
* Base Class For Buttons.
|
||||
* \author Lionel Berenguier
|
||||
* \author Nevrax France
|
||||
* \date 2003
|
||||
*/
|
||||
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 _getActionOnLeftClick() const { return CAHManager::getInstance()->getAHName(_AHOnLeftClick); }
|
||||
IActionHandler *getActionOnLeftClick () const { return _AHOnLeftClick; }
|
||||
IActionHandler *getActionOnRightClick () const { return _AHOnRightClick; }
|
||||
IActionHandler *getActionOnClockTick () const { return _AHOnClockTick; }
|
||||
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
|
||||
class CCtrlBaseButton : public CCtrlBase
|
||||
{
|
||||
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);
|
||||
};
|
||||
public:
|
||||
enum EType { PushButton = 0, ToggleButton, RadioButton, ButtonTypeCount };
|
||||
|
||||
/// Constructor
|
||||
CCtrlBaseButton(const TCtorParam ¶m);
|
||||
|
||||
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; }
|
||||
|
||||
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 _getActionOnLeftClick() const { return CAHManager::getInstance()->getAHName(_AHOnLeftClick); }
|
||||
IActionHandler *getActionOnLeftClick () const { return _AHOnLeftClick; }
|
||||
IActionHandler *getActionOnRightClick () const { return _AHOnRightClick; }
|
||||
IActionHandler *getActionOnClockTick () const { return _AHOnClockTick; }
|
||||
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
|
||||
|
||||
|
|
|
@ -26,490 +26,495 @@
|
|||
using namespace std;
|
||||
using namespace NLMISC;
|
||||
|
||||
|
||||
// ***************************************************************************
|
||||
static const uint KEY_REPEAT_MIN = 100;
|
||||
static const uint KEY_REPEAT_MAX = 750;
|
||||
|
||||
|
||||
sint64 CCtrlBaseButton::_LastLeftClickDate = 0;
|
||||
NLMISC::CRefPtr<CCtrlBaseButton> CCtrlBaseButton::_LastLeftClickButton;
|
||||
|
||||
|
||||
// ***************************************************************************
|
||||
CCtrlBaseButton::CCtrlBaseButton(const TCtorParam ¶m) : CCtrlBase(param), _Type(ToggleButton)
|
||||
namespace
|
||||
{
|
||||
_Pushed = _Over = false;
|
||||
_Frozen = false;
|
||||
_FrozenHalfTone = true;
|
||||
_OverWhenPushed = true;
|
||||
_ColorOver = _ColorPushed = _ColorNormal = NLMISC::CRGBA(255,255,255,255);
|
||||
_ModulateGlobalColorNormal= _ModulateGlobalColorPushed= _ModulateGlobalColorOver= true;
|
||||
_LeftLongClickHandled = true;
|
||||
_LeftDblClickHandled = false;
|
||||
_ClickWhenPushed = false;
|
||||
_RBRefBut = NULL;
|
||||
_RBRef = NULL;
|
||||
|
||||
_AHOnOver = NULL;
|
||||
_AHOnLeftClick = NULL;
|
||||
_AHOnRightClick = NULL;
|
||||
_AHOnClockTick = NULL;
|
||||
_AHOnLeftLongClick = NULL;
|
||||
_AHOnLeftDblClick = NULL;
|
||||
const uint KEY_REPEAT_MIN = 100;
|
||||
const uint KEY_REPEAT_MAX = 750;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// ***************************************************************************
|
||||
bool CCtrlBaseButton::parse (xmlNodePtr cur,CInterfaceGroup * parentGroup)
|
||||
namespace NLGUI
|
||||
{
|
||||
CXMLAutoPtr prop;
|
||||
|
||||
//try to get props that can be inherited from groups
|
||||
//if a property is not defined, try to find it in the parent group.
|
||||
//if it is undefined, set it to zero
|
||||
if (! CCtrlBase::parse(cur,parentGroup) )
|
||||
return false;
|
||||
sint64 CCtrlBaseButton::_LastLeftClickDate = 0;
|
||||
NLMISC::CRefPtr<CCtrlBaseButton> CCtrlBaseButton::_LastLeftClickButton;
|
||||
|
||||
_Over = false;
|
||||
|
||||
// *** try to get the NEEDED specific props
|
||||
prop = xmlGetProp (cur, (xmlChar*)"button_type");
|
||||
string type;
|
||||
if (prop) type = (const char*) prop;
|
||||
if (type.empty() || type == "toggle_button")
|
||||
// ***************************************************************************
|
||||
CCtrlBaseButton::CCtrlBaseButton(const TCtorParam ¶m) : CCtrlBase(param), _Type(ToggleButton)
|
||||
{
|
||||
_Type = ToggleButton;
|
||||
}
|
||||
else if (type == "push_button")
|
||||
{
|
||||
_Type = PushButton;
|
||||
}
|
||||
else if (type == "radio_button")
|
||||
{
|
||||
_Type = RadioButton;
|
||||
_Pushed = _Over = false;
|
||||
_Frozen = false;
|
||||
_FrozenHalfTone = true;
|
||||
_OverWhenPushed = true;
|
||||
_ColorOver = _ColorPushed = _ColorNormal = NLMISC::CRGBA(255,255,255,255);
|
||||
_ModulateGlobalColorNormal= _ModulateGlobalColorPushed= _ModulateGlobalColorOver= true;
|
||||
_LeftLongClickHandled = true;
|
||||
_LeftDblClickHandled = false;
|
||||
_ClickWhenPushed = false;
|
||||
_RBRefBut = NULL;
|
||||
_RBRef = NULL;
|
||||
|
||||
initRBRef();
|
||||
if (_Pushed)
|
||||
*_RBRef = this;
|
||||
}
|
||||
else
|
||||
{
|
||||
nlinfo(("cannot parse button type for button " + getId()).c_str());
|
||||
_AHOnOver = NULL;
|
||||
_AHOnLeftClick = NULL;
|
||||
_AHOnRightClick = NULL;
|
||||
_AHOnClockTick = NULL;
|
||||
_AHOnLeftLongClick = NULL;
|
||||
_AHOnLeftDblClick = NULL;
|
||||
}
|
||||
|
||||
prop= (char*) xmlGetProp (cur, (xmlChar*)"pushed");
|
||||
_Pushed = false;
|
||||
if (prop)
|
||||
_Pushed = convertBool(prop);
|
||||
|
||||
prop= (char*) xmlGetProp (cur, (xmlChar*)"over_when_pushed");
|
||||
_OverWhenPushed = true;
|
||||
if (prop)
|
||||
_OverWhenPushed = convertBool(prop);
|
||||
|
||||
prop= (char*) xmlGetProp (cur, (xmlChar*)"click_when_pushed");
|
||||
_ClickWhenPushed = false;
|
||||
if (prop)
|
||||
_ClickWhenPushed = convertBool(prop);
|
||||
|
||||
// *** Read Colors
|
||||
// get color normal
|
||||
prop= (char*) xmlGetProp( cur, (xmlChar*)"color" );
|
||||
_ColorNormal = CRGBA(255,255,255,255);
|
||||
if (prop)
|
||||
_ColorNormal = convertColor (prop);
|
||||
|
||||
// Get ColorPushed
|
||||
prop= (char*) xmlGetProp( cur, (xmlChar*)"col_pushed" );
|
||||
_ColorPushed = CRGBA(255,255,255,255);
|
||||
if (prop)
|
||||
_ColorPushed = convertColor(prop);
|
||||
|
||||
// Get ColorOver
|
||||
prop= (char*) xmlGetProp( cur, (xmlChar*)"col_over" );
|
||||
_ColorOver = CRGBA(255,255,255,255);
|
||||
if (prop)
|
||||
_ColorOver = convertColor(prop);
|
||||
|
||||
// Default: take "global_color" param interface_element option.
|
||||
_ModulateGlobalColorNormal= _ModulateGlobalColorPushed= _ModulateGlobalColorOver= getModulateGlobalColor();
|
||||
|
||||
// Read special global_color for each state
|
||||
prop = (char*) xmlGetProp( cur, (xmlChar*)"global_color_normal" );
|
||||
if (prop) _ModulateGlobalColorNormal= convertBool(prop);
|
||||
prop = (char*) xmlGetProp( cur, (xmlChar*)"global_color_pushed" );
|
||||
if (prop) _ModulateGlobalColorPushed= convertBool(prop);
|
||||
prop = (char*) xmlGetProp( cur, (xmlChar*)"global_color_over" );
|
||||
if (prop) _ModulateGlobalColorOver= convertBool(prop);
|
||||
|
||||
|
||||
// *** Read Action handlers
|
||||
CAHManager::getInstance()->parseAH(cur, "onover", "params_over", _AHOnOver, _AHOverParams);
|
||||
CAHManager::getInstance()->parseAH(cur, "onclick_l", "params_l", _AHOnLeftClick, _AHLeftClickParams);
|
||||
CAHManager::getInstance()->parseAH(cur, "ondblclick_l", "params_dblclick_l", _AHOnLeftDblClick, _AHLeftDblClickParams);
|
||||
CAHManager::getInstance()->parseAH(cur, "onclick_r", "params_r", _AHOnRightClick, _AHRightClickParams);
|
||||
CAHManager::getInstance()->parseAH(cur, "onlongclick_l", "params_longclick_l", _AHOnLeftLongClick, _AHLeftLongClickParams);
|
||||
CAHManager::getInstance()->parseAH(cur, "onclock_tick", "params_clock_tick", _AHOnClockTick, _AHClockTickParams);
|
||||
|
||||
// Context menu association
|
||||
prop = (char*) xmlGetProp( cur, (xmlChar*)"menu_l" );
|
||||
if (prop)
|
||||
// ***************************************************************************
|
||||
bool CCtrlBaseButton::parse (xmlNodePtr cur,CInterfaceGroup * parentGroup)
|
||||
{
|
||||
_ListMenuLeft = NLMISC::toLower(std::string((const char *) prop));
|
||||
}
|
||||
prop = (char*) xmlGetProp( cur, (xmlChar*)"menu_r" );
|
||||
if (prop)
|
||||
{
|
||||
_ListMenuRight = NLMISC::toLower(std::string((const char *) prop));
|
||||
}
|
||||
// list menu on both clicks
|
||||
prop = (char*) xmlGetProp( cur, (xmlChar*)"menu_b" );
|
||||
if (prop)
|
||||
{
|
||||
setListMenuBoth(NLMISC::toLower(std::string((const char *) prop)));
|
||||
}
|
||||
CXMLAutoPtr prop;
|
||||
|
||||
prop= (char*) xmlGetProp (cur, (xmlChar*)"frozen");
|
||||
_Frozen = false;
|
||||
if (prop)
|
||||
_Frozen = convertBool(prop);
|
||||
|
||||
prop= (char*) xmlGetProp (cur, (xmlChar*)"frozen_half_tone");
|
||||
_FrozenHalfTone = true;
|
||||
if (prop)
|
||||
_FrozenHalfTone = convertBool(prop);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
// ***************************************************************************
|
||||
void CCtrlBaseButton::setModulateGlobalColorAll(bool state)
|
||||
{
|
||||
setModulateGlobalColor(state);
|
||||
setModulateGlobalColorNormal(state);
|
||||
setModulateGlobalColorPushed(state);
|
||||
setModulateGlobalColorOver(state);
|
||||
}
|
||||
|
||||
|
||||
// ***************************************************************************
|
||||
bool CCtrlBaseButton::handleEvent (const NLGUI::CEventDescriptor& event)
|
||||
{
|
||||
if (CCtrlBase::handleEvent(event)) return true;
|
||||
if (!_Active || _Frozen)
|
||||
return false;
|
||||
|
||||
sint64 T1 = NLMISC::CTime::getLocalTime();
|
||||
|
||||
if (event.getType() == NLGUI::CEventDescriptor::mouse)
|
||||
{
|
||||
const NLGUI::CEventDescriptorMouse &eventDesc = (const NLGUI::CEventDescriptorMouse &)event;
|
||||
|
||||
if (eventDesc.getEventTypeExtended() == NLGUI::CEventDescriptorMouse::mouseleftup)
|
||||
{
|
||||
if (CWidgetManager::getInstance()->getCapturePointerLeft() != this)
|
||||
return false;
|
||||
_LeftLongClickHandled = true;
|
||||
}
|
||||
|
||||
if (!((eventDesc.getX() >= _XReal) &&
|
||||
(eventDesc.getX() < (_XReal + _WReal))&&
|
||||
(eventDesc.getY() > _YReal) &&
|
||||
(eventDesc.getY() <= (_YReal+ _HReal))))
|
||||
//try to get props that can be inherited from groups
|
||||
//if a property is not defined, try to find it in the parent group.
|
||||
//if it is undefined, set it to zero
|
||||
if (! CCtrlBase::parse(cur,parentGroup) )
|
||||
return false;
|
||||
|
||||
if (eventDesc.getEventTypeExtended() == NLGUI::CEventDescriptorMouse::mouseleftdown)
|
||||
{
|
||||
if (_AHOnLeftDblClick)
|
||||
{
|
||||
if ((CCtrlBaseButton *) _LastLeftClickButton == this && (T1 - _LastLeftClickDate) < CWidgetManager::getInstance()->getUserDblClickDelay())
|
||||
{
|
||||
CAHManager::getInstance()->runActionHandler (_AHOnLeftDblClick, this, _AHLeftDblClickParams);
|
||||
_LeftDblClickHandled = true;
|
||||
_LastLeftClickButton = NULL;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
_Over = false;
|
||||
|
||||
if (_AHOnLeftLongClick != NULL)
|
||||
{
|
||||
_LeftLongClickHandled = false;
|
||||
_LeftLongClickDate = T1;
|
||||
}
|
||||
_LeftDblClickHandled = false;
|
||||
_LastLeftClickButton = NULL;
|
||||
return true;
|
||||
// *** try to get the NEEDED specific props
|
||||
prop = xmlGetProp (cur, (xmlChar*)"button_type");
|
||||
string type;
|
||||
if (prop) type = (const char*) prop;
|
||||
if (type.empty() || type == "toggle_button")
|
||||
{
|
||||
_Type = ToggleButton;
|
||||
}
|
||||
else if (type == "push_button")
|
||||
{
|
||||
_Type = PushButton;
|
||||
}
|
||||
else if (type == "radio_button")
|
||||
{
|
||||
_Type = RadioButton;
|
||||
|
||||
initRBRef();
|
||||
if (_Pushed)
|
||||
*_RBRef = this;
|
||||
}
|
||||
else
|
||||
{
|
||||
nlinfo(("cannot parse button type for button " + getId()).c_str());
|
||||
}
|
||||
|
||||
if (eventDesc.getEventTypeExtended() == NLGUI::CEventDescriptorMouse::mouseleftup)
|
||||
prop= (char*) xmlGetProp (cur, (xmlChar*)"pushed");
|
||||
_Pushed = false;
|
||||
if (prop)
|
||||
_Pushed = convertBool(prop);
|
||||
|
||||
prop= (char*) xmlGetProp (cur, (xmlChar*)"over_when_pushed");
|
||||
_OverWhenPushed = true;
|
||||
if (prop)
|
||||
_OverWhenPushed = convertBool(prop);
|
||||
|
||||
prop= (char*) xmlGetProp (cur, (xmlChar*)"click_when_pushed");
|
||||
_ClickWhenPushed = false;
|
||||
if (prop)
|
||||
_ClickWhenPushed = convertBool(prop);
|
||||
|
||||
// *** Read Colors
|
||||
// get color normal
|
||||
prop= (char*) xmlGetProp( cur, (xmlChar*)"color" );
|
||||
_ColorNormal = CRGBA(255,255,255,255);
|
||||
if (prop)
|
||||
_ColorNormal = convertColor (prop);
|
||||
|
||||
// Get ColorPushed
|
||||
prop= (char*) xmlGetProp( cur, (xmlChar*)"col_pushed" );
|
||||
_ColorPushed = CRGBA(255,255,255,255);
|
||||
if (prop)
|
||||
_ColorPushed = convertColor(prop);
|
||||
|
||||
// Get ColorOver
|
||||
prop= (char*) xmlGetProp( cur, (xmlChar*)"col_over" );
|
||||
_ColorOver = CRGBA(255,255,255,255);
|
||||
if (prop)
|
||||
_ColorOver = convertColor(prop);
|
||||
|
||||
// Default: take "global_color" param interface_element option.
|
||||
_ModulateGlobalColorNormal= _ModulateGlobalColorPushed= _ModulateGlobalColorOver= getModulateGlobalColor();
|
||||
|
||||
// Read special global_color for each state
|
||||
prop = (char*) xmlGetProp( cur, (xmlChar*)"global_color_normal" );
|
||||
if (prop) _ModulateGlobalColorNormal= convertBool(prop);
|
||||
prop = (char*) xmlGetProp( cur, (xmlChar*)"global_color_pushed" );
|
||||
if (prop) _ModulateGlobalColorPushed= convertBool(prop);
|
||||
prop = (char*) xmlGetProp( cur, (xmlChar*)"global_color_over" );
|
||||
if (prop) _ModulateGlobalColorOver= convertBool(prop);
|
||||
|
||||
|
||||
// *** Read Action handlers
|
||||
CAHManager::getInstance()->parseAH(cur, "onover", "params_over", _AHOnOver, _AHOverParams);
|
||||
CAHManager::getInstance()->parseAH(cur, "onclick_l", "params_l", _AHOnLeftClick, _AHLeftClickParams);
|
||||
CAHManager::getInstance()->parseAH(cur, "ondblclick_l", "params_dblclick_l", _AHOnLeftDblClick, _AHLeftDblClickParams);
|
||||
CAHManager::getInstance()->parseAH(cur, "onclick_r", "params_r", _AHOnRightClick, _AHRightClickParams);
|
||||
CAHManager::getInstance()->parseAH(cur, "onlongclick_l", "params_longclick_l", _AHOnLeftLongClick, _AHLeftLongClickParams);
|
||||
CAHManager::getInstance()->parseAH(cur, "onclock_tick", "params_clock_tick", _AHOnClockTick, _AHClockTickParams);
|
||||
|
||||
// Context menu association
|
||||
prop = (char*) xmlGetProp( cur, (xmlChar*)"menu_l" );
|
||||
if (prop)
|
||||
{
|
||||
if (CWidgetManager::getInstance()->getCapturePointerLeft() != this)
|
||||
_ListMenuLeft = NLMISC::toLower(std::string((const char *) prop));
|
||||
}
|
||||
prop = (char*) xmlGetProp( cur, (xmlChar*)"menu_r" );
|
||||
if (prop)
|
||||
{
|
||||
_ListMenuRight = NLMISC::toLower(std::string((const char *) prop));
|
||||
}
|
||||
// list menu on both clicks
|
||||
prop = (char*) xmlGetProp( cur, (xmlChar*)"menu_b" );
|
||||
if (prop)
|
||||
{
|
||||
setListMenuBoth(NLMISC::toLower(std::string((const char *) prop)));
|
||||
}
|
||||
|
||||
prop= (char*) xmlGetProp (cur, (xmlChar*)"frozen");
|
||||
_Frozen = false;
|
||||
if (prop)
|
||||
_Frozen = convertBool(prop);
|
||||
|
||||
prop= (char*) xmlGetProp (cur, (xmlChar*)"frozen_half_tone");
|
||||
_FrozenHalfTone = true;
|
||||
if (prop)
|
||||
_FrozenHalfTone = convertBool(prop);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
// ***************************************************************************
|
||||
void CCtrlBaseButton::setModulateGlobalColorAll(bool state)
|
||||
{
|
||||
setModulateGlobalColor(state);
|
||||
setModulateGlobalColorNormal(state);
|
||||
setModulateGlobalColorPushed(state);
|
||||
setModulateGlobalColorOver(state);
|
||||
}
|
||||
|
||||
|
||||
// ***************************************************************************
|
||||
bool CCtrlBaseButton::handleEvent (const NLGUI::CEventDescriptor& event)
|
||||
{
|
||||
if (CCtrlBase::handleEvent(event)) return true;
|
||||
if (!_Active || _Frozen)
|
||||
return false;
|
||||
|
||||
sint64 T1 = NLMISC::CTime::getLocalTime();
|
||||
|
||||
if (event.getType() == NLGUI::CEventDescriptor::mouse)
|
||||
{
|
||||
const NLGUI::CEventDescriptorMouse &eventDesc = (const NLGUI::CEventDescriptorMouse &)event;
|
||||
|
||||
if (eventDesc.getEventTypeExtended() == NLGUI::CEventDescriptorMouse::mouseleftup)
|
||||
{
|
||||
if (CWidgetManager::getInstance()->getCapturePointerLeft() != this)
|
||||
return false;
|
||||
_LeftLongClickHandled = true;
|
||||
}
|
||||
|
||||
if (!((eventDesc.getX() >= _XReal) &&
|
||||
(eventDesc.getX() < (_XReal + _WReal))&&
|
||||
(eventDesc.getY() > _YReal) &&
|
||||
(eventDesc.getY() <= (_YReal+ _HReal))))
|
||||
return false;
|
||||
|
||||
if (_LeftDblClickHandled) // no effect on mouse up after double click has been handled
|
||||
if (eventDesc.getEventTypeExtended() == NLGUI::CEventDescriptorMouse::mouseleftdown)
|
||||
{
|
||||
if (_AHOnLeftDblClick)
|
||||
{
|
||||
if ((CCtrlBaseButton *) _LastLeftClickButton == this && (T1 - _LastLeftClickDate) < CWidgetManager::getInstance()->getUserDblClickDelay())
|
||||
{
|
||||
CAHManager::getInstance()->runActionHandler (_AHOnLeftDblClick, this, _AHLeftDblClickParams);
|
||||
_LeftDblClickHandled = true;
|
||||
_LastLeftClickButton = NULL;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
if (_AHOnLeftLongClick != NULL)
|
||||
{
|
||||
_LeftLongClickHandled = false;
|
||||
_LeftLongClickDate = T1;
|
||||
}
|
||||
_LeftDblClickHandled = false;
|
||||
_LastLeftClickButton = NULL;
|
||||
return true;
|
||||
}
|
||||
|
||||
// Do not launch 2 times action handler if we are already pushed ! except if we want.
|
||||
if (!_ClickWhenPushed)
|
||||
if (eventDesc.getEventTypeExtended() == NLGUI::CEventDescriptorMouse::mouseleftup)
|
||||
{
|
||||
if ((_Type == RadioButton) && _RBRef && (*_RBRef == this))
|
||||
return true;
|
||||
}
|
||||
if (CWidgetManager::getInstance()->getCapturePointerLeft() != this)
|
||||
return false;
|
||||
|
||||
if (_Type == RadioButton)
|
||||
{
|
||||
_Pushed = true;
|
||||
if(_RBRef) *_RBRef = this;
|
||||
}
|
||||
|
||||
if (_Type == ToggleButton)
|
||||
_Pushed = !_Pushed;
|
||||
|
||||
/*
|
||||
// RunAction
|
||||
if(_AHOnLeftClick != NULL)
|
||||
{
|
||||
//nlinfo("clicked on %s", _Id.c_str());
|
||||
pIM->submitEvent ("button_click:"+getId());//TEMP
|
||||
CAHManager::getInstance()->runActionHandler (_AHOnLeftClick, this, _AHLeftClickParams);
|
||||
//pIM->submitEvent ("button_click:"+getId());
|
||||
}
|
||||
*/
|
||||
runLeftClickAction();
|
||||
if (CWidgetManager::getInstance()->getCapturePointerLeft() == NULL) return true; // event handler may release cpature from this object (if it is removed for example)
|
||||
|
||||
// Run Menu
|
||||
if (!_ListMenuLeft.empty())
|
||||
CWidgetManager::getInstance()->enableModalWindow (this, _ListMenuLeft);
|
||||
|
||||
if (_AHOnLeftDblClick != NULL)
|
||||
{
|
||||
_LastLeftClickDate = T1;
|
||||
_LastLeftClickButton = this;
|
||||
}
|
||||
|
||||
// Always return true on LeftClick.
|
||||
return true;
|
||||
}
|
||||
if (eventDesc.getEventTypeExtended() == NLGUI::CEventDescriptorMouse::mouserightdown)
|
||||
{
|
||||
_LastLeftClickButton = NULL;
|
||||
return true;
|
||||
}
|
||||
if (eventDesc.getEventTypeExtended() == NLGUI::CEventDescriptorMouse::mouserightup)
|
||||
{
|
||||
_LastLeftClickButton = NULL;
|
||||
bool handled= false;
|
||||
if (CWidgetManager::getInstance()->getCapturePointerRight() != this)
|
||||
return false;
|
||||
|
||||
// RunAction
|
||||
if(_AHOnRightClick != NULL)
|
||||
{
|
||||
handled= true;
|
||||
CAHManager::getInstance()->runActionHandler (_AHOnRightClick, this, _AHRightClickParams);
|
||||
}
|
||||
if (CWidgetManager::getInstance()->getCapturePointerRight() == NULL) return true; // if this become NULL, this ctrl has been deleted
|
||||
// Run Menu
|
||||
if (!_ListMenuRight .empty())
|
||||
{
|
||||
handled= true;
|
||||
CWidgetManager::getInstance()->enableModalWindow (this, _ListMenuRight);
|
||||
}
|
||||
// If not handled here, ret to parent
|
||||
return handled;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
else if (event.getType() == NLGUI::CEventDescriptor::system)
|
||||
{
|
||||
const NLGUI::CEventDescriptorSystem &systemEvent = (const NLGUI::CEventDescriptorSystem &) event;
|
||||
if (systemEvent.getEventTypeExtended() == NLGUI::CEventDescriptorSystem::clocktick)
|
||||
{
|
||||
if (_AHOnClockTick != NULL)
|
||||
{
|
||||
CAHManager::getInstance()->runActionHandler(_AHOnClockTick, this, _AHClockTickParams);
|
||||
}
|
||||
|
||||
if (CWidgetManager::getInstance()->getCapturePointerLeft() == this)
|
||||
{
|
||||
if (!_LeftLongClickHandled)
|
||||
if (_LeftDblClickHandled) // no effect on mouse up after double click has been handled
|
||||
{
|
||||
uint nVal = 50;
|
||||
CCDBNodeLeaf *pNL = NLGUI::CDBManager::getInstance()->getDbProp("UI:SAVE:KEY_REPEAT_SPEED");
|
||||
if (pNL != NULL)
|
||||
nVal = pNL->getValue32();
|
||||
uint repeatDelay = (uint)(KEY_REPEAT_MIN + (KEY_REPEAT_MAX-KEY_REPEAT_MIN) * (float)nVal / 100.0f);
|
||||
if ((T1 - _LeftLongClickDate) > repeatDelay)
|
||||
_LeftDblClickHandled = false;
|
||||
return true;
|
||||
}
|
||||
|
||||
// Do not launch 2 times action handler if we are already pushed ! except if we want.
|
||||
if (!_ClickWhenPushed)
|
||||
{
|
||||
if ((_Type == RadioButton) && _RBRef && (*_RBRef == this))
|
||||
return true;
|
||||
}
|
||||
|
||||
if (_Type == RadioButton)
|
||||
{
|
||||
_Pushed = true;
|
||||
if(_RBRef) *_RBRef = this;
|
||||
}
|
||||
|
||||
if (_Type == ToggleButton)
|
||||
_Pushed = !_Pushed;
|
||||
|
||||
/*
|
||||
// RunAction
|
||||
if(_AHOnLeftClick != NULL)
|
||||
{
|
||||
//nlinfo("clicked on %s", _Id.c_str());
|
||||
pIM->submitEvent ("button_click:"+getId());//TEMP
|
||||
CAHManager::getInstance()->runActionHandler (_AHOnLeftClick, this, _AHLeftClickParams);
|
||||
//pIM->submitEvent ("button_click:"+getId());
|
||||
}
|
||||
*/
|
||||
runLeftClickAction();
|
||||
if (CWidgetManager::getInstance()->getCapturePointerLeft() == NULL) return true; // event handler may release cpature from this object (if it is removed for example)
|
||||
|
||||
// Run Menu
|
||||
if (!_ListMenuLeft.empty())
|
||||
CWidgetManager::getInstance()->enableModalWindow (this, _ListMenuLeft);
|
||||
|
||||
if (_AHOnLeftDblClick != NULL)
|
||||
{
|
||||
_LastLeftClickDate = T1;
|
||||
_LastLeftClickButton = this;
|
||||
}
|
||||
|
||||
// Always return true on LeftClick.
|
||||
return true;
|
||||
}
|
||||
if (eventDesc.getEventTypeExtended() == NLGUI::CEventDescriptorMouse::mouserightdown)
|
||||
{
|
||||
_LastLeftClickButton = NULL;
|
||||
return true;
|
||||
}
|
||||
if (eventDesc.getEventTypeExtended() == NLGUI::CEventDescriptorMouse::mouserightup)
|
||||
{
|
||||
_LastLeftClickButton = NULL;
|
||||
bool handled= false;
|
||||
if (CWidgetManager::getInstance()->getCapturePointerRight() != this)
|
||||
return false;
|
||||
|
||||
// RunAction
|
||||
if(_AHOnRightClick != NULL)
|
||||
{
|
||||
handled= true;
|
||||
CAHManager::getInstance()->runActionHandler (_AHOnRightClick, this, _AHRightClickParams);
|
||||
}
|
||||
if (CWidgetManager::getInstance()->getCapturePointerRight() == NULL) return true; // if this become NULL, this ctrl has been deleted
|
||||
// Run Menu
|
||||
if (!_ListMenuRight .empty())
|
||||
{
|
||||
handled= true;
|
||||
CWidgetManager::getInstance()->enableModalWindow (this, _ListMenuRight);
|
||||
}
|
||||
// If not handled here, ret to parent
|
||||
return handled;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
else if (event.getType() == NLGUI::CEventDescriptor::system)
|
||||
{
|
||||
const NLGUI::CEventDescriptorSystem &systemEvent = (const NLGUI::CEventDescriptorSystem &) event;
|
||||
if (systemEvent.getEventTypeExtended() == NLGUI::CEventDescriptorSystem::clocktick)
|
||||
{
|
||||
if (_AHOnClockTick != NULL)
|
||||
{
|
||||
CAHManager::getInstance()->runActionHandler(_AHOnClockTick, this, _AHClockTickParams);
|
||||
}
|
||||
|
||||
if (CWidgetManager::getInstance()->getCapturePointerLeft() == this)
|
||||
{
|
||||
if (!_LeftLongClickHandled)
|
||||
{
|
||||
_LeftLongClickHandled = true;
|
||||
CAHManager::getInstance()->runActionHandler(_AHOnLeftLongClick, this, _AHLeftLongClickParams);
|
||||
uint nVal = 50;
|
||||
CCDBNodeLeaf *pNL = NLGUI::CDBManager::getInstance()->getDbProp("UI:SAVE:KEY_REPEAT_SPEED");
|
||||
if (pNL != NULL)
|
||||
nVal = pNL->getValue32();
|
||||
uint repeatDelay = (uint)(KEY_REPEAT_MIN + (KEY_REPEAT_MAX-KEY_REPEAT_MIN) * (float)nVal / 100.0f);
|
||||
if ((T1 - _LeftLongClickDate) > repeatDelay)
|
||||
{
|
||||
_LeftLongClickHandled = true;
|
||||
CAHManager::getInstance()->runActionHandler(_AHOnLeftLongClick, this, _AHLeftLongClickParams);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
// ***************************************************************************
|
||||
void CCtrlBaseButton::initRBRef()
|
||||
{
|
||||
if (_RBRef != NULL) return;
|
||||
nlassert(_Parent);
|
||||
const vector<CCtrlBase*> &vCB = _Parent->getControls();
|
||||
uint i = 0;
|
||||
for (i = 0; i < vCB.size(); ++i)
|
||||
// ***************************************************************************
|
||||
void CCtrlBaseButton::initRBRef()
|
||||
{
|
||||
CCtrlBaseButton *pBut = dynamic_cast<CCtrlBaseButton*>(vCB[i]);
|
||||
if (pBut && pBut->_Type == RadioButton)
|
||||
if (_RBRef != NULL) return;
|
||||
nlassert(_Parent);
|
||||
const vector<CCtrlBase*> &vCB = _Parent->getControls();
|
||||
uint i = 0;
|
||||
for (i = 0; i < vCB.size(); ++i)
|
||||
{
|
||||
_RBRef = &pBut->_RBRefBut;
|
||||
break;
|
||||
CCtrlBaseButton *pBut = dynamic_cast<CCtrlBaseButton*>(vCB[i]);
|
||||
if (pBut && pBut->_Type == RadioButton)
|
||||
{
|
||||
_RBRef = &pBut->_RBRefBut;
|
||||
break;
|
||||
}
|
||||
}
|
||||
// If we are the first radio button of the group and not added
|
||||
if (i == vCB.size())
|
||||
_RBRef = &this->_RBRefBut;
|
||||
}
|
||||
|
||||
// ***************************************************************************
|
||||
void CCtrlBaseButton::initRBRefFromRadioButton(CCtrlBaseButton * pBut)
|
||||
{
|
||||
if(pBut && pBut->_Type == RadioButton)
|
||||
{
|
||||
_RBRef = &(pBut->_RBRefBut);
|
||||
_RBRefBut=NULL;
|
||||
}
|
||||
}
|
||||
// If we are the first radio button of the group and not added
|
||||
if (i == vCB.size())
|
||||
_RBRef = &this->_RBRefBut;
|
||||
}
|
||||
|
||||
// ***************************************************************************
|
||||
void CCtrlBaseButton::initRBRefFromRadioButton(CCtrlBaseButton * pBut)
|
||||
{
|
||||
if(pBut && pBut->_Type == RadioButton)
|
||||
|
||||
// ***************************************************************************
|
||||
void CCtrlBaseButton::setPushed (bool state)
|
||||
{
|
||||
_RBRef = &(pBut->_RBRefBut);
|
||||
_RBRefBut=NULL;
|
||||
}
|
||||
}
|
||||
_Pushed = state;
|
||||
|
||||
|
||||
// ***************************************************************************
|
||||
void CCtrlBaseButton::setPushed (bool state)
|
||||
{
|
||||
_Pushed = state;
|
||||
|
||||
if (_Type == RadioButton && _RBRef)
|
||||
{
|
||||
if (state == true)
|
||||
if (_Type == RadioButton && _RBRef)
|
||||
{
|
||||
*_RBRef = this;
|
||||
if (state == true)
|
||||
{
|
||||
*_RBRef = this;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (*_RBRef == this) // I have to be pushed to unpush me
|
||||
*_RBRef = NULL; // After that : All radio buttons are NOT pushed
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ***************************************************************************
|
||||
void CCtrlBaseButton::setFrozen (bool state)
|
||||
{
|
||||
_Frozen = state;
|
||||
if (_Frozen)
|
||||
{
|
||||
_Pushed = false;
|
||||
_Over = false;
|
||||
}
|
||||
}
|
||||
|
||||
// ***************************************************************************
|
||||
void CCtrlBaseButton::setFrozenHalfTone(bool enabled)
|
||||
{
|
||||
_FrozenHalfTone = enabled;
|
||||
}
|
||||
|
||||
// ***************************************************************************
|
||||
void CCtrlBaseButton::unselect()
|
||||
{
|
||||
if (_Type == RadioButton)
|
||||
{
|
||||
if (_RBRef) *_RBRef = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// ***************************************************************************
|
||||
void CCtrlBaseButton::updateOver(bool &lastOver)
|
||||
{
|
||||
if (!CWidgetManager::getInstance()->isMouseHandlingEnabled())
|
||||
{
|
||||
_Over = false;
|
||||
return;
|
||||
}
|
||||
|
||||
if (CWidgetManager::getInstance()->getCapturePointerLeft() != NULL)
|
||||
{
|
||||
if (CWidgetManager::getInstance()->getCapturePointerLeft() != this)
|
||||
{
|
||||
_Over = false;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
const vector<CCtrlBase*> &rVB = CWidgetManager::getInstance()->getCtrlsUnderPointer ();
|
||||
|
||||
if (!_Frozen)
|
||||
{
|
||||
uint32 i;
|
||||
lastOver = _Over;
|
||||
// show over if it is the last control that has the same father
|
||||
CCtrlBase *candidate = NULL;
|
||||
for (i = 0; i < rVB.size(); ++i)
|
||||
{
|
||||
if (rVB[i]->getParent() == this->getParent())
|
||||
{
|
||||
candidate = rVB[i];
|
||||
}
|
||||
}
|
||||
_Over = (candidate == this);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (*_RBRef == this) // I have to be pushed to unpush me
|
||||
*_RBRef = NULL; // After that : All radio buttons are NOT pushed
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ***************************************************************************
|
||||
void CCtrlBaseButton::setFrozen (bool state)
|
||||
{
|
||||
_Frozen = state;
|
||||
if (_Frozen)
|
||||
{
|
||||
_Pushed = false;
|
||||
_Over = false;
|
||||
}
|
||||
}
|
||||
|
||||
// ***************************************************************************
|
||||
void CCtrlBaseButton::setFrozenHalfTone(bool enabled)
|
||||
{
|
||||
_FrozenHalfTone = enabled;
|
||||
}
|
||||
|
||||
// ***************************************************************************
|
||||
void CCtrlBaseButton::unselect()
|
||||
{
|
||||
if (_Type == RadioButton)
|
||||
{
|
||||
if (_RBRef) *_RBRef = NULL;
|
||||
}
|
||||
}
|
||||
_Over = false;
|
||||
|
||||
|
||||
// ***************************************************************************
|
||||
void CCtrlBaseButton::updateOver(bool &lastOver)
|
||||
{
|
||||
if (!CWidgetManager::getInstance()->isMouseHandlingEnabled())
|
||||
{
|
||||
_Over = false;
|
||||
return;
|
||||
}
|
||||
|
||||
if (CWidgetManager::getInstance()->getCapturePointerLeft() != NULL)
|
||||
// ***************************************************************************
|
||||
void CCtrlBaseButton::elementCaptured(CCtrlBase *capturedElement)
|
||||
{
|
||||
if (CWidgetManager::getInstance()->getCapturePointerLeft() != this)
|
||||
// if not me, then reset my '_Over'
|
||||
if (capturedElement != this)
|
||||
{
|
||||
_Over = false;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
const vector<CCtrlBase*> &rVB = CWidgetManager::getInstance()->getCtrlsUnderPointer ();
|
||||
|
||||
if (!_Frozen)
|
||||
// ***************************************************************************
|
||||
void CCtrlBaseButton::runLeftClickAction()
|
||||
{
|
||||
uint32 i;
|
||||
lastOver = _Over;
|
||||
// show over if it is the last control that has the same father
|
||||
CCtrlBase *candidate = NULL;
|
||||
for (i = 0; i < rVB.size(); ++i)
|
||||
if(_AHOnLeftClick != NULL)
|
||||
{
|
||||
if (rVB[i]->getParent() == this->getParent())
|
||||
{
|
||||
candidate = rVB[i];
|
||||
}
|
||||
|
||||
//nlinfo("clicked on %s", _Id.c_str());
|
||||
CAHManager::getInstance()->submitEvent( "button_click:" + getId() );
|
||||
CAHManager::getInstance()->runActionHandler (_AHOnLeftClick, this, _AHLeftClickParams);
|
||||
//pIM->submitEvent ("button_click:"+getId());
|
||||
}
|
||||
_Over = (candidate == this);
|
||||
}
|
||||
else
|
||||
_Over = false;
|
||||
|
||||
|
||||
}
|
||||
|
||||
// ***************************************************************************
|
||||
void CCtrlBaseButton::elementCaptured(CCtrlBase *capturedElement)
|
||||
{
|
||||
// if not me, then reset my '_Over'
|
||||
if (capturedElement != this)
|
||||
// ***************************************************************************
|
||||
int CCtrlBaseButton::luaRunLeftClickAction(CLuaState &ls)
|
||||
{
|
||||
_Over = false;
|
||||
const char *funcName = "onLeftClick";
|
||||
CLuaIHM::checkArgCount(ls, funcName, 0);
|
||||
|
||||
runLeftClickAction();
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// ***************************************************************************
|
||||
void CCtrlBaseButton::runLeftClickAction()
|
||||
{
|
||||
if(_AHOnLeftClick != NULL)
|
||||
{
|
||||
|
||||
//nlinfo("clicked on %s", _Id.c_str());
|
||||
CAHManager::getInstance()->submitEvent( "button_click:" + getId() );
|
||||
CAHManager::getInstance()->runActionHandler (_AHOnLeftClick, this, _AHLeftClickParams);
|
||||
//pIM->submitEvent ("button_click:"+getId());
|
||||
}
|
||||
}
|
||||
|
||||
// ***************************************************************************
|
||||
int CCtrlBaseButton::luaRunLeftClickAction(CLuaState &ls)
|
||||
{
|
||||
const char *funcName = "onLeftClick";
|
||||
CLuaIHM::checkArgCount(ls, funcName, 0);
|
||||
|
||||
runLeftClickAction();
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -26,9 +26,14 @@
|
|||
#include "game_share/skills.h"
|
||||
|
||||
|
||||
namespace NLGUI
|
||||
{
|
||||
class CCtrlBaseButton;
|
||||
}
|
||||
|
||||
|
||||
// ***************************************************************************
|
||||
class CDBCtrlSheet;
|
||||
class CCtrlBaseButton;
|
||||
class CSBrickSheet;
|
||||
class CViewBitmap;
|
||||
class CViewText;
|
||||
|
|
|
@ -22,11 +22,13 @@
|
|||
#include "nel/misc/types_nl.h"
|
||||
#include "nel/gui/interface_group.h"
|
||||
|
||||
|
||||
namespace NLGUI
|
||||
{
|
||||
class CCtrlBaseButton;
|
||||
}
|
||||
|
||||
// ***************************************************************************
|
||||
class CViewText;
|
||||
class CCtrlBaseButton;
|
||||
class CGroupMenu;
|
||||
|
||||
// ***************************************************************************
|
||||
|
|
|
@ -23,9 +23,12 @@
|
|||
#include "list_sheet_base.h"
|
||||
#include "dbctrl_sheet.h"
|
||||
|
||||
namespace NLGUI
|
||||
{
|
||||
class CCtrlBaseButton;
|
||||
}
|
||||
|
||||
// ***************************************************************************
|
||||
class CCtrlBaseButton;
|
||||
class CCtrlScroll;
|
||||
class CGroupContainer;
|
||||
|
||||
|
|
|
@ -23,11 +23,15 @@
|
|||
#include "nel/gui/interface_group.h"
|
||||
|
||||
|
||||
namespace NLGUI
|
||||
{
|
||||
class CCtrlBaseButton;
|
||||
}
|
||||
|
||||
|
||||
// ***************************************************************************
|
||||
class CViewBitmap;
|
||||
class CViewText;
|
||||
class CCtrlBaseButton;
|
||||
|
||||
|
||||
// ***************************************************************************
|
||||
|
|
|
@ -23,9 +23,13 @@
|
|||
#include "nel/misc/types_nl.h"
|
||||
#include "nel/gui/interface_group.h"
|
||||
|
||||
namespace NLGUI
|
||||
{
|
||||
class CCtrlBaseButton;
|
||||
}
|
||||
|
||||
class CGroupList;
|
||||
class CCtrlScroll;
|
||||
class CCtrlBaseButton;
|
||||
|
||||
// Can be used to build a chat window or anything that displays sequences of strings
|
||||
/**
|
||||
|
|
|
@ -25,6 +25,7 @@ namespace NLGUI
|
|||
{
|
||||
class CInterfaceElement;
|
||||
class CCtrlBase;
|
||||
class CCtrlBaseButton;
|
||||
class CInterfaceGroup;
|
||||
}
|
||||
|
||||
|
@ -62,7 +63,7 @@ typedef CInterfacePtr<class CCtrlTextButton>::TInterfacePtr CCtrlTextButtonPtr;
|
|||
typedef CInterfacePtr<class CViewText>::TInterfacePtr CViewTextPtr;
|
||||
typedef CInterfacePtr<class CViewTextMenu>::TInterfacePtr CViewTextMenuPtr;
|
||||
typedef CInterfacePtr<CCtrlBase>::TInterfacePtr CCtrlBasePtr;
|
||||
typedef CInterfacePtr<class CCtrlBaseButton>::TInterfacePtr CCtrlBaseButtonPtr;
|
||||
typedef CInterfacePtr<CCtrlBaseButton>::TInterfacePtr CCtrlBaseButtonPtr;
|
||||
typedef CInterfacePtr<class CGroupContainer>::TInterfacePtr CGroupContainerPtr;
|
||||
|
||||
#endif // NL_INTERFACE_POINTER_H
|
||||
|
|
|
@ -25,9 +25,13 @@ extern "C"
|
|||
#include "WWWInit.h"
|
||||
}
|
||||
|
||||
namespace NLGUI
|
||||
{
|
||||
class CCtrlBaseButton;
|
||||
}
|
||||
|
||||
class CGroupList;
|
||||
class CCtrlScroll;
|
||||
class CCtrlBaseButton;
|
||||
|
||||
// ***************************************************************************
|
||||
|
||||
|
|
Loading…
Reference in a new issue