CHANGED: #1471 CViewBitmapCombo is now part of NELGUI library, and is under NLGUI namespace.
This commit is contained in:
parent
2231c934b9
commit
3d3185fcf1
6 changed files with 761 additions and 751 deletions
174
code/nel/include/nel/gui/view_bitmap_combo.h
Normal file
174
code/nel/include/nel/gui/view_bitmap_combo.h
Normal file
|
@ -0,0 +1,174 @@
|
||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef NL_VIEW_BITMAP_COMBO_H
|
||||||
|
#define NL_VIEW_BITMAP_COMBO_H
|
||||||
|
|
||||||
|
#include "nel/misc/cdb.h"
|
||||||
|
#include "nel/gui/view_base.h"
|
||||||
|
#include "nel/3d/u_texture.h"
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
|
||||||
|
/** Description of a combo box, this can be parsed from an xml node
|
||||||
|
* The bitmap layout is as follow :
|
||||||
|
*
|
||||||
|
* I W I W I W
|
||||||
|
* t G t G t G
|
||||||
|
* e a e a e a
|
||||||
|
* m p m p m p
|
||||||
|
* W S W W
|
||||||
|
* i e i i
|
||||||
|
* d l d d
|
||||||
|
* t e t t
|
||||||
|
* h c h h
|
||||||
|
* t
|
||||||
|
* e
|
||||||
|
* d
|
||||||
|
* +----+---+----+---+---+---+---+--...
|
||||||
|
* |ssss| |****| |***| |***|
|
||||||
|
* ItemHeight |ssss| |****| |***| |***
|
||||||
|
* +----+---+----+---+---+---+---+--...
|
||||||
|
* | | | | | | | |
|
||||||
|
* HGapSeleted | | | | | | | |
|
||||||
|
* +----+---+----+---+---+---+---+--...
|
||||||
|
* |****| |****| |***| |***|
|
||||||
|
* ItemHeight |****| |****| |***| |***|
|
||||||
|
* +----+---+----+---+---+---+---+--...
|
||||||
|
* | | | | | | | |
|
||||||
|
* HGap | | | | | | | |
|
||||||
|
* +----+---+----+---+---+---+---+--...
|
||||||
|
* |****| |****| |***| |***|
|
||||||
|
* ItemHeight |****| |****| |***| |***|
|
||||||
|
* . . . . . . . .
|
||||||
|
* . . . . . . . .
|
||||||
|
* s : selected item. . . . . . .
|
||||||
|
* * : where bitmap are displayed
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
struct CComboBoxDesc
|
||||||
|
{
|
||||||
|
bool parse(xmlNodePtr cur, CInterfaceElement *owner);
|
||||||
|
void addObserver(NLMISC::ICDBNode::IPropertyObserver *obs);
|
||||||
|
void getGridSize(uint &numRow,uint &numCol) const;
|
||||||
|
void getDimensions(uint &width, uint &height) const;
|
||||||
|
CInterfaceProperty NumRow;
|
||||||
|
CInterfaceProperty NumCol;
|
||||||
|
CInterfaceProperty CurrSelected;
|
||||||
|
CInterfaceProperty ItemWidth;
|
||||||
|
CInterfaceProperty ItemHeight;
|
||||||
|
CInterfaceProperty Unrolled;
|
||||||
|
CInterfaceProperty WGapSelected;
|
||||||
|
CInterfaceProperty WGap;
|
||||||
|
CInterfaceProperty HGapSelected;
|
||||||
|
CInterfaceProperty HGap;
|
||||||
|
CInterfaceProperty NumSel;
|
||||||
|
CInterfaceProperty Align;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A combo box with several bitmaps in it
|
||||||
|
* \author Nicolas Vizerie
|
||||||
|
* \author Nevrax France
|
||||||
|
* \date 2002
|
||||||
|
*/
|
||||||
|
class CViewBitmapCombo : public CViewBase, public NLMISC::ICDBNode::IPropertyObserver
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
typedef std::vector<sint32> TIdArray;
|
||||||
|
typedef std::vector<std::string> TStringArray;
|
||||||
|
typedef std::vector<NLMISC::CRGBA> TColorArray;
|
||||||
|
public:
|
||||||
|
/// ctor
|
||||||
|
CViewBitmapCombo(const TCtorParam ¶m);
|
||||||
|
/**
|
||||||
|
* parse an xml node and initialize the base view members. Must call CViewBase::parse
|
||||||
|
* \param cur : pointer to the xml node to be parsed
|
||||||
|
* \param parentGroup : the parent group of the view
|
||||||
|
* \partam id : a refence to the string that will receive the view ID
|
||||||
|
* \return true if success
|
||||||
|
*/
|
||||||
|
bool parse(xmlNodePtr cur,CInterfaceGroup * parentGroup);
|
||||||
|
virtual uint32 getMemory() { return (uint32)(sizeof(*this)+_Id.size()); }
|
||||||
|
/**
|
||||||
|
* draw the view
|
||||||
|
*/
|
||||||
|
void draw();
|
||||||
|
|
||||||
|
// access to texture & colors
|
||||||
|
const TStringArray &getTexs() const { return _Texs; }
|
||||||
|
const TStringArray &getTexsOver() const { return _TexsOver; }
|
||||||
|
const TStringArray &getTexsPushed() const { return _TexsPushed; }
|
||||||
|
//
|
||||||
|
const TColorArray &getColors() const { return _Col; }
|
||||||
|
const TColorArray &getColorsOver() const { return _ColOver; }
|
||||||
|
const TColorArray &getColorsPushed() const { return _ColPushed; }
|
||||||
|
//
|
||||||
|
void setTexs(const char * const tex[], uint numTex);
|
||||||
|
void setTexsOver(const char * const tex[], uint numTex);
|
||||||
|
void setTexsPushed(const char * const tex[], uint numTex);
|
||||||
|
//
|
||||||
|
void setColors(const NLMISC::CRGBA colors[], uint numColors);
|
||||||
|
void setColorsOver(const NLMISC::CRGBA colors[], uint numColors);
|
||||||
|
void setColorsPushed(const NLMISC::CRGBA colors[], uint numColors);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////////
|
||||||
|
private:
|
||||||
|
//
|
||||||
|
TStringArray _Texs;
|
||||||
|
TStringArray _TexsOver;
|
||||||
|
TStringArray _TexsPushed;
|
||||||
|
TIdArray _TexsId;
|
||||||
|
TIdArray _TexsOverId;
|
||||||
|
TIdArray _TexsPushedId;
|
||||||
|
TColorArray _Col;
|
||||||
|
TColorArray _ColOver;
|
||||||
|
TColorArray _ColPushed;
|
||||||
|
CComboBoxDesc _CD;
|
||||||
|
CInterfaceElement *_Owner;
|
||||||
|
private:
|
||||||
|
void parseTexList(const std::string &names, TStringArray &dest);
|
||||||
|
void parseColList(const std::string &names, TColorArray &dest);
|
||||||
|
void setupSize();
|
||||||
|
void getDimensions(uint &numRow, uint &numCol);
|
||||||
|
// From ICDBNode::IPropertyObserver
|
||||||
|
void update(NLMISC::ICDBNode *leaf);
|
||||||
|
// Return a color from the array, or white if it is empty
|
||||||
|
static NLMISC::CRGBA getCol(const TColorArray &array, uint index);
|
||||||
|
static const std::string *getTex(const TStringArray &array, uint index);
|
||||||
|
static sint32 getTexId(const TIdArray &array, uint index);
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
585
code/nel/src/gui/view_bitmap_combo.cpp
Normal file
585
code/nel/src/gui/view_bitmap_combo.cpp
Normal file
|
@ -0,0 +1,585 @@
|
||||||
|
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
||||||
|
// Copyright (C) 2010 Winch Gate Property Limited
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as
|
||||||
|
// published by the Free Software Foundation, either version 3 of the
|
||||||
|
// License, or (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
#include "nel/gui/view_bitmap_combo.h"
|
||||||
|
#include "nel/misc/xml_auto_ptr.h"
|
||||||
|
#include "nel/gui/db_manager.h"
|
||||||
|
#include "nel/gui/view_renderer.h"
|
||||||
|
#include "nel/gui/widget_manager.h"
|
||||||
|
#include "nel/gui/view_pointer_base.h"
|
||||||
|
#include "nel/gui/interface_group.h"
|
||||||
|
|
||||||
|
using namespace NLMISC;
|
||||||
|
|
||||||
|
namespace NLGUI
|
||||||
|
{
|
||||||
|
|
||||||
|
//=======================================================================================
|
||||||
|
bool CComboBoxDesc::parse(xmlNodePtr cur, CInterfaceElement*owner)
|
||||||
|
{
|
||||||
|
nlassert(owner);
|
||||||
|
const std::string &ownerId = owner->getId();
|
||||||
|
CXMLAutoPtr prop;
|
||||||
|
//
|
||||||
|
prop = xmlGetProp(cur, (const xmlChar *) "selected");
|
||||||
|
if (!prop)
|
||||||
|
{
|
||||||
|
nlwarning((ownerId + " : Couldn't read 'selected' field").c_str());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
owner->relativeSInt64Read(CurrSelected, "selected", prop, "0");
|
||||||
|
//
|
||||||
|
prop = xmlGetProp(cur, (const xmlChar *) "num_row");
|
||||||
|
owner->relativeSInt64Read(NumRow, "num_row", prop, "1");
|
||||||
|
//
|
||||||
|
prop = xmlGetProp(cur, (const xmlChar *) "num_col");
|
||||||
|
owner->relativeSInt64Read(NumCol, "num_col", prop, "1");
|
||||||
|
//
|
||||||
|
prop = xmlGetProp(cur, (const xmlChar *) "itemw");
|
||||||
|
owner->relativeSInt64Read(ItemWidth, "itemw", prop, "32");
|
||||||
|
//
|
||||||
|
prop = xmlGetProp(cur, (const xmlChar *) "itemh");
|
||||||
|
owner->relativeSInt64Read(ItemHeight, "itemh", prop, "32");
|
||||||
|
//
|
||||||
|
prop = xmlGetProp(cur, (const xmlChar *) "unrolled");
|
||||||
|
owner->relativeBoolRead(Unrolled, "unrolled", prop, "false");
|
||||||
|
//
|
||||||
|
prop = xmlGetProp(cur, (xmlChar *) "wgap");
|
||||||
|
owner->relativeSInt64Read(WGap, "wgap", prop, "0");
|
||||||
|
//
|
||||||
|
prop = xmlGetProp(cur, (xmlChar *) "hgap");
|
||||||
|
owner->relativeSInt64Read(HGap, "hgap", prop, "0");
|
||||||
|
//
|
||||||
|
prop = xmlGetProp(cur, (xmlChar *) "wgap_selected");
|
||||||
|
owner->relativeSInt64Read(WGapSelected, "wgap_selected", prop, "0");
|
||||||
|
//
|
||||||
|
prop = xmlGetProp(cur, (xmlChar *) "hgap_selected");
|
||||||
|
owner->relativeSInt64Read(HGapSelected, "hgap_selected", prop, "0");
|
||||||
|
//
|
||||||
|
//
|
||||||
|
prop = xmlGetProp(cur, (xmlChar *) "num_sel");
|
||||||
|
owner->relativeSInt64Read(NumSel, "num_sel", prop, "1");
|
||||||
|
//
|
||||||
|
prop = (char*) xmlGetProp (cur, (xmlChar*)"align");
|
||||||
|
Align.readSInt32 ("0", ownerId + ":align");
|
||||||
|
if (prop)
|
||||||
|
{
|
||||||
|
const char *seekPtr = prop.getDatas();
|
||||||
|
while (*seekPtr != 0)
|
||||||
|
{
|
||||||
|
if ((*seekPtr=='l')||(*seekPtr=='L'))
|
||||||
|
{
|
||||||
|
Align.setSInt32 (Align.getSInt32()&(~1));
|
||||||
|
}
|
||||||
|
if ((*seekPtr=='r')||(*seekPtr=='R'))
|
||||||
|
{
|
||||||
|
Align.setSInt32 (Align.getSInt32()|1);
|
||||||
|
}
|
||||||
|
if ((*seekPtr=='b')||(*seekPtr=='B'))
|
||||||
|
{
|
||||||
|
Align.setSInt32 (Align.getSInt32()&(~2));
|
||||||
|
}
|
||||||
|
if ((*seekPtr=='t')||(*seekPtr=='T'))
|
||||||
|
{
|
||||||
|
Align.setSInt32 (Align.getSInt32()|2);
|
||||||
|
}
|
||||||
|
++seekPtr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//=========================================================================================
|
||||||
|
void CComboBoxDesc::addObserver(ICDBNode::IPropertyObserver *obs)
|
||||||
|
{
|
||||||
|
// Add observers on dimensions
|
||||||
|
if (NumRow.getNodePtr())
|
||||||
|
{
|
||||||
|
ICDBNode::CTextId textId;
|
||||||
|
NumRow.getNodePtr()->addObserver(obs, textId);
|
||||||
|
}
|
||||||
|
if (NumCol.getNodePtr())
|
||||||
|
{
|
||||||
|
ICDBNode::CTextId textId;
|
||||||
|
NumCol.getNodePtr()->addObserver(obs, textId);
|
||||||
|
}
|
||||||
|
if (ItemWidth.getNodePtr())
|
||||||
|
{
|
||||||
|
ICDBNode::CTextId textId;
|
||||||
|
ItemWidth.getNodePtr()->addObserver(obs, textId);
|
||||||
|
}
|
||||||
|
if (ItemHeight.getNodePtr())
|
||||||
|
{
|
||||||
|
ICDBNode::CTextId textId;
|
||||||
|
ItemHeight.getNodePtr()->addObserver(obs, textId);
|
||||||
|
}
|
||||||
|
if (Unrolled.getNodePtr())
|
||||||
|
{
|
||||||
|
ICDBNode::CTextId textId;
|
||||||
|
Unrolled.getNodePtr()->addObserver(obs, textId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//=======================================================================================
|
||||||
|
void CComboBoxDesc::getGridSize(uint &numRow, uint &numCol) const
|
||||||
|
{
|
||||||
|
numRow = NumRow.getSInt32();
|
||||||
|
numCol = NumCol.getSInt32();
|
||||||
|
if (numRow == 0 || numCol == 0) return;
|
||||||
|
if (!Unrolled.getBool())
|
||||||
|
{
|
||||||
|
numRow = numCol = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//=======================================================================================
|
||||||
|
void CComboBoxDesc::getDimensions(uint &w, uint &h) const
|
||||||
|
{
|
||||||
|
uint numRow, numCol;
|
||||||
|
getGridSize(numRow, numCol);
|
||||||
|
w = numCol * (ItemWidth.getSInt32() + WGap.getSInt32());
|
||||||
|
h = numRow * (ItemHeight.getSInt32() + HGap.getSInt32());
|
||||||
|
//
|
||||||
|
if (numCol == 1) w -= WGap.getSInt32();
|
||||||
|
else w += WGapSelected.getSInt32() - WGap.getSInt32();
|
||||||
|
//
|
||||||
|
if (numRow == 1) h -= HGap.getSInt32();
|
||||||
|
else h += HGapSelected.getSInt32() - HGap.getSInt32();
|
||||||
|
}
|
||||||
|
|
||||||
|
//=======================================================================================
|
||||||
|
NLMISC_REGISTER_OBJECT(CViewBase, CViewBitmapCombo, std::string, "bitmap_combo");
|
||||||
|
|
||||||
|
CViewBitmapCombo::CViewBitmapCombo(const TCtorParam ¶m) : CViewBase(param)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//=======================================================================================
|
||||||
|
bool CViewBitmapCombo::parse(xmlNodePtr cur, CInterfaceGroup * parentGroup)
|
||||||
|
{
|
||||||
|
if (! CViewBase::parse(cur, parentGroup) )
|
||||||
|
{
|
||||||
|
parseError(parentGroup);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
CXMLAutoPtr prop;
|
||||||
|
|
||||||
|
std::string texs;
|
||||||
|
prop = xmlGetProp(cur, (xmlChar *)"tx_normal");
|
||||||
|
if (prop) texs = (const char*)prop;
|
||||||
|
std::string texsOver;
|
||||||
|
prop = xmlGetProp(cur, (xmlChar *)"tx_over");
|
||||||
|
if (prop) texsOver = (const char*)prop;
|
||||||
|
std::string texsPushed;
|
||||||
|
prop = xmlGetProp(cur, (xmlChar *)"tx_pushed");
|
||||||
|
if (prop) texsPushed = (const char*)prop;
|
||||||
|
//
|
||||||
|
// for colors, an empty strings means all colors are white
|
||||||
|
//
|
||||||
|
std::string col;
|
||||||
|
prop = xmlGetProp(cur, (xmlChar *)"col_normal");
|
||||||
|
if (prop) col = (const char*)prop;
|
||||||
|
std::string colOver;
|
||||||
|
prop = xmlGetProp(cur, (xmlChar *)"col_over");
|
||||||
|
if (prop) colOver = (const char*)prop;
|
||||||
|
std::string colPushed;
|
||||||
|
prop = xmlGetProp(cur, (xmlChar *)"col_pushed");
|
||||||
|
if (prop) colPushed = (const char*)prop;
|
||||||
|
|
||||||
|
/* if (texs.empty() || texsOver.empty() || texsPushed.empty())
|
||||||
|
{
|
||||||
|
parseError(parentGroup, "Cannot read tx_normal, tx_over, or tx_pushed");
|
||||||
|
return false;
|
||||||
|
}*/
|
||||||
|
|
||||||
|
parseTexList(texs, _Texs);
|
||||||
|
parseTexList(texsOver, _TexsOver);
|
||||||
|
parseTexList(texsPushed, _TexsPushed);
|
||||||
|
|
||||||
|
parseColList(col, _Col);
|
||||||
|
parseColList(colOver, _ColOver);
|
||||||
|
parseColList(colPushed, _ColPushed);
|
||||||
|
//
|
||||||
|
/* if (_Texs.size() != _TexsOver.size() || _TexsOver.size() != _TexsPushed.size())
|
||||||
|
{
|
||||||
|
parseError(parentGroup, "Texture names arrays do not have the same size");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
//
|
||||||
|
uint numCols = NLMISC::maxof(_Col.size(), _ColOver.size(), _ColPushed.size());
|
||||||
|
if (!
|
||||||
|
(
|
||||||
|
(_Col.empty() || _Col.size() == numCols)
|
||||||
|
&& (_ColOver.empty() || _ColOver.size() == numCols)
|
||||||
|
&& (_ColPushed.empty() || _ColPushed.size() == numCols)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
{
|
||||||
|
parseError(parentGroup, "Color names arrays do not have the same size (note an empty array is valid, means all color are 255 255 255");
|
||||||
|
return false;
|
||||||
|
}*/
|
||||||
|
//
|
||||||
|
if (!_CD.parse(cur, this))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
//
|
||||||
|
setupSize();
|
||||||
|
//
|
||||||
|
_CD.addObserver(this);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
//=======================================================================================
|
||||||
|
NLMISC::CRGBA CViewBitmapCombo::getCol(const CViewBitmapCombo::TColorArray &array,uint index)
|
||||||
|
{
|
||||||
|
if (array.empty()) return CRGBA::White;
|
||||||
|
return array[index % array.size()];
|
||||||
|
}
|
||||||
|
|
||||||
|
//=======================================================================================
|
||||||
|
const std::string *CViewBitmapCombo::getTex(const TStringArray &array,uint index)
|
||||||
|
{
|
||||||
|
if (array.empty()) return NULL;
|
||||||
|
return &array[index % array.size()];
|
||||||
|
}
|
||||||
|
|
||||||
|
//=======================================================================================
|
||||||
|
sint32 CViewBitmapCombo::getTexId(const TIdArray &array, uint index)
|
||||||
|
{
|
||||||
|
if (array.empty()) return -1;
|
||||||
|
return array[index % array.size()];
|
||||||
|
}
|
||||||
|
|
||||||
|
//=======================================================================================
|
||||||
|
void CViewBitmapCombo::draw()
|
||||||
|
{
|
||||||
|
if (_Texs.empty()) return;
|
||||||
|
uint numRow, numCol;
|
||||||
|
_CD.getGridSize(numRow, numCol);
|
||||||
|
if (numRow == 0 || numCol == 0) return;
|
||||||
|
|
||||||
|
sint32 mx = 0, my = 0;
|
||||||
|
CViewRenderer &rVR = *CViewRenderer::getInstance();
|
||||||
|
const std::vector<CViewBase *> &rVB = CWidgetManager::getInstance()->getViewsUnderPointer();
|
||||||
|
if (!CWidgetManager::getInstance()->getPointer()) return;
|
||||||
|
CWidgetManager::getInstance()->getPointer()->getPointerDispPos(mx, my);
|
||||||
|
bool over = false;
|
||||||
|
uint32 i;
|
||||||
|
for (i = 0; i < rVB.size(); ++i)
|
||||||
|
{
|
||||||
|
if (rVB[i] == this)
|
||||||
|
{
|
||||||
|
over = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_TexsId.size() == 0)
|
||||||
|
{
|
||||||
|
for (i = 0; i < _Texs.size(); ++i)
|
||||||
|
_TexsId.push_back(rVR.getTextureIdFromName(_Texs[i]));
|
||||||
|
for (i = 0; i < _TexsOver.size(); ++i)
|
||||||
|
_TexsOverId.push_back(rVR.getTextureIdFromName(_TexsOver[i]));
|
||||||
|
for (i = 0; i < _TexsPushed.size(); ++i)
|
||||||
|
_TexsPushedId.push_back(rVR.getTextureIdFromName(_TexsPushed[i]));
|
||||||
|
}
|
||||||
|
|
||||||
|
sint32 textId;
|
||||||
|
CRGBA color;
|
||||||
|
uint selectedTexIndex = _CD.CurrSelected.getSInt32();
|
||||||
|
uint itemw = _CD.ItemWidth.getSInt32() + _CD.WGap.getSInt32();
|
||||||
|
uint itemh = _CD.ItemHeight.getSInt32() + _CD.HGap.getSInt32();
|
||||||
|
uint counter = 0;
|
||||||
|
|
||||||
|
bool overItem = false;
|
||||||
|
for(uint x = 0; x < numCol; ++x)
|
||||||
|
{
|
||||||
|
for(uint y = 0; y < numRow; ++y)
|
||||||
|
{
|
||||||
|
uint texIndex = counter;
|
||||||
|
if (counter != 0)
|
||||||
|
{
|
||||||
|
if (counter == selectedTexIndex)
|
||||||
|
{
|
||||||
|
texIndex = 0;
|
||||||
|
}
|
||||||
|
sint px;
|
||||||
|
sint py;
|
||||||
|
// get the right position depending on alignment
|
||||||
|
if (_CD.Align.getSInt32() & 1) // right align ?
|
||||||
|
{
|
||||||
|
px = _XReal + _WReal - (x + 1) * itemw;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
px = _XReal + x * itemw;
|
||||||
|
}
|
||||||
|
// top align ?
|
||||||
|
if (_CD.Align.getSInt32() & 2)
|
||||||
|
{
|
||||||
|
py = _YReal + _HReal - (y + 1) * itemh;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
py = _YReal + y * itemh;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (x != 0)
|
||||||
|
{
|
||||||
|
if (_CD.Align.getSInt32() & 1)
|
||||||
|
px -= _CD.WGapSelected.getSInt32() - _CD.WGap.getSInt32();
|
||||||
|
else px += _CD.WGapSelected.getSInt32() - _CD.WGap.getSInt32();
|
||||||
|
}
|
||||||
|
if (y != 0)
|
||||||
|
{
|
||||||
|
if (_CD.Align.getSInt32() & 2)
|
||||||
|
py -= _CD.HGapSelected.getSInt32() - _CD.HGap.getSInt32();
|
||||||
|
else py += _CD.HGapSelected.getSInt32() - _CD.HGap.getSInt32();
|
||||||
|
}
|
||||||
|
// is the mouse on current item ?
|
||||||
|
if (over
|
||||||
|
&& mx >= px
|
||||||
|
&& my >= py
|
||||||
|
&& mx < px + (sint32) itemw
|
||||||
|
&& my < py + (sint32) itemh)
|
||||||
|
{
|
||||||
|
overItem = true;
|
||||||
|
if ( CWidgetManager::getInstance()->getPointer()->getButtonState() & NLMISC::leftButton)
|
||||||
|
{
|
||||||
|
textId = getTexId(_TexsPushedId, texIndex);
|
||||||
|
color = getCol(_ColPushed, texIndex);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
textId = getTexId(_TexsOverId, texIndex);
|
||||||
|
color = getCol(_ColOver, texIndex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
textId = getTexId(_TexsId, texIndex);
|
||||||
|
color = getCol(_Col, texIndex);
|
||||||
|
}
|
||||||
|
CViewRenderer::getInstance()->drawRotFlipBitmap (_RenderLayer, px, py, itemw, itemh, 0, false,
|
||||||
|
textId,
|
||||||
|
color);
|
||||||
|
}
|
||||||
|
++counter;
|
||||||
|
if ((sint32) counter == _CD.NumSel.getSInt32())
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((sint32) selectedTexIndex >= _CD.NumSel.getSInt32())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// draw current selection
|
||||||
|
sint32 px;
|
||||||
|
sint32 py;
|
||||||
|
//
|
||||||
|
if (_CD.Align.getSInt32() & 1)
|
||||||
|
{
|
||||||
|
px = _XReal + _WReal - itemw;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
px = _XReal;
|
||||||
|
}
|
||||||
|
//
|
||||||
|
if (_CD.Align.getSInt32() & 2)
|
||||||
|
{
|
||||||
|
py = _YReal + _HReal - itemh;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
py = _YReal;
|
||||||
|
}
|
||||||
|
//
|
||||||
|
if (_CD.Unrolled.getBool())
|
||||||
|
{
|
||||||
|
if (overItem && CWidgetManager::getInstance()->getPointer()->getButtonState() & NLMISC::leftButton)
|
||||||
|
{
|
||||||
|
textId = getTexId(_TexsId, selectedTexIndex);
|
||||||
|
color = getCol(_Col, selectedTexIndex);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
textId = getTexId(_TexsPushedId, selectedTexIndex);
|
||||||
|
color = getCol(_ColPushed, selectedTexIndex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (over
|
||||||
|
&& mx >= px
|
||||||
|
&& my >= py
|
||||||
|
&& mx < px + (sint32) itemw
|
||||||
|
&& my < py + (sint32) itemh
|
||||||
|
)
|
||||||
|
{
|
||||||
|
if ( CWidgetManager::getInstance()->getPointer()->getButtonState() & NLMISC::leftButton)
|
||||||
|
{
|
||||||
|
textId = getTexId(_TexsPushedId, selectedTexIndex);
|
||||||
|
color = getCol(_ColPushed, selectedTexIndex);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
textId = getTexId(_TexsOverId, selectedTexIndex);
|
||||||
|
color = getCol(_ColOver, selectedTexIndex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
textId = getTexId(_TexsId, selectedTexIndex);
|
||||||
|
color = getCol(_Col, selectedTexIndex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
CViewRenderer::getInstance()->drawRotFlipBitmap (_RenderLayer, px, py, itemw, itemh, 0, false,
|
||||||
|
textId,
|
||||||
|
color);
|
||||||
|
}
|
||||||
|
|
||||||
|
//=======================================================================================
|
||||||
|
void CViewBitmapCombo::parseTexList(const std::string &names, TStringArray &dest)
|
||||||
|
{
|
||||||
|
static const char sep[] = " ,\t";
|
||||||
|
std::string::size_type pos = 0, nextPos;
|
||||||
|
dest.clear();
|
||||||
|
do
|
||||||
|
{
|
||||||
|
nextPos = names.find_first_of(sep, pos);
|
||||||
|
if (pos != nextPos)
|
||||||
|
{
|
||||||
|
dest.push_back(names.substr(pos, nextPos - pos));
|
||||||
|
}
|
||||||
|
pos = names.find_first_not_of(sep, nextPos);
|
||||||
|
}
|
||||||
|
while (pos != std::string::npos);
|
||||||
|
}
|
||||||
|
|
||||||
|
//=======================================================================================
|
||||||
|
void CViewBitmapCombo::parseColList(const std::string &names,TColorArray &dest)
|
||||||
|
{
|
||||||
|
static const char sep[] = ",\t";
|
||||||
|
std::string::size_type pos = 0, nextPos;
|
||||||
|
dest.clear();
|
||||||
|
std::string col;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
nextPos = names.find_first_of(sep, pos);
|
||||||
|
if (pos != nextPos)
|
||||||
|
{
|
||||||
|
col = names.substr(pos, nextPos - pos);
|
||||||
|
int r = 0, g = 0, b = 0, a = 255;
|
||||||
|
sscanf (col.c_str(), "%d %d %d %d", &r, &g, &b, &a);
|
||||||
|
NLMISC::clamp (r, 0, 255);
|
||||||
|
NLMISC::clamp (g, 0, 255);
|
||||||
|
NLMISC::clamp (b, 0, 255);
|
||||||
|
NLMISC::clamp (a, 0, 255);
|
||||||
|
dest.push_back(NLMISC::CRGBA((uint8) r, (uint8) g, (uint8) b, (uint8) a));
|
||||||
|
}
|
||||||
|
pos = names.find_first_not_of(sep, nextPos);
|
||||||
|
}
|
||||||
|
while (pos != std::string::npos);
|
||||||
|
}
|
||||||
|
|
||||||
|
//=======================================================================================
|
||||||
|
void CViewBitmapCombo::setupSize()
|
||||||
|
{
|
||||||
|
uint w, h;
|
||||||
|
_CD.getDimensions(w, h);
|
||||||
|
setW(w);
|
||||||
|
setH(h);
|
||||||
|
invalidateCoords();
|
||||||
|
}
|
||||||
|
|
||||||
|
//=======================================================================================
|
||||||
|
void CViewBitmapCombo::update(ICDBNode * /* leaf */)
|
||||||
|
{
|
||||||
|
setupSize();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//=======================================================================================
|
||||||
|
/** copy an array of char * into an array of strings
|
||||||
|
*/
|
||||||
|
static void copyStrArrayFromChar(CViewBitmapCombo::TStringArray &dest, const char * const src[], uint numColor)
|
||||||
|
{
|
||||||
|
dest.resize(numColor);
|
||||||
|
for(uint k = 0; k < numColor; ++k)
|
||||||
|
{
|
||||||
|
dest[k] = src[k];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void copyRGBAVectorFromRGBAArray(CViewBitmapCombo::TColorArray &dest, const NLMISC::CRGBA src[], uint numColor)
|
||||||
|
{
|
||||||
|
dest.resize(numColor);
|
||||||
|
std::copy(src, src + numColor, dest.begin());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//=======================================================================================
|
||||||
|
void CViewBitmapCombo::setTexs(const char * const tex[], uint numTex)
|
||||||
|
{
|
||||||
|
copyStrArrayFromChar(_Texs, tex, numTex);
|
||||||
|
}
|
||||||
|
|
||||||
|
//=======================================================================================
|
||||||
|
void CViewBitmapCombo::setTexsOver(const char * const tex[], uint numTex)
|
||||||
|
{
|
||||||
|
copyStrArrayFromChar(_TexsOver, tex, numTex);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//=======================================================================================
|
||||||
|
void CViewBitmapCombo::setTexsPushed(const char * const tex[], uint numTex)
|
||||||
|
{
|
||||||
|
copyStrArrayFromChar(_TexsPushed, tex, numTex);
|
||||||
|
}
|
||||||
|
|
||||||
|
//=======================================================================================
|
||||||
|
void CViewBitmapCombo::setColors(const NLMISC::CRGBA colors[], uint numColors)
|
||||||
|
{
|
||||||
|
copyRGBAVectorFromRGBAArray(_Col, colors, numColors);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//=======================================================================================
|
||||||
|
void CViewBitmapCombo::setColorsOver(const NLMISC::CRGBA colors[], uint numColors)
|
||||||
|
{
|
||||||
|
copyRGBAVectorFromRGBAArray(_ColOver, colors, numColors);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//=======================================================================================
|
||||||
|
void CViewBitmapCombo::setColorsPushed(const NLMISC::CRGBA colors[], uint numColors)
|
||||||
|
{
|
||||||
|
copyRGBAVectorFromRGBAArray(_ColPushed, colors, numColors);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -49,7 +49,7 @@
|
||||||
#include "nel/gui/view_bitmap.h"
|
#include "nel/gui/view_bitmap.h"
|
||||||
//#include "view_bitmap_progress.h"
|
//#include "view_bitmap_progress.h"
|
||||||
#include "view_bitmap_faber_mp.h"
|
#include "view_bitmap_faber_mp.h"
|
||||||
#include "view_bitmap_combo.h"
|
#include "nel/gui/view_bitmap_combo.h"
|
||||||
#include "nel/gui/view_text.h"
|
#include "nel/gui/view_text.h"
|
||||||
#include "nel/gui/view_text_id.h"
|
#include "nel/gui/view_text_id.h"
|
||||||
#include "nel/gui/view_text_formated.h"
|
#include "nel/gui/view_text_formated.h"
|
||||||
|
|
|
@ -38,7 +38,7 @@
|
||||||
// View
|
// View
|
||||||
#include "nel/gui/view_bitmap.h"
|
#include "nel/gui/view_bitmap.h"
|
||||||
#include "view_bitmap_faber_mp.h"
|
#include "view_bitmap_faber_mp.h"
|
||||||
#include "view_bitmap_combo.h"
|
#include "nel/gui/view_bitmap_combo.h"
|
||||||
#include "nel/gui/view_text.h"
|
#include "nel/gui/view_text.h"
|
||||||
#include "nel/gui/view_text_formated.h"
|
#include "nel/gui/view_text_formated.h"
|
||||||
#include "nel/gui/view_text_id.h"
|
#include "nel/gui/view_text_id.h"
|
||||||
|
|
|
@ -1,579 +0,0 @@
|
||||||
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
|
||||||
// Copyright (C) 2010 Winch Gate Property Limited
|
|
||||||
//
|
|
||||||
// This program is free software: you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU Affero General Public License as
|
|
||||||
// published by the Free Software Foundation, either version 3 of the
|
|
||||||
// License, or (at your option) any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU Affero General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU Affero General Public License
|
|
||||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
#include "view_bitmap_combo.h"
|
|
||||||
#include "nel/misc/xml_auto_ptr.h"
|
|
||||||
#include "nel/gui/db_manager.h"
|
|
||||||
#include "nel/gui/view_renderer.h"
|
|
||||||
#include "nel/gui/widget_manager.h"
|
|
||||||
#include "nel/gui/view_pointer_base.h"
|
|
||||||
#include "nel/gui/interface_group.h"
|
|
||||||
|
|
||||||
using namespace NLMISC;
|
|
||||||
|
|
||||||
//=======================================================================================
|
|
||||||
bool CComboBoxDesc::parse(xmlNodePtr cur, CInterfaceElement*owner)
|
|
||||||
{
|
|
||||||
nlassert(owner);
|
|
||||||
const std::string &ownerId = owner->getId();
|
|
||||||
CXMLAutoPtr prop;
|
|
||||||
//
|
|
||||||
prop = xmlGetProp(cur, (const xmlChar *) "selected");
|
|
||||||
if (!prop)
|
|
||||||
{
|
|
||||||
nlwarning((ownerId + " : Couldn't read 'selected' field").c_str());
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
owner->relativeSInt64Read(CurrSelected, "selected", prop, "0");
|
|
||||||
//
|
|
||||||
prop = xmlGetProp(cur, (const xmlChar *) "num_row");
|
|
||||||
owner->relativeSInt64Read(NumRow, "num_row", prop, "1");
|
|
||||||
//
|
|
||||||
prop = xmlGetProp(cur, (const xmlChar *) "num_col");
|
|
||||||
owner->relativeSInt64Read(NumCol, "num_col", prop, "1");
|
|
||||||
//
|
|
||||||
prop = xmlGetProp(cur, (const xmlChar *) "itemw");
|
|
||||||
owner->relativeSInt64Read(ItemWidth, "itemw", prop, "32");
|
|
||||||
//
|
|
||||||
prop = xmlGetProp(cur, (const xmlChar *) "itemh");
|
|
||||||
owner->relativeSInt64Read(ItemHeight, "itemh", prop, "32");
|
|
||||||
//
|
|
||||||
prop = xmlGetProp(cur, (const xmlChar *) "unrolled");
|
|
||||||
owner->relativeBoolRead(Unrolled, "unrolled", prop, "false");
|
|
||||||
//
|
|
||||||
prop = xmlGetProp(cur, (xmlChar *) "wgap");
|
|
||||||
owner->relativeSInt64Read(WGap, "wgap", prop, "0");
|
|
||||||
//
|
|
||||||
prop = xmlGetProp(cur, (xmlChar *) "hgap");
|
|
||||||
owner->relativeSInt64Read(HGap, "hgap", prop, "0");
|
|
||||||
//
|
|
||||||
prop = xmlGetProp(cur, (xmlChar *) "wgap_selected");
|
|
||||||
owner->relativeSInt64Read(WGapSelected, "wgap_selected", prop, "0");
|
|
||||||
//
|
|
||||||
prop = xmlGetProp(cur, (xmlChar *) "hgap_selected");
|
|
||||||
owner->relativeSInt64Read(HGapSelected, "hgap_selected", prop, "0");
|
|
||||||
//
|
|
||||||
//
|
|
||||||
prop = xmlGetProp(cur, (xmlChar *) "num_sel");
|
|
||||||
owner->relativeSInt64Read(NumSel, "num_sel", prop, "1");
|
|
||||||
//
|
|
||||||
prop = (char*) xmlGetProp (cur, (xmlChar*)"align");
|
|
||||||
Align.readSInt32 ("0", ownerId + ":align");
|
|
||||||
if (prop)
|
|
||||||
{
|
|
||||||
const char *seekPtr = prop.getDatas();
|
|
||||||
while (*seekPtr != 0)
|
|
||||||
{
|
|
||||||
if ((*seekPtr=='l')||(*seekPtr=='L'))
|
|
||||||
{
|
|
||||||
Align.setSInt32 (Align.getSInt32()&(~1));
|
|
||||||
}
|
|
||||||
if ((*seekPtr=='r')||(*seekPtr=='R'))
|
|
||||||
{
|
|
||||||
Align.setSInt32 (Align.getSInt32()|1);
|
|
||||||
}
|
|
||||||
if ((*seekPtr=='b')||(*seekPtr=='B'))
|
|
||||||
{
|
|
||||||
Align.setSInt32 (Align.getSInt32()&(~2));
|
|
||||||
}
|
|
||||||
if ((*seekPtr=='t')||(*seekPtr=='T'))
|
|
||||||
{
|
|
||||||
Align.setSInt32 (Align.getSInt32()|2);
|
|
||||||
}
|
|
||||||
++seekPtr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//=========================================================================================
|
|
||||||
void CComboBoxDesc::addObserver(ICDBNode::IPropertyObserver *obs)
|
|
||||||
{
|
|
||||||
// Add observers on dimensions
|
|
||||||
if (NumRow.getNodePtr())
|
|
||||||
{
|
|
||||||
ICDBNode::CTextId textId;
|
|
||||||
NumRow.getNodePtr()->addObserver(obs, textId);
|
|
||||||
}
|
|
||||||
if (NumCol.getNodePtr())
|
|
||||||
{
|
|
||||||
ICDBNode::CTextId textId;
|
|
||||||
NumCol.getNodePtr()->addObserver(obs, textId);
|
|
||||||
}
|
|
||||||
if (ItemWidth.getNodePtr())
|
|
||||||
{
|
|
||||||
ICDBNode::CTextId textId;
|
|
||||||
ItemWidth.getNodePtr()->addObserver(obs, textId);
|
|
||||||
}
|
|
||||||
if (ItemHeight.getNodePtr())
|
|
||||||
{
|
|
||||||
ICDBNode::CTextId textId;
|
|
||||||
ItemHeight.getNodePtr()->addObserver(obs, textId);
|
|
||||||
}
|
|
||||||
if (Unrolled.getNodePtr())
|
|
||||||
{
|
|
||||||
ICDBNode::CTextId textId;
|
|
||||||
Unrolled.getNodePtr()->addObserver(obs, textId);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//=======================================================================================
|
|
||||||
void CComboBoxDesc::getGridSize(uint &numRow, uint &numCol) const
|
|
||||||
{
|
|
||||||
numRow = NumRow.getSInt32();
|
|
||||||
numCol = NumCol.getSInt32();
|
|
||||||
if (numRow == 0 || numCol == 0) return;
|
|
||||||
if (!Unrolled.getBool())
|
|
||||||
{
|
|
||||||
numRow = numCol = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//=======================================================================================
|
|
||||||
void CComboBoxDesc::getDimensions(uint &w, uint &h) const
|
|
||||||
{
|
|
||||||
uint numRow, numCol;
|
|
||||||
getGridSize(numRow, numCol);
|
|
||||||
w = numCol * (ItemWidth.getSInt32() + WGap.getSInt32());
|
|
||||||
h = numRow * (ItemHeight.getSInt32() + HGap.getSInt32());
|
|
||||||
//
|
|
||||||
if (numCol == 1) w -= WGap.getSInt32();
|
|
||||||
else w += WGapSelected.getSInt32() - WGap.getSInt32();
|
|
||||||
//
|
|
||||||
if (numRow == 1) h -= HGap.getSInt32();
|
|
||||||
else h += HGapSelected.getSInt32() - HGap.getSInt32();
|
|
||||||
}
|
|
||||||
|
|
||||||
//=======================================================================================
|
|
||||||
NLMISC_REGISTER_OBJECT(CViewBase, CViewBitmapCombo, std::string, "bitmap_combo");
|
|
||||||
|
|
||||||
CViewBitmapCombo::CViewBitmapCombo(const TCtorParam ¶m) : CViewBase(param)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//=======================================================================================
|
|
||||||
bool CViewBitmapCombo::parse(xmlNodePtr cur, CInterfaceGroup * parentGroup)
|
|
||||||
{
|
|
||||||
if (! CViewBase::parse(cur, parentGroup) )
|
|
||||||
{
|
|
||||||
parseError(parentGroup);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
CXMLAutoPtr prop;
|
|
||||||
|
|
||||||
std::string texs;
|
|
||||||
prop = xmlGetProp(cur, (xmlChar *)"tx_normal");
|
|
||||||
if (prop) texs = (const char*)prop;
|
|
||||||
std::string texsOver;
|
|
||||||
prop = xmlGetProp(cur, (xmlChar *)"tx_over");
|
|
||||||
if (prop) texsOver = (const char*)prop;
|
|
||||||
std::string texsPushed;
|
|
||||||
prop = xmlGetProp(cur, (xmlChar *)"tx_pushed");
|
|
||||||
if (prop) texsPushed = (const char*)prop;
|
|
||||||
//
|
|
||||||
// for colors, an empty strings means all colors are white
|
|
||||||
//
|
|
||||||
std::string col;
|
|
||||||
prop = xmlGetProp(cur, (xmlChar *)"col_normal");
|
|
||||||
if (prop) col = (const char*)prop;
|
|
||||||
std::string colOver;
|
|
||||||
prop = xmlGetProp(cur, (xmlChar *)"col_over");
|
|
||||||
if (prop) colOver = (const char*)prop;
|
|
||||||
std::string colPushed;
|
|
||||||
prop = xmlGetProp(cur, (xmlChar *)"col_pushed");
|
|
||||||
if (prop) colPushed = (const char*)prop;
|
|
||||||
|
|
||||||
/* if (texs.empty() || texsOver.empty() || texsPushed.empty())
|
|
||||||
{
|
|
||||||
parseError(parentGroup, "Cannot read tx_normal, tx_over, or tx_pushed");
|
|
||||||
return false;
|
|
||||||
}*/
|
|
||||||
|
|
||||||
parseTexList(texs, _Texs);
|
|
||||||
parseTexList(texsOver, _TexsOver);
|
|
||||||
parseTexList(texsPushed, _TexsPushed);
|
|
||||||
|
|
||||||
parseColList(col, _Col);
|
|
||||||
parseColList(colOver, _ColOver);
|
|
||||||
parseColList(colPushed, _ColPushed);
|
|
||||||
//
|
|
||||||
/* if (_Texs.size() != _TexsOver.size() || _TexsOver.size() != _TexsPushed.size())
|
|
||||||
{
|
|
||||||
parseError(parentGroup, "Texture names arrays do not have the same size");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
//
|
|
||||||
uint numCols = NLMISC::maxof(_Col.size(), _ColOver.size(), _ColPushed.size());
|
|
||||||
if (!
|
|
||||||
(
|
|
||||||
(_Col.empty() || _Col.size() == numCols)
|
|
||||||
&& (_ColOver.empty() || _ColOver.size() == numCols)
|
|
||||||
&& (_ColPushed.empty() || _ColPushed.size() == numCols)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
{
|
|
||||||
parseError(parentGroup, "Color names arrays do not have the same size (note an empty array is valid, means all color are 255 255 255");
|
|
||||||
return false;
|
|
||||||
}*/
|
|
||||||
//
|
|
||||||
if (!_CD.parse(cur, this))
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
//
|
|
||||||
setupSize();
|
|
||||||
//
|
|
||||||
_CD.addObserver(this);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
//=======================================================================================
|
|
||||||
NLMISC::CRGBA CViewBitmapCombo::getCol(const CViewBitmapCombo::TColorArray &array,uint index)
|
|
||||||
{
|
|
||||||
if (array.empty()) return CRGBA::White;
|
|
||||||
return array[index % array.size()];
|
|
||||||
}
|
|
||||||
|
|
||||||
//=======================================================================================
|
|
||||||
const std::string *CViewBitmapCombo::getTex(const TStringArray &array,uint index)
|
|
||||||
{
|
|
||||||
if (array.empty()) return NULL;
|
|
||||||
return &array[index % array.size()];
|
|
||||||
}
|
|
||||||
|
|
||||||
//=======================================================================================
|
|
||||||
sint32 CViewBitmapCombo::getTexId(const TIdArray &array, uint index)
|
|
||||||
{
|
|
||||||
if (array.empty()) return -1;
|
|
||||||
return array[index % array.size()];
|
|
||||||
}
|
|
||||||
|
|
||||||
//=======================================================================================
|
|
||||||
void CViewBitmapCombo::draw()
|
|
||||||
{
|
|
||||||
if (_Texs.empty()) return;
|
|
||||||
uint numRow, numCol;
|
|
||||||
_CD.getGridSize(numRow, numCol);
|
|
||||||
if (numRow == 0 || numCol == 0) return;
|
|
||||||
|
|
||||||
sint32 mx = 0, my = 0;
|
|
||||||
CViewRenderer &rVR = *CViewRenderer::getInstance();
|
|
||||||
const std::vector<CViewBase *> &rVB = CWidgetManager::getInstance()->getViewsUnderPointer();
|
|
||||||
if (!CWidgetManager::getInstance()->getPointer()) return;
|
|
||||||
CWidgetManager::getInstance()->getPointer()->getPointerDispPos(mx, my);
|
|
||||||
bool over = false;
|
|
||||||
uint32 i;
|
|
||||||
for (i = 0; i < rVB.size(); ++i)
|
|
||||||
{
|
|
||||||
if (rVB[i] == this)
|
|
||||||
{
|
|
||||||
over = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_TexsId.size() == 0)
|
|
||||||
{
|
|
||||||
for (i = 0; i < _Texs.size(); ++i)
|
|
||||||
_TexsId.push_back(rVR.getTextureIdFromName(_Texs[i]));
|
|
||||||
for (i = 0; i < _TexsOver.size(); ++i)
|
|
||||||
_TexsOverId.push_back(rVR.getTextureIdFromName(_TexsOver[i]));
|
|
||||||
for (i = 0; i < _TexsPushed.size(); ++i)
|
|
||||||
_TexsPushedId.push_back(rVR.getTextureIdFromName(_TexsPushed[i]));
|
|
||||||
}
|
|
||||||
|
|
||||||
sint32 textId;
|
|
||||||
CRGBA color;
|
|
||||||
uint selectedTexIndex = _CD.CurrSelected.getSInt32();
|
|
||||||
uint itemw = _CD.ItemWidth.getSInt32() + _CD.WGap.getSInt32();
|
|
||||||
uint itemh = _CD.ItemHeight.getSInt32() + _CD.HGap.getSInt32();
|
|
||||||
uint counter = 0;
|
|
||||||
|
|
||||||
bool overItem = false;
|
|
||||||
for(uint x = 0; x < numCol; ++x)
|
|
||||||
{
|
|
||||||
for(uint y = 0; y < numRow; ++y)
|
|
||||||
{
|
|
||||||
uint texIndex = counter;
|
|
||||||
if (counter != 0)
|
|
||||||
{
|
|
||||||
if (counter == selectedTexIndex)
|
|
||||||
{
|
|
||||||
texIndex = 0;
|
|
||||||
}
|
|
||||||
sint px;
|
|
||||||
sint py;
|
|
||||||
// get the right position depending on alignment
|
|
||||||
if (_CD.Align.getSInt32() & 1) // right align ?
|
|
||||||
{
|
|
||||||
px = _XReal + _WReal - (x + 1) * itemw;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
px = _XReal + x * itemw;
|
|
||||||
}
|
|
||||||
// top align ?
|
|
||||||
if (_CD.Align.getSInt32() & 2)
|
|
||||||
{
|
|
||||||
py = _YReal + _HReal - (y + 1) * itemh;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
py = _YReal + y * itemh;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (x != 0)
|
|
||||||
{
|
|
||||||
if (_CD.Align.getSInt32() & 1)
|
|
||||||
px -= _CD.WGapSelected.getSInt32() - _CD.WGap.getSInt32();
|
|
||||||
else px += _CD.WGapSelected.getSInt32() - _CD.WGap.getSInt32();
|
|
||||||
}
|
|
||||||
if (y != 0)
|
|
||||||
{
|
|
||||||
if (_CD.Align.getSInt32() & 2)
|
|
||||||
py -= _CD.HGapSelected.getSInt32() - _CD.HGap.getSInt32();
|
|
||||||
else py += _CD.HGapSelected.getSInt32() - _CD.HGap.getSInt32();
|
|
||||||
}
|
|
||||||
// is the mouse on current item ?
|
|
||||||
if (over
|
|
||||||
&& mx >= px
|
|
||||||
&& my >= py
|
|
||||||
&& mx < px + (sint32) itemw
|
|
||||||
&& my < py + (sint32) itemh)
|
|
||||||
{
|
|
||||||
overItem = true;
|
|
||||||
if ( CWidgetManager::getInstance()->getPointer()->getButtonState() & NLMISC::leftButton)
|
|
||||||
{
|
|
||||||
textId = getTexId(_TexsPushedId, texIndex);
|
|
||||||
color = getCol(_ColPushed, texIndex);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
textId = getTexId(_TexsOverId, texIndex);
|
|
||||||
color = getCol(_ColOver, texIndex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
textId = getTexId(_TexsId, texIndex);
|
|
||||||
color = getCol(_Col, texIndex);
|
|
||||||
}
|
|
||||||
CViewRenderer::getInstance()->drawRotFlipBitmap (_RenderLayer, px, py, itemw, itemh, 0, false,
|
|
||||||
textId,
|
|
||||||
color);
|
|
||||||
}
|
|
||||||
++counter;
|
|
||||||
if ((sint32) counter == _CD.NumSel.getSInt32())
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((sint32) selectedTexIndex >= _CD.NumSel.getSInt32())
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// draw current selection
|
|
||||||
sint32 px;
|
|
||||||
sint32 py;
|
|
||||||
//
|
|
||||||
if (_CD.Align.getSInt32() & 1)
|
|
||||||
{
|
|
||||||
px = _XReal + _WReal - itemw;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
px = _XReal;
|
|
||||||
}
|
|
||||||
//
|
|
||||||
if (_CD.Align.getSInt32() & 2)
|
|
||||||
{
|
|
||||||
py = _YReal + _HReal - itemh;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
py = _YReal;
|
|
||||||
}
|
|
||||||
//
|
|
||||||
if (_CD.Unrolled.getBool())
|
|
||||||
{
|
|
||||||
if (overItem && CWidgetManager::getInstance()->getPointer()->getButtonState() & NLMISC::leftButton)
|
|
||||||
{
|
|
||||||
textId = getTexId(_TexsId, selectedTexIndex);
|
|
||||||
color = getCol(_Col, selectedTexIndex);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
textId = getTexId(_TexsPushedId, selectedTexIndex);
|
|
||||||
color = getCol(_ColPushed, selectedTexIndex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (over
|
|
||||||
&& mx >= px
|
|
||||||
&& my >= py
|
|
||||||
&& mx < px + (sint32) itemw
|
|
||||||
&& my < py + (sint32) itemh
|
|
||||||
)
|
|
||||||
{
|
|
||||||
if ( CWidgetManager::getInstance()->getPointer()->getButtonState() & NLMISC::leftButton)
|
|
||||||
{
|
|
||||||
textId = getTexId(_TexsPushedId, selectedTexIndex);
|
|
||||||
color = getCol(_ColPushed, selectedTexIndex);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
textId = getTexId(_TexsOverId, selectedTexIndex);
|
|
||||||
color = getCol(_ColOver, selectedTexIndex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
textId = getTexId(_TexsId, selectedTexIndex);
|
|
||||||
color = getCol(_Col, selectedTexIndex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
CViewRenderer::getInstance()->drawRotFlipBitmap (_RenderLayer, px, py, itemw, itemh, 0, false,
|
|
||||||
textId,
|
|
||||||
color);
|
|
||||||
}
|
|
||||||
|
|
||||||
//=======================================================================================
|
|
||||||
void CViewBitmapCombo::parseTexList(const std::string &names, TStringArray &dest)
|
|
||||||
{
|
|
||||||
static const char sep[] = " ,\t";
|
|
||||||
std::string::size_type pos = 0, nextPos;
|
|
||||||
dest.clear();
|
|
||||||
do
|
|
||||||
{
|
|
||||||
nextPos = names.find_first_of(sep, pos);
|
|
||||||
if (pos != nextPos)
|
|
||||||
{
|
|
||||||
dest.push_back(names.substr(pos, nextPos - pos));
|
|
||||||
}
|
|
||||||
pos = names.find_first_not_of(sep, nextPos);
|
|
||||||
}
|
|
||||||
while (pos != std::string::npos);
|
|
||||||
}
|
|
||||||
|
|
||||||
//=======================================================================================
|
|
||||||
void CViewBitmapCombo::parseColList(const std::string &names,TColorArray &dest)
|
|
||||||
{
|
|
||||||
static const char sep[] = ",\t";
|
|
||||||
std::string::size_type pos = 0, nextPos;
|
|
||||||
dest.clear();
|
|
||||||
std::string col;
|
|
||||||
do
|
|
||||||
{
|
|
||||||
nextPos = names.find_first_of(sep, pos);
|
|
||||||
if (pos != nextPos)
|
|
||||||
{
|
|
||||||
col = names.substr(pos, nextPos - pos);
|
|
||||||
int r = 0, g = 0, b = 0, a = 255;
|
|
||||||
sscanf (col.c_str(), "%d %d %d %d", &r, &g, &b, &a);
|
|
||||||
NLMISC::clamp (r, 0, 255);
|
|
||||||
NLMISC::clamp (g, 0, 255);
|
|
||||||
NLMISC::clamp (b, 0, 255);
|
|
||||||
NLMISC::clamp (a, 0, 255);
|
|
||||||
dest.push_back(NLMISC::CRGBA((uint8) r, (uint8) g, (uint8) b, (uint8) a));
|
|
||||||
}
|
|
||||||
pos = names.find_first_not_of(sep, nextPos);
|
|
||||||
}
|
|
||||||
while (pos != std::string::npos);
|
|
||||||
}
|
|
||||||
|
|
||||||
//=======================================================================================
|
|
||||||
void CViewBitmapCombo::setupSize()
|
|
||||||
{
|
|
||||||
uint w, h;
|
|
||||||
_CD.getDimensions(w, h);
|
|
||||||
setW(w);
|
|
||||||
setH(h);
|
|
||||||
invalidateCoords();
|
|
||||||
}
|
|
||||||
|
|
||||||
//=======================================================================================
|
|
||||||
void CViewBitmapCombo::update(ICDBNode * /* leaf */)
|
|
||||||
{
|
|
||||||
setupSize();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//=======================================================================================
|
|
||||||
/** copy an array of char * into an array of strings
|
|
||||||
*/
|
|
||||||
static void copyStrArrayFromChar(CViewBitmapCombo::TStringArray &dest, const char * const src[], uint numColor)
|
|
||||||
{
|
|
||||||
dest.resize(numColor);
|
|
||||||
for(uint k = 0; k < numColor; ++k)
|
|
||||||
{
|
|
||||||
dest[k] = src[k];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void copyRGBAVectorFromRGBAArray(CViewBitmapCombo::TColorArray &dest, const NLMISC::CRGBA src[], uint numColor)
|
|
||||||
{
|
|
||||||
dest.resize(numColor);
|
|
||||||
std::copy(src, src + numColor, dest.begin());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//=======================================================================================
|
|
||||||
void CViewBitmapCombo::setTexs(const char * const tex[], uint numTex)
|
|
||||||
{
|
|
||||||
copyStrArrayFromChar(_Texs, tex, numTex);
|
|
||||||
}
|
|
||||||
|
|
||||||
//=======================================================================================
|
|
||||||
void CViewBitmapCombo::setTexsOver(const char * const tex[], uint numTex)
|
|
||||||
{
|
|
||||||
copyStrArrayFromChar(_TexsOver, tex, numTex);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//=======================================================================================
|
|
||||||
void CViewBitmapCombo::setTexsPushed(const char * const tex[], uint numTex)
|
|
||||||
{
|
|
||||||
copyStrArrayFromChar(_TexsPushed, tex, numTex);
|
|
||||||
}
|
|
||||||
|
|
||||||
//=======================================================================================
|
|
||||||
void CViewBitmapCombo::setColors(const NLMISC::CRGBA colors[], uint numColors)
|
|
||||||
{
|
|
||||||
copyRGBAVectorFromRGBAArray(_Col, colors, numColors);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//=======================================================================================
|
|
||||||
void CViewBitmapCombo::setColorsOver(const NLMISC::CRGBA colors[], uint numColors)
|
|
||||||
{
|
|
||||||
copyRGBAVectorFromRGBAArray(_ColOver, colors, numColors);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//=======================================================================================
|
|
||||||
void CViewBitmapCombo::setColorsPushed(const NLMISC::CRGBA colors[], uint numColors)
|
|
||||||
{
|
|
||||||
copyRGBAVectorFromRGBAArray(_ColPushed, colors, numColors);
|
|
||||||
}
|
|
|
@ -1,170 +0,0 @@
|
||||||
// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
|
|
||||||
// Copyright (C) 2010 Winch Gate Property Limited
|
|
||||||
//
|
|
||||||
// This program is free software: you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU Affero General Public License as
|
|
||||||
// published by the Free Software Foundation, either version 3 of the
|
|
||||||
// License, or (at your option) any later version.
|
|
||||||
//
|
|
||||||
// This program is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU Affero General Public License for more details.
|
|
||||||
//
|
|
||||||
// You should have received a copy of the GNU Affero General Public License
|
|
||||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef NL_VIEW_BITMAP_COMBO_H
|
|
||||||
#define NL_VIEW_BITMAP_COMBO_H
|
|
||||||
|
|
||||||
#include "nel/misc/cdb.h"
|
|
||||||
#include "nel/gui/view_base.h"
|
|
||||||
#include "nel/3d/u_texture.h"
|
|
||||||
#include <string>
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
|
|
||||||
/** Description of a combo box, this can be parsed from an xml node
|
|
||||||
* The bitmap layout is as follow :
|
|
||||||
*
|
|
||||||
* I W I W I W
|
|
||||||
* t G t G t G
|
|
||||||
* e a e a e a
|
|
||||||
* m p m p m p
|
|
||||||
* W S W W
|
|
||||||
* i e i i
|
|
||||||
* d l d d
|
|
||||||
* t e t t
|
|
||||||
* h c h h
|
|
||||||
* t
|
|
||||||
* e
|
|
||||||
* d
|
|
||||||
* +----+---+----+---+---+---+---+--...
|
|
||||||
* |ssss| |****| |***| |***|
|
|
||||||
* ItemHeight |ssss| |****| |***| |***
|
|
||||||
* +----+---+----+---+---+---+---+--...
|
|
||||||
* | | | | | | | |
|
|
||||||
* HGapSeleted | | | | | | | |
|
|
||||||
* +----+---+----+---+---+---+---+--...
|
|
||||||
* |****| |****| |***| |***|
|
|
||||||
* ItemHeight |****| |****| |***| |***|
|
|
||||||
* +----+---+----+---+---+---+---+--...
|
|
||||||
* | | | | | | | |
|
|
||||||
* HGap | | | | | | | |
|
|
||||||
* +----+---+----+---+---+---+---+--...
|
|
||||||
* |****| |****| |***| |***|
|
|
||||||
* ItemHeight |****| |****| |***| |***|
|
|
||||||
* . . . . . . . .
|
|
||||||
* . . . . . . . .
|
|
||||||
* s : selected item. . . . . . .
|
|
||||||
* * : where bitmap are displayed
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
struct CComboBoxDesc
|
|
||||||
{
|
|
||||||
bool parse(xmlNodePtr cur, CInterfaceElement *owner);
|
|
||||||
void addObserver(NLMISC::ICDBNode::IPropertyObserver *obs);
|
|
||||||
void getGridSize(uint &numRow,uint &numCol) const;
|
|
||||||
void getDimensions(uint &width, uint &height) const;
|
|
||||||
CInterfaceProperty NumRow;
|
|
||||||
CInterfaceProperty NumCol;
|
|
||||||
CInterfaceProperty CurrSelected;
|
|
||||||
CInterfaceProperty ItemWidth;
|
|
||||||
CInterfaceProperty ItemHeight;
|
|
||||||
CInterfaceProperty Unrolled;
|
|
||||||
CInterfaceProperty WGapSelected;
|
|
||||||
CInterfaceProperty WGap;
|
|
||||||
CInterfaceProperty HGapSelected;
|
|
||||||
CInterfaceProperty HGap;
|
|
||||||
CInterfaceProperty NumSel;
|
|
||||||
CInterfaceProperty Align;
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A combo box with several bitmaps in it
|
|
||||||
* \author Nicolas Vizerie
|
|
||||||
* \author Nevrax France
|
|
||||||
* \date 2002
|
|
||||||
*/
|
|
||||||
class CViewBitmapCombo : public CViewBase, public NLMISC::ICDBNode::IPropertyObserver
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
typedef std::vector<sint32> TIdArray;
|
|
||||||
typedef std::vector<std::string> TStringArray;
|
|
||||||
typedef std::vector<NLMISC::CRGBA> TColorArray;
|
|
||||||
public:
|
|
||||||
/// ctor
|
|
||||||
CViewBitmapCombo(const TCtorParam ¶m);
|
|
||||||
/**
|
|
||||||
* parse an xml node and initialize the base view members. Must call CViewBase::parse
|
|
||||||
* \param cur : pointer to the xml node to be parsed
|
|
||||||
* \param parentGroup : the parent group of the view
|
|
||||||
* \partam id : a refence to the string that will receive the view ID
|
|
||||||
* \return true if success
|
|
||||||
*/
|
|
||||||
bool parse(xmlNodePtr cur,CInterfaceGroup * parentGroup);
|
|
||||||
virtual uint32 getMemory() { return (uint32)(sizeof(*this)+_Id.size()); }
|
|
||||||
/**
|
|
||||||
* draw the view
|
|
||||||
*/
|
|
||||||
void draw();
|
|
||||||
|
|
||||||
// access to texture & colors
|
|
||||||
const TStringArray &getTexs() const { return _Texs; }
|
|
||||||
const TStringArray &getTexsOver() const { return _TexsOver; }
|
|
||||||
const TStringArray &getTexsPushed() const { return _TexsPushed; }
|
|
||||||
//
|
|
||||||
const TColorArray &getColors() const { return _Col; }
|
|
||||||
const TColorArray &getColorsOver() const { return _ColOver; }
|
|
||||||
const TColorArray &getColorsPushed() const { return _ColPushed; }
|
|
||||||
//
|
|
||||||
void setTexs(const char * const tex[], uint numTex);
|
|
||||||
void setTexsOver(const char * const tex[], uint numTex);
|
|
||||||
void setTexsPushed(const char * const tex[], uint numTex);
|
|
||||||
//
|
|
||||||
void setColors(const NLMISC::CRGBA colors[], uint numColors);
|
|
||||||
void setColorsOver(const NLMISC::CRGBA colors[], uint numColors);
|
|
||||||
void setColorsPushed(const NLMISC::CRGBA colors[], uint numColors);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////////
|
|
||||||
private:
|
|
||||||
//
|
|
||||||
TStringArray _Texs;
|
|
||||||
TStringArray _TexsOver;
|
|
||||||
TStringArray _TexsPushed;
|
|
||||||
TIdArray _TexsId;
|
|
||||||
TIdArray _TexsOverId;
|
|
||||||
TIdArray _TexsPushedId;
|
|
||||||
TColorArray _Col;
|
|
||||||
TColorArray _ColOver;
|
|
||||||
TColorArray _ColPushed;
|
|
||||||
CComboBoxDesc _CD;
|
|
||||||
CInterfaceElement *_Owner;
|
|
||||||
private:
|
|
||||||
void parseTexList(const std::string &names, TStringArray &dest);
|
|
||||||
void parseColList(const std::string &names, TColorArray &dest);
|
|
||||||
void setupSize();
|
|
||||||
void getDimensions(uint &numRow, uint &numCol);
|
|
||||||
// From ICDBNode::IPropertyObserver
|
|
||||||
void update(NLMISC::ICDBNode *leaf);
|
|
||||||
// Return a color from the array, or white if it is empty
|
|
||||||
static NLMISC::CRGBA getCol(const TColorArray &array, uint index);
|
|
||||||
static const std::string *getTex(const TStringArray &array, uint index);
|
|
||||||
static sint32 getTexId(const TIdArray &array, uint index);
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
Loading…
Reference in a new issue