diff --git a/code/nel/include/nel/gui/group_list.h b/code/nel/include/nel/gui/group_list.h
new file mode 100644
index 000000000..f7a2263e2
--- /dev/null
+++ b/code/nel/include/nel/gui/group_list.h
@@ -0,0 +1,262 @@
+// 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 NL_GROUP_LIST_H
+#define NL_GROUP_LIST_H
+
+#include "nel/misc/types_nl.h"
+#include "nel/gui/group_frame.h"
+#include "nel/gui/view_text.h"
+
+namespace NLGUI
+{
+
+ // ----------------------------------------------------------------------------
+ class CGroupList : public CInterfaceGroup
+ {
+ public:
+ enum EAlign
+ {
+ Bottom = 0,
+ Top,
+ Left,
+ Right
+ };
+
+ ///constructor
+ CGroupList(const TCtorParam ¶m);
+
+ // dtor
+ ~CGroupList();
+ /**
+ * add a child element to the group at the last position
+ * 'order' of the element is set to the last order + 1
+ * \param child : pointer to the child element
+ */
+ void addChild (CViewBase* child, bool deleteOnRemove=true);
+
+
+ /** add a child before the element at the given index.
+ * 'order' of the element is set to 0
+ * \return true if there was enough room for that child
+ */
+ bool addChildAtIndex(CViewBase *child, uint index, bool deleteOnRemove = true);
+
+ /**
+ * add a text child element to the group, using the text template
+ * \param line : text to be added
+ * \param color : text color
+ */
+ void addTextChild (const ucstring& line,const NLMISC::CRGBA &textColor, bool multiLine = true);
+
+ /**
+ * add a text child element to the group, using the text template
+ * \param line : text to be added
+ */
+ void addTextChild (const ucstring& line, bool multiLine = true);
+
+ /// Same as adding a text child but the text will be taken from the string manager
+ void addTextChildID (uint32 id, bool multiLine = true);
+ // the same, but with id taken from the database
+ void addTextChildID (const std::string &dbPath, bool multiLine = true);
+
+
+ bool delChild (CViewBase* child, bool noWarning=false, bool forceDontDelete = false);
+
+ bool delChild(uint index, bool forceDontDelete = false);
+
+ CViewBase *getChild(uint index) const { return _Elements[index].Element; }
+ int luaGetChild(CLuaState &ls);
+
+ void deleteAllChildren();
+
+ void removeHead();
+
+ // Get the number of children
+ uint getNumChildren() const { return (uint)_Elements.size(); }
+
+ // Get the number of active children
+ uint getNumActiveChildren() const;
+
+ /**
+ * set the template that will be used to add text;
+ * \templ : a CViewText object. Only its font size, color and shadow are required.
+ */
+ void setTextTemplate(const CViewText& templ);
+
+ /**
+ * set the template that will be used to add text;
+ * \templ : a CViewText object. Only its font size, color and shadow are required.
+ */
+ CViewText * getTextTemplatePtr()
+ {
+ return &_Templ;
+ }
+
+ /**
+ * parse the element and initalize it
+ * \paral cur : pointer to the node describing this element
+ * \param parentGroup : the parent group of this element
+ * \return true if success
+ */
+ virtual bool parse (xmlNodePtr cur, CInterfaceGroup * parentGroup);
+ //virtual uint32 getMemory();
+ /**
+ * init or reset the children element coords. Orverloaded from CInterfaceGroup because we begin with the last inserted element here
+ */
+ virtual void updateCoords();
+
+ virtual void draw();
+
+ virtual bool handleEvent (const NLGUI::CEventDescriptor& eventDesc);
+
+ virtual void clearViews();
+ virtual void clearControls();
+ virtual void clearGroups();
+
+ void setSpace (sint32 s) { _Space = s; }
+
+ virtual CInterfaceElement* getElement (const std::string &id)
+ { return CInterfaceGroup::getElement (id); }
+
+ sint32 getNbElement() { return (sint32)_Elements.size(); }
+ sint32 getSpace() { return _Space; }
+
+ void setDynamicDisplaySize (bool dds) { _DynamicDisplaySize = dds; }
+ bool getDynamicDisplaySize() { return _DynamicDisplaySize; }
+
+ void forceSizeW (sint32 newSizeW);
+ void forceSizeH (sint32 newSizeH);
+
+ void setMinW(sint32 minW);
+ void setMinH(sint32 minH);
+ sint32 getMinW() const {return _MinW;}
+ sint32 getMinH() const {return _MinH;}
+
+ // set the rank for the element at the given index (used to reinsert container after they have been turned into popups)
+ void setOrder(uint index, uint order) { _Elements[index].Order = order; }
+ uint getOrder(uint index) const { return _Elements[index].Order; }
+
+ // get element of index or -1 if not found
+ sint32 getElementIndex(CViewBase* child) const;
+ int luaGetElementIndex(CLuaState &ls);
+
+ // swap 2 entries in the list (and also their orders)
+ void swapChildren(uint index1, uint index2);
+ int luaUpChild(CLuaState &ls);
+ int luaDownChild(CLuaState &ls);
+
+ // deleteOnRemove flag
+ void setDelOnRemove(uint index, bool delOnRemove);
+ bool getDelOnRemove(uint index) const;
+
+ // children number
+ void setChildrenNb(sint32 /* val */){}
+ sint32 getChildrenNb() const {return (sint32)_Elements.size();}
+
+ int luaAddChild(CLuaState &ls);
+ int luaAddChildAtIndex(CLuaState &ls);
+ int luaDetachChild(CLuaState &ls);
+ int luaClear(CLuaState &ls); // synonimous for deleteAllChildren
+ int luaAddTextChild(CLuaState &ls);
+ int luaAddColoredTextChild(CLuaState &ls);
+ int luaDelChild(CLuaState &ls);
+
+ REFLECT_EXPORT_START(CGroupList, CInterfaceGroup)
+ REFLECT_LUA_METHOD("addTextChild", luaAddTextChild)
+ REFLECT_LUA_METHOD("addColoredTextChild", luaAddColoredTextChild)
+ REFLECT_LUA_METHOD("addChild", luaAddChild);
+ REFLECT_LUA_METHOD("addChildAtIndex", luaAddChildAtIndex);
+ REFLECT_LUA_METHOD("detachChild", luaDetachChild);
+ REFLECT_LUA_METHOD("clear", luaClear);
+ REFLECT_LUA_METHOD("delChild", luaDelChild);
+ REFLECT_LUA_METHOD("upChild", luaUpChild);
+ REFLECT_LUA_METHOD("downChild", luaDownChild);
+ REFLECT_LUA_METHOD("getChild", luaGetChild);
+ REFLECT_LUA_METHOD("getElementIndex", luaGetElementIndex);
+ REFLECT_SINT32 ("childrenNb", getChildrenNb, setChildrenNb);
+ REFLECT_EXPORT_END
+
+
+ protected:
+
+ //max number of elements
+ sint32 _MaxElements;
+
+ // Where to add next element
+ EAlign _AddElt;
+
+ // Where to align the newly added element
+ EAlign _Align;
+
+ // Space between two elements in pixel
+ sint32 _Space;
+
+ // Text template
+ CViewText _Templ;
+
+ // Current id of the view
+ sint32 _IdCounter;
+
+ // Used for context menu to display the same size as the whole content
+ bool _DynamicDisplaySize;
+
+ // Do we have a color under the element pointed by the mouse
+ bool _Over;
+
+ // If over is true so we have a color
+ NLMISC::CRGBA _OverColor;
+
+ // Current elt over the pointer
+ sint32 _OverElt;
+
+ struct CElementInfo
+ {
+ uint Order; // Used to sort the window by their insertion order.
+ // This is used to put back a window at the right place if it was turned into a popup.
+ CViewBase *Element;
+ bool EltDeleteOnRemove;
+ };
+ friend struct CRemoveViewPred;
+ friend struct CRemoveCtrlPred;
+ friend struct CRemoveGroupPred;
+
+ // The list is forced to be at least this size in updateCoords().
+ sint32 _MinW;
+ sint32 _MinH;
+
+
+ // To conserve elements in the order they have been added
+ // (the element drawn are stored in _views, _contrlos or _childrengroups of cinterfacegroup
+ std::vector _Elements;
+
+ private:
+
+ void setHSGroup (CViewBase *child, EAlign addElt, EAlign align);
+ void setHSParent(CViewBase *view, EAlign addElt, EAlign align, uint space);
+
+ };
+
+
+}
+
+#endif // NL_GROUP_LIST_H
+
+/* End of group_list.h */
+
+
diff --git a/code/nel/include/nel/gui/interface_element.h b/code/nel/include/nel/gui/interface_element.h
index 380e81b5b..2dcf477f9 100644
--- a/code/nel/include/nel/gui/interface_element.h
+++ b/code/nel/include/nel/gui/interface_element.h
@@ -27,12 +27,11 @@
#include "nel/gui/reflect.h"
#include "nel/gui/interface_common.h"
-class CGroupList;
class CGroupParagraph;
namespace NLGUI
{
-
+ class CGroupList;
class CInterfaceLink;
class CInterfaceElement;
class CInterfaceGroup;
@@ -496,7 +495,7 @@ namespace NLGUI
NLMISC::CRefPtr _ParentSize; // RefPtr in case of group destroyed in a parent group with posref on it
// Friend Class
- friend class ::CGroupList;
+ friend class CGroupList;
friend class ::CGroupParagraph;
// True if must modulate the global color with the view
diff --git a/code/nel/src/gui/group_list.cpp b/code/nel/src/gui/group_list.cpp
new file mode 100644
index 000000000..78860c5b6
--- /dev/null
+++ b/code/nel/src/gui/group_list.cpp
@@ -0,0 +1,1158 @@
+// 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_list.h"
+#include "nel/gui/interface_element.h"
+#include "nel/gui/view_bitmap.h"
+#include "nel/gui/view_text_id.h"
+#include "nel/gui/group_container_base.h"
+#include "nel/gui/lua_ihm.h"
+#include "nel/misc/xml_auto_ptr.h"
+#include "nel/gui/widget_manager.h"
+#include "nel/gui/view_pointer_base.h"
+#include "nel/misc/i18n.h"
+
+using namespace std;
+using namespace NLMISC;
+
+NLMISC_REGISTER_OBJECT(CViewBase, CGroupList, std::string, "list");
+
+namespace NLGUI
+{
+
+ // ----------------------------------------------------------------------------
+ CGroupList::CGroupList(const TCtorParam ¶m)
+ : CInterfaceGroup(param),
+ _Templ(TCtorParam())
+ {
+ _IdCounter = 0;
+ _MaxElements = 1024;
+ _AddElt = Bottom;
+ _Align = Left;
+ _Space = 0;
+ _DynamicDisplaySize = false;
+ _MinW= 0;
+ _MinH= 0;
+ _Over = false;
+ _OverColor = CRGBA(255, 255, 255, 32);
+ _OverElt = -1;
+ _IsGroupList = true;
+ }
+
+ // ----------------------------------------------------------------------------
+ void CGroupList::addChild (CViewBase* child, bool deleteOnRemove)
+ {
+ if (!child)
+ {
+ nlwarning(" : tried to add a NULL view");
+ return;
+ }
+
+ // Make sure there's room for the element
+ if ((sint32)_Elements.size() == _MaxElements)
+ {
+ removeHead();
+ }
+
+ // add child at last index
+ addChildAtIndex(child, (uint)_Elements.size(), deleteOnRemove);
+ if (_Elements.size() >= 2)
+ {
+ setOrder((uint)_Elements.size() - 1, getOrder((uint)_Elements.size() - 2) + 1);
+ }
+ }
+
+ // ----------------------------------------------------------------------------
+ CGroupList::~CGroupList()
+ {
+ deleteAllChildren();
+ }
+
+ // ----------------------------------------------------------------------------
+ // Set Hotspot of the first element in reference to the group
+ void CGroupList::setHSGroup (CViewBase *child, EAlign addElt, EAlign align)
+ {
+ switch (addElt)
+ {
+ case Bottom:
+ if (align == Left)
+ {
+ child->_ParentPosRef = Hotspot_TL;
+ child->_PosRef = Hotspot_TL;
+ }
+ else // align == Right
+ {
+ child->_ParentPosRef = Hotspot_TR;
+ child->_PosRef = Hotspot_TR;
+ }
+ break;
+ case Left:
+ if (align == Top)
+ {
+ child->_ParentPosRef = Hotspot_TR;
+ child->_PosRef = Hotspot_TR;
+ }
+ else // align == Bottom
+ {
+ child->_ParentPosRef = Hotspot_BR;
+ child->_PosRef = Hotspot_BR;
+ }
+ break;
+ case Top:
+ if (align == Left)
+ {
+ child->_ParentPosRef = Hotspot_BL;
+ child->_PosRef = Hotspot_BL;
+ }
+ else // align == Right
+ {
+ child->_ParentPosRef = Hotspot_BR;
+ child->_PosRef = Hotspot_BR;
+ }
+ break;
+ case Right:
+ if (align == Top)
+ {
+ child->_ParentPosRef = Hotspot_TL;
+ child->_PosRef = Hotspot_TL;
+ }
+ else // align == Bottom
+ {
+ child->_ParentPosRef = Hotspot_BL;
+ child->_PosRef = Hotspot_BL;
+ }
+ break;
+ default:
+ nlassert(false);
+ break;
+ }
+ }
+
+ // ----------------------------------------------------------------------------
+ /** align an element towards its parent in the group
+ */
+ void CGroupList::setHSParent(CViewBase *view, EAlign addElt, EAlign /* align */, uint space)
+ {
+ if ((addElt == Top) || (addElt == Bottom))
+ {
+ if (addElt == Bottom)
+ {
+ if (_Align == Left)
+ view->_ParentPosRef = Hotspot_BL;
+ else // align == Right
+ view->_ParentPosRef = Hotspot_BR;
+ //view->_Y = -abs((sint32)space);
+ view->_Y = - (sint32)space;
+ }
+ else if (addElt == Top)
+ {
+ if (_Align == Left)
+ view->_ParentPosRef = Hotspot_TL;
+ else // align == Right
+ view->_ParentPosRef = Hotspot_TR;
+ // view->_Y = abs((sint32)space);
+ view->_Y = (sint32)space;
+ }
+ }
+ else
+ {
+ if (addElt == Left)
+ {
+ if (_Align == Top)
+ view->_ParentPosRef = Hotspot_TL;
+ else // align == Bottom
+ view->_ParentPosRef = Hotspot_BL;
+ //view->_X = -abs((sint32)space);
+ view->_X = -(sint32)space;
+ }
+ else if (addElt == Right)
+ {
+ if (_Align == Top)
+ view->_ParentPosRef = Hotspot_TR;
+ else // align == Bottom
+ view->_ParentPosRef = Hotspot_BR;
+ //view->_X = abs((sint32)space);
+ view->_X = (sint32)space;
+ }
+ }
+ }
+
+ // ----------------------------------------------------------------------------
+ bool CGroupList::parse (xmlNodePtr cur, CInterfaceGroup * parentGroup)
+ {
+ if (!CInterfaceGroup::parse(cur, parentGroup))
+ return false;
+
+ // Parse location. If these properties are not specified, set them to 0
+
+ CXMLAutoPtr ptr((const char*) xmlGetProp( cur, (xmlChar*)"maxelements" ));
+ _MaxElements = 1024;
+ if (ptr)
+ {
+ if (!fromString((const char*)ptr, _MaxElements))
+ {
+ nlwarning(" Can't parse the 'maxelements' field ");
+ }
+ }
+
+ ptr = (char*) xmlGetProp( cur, (xmlChar*)"addelt" );
+ _AddElt = Bottom;
+ if (ptr)
+ {
+ if (stricmp(ptr, "B") == 0)
+ _AddElt = Bottom;
+ else if (stricmp(ptr, "T") == 0)
+ _AddElt = Top;
+ else if (stricmp(ptr, "L") == 0)
+ _AddElt = Left;
+ else if (stricmp(ptr, "R") == 0)
+ _AddElt = Right;
+ }
+
+ ptr = (char*) xmlGetProp( cur, (xmlChar*)"align" );
+ _Align = Left;
+ if (ptr)
+ {
+ if (stricmp(ptr, "B") == 0)
+ _Align = Bottom;
+ else if (stricmp(ptr, "T") == 0)
+ _Align = Top;
+ else if (stricmp(ptr, "L") == 0)
+ _Align = Left;
+ else if (stricmp(ptr, "R") == 0)
+ _Align = Right;
+ }
+
+ ptr = (char*) xmlGetProp( cur, (xmlChar*)"space" );
+ _Space = 0;
+ if (ptr)
+ fromString((const char*)ptr, _Space);
+
+ EAlign addElt = _AddElt;
+ // EAlign align = _Align;
+ _GroupSizeRef = _SizeRef;
+ if ((addElt == Top) || (addElt == Bottom))
+ {
+ setMaxW (_W);
+ setMaxH(_H);
+ _H = 0;
+ _SizeRef = _SizeRef&(~2);
+ }
+ else
+ {
+ setMaxW (_W);
+ setMaxH (_H);
+ _W = 0;
+ _SizeRef = _SizeRef&(~1);
+ }
+
+ ptr = (char*) xmlGetProp( cur, (xmlChar*)"over" );
+ _Over = false;
+ if (ptr) _Over = convertBool(ptr);
+
+ ptr = (char*) xmlGetProp( cur, (xmlChar*)"dynamic_display_size" );
+ _DynamicDisplaySize = false;
+ if (ptr) _DynamicDisplaySize = convertBool(ptr);
+
+ ptr = (char*) xmlGetProp( cur, (xmlChar*)"col_over" );
+ _OverColor = CRGBA(255, 255, 255, 32);
+ if (ptr) _OverColor = convertColor(ptr);
+
+
+ // TEMPLATE TEXT SETUP
+
+ // justification parameters
+ _Templ.parseTextOptions (cur);
+
+ // initial text
+ ptr = (char*) xmlGetProp( cur, (xmlChar*)"hardtext" );
+ if (ptr)
+ {
+ const char *propPtr = ptr;
+ ucstring Text = ucstring(propPtr);
+ if ((strlen(propPtr)>2) && (propPtr[0] == 'u') && (propPtr[1] == 'i'))
+ Text = CI18N::get (propPtr);
+
+ addTextChild(Text);
+ }
+ else
+ {
+ ptr = (char*) xmlGetProp( cur, (xmlChar*)"textid" );
+ if (ptr)
+ {
+ uint32 textId;
+ fromString((const char*)ptr, textId);
+ addTextChildID(textId);
+ }
+ }
+
+ return true;
+ }
+
+
+
+ // ----------------------------------------------------------------------------
+ void CGroupList::addTextChild(const ucstring& line, bool multiLine /*= true*/)
+ {
+ const string elid = _Id + ":el" + toString(_IdCounter); ++_IdCounter;
+ CViewText *view= new CViewText (elid, string(""), _Templ.getFontSize(), _Templ.getColor(), _Templ.getShadow());
+ view->_Parent = this;
+ view->setMultiLine (multiLine);
+ view->setTextMode(_Templ.getTextMode());
+ if (multiLine) view->setMultiLineSpace (_Space);
+ view->setText (line);
+ // Herit global-coloring
+ view->setModulateGlobalColor(getModulateGlobalColor());
+ addChild(view);
+ invalidateCoords();
+ }
+
+
+
+ // ----------------------------------------------------------------------------
+ void CGroupList::addTextChild(const ucstring& line, const CRGBA& textColor, bool multiLine /*= true*/)
+ {
+ const string elid = _Id + ":el" + toString(_IdCounter); ++_IdCounter;
+ CViewText *view= new CViewText (elid, string(""), _Templ.getFontSize(), _Templ.getColor(), _Templ.getShadow());
+ view->_Parent = this;
+ view->setMultiLine (multiLine);
+ if (multiLine) view->setMultiLineSpace (_Space);
+ view->setText (line);
+ view->setColor (textColor);
+ // Herit global-coloring
+ view->setModulateGlobalColor(getModulateGlobalColor());
+ addChild(view);
+ invalidateCoords();
+ }
+
+ // ----------------------------------------------------------------------------
+ void CGroupList::addTextChildID (uint32 nID, bool multiLine)
+ {
+ const string elid = _Id + ":el" + toString(_IdCounter); ++_IdCounter;
+ CViewTextID *view= new CViewTextID (elid, nID, _Templ.getFontSize(), _Templ.getColor(), _Templ.getShadow());
+ view->_Parent = this;
+ view->setMultiLine (multiLine);
+ if (multiLine) view->setMultiLineSpace (_Space);
+ // Herit global-coloring
+ view->setModulateGlobalColor(getModulateGlobalColor());
+ addChild (view);
+ invalidateCoords();
+ }
+
+ // ----------------------------------------------------------------------------
+ void CGroupList::addTextChildID(const std::string &dbPath, bool multiLine /*=true*/)
+ {
+ const string elid = _Id + ":el" + toString(_IdCounter); ++_IdCounter;
+ CViewTextID *view= new CViewTextID (elid, dbPath, _Templ.getFontSize(), _Templ.getColor(), _Templ.getShadow());
+ view->_Parent = this;
+ view->setMultiLine (multiLine);
+ if (multiLine) view->setMultiLineSpace (_Space);
+ // Herit global-coloring
+ view->setModulateGlobalColor(getModulateGlobalColor());
+ addChild (view);
+ invalidateCoords();
+ }
+
+ // ----------------------------------------------------------------------------
+ bool CGroupList::delChild (CViewBase* childToDel, bool noWarning, bool forceDontDelete)
+ {
+ // Look for child
+ uint posChildToDel = 0;
+ for (posChildToDel = 0; posChildToDel < _Elements.size(); ++posChildToDel)
+ {
+ CElementInfo rEI = _Elements[posChildToDel];
+ if (rEI.Element == childToDel)
+ break;
+ }
+
+ if (posChildToDel == _Elements.size())
+ {
+ if (!noWarning)
+ nlwarning("Can't del child %s, it does not exist in the list", childToDel->getId().c_str());
+ return false;
+ }
+ return delChild(posChildToDel, forceDontDelete);
+ }
+
+ // ----------------------------------------------------------------------------
+ bool CGroupList::delChild(uint posChildToDel, bool forceDontDelete)
+ {
+ if (posChildToDel >= (uint) _Elements.size())
+ {
+ nlwarning(" bad index");
+ return false;
+ }
+
+ CViewBase* childToDel = _Elements[posChildToDel].Element;
+
+ childToDel->_Parent = NULL;
+
+ bool elementMustBeDeleted = _Elements[posChildToDel].EltDeleteOnRemove && !forceDontDelete;
+ _Elements.erase (_Elements.begin()+posChildToDel);
+ // Remove from drawing
+ if (dynamic_cast(childToDel)) delGroup(static_cast(childToDel), !elementMustBeDeleted);
+ else if (dynamic_cast(childToDel)) delCtrl(static_cast(childToDel), !elementMustBeDeleted);
+ else delView(childToDel, !elementMustBeDeleted);
+
+ // Bind the new first element
+ if (posChildToDel < _Elements.size())
+ {
+ CViewBase *pVB = _Elements[posChildToDel].Element;
+ if (posChildToDel == 0)
+ {
+ pVB->_ParentPos = NULL;
+ setHSGroup (pVB, _AddElt, _Align);
+ if ((_AddElt == Top) || (_AddElt == Bottom))
+ pVB->setY (0);
+ else
+ pVB->setX (0);
+ }
+ else
+ pVB->_ParentPos = _Elements[posChildToDel-1].Element;
+ }
+ return true;
+ }
+
+ // ----------------------------------------------------------------------------
+ void CGroupList::removeHead ()
+ {
+ if (_Elements.empty())
+ {
+ nlwarning(" Can't remove head, list is empty");
+ return;
+ }
+ delChild (_Elements.begin()->Element);
+ /*CViewBase *pVB = _Elements.begin()->Element;
+ if ((_AddElt == Top) || (_AddElt == Bottom))
+ {
+ sint32 shift = _H - (pVB->getH() + _Space);
+ _H = shift;
+ }
+ else
+ {
+ sint32 shift = _W - (pVB->getW() + _Space);
+ _W = shift;
+ }
+
+ bool FirstElementMustBeDeleted = _Elements.begin()->EltDeleteOnRemove;
+ if (FirstElementMustBeDeleted)
+ delete pVB;
+ _Elements.erase (_Elements.begin());
+ // Remove from drawing
+ for (vector::iterator itg = _ChildrenGroups.begin(); itg != _ChildrenGroups.end(); itg++)
+ if(*itg == pVB)
+ {
+ _ChildrenGroups.erase (itg);
+ break;
+ }
+ for (vector::iterator itc = _Controls.begin(); itc != _Controls.end(); itc++)
+ if(*itc == pVB)
+ {
+ _Controls.erase (itc);
+ break;
+ }
+ for (vector::iterator itv = _Views.begin(); itv != _Views.end(); itv++)
+ if(*itv == pVB)
+ {
+ _Views.erase (itv);
+ break;
+ }
+ delEltOrder (pVB);
+
+ // Bind the new first element
+ pVB = _Elements.begin()->Element;
+ pVB->_ParentPos = NULL;
+ setHSGroup (pVB, _AddElt, _Align);
+ if ((_AddElt == Top) || (_AddElt == Bottom))
+ pVB->setY (0);
+ else
+ pVB->setX (0);*/
+ }
+
+ // ----------------------------------------------------------------------------
+ void CGroupList::setTextTemplate(const CViewText& templ)
+ {
+ _Templ = templ;
+ }
+
+
+ // ----------------------------------------------------------------------------
+ void CGroupList::updateCoords()
+ {
+ if (!_Active) return;
+ // Handle if elements are not active
+ for (sint32 i = 0; i < ((sint32)_Elements.size()-1); ++i)
+ {
+ if (_Elements[i].Element->getActive())
+ setHSParent(_Elements[i+1].Element, _AddElt, _Align, _Space);
+ else
+ setHSParent(_Elements[i+1].Element, _AddElt, _Align, 0);
+ }
+
+ CInterfaceGroup::updateCoords();
+
+ sint32 nCurrentX = 0; // Current offset of an element
+
+ EAlign addElt = _AddElt;
+ if ((addElt == Top) || (addElt == Bottom))
+ {
+ // Calculate size
+ sint32 newH = 0, newW = 0;
+ bool bFirst = true;
+
+ for (uint32 i = 0; i < _Elements.size(); ++i)
+ if (_Elements[i].Element->getActive())
+ {
+ newH += _Elements[i].Element->getH();
+ if (!bFirst)
+ newH += _Space;
+ bFirst = false;
+ nCurrentX += _Elements[i].Element->getX();
+ newW = max (newW, _Elements[i].Element->getW()+(sint32)abs(nCurrentX));
+ }
+ _W = max(newW, _MinW);
+ _H = max(newH, _MinH);
+ if (_DynamicDisplaySize)
+ {
+ _MaxW = _W;
+ _MaxH = _H;
+ }
+ if (_H < _MaxH) setOfsY(0);
+ }
+ else
+ {
+ sint32 newW = 0, newH = 0;
+ bool bFirst = true;
+
+ for (uint32 i = 0; i < _Elements.size(); ++i)
+ if (_Elements[i].Element->getActive())
+ {
+ newW += _Elements[i].Element->getW();
+ if (!bFirst)
+ newW += _Space;
+ bFirst = false;
+ newH = max (newH, _Elements[i].Element->getH());
+ }
+ _W = max(newW, _MinW);
+ _H = max(newH, _MinH);
+ if (_DynamicDisplaySize)
+ {
+ _MaxW = _W;
+ _MaxH = _H;
+ }
+ if (_W < _MaxW) setOfsX(0);
+ }
+
+ CInterfaceElement::updateCoords();
+ }
+
+ // ----------------------------------------------------------------------------
+ void CGroupList::draw ()
+ {
+ // TEMP TEMP
+ //CViewRenderer &rVR = *CViewRenderer::getInstance();
+ //rVR.drawRotFlipBitmap _RenderLayer, (_XReal, _YReal, _WReal, _HReal, 0, false, rVR.getBlankTextureId(), CRGBA(0, 255, 0, 255) );
+ if (_Over)
+ {
+ CViewRenderer &rVR = *CViewRenderer::getInstance();
+
+ if (CWidgetManager::getInstance()->getModalWindow() == NULL)
+ {
+ sint32 x = CWidgetManager::getInstance()->getPointer()->getX();
+ sint32 y = CWidgetManager::getInstance()->getPointer()->getY();
+
+ CInterfaceGroup *pIG = CWidgetManager::getInstance()->getWindowUnder(x, y);
+ CInterfaceGroup *pParent = this;
+ bool bFound = false;
+ while (pParent != NULL)
+ {
+ if (pParent == pIG)
+ {
+ bFound = true;
+ break;
+ }
+ pParent = pParent->getParent();
+ }
+
+ sint32 clipx, clipy, clipw, cliph;
+ getClip(clipx, clipy, clipw, cliph);
+ if ((x < clipx) ||
+ (x > (clipx + clipw)) ||
+ (y < clipy) ||
+ (y > (clipy + cliph)) || !bFound)
+ {
+ _OverElt = -1;
+ }
+ else
+ {
+ for (uint32 i = 0; i < _Elements.size(); ++i)
+ if (_Elements[i].Element->getActive())
+ {
+ CViewBase *pVB = _Elements[i].Element;
+ if ((x >= pVB->getXReal()) &&
+ (x < (pVB->getXReal() + pVB->getWReal()))&&
+ (y >= pVB->getYReal()) &&
+ (y < (pVB->getYReal() + pVB->getHReal())))
+ {
+ _OverElt = i;
+ }
+ }
+ }
+ }
+
+ if (_OverElt != -1)
+ {
+ // Find the first container
+ CInterfaceGroup *pIG = _Parent;
+ CGroupContainerBase *pGC = dynamic_cast(pIG);
+ while (pIG != NULL)
+ {
+ pIG = pIG->_Parent;
+ if (pIG == NULL) break;
+ if (dynamic_cast(pIG) != NULL)
+ pGC = dynamic_cast(pIG);
+ }
+
+ bool bDisplayOverSelection = true;
+ if (pGC != NULL)
+ {
+ if (pGC->isGrayed())
+ bDisplayOverSelection = false;
+ }
+
+ if (bDisplayOverSelection)
+ {
+ CViewBase *pVB = _Elements[_OverElt].Element;
+ CRGBA col = _OverColor;
+ if(getModulateGlobalColor())
+ {
+ col.modulateFromColor (_OverColor, CWidgetManager::getInstance()->getGlobalColorForContent());
+ }
+ else
+ {
+ col= _OverColor;
+ col.A = (uint8)(((sint32)col.A*((sint32)CWidgetManager::getInstance()->getGlobalColorForContent().A+1))>>8);
+ }
+ rVR.drawRotFlipBitmap (_RenderLayer, pVB->getXReal(), pVB->getYReal(),
+ pVB->getWReal(), pVB->getHReal(), 0, false, rVR.getBlankTextureId(),
+ col );
+ }
+
+ }
+ }
+
+ CInterfaceGroup::draw ();
+ }
+
+ // ----------------------------------------------------------------------------
+ bool CGroupList::handleEvent (const NLGUI::CEventDescriptor& event)
+ {
+ if (!_Active)
+ return false;
+
+ bool bReturn = CInterfaceGroup::handleEvent(event);
+
+ if (event.getType() == NLGUI::CEventDescriptor::mouse)
+ {
+ const NLGUI::CEventDescriptorMouse &eventDesc = (const NLGUI::CEventDescriptorMouse &)event;
+
+ _OverElt = -1;
+ if (!isIn(eventDesc.getX(), eventDesc.getY()))
+ return false;
+
+ for (uint32 i = 0; i < _Elements.size(); ++i)
+ if (_Elements[i].Element->getActive())
+ {
+ CViewBase *pVB = _Elements[i].Element;
+ if ((eventDesc.getX() >= pVB->getXReal()) &&
+ (eventDesc.getX() < (pVB->getXReal() + pVB->getWReal()))&&
+ (eventDesc.getY() >= pVB->getYReal()) &&
+ (eventDesc.getY() < (pVB->getYReal() + pVB->getHReal())))
+ {
+ _OverElt = i;
+ }
+ }
+ }
+
+ return bReturn;
+ }
+
+
+
+ // predicate to remove a view from the list of element
+ struct CRemoveViewPred
+ {
+ bool operator()(const CGroupList::CElementInfo &info) const { return dynamic_cast(info.Element) != NULL; }
+ };
+
+ // predicate to remove a ctrl from the list of element
+ struct CRemoveCtrlPred
+ {
+ bool operator()(const CGroupList::CElementInfo &info) const { return dynamic_cast(info.Element) != NULL; }
+ };
+
+ // predicate to remove a group from the list of element
+ struct CRemoveGroupPred
+ {
+ bool operator()(const CGroupList::CElementInfo &info) const { return dynamic_cast(info.Element) != NULL; }
+ };
+
+
+ // ----------------------------------------------------------------------------
+ void CGroupList::clearViews()
+ {
+ _IdCounter = 0;
+ // remove views from the list of elements
+ _Elements.erase(std::remove_if(_Elements.begin(), _Elements.end(), CRemoveViewPred()), _Elements.end());
+ CInterfaceGroup::clearViews();
+ updateCoords();
+ }
+
+ // ----------------------------------------------------------------------------
+ void CGroupList::clearControls()
+ {
+ _IdCounter = 0;
+ // remove views from the list of elements
+ _Elements.erase(std::remove_if(_Elements.begin(), _Elements.end(), CRemoveCtrlPred()), _Elements.end());
+ CInterfaceGroup::clearControls();
+ updateCoords();
+ }
+
+ // ----------------------------------------------------------------------------
+ void CGroupList::clearGroups()
+ {
+ _IdCounter = 0;
+ // remove views from the list of elements
+ _Elements.erase(std::remove_if(_Elements.begin(), _Elements.end(), CRemoveGroupPred()), _Elements.end());
+ CInterfaceGroup::clearGroups();
+ updateCoords();
+ }
+
+ // ----------------------------------------------------------------------------
+ void CGroupList::forceSizeW (sint32 newSizeW)
+ {
+ _W = newSizeW;
+ for (uint32 i = 0; i < _Elements.size(); ++i)
+ {
+ _Elements[i].Element->setW (_W);
+ _Elements[i].Element->CInterfaceElement::updateCoords();
+ }
+ }
+
+ // ----------------------------------------------------------------------------
+ void CGroupList::forceSizeH (sint32 newSizeH)
+ {
+ _H = newSizeH;
+ for (uint32 i = 0; i < _Elements.size(); ++i)
+ {
+ _Elements[i].Element->setH (_H);
+ _Elements[i].Element->CInterfaceElement::updateCoords();
+ }
+ }
+
+ // ----------------------------------------------------------------------------
+ void CGroupList::setMinW(sint32 minW)
+ {
+ _MinW= minW;
+ invalidateCoords();
+ }
+
+ // ----------------------------------------------------------------------------
+ void CGroupList::setMinH(sint32 minH)
+ {
+ _MinH= minH;
+ invalidateCoords();
+ }
+
+ // ----------------------------------------------------------------------------
+ bool CGroupList::addChildAtIndex(CViewBase *child, uint index, bool deleteOnRemove /*=true*/)
+ {
+ if (!child)
+ {
+ nlwarning(" : tried to add a NULL view");
+ return false;
+ }
+ if (index > _Elements.size())
+ {
+ return false;
+ }
+ child->_Parent = this;
+ child->_ParentPos = NULL;
+ child->_Active = true;
+ child->_X = 0;
+ child->_Y = 0;
+ child->_RenderLayer = this->_RenderLayer;
+ // Can't have sizeref on the coordinate corresponding to alignement
+ switch(_AddElt)
+ {
+ case Top:
+ case Bottom:
+ child->_SizeRef &= 1; // sizeref on w is permitted
+ break;
+ case Left:
+ case Right:
+ child->_SizeRef &= 2; // sizeref on h is permitted
+ break;
+ default:
+ nlwarning(" bad align");
+ child->_SizeRef = 0;
+ break;
+ }
+
+ child->_SizeDivW = 10;
+ child->_SizeDivH = 10;
+
+ // Position the element according to the list alignement
+ setHSGroup (child, _AddElt, _Align);
+
+ // update coords of the element (it may use child_resize_h or w)
+ //child->updateCoords();
+ child->invalidateCoords();
+
+ // Update size
+ if ((_AddElt == Top) || (_AddElt == Bottom))
+ {
+ // update the list size
+ sint32 newH = _H + child->getH();
+ if (_Elements.size() > 0)
+ newH += _Space;
+ _H = newH;
+
+ if ((_SizeRef&1) == 0) // No parent size reference in W
+ {
+ sint32 newW = max (_W, child->getW());
+ _W = newW;
+ }
+ }
+ else
+ {
+ // Update the list coords
+ sint32 newW = _W + child->getW();
+ if (_Elements.size() > 0)
+ newW += _Space;
+ _W = newW;
+
+ if ((_SizeRef&2) == 0) // No parent size reference in H
+ {
+ sint32 newH = max (_H, child->getH());
+ _H = newH;
+ }
+ }
+
+ CElementInfo ei;
+ ei.Element = child;
+ ei.EltDeleteOnRemove = deleteOnRemove;
+ ei.Order = 0;
+
+ if (index != 0)
+ {
+ // update alignement
+ setHSParent(child, _AddElt, _Align, _Space);
+ child->_ParentPos = _Elements[index - 1].Element;
+ }
+ _Elements.insert(_Elements.begin() + index, ei);
+ // link next element to this one
+ if (index < _Elements.size() - 1)
+ {
+ _Elements[index + 1].Element->_ParentPos = child;
+ setHSParent(_Elements[index + 1].Element, _AddElt, _Align, _Space);
+ }
+
+ // Add this element for drawing
+ {
+ CInterfaceGroup *pIG = dynamic_cast(child);
+ if (pIG != NULL)
+ {
+ addGroup (pIG, (sint) index);
+ return true;
+ }
+ CCtrlBase *pCB = dynamic_cast(child);
+ if (pCB != NULL)
+ {
+ addCtrl (pCB, (sint) index);
+ return true;
+ }
+ CViewBase *pVB = dynamic_cast(child);
+ if (pVB != NULL)
+ {
+ addView (pVB, (sint) index);
+ return true;
+ }
+ nlstop;
+ return false;
+ }
+ return false;
+ }
+
+ // ----------------------------------------------------------------------------
+ sint32 CGroupList::getElementIndex(CViewBase* child) const
+ {
+ for(uint k = 0; k < _Elements.size(); ++k)
+ {
+ if (_Elements[k].Element == child) return k;
+ }
+ return -1;
+ }
+
+ // ----------------------------------------------------------------------------
+ int CGroupList::luaGetElementIndex(CLuaState &ls)
+ {
+ CLuaIHM::checkArgCount(ls, "getElementIndex", 1);
+ CViewBase * viewBase = dynamic_cast(CLuaIHM::getUIOnStack(ls, 1));
+ ls.push((double) getElementIndex(viewBase));
+ return 1;
+ }
+
+ // ----------------------------------------------------------------------------
+ void CGroupList::swapChildren(uint index1, uint index2)
+ {
+ if (index1 >= _Elements.size()
+ || index2 >= _Elements.size())
+ {
+ nlwarning(" bad indexes");
+ return;
+ }
+ // prevent elements from being deleted
+ bool oldMustDelete1 = _Elements[index1].EltDeleteOnRemove;
+ bool oldMustDelete2 = _Elements[index2].EltDeleteOnRemove;
+
+ uint order1 = _Elements[index1].Order;
+ uint order2 = _Elements[index2].Order;
+
+ _Elements[index1].EltDeleteOnRemove = false;
+ _Elements[index2].EltDeleteOnRemove = false;
+
+ CViewBase *v1 = _Elements[index1].Element;
+ CViewBase *v2 = _Elements[index2].Element;
+
+
+ if (index1 < index2)
+ {
+ delChild(index2);
+ delChild(index1);
+ addChildAtIndex(v2, index1, oldMustDelete2);
+ setOrder(index1, order2);
+ addChildAtIndex(v1, index2, oldMustDelete1);
+ setOrder(index2, order1);
+ }
+ else
+ {
+ delChild(index1);
+ delChild(index2);
+ addChildAtIndex(v1, index2, oldMustDelete1);
+ setOrder(index2, order1);
+ addChildAtIndex(v2, index1, oldMustDelete2);
+ setOrder(index1, order2);
+ }
+ }
+
+ // ----------------------------------------------------------------------------
+ int CGroupList::luaUpChild(CLuaState &ls)
+ {
+ CLuaIHM::checkArgCount(ls, "upChild", 1);
+ CViewBase * viewBase = dynamic_cast(CLuaIHM::getUIOnStack(ls, 1));
+ sint32 indexUpChild = getElementIndex(viewBase);
+ if(indexUpChild > 0)
+ {
+ swapChildren(indexUpChild, indexUpChild-1);
+ }
+ return 0;
+ }
+
+ // ----------------------------------------------------------------------------
+ int CGroupList::luaDownChild(CLuaState &ls)
+ {
+ CLuaIHM::checkArgCount(ls, "downChild", 1);
+ CViewBase * viewBase = dynamic_cast(CLuaIHM::getUIOnStack(ls, 1));
+ sint32 indexDownChild = getElementIndex(viewBase);
+ if(indexDownChild < (sint32) (_Elements.size()-1))
+ {
+ swapChildren(indexDownChild, indexDownChild+1);
+ }
+ return 0;
+ }
+
+ // ----------------------------------------------------------------------------
+ int CGroupList::luaGetChild(CLuaState &ls)
+ {
+ const char *funcName = "getChild";
+ CLuaIHM::checkArgCount(ls, funcName, 1);
+ CLuaIHM::checkArgType(ls, funcName, 1, LUA_TNUMBER);
+ sint index = (sint) ls.toNumber(1);
+ if(index < 0 || index >= (sint) _Elements.size())
+ {
+ CLuaIHM::fails(ls, "getChild : trying to access element %d in list '%s', which has %d elements",
+ index, getId().c_str(), (int) _Elements.size());
+ }
+ CLuaIHM::pushUIOnStack(ls, getChild((uint) index));
+ return 1;
+ }
+
+ // ----------------------------------------------------------------------------
+ void CGroupList::deleteAllChildren()
+ {
+ uint numChildren = getNbElement();
+ for(uint k = 0; k < numChildren; ++k)
+ {
+ delChild(numChildren - 1 - k); // delete in reverse order to avoid unnecessary vector copies
+ }
+ }
+
+ // ----------------------------------------------------------------------------
+ uint CGroupList::getNumActiveChildren() const
+ {
+ uint numChildren = 0;
+ for(uint k = 0; k < _Elements.size(); ++k)
+ {
+ if (_Elements[k].Element->getActive()) ++numChildren;
+ }
+ return numChildren;
+ }
+
+ // ----------------------------------------------------------------------------
+ void CGroupList::setDelOnRemove(uint index, bool delOnRemove)
+ {
+ if (index >= _Elements.size())
+ {
+ nlwarning("bad index");
+ return;
+ }
+ _Elements[index].EltDeleteOnRemove = delOnRemove;
+ }
+
+ // ----------------------------------------------------------------------------
+ bool CGroupList::getDelOnRemove(uint index) const
+ {
+ if (index >= _Elements.size())
+ {
+ nlwarning("bad index");
+ return false;
+ }
+ return _Elements[index].EltDeleteOnRemove;
+ }
+
+
+ // ----------------------------------------------------------------------------
+ int CGroupList::luaAddTextChild(CLuaState &ls)
+ {
+ CLuaIHM::checkArgCount(ls, "addTextChild", 1);
+ ucstring text;
+ if(CLuaIHM::pop(ls, text))
+ {
+ addTextChild(text);
+ }
+ return 0;
+ }
+
+ // ----------------------------------------------------------------------------
+ int CGroupList::luaAddColoredTextChild(CLuaState &ls)
+ {
+ const char *funcName = "addColoredTextChild";
+ CLuaIHM::checkArgCount(ls, funcName, 5);
+ CLuaIHM::checkArgType(ls, funcName, 1, LUA_TSTRING);
+ CLuaIHM::checkArgType(ls, funcName, 2, LUA_TNUMBER);
+ CLuaIHM::checkArgType(ls, funcName, 3, LUA_TNUMBER);
+ CLuaIHM::checkArgType(ls, funcName, 4, LUA_TNUMBER);
+ CLuaIHM::checkArgType(ls, funcName, 5, LUA_TNUMBER);
+ string text = ls.toString(1);
+ ucstring ucText;
+ ucText.fromUtf8(text);
+
+ uint r = (uint) ls.toNumber(2);
+ uint g = (uint) ls.toNumber(3);
+ uint b = (uint) ls.toNumber(4);
+ uint a = (uint) ls.toNumber(5);
+
+ addTextChild(ucText, CRGBA(r, g, b, a));
+
+ return 0;
+ }
+
+ // ----------------------------------------------------------------------------
+ int CGroupList::luaAddChild(CLuaState &ls)
+ {
+ const char *funcName = "addChild";
+ CLuaIHM::checkArgCount(ls, funcName, 1);
+ CViewBase *vb = dynamic_cast(CLuaIHM::getUIOnStack(ls, 1));
+ if (!vb)
+ {
+ CLuaIHM::fails(ls, "%s requires a view, group or control", funcName);
+ }
+ else
+ {
+ addChild(vb);
+ }
+ return 0;
+ }
+
+ // ----------------------------------------------------------------------------
+ int CGroupList::luaAddChildAtIndex(CLuaState &ls)
+ {
+ const char *funcName = "addChildAtIndex";
+ CLuaIHM::checkArgCount(ls, funcName, 2);
+ CLuaIHM::checkArgType(ls, funcName, 2, LUA_TNUMBER);
+ CViewBase *vb = dynamic_cast(CLuaIHM::getUIOnStack(ls, 1));
+ if (!vb)
+ {
+ CLuaIHM::fails(ls, "%s requires a view, group or control", funcName);
+ }
+ else
+ {
+ addChildAtIndex(vb, (uint) ls.toNumber(2));
+ }
+ return 0;
+ }
+
+ // ----------------------------------------------------------------------------
+ int CGroupList::luaDetachChild(CLuaState &ls)
+ {
+ const char *funcName = "detachChild";
+ CLuaIHM::checkArgCount(ls, funcName, 1);
+ CViewBase *vb = dynamic_cast(CLuaIHM::getUIOnStack(ls, 1));
+ if (!vb)
+ {
+ nlwarning("%s requires a view, group or control", funcName);
+ ls.push(false);
+ }
+ else
+ {
+ ls.push(delChild(vb, false, true));
+ }
+ return 1;
+ }
+
+ // ----------------------------------------------------------------------------
+ int CGroupList::luaDelChild(CLuaState &ls)
+ {
+ CLuaIHM::checkArgCount(ls, "CGroupList::delChild", 1);
+ CViewBase *vb = dynamic_cast(CLuaIHM::getUIOnStack(ls, 1));
+ if (vb) delChild(vb);
+ updateCoords();
+ return 0;
+ }
+
+
+
+ // ----------------------------------------------------------------------------
+ int CGroupList::luaClear(CLuaState &ls)
+ {
+ CLuaIHM::checkArgCount(ls, "clear", 0);
+ deleteAllChildren();
+ return 0;
+ }
+
+}
+
diff --git a/code/ryzom/client/src/client_chat_manager.cpp b/code/ryzom/client/src/client_chat_manager.cpp
index 1ebbb53f2..85038deea 100644
--- a/code/ryzom/client/src/client_chat_manager.cpp
+++ b/code/ryzom/client/src/client_chat_manager.cpp
@@ -23,7 +23,7 @@
#include "client_chat_manager.h"
#include "net_manager.h"
-#include "interface_v3/group_list.h"
+#include "nel/gui/group_list.h"
#include "interface_v3/interface_manager.h"
#include "interface_v3/people_interraction.h"
#include "string_manager_client.h"
diff --git a/code/ryzom/client/src/interface_v3/chat_displayer.h b/code/ryzom/client/src/interface_v3/chat_displayer.h
index 9c8120223..fc87ba9cb 100644
--- a/code/ryzom/client/src/interface_v3/chat_displayer.h
+++ b/code/ryzom/client/src/interface_v3/chat_displayer.h
@@ -20,7 +20,7 @@
#define NL_CHAT_DISPLAYER_H
#include "nel/misc/displayer.h"
-#include "group_list.h"
+#include "nel/gui/group_list.h"
#include "interface_manager.h"
#include "nel/misc/mutex.h"
diff --git a/code/ryzom/client/src/interface_v3/chat_window.h b/code/ryzom/client/src/interface_v3/chat_window.h
index 285116998..da6179fd8 100644
--- a/code/ryzom/client/src/interface_v3/chat_window.h
+++ b/code/ryzom/client/src/interface_v3/chat_window.h
@@ -29,6 +29,7 @@ namespace NLGUI
{
class CCtrlBase;
class CViewText;
+ class CGroupList;
}
class CChatWindow;
@@ -206,7 +207,7 @@ protected:
std::vector _FreeTellers;
- void getAssociatedSubWindow(CChatGroup::TGroupType gt, uint32 dynamicChatDbIndex, class CGroupList *&gl, class CCtrlTabButton *&tab);
+ void getAssociatedSubWindow(CChatGroup::TGroupType gt, uint32 dynamicChatDbIndex, NLGUI::CGroupList *&gl, class CCtrlTabButton *&tab);
void updateFreeTellerHeader(CGroupContainer &ft);
private:
diff --git a/code/ryzom/client/src/interface_v3/group_container.cpp b/code/ryzom/client/src/interface_v3/group_container.cpp
index 8e397bcfc..0b103d511 100644
--- a/code/ryzom/client/src/interface_v3/group_container.cpp
+++ b/code/ryzom/client/src/interface_v3/group_container.cpp
@@ -31,7 +31,7 @@
#include "nel/gui/view_text_id.h"
#include "nel/gui/lua_ihm.h"
-#include "group_list.h"
+#include "nel/gui/group_list.h"
#include "nel/gui/ctrl_button.h"
#include "nel/gui/ctrl_scroll.h"
#include "nel/gui/view_text.h"
diff --git a/code/ryzom/client/src/interface_v3/group_container.h b/code/ryzom/client/src/interface_v3/group_container.h
index 26a1b3a45..aa1ac8018 100644
--- a/code/ryzom/client/src/interface_v3/group_container.h
+++ b/code/ryzom/client/src/interface_v3/group_container.h
@@ -30,6 +30,7 @@ namespace NLGUI
class CCtrlScroll;
class CViewText;
class CViewBitmap;
+ class CGroupList;
}
class COptionsContainerInsertion;
@@ -37,7 +38,6 @@ class COptionsContainerMove;
class CGroupContainer;
class CInterfaceManager;
class COptionsLayer;
-class CGroupList;
// ***************************************************************************
/**
diff --git a/code/ryzom/client/src/interface_v3/group_header.h b/code/ryzom/client/src/interface_v3/group_header.h
index 248c9585a..113130d1d 100644
--- a/code/ryzom/client/src/interface_v3/group_header.h
+++ b/code/ryzom/client/src/interface_v3/group_header.h
@@ -18,7 +18,7 @@
#define CL_GROUP_HEADER_H
-#include "group_list.h"
+#include "nel/gui/group_list.h"
class CGroupHeaderEntry;
diff --git a/code/ryzom/client/src/interface_v3/group_html.cpp b/code/ryzom/client/src/interface_v3/group_html.cpp
index 77d4c422d..3f10224c5 100644
--- a/code/ryzom/client/src/interface_v3/group_html.cpp
+++ b/code/ryzom/client/src/interface_v3/group_html.cpp
@@ -29,7 +29,7 @@ extern "C"
#include "../libwww.h"
#include "group_html.h"
-#include "group_list.h"
+#include "nel/gui/group_list.h"
#include "group_container.h"
#include "view_link.h"
#include "nel/gui/ctrl_scroll.h"
diff --git a/code/ryzom/client/src/interface_v3/group_html.h b/code/ryzom/client/src/interface_v3/group_html.h
index 963c0f07f..a0a4b7d7d 100644
--- a/code/ryzom/client/src/interface_v3/group_html.h
+++ b/code/ryzom/client/src/interface_v3/group_html.h
@@ -41,9 +41,9 @@ namespace NLGUI
{
class CCtrlButton;
class CCtrlScroll;
+ class CGroupList;
}
-class CGroupList;
class CDBGroupComboBox;
class CGroupParagraph;
diff --git a/code/ryzom/client/src/interface_v3/group_list.cpp b/code/ryzom/client/src/interface_v3/group_list.cpp
deleted file mode 100644
index 3db145367..000000000
--- a/code/ryzom/client/src/interface_v3/group_list.cpp
+++ /dev/null
@@ -1,1152 +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 "group_list.h"
-#include "nel/gui/interface_element.h"
-#include "nel/gui/view_bitmap.h"
-#include "nel/gui/view_text_id.h"
-#include "nel/gui/group_container_base.h"
-#include "nel/gui/lua_ihm.h"
-#include "nel/misc/xml_auto_ptr.h"
-#include "nel/gui/widget_manager.h"
-#include "nel/gui/view_pointer_base.h"
-
-using namespace std;
-using namespace NLMISC;
-
-NLMISC_REGISTER_OBJECT(CViewBase, CGroupList, std::string, "list");
-
-// ----------------------------------------------------------------------------
-CGroupList::CGroupList(const TCtorParam ¶m)
-: CInterfaceGroup(param),
- _Templ(TCtorParam())
-{
- _IdCounter = 0;
- _MaxElements = 1024;
- _AddElt = Bottom;
- _Align = Left;
- _Space = 0;
- _DynamicDisplaySize = false;
- _MinW= 0;
- _MinH= 0;
- _Over = false;
- _OverColor = CRGBA(255, 255, 255, 32);
- _OverElt = -1;
- _IsGroupList = true;
-}
-
-// ----------------------------------------------------------------------------
-void CGroupList::addChild (CViewBase* child, bool deleteOnRemove)
-{
- if (!child)
- {
- nlwarning(" : tried to add a NULL view");
- return;
- }
-
- // Make sure there's room for the element
- if ((sint32)_Elements.size() == _MaxElements)
- {
- removeHead();
- }
-
- // add child at last index
- addChildAtIndex(child, (uint)_Elements.size(), deleteOnRemove);
- if (_Elements.size() >= 2)
- {
- setOrder((uint)_Elements.size() - 1, getOrder((uint)_Elements.size() - 2) + 1);
- }
-}
-
-// ----------------------------------------------------------------------------
-CGroupList::~CGroupList()
-{
- deleteAllChildren();
-}
-
-// ----------------------------------------------------------------------------
-// Set Hotspot of the first element in reference to the group
-void CGroupList::setHSGroup (CViewBase *child, EAlign addElt, EAlign align)
-{
- switch (addElt)
- {
- case Bottom:
- if (align == Left)
- {
- child->_ParentPosRef = Hotspot_TL;
- child->_PosRef = Hotspot_TL;
- }
- else // align == Right
- {
- child->_ParentPosRef = Hotspot_TR;
- child->_PosRef = Hotspot_TR;
- }
- break;
- case Left:
- if (align == Top)
- {
- child->_ParentPosRef = Hotspot_TR;
- child->_PosRef = Hotspot_TR;
- }
- else // align == Bottom
- {
- child->_ParentPosRef = Hotspot_BR;
- child->_PosRef = Hotspot_BR;
- }
- break;
- case Top:
- if (align == Left)
- {
- child->_ParentPosRef = Hotspot_BL;
- child->_PosRef = Hotspot_BL;
- }
- else // align == Right
- {
- child->_ParentPosRef = Hotspot_BR;
- child->_PosRef = Hotspot_BR;
- }
- break;
- case Right:
- if (align == Top)
- {
- child->_ParentPosRef = Hotspot_TL;
- child->_PosRef = Hotspot_TL;
- }
- else // align == Bottom
- {
- child->_ParentPosRef = Hotspot_BL;
- child->_PosRef = Hotspot_BL;
- }
- break;
- default:
- nlassert(false);
- break;
- }
-}
-
-// ----------------------------------------------------------------------------
-/** align an element towards its parent in the group
- */
-void CGroupList::setHSParent(CViewBase *view, EAlign addElt, EAlign /* align */, uint space)
-{
- if ((addElt == Top) || (addElt == Bottom))
- {
- if (addElt == Bottom)
- {
- if (_Align == Left)
- view->_ParentPosRef = Hotspot_BL;
- else // align == Right
- view->_ParentPosRef = Hotspot_BR;
- //view->_Y = -abs((sint32)space);
- view->_Y = - (sint32)space;
- }
- else if (addElt == Top)
- {
- if (_Align == Left)
- view->_ParentPosRef = Hotspot_TL;
- else // align == Right
- view->_ParentPosRef = Hotspot_TR;
- // view->_Y = abs((sint32)space);
- view->_Y = (sint32)space;
- }
- }
- else
- {
- if (addElt == Left)
- {
- if (_Align == Top)
- view->_ParentPosRef = Hotspot_TL;
- else // align == Bottom
- view->_ParentPosRef = Hotspot_BL;
- //view->_X = -abs((sint32)space);
- view->_X = -(sint32)space;
- }
- else if (addElt == Right)
- {
- if (_Align == Top)
- view->_ParentPosRef = Hotspot_TR;
- else // align == Bottom
- view->_ParentPosRef = Hotspot_BR;
- //view->_X = abs((sint32)space);
- view->_X = (sint32)space;
- }
- }
-}
-
-// ----------------------------------------------------------------------------
-bool CGroupList::parse (xmlNodePtr cur, CInterfaceGroup * parentGroup)
-{
- if (!CInterfaceGroup::parse(cur, parentGroup))
- return false;
-
- // Parse location. If these properties are not specified, set them to 0
-
- CXMLAutoPtr ptr((const char*) xmlGetProp( cur, (xmlChar*)"maxelements" ));
- _MaxElements = 1024;
- if (ptr)
- {
- if (!fromString((const char*)ptr, _MaxElements))
- {
- nlwarning(" Can't parse the 'maxelements' field ");
- }
- }
-
- ptr = (char*) xmlGetProp( cur, (xmlChar*)"addelt" );
- _AddElt = Bottom;
- if (ptr)
- {
- if (stricmp(ptr, "B") == 0)
- _AddElt = Bottom;
- else if (stricmp(ptr, "T") == 0)
- _AddElt = Top;
- else if (stricmp(ptr, "L") == 0)
- _AddElt = Left;
- else if (stricmp(ptr, "R") == 0)
- _AddElt = Right;
- }
-
- ptr = (char*) xmlGetProp( cur, (xmlChar*)"align" );
- _Align = Left;
- if (ptr)
- {
- if (stricmp(ptr, "B") == 0)
- _Align = Bottom;
- else if (stricmp(ptr, "T") == 0)
- _Align = Top;
- else if (stricmp(ptr, "L") == 0)
- _Align = Left;
- else if (stricmp(ptr, "R") == 0)
- _Align = Right;
- }
-
- ptr = (char*) xmlGetProp( cur, (xmlChar*)"space" );
- _Space = 0;
- if (ptr)
- fromString((const char*)ptr, _Space);
-
- EAlign addElt = _AddElt;
-// EAlign align = _Align;
- _GroupSizeRef = _SizeRef;
- if ((addElt == Top) || (addElt == Bottom))
- {
- setMaxW (_W);
- setMaxH(_H);
- _H = 0;
- _SizeRef = _SizeRef&(~2);
- }
- else
- {
- setMaxW (_W);
- setMaxH (_H);
- _W = 0;
- _SizeRef = _SizeRef&(~1);
- }
-
- ptr = (char*) xmlGetProp( cur, (xmlChar*)"over" );
- _Over = false;
- if (ptr) _Over = convertBool(ptr);
-
- ptr = (char*) xmlGetProp( cur, (xmlChar*)"dynamic_display_size" );
- _DynamicDisplaySize = false;
- if (ptr) _DynamicDisplaySize = convertBool(ptr);
-
- ptr = (char*) xmlGetProp( cur, (xmlChar*)"col_over" );
- _OverColor = CRGBA(255, 255, 255, 32);
- if (ptr) _OverColor = convertColor(ptr);
-
-
- // TEMPLATE TEXT SETUP
-
- // justification parameters
- _Templ.parseTextOptions (cur);
-
- // initial text
- ptr = (char*) xmlGetProp( cur, (xmlChar*)"hardtext" );
- if (ptr)
- {
- const char *propPtr = ptr;
- ucstring Text = ucstring(propPtr);
- if ((strlen(propPtr)>2) && (propPtr[0] == 'u') && (propPtr[1] == 'i'))
- Text = CI18N::get (propPtr);
-
- addTextChild(Text);
- }
- else
- {
- ptr = (char*) xmlGetProp( cur, (xmlChar*)"textid" );
- if (ptr)
- {
- uint32 textId;
- fromString((const char*)ptr, textId);
- addTextChildID(textId);
- }
- }
-
- return true;
-}
-
-
-
-// ----------------------------------------------------------------------------
-void CGroupList::addTextChild(const ucstring& line, bool multiLine /*= true*/)
-{
- const string elid = _Id + ":el" + toString(_IdCounter); ++_IdCounter;
- CViewText *view= new CViewText (elid, string(""), _Templ.getFontSize(), _Templ.getColor(), _Templ.getShadow());
- view->_Parent = this;
- view->setMultiLine (multiLine);
- view->setTextMode(_Templ.getTextMode());
- if (multiLine) view->setMultiLineSpace (_Space);
- view->setText (line);
- // Herit global-coloring
- view->setModulateGlobalColor(getModulateGlobalColor());
- addChild(view);
- invalidateCoords();
-}
-
-
-
-// ----------------------------------------------------------------------------
-void CGroupList::addTextChild(const ucstring& line, const CRGBA& textColor, bool multiLine /*= true*/)
-{
- const string elid = _Id + ":el" + toString(_IdCounter); ++_IdCounter;
- CViewText *view= new CViewText (elid, string(""), _Templ.getFontSize(), _Templ.getColor(), _Templ.getShadow());
- view->_Parent = this;
- view->setMultiLine (multiLine);
- if (multiLine) view->setMultiLineSpace (_Space);
- view->setText (line);
- view->setColor (textColor);
- // Herit global-coloring
- view->setModulateGlobalColor(getModulateGlobalColor());
- addChild(view);
- invalidateCoords();
-}
-
-// ----------------------------------------------------------------------------
-void CGroupList::addTextChildID (uint32 nID, bool multiLine)
-{
- const string elid = _Id + ":el" + toString(_IdCounter); ++_IdCounter;
- CViewTextID *view= new CViewTextID (elid, nID, _Templ.getFontSize(), _Templ.getColor(), _Templ.getShadow());
- view->_Parent = this;
- view->setMultiLine (multiLine);
- if (multiLine) view->setMultiLineSpace (_Space);
- // Herit global-coloring
- view->setModulateGlobalColor(getModulateGlobalColor());
- addChild (view);
- invalidateCoords();
-}
-
-// ----------------------------------------------------------------------------
-void CGroupList::addTextChildID(const std::string &dbPath, bool multiLine /*=true*/)
-{
- const string elid = _Id + ":el" + toString(_IdCounter); ++_IdCounter;
- CViewTextID *view= new CViewTextID (elid, dbPath, _Templ.getFontSize(), _Templ.getColor(), _Templ.getShadow());
- view->_Parent = this;
- view->setMultiLine (multiLine);
- if (multiLine) view->setMultiLineSpace (_Space);
- // Herit global-coloring
- view->setModulateGlobalColor(getModulateGlobalColor());
- addChild (view);
- invalidateCoords();
-}
-
-// ----------------------------------------------------------------------------
-bool CGroupList::delChild (CViewBase* childToDel, bool noWarning, bool forceDontDelete)
-{
- // Look for child
- uint posChildToDel = 0;
- for (posChildToDel = 0; posChildToDel < _Elements.size(); ++posChildToDel)
- {
- CElementInfo rEI = _Elements[posChildToDel];
- if (rEI.Element == childToDel)
- break;
- }
-
- if (posChildToDel == _Elements.size())
- {
- if (!noWarning)
- nlwarning("Can't del child %s, it does not exist in the list", childToDel->getId().c_str());
- return false;
- }
- return delChild(posChildToDel, forceDontDelete);
-}
-
-// ----------------------------------------------------------------------------
-bool CGroupList::delChild(uint posChildToDel, bool forceDontDelete)
-{
- if (posChildToDel >= (uint) _Elements.size())
- {
- nlwarning(" bad index");
- return false;
- }
-
- CViewBase* childToDel = _Elements[posChildToDel].Element;
-
- childToDel->_Parent = NULL;
-
- bool elementMustBeDeleted = _Elements[posChildToDel].EltDeleteOnRemove && !forceDontDelete;
- _Elements.erase (_Elements.begin()+posChildToDel);
- // Remove from drawing
- if (dynamic_cast(childToDel)) delGroup(static_cast(childToDel), !elementMustBeDeleted);
- else if (dynamic_cast(childToDel)) delCtrl(static_cast(childToDel), !elementMustBeDeleted);
- else delView(childToDel, !elementMustBeDeleted);
-
- // Bind the new first element
- if (posChildToDel < _Elements.size())
- {
- CViewBase *pVB = _Elements[posChildToDel].Element;
- if (posChildToDel == 0)
- {
- pVB->_ParentPos = NULL;
- setHSGroup (pVB, _AddElt, _Align);
- if ((_AddElt == Top) || (_AddElt == Bottom))
- pVB->setY (0);
- else
- pVB->setX (0);
- }
- else
- pVB->_ParentPos = _Elements[posChildToDel-1].Element;
- }
- return true;
-}
-
-// ----------------------------------------------------------------------------
-void CGroupList::removeHead ()
-{
- if (_Elements.empty())
- {
- nlwarning(" Can't remove head, list is empty");
- return;
- }
- delChild (_Elements.begin()->Element);
- /*CViewBase *pVB = _Elements.begin()->Element;
- if ((_AddElt == Top) || (_AddElt == Bottom))
- {
- sint32 shift = _H - (pVB->getH() + _Space);
- _H = shift;
- }
- else
- {
- sint32 shift = _W - (pVB->getW() + _Space);
- _W = shift;
- }
-
- bool FirstElementMustBeDeleted = _Elements.begin()->EltDeleteOnRemove;
- if (FirstElementMustBeDeleted)
- delete pVB;
- _Elements.erase (_Elements.begin());
- // Remove from drawing
- for (vector::iterator itg = _ChildrenGroups.begin(); itg != _ChildrenGroups.end(); itg++)
- if(*itg == pVB)
- {
- _ChildrenGroups.erase (itg);
- break;
- }
- for (vector::iterator itc = _Controls.begin(); itc != _Controls.end(); itc++)
- if(*itc == pVB)
- {
- _Controls.erase (itc);
- break;
- }
- for (vector::iterator itv = _Views.begin(); itv != _Views.end(); itv++)
- if(*itv == pVB)
- {
- _Views.erase (itv);
- break;
- }
- delEltOrder (pVB);
-
- // Bind the new first element
- pVB = _Elements.begin()->Element;
- pVB->_ParentPos = NULL;
- setHSGroup (pVB, _AddElt, _Align);
- if ((_AddElt == Top) || (_AddElt == Bottom))
- pVB->setY (0);
- else
- pVB->setX (0);*/
-}
-
-// ----------------------------------------------------------------------------
-void CGroupList::setTextTemplate(const CViewText& templ)
-{
- _Templ = templ;
-}
-
-
-// ----------------------------------------------------------------------------
-void CGroupList::updateCoords()
-{
- if (!_Active) return;
- // Handle if elements are not active
- for (sint32 i = 0; i < ((sint32)_Elements.size()-1); ++i)
- {
- if (_Elements[i].Element->getActive())
- setHSParent(_Elements[i+1].Element, _AddElt, _Align, _Space);
- else
- setHSParent(_Elements[i+1].Element, _AddElt, _Align, 0);
- }
-
- CInterfaceGroup::updateCoords();
-
- sint32 nCurrentX = 0; // Current offset of an element
-
- EAlign addElt = _AddElt;
- if ((addElt == Top) || (addElt == Bottom))
- {
- // Calculate size
- sint32 newH = 0, newW = 0;
- bool bFirst = true;
-
- for (uint32 i = 0; i < _Elements.size(); ++i)
- if (_Elements[i].Element->getActive())
- {
- newH += _Elements[i].Element->getH();
- if (!bFirst)
- newH += _Space;
- bFirst = false;
- nCurrentX += _Elements[i].Element->getX();
- newW = max (newW, _Elements[i].Element->getW()+(sint32)abs(nCurrentX));
- }
- _W = max(newW, _MinW);
- _H = max(newH, _MinH);
- if (_DynamicDisplaySize)
- {
- _MaxW = _W;
- _MaxH = _H;
- }
- if (_H < _MaxH) setOfsY(0);
- }
- else
- {
- sint32 newW = 0, newH = 0;
- bool bFirst = true;
-
- for (uint32 i = 0; i < _Elements.size(); ++i)
- if (_Elements[i].Element->getActive())
- {
- newW += _Elements[i].Element->getW();
- if (!bFirst)
- newW += _Space;
- bFirst = false;
- newH = max (newH, _Elements[i].Element->getH());
- }
- _W = max(newW, _MinW);
- _H = max(newH, _MinH);
- if (_DynamicDisplaySize)
- {
- _MaxW = _W;
- _MaxH = _H;
- }
- if (_W < _MaxW) setOfsX(0);
- }
-
- CInterfaceElement::updateCoords();
-}
-
-// ----------------------------------------------------------------------------
-void CGroupList::draw ()
-{
- // TEMP TEMP
- //CViewRenderer &rVR = *CViewRenderer::getInstance();
- //rVR.drawRotFlipBitmap _RenderLayer, (_XReal, _YReal, _WReal, _HReal, 0, false, rVR.getBlankTextureId(), CRGBA(0, 255, 0, 255) );
- if (_Over)
- {
- CViewRenderer &rVR = *CViewRenderer::getInstance();
-
- if (CWidgetManager::getInstance()->getModalWindow() == NULL)
- {
- sint32 x = CWidgetManager::getInstance()->getPointer()->getX();
- sint32 y = CWidgetManager::getInstance()->getPointer()->getY();
-
- CInterfaceGroup *pIG = CWidgetManager::getInstance()->getWindowUnder(x, y);
- CInterfaceGroup *pParent = this;
- bool bFound = false;
- while (pParent != NULL)
- {
- if (pParent == pIG)
- {
- bFound = true;
- break;
- }
- pParent = pParent->getParent();
- }
-
- sint32 clipx, clipy, clipw, cliph;
- getClip(clipx, clipy, clipw, cliph);
- if ((x < clipx) ||
- (x > (clipx + clipw)) ||
- (y < clipy) ||
- (y > (clipy + cliph)) || !bFound)
- {
- _OverElt = -1;
- }
- else
- {
- for (uint32 i = 0; i < _Elements.size(); ++i)
- if (_Elements[i].Element->getActive())
- {
- CViewBase *pVB = _Elements[i].Element;
- if ((x >= pVB->getXReal()) &&
- (x < (pVB->getXReal() + pVB->getWReal()))&&
- (y >= pVB->getYReal()) &&
- (y < (pVB->getYReal() + pVB->getHReal())))
- {
- _OverElt = i;
- }
- }
- }
- }
-
- if (_OverElt != -1)
- {
- // Find the first container
- CInterfaceGroup *pIG = _Parent;
- CGroupContainerBase *pGC = dynamic_cast(pIG);
- while (pIG != NULL)
- {
- pIG = pIG->_Parent;
- if (pIG == NULL) break;
- if (dynamic_cast(pIG) != NULL)
- pGC = dynamic_cast(pIG);
- }
-
- bool bDisplayOverSelection = true;
- if (pGC != NULL)
- {
- if (pGC->isGrayed())
- bDisplayOverSelection = false;
- }
-
- if (bDisplayOverSelection)
- {
- CViewBase *pVB = _Elements[_OverElt].Element;
- CRGBA col = _OverColor;
- if(getModulateGlobalColor())
- {
- col.modulateFromColor (_OverColor, CWidgetManager::getInstance()->getGlobalColorForContent());
- }
- else
- {
- col= _OverColor;
- col.A = (uint8)(((sint32)col.A*((sint32)CWidgetManager::getInstance()->getGlobalColorForContent().A+1))>>8);
- }
- rVR.drawRotFlipBitmap (_RenderLayer, pVB->getXReal(), pVB->getYReal(),
- pVB->getWReal(), pVB->getHReal(), 0, false, rVR.getBlankTextureId(),
- col );
- }
-
- }
- }
-
- CInterfaceGroup::draw ();
-}
-
-// ----------------------------------------------------------------------------
-bool CGroupList::handleEvent (const NLGUI::CEventDescriptor& event)
-{
- if (!_Active)
- return false;
-
- bool bReturn = CInterfaceGroup::handleEvent(event);
-
- if (event.getType() == NLGUI::CEventDescriptor::mouse)
- {
- const NLGUI::CEventDescriptorMouse &eventDesc = (const NLGUI::CEventDescriptorMouse &)event;
-
- _OverElt = -1;
- if (!isIn(eventDesc.getX(), eventDesc.getY()))
- return false;
-
- for (uint32 i = 0; i < _Elements.size(); ++i)
- if (_Elements[i].Element->getActive())
- {
- CViewBase *pVB = _Elements[i].Element;
- if ((eventDesc.getX() >= pVB->getXReal()) &&
- (eventDesc.getX() < (pVB->getXReal() + pVB->getWReal()))&&
- (eventDesc.getY() >= pVB->getYReal()) &&
- (eventDesc.getY() < (pVB->getYReal() + pVB->getHReal())))
- {
- _OverElt = i;
- }
- }
- }
-
- return bReturn;
-}
-
-
-
-// predicate to remove a view from the list of element
-struct CRemoveViewPred
-{
- bool operator()(const CGroupList::CElementInfo &info) const { return dynamic_cast(info.Element) != NULL; }
-};
-
-// predicate to remove a ctrl from the list of element
-struct CRemoveCtrlPred
-{
- bool operator()(const CGroupList::CElementInfo &info) const { return dynamic_cast(info.Element) != NULL; }
-};
-
-// predicate to remove a group from the list of element
-struct CRemoveGroupPred
-{
- bool operator()(const CGroupList::CElementInfo &info) const { return dynamic_cast(info.Element) != NULL; }
-};
-
-
-// ----------------------------------------------------------------------------
-void CGroupList::clearViews()
-{
- _IdCounter = 0;
- // remove views from the list of elements
- _Elements.erase(std::remove_if(_Elements.begin(), _Elements.end(), CRemoveViewPred()), _Elements.end());
- CInterfaceGroup::clearViews();
- updateCoords();
-}
-
-// ----------------------------------------------------------------------------
-void CGroupList::clearControls()
-{
- _IdCounter = 0;
- // remove views from the list of elements
- _Elements.erase(std::remove_if(_Elements.begin(), _Elements.end(), CRemoveCtrlPred()), _Elements.end());
- CInterfaceGroup::clearControls();
- updateCoords();
-}
-
-// ----------------------------------------------------------------------------
-void CGroupList::clearGroups()
-{
- _IdCounter = 0;
- // remove views from the list of elements
- _Elements.erase(std::remove_if(_Elements.begin(), _Elements.end(), CRemoveGroupPred()), _Elements.end());
- CInterfaceGroup::clearGroups();
- updateCoords();
-}
-
-// ----------------------------------------------------------------------------
-void CGroupList::forceSizeW (sint32 newSizeW)
-{
- _W = newSizeW;
- for (uint32 i = 0; i < _Elements.size(); ++i)
- {
- _Elements[i].Element->setW (_W);
- _Elements[i].Element->CInterfaceElement::updateCoords();
- }
-}
-
-// ----------------------------------------------------------------------------
-void CGroupList::forceSizeH (sint32 newSizeH)
-{
- _H = newSizeH;
- for (uint32 i = 0; i < _Elements.size(); ++i)
- {
- _Elements[i].Element->setH (_H);
- _Elements[i].Element->CInterfaceElement::updateCoords();
- }
-}
-
-// ----------------------------------------------------------------------------
-void CGroupList::setMinW(sint32 minW)
-{
- _MinW= minW;
- invalidateCoords();
-}
-
-// ----------------------------------------------------------------------------
-void CGroupList::setMinH(sint32 minH)
-{
- _MinH= minH;
- invalidateCoords();
-}
-
-// ----------------------------------------------------------------------------
-bool CGroupList::addChildAtIndex(CViewBase *child, uint index, bool deleteOnRemove /*=true*/)
-{
- if (!child)
- {
- nlwarning(" : tried to add a NULL view");
- return false;
- }
- if (index > _Elements.size())
- {
- return false;
- }
- child->_Parent = this;
- child->_ParentPos = NULL;
- child->_Active = true;
- child->_X = 0;
- child->_Y = 0;
- child->_RenderLayer = this->_RenderLayer;
- // Can't have sizeref on the coordinate corresponding to alignement
- switch(_AddElt)
- {
- case Top:
- case Bottom:
- child->_SizeRef &= 1; // sizeref on w is permitted
- break;
- case Left:
- case Right:
- child->_SizeRef &= 2; // sizeref on h is permitted
- break;
- default:
- nlwarning(" bad align");
- child->_SizeRef = 0;
- break;
- }
-
- child->_SizeDivW = 10;
- child->_SizeDivH = 10;
-
- // Position the element according to the list alignement
- setHSGroup (child, _AddElt, _Align);
-
- // update coords of the element (it may use child_resize_h or w)
- //child->updateCoords();
- child->invalidateCoords();
-
- // Update size
- if ((_AddElt == Top) || (_AddElt == Bottom))
- {
- // update the list size
- sint32 newH = _H + child->getH();
- if (_Elements.size() > 0)
- newH += _Space;
- _H = newH;
-
- if ((_SizeRef&1) == 0) // No parent size reference in W
- {
- sint32 newW = max (_W, child->getW());
- _W = newW;
- }
- }
- else
- {
- // Update the list coords
- sint32 newW = _W + child->getW();
- if (_Elements.size() > 0)
- newW += _Space;
- _W = newW;
-
- if ((_SizeRef&2) == 0) // No parent size reference in H
- {
- sint32 newH = max (_H, child->getH());
- _H = newH;
- }
- }
-
- CElementInfo ei;
- ei.Element = child;
- ei.EltDeleteOnRemove = deleteOnRemove;
- ei.Order = 0;
-
- if (index != 0)
- {
- // update alignement
- setHSParent(child, _AddElt, _Align, _Space);
- child->_ParentPos = _Elements[index - 1].Element;
- }
- _Elements.insert(_Elements.begin() + index, ei);
- // link next element to this one
- if (index < _Elements.size() - 1)
- {
- _Elements[index + 1].Element->_ParentPos = child;
- setHSParent(_Elements[index + 1].Element, _AddElt, _Align, _Space);
- }
-
- // Add this element for drawing
- {
- CInterfaceGroup *pIG = dynamic_cast(child);
- if (pIG != NULL)
- {
- addGroup (pIG, (sint) index);
- return true;
- }
- CCtrlBase *pCB = dynamic_cast(child);
- if (pCB != NULL)
- {
- addCtrl (pCB, (sint) index);
- return true;
- }
- CViewBase *pVB = dynamic_cast(child);
- if (pVB != NULL)
- {
- addView (pVB, (sint) index);
- return true;
- }
- nlstop;
- return false;
- }
- return false;
-}
-
-// ----------------------------------------------------------------------------
-sint32 CGroupList::getElementIndex(CViewBase* child) const
-{
- for(uint k = 0; k < _Elements.size(); ++k)
- {
- if (_Elements[k].Element == child) return k;
- }
- return -1;
-}
-
-// ----------------------------------------------------------------------------
-int CGroupList::luaGetElementIndex(CLuaState &ls)
-{
- CLuaIHM::checkArgCount(ls, "getElementIndex", 1);
- CViewBase * viewBase = dynamic_cast(CLuaIHM::getUIOnStack(ls, 1));
- ls.push((double) getElementIndex(viewBase));
- return 1;
-}
-
-// ----------------------------------------------------------------------------
-void CGroupList::swapChildren(uint index1, uint index2)
-{
- if (index1 >= _Elements.size()
- || index2 >= _Elements.size())
- {
- nlwarning(" bad indexes");
- return;
- }
- // prevent elements from being deleted
- bool oldMustDelete1 = _Elements[index1].EltDeleteOnRemove;
- bool oldMustDelete2 = _Elements[index2].EltDeleteOnRemove;
-
- uint order1 = _Elements[index1].Order;
- uint order2 = _Elements[index2].Order;
-
- _Elements[index1].EltDeleteOnRemove = false;
- _Elements[index2].EltDeleteOnRemove = false;
-
- CViewBase *v1 = _Elements[index1].Element;
- CViewBase *v2 = _Elements[index2].Element;
-
-
- if (index1 < index2)
- {
- delChild(index2);
- delChild(index1);
- addChildAtIndex(v2, index1, oldMustDelete2);
- setOrder(index1, order2);
- addChildAtIndex(v1, index2, oldMustDelete1);
- setOrder(index2, order1);
- }
- else
- {
- delChild(index1);
- delChild(index2);
- addChildAtIndex(v1, index2, oldMustDelete1);
- setOrder(index2, order1);
- addChildAtIndex(v2, index1, oldMustDelete2);
- setOrder(index1, order2);
- }
-}
-
-// ----------------------------------------------------------------------------
-int CGroupList::luaUpChild(CLuaState &ls)
-{
- CLuaIHM::checkArgCount(ls, "upChild", 1);
- CViewBase * viewBase = dynamic_cast(CLuaIHM::getUIOnStack(ls, 1));
- sint32 indexUpChild = getElementIndex(viewBase);
- if(indexUpChild > 0)
- {
- swapChildren(indexUpChild, indexUpChild-1);
- }
- return 0;
-}
-
-// ----------------------------------------------------------------------------
-int CGroupList::luaDownChild(CLuaState &ls)
-{
- CLuaIHM::checkArgCount(ls, "downChild", 1);
- CViewBase * viewBase = dynamic_cast(CLuaIHM::getUIOnStack(ls, 1));
- sint32 indexDownChild = getElementIndex(viewBase);
- if(indexDownChild < (sint32) (_Elements.size()-1))
- {
- swapChildren(indexDownChild, indexDownChild+1);
- }
- return 0;
-}
-
-// ----------------------------------------------------------------------------
-int CGroupList::luaGetChild(CLuaState &ls)
-{
- const char *funcName = "getChild";
- CLuaIHM::checkArgCount(ls, funcName, 1);
- CLuaIHM::checkArgType(ls, funcName, 1, LUA_TNUMBER);
- sint index = (sint) ls.toNumber(1);
- if(index < 0 || index >= (sint) _Elements.size())
- {
- CLuaIHM::fails(ls, "getChild : trying to access element %d in list '%s', which has %d elements",
- index, getId().c_str(), (int) _Elements.size());
- }
- CLuaIHM::pushUIOnStack(ls, getChild((uint) index));
- return 1;
-}
-
-// ----------------------------------------------------------------------------
-void CGroupList::deleteAllChildren()
-{
- uint numChildren = getNbElement();
- for(uint k = 0; k < numChildren; ++k)
- {
- delChild(numChildren - 1 - k); // delete in reverse order to avoid unnecessary vector copies
- }
-}
-
-// ----------------------------------------------------------------------------
-uint CGroupList::getNumActiveChildren() const
-{
- uint numChildren = 0;
- for(uint k = 0; k < _Elements.size(); ++k)
- {
- if (_Elements[k].Element->getActive()) ++numChildren;
- }
- return numChildren;
-}
-
-// ----------------------------------------------------------------------------
-void CGroupList::setDelOnRemove(uint index, bool delOnRemove)
-{
- if (index >= _Elements.size())
- {
- nlwarning("bad index");
- return;
- }
- _Elements[index].EltDeleteOnRemove = delOnRemove;
-}
-
-// ----------------------------------------------------------------------------
-bool CGroupList::getDelOnRemove(uint index) const
-{
- if (index >= _Elements.size())
- {
- nlwarning("bad index");
- return false;
- }
- return _Elements[index].EltDeleteOnRemove;
-}
-
-
-// ----------------------------------------------------------------------------
-int CGroupList::luaAddTextChild(CLuaState &ls)
-{
- CLuaIHM::checkArgCount(ls, "addTextChild", 1);
- ucstring text;
- if(CLuaIHM::pop(ls, text))
- {
- addTextChild(text);
- }
- return 0;
-}
-
-// ----------------------------------------------------------------------------
-int CGroupList::luaAddColoredTextChild(CLuaState &ls)
-{
- const char *funcName = "addColoredTextChild";
- CLuaIHM::checkArgCount(ls, funcName, 5);
- CLuaIHM::checkArgType(ls, funcName, 1, LUA_TSTRING);
- CLuaIHM::checkArgType(ls, funcName, 2, LUA_TNUMBER);
- CLuaIHM::checkArgType(ls, funcName, 3, LUA_TNUMBER);
- CLuaIHM::checkArgType(ls, funcName, 4, LUA_TNUMBER);
- CLuaIHM::checkArgType(ls, funcName, 5, LUA_TNUMBER);
- string text = ls.toString(1);
- ucstring ucText;
- ucText.fromUtf8(text);
-
- uint r = (uint) ls.toNumber(2);
- uint g = (uint) ls.toNumber(3);
- uint b = (uint) ls.toNumber(4);
- uint a = (uint) ls.toNumber(5);
-
- addTextChild(ucText, CRGBA(r, g, b, a));
-
- return 0;
-}
-
-// ----------------------------------------------------------------------------
-int CGroupList::luaAddChild(CLuaState &ls)
-{
- const char *funcName = "addChild";
- CLuaIHM::checkArgCount(ls, funcName, 1);
- CViewBase *vb = dynamic_cast(CLuaIHM::getUIOnStack(ls, 1));
- if (!vb)
- {
- CLuaIHM::fails(ls, "%s requires a view, group or control", funcName);
- }
- else
- {
- addChild(vb);
- }
- return 0;
-}
-
-// ----------------------------------------------------------------------------
-int CGroupList::luaAddChildAtIndex(CLuaState &ls)
-{
- const char *funcName = "addChildAtIndex";
- CLuaIHM::checkArgCount(ls, funcName, 2);
- CLuaIHM::checkArgType(ls, funcName, 2, LUA_TNUMBER);
- CViewBase *vb = dynamic_cast(CLuaIHM::getUIOnStack(ls, 1));
- if (!vb)
- {
- CLuaIHM::fails(ls, "%s requires a view, group or control", funcName);
- }
- else
- {
- addChildAtIndex(vb, (uint) ls.toNumber(2));
- }
- return 0;
-}
-
-// ----------------------------------------------------------------------------
-int CGroupList::luaDetachChild(CLuaState &ls)
-{
- const char *funcName = "detachChild";
- CLuaIHM::checkArgCount(ls, funcName, 1);
- CViewBase *vb = dynamic_cast(CLuaIHM::getUIOnStack(ls, 1));
- if (!vb)
- {
- nlwarning("%s requires a view, group or control", funcName);
- ls.push(false);
- }
- else
- {
- ls.push(delChild(vb, false, true));
- }
- return 1;
-}
-
-// ----------------------------------------------------------------------------
-int CGroupList::luaDelChild(CLuaState &ls)
-{
- CLuaIHM::checkArgCount(ls, "CGroupList::delChild", 1);
- CViewBase *vb = dynamic_cast(CLuaIHM::getUIOnStack(ls, 1));
- if (vb) delChild(vb);
- updateCoords();
- return 0;
-}
-
-
-
-// ----------------------------------------------------------------------------
-int CGroupList::luaClear(CLuaState &ls)
-{
- CLuaIHM::checkArgCount(ls, "clear", 0);
- deleteAllChildren();
- return 0;
-}
-
diff --git a/code/ryzom/client/src/interface_v3/group_list.h b/code/ryzom/client/src/interface_v3/group_list.h
deleted file mode 100644
index 94b5d5b7f..000000000
--- a/code/ryzom/client/src/interface_v3/group_list.h
+++ /dev/null
@@ -1,258 +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 NL_GROUP_LIST_H
-#define NL_GROUP_LIST_H
-
-#include "nel/misc/types_nl.h"
-#include "nel/gui/group_frame.h"
-#include "nel/gui/view_text.h"
-
-
-// ----------------------------------------------------------------------------
-class CGroupList : public CInterfaceGroup
-{
-public:
- enum EAlign
- {
- Bottom = 0,
- Top,
- Left,
- Right
- };
-
- ///constructor
- CGroupList(const TCtorParam ¶m);
-
- // dtor
- ~CGroupList();
- /**
- * add a child element to the group at the last position
- * 'order' of the element is set to the last order + 1
- * \param child : pointer to the child element
- */
- void addChild (CViewBase* child, bool deleteOnRemove=true);
-
-
- /** add a child before the element at the given index.
- * 'order' of the element is set to 0
- * \return true if there was enough room for that child
- */
- bool addChildAtIndex(CViewBase *child, uint index, bool deleteOnRemove = true);
-
- /**
- * add a text child element to the group, using the text template
- * \param line : text to be added
- * \param color : text color
- */
- void addTextChild (const ucstring& line,const NLMISC::CRGBA &textColor, bool multiLine = true);
-
- /**
- * add a text child element to the group, using the text template
- * \param line : text to be added
- */
- void addTextChild (const ucstring& line, bool multiLine = true);
-
- /// Same as adding a text child but the text will be taken from the string manager
- void addTextChildID (uint32 id, bool multiLine = true);
- // the same, but with id taken from the database
- void addTextChildID (const std::string &dbPath, bool multiLine = true);
-
-
- bool delChild (CViewBase* child, bool noWarning=false, bool forceDontDelete = false);
-
- bool delChild(uint index, bool forceDontDelete = false);
-
- CViewBase *getChild(uint index) const { return _Elements[index].Element; }
- int luaGetChild(CLuaState &ls);
-
- void deleteAllChildren();
-
- void removeHead();
-
- // Get the number of children
- uint getNumChildren() const { return (uint)_Elements.size(); }
-
- // Get the number of active children
- uint getNumActiveChildren() const;
-
- /**
- * set the template that will be used to add text;
- * \templ : a CViewText object. Only its font size, color and shadow are required.
- */
- void setTextTemplate(const CViewText& templ);
-
- /**
- * set the template that will be used to add text;
- * \templ : a CViewText object. Only its font size, color and shadow are required.
- */
- CViewText * getTextTemplatePtr()
- {
- return &_Templ;
- }
-
- /**
- * parse the element and initalize it
- * \paral cur : pointer to the node describing this element
- * \param parentGroup : the parent group of this element
- * \return true if success
- */
- virtual bool parse (xmlNodePtr cur, CInterfaceGroup * parentGroup);
- //virtual uint32 getMemory();
- /**
- * init or reset the children element coords. Orverloaded from CInterfaceGroup because we begin with the last inserted element here
- */
- virtual void updateCoords();
-
- virtual void draw();
-
- virtual bool handleEvent (const NLGUI::CEventDescriptor& eventDesc);
-
- virtual void clearViews();
- virtual void clearControls();
- virtual void clearGroups();
-
- void setSpace (sint32 s) { _Space = s; }
-
- virtual CInterfaceElement* getElement (const std::string &id)
- { return CInterfaceGroup::getElement (id); }
-
- sint32 getNbElement() { return (sint32)_Elements.size(); }
- sint32 getSpace() { return _Space; }
-
- void setDynamicDisplaySize (bool dds) { _DynamicDisplaySize = dds; }
- bool getDynamicDisplaySize() { return _DynamicDisplaySize; }
-
- void forceSizeW (sint32 newSizeW);
- void forceSizeH (sint32 newSizeH);
-
- void setMinW(sint32 minW);
- void setMinH(sint32 minH);
- sint32 getMinW() const {return _MinW;}
- sint32 getMinH() const {return _MinH;}
-
- // set the rank for the element at the given index (used to reinsert container after they have been turned into popups)
- void setOrder(uint index, uint order) { _Elements[index].Order = order; }
- uint getOrder(uint index) const { return _Elements[index].Order; }
-
- // get element of index or -1 if not found
- sint32 getElementIndex(CViewBase* child) const;
- int luaGetElementIndex(CLuaState &ls);
-
- // swap 2 entries in the list (and also their orders)
- void swapChildren(uint index1, uint index2);
- int luaUpChild(CLuaState &ls);
- int luaDownChild(CLuaState &ls);
-
- // deleteOnRemove flag
- void setDelOnRemove(uint index, bool delOnRemove);
- bool getDelOnRemove(uint index) const;
-
- // children number
- void setChildrenNb(sint32 /* val */){}
- sint32 getChildrenNb() const {return (sint32)_Elements.size();}
-
- int luaAddChild(CLuaState &ls);
- int luaAddChildAtIndex(CLuaState &ls);
- int luaDetachChild(CLuaState &ls);
- int luaClear(CLuaState &ls); // synonimous for deleteAllChildren
- int luaAddTextChild(CLuaState &ls);
- int luaAddColoredTextChild(CLuaState &ls);
- int luaDelChild(CLuaState &ls);
-
- REFLECT_EXPORT_START(CGroupList, CInterfaceGroup)
- REFLECT_LUA_METHOD("addTextChild", luaAddTextChild)
- REFLECT_LUA_METHOD("addColoredTextChild", luaAddColoredTextChild)
- REFLECT_LUA_METHOD("addChild", luaAddChild);
- REFLECT_LUA_METHOD("addChildAtIndex", luaAddChildAtIndex);
- REFLECT_LUA_METHOD("detachChild", luaDetachChild);
- REFLECT_LUA_METHOD("clear", luaClear);
- REFLECT_LUA_METHOD("delChild", luaDelChild);
- REFLECT_LUA_METHOD("upChild", luaUpChild);
- REFLECT_LUA_METHOD("downChild", luaDownChild);
- REFLECT_LUA_METHOD("getChild", luaGetChild);
- REFLECT_LUA_METHOD("getElementIndex", luaGetElementIndex);
- REFLECT_SINT32 ("childrenNb", getChildrenNb, setChildrenNb);
- REFLECT_EXPORT_END
-
-
-protected:
-
- //max number of elements
- sint32 _MaxElements;
-
- // Where to add next element
- EAlign _AddElt;
-
- // Where to align the newly added element
- EAlign _Align;
-
- // Space between two elements in pixel
- sint32 _Space;
-
- // Text template
- CViewText _Templ;
-
- // Current id of the view
- sint32 _IdCounter;
-
- // Used for context menu to display the same size as the whole content
- bool _DynamicDisplaySize;
-
- // Do we have a color under the element pointed by the mouse
- bool _Over;
-
- // If over is true so we have a color
- NLMISC::CRGBA _OverColor;
-
- // Current elt over the pointer
- sint32 _OverElt;
-
- struct CElementInfo
- {
- uint Order; // Used to sort the window by their insertion order.
- // This is used to put back a window at the right place if it was turned into a popup.
- CViewBase *Element;
- bool EltDeleteOnRemove;
- };
- friend struct CRemoveViewPred;
- friend struct CRemoveCtrlPred;
- friend struct CRemoveGroupPred;
-
- // The list is forced to be at least this size in updateCoords().
- sint32 _MinW;
- sint32 _MinH;
-
-
- // To conserve elements in the order they have been added
- // (the element drawn are stored in _views, _contrlos or _childrengroups of cinterfacegroup
- std::vector _Elements;
-
-private:
-
- void setHSGroup (CViewBase *child, EAlign addElt, EAlign align);
- void setHSParent(CViewBase *view, EAlign addElt, EAlign align, uint space);
-
-};
-
-
-#endif // NL_GROUP_LIST_H
-
-/* End of group_list.h */
-
-
diff --git a/code/ryzom/client/src/interface_v3/group_menu.h b/code/ryzom/client/src/interface_v3/group_menu.h
index 4b4298ab7..8ab8708e3 100644
--- a/code/ryzom/client/src/interface_v3/group_menu.h
+++ b/code/ryzom/client/src/interface_v3/group_menu.h
@@ -29,10 +29,10 @@ namespace NLGUI
{
class CCtrlScroll;
class CViewBitmap;
+ class CGroupList;
}
class CGroupMenu;
-class CGroupList;
/**
diff --git a/code/ryzom/client/src/interface_v3/group_quick_help.cpp b/code/ryzom/client/src/interface_v3/group_quick_help.cpp
index 108d07a9b..1419a203a 100644
--- a/code/ryzom/client/src/interface_v3/group_quick_help.cpp
+++ b/code/ryzom/client/src/interface_v3/group_quick_help.cpp
@@ -22,7 +22,7 @@
#include "stdpch.h"
#include "group_quick_help.h"
-#include "group_list.h"
+#include "nel/gui/group_list.h"
#include "group_paragraph.h"
#include "../libwww.h"
#include "interface_manager.h"
diff --git a/code/ryzom/client/src/interface_v3/group_scrolltext.cpp b/code/ryzom/client/src/interface_v3/group_scrolltext.cpp
index ea8409475..b58569313 100644
--- a/code/ryzom/client/src/interface_v3/group_scrolltext.cpp
+++ b/code/ryzom/client/src/interface_v3/group_scrolltext.cpp
@@ -21,7 +21,7 @@
#include "stdpch.h"
#include "group_scrolltext.h"
-#include "group_list.h"
+#include "nel/gui/group_list.h"
#include "nel/gui/view_text.h"
#include "nel/gui/ctrl_scroll.h"
#include "nel/gui/ctrl_button.h"
diff --git a/code/ryzom/client/src/interface_v3/group_scrolltext.h b/code/ryzom/client/src/interface_v3/group_scrolltext.h
index cfedb76bc..88fc2c6cb 100644
--- a/code/ryzom/client/src/interface_v3/group_scrolltext.h
+++ b/code/ryzom/client/src/interface_v3/group_scrolltext.h
@@ -27,10 +27,9 @@ namespace NLGUI
{
class CCtrlBaseButton;
class CCtrlScroll;
+ class CGroupList;
}
-class CGroupList;
-
// Can be used to build a chat window or anything that displays sequences of strings
/**
* Widget to have a resizable scrolltext and its scrollbar
diff --git a/code/ryzom/client/src/interface_v3/interface_manager.cpp b/code/ryzom/client/src/interface_v3/interface_manager.cpp
index e9fbab649..ab028fc3e 100644
--- a/code/ryzom/client/src/interface_v3/interface_manager.cpp
+++ b/code/ryzom/client/src/interface_v3/interface_manager.cpp
@@ -60,7 +60,7 @@
// DBCtrl
#include "dbctrl_sheet.h"
// Group
-#include "group_list.h"
+#include "nel/gui/group_list.h"
#include "group_menu.h"
#include "group_container.h"
#include "nel/gui/group_modal.h"
diff --git a/code/ryzom/client/src/interface_v3/interface_manager.h b/code/ryzom/client/src/interface_v3/interface_manager.h
index 46e0d9cac..f0099a46b 100644
--- a/code/ryzom/client/src/interface_v3/interface_manager.h
+++ b/code/ryzom/client/src/interface_v3/interface_manager.h
@@ -25,7 +25,7 @@
#include "nel/3d/u_text_context.h"
#include "nel/gui/interface_group.h"
#include "nel/gui/interface_link.h"
-#include "group_list.h"
+#include "nel/gui/group_list.h"
#include "nel/gui/view_base.h"
#include "view_pointer.h"
diff --git a/code/ryzom/client/src/interface_v3/interface_parser.cpp b/code/ryzom/client/src/interface_v3/interface_parser.cpp
index 35df296c3..62a38eace 100644
--- a/code/ryzom/client/src/interface_v3/interface_parser.cpp
+++ b/code/ryzom/client/src/interface_v3/interface_parser.cpp
@@ -65,7 +65,7 @@
#include "group_career.h"
#include "nel/gui/group_modal.h"
#include "group_modal_get_key.h"
-#include "group_list.h"
+#include "nel/gui/group_list.h"
#include "nel/gui/group_tree.h"
#include "group_menu.h"
#include "group_container.h"
diff --git a/code/ryzom/client/src/interface_v3/interface_parser.h b/code/ryzom/client/src/interface_v3/interface_parser.h
index 0e74c503b..91f23427c 100644
--- a/code/ryzom/client/src/interface_v3/interface_parser.h
+++ b/code/ryzom/client/src/interface_v3/interface_parser.h
@@ -36,10 +36,10 @@ namespace NLGUI
class CInterfaceOptions;
class CInterfaceLink;
class CCtrlBase;
+ class CGroupList;
}
class CGroupContainer;
-class CGroupList;
class CInterfaceAnim;
class CViewPointer;
class CBrickJob;
diff --git a/code/ryzom/client/src/interface_v3/macrocmd_key.cpp b/code/ryzom/client/src/interface_v3/macrocmd_key.cpp
index 7ffe97d27..1bec84943 100644
--- a/code/ryzom/client/src/interface_v3/macrocmd_key.cpp
+++ b/code/ryzom/client/src/interface_v3/macrocmd_key.cpp
@@ -26,7 +26,7 @@
#include "nel/gui/action_handler.h"
#include "nel/gui/ctrl_button.h"
#include "group_editbox.h"
-#include "group_list.h"
+#include "nel/gui/group_list.h"
#include "dbgroup_combo_box.h"
#include "group_container.h"
#include "group_modal_get_key.h"
diff --git a/code/ryzom/client/src/interface_v3/macrocmd_manager.cpp b/code/ryzom/client/src/interface_v3/macrocmd_manager.cpp
index e66fc16d7..96a5145d0 100644
--- a/code/ryzom/client/src/interface_v3/macrocmd_manager.cpp
+++ b/code/ryzom/client/src/interface_v3/macrocmd_manager.cpp
@@ -27,7 +27,7 @@
#include "dbctrl_sheet.h"
#include "nel/gui/ctrl_button.h"
#include "group_editbox.h"
-#include "group_list.h"
+#include "nel/gui/group_list.h"
#include "dbgroup_combo_box.h"
#include "group_container.h"
#include "group_modal_get_key.h"
diff --git a/code/ryzom/client/src/interface_v3/people_list.cpp b/code/ryzom/client/src/interface_v3/people_list.cpp
index 46a08234a..1d2be1faa 100644
--- a/code/ryzom/client/src/interface_v3/people_list.cpp
+++ b/code/ryzom/client/src/interface_v3/people_list.cpp
@@ -19,7 +19,7 @@
#include "stdpch.h"
#include "people_list.h"
#include "group_container.h"
-#include "group_list.h"
+#include "nel/gui/group_list.h"
#include "nel/gui/view_bitmap.h"
#include "interface_manager.h"
#include "nel/gui/action_handler.h"
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 bdde30aa9..3a2d7f7b1 100644
--- a/code/ryzom/client/src/interface_v3/register_interface_elements.cpp
+++ b/code/ryzom/client/src/interface_v3/register_interface_elements.cpp
@@ -31,7 +31,7 @@
#include "nel/gui/group_frame.h"
#include "nel/gui/group_container_base.h"
#include "group_container.h"
-#include "group_list.h"
+#include "nel/gui/group_list.h"
#include "dbgroup_select_number.h"
#include "nel/gui/ctrl_button.h"
#include "nel/gui/ctrl_text_button.h"
@@ -45,7 +45,6 @@
#include "nel/gui/reflect.h"
#include "dbview_bar.h"
#include "dbview_bar3.h"
-#include "group_list.h"
#include "nel/gui/ctrl_scroll_base.h"
#include "nel/gui/ctrl_scroll.h"
#include "dbgroup_combo_box.h"
diff --git a/code/ryzom/client/src/libwww.h b/code/ryzom/client/src/libwww.h
index b82a75534..aa3f6b424 100644
--- a/code/ryzom/client/src/libwww.h
+++ b/code/ryzom/client/src/libwww.h
@@ -29,10 +29,9 @@ namespace NLGUI
{
class CCtrlBaseButton;
class CCtrlScroll;
+ class CGroupList;
}
-class CGroupList;
-
// ***************************************************************************
// Init the libwww
diff --git a/code/ryzom/client/src/net_manager.cpp b/code/ryzom/client/src/net_manager.cpp
index e1e91377f..03a10aec4 100644
--- a/code/ryzom/client/src/net_manager.cpp
+++ b/code/ryzom/client/src/net_manager.cpp
@@ -39,7 +39,7 @@
#include "game_share/combat_flying_text.h"
#include "game_share/shard_names.h"
// Client.
-#include "interface_v3/group_list.h"
+#include "nel/gui/group_list.h"
#include "interface_v3/interface_manager.h"
#include "net_manager.h"
#include "client_cfg.h"
diff --git a/code/ryzom/client/src/r2/editor.cpp b/code/ryzom/client/src/r2/editor.cpp
index 29300c975..54b498858 100644
--- a/code/ryzom/client/src/r2/editor.cpp
+++ b/code/ryzom/client/src/r2/editor.cpp
@@ -54,7 +54,7 @@ using namespace NLGUI;
#include "../cursor_functions.h"
#include "../entities.h"
#include "../events_listener.h"
-#include "../interface_v3/group_list.h"
+#include "nel/gui/group_list.h"
#include "nel/gui/event_descriptor.h"
#include "nel/gui/group_tree.h"
#include "../client_cfg.h"