diff --git a/code/nel/include/nel/gui/ctrl_scroll.h b/code/nel/include/nel/gui/ctrl_scroll.h
new file mode 100644
index 000000000..c20e41e4e
--- /dev/null
+++ b/code/nel/include/nel/gui/ctrl_scroll.h
@@ -0,0 +1,200 @@
+// Ryzom - MMORPG Framework
+// 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 .
+
+
+
+#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();
+
+
+ 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);
+
+ 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 */
+
+
diff --git a/code/nel/include/nel/gui/group_submenu_base.h b/code/nel/include/nel/gui/group_submenu_base.h
new file mode 100644
index 000000000..9489109f8
--- /dev/null
+++ b/code/nel/include/nel/gui/group_submenu_base.h
@@ -0,0 +1,48 @@
+// Ryzom - MMORPG Framework
+// 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 .
+
+#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
+
diff --git a/code/nel/include/nel/gui/widget_manager.h b/code/nel/include/nel/gui/widget_manager.h
index a5a7b45b8..1c15ac357 100644
--- a/code/nel/include/nel/gui/widget_manager.h
+++ b/code/nel/include/nel/gui/widget_manager.h
@@ -20,6 +20,9 @@
#include
#include
+#include
+#include "nel/misc/smart_ptr.h"
+#include "nel/misc/rgba.h"
#include "nel/misc/types_nl.h"
#include "nel/gui/interface_common.h"
diff --git a/code/nel/src/gui/ctrl_scroll.cpp b/code/nel/src/gui/ctrl_scroll.cpp
new file mode 100644
index 000000000..597ccc3cd
--- /dev/null
+++ b/code/nel/src/gui/ctrl_scroll.cpp
@@ -0,0 +1,1062 @@
+// Ryzom - MMORPG Framework
+// 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 .
+
+
+#include "nel/gui/widget_manager.h"
+#include "nel/gui/action_handler.h"
+#include "nel/gui/interface_group.h"
+#include "nel/gui/view_renderer.h"
+#include "nel/gui/ctrl_scroll.h"
+#include "nel/misc/xml_auto_ptr.h"
+#include "nel/gui/group_submenu_base.h"
+#include "nel/gui/lua_ihm.h"
+
+using namespace NLMISC;
+using namespace std;
+
+NLMISC_REGISTER_OBJECT(CViewBase, CCtrlScroll, std::string, "scroll");
+
+namespace NLGUI
+{
+
+ // ------------------------------------------------------------------------------------------------
+ CCtrlScroll::CCtrlScroll(const TCtorParam ¶m)
+ : CCtrlScrollBase(param)
+ {
+ _Vertical = true;
+ _Aligned = 1;
+ _TrackPos = 0;
+ _TrackDispPos = 0;
+ _TrackSize = _TrackSizeMin = 16;
+ _Min = 0;
+ _Max = 100;
+ _Value = 0;
+ _InitialValue = 0;
+ _MouseDown = false;
+ _CallingAH = false;
+ _Cancelable = false;
+ _Target = NULL;
+ _Inverted = false;
+ _IsDBLink = false;
+ _LastTargetHReal = 0;
+ _LastTargetMaxHReal = 0;
+ _LastTargetWReal = 0;
+ _LastTargetMaxWReal = 0;
+ _LastTargetOfsX = 0;
+ _LastTargetOfsY = 0;
+ _ObserverOn = true;
+ _TargetStepX = 1;
+ _TargetStepY = 1;
+ _StepValue = 0;
+ _TileM = false;
+ _Frozen = false;
+ }
+
+ // ------------------------------------------------------------------------------------------------
+ void CCtrlScroll::runAH(const std::string &name, const std::string ¶ms)
+ {
+ if (name.empty()) return;
+ if (_CallingAH) return; // avoid infinite loop
+ _CallingAH = true;
+ CAHManager::getInstance()->runActionHandler(name, this, params);
+ _CallingAH = false;
+ }
+
+ // ------------------------------------------------------------------------------------------------
+ CCtrlScroll::~CCtrlScroll()
+ {
+ if (_IsDBLink)
+ {
+ ICDBNode::CTextId textId;
+ _DBLink.getNodePtr()->removeObserver(this, textId);
+ }
+ }
+
+ // ------------------------------------------------------------------------------------------------
+ bool CCtrlScroll::parse(xmlNodePtr node, CInterfaceGroup * parentGroup)
+ {
+ if (!CCtrlBase::parse(node, parentGroup))
+ return false;
+
+ CXMLAutoPtr prop;
+ // Read textures
+ prop = (char*) xmlGetProp( node, (xmlChar*)"tx_bottomleft" );
+ if(prop) setTextureBottomOrLeft(string((const char*)prop));
+ else setTextureBottomOrLeft ("w_scroll_l0_b.tga");
+
+ prop = (char*) xmlGetProp( node, (xmlChar*)"tx_middle" );
+ if(prop) setTextureMiddle(string((const char*)prop));
+ else setTextureMiddle ("w_scroll_l0_m.tga");
+
+ prop = (char*) xmlGetProp( node, (xmlChar*)"tx_topright" );
+ if(prop) setTextureTopOrRight(string((const char*)prop));
+ else setTextureTopOrRight ("w_scroll_l0_t.tga");
+
+ // Read properties
+ prop = (char*) xmlGetProp( node, (xmlChar*)"vertical" );
+ if (prop) _Vertical = convertBool((const char*)prop);
+
+ prop = (char*) xmlGetProp (node, (xmlChar*)"align");
+ _Aligned = 1;
+ if (prop)
+ {
+ if (stricmp(prop, "T") == 0) _Aligned = 0;
+ else if (stricmp(prop, "B") == 0) _Aligned = 1;
+ else if (stricmp(prop, "L") == 0) _Aligned = 2;
+ else if (stricmp(prop, "R") == 0) _Aligned = 3;
+ }
+
+ prop = (char*) xmlGetProp( node, (xmlChar*)"min" );
+ if (prop) fromString((const char*)prop, _Min);
+
+ prop = (char*) xmlGetProp( node, (xmlChar*)"max" );
+ if (prop) fromString((const char*)prop, _Max);
+
+ prop = (char*) xmlGetProp( node, (xmlChar*)"value" );
+ if (prop)
+ {
+ if ( isdigit(*prop) || *prop=='-')
+ {
+ _IsDBLink = false;
+ fromString((const char*)prop, _Value);
+ }
+ else
+ {
+ _IsDBLink = true;
+ _DBLink.link(prop);
+ ICDBNode::CTextId textId;
+ _DBLink.getNodePtr()->addObserver(this, textId);
+
+ }
+ }
+
+ prop = (char*) xmlGetProp( node, (xmlChar*)"tracksize" );
+ if (prop) fromString((const char*)prop, _TrackSize);
+
+ // Read Action handlers
+ prop = (char*) xmlGetProp( node, (xmlChar*)"onscroll" );
+ if (prop) _AHOnScroll = NLMISC::strlwr(prop);
+ prop = (char*) xmlGetProp( node, (xmlChar*)"params" );
+ if (prop) _AHOnScrollParams = string((const char*)prop);
+ //
+ prop = (char*) xmlGetProp( node, (xmlChar*)"onscrollend" );
+ if (prop) _AHOnScrollEnd = NLMISC::strlwr(prop);
+ prop = (char*) xmlGetProp( node, (xmlChar*)"end_params" );
+ if (prop) _AHOnScrollEndParams = string((const char*)prop);
+ //
+ prop = (char*) xmlGetProp( node, (xmlChar*)"onscrollcancel" );
+ if (prop) _AHOnScrollCancel = NLMISC::strlwr(prop);
+ prop = (char*) xmlGetProp( node, (xmlChar*)"cancel_params" );
+ if (prop) _AHOnScrollCancelParams = string((const char*)prop);
+
+
+ // auto-target
+ prop = (char*) xmlGetProp( node, (xmlChar*)"target" );
+ if (prop)
+ {
+ CInterfaceGroup *group = dynamic_cast(CWidgetManager::getInstance()->getElementFromId(prop));
+ if(group == NULL)
+ group = dynamic_cast(CWidgetManager::getInstance()->getElementFromId(this->getId(), prop));
+
+ if(group != NULL)
+ setTarget (group);
+ }
+
+
+ // auto-step
+ prop = (char*) xmlGetProp( node, (xmlChar*)"target_stepx" );
+ if(prop) fromString((const char*)prop, _TargetStepX);
+ prop = (char*) xmlGetProp( node, (xmlChar*)"target_stepy" );
+ if(prop) fromString((const char*)prop, _TargetStepY);
+ _TargetStepX= max((sint32)1, _TargetStepX);
+ _TargetStepY= max((sint32)1, _TargetStepY);
+
+ // Scroll Step
+ prop = (char*) xmlGetProp( node, (xmlChar*)"step_value" );
+ if(prop) fromString((const char*)prop, _StepValue);
+
+ prop = (char*) xmlGetProp( node, (xmlChar*)"cancelable" );
+ if (prop) _Cancelable = convertBool(prop);
+
+ prop= (char*) xmlGetProp (node, (xmlChar*)"frozen");
+ _Frozen = false;
+ if (prop)
+ _Frozen = convertBool(prop);
+
+
+ return true;
+ }
+
+ // ------------------------------------------------------------------------------------------------
+
+ int CCtrlScroll::luaSetTarget(CLuaState &ls)
+ {
+ const char *funcName = "setTarget";
+ CLuaIHM::checkArgCount(ls, funcName, 1);
+ CLuaIHM::checkArgType(ls, funcName, 1, LUA_TSTRING);
+ std::string targetId = ls.toString(1);
+
+ CInterfaceGroup *group = dynamic_cast(CWidgetManager::getInstance()->getElementFromId(targetId));
+ if(group != NULL)
+ {
+ setTarget (group);
+ }
+
+ return 0;
+ }
+
+ void CCtrlScroll::updateCoords()
+ {
+ if (_Target)
+ {
+ // update only if visible
+ if (_Target->getActive())
+ {
+ CViewRenderer &rVR = *CViewRenderer::getInstance();
+ sint32 w, h;
+ rVR.getTextureSizeFromId (_TxIdB, w, h);
+
+ if (_Vertical)
+ {
+ _W = w;
+ _H = _Target->getMaxHReal();
+ }
+ else
+ {
+ _W = _Target->getMaxWReal();
+ _H = h;
+ }
+
+ CCtrlBase::updateCoords ();
+ if (_Vertical)
+ {
+ if(_Target->getHReal()!=_LastTargetHReal || _Target->getMaxHReal()!=_LastTargetMaxHReal ||
+ _Target->getOfsY() != _LastTargetOfsY
+ )
+ {
+ _LastTargetHReal= _Target->getHReal();
+ _LastTargetMaxHReal= _Target->getMaxHReal();
+ _LastTargetOfsY = _Target->getOfsY();
+
+ // Activate only if needed
+ setActive(_Target->getHReal() > _Target->getMaxHReal());
+ CCtrlBase::updateCoords();
+
+ // Calculate size of the track button
+ if ((_Target->getHReal() <= _Target->getMaxHReal()) || (_Target->getHReal() == 0))
+ {
+ _TrackSize = _Target->getMaxHReal();
+ }
+ else
+ {
+ float factor = (float)_Target->getMaxHReal() / (float)_Target->getHReal();
+ factor = _TrackSizeMin + factor * (this->getHReal() - _TrackSizeMin);
+ _TrackSize = (sint32)factor;
+ }
+ // Calculate pos of the track button
+ if (_Target->getHReal() <= _Target->getMaxHReal())
+ {
+ if (_Aligned == 1) // BOTTOM
+ _TrackPos = 0;
+ else // TOP
+ _TrackPos = getHReal()-_TrackSize;
+ }
+ else
+ {
+ if (_Aligned == 1) // BOTTOM
+ {
+ float factor = ((float)_Target->getHReal() - (float)_Target->getMaxHReal());
+ factor = -(float)_Target->getOfsY() / factor;
+ if (factor < 0.0f) factor = 0.0f;
+ if (factor > 1.0f) factor = 1.0f;
+ factor = factor * (getHReal()-_TrackSize);
+ _TrackPos = (sint32)factor;
+ }
+ else // TOP
+ {
+ float factor = ((float)_Target->getHReal() - (float)_Target->getMaxHReal());
+ factor = (float)_Target->getOfsY() / factor;
+ if (factor < 0.0f) factor = 0.0f;
+ if (factor > 1.0f) factor = 1.0f;
+ sint32 hreal = getHReal();
+ factor = (1.0f-factor) * (hreal - _TrackSize);
+ _TrackPos = (sint32)factor;
+ }
+ }
+
+ // invalidate coords.
+ computeTargetOfsFromPos();
+ }
+ }
+ else // Horizontal Tracker
+ {
+ if(_Target->getWReal()!=_LastTargetWReal || _Target->getMaxWReal()!=_LastTargetMaxWReal ||
+ _Target->getOfsX() != _LastTargetOfsX)
+ {
+ _LastTargetWReal= _Target->getWReal();
+ _LastTargetMaxWReal= _Target->getMaxWReal();
+ _LastTargetOfsX = _Target->getOfsX();
+
+ // Activate only if needed
+ setActive(_Target->getWReal() > _Target->getMaxWReal());
+ CCtrlBase::updateCoords();
+
+ // Calculate size of the track button
+ if ((_Target->getWReal() <= _Target->getMaxWReal()) || (_Target->getWReal() == 0))
+ {
+ _TrackSize = _Target->getMaxWReal();
+ }
+ else
+ {
+ float factor = (float)_Target->getMaxWReal() / (float)_Target->getWReal();
+ factor = _TrackSizeMin + factor * (this->getWReal() - _TrackSizeMin);
+ _TrackSize = (sint32)factor;
+ }
+ // Calculate pos of the track button
+ if (_Target->getWReal() <= _Target->getMaxWReal())
+ {
+ if (_Aligned == 2) // LEFT
+ _TrackPos = 0;
+ else // RIGHT
+ _TrackPos = getWReal()-_TrackSize;
+ }
+ else
+ {
+ if (_Aligned == 2) // LEFT
+ {
+ float factor = ((float)_Target->getWReal() - (float)_Target->getMaxWReal());
+ factor = -(float)_Target->getOfsX() / factor;
+ if (factor < 0.0f) factor = 0.0f;
+ if (factor > 1.0f) factor = 1.0f;
+ factor = factor * (getWReal()-_TrackSize);
+ _TrackPos = (sint32)factor;
+ }
+ else // RIGHT
+ {
+ float factor = ((float)_Target->getWReal() - (float)_Target->getMaxWReal());
+ factor = (float)_Target->getOfsX() / factor;
+ if (factor < 0.0f) factor = 0.0f;
+ if (factor > 1.0f) factor = 1.0f;
+ sint32 hreal = getWReal();
+ factor = (1.0f-factor) * (hreal - _TrackSize);
+ _TrackPos = (sint32)factor;
+ }
+ }
+
+ // invalidate coords.
+ computeTargetOfsFromPos();
+ }
+ }
+ }
+ // reset cache
+ else
+ {
+ _LastTargetHReal= 0;
+ _LastTargetMaxHReal= 0;
+ _LastTargetWReal= 0;
+ _LastTargetMaxWReal= 0;
+ _LastTargetOfsX = 0;
+ _LastTargetOfsY = 0;
+ setActive(false);
+ }
+ }
+ else
+ {
+ CCtrlBase::updateCoords ();
+ if (_IsDBLink)
+ _Value = _DBLink.getSInt32();
+ if (_Vertical)
+ {
+ float factor;
+ if (_Aligned == 1) // BOTTOM
+ factor = ((float)_Value-_Min) / (_Max-_Min);
+ else // TOP
+ factor = 1.0f - ((float)_Value-_Min) / (_Max-_Min);
+ factor *= (this->getHReal() - _TrackSize);
+
+ _TrackDispPos = (sint32)factor;
+ }
+ else
+ {
+ float factor;
+ if (_Aligned == 2) // LEFT
+ factor = ((float)_Value-_Min) / (_Max-_Min);
+ else // RIGHT
+ factor = 1.0f - ((float)_Value-_Min) / (_Max-_Min);
+ factor *= (this->getWReal() - _TrackSize);
+
+ _TrackDispPos = (sint32)factor;
+ }
+ }
+ CCtrlBase::updateCoords ();
+ }
+
+ // ------------------------------------------------------------------------------------------------
+ void CCtrlScroll::draw()
+ {
+ CViewRenderer &rVR = *CViewRenderer::getInstance();
+ CRGBA col = CWidgetManager::getInstance()->getGlobalColorForContent();
+
+ if (_Target)
+ {
+ if (_Vertical)
+ {
+ rVR.drawRotFlipBitmap (_RenderLayer, _XReal, _YReal+_TrackPos, _WReal, 4, 0, false, _TxIdB, col );
+ if (_TileM == 0)
+ rVR.drawRotFlipBitmap (_RenderLayer, _XReal, _YReal+_TrackPos+4, _WReal, _TrackSize-8, 0, false, _TxIdM, col );
+ else
+ rVR.drawRotFlipBitmapTiled (_RenderLayer, _XReal, _YReal+_TrackPos+4, _WReal, _TrackSize-8, 0, false, _TxIdM, _TileM-1, col );
+ rVR.drawRotFlipBitmap (_RenderLayer, _XReal, _YReal+_TrackPos+_TrackSize-4, _WReal, 4, 0, false, _TxIdT, col );
+ }
+ else
+ {
+ rVR.drawRotFlipBitmap (_RenderLayer, _XReal+_TrackPos, _YReal, 4, _HReal, 0, false, _TxIdB, col );
+ if (_TileM == 0)
+ rVR.drawRotFlipBitmap (_RenderLayer, _XReal+_TrackPos+4, _YReal, _TrackSize-8, _HReal, 0, false, _TxIdM, col );
+ else
+ rVR.drawRotFlipBitmapTiled (_RenderLayer, _XReal+_TrackPos+4, _YReal, _TrackSize-8, _HReal, 0, false, _TxIdM, _TileM-1, col );
+ rVR.drawRotFlipBitmap (_RenderLayer, _XReal+_TrackPos+_TrackSize-4, _YReal, 4, _HReal, 0, false, _TxIdT, col );
+ }
+ }
+ else
+ {
+ if (_Vertical)
+ {
+ rVR.drawRotFlipBitmap (_RenderLayer, _XReal, _YReal+_TrackDispPos, _WReal, 4, 0, false, _TxIdB, col );
+ if (_TileM == 0)
+ rVR.drawRotFlipBitmap (_RenderLayer, _XReal, _YReal+_TrackDispPos+4, _WReal, _TrackSize-8, 0, false, _TxIdM, col );
+ else
+ rVR.drawRotFlipBitmapTiled (_RenderLayer, _XReal, _YReal+_TrackDispPos+4, _WReal, _TrackSize-8, 0, false, _TxIdM, _TileM-1, col );
+ rVR.drawRotFlipBitmap (_RenderLayer, _XReal, _YReal+_TrackDispPos+_TrackSize-4, _WReal, 4, 0, false, _TxIdT, col );
+ }
+ else
+ {
+ rVR.drawRotFlipBitmap (_RenderLayer, _XReal+_TrackDispPos, _YReal, 4, _HReal, 0, false, _TxIdB, col );
+ if (_TileM == 0)
+ rVR.drawRotFlipBitmap (_RenderLayer, _XReal+_TrackDispPos+4, _YReal, _TrackSize-8, _HReal, 0, false, _TxIdM, col );
+ else
+ rVR.drawRotFlipBitmapTiled (_RenderLayer, _XReal+_TrackDispPos+4, _YReal, _TrackSize-8, _HReal, 0, false, _TxIdM, _TileM-1, col );
+ rVR.drawRotFlipBitmap (_RenderLayer, _XReal+_TrackDispPos+_TrackSize-4, _YReal, 4, _HReal, 0, false, _TxIdT, col );
+ }
+ }
+ }
+
+ // ------------------------------------------------------------------------------------------------
+ bool CCtrlScroll::handleEvent (const NLGUI::CEventDescriptor &event)
+ {
+ if (CCtrlBase::handleEvent(event)) return true;
+ if (!_Active || _Frozen)
+ return false;
+ if (event.getType() == NLGUI::CEventDescriptor::mouse)
+ {
+ const NLGUI::CEventDescriptorMouse &eventDesc = (const NLGUI::CEventDescriptorMouse &)event;
+ if ((CWidgetManager::getInstance()->getCapturePointerLeft() != this) &&
+ (!((eventDesc.getX() >= _XReal) &&
+ (eventDesc.getX() < (_XReal + _WReal))&&
+ (eventDesc.getY() > _YReal) &&
+ (eventDesc.getY() <= (_YReal+ _HReal)))))
+ return false;
+
+ if (eventDesc.getEventTypeExtended() == NLGUI::CEventDescriptorMouse::mouseleftdown)
+ {
+ _MouseDown = true;
+ _InitialValue = getValue();
+ if (!_Target)
+ _TrackPos = _TrackDispPos;
+ _MouseDownOffsetX = eventDesc.getX() - (getXReal() + (_Vertical ? 0 : _TrackPos));
+ _MouseDownOffsetY = eventDesc.getY() - (getYReal() + (_Vertical ? _TrackPos : 0));
+
+ // if target is a menu, hidde its sub menus
+ if(_Target && _Target->getParent())
+ {
+ CGroupSubMenuBase *menu = dynamic_cast(_Target->getParent());
+ if(menu)
+ menu->hideSubMenus();
+ }
+ return true;
+ }
+ if (eventDesc.getEventTypeExtended() == NLGUI::CEventDescriptorMouse::mouseleftup)
+ {
+ _MouseDown = false;
+ runAH(_AHOnScrollEnd, _AHOnScrollEndParams.empty() ? _AHOnScrollParams : _AHOnScrollEndParams); // backward compatibility
+ return true;
+ }
+ if (eventDesc.getEventTypeExtended() == NLGUI::CEventDescriptorMouse::mouserightdown && _MouseDown && _Cancelable)
+ {
+ _MouseDown = false;
+ setValue(_InitialValue);
+ runAH(_AHOnScrollCancel, _AHOnScrollCancelParams); // backward compatibility
+ return true;
+ }
+ if (eventDesc.getEventTypeExtended() == NLGUI::CEventDescriptorMouse::mousemove)
+ {
+ if (_MouseDown)
+ {
+ sint32 dx = eventDesc.getX() - (getXReal() + (_Vertical ? 0 : _TrackPos) + _MouseDownOffsetX);
+ sint32 dy = eventDesc.getY() - (getYReal() + (_Vertical ? _TrackPos : 0 ) + _MouseDownOffsetY);
+ if (dx != 0) moveTrackX (dx);
+ if (dy != 0) moveTrackY (dy);
+ }
+ return true;
+ }
+ if (eventDesc.getEventTypeExtended() == NLGUI::CEventDescriptorMouse::mousewheel && _Vertical)
+ {
+ moveTrackY (eventDesc.getWheel() * 12);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ // ------------------------------------------------------------------------------------------------
+ void CCtrlScroll::setTarget (CInterfaceGroup *pIG)
+ {
+ _Target = pIG;
+
+ if (_Vertical)
+ {
+ if (_Target->getPosRef()&Hotspot_Tx)
+ _Aligned = 0;
+ else
+ _Aligned = 1;
+
+ if (_Target->getPosRef()&Hotspot_Tx)
+ _Inverted = true;
+ else
+ _Inverted = true;
+ }
+ else
+ {
+ if (_Target->getPosRef()&Hotspot_xL)
+ _Aligned = 2;
+ else
+ _Aligned = 3;
+
+ if (_Target->getPosRef()&Hotspot_xL)
+ _Inverted = true;
+ else
+ _Inverted = true;
+ }
+ }
+ // ------------------------------------------------------------------------------------------------
+ sint32 CCtrlScroll::moveTrackX (sint32 dx)
+ {
+ if (_Vertical)
+ return 0;
+ if ((getWReal()-_TrackSize) <= 0)
+ return 0;
+
+ sint32 newtpos;
+ sint32 tpos = _TrackPos;
+ sint32 tsize = _TrackSize;
+
+ // Limit the scroller to the defined area
+ newtpos = tpos + dx;
+ if (newtpos < 0) newtpos = 0;
+ if (newtpos > (getWReal()-tsize)) newtpos = (getWReal()-tsize);
+ dx = newtpos - tpos;
+
+ if (_Target)
+ {
+ _TrackPos = newtpos;
+
+ computeTargetOfsFromPos();
+ }
+ else // This is a number scroller
+ {
+ float factor = (float)(_Max - _Min);
+
+ if (_Aligned == 2) // LEFT
+ factor = -factor * newtpos / (float)(getWReal()-tsize) - _Min;
+ else // RIGHT
+ factor = factor * (1.0f-(newtpos / (float)(getWReal()-tsize))) + _Min;
+
+ _TrackPos = newtpos;
+
+ if (_Aligned == 2) // LEFT
+ _Value = (sint32) (_Inverted ? factor : -factor);
+ else // RIGHT
+ _Value = (sint32) (_Inverted ? factor : -factor);
+
+ // step and clamp value
+ normalizeValue(_Value);
+
+ {
+ float factor;
+ if (_Aligned == 2) // LEFT
+ factor = ((float)_Value-_Min) / (_Max-_Min);
+ else // RIGHT
+ factor = 1.0f - ((float)_Value-_Min) / (_Max-_Min);
+ factor *= (this->getWReal() - _TrackSize);
+
+ _TrackDispPos = (sint32)factor;
+ }
+
+ if (_IsDBLink)
+ {
+ _ObserverOn = false;
+ _DBLink.setSInt32 (_Value);
+ _ObserverOn = true;
+ }
+ }
+
+ // Launch the scroller event if any
+ runAH(_AHOnScroll, _AHOnScrollParams);
+
+ return dx;
+ }
+
+ // ------------------------------------------------------------------------------------------------
+ sint32 CCtrlScroll::moveTrackY (sint32 dy)
+ {
+ if (!_Vertical)
+ return 0;
+ if ((getHReal()-_TrackSize) <= 0)
+ return 0;
+
+ sint32 newtpos;
+ sint32 tpos = _TrackPos;
+ sint32 tsize = _TrackSize;
+
+ // Limit the scroller to the defined area
+ newtpos = tpos + dy;
+ if (newtpos < 0) newtpos = 0;
+ if (newtpos > (getHReal()-tsize)) newtpos = (getHReal()-tsize);
+ dy = newtpos - tpos;
+
+ if (_Target)
+ {
+ _TrackPos = newtpos;
+
+ computeTargetOfsFromPos();
+ }
+ else // This is a number scroller
+ {
+ float factor = (float)(_Max - _Min);
+
+ if (_Aligned == 1) // BOTTOM
+ factor = -factor * newtpos / (float)(getHReal()-tsize) - _Min;
+ else // TOP
+ factor = factor * (1.0f-(newtpos / (float)(getHReal()-tsize))) + _Min;
+
+ _TrackPos = newtpos;
+
+ if (_Aligned == 1) // BOTTOM
+ _Value = (sint32) (_Inverted ? factor : -factor);
+ else // TOP
+ _Value = (sint32) (_Inverted ? factor : -factor);
+
+ // step and clamp value
+ normalizeValue(_Value);
+
+ {
+ float factor;
+ if (_Aligned == 1) // BOTTOM
+ factor = ((float)_Value-_Min) / (_Max-_Min);
+ else // TOP
+ factor = 1.0f - ((float)_Value-_Min) / (_Max-_Min);
+ factor *= (this->getHReal() - _TrackSize);
+
+ _TrackDispPos = (sint32)factor;
+ }
+
+ if (_IsDBLink)
+ {
+ _ObserverOn = false;
+ _DBLink.setSInt32 (_Value);
+ _ObserverOn = true;
+ }
+ }
+
+ // Launch the scroller event if any
+ runAH(_AHOnScroll, _AHOnScrollParams);
+
+ return dy;
+ }
+
+ // ------------------------------------------------------------------------------------------------
+ void CCtrlScroll::setTextureBottomOrLeft (const std::string &txName)
+ {
+ CViewRenderer &rVR = *CViewRenderer::getInstance();
+ _TxIdB = rVR.getTextureIdFromName(txName);
+ }
+
+ // ------------------------------------------------------------------------------------------------
+ void CCtrlScroll::setTextureMiddle (const std::string &txName)
+ {
+ CViewRenderer &rVR = *CViewRenderer::getInstance();
+ _TxIdM = rVR.getTextureIdFromName(txName);
+ }
+
+ // ------------------------------------------------------------------------------------------------
+ void CCtrlScroll::setTextureTopOrRight (const std::string &txName)
+ {
+ CViewRenderer &rVR = *CViewRenderer::getInstance();
+ _TxIdT = rVR.getTextureIdFromName(txName);
+ }
+
+ // ------------------------------------------------------------------------------------------------
+ void CCtrlScroll::setValue(sint32 value)
+ {
+ normalizeValue(value);
+
+ if (_IsDBLink)
+ {
+ _ObserverOn = false;
+ _DBLink.setSInt32(value);
+ _ObserverOn = true;
+ }
+ else
+ {
+ _Value = value;
+ }
+ invalidateCoords();
+ }
+
+ // ------------------------------------------------------------------------------------------------
+ void CCtrlScroll::setTrackPos(sint32 pos)
+ {
+ if (_Vertical)
+ {
+ moveTrackY(pos - _TrackPos);
+ }
+ else
+ {
+ moveTrackX(pos - _TrackPos);
+ }
+ invalidateCoords();
+ }
+
+ // ------------------------------------------------------------------------------------------------
+ void CCtrlScroll::computeTargetOfsFromPos()
+ {
+ if(_Vertical)
+ {
+ float factor = ((float)_Target->getHReal() - (float)_Target->getMaxHReal());
+
+ if (_Aligned == 1) // BOTTOM
+ factor = -factor * _TrackPos / favoid0((float)(getHReal()-_TrackSize));
+ else // TOP
+ factor = factor * (1.0f-(_TrackPos / favoid0((float)(getHReal()-_TrackSize))));
+
+ // Compute Steped target
+ sint32 nexOfsY= (sint32) (_Inverted ? factor : -factor);
+ if(_TargetStepY>1)
+ nexOfsY= ((nexOfsY+_TargetStepY/2)/_TargetStepY) * _TargetStepY;
+ _Target->setOfsY (nexOfsY);
+ _LastTargetOfsY = nexOfsY;
+
+ // invalidate only XReal/YReal, doing only 1 pass
+ _Target->invalidateCoords(1);
+ }
+ else
+ {
+ float factor = ((float)_Target->getWReal() - (float)_Target->getMaxWReal());
+
+ if (_Aligned == 2) // LEFT
+ factor = -factor * _TrackPos / favoid0((float)(getWReal()-_TrackSize));
+ else // RIGHT
+ factor = factor * (1.0f-(_TrackPos / favoid0((float)(getWReal()-_TrackSize))));
+
+ // Compute Steped target
+ sint32 nexOfsX= (sint32) (_Inverted ? factor : -factor);
+ if(_TargetStepX>1)
+ nexOfsX= ((nexOfsX+_TargetStepX/2)/_TargetStepX) * _TargetStepX;
+ _Target->setOfsX (nexOfsX);
+ _LastTargetOfsX = nexOfsX;
+
+ // invalidate only XReal/YReal, doing only 1 pass
+ _Target->invalidateCoords(1);
+ }
+ }
+
+ // ------------------------------------------------------------------------------------------------
+ void CCtrlScroll::update(ICDBNode * /* node */)
+ {
+ if (!_ObserverOn) return;
+ _Value = _DBLink.getSInt32();
+ // the value in the db changed
+ invalidateCoords(1);
+ if (_Target) _Target->invalidateCoords(1);
+ }
+
+
+ // ***************************************************************************
+ void CCtrlScroll::moveTargetX (sint32 dx)
+ {
+ if(!_Target)
+ return;
+ sint32 maxWReal= _Target->getMaxWReal();
+ sint32 wReal= _Target->getWReal();
+ if(wReal <= maxWReal)
+ return;
+
+ // compute the new ofsX.
+ sint32 ofsX= _Target->getOfsX();
+ ofsX+= dx;
+ clamp(ofsX, 0, wReal-maxWReal);
+ _Target->setOfsX(ofsX);
+
+ // compute new trackPos.
+ if (_Aligned == 2) // LEFT
+ {
+ float factor = (float)(wReal-maxWReal);
+ factor = -(float)ofsX / factor;
+ clamp(factor, 0.f, 1.f);
+ factor = factor * (getWReal()-_TrackSize);
+ _TrackPos = (sint32)factor;
+ }
+ else // RIGHT
+ {
+ float factor = (float)(wReal-maxWReal);
+ factor = (float)ofsX / factor;
+ clamp(factor, 0.f, 1.f);
+ factor = (1.0f-factor) * (getWReal() - _TrackSize);
+ _TrackPos = (sint32)factor;
+ }
+
+ // invalidate only position. 1 pass is sufficient
+ invalidateCoords(1);
+ }
+
+ // ***************************************************************************
+ void CCtrlScroll::moveTargetY (sint32 dy)
+ {
+ if(!_Target)
+ return;
+ sint32 maxHReal= _Target->getMaxHReal();
+ sint32 hReal= _Target->getHReal();
+ if(hReal <= maxHReal)
+ return;
+
+ // compute the new ofsY.
+ sint32 ofsY= _Target->getOfsY();
+ ofsY+= dy;
+
+ // compute new trackPos.
+ if (_Aligned == 1) // BOTTOM
+ {
+ clamp(ofsY, maxHReal - hReal, 0);
+ _Target->setOfsY(ofsY);
+ float factor = (float)(hReal-maxHReal);
+ factor = -(float)ofsY / factor;
+ clamp(factor, 0.f, 1.f);
+ factor = factor * (getHReal()-_TrackSize);
+ _TrackPos = (sint32)factor;
+ }
+ else // TOP
+ {
+ clamp(ofsY, 0, hReal-maxHReal);
+ _Target->setOfsY(ofsY);
+ float factor = (float)(hReal-maxHReal);
+ factor = (float)ofsY / factor;
+ clamp(factor, 0.f, 1.f);
+ factor = (1.0f-factor) * (getHReal() - _TrackSize);
+ _TrackPos = (sint32)factor;
+ }
+
+ // invalidate only position. 1 pass is sufficient
+ invalidateCoords(1);
+ }
+
+ // ***************************************************************************
+ void CCtrlScroll::normalizeValue(sint32 &value)
+ {
+ // if, 0 no step
+ if(_StepValue==0 || _StepValue==1)
+ return;
+ // if interval is null, force min!
+ if(_Max==_Min)
+ {
+ value= _Min;
+ return;
+ }
+
+ // get range of possible position
+ // sint32 size= _Max - _Min;
+
+ // step (round)
+ sint32 val= (value + (_StepValue/2) -_Min) / _StepValue;
+ val= _Min + val * _StepValue;
+ clamp(val, _Min, _Max);
+ value= val;
+ }
+
+ // ***************************************************************************
+ void CCtrlScroll::setFrozen (bool state)
+ {
+ _Frozen = state;
+ if (_Frozen)
+ {
+ _Value = 0;
+ }
+ }
+
+
+ // ------------------------------------------------------------------------------------------------
+ int CCtrlScroll::luaEnsureVisible(CLuaState &ls)
+ {
+ const char *funcName = "ensureVisible";
+ CLuaIHM::checkArgCount(ls, funcName, 3);
+ CLuaIHM::checkArgTypeUIElement(ls, funcName, 1);
+ CLuaIHM::checkArgType(ls, funcName, 2, LUA_TSTRING);
+ CLuaIHM::checkArgType(ls, funcName, 3, LUA_TSTRING);
+ THotSpot hs[2];
+ std::string hsStr[] = { ls.toString(2), ls.toString(3) };
+ //
+ for (uint hsIndex = 0; hsIndex < 2; ++ hsIndex)
+ {
+ if (_Vertical)
+ {
+ if (NLMISC::nlstricmp(hsStr[hsIndex], "T") == 0)
+ {
+ hs[hsIndex] = Hotspot_Tx;
+ }
+ else
+ if (NLMISC::nlstricmp(hsStr[hsIndex], "M") == 0)
+ {
+ hs[hsIndex] = Hotspot_Mx;
+ }
+ else
+ if (NLMISC::nlstricmp(hsStr[hsIndex], "B") == 0)
+ {
+ hs[hsIndex] = Hotspot_Bx;
+ }
+ else
+ {
+ CLuaIHM::fails(ls, "%s : couldn't parse hotspot for vertical scrollbar", funcName);
+ }
+ }
+ else
+ {
+ if (NLMISC::nlstricmp(hsStr[hsIndex], "L") == 0)
+ {
+ hs[hsIndex] = Hotspot_xL;
+ }
+ else
+ if (NLMISC::nlstricmp(hsStr[hsIndex], "M") == 0)
+ {
+ hs[hsIndex] = Hotspot_xM;
+ }
+ else
+ if (NLMISC::nlstricmp(hsStr[hsIndex], "R") == 0)
+ {
+ hs[hsIndex] = Hotspot_xR;
+ }
+ else
+ {
+ CLuaIHM::fails(ls, "%s : couldn't parse hotspot for horizontal scrollbar", funcName);
+ }
+ }
+ }
+ ensureVisible(CLuaIHM::getUIOnStack(ls, 1), hs[0], hs[1]);
+ return 0;
+ }
+
+
+ // ------------------------------------------------------------------------------------------------
+ void CCtrlScroll::ensureVisible(CInterfaceElement *childElement, THotSpot childHotSpot, THotSpot parentHotSpot)
+ {
+ if (!_Target) return; // not connected to a target yet
+ if (!childElement) return;
+ // compute corners of interest for enclosed element & enclosing group
+ sint32 childX, childY;
+ childElement->getCorner(childX, childY, childHotSpot);
+ if (_Vertical)
+ {
+ sint32 maxHReal= _Target->getMaxHReal();
+ sint32 hReal= _Target->getHReal();
+ if(hReal > maxHReal)
+ {
+ sint enclosingDY;
+ switch (parentHotSpot)
+ {
+ case Hotspot_Bx:
+ enclosingDY = maxHReal;
+ break;
+ case Hotspot_Mx:
+ enclosingDY = maxHReal / 2;
+ break;
+ case Hotspot_Tx:
+ enclosingDY = 0;
+ break;
+ default:
+ nlassert(0);
+ break;
+ }
+ if (_Aligned == 0)
+ {
+ // Top aligned case
+ sint32 offsetY = (_Target->getYReal() + _Target->getHReal() - childY) - enclosingDY;
+ NLMISC::clamp(offsetY, 0, hReal - maxHReal);
+ _Target->setOfsY(offsetY);
+ _Target->invalidateCoords();
+ }
+ else if (_Aligned == 1)
+ {
+ // Bottom aligned case
+ sint32 offsetY = (maxHReal - enclosingDY) - (childY - _Target->getYReal());
+ NLMISC::clamp(offsetY, maxHReal - hReal, 0);
+ _Target->setOfsY(offsetY);
+ _Target->invalidateCoords();
+ }
+ }
+ // else, ... fully visible (not occluded by parent group)
+ }
+ else
+ {
+ sint32 maxWReal= _Target->getMaxWReal();
+ sint32 wReal= _Target->getWReal();
+ if(wReal > maxWReal)
+ {
+ sint enclosingDX;
+ switch (parentHotSpot)
+ {
+ case Hotspot_xL:
+ enclosingDX = maxWReal;
+ break;
+ case Hotspot_xM:
+ enclosingDX = maxWReal / 2;
+ break;
+ case Hotspot_xR:
+ enclosingDX = 0;
+ break;
+ default:
+ nlassert(0);
+ break;
+ }
+ if (_Aligned == 3)
+ {
+ // right aligned case
+ sint32 offsetX = (_Target->getXReal() + _Target->getWReal() - childX) - enclosingDX;
+ NLMISC::clamp(offsetX, 0, wReal - maxWReal);
+ _Target->setOfsX(offsetX);
+ _Target->invalidateCoords();
+ }
+ else if (_Aligned == 2)
+ {
+ // Left aligned case
+ sint32 offsetX = (maxWReal - enclosingDX) - (childX - _Target->getXReal());
+ NLMISC::clamp(offsetX, maxWReal - wReal, 0);
+ _Target->setOfsX(offsetX);
+ _Target->invalidateCoords();
+ }
+ }
+ // else, ... fully visible (not occluded by parent group)
+ }
+ }
+}
+
diff --git a/code/nel/src/gui/group_submenu_base.cpp b/code/nel/src/gui/group_submenu_base.cpp
new file mode 100644
index 000000000..365f3f85e
--- /dev/null
+++ b/code/nel/src/gui/group_submenu_base.cpp
@@ -0,0 +1,47 @@
+// Ryzom - MMORPG Framework
+// 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 .
+
+
+#include "nel/gui/group_submenu_base.h"
+
+namespace NLGUI
+{
+
+ CGroupSubMenuBase::CGroupSubMenuBase( const NLGUI::CViewBase::TCtorParam ¶m ) :
+ CGroupFrame( param )
+ {
+ }
+
+ CGroupSubMenuBase::~CGroupSubMenuBase()
+ {
+ }
+
+ void CGroupSubMenuBase::openSubMenu( sint32 nb )
+ {
+ // Necessary because it's supposed to be an abstract class,
+ // however reflection requires the class to be instantiated.
+ nlassert( false );
+ }
+
+ void CGroupSubMenuBase::hideSubMenus()
+ {
+ // Necessary because it's supposed to be an abstract class,
+ // however reflection requires the class to be instantiated.
+ nlassert( false );
+ }
+
+}
+
diff --git a/code/ryzom/client/src/interface_v3/ctrl_scroll.cpp b/code/ryzom/client/src/interface_v3/ctrl_scroll.cpp
deleted file mode 100644
index 834d3ee5e..000000000
--- a/code/ryzom/client/src/interface_v3/ctrl_scroll.cpp
+++ /dev/null
@@ -1,1058 +0,0 @@
-// Ryzom - MMORPG Framework
-// 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 .
-
-
-#include "interface_manager.h"
-#include "nel/gui/widget_manager.h"
-#include "ctrl_scroll.h"
-#include "nel/misc/xml_auto_ptr.h"
-#include "group_menu.h"
-
-#include "nel/gui/lua_ihm.h"
-#include "lua_ihm_ryzom.h"
-
-using namespace NLMISC;
-using namespace std;
-
-NLMISC_REGISTER_OBJECT(CViewBase, CCtrlScroll, std::string, "scroll");
-
-// ------------------------------------------------------------------------------------------------
-CCtrlScroll::CCtrlScroll(const TCtorParam ¶m)
-: CCtrlScrollBase(param)
-{
- _Vertical = true;
- _Aligned = 1;
- _TrackPos = 0;
- _TrackDispPos = 0;
- _TrackSize = _TrackSizeMin = 16;
- _Min = 0;
- _Max = 100;
- _Value = 0;
- _InitialValue = 0;
- _MouseDown = false;
- _CallingAH = false;
- _Cancelable = false;
- _Target = NULL;
- _Inverted = false;
- _IsDBLink = false;
- _LastTargetHReal = 0;
- _LastTargetMaxHReal = 0;
- _LastTargetWReal = 0;
- _LastTargetMaxWReal = 0;
- _LastTargetOfsX = 0;
- _LastTargetOfsY = 0;
- _ObserverOn = true;
- _TargetStepX = 1;
- _TargetStepY = 1;
- _StepValue = 0;
- _TileM = false;
- _Frozen = false;
-}
-
-// ------------------------------------------------------------------------------------------------
-void CCtrlScroll::runAH(const std::string &name, const std::string ¶ms)
-{
- if (name.empty()) return;
- if (_CallingAH) return; // avoid infinite loop
- _CallingAH = true;
- CAHManager::getInstance()->runActionHandler(name, this, params);
- _CallingAH = false;
-}
-
-// ------------------------------------------------------------------------------------------------
-CCtrlScroll::~CCtrlScroll()
-{
- if (_IsDBLink)
- {
- ICDBNode::CTextId textId;
- _DBLink.getNodePtr()->removeObserver(this, textId);
- }
-}
-
-// ------------------------------------------------------------------------------------------------
-bool CCtrlScroll::parse(xmlNodePtr node, CInterfaceGroup * parentGroup)
-{
- if (!CCtrlBase::parse(node, parentGroup))
- return false;
-
- CXMLAutoPtr prop;
- // Read textures
- prop = (char*) xmlGetProp( node, (xmlChar*)"tx_bottomleft" );
- if(prop) setTextureBottomOrLeft(string((const char*)prop));
- else setTextureBottomOrLeft ("w_scroll_l0_b.tga");
-
- prop = (char*) xmlGetProp( node, (xmlChar*)"tx_middle" );
- if(prop) setTextureMiddle(string((const char*)prop));
- else setTextureMiddle ("w_scroll_l0_m.tga");
-
- prop = (char*) xmlGetProp( node, (xmlChar*)"tx_topright" );
- if(prop) setTextureTopOrRight(string((const char*)prop));
- else setTextureTopOrRight ("w_scroll_l0_t.tga");
-
- // Read properties
- prop = (char*) xmlGetProp( node, (xmlChar*)"vertical" );
- if (prop) _Vertical = convertBool((const char*)prop);
-
- prop = (char*) xmlGetProp (node, (xmlChar*)"align");
- _Aligned = 1;
- if (prop)
- {
- if (stricmp(prop, "T") == 0) _Aligned = 0;
- else if (stricmp(prop, "B") == 0) _Aligned = 1;
- else if (stricmp(prop, "L") == 0) _Aligned = 2;
- else if (stricmp(prop, "R") == 0) _Aligned = 3;
- }
-
- prop = (char*) xmlGetProp( node, (xmlChar*)"min" );
- if (prop) fromString((const char*)prop, _Min);
-
- prop = (char*) xmlGetProp( node, (xmlChar*)"max" );
- if (prop) fromString((const char*)prop, _Max);
-
- prop = (char*) xmlGetProp( node, (xmlChar*)"value" );
- if (prop)
- {
- if ( isdigit(*prop) || *prop=='-')
- {
- _IsDBLink = false;
- fromString((const char*)prop, _Value);
- }
- else
- {
- _IsDBLink = true;
- _DBLink.link(prop);
- ICDBNode::CTextId textId;
- _DBLink.getNodePtr()->addObserver(this, textId);
-
- }
- }
-
- prop = (char*) xmlGetProp( node, (xmlChar*)"tracksize" );
- if (prop) fromString((const char*)prop, _TrackSize);
-
- // Read Action handlers
- prop = (char*) xmlGetProp( node, (xmlChar*)"onscroll" );
- if (prop) _AHOnScroll = NLMISC::strlwr(prop);
- prop = (char*) xmlGetProp( node, (xmlChar*)"params" );
- if (prop) _AHOnScrollParams = string((const char*)prop);
- //
- prop = (char*) xmlGetProp( node, (xmlChar*)"onscrollend" );
- if (prop) _AHOnScrollEnd = NLMISC::strlwr(prop);
- prop = (char*) xmlGetProp( node, (xmlChar*)"end_params" );
- if (prop) _AHOnScrollEndParams = string((const char*)prop);
- //
- prop = (char*) xmlGetProp( node, (xmlChar*)"onscrollcancel" );
- if (prop) _AHOnScrollCancel = NLMISC::strlwr(prop);
- prop = (char*) xmlGetProp( node, (xmlChar*)"cancel_params" );
- if (prop) _AHOnScrollCancelParams = string((const char*)prop);
-
-
- // auto-target
- prop = (char*) xmlGetProp( node, (xmlChar*)"target" );
- if (prop)
- {
- CInterfaceGroup *group = dynamic_cast(CWidgetManager::getInstance()->getElementFromId(prop));
- if(group == NULL)
- group = dynamic_cast(CWidgetManager::getInstance()->getElementFromId(this->getId(), prop));
-
- if(group != NULL)
- setTarget (group);
- }
-
-
- // auto-step
- prop = (char*) xmlGetProp( node, (xmlChar*)"target_stepx" );
- if(prop) fromString((const char*)prop, _TargetStepX);
- prop = (char*) xmlGetProp( node, (xmlChar*)"target_stepy" );
- if(prop) fromString((const char*)prop, _TargetStepY);
- _TargetStepX= max((sint32)1, _TargetStepX);
- _TargetStepY= max((sint32)1, _TargetStepY);
-
- // Scroll Step
- prop = (char*) xmlGetProp( node, (xmlChar*)"step_value" );
- if(prop) fromString((const char*)prop, _StepValue);
-
- prop = (char*) xmlGetProp( node, (xmlChar*)"cancelable" );
- if (prop) _Cancelable = convertBool(prop);
-
- prop= (char*) xmlGetProp (node, (xmlChar*)"frozen");
- _Frozen = false;
- if (prop)
- _Frozen = convertBool(prop);
-
-
- return true;
-}
-
-// ------------------------------------------------------------------------------------------------
-
-int CCtrlScroll::luaSetTarget(CLuaState &ls)
-{
- const char *funcName = "setTarget";
- CLuaIHM::checkArgCount(ls, funcName, 1);
- CLuaIHM::checkArgType(ls, funcName, 1, LUA_TSTRING);
- std::string targetId = ls.toString(1);
-
- CInterfaceGroup *group = dynamic_cast(CWidgetManager::getInstance()->getElementFromId(targetId));
- if(group != NULL)
- {
- setTarget (group);
- }
-
- return 0;
-}
-
-void CCtrlScroll::updateCoords()
-{
- if (_Target)
- {
- // update only if visible
- if (_Target->getActive())
- {
- CViewRenderer &rVR = *CViewRenderer::getInstance();
- sint32 w, h;
- rVR.getTextureSizeFromId (_TxIdB, w, h);
-
- if (_Vertical)
- {
- _W = w;
- _H = _Target->getMaxHReal();
- }
- else
- {
- _W = _Target->getMaxWReal();
- _H = h;
- }
-
- CCtrlBase::updateCoords ();
- if (_Vertical)
- {
- if(_Target->getHReal()!=_LastTargetHReal || _Target->getMaxHReal()!=_LastTargetMaxHReal ||
- _Target->getOfsY() != _LastTargetOfsY
- )
- {
- _LastTargetHReal= _Target->getHReal();
- _LastTargetMaxHReal= _Target->getMaxHReal();
- _LastTargetOfsY = _Target->getOfsY();
-
- // Activate only if needed
- setActive(_Target->getHReal() > _Target->getMaxHReal());
- CCtrlBase::updateCoords();
-
- // Calculate size of the track button
- if ((_Target->getHReal() <= _Target->getMaxHReal()) || (_Target->getHReal() == 0))
- {
- _TrackSize = _Target->getMaxHReal();
- }
- else
- {
- float factor = (float)_Target->getMaxHReal() / (float)_Target->getHReal();
- factor = _TrackSizeMin + factor * (this->getHReal() - _TrackSizeMin);
- _TrackSize = (sint32)factor;
- }
- // Calculate pos of the track button
- if (_Target->getHReal() <= _Target->getMaxHReal())
- {
- if (_Aligned == 1) // BOTTOM
- _TrackPos = 0;
- else // TOP
- _TrackPos = getHReal()-_TrackSize;
- }
- else
- {
- if (_Aligned == 1) // BOTTOM
- {
- float factor = ((float)_Target->getHReal() - (float)_Target->getMaxHReal());
- factor = -(float)_Target->getOfsY() / factor;
- if (factor < 0.0f) factor = 0.0f;
- if (factor > 1.0f) factor = 1.0f;
- factor = factor * (getHReal()-_TrackSize);
- _TrackPos = (sint32)factor;
- }
- else // TOP
- {
- float factor = ((float)_Target->getHReal() - (float)_Target->getMaxHReal());
- factor = (float)_Target->getOfsY() / factor;
- if (factor < 0.0f) factor = 0.0f;
- if (factor > 1.0f) factor = 1.0f;
- sint32 hreal = getHReal();
- factor = (1.0f-factor) * (hreal - _TrackSize);
- _TrackPos = (sint32)factor;
- }
- }
-
- // invalidate coords.
- computeTargetOfsFromPos();
- }
- }
- else // Horizontal Tracker
- {
- if(_Target->getWReal()!=_LastTargetWReal || _Target->getMaxWReal()!=_LastTargetMaxWReal ||
- _Target->getOfsX() != _LastTargetOfsX)
- {
- _LastTargetWReal= _Target->getWReal();
- _LastTargetMaxWReal= _Target->getMaxWReal();
- _LastTargetOfsX = _Target->getOfsX();
-
- // Activate only if needed
- setActive(_Target->getWReal() > _Target->getMaxWReal());
- CCtrlBase::updateCoords();
-
- // Calculate size of the track button
- if ((_Target->getWReal() <= _Target->getMaxWReal()) || (_Target->getWReal() == 0))
- {
- _TrackSize = _Target->getMaxWReal();
- }
- else
- {
- float factor = (float)_Target->getMaxWReal() / (float)_Target->getWReal();
- factor = _TrackSizeMin + factor * (this->getWReal() - _TrackSizeMin);
- _TrackSize = (sint32)factor;
- }
- // Calculate pos of the track button
- if (_Target->getWReal() <= _Target->getMaxWReal())
- {
- if (_Aligned == 2) // LEFT
- _TrackPos = 0;
- else // RIGHT
- _TrackPos = getWReal()-_TrackSize;
- }
- else
- {
- if (_Aligned == 2) // LEFT
- {
- float factor = ((float)_Target->getWReal() - (float)_Target->getMaxWReal());
- factor = -(float)_Target->getOfsX() / factor;
- if (factor < 0.0f) factor = 0.0f;
- if (factor > 1.0f) factor = 1.0f;
- factor = factor * (getWReal()-_TrackSize);
- _TrackPos = (sint32)factor;
- }
- else // RIGHT
- {
- float factor = ((float)_Target->getWReal() - (float)_Target->getMaxWReal());
- factor = (float)_Target->getOfsX() / factor;
- if (factor < 0.0f) factor = 0.0f;
- if (factor > 1.0f) factor = 1.0f;
- sint32 hreal = getWReal();
- factor = (1.0f-factor) * (hreal - _TrackSize);
- _TrackPos = (sint32)factor;
- }
- }
-
- // invalidate coords.
- computeTargetOfsFromPos();
- }
- }
- }
- // reset cache
- else
- {
- _LastTargetHReal= 0;
- _LastTargetMaxHReal= 0;
- _LastTargetWReal= 0;
- _LastTargetMaxWReal= 0;
- _LastTargetOfsX = 0;
- _LastTargetOfsY = 0;
- setActive(false);
- }
- }
- else
- {
- CCtrlBase::updateCoords ();
- if (_IsDBLink)
- _Value = _DBLink.getSInt32();
- if (_Vertical)
- {
- float factor;
- if (_Aligned == 1) // BOTTOM
- factor = ((float)_Value-_Min) / (_Max-_Min);
- else // TOP
- factor = 1.0f - ((float)_Value-_Min) / (_Max-_Min);
- factor *= (this->getHReal() - _TrackSize);
-
- _TrackDispPos = (sint32)factor;
- }
- else
- {
- float factor;
- if (_Aligned == 2) // LEFT
- factor = ((float)_Value-_Min) / (_Max-_Min);
- else // RIGHT
- factor = 1.0f - ((float)_Value-_Min) / (_Max-_Min);
- factor *= (this->getWReal() - _TrackSize);
-
- _TrackDispPos = (sint32)factor;
- }
- }
- CCtrlBase::updateCoords ();
-}
-
-// ------------------------------------------------------------------------------------------------
-void CCtrlScroll::draw()
-{
- CViewRenderer &rVR = *CViewRenderer::getInstance();
- CRGBA col = CWidgetManager::getInstance()->getGlobalColorForContent();
-
- if (_Target)
- {
- if (_Vertical)
- {
- rVR.drawRotFlipBitmap (_RenderLayer, _XReal, _YReal+_TrackPos, _WReal, 4, 0, false, _TxIdB, col );
- if (_TileM == 0)
- rVR.drawRotFlipBitmap (_RenderLayer, _XReal, _YReal+_TrackPos+4, _WReal, _TrackSize-8, 0, false, _TxIdM, col );
- else
- rVR.drawRotFlipBitmapTiled (_RenderLayer, _XReal, _YReal+_TrackPos+4, _WReal, _TrackSize-8, 0, false, _TxIdM, _TileM-1, col );
- rVR.drawRotFlipBitmap (_RenderLayer, _XReal, _YReal+_TrackPos+_TrackSize-4, _WReal, 4, 0, false, _TxIdT, col );
- }
- else
- {
- rVR.drawRotFlipBitmap (_RenderLayer, _XReal+_TrackPos, _YReal, 4, _HReal, 0, false, _TxIdB, col );
- if (_TileM == 0)
- rVR.drawRotFlipBitmap (_RenderLayer, _XReal+_TrackPos+4, _YReal, _TrackSize-8, _HReal, 0, false, _TxIdM, col );
- else
- rVR.drawRotFlipBitmapTiled (_RenderLayer, _XReal+_TrackPos+4, _YReal, _TrackSize-8, _HReal, 0, false, _TxIdM, _TileM-1, col );
- rVR.drawRotFlipBitmap (_RenderLayer, _XReal+_TrackPos+_TrackSize-4, _YReal, 4, _HReal, 0, false, _TxIdT, col );
- }
- }
- else
- {
- if (_Vertical)
- {
- rVR.drawRotFlipBitmap (_RenderLayer, _XReal, _YReal+_TrackDispPos, _WReal, 4, 0, false, _TxIdB, col );
- if (_TileM == 0)
- rVR.drawRotFlipBitmap (_RenderLayer, _XReal, _YReal+_TrackDispPos+4, _WReal, _TrackSize-8, 0, false, _TxIdM, col );
- else
- rVR.drawRotFlipBitmapTiled (_RenderLayer, _XReal, _YReal+_TrackDispPos+4, _WReal, _TrackSize-8, 0, false, _TxIdM, _TileM-1, col );
- rVR.drawRotFlipBitmap (_RenderLayer, _XReal, _YReal+_TrackDispPos+_TrackSize-4, _WReal, 4, 0, false, _TxIdT, col );
- }
- else
- {
- rVR.drawRotFlipBitmap (_RenderLayer, _XReal+_TrackDispPos, _YReal, 4, _HReal, 0, false, _TxIdB, col );
- if (_TileM == 0)
- rVR.drawRotFlipBitmap (_RenderLayer, _XReal+_TrackDispPos+4, _YReal, _TrackSize-8, _HReal, 0, false, _TxIdM, col );
- else
- rVR.drawRotFlipBitmapTiled (_RenderLayer, _XReal+_TrackDispPos+4, _YReal, _TrackSize-8, _HReal, 0, false, _TxIdM, _TileM-1, col );
- rVR.drawRotFlipBitmap (_RenderLayer, _XReal+_TrackDispPos+_TrackSize-4, _YReal, 4, _HReal, 0, false, _TxIdT, col );
- }
- }
-}
-
-// ------------------------------------------------------------------------------------------------
-bool CCtrlScroll::handleEvent (const NLGUI::CEventDescriptor &event)
-{
- if (CCtrlBase::handleEvent(event)) return true;
- if (!_Active || _Frozen)
- return false;
- if (event.getType() == NLGUI::CEventDescriptor::mouse)
- {
- const NLGUI::CEventDescriptorMouse &eventDesc = (const NLGUI::CEventDescriptorMouse &)event;
- if ((CWidgetManager::getInstance()->getCapturePointerLeft() != this) &&
- (!((eventDesc.getX() >= _XReal) &&
- (eventDesc.getX() < (_XReal + _WReal))&&
- (eventDesc.getY() > _YReal) &&
- (eventDesc.getY() <= (_YReal+ _HReal)))))
- return false;
-
- if (eventDesc.getEventTypeExtended() == NLGUI::CEventDescriptorMouse::mouseleftdown)
- {
- _MouseDown = true;
- _InitialValue = getValue();
- if (!_Target)
- _TrackPos = _TrackDispPos;
- _MouseDownOffsetX = eventDesc.getX() - (getXReal() + (_Vertical ? 0 : _TrackPos));
- _MouseDownOffsetY = eventDesc.getY() - (getYReal() + (_Vertical ? _TrackPos : 0));
-
- // if target is a menu, hidde its sub menus
- if(_Target && _Target->getParent())
- {
- CGroupSubMenu * menu = dynamic_cast(_Target->getParent());
- if(menu)
- menu->hideSubMenus();
- }
- return true;
- }
- if (eventDesc.getEventTypeExtended() == NLGUI::CEventDescriptorMouse::mouseleftup)
- {
- _MouseDown = false;
- runAH(_AHOnScrollEnd, _AHOnScrollEndParams.empty() ? _AHOnScrollParams : _AHOnScrollEndParams); // backward compatibility
- return true;
- }
- if (eventDesc.getEventTypeExtended() == NLGUI::CEventDescriptorMouse::mouserightdown && _MouseDown && _Cancelable)
- {
- _MouseDown = false;
- setValue(_InitialValue);
- runAH(_AHOnScrollCancel, _AHOnScrollCancelParams); // backward compatibility
- return true;
- }
- if (eventDesc.getEventTypeExtended() == NLGUI::CEventDescriptorMouse::mousemove)
- {
- if (_MouseDown)
- {
- sint32 dx = eventDesc.getX() - (getXReal() + (_Vertical ? 0 : _TrackPos) + _MouseDownOffsetX);
- sint32 dy = eventDesc.getY() - (getYReal() + (_Vertical ? _TrackPos : 0 ) + _MouseDownOffsetY);
- if (dx != 0) moveTrackX (dx);
- if (dy != 0) moveTrackY (dy);
- }
- return true;
- }
- if (eventDesc.getEventTypeExtended() == NLGUI::CEventDescriptorMouse::mousewheel && _Vertical)
- {
- moveTrackY (eventDesc.getWheel() * 12);
- return true;
- }
- }
- return false;
-}
-
-// ------------------------------------------------------------------------------------------------
-void CCtrlScroll::setTarget (CInterfaceGroup *pIG)
-{
- _Target = pIG;
-
- if (_Vertical)
- {
- if (_Target->getPosRef()&Hotspot_Tx)
- _Aligned = 0;
- else
- _Aligned = 1;
-
- if (_Target->getPosRef()&Hotspot_Tx)
- _Inverted = true;
- else
- _Inverted = true;
- }
- else
- {
- if (_Target->getPosRef()&Hotspot_xL)
- _Aligned = 2;
- else
- _Aligned = 3;
-
- if (_Target->getPosRef()&Hotspot_xL)
- _Inverted = true;
- else
- _Inverted = true;
- }
-}
-// ------------------------------------------------------------------------------------------------
-sint32 CCtrlScroll::moveTrackX (sint32 dx)
-{
- if (_Vertical)
- return 0;
- if ((getWReal()-_TrackSize) <= 0)
- return 0;
-
- sint32 newtpos;
- sint32 tpos = _TrackPos;
- sint32 tsize = _TrackSize;
-
- // Limit the scroller to the defined area
- newtpos = tpos + dx;
- if (newtpos < 0) newtpos = 0;
- if (newtpos > (getWReal()-tsize)) newtpos = (getWReal()-tsize);
- dx = newtpos - tpos;
-
- if (_Target)
- {
- _TrackPos = newtpos;
-
- computeTargetOfsFromPos();
- }
- else // This is a number scroller
- {
- float factor = (float)(_Max - _Min);
-
- if (_Aligned == 2) // LEFT
- factor = -factor * newtpos / (float)(getWReal()-tsize) - _Min;
- else // RIGHT
- factor = factor * (1.0f-(newtpos / (float)(getWReal()-tsize))) + _Min;
-
- _TrackPos = newtpos;
-
- if (_Aligned == 2) // LEFT
- _Value = (sint32) (_Inverted ? factor : -factor);
- else // RIGHT
- _Value = (sint32) (_Inverted ? factor : -factor);
-
- // step and clamp value
- normalizeValue(_Value);
-
- {
- float factor;
- if (_Aligned == 2) // LEFT
- factor = ((float)_Value-_Min) / (_Max-_Min);
- else // RIGHT
- factor = 1.0f - ((float)_Value-_Min) / (_Max-_Min);
- factor *= (this->getWReal() - _TrackSize);
-
- _TrackDispPos = (sint32)factor;
- }
-
- if (_IsDBLink)
- {
- _ObserverOn = false;
- _DBLink.setSInt32 (_Value);
- _ObserverOn = true;
- }
- }
-
- // Launch the scroller event if any
- runAH(_AHOnScroll, _AHOnScrollParams);
-
- return dx;
-}
-
-// ------------------------------------------------------------------------------------------------
-sint32 CCtrlScroll::moveTrackY (sint32 dy)
-{
- if (!_Vertical)
- return 0;
- if ((getHReal()-_TrackSize) <= 0)
- return 0;
-
- sint32 newtpos;
- sint32 tpos = _TrackPos;
- sint32 tsize = _TrackSize;
-
- // Limit the scroller to the defined area
- newtpos = tpos + dy;
- if (newtpos < 0) newtpos = 0;
- if (newtpos > (getHReal()-tsize)) newtpos = (getHReal()-tsize);
- dy = newtpos - tpos;
-
- if (_Target)
- {
- _TrackPos = newtpos;
-
- computeTargetOfsFromPos();
- }
- else // This is a number scroller
- {
- float factor = (float)(_Max - _Min);
-
- if (_Aligned == 1) // BOTTOM
- factor = -factor * newtpos / (float)(getHReal()-tsize) - _Min;
- else // TOP
- factor = factor * (1.0f-(newtpos / (float)(getHReal()-tsize))) + _Min;
-
- _TrackPos = newtpos;
-
- if (_Aligned == 1) // BOTTOM
- _Value = (sint32) (_Inverted ? factor : -factor);
- else // TOP
- _Value = (sint32) (_Inverted ? factor : -factor);
-
- // step and clamp value
- normalizeValue(_Value);
-
- {
- float factor;
- if (_Aligned == 1) // BOTTOM
- factor = ((float)_Value-_Min) / (_Max-_Min);
- else // TOP
- factor = 1.0f - ((float)_Value-_Min) / (_Max-_Min);
- factor *= (this->getHReal() - _TrackSize);
-
- _TrackDispPos = (sint32)factor;
- }
-
- if (_IsDBLink)
- {
- _ObserverOn = false;
- _DBLink.setSInt32 (_Value);
- _ObserverOn = true;
- }
- }
-
- // Launch the scroller event if any
- runAH(_AHOnScroll, _AHOnScrollParams);
-
- return dy;
-}
-
-// ------------------------------------------------------------------------------------------------
-void CCtrlScroll::setTextureBottomOrLeft (const std::string &txName)
-{
- CViewRenderer &rVR = *CViewRenderer::getInstance();
- _TxIdB = rVR.getTextureIdFromName(txName);
-}
-
-// ------------------------------------------------------------------------------------------------
-void CCtrlScroll::setTextureMiddle (const std::string &txName)
-{
- CViewRenderer &rVR = *CViewRenderer::getInstance();
- _TxIdM = rVR.getTextureIdFromName(txName);
-}
-
-// ------------------------------------------------------------------------------------------------
-void CCtrlScroll::setTextureTopOrRight (const std::string &txName)
-{
- CViewRenderer &rVR = *CViewRenderer::getInstance();
- _TxIdT = rVR.getTextureIdFromName(txName);
-}
-
-// ------------------------------------------------------------------------------------------------
-void CCtrlScroll::setValue(sint32 value)
-{
- normalizeValue(value);
-
- if (_IsDBLink)
- {
- _ObserverOn = false;
- _DBLink.setSInt32(value);
- _ObserverOn = true;
- }
- else
- {
- _Value = value;
- }
- invalidateCoords();
-}
-
-// ------------------------------------------------------------------------------------------------
-void CCtrlScroll::setTrackPos(sint32 pos)
-{
- if (_Vertical)
- {
- moveTrackY(pos - _TrackPos);
- }
- else
- {
- moveTrackX(pos - _TrackPos);
- }
- invalidateCoords();
-}
-
-// ------------------------------------------------------------------------------------------------
-void CCtrlScroll::computeTargetOfsFromPos()
-{
- if(_Vertical)
- {
- float factor = ((float)_Target->getHReal() - (float)_Target->getMaxHReal());
-
- if (_Aligned == 1) // BOTTOM
- factor = -factor * _TrackPos / favoid0((float)(getHReal()-_TrackSize));
- else // TOP
- factor = factor * (1.0f-(_TrackPos / favoid0((float)(getHReal()-_TrackSize))));
-
- // Compute Steped target
- sint32 nexOfsY= (sint32) (_Inverted ? factor : -factor);
- if(_TargetStepY>1)
- nexOfsY= ((nexOfsY+_TargetStepY/2)/_TargetStepY) * _TargetStepY;
- _Target->setOfsY (nexOfsY);
- _LastTargetOfsY = nexOfsY;
-
- // invalidate only XReal/YReal, doing only 1 pass
- _Target->invalidateCoords(1);
- }
- else
- {
- float factor = ((float)_Target->getWReal() - (float)_Target->getMaxWReal());
-
- if (_Aligned == 2) // LEFT
- factor = -factor * _TrackPos / favoid0((float)(getWReal()-_TrackSize));
- else // RIGHT
- factor = factor * (1.0f-(_TrackPos / favoid0((float)(getWReal()-_TrackSize))));
-
- // Compute Steped target
- sint32 nexOfsX= (sint32) (_Inverted ? factor : -factor);
- if(_TargetStepX>1)
- nexOfsX= ((nexOfsX+_TargetStepX/2)/_TargetStepX) * _TargetStepX;
- _Target->setOfsX (nexOfsX);
- _LastTargetOfsX = nexOfsX;
-
- // invalidate only XReal/YReal, doing only 1 pass
- _Target->invalidateCoords(1);
- }
-}
-
-// ------------------------------------------------------------------------------------------------
-void CCtrlScroll::update(ICDBNode * /* node */)
-{
- if (!_ObserverOn) return;
- _Value = _DBLink.getSInt32();
- // the value in the db changed
- invalidateCoords(1);
- if (_Target) _Target->invalidateCoords(1);
-}
-
-
-// ***************************************************************************
-void CCtrlScroll::moveTargetX (sint32 dx)
-{
- if(!_Target)
- return;
- sint32 maxWReal= _Target->getMaxWReal();
- sint32 wReal= _Target->getWReal();
- if(wReal <= maxWReal)
- return;
-
- // compute the new ofsX.
- sint32 ofsX= _Target->getOfsX();
- ofsX+= dx;
- clamp(ofsX, 0, wReal-maxWReal);
- _Target->setOfsX(ofsX);
-
- // compute new trackPos.
- if (_Aligned == 2) // LEFT
- {
- float factor = (float)(wReal-maxWReal);
- factor = -(float)ofsX / factor;
- clamp(factor, 0.f, 1.f);
- factor = factor * (getWReal()-_TrackSize);
- _TrackPos = (sint32)factor;
- }
- else // RIGHT
- {
- float factor = (float)(wReal-maxWReal);
- factor = (float)ofsX / factor;
- clamp(factor, 0.f, 1.f);
- factor = (1.0f-factor) * (getWReal() - _TrackSize);
- _TrackPos = (sint32)factor;
- }
-
- // invalidate only position. 1 pass is sufficient
- invalidateCoords(1);
-}
-
-// ***************************************************************************
-void CCtrlScroll::moveTargetY (sint32 dy)
-{
- if(!_Target)
- return;
- sint32 maxHReal= _Target->getMaxHReal();
- sint32 hReal= _Target->getHReal();
- if(hReal <= maxHReal)
- return;
-
- // compute the new ofsY.
- sint32 ofsY= _Target->getOfsY();
- ofsY+= dy;
-
- // compute new trackPos.
- if (_Aligned == 1) // BOTTOM
- {
- clamp(ofsY, maxHReal - hReal, 0);
- _Target->setOfsY(ofsY);
- float factor = (float)(hReal-maxHReal);
- factor = -(float)ofsY / factor;
- clamp(factor, 0.f, 1.f);
- factor = factor * (getHReal()-_TrackSize);
- _TrackPos = (sint32)factor;
- }
- else // TOP
- {
- clamp(ofsY, 0, hReal-maxHReal);
- _Target->setOfsY(ofsY);
- float factor = (float)(hReal-maxHReal);
- factor = (float)ofsY / factor;
- clamp(factor, 0.f, 1.f);
- factor = (1.0f-factor) * (getHReal() - _TrackSize);
- _TrackPos = (sint32)factor;
- }
-
- // invalidate only position. 1 pass is sufficient
- invalidateCoords(1);
-}
-
-// ***************************************************************************
-void CCtrlScroll::normalizeValue(sint32 &value)
-{
- // if, 0 no step
- if(_StepValue==0 || _StepValue==1)
- return;
- // if interval is null, force min!
- if(_Max==_Min)
- {
- value= _Min;
- return;
- }
-
- // get range of possible position
-// sint32 size= _Max - _Min;
-
- // step (round)
- sint32 val= (value + (_StepValue/2) -_Min) / _StepValue;
- val= _Min + val * _StepValue;
- clamp(val, _Min, _Max);
- value= val;
-}
-
-// ***************************************************************************
-void CCtrlScroll::setFrozen (bool state)
-{
- _Frozen = state;
- if (_Frozen)
- {
- _Value = 0;
- }
-}
-
-
-// ------------------------------------------------------------------------------------------------
-int CCtrlScroll::luaEnsureVisible(CLuaState &ls)
-{
- const char *funcName = "ensureVisible";
- CLuaIHM::checkArgCount(ls, funcName, 3);
- CLuaIHM::checkArgTypeUIElement(ls, funcName, 1);
- CLuaIHM::checkArgType(ls, funcName, 2, LUA_TSTRING);
- CLuaIHM::checkArgType(ls, funcName, 3, LUA_TSTRING);
- THotSpot hs[2];
- std::string hsStr[] = { ls.toString(2), ls.toString(3) };
- //
- for (uint hsIndex = 0; hsIndex < 2; ++ hsIndex)
- {
- if (_Vertical)
- {
- if (NLMISC::nlstricmp(hsStr[hsIndex], "T") == 0)
- {
- hs[hsIndex] = Hotspot_Tx;
- }
- else
- if (NLMISC::nlstricmp(hsStr[hsIndex], "M") == 0)
- {
- hs[hsIndex] = Hotspot_Mx;
- }
- else
- if (NLMISC::nlstricmp(hsStr[hsIndex], "B") == 0)
- {
- hs[hsIndex] = Hotspot_Bx;
- }
- else
- {
- CLuaIHM::fails(ls, "%s : couldn't parse hotspot for vertical scrollbar", funcName);
- }
- }
- else
- {
- if (NLMISC::nlstricmp(hsStr[hsIndex], "L") == 0)
- {
- hs[hsIndex] = Hotspot_xL;
- }
- else
- if (NLMISC::nlstricmp(hsStr[hsIndex], "M") == 0)
- {
- hs[hsIndex] = Hotspot_xM;
- }
- else
- if (NLMISC::nlstricmp(hsStr[hsIndex], "R") == 0)
- {
- hs[hsIndex] = Hotspot_xR;
- }
- else
- {
- CLuaIHM::fails(ls, "%s : couldn't parse hotspot for horizontal scrollbar", funcName);
- }
- }
- }
- ensureVisible(CLuaIHM::getUIOnStack(ls, 1), hs[0], hs[1]);
- return 0;
-}
-
-
-// ------------------------------------------------------------------------------------------------
-void CCtrlScroll::ensureVisible(CInterfaceElement *childElement, THotSpot childHotSpot, THotSpot parentHotSpot)
-{
- if (!_Target) return; // not connected to a target yet
- if (!childElement) return;
- // compute corners of interest for enclosed element & enclosing group
- sint32 childX, childY;
- childElement->getCorner(childX, childY, childHotSpot);
- if (_Vertical)
- {
- sint32 maxHReal= _Target->getMaxHReal();
- sint32 hReal= _Target->getHReal();
- if(hReal > maxHReal)
- {
- sint enclosingDY;
- switch (parentHotSpot)
- {
- case Hotspot_Bx:
- enclosingDY = maxHReal;
- break;
- case Hotspot_Mx:
- enclosingDY = maxHReal / 2;
- break;
- case Hotspot_Tx:
- enclosingDY = 0;
- break;
- default:
- nlassert(0);
- break;
- }
- if (_Aligned == 0)
- {
- // Top aligned case
- sint32 offsetY = (_Target->getYReal() + _Target->getHReal() - childY) - enclosingDY;
- NLMISC::clamp(offsetY, 0, hReal - maxHReal);
- _Target->setOfsY(offsetY);
- _Target->invalidateCoords();
- }
- else if (_Aligned == 1)
- {
- // Bottom aligned case
- sint32 offsetY = (maxHReal - enclosingDY) - (childY - _Target->getYReal());
- NLMISC::clamp(offsetY, maxHReal - hReal, 0);
- _Target->setOfsY(offsetY);
- _Target->invalidateCoords();
- }
- }
- // else, ... fully visible (not occluded by parent group)
- }
- else
- {
- sint32 maxWReal= _Target->getMaxWReal();
- sint32 wReal= _Target->getWReal();
- if(wReal > maxWReal)
- {
- sint enclosingDX;
- switch (parentHotSpot)
- {
- case Hotspot_xL:
- enclosingDX = maxWReal;
- break;
- case Hotspot_xM:
- enclosingDX = maxWReal / 2;
- break;
- case Hotspot_xR:
- enclosingDX = 0;
- break;
- default:
- nlassert(0);
- break;
- }
- if (_Aligned == 3)
- {
- // right aligned case
- sint32 offsetX = (_Target->getXReal() + _Target->getWReal() - childX) - enclosingDX;
- NLMISC::clamp(offsetX, 0, wReal - maxWReal);
- _Target->setOfsX(offsetX);
- _Target->invalidateCoords();
- }
- else if (_Aligned == 2)
- {
- // Left aligned case
- sint32 offsetX = (maxWReal - enclosingDX) - (childX - _Target->getXReal());
- NLMISC::clamp(offsetX, maxWReal - wReal, 0);
- _Target->setOfsX(offsetX);
- _Target->invalidateCoords();
- }
- }
- // else, ... fully visible (not occluded by parent group)
- }
-}
-
diff --git a/code/ryzom/client/src/interface_v3/ctrl_scroll.h b/code/ryzom/client/src/interface_v3/ctrl_scroll.h
deleted file mode 100644
index d1e6fe2d3..000000000
--- a/code/ryzom/client/src/interface_v3/ctrl_scroll.h
+++ /dev/null
@@ -1,196 +0,0 @@
-// Ryzom - MMORPG Framework
-// 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 .
-
-
-
-#ifndef RZ_CTRL_SCROLL_H
-#define RZ_CTRL_SCROLL_H
-
-#include "nel/misc/types_nl.h"
-#include "nel/gui/ctrl_scroll_base.h"
-
-/**
- * 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();
-
-
- 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);
-
- 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 */
-
-
diff --git a/code/ryzom/client/src/interface_v3/dbgroup_list_sheet.h b/code/ryzom/client/src/interface_v3/dbgroup_list_sheet.h
index 894a34ea8..f9b29d83e 100644
--- a/code/ryzom/client/src/interface_v3/dbgroup_list_sheet.h
+++ b/code/ryzom/client/src/interface_v3/dbgroup_list_sheet.h
@@ -26,10 +26,10 @@
namespace NLGUI
{
class CCtrlBaseButton;
+ class CCtrlScroll;
}
// ***************************************************************************
-class CCtrlScroll;
class CGroupContainer;
// ***************************************************************************
diff --git a/code/ryzom/client/src/interface_v3/dbgroup_list_sheet_text.h b/code/ryzom/client/src/interface_v3/dbgroup_list_sheet_text.h
index f27dd02e7..f11faabbf 100644
--- a/code/ryzom/client/src/interface_v3/dbgroup_list_sheet_text.h
+++ b/code/ryzom/client/src/interface_v3/dbgroup_list_sheet_text.h
@@ -30,11 +30,11 @@
namespace NLGUI
{
class CCtrlButton;
+ class CCtrlScroll;
}
// ***************************************************************************
-class CCtrlScroll;
class CHandlerListSheetTradeSelect;
class CHandlerListSheetTradeRightClick;
class CGroupContainer;
diff --git a/code/ryzom/client/src/interface_v3/dbgroup_list_sheet_trade.h b/code/ryzom/client/src/interface_v3/dbgroup_list_sheet_trade.h
index 23c96c0c3..30957ae43 100644
--- a/code/ryzom/client/src/interface_v3/dbgroup_list_sheet_trade.h
+++ b/code/ryzom/client/src/interface_v3/dbgroup_list_sheet_trade.h
@@ -25,12 +25,12 @@
namespace NLGUI
{
- class CCtrlButton;
+ class CCtrlButton;
+ class CCtrlScroll;
}
// ***************************************************************************
-class CCtrlScroll;
class CHandlerListSheetTradeSelect;
class CHandlerListSheetTradeRightClick;
diff --git a/code/ryzom/client/src/interface_v3/group_container.cpp b/code/ryzom/client/src/interface_v3/group_container.cpp
index dcc8b2a4d..e4b80a016 100644
--- a/code/ryzom/client/src/interface_v3/group_container.cpp
+++ b/code/ryzom/client/src/interface_v3/group_container.cpp
@@ -33,7 +33,7 @@
#include "group_list.h"
#include "nel/gui/ctrl_button.h"
-#include "ctrl_scroll.h"
+#include "nel/gui/ctrl_scroll.h"
#include "view_text.h"
#include "view_bitmap.h"
#include "../time_client.h"
diff --git a/code/ryzom/client/src/interface_v3/group_container.h b/code/ryzom/client/src/interface_v3/group_container.h
index bd23a8b38..0a79f0931 100644
--- a/code/ryzom/client/src/interface_v3/group_container.h
+++ b/code/ryzom/client/src/interface_v3/group_container.h
@@ -27,10 +27,10 @@ namespace NLGUI
{
class CEventDescriptorLocalised;
class CCtrlButton;
+ class CCtrlScroll;
}
class CInterfaceList;
-class CCtrlScroll;
class CViewText;
class COptionsContainerInsertion;
class COptionsContainerMove;
diff --git a/code/ryzom/client/src/interface_v3/group_html.cpp b/code/ryzom/client/src/interface_v3/group_html.cpp
index 254a2a2c9..51b65d236 100644
--- a/code/ryzom/client/src/interface_v3/group_html.cpp
+++ b/code/ryzom/client/src/interface_v3/group_html.cpp
@@ -32,7 +32,7 @@ extern "C"
#include "group_list.h"
#include "group_container.h"
#include "view_link.h"
-#include "ctrl_scroll.h"
+#include "nel/gui/ctrl_scroll.h"
#include "nel/gui/ctrl_button.h"
#include "dbctrl_sheet.h"
#include "ctrl_text_button.h"
diff --git a/code/ryzom/client/src/interface_v3/group_html.h b/code/ryzom/client/src/interface_v3/group_html.h
index 333137651..beca17afd 100644
--- a/code/ryzom/client/src/interface_v3/group_html.h
+++ b/code/ryzom/client/src/interface_v3/group_html.h
@@ -40,10 +40,10 @@ extern "C"
namespace NLGUI
{
class CCtrlButton;
+ class CCtrlScroll;
}
class CGroupList;
-class CCtrlScroll;
class CDBGroupComboBox;
class CGroupParagraph;
diff --git a/code/ryzom/client/src/interface_v3/group_menu.cpp b/code/ryzom/client/src/interface_v3/group_menu.cpp
index bd2f44088..da2681f53 100644
--- a/code/ryzom/client/src/interface_v3/group_menu.cpp
+++ b/code/ryzom/client/src/interface_v3/group_menu.cpp
@@ -112,7 +112,7 @@ void CViewTextMenu::setAlpha (sint32 a)
// ------------------------------------------------------------------------------------------------
CGroupSubMenu::CGroupSubMenu(const TCtorParam ¶m)
-: CGroupFrame(param)
+: CGroupSubMenuBase(param)
{
_SelectionView = NULL;
_GroupList = NULL;
diff --git a/code/ryzom/client/src/interface_v3/group_menu.h b/code/ryzom/client/src/interface_v3/group_menu.h
index 8f3098996..41bcae76a 100644
--- a/code/ryzom/client/src/interface_v3/group_menu.h
+++ b/code/ryzom/client/src/interface_v3/group_menu.h
@@ -21,14 +21,18 @@
#include "nel/gui/interface_group.h"
#include "nel/gui/group_modal.h"
+#include "nel/gui/group_submenu_base.h"
#include "view_text.h"
-
#include "ctrl_text_button.h"
+namespace NLGUI
+{
+ class CCtrlScroll;
+}
+
class CViewBitmap;
class CGroupMenu;
class CGroupList;
-class CCtrlScroll;
/**
@@ -92,7 +96,7 @@ private:
* \date 2002
*/
-class CGroupSubMenu : public CGroupFrame
+class CGroupSubMenu : public CGroupSubMenuBase
{
public:
@@ -198,7 +202,7 @@ public:
int luaReset(CLuaState &ls);
int luaSetMaxVisibleLine(CLuaState &ls);
//
- REFLECT_EXPORT_START(CGroupSubMenu, CGroupFrame)
+ 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
diff --git a/code/ryzom/client/src/interface_v3/group_scrolltext.cpp b/code/ryzom/client/src/interface_v3/group_scrolltext.cpp
index 411b3714f..89e556870 100644
--- a/code/ryzom/client/src/interface_v3/group_scrolltext.cpp
+++ b/code/ryzom/client/src/interface_v3/group_scrolltext.cpp
@@ -23,7 +23,7 @@
#include "group_scrolltext.h"
#include "group_list.h"
#include "view_text.h"
-#include "ctrl_scroll.h"
+#include "nel/gui/ctrl_scroll.h"
#include "nel/gui/ctrl_button.h"
#include "nel/gui/action_handler.h"
diff --git a/code/ryzom/client/src/interface_v3/group_scrolltext.h b/code/ryzom/client/src/interface_v3/group_scrolltext.h
index e0b11b91d..cfedb76bc 100644
--- a/code/ryzom/client/src/interface_v3/group_scrolltext.h
+++ b/code/ryzom/client/src/interface_v3/group_scrolltext.h
@@ -26,10 +26,10 @@
namespace NLGUI
{
class CCtrlBaseButton;
+ class CCtrlScroll;
}
class CGroupList;
-class CCtrlScroll;
// Can be used to build a chat window or anything that displays sequences of strings
/**
diff --git a/code/ryzom/client/src/interface_v3/interface_config.cpp b/code/ryzom/client/src/interface_v3/interface_config.cpp
index 34fb9d52e..de9924061 100644
--- a/code/ryzom/client/src/interface_v3/interface_config.cpp
+++ b/code/ryzom/client/src/interface_v3/interface_config.cpp
@@ -21,7 +21,7 @@
#include "interface_config.h"
#include "interface_manager.h"
#include "group_container.h"
-#include "ctrl_scroll.h"
+#include "nel/gui/ctrl_scroll.h"
using namespace NLMISC;
using namespace std;
diff --git a/code/ryzom/client/src/interface_v3/interface_manager.cpp b/code/ryzom/client/src/interface_v3/interface_manager.cpp
index 53af9d8e4..89c1bc64b 100644
--- a/code/ryzom/client/src/interface_v3/interface_manager.cpp
+++ b/code/ryzom/client/src/interface_v3/interface_manager.cpp
@@ -51,7 +51,7 @@
#include "view_bitmap_combo.h"
#include "view_text.h"
// Ctrl
-#include "ctrl_scroll.h"
+#include "nel/gui/ctrl_scroll.h"
#include "nel/gui/ctrl_button.h"
#include "ctrl_text_button.h"
// DBCtrl
diff --git a/code/ryzom/client/src/interface_v3/interface_manager.h b/code/ryzom/client/src/interface_v3/interface_manager.h
index 2171ecb4c..d70a1def9 100644
--- a/code/ryzom/client/src/interface_v3/interface_manager.h
+++ b/code/ryzom/client/src/interface_v3/interface_manager.h
@@ -30,7 +30,7 @@
#include "view_pointer.h"
#include "nel/gui/ctrl_base.h"
-#include "ctrl_scroll.h"
+#include "nel/gui/ctrl_scroll.h"
#include "nel/gui/view_renderer.h"
diff --git a/code/ryzom/client/src/interface_v3/interface_parser.cpp b/code/ryzom/client/src/interface_v3/interface_parser.cpp
index 73d1208b8..eba6b9094 100644
--- a/code/ryzom/client/src/interface_v3/interface_parser.cpp
+++ b/code/ryzom/client/src/interface_v3/interface_parser.cpp
@@ -52,7 +52,7 @@
#include "dbview_quantity.h"
#include "dbview_digit.h"
// Ctrl
-#include "ctrl_scroll.h"
+#include "nel/gui/ctrl_scroll.h"
#include "nel/gui/ctrl_button.h"
#include "ctrl_col_pick.h"
#include "ctrl_tooltip.h"
diff --git a/code/ryzom/client/src/interface_v3/list_sheet_base.h b/code/ryzom/client/src/interface_v3/list_sheet_base.h
index 1ef13e4ca..609ee95ae 100644
--- a/code/ryzom/client/src/interface_v3/list_sheet_base.h
+++ b/code/ryzom/client/src/interface_v3/list_sheet_base.h
@@ -22,9 +22,12 @@
#include "nel/misc/types_nl.h"
#include "nel/gui/interface_group.h"
+namespace NLGUI
+{
+ class CCtrlScroll;
+}
class CDBCtrlSheet;
-class CCtrlScroll;
// ***************************************************************************
/**
diff --git a/code/ryzom/client/src/interface_v3/register_interface_elements.cpp b/code/ryzom/client/src/interface_v3/register_interface_elements.cpp
index bb9d482a8..6a2e54483 100644
--- a/code/ryzom/client/src/interface_v3/register_interface_elements.cpp
+++ b/code/ryzom/client/src/interface_v3/register_interface_elements.cpp
@@ -24,6 +24,7 @@
#include "view_text_id.h"
#include "view_bitmap.h"
#include "view_radar.h"
+#include "nel/gui/group_submenu_base.h"
#include "group_menu.h"
#include "nel/gui/ctrl_base.h"
#include "nel/gui/interface_group.h"
@@ -46,7 +47,7 @@
#include "dbview_bar3.h"
#include "group_list.h"
#include "nel/gui/ctrl_scroll_base.h"
-#include "ctrl_scroll.h"
+#include "nel/gui/ctrl_scroll.h"
#include "dbgroup_combo_box.h"
#include "group_tab.h"
#include "group_html.h"
@@ -94,7 +95,8 @@ void registerInterfaceElements()
REGISTER_REFLECTABLE_CLASS(CCtrlScrollBase, CCtrlBase);
REGISTER_REFLECTABLE_CLASS(CCtrlScroll, CCtrlScrollBase);
REGISTER_REFLECTABLE_CLASS(CGroupMenu, CGroupModal)
- REGISTER_REFLECTABLE_CLASS(CGroupSubMenu, CGroupFrame)
+ REGISTER_REFLECTABLE_CLASS(CGroupSubMenuBase, CGroupFrame)
+ REGISTER_REFLECTABLE_CLASS(CGroupSubMenu, CGroupSubMenuBase)
REGISTER_REFLECTABLE_CLASS(CGroupTab, CInterfaceGroup)
REGISTER_REFLECTABLE_CLASS(CGroupScrollText, CInterfaceGroup)
REGISTER_REFLECTABLE_CLASS(CGroupHTML, CGroupScrollText)
diff --git a/code/ryzom/client/src/libwww.h b/code/ryzom/client/src/libwww.h
index ec1462bc9..b82a75534 100644
--- a/code/ryzom/client/src/libwww.h
+++ b/code/ryzom/client/src/libwww.h
@@ -28,10 +28,10 @@ extern "C"
namespace NLGUI
{
class CCtrlBaseButton;
+ class CCtrlScroll;
}
class CGroupList;
-class CCtrlScroll;
// ***************************************************************************