3
GUIComboBox::GUIComboBox(const std::string& cbs) : GUIRectangle(cbs)
6
setScrollingColor(0.2f, 0.75f, 0.35f, 1.0f);
7
setFontScales(1.0f, 1.0f);
10
currentSelection = new GUILabel("Unknown", "itemCBS_0");
11
dropMenuButton = new GUIButton("cbddb");
12
upperPanel = new GUIPanel("cbup");
13
lowerPanel = new GUIPanel("cblp");
15
upperPanel->setLayout(PL_XAXIS_LAYOUT);
17
upperPanel->setVisibleBounds(true);
18
upperPanel->enableBGColor(true);
19
upperPanel->setInterval(6, 3);
20
upperPanel->addWidget(currentSelection);
21
upperPanel->addWidget(dropMenuButton);
23
lowerPanel->setLayout(PL_YAXIS_LAYOUT);
24
lowerPanel->setInterval(6, 2);
25
lowerPanel->setVisible(false);
26
lowerPanel->enableBGColor(true);
27
lowerPanel->setVisibleBounds(true);
28
lowerPanel->setAnchorPoint(AT_CORNERLU);
29
lowerPanel->setClipSize(0);
31
displayScrollingRectangle = true;
33
widgetType = WT_COMBO_BOX;
39
GUIComboBox::~GUIComboBox()
41
deleteObject(upperPanel);
42
deleteObject(lowerPanel);
45
GUIEventListener *GUIComboBox::getEventsListener()
50
void GUIComboBox::setFontScales(const Tuple2f &scales)
52
setFontScales(scales.x, scales.y);
55
void GUIComboBox::setFontScales(float wScale, float hScale)
57
fontScales.x = clamp(hScale, 0.01f, 20.0f);
58
fontScales.y = clamp(wScale, 0.01f, 20.0f);
61
const Tuple2f &GUIComboBox::getFontScales()
66
bool GUIComboBox::loadXMLSettings(const TiXmlElement *element)
68
if(!XMLArbiter::inspectElementInfo(element, "ComboBox"))
69
return Logger::writeErrorLog("Need a ComboBox node in the xml file");
71
const TiXmlElement *child = NULL;
72
Tuple3f bordersColor = upperPanel->getBordersColor();
73
Tuple4f bgColor = upperPanel->getBGColor();
74
float lowerPanelColorScale = 1.0f;
76
child = XMLArbiter::getChildElementByName(element, "Button");
79
dropMenuButton->loadXMLClippedRectangleInfo(child);
80
dropMenuButton->loadXMLSettings(child);
81
dropMenuButton->setCallbackString("cbddb");
82
dropMenuButton->setLabelString("");
83
dropMenuButton->setActive(true);
84
dropMenuButton->setVisible(true);
87
displayScrollingRectangle = XMLArbiter::analyzeBooleanAttr(element, "displayScrollingRectangle", displayScrollingRectangle);
88
lowerPanelColorScale = XMLArbiter::fillComponents1f(element, "lowerPanelColorScale", lowerPanelColorScale);
89
fontScales.y = XMLArbiter::fillComponents1f(element, "hScale", fontScales.y);
90
fontScales.x = XMLArbiter::fillComponents1f(element, "wScale", fontScales.x);
91
fontIndex = XMLArbiter::fillComponents1i(element, "fontIndex", fontIndex);
93
for(child = element->FirstChildElement();
95
child = child->NextSiblingElement() )
97
const char *value = child->Value();
101
if(!strcmp(value, "ScrollingColor"))
102
setScrollingColor(XMLArbiter::fillComponents4f(child, scrollingColor));
104
if(!strcmp(value, "BordersColor"))
105
XMLArbiter::fillComponents3f(child, bordersColor);
107
if(!strcmp(value, "BGColor"))
108
XMLArbiter::fillComponents4f(child, bgColor);
110
if(!strcmp(value, "Item"))
111
addItem(child->Attribute("string"));
114
upperPanel->setBordersColor(bordersColor);
115
lowerPanel->setBordersColor(bordersColor);
117
upperPanel->setBGColor(bgColor);
118
lowerPanel->setBGColor(bgColor.x*lowerPanelColorScale,
119
bgColor.y*lowerPanelColorScale,
120
bgColor.z*lowerPanelColorScale,
123
setFontScales(fontScales);
125
return GUIRectangle::loadXMLSettings(element) && (items.size() != 0);
128
void GUIComboBox::checkMouseEvents(MouseEvent &evt, int extraInfo, bool rBits)
130
upperPanel->checkMouseEvents(evt, extraInfo, rBits);
131
scrollingRectangle.x = 1;
133
if(lowerPanel->isVisible())
134
lowerPanel->checkMouseEvents(evt, extraInfo, rBits);
136
if(!currentSelection->isFocused() && !dropMenuButton->isFocused())
141
lowerPanel->setVisible(true);
145
lowerPanel->setVisible(false);
148
void GUIComboBox::actionPerformed(GUIEvent &evt)
150
GUIEventListener *eventsListener = parent->getEventsListener();
151
//const std::string &cbs = evt.getCallbackString();
152
GUIRectangle *sourceRectangle = evt.getEventSource();
153
int widgetType = sourceRectangle->getWidgetType();
155
if(currentSelection->isClicked() || dropMenuButton->isClicked())
156
deployed = !deployed;
158
if(widgetType == WT_LABEL && (sourceRectangle->getParent() == lowerPanel))
160
GUILabel *newSelection = (GUILabel*)sourceRectangle;
161
if(newSelection->isMouseOver())
162
scrollingRectangle = newSelection->getWindowBounds();
164
if(newSelection->isClicked() && (newSelection->getLabelString() != currentSelection->getLabelString()))
166
currentSelection->setLabelString(newSelection->getLabelString());
167
selectionIndex = getItemIndex(newSelection->getLabelString());
172
eventsListener->actionPerformed(evt);
178
void GUIComboBox::setItemIndex(int index)
180
selectionIndex = index;
182
currentSelection->setLabelString(items[selectionIndex]);
185
void GUIComboBox::render(float clockTick)
187
if(!parent || !visible)
190
computeWindowBounds();
191
upperPanel->render(clockTick);
193
if(lowerPanel->isVisible())
195
lowerPanel->renderClippedBounds();
196
lowerPanel->enableBGColor(false);
197
lowerPanel->setVisibleBounds(false);
199
if(scrollingRectangle.x >= lowerPanel->getWindowBounds().x && displayScrollingRectangle)
203
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
204
glColor4fv(scrollingColor);
206
glBegin(GL_TRIANGLE_STRIP);
207
glVertex2i(scrollingRectangle.x - 2, scrollingRectangle.y);
208
glVertex2i(scrollingRectangle.x - 2, scrollingRectangle.w);
209
glVertex2i(scrollingRectangle.z + 1, scrollingRectangle.y);
210
glVertex2i(scrollingRectangle.z + 1, scrollingRectangle.w);
216
lowerPanel->render(clockTick);
217
lowerPanel->enableBGColor(true);
218
lowerPanel->setVisibleBounds(true);
222
void GUIComboBox::finalizeSize()
224
if(!items.size() || lockItems )
227
GUIFont *font = GUIFontManager::getFont(fontIndex);
228
const int *spaces = font ? font->getFontObject()->getCharHorizontalGlyphs() : NULL;
237
height = float(font->getFontObject()->getHeight());
239
for(size_t l = 0; l < items.size(); l++)
241
length = items[l].size();
244
for(size_t t = 0; t < length; t++)
245
width += spaces[items[l][t]];
247
maxWidth = width > maxWidth ? width : maxWidth;
253
currentSelection->setLabelString(items[0]);
254
currentSelection->setDimensions(maxWidth*fontScales.x + 2.0f, height*fontScales.y);
255
currentSelection->getLabel()->setFontIndex(fontIndex);
256
currentSelection->getLabel()->setScales(fontScales);
257
dropMenuButton->setDimensions(height*fontScales.y + 4.0f, height*fontScales.y + 4.0f);
261
for(size_t l = 0; l < items.size(); l++)
263
sprintf(buffer, "itemCBS %d", (cbsIndex++));
264
GUILabel *newLabel = new GUILabel(items[l].c_str(), buffer);
265
newLabel->getLabel()->setFontIndex(fontIndex);
266
newLabel->setDimensions(maxWidth*fontScales.x + 2.0f /*+ height*fontScales.y + 10.0f*/, height*fontScales.y);
267
newLabel->getLabel()->setScales(fontScales);
268
if(!lowerPanel->addWidget(newLabel))
269
deleteObject(newLabel);
275
const void GUIComboBox::computeWindowBounds()
281
upperPanel->setAnchorPoint(getAnchorPoint());
282
upperPanel->setPosition(getPosition());
283
upperPanel->setParent(parent);
284
upperPanel->forceUpdate(true);
285
upperPanel->computeWindowBounds();
286
upperPanel->forceUpdate(false);
287
windowBounds = upperPanel->getWindowBounds();
289
lowerPanel->setPosition(0.0f, float(upperPanel->getHeight()));
290
lowerPanel->setParent(upperPanel);
291
lowerPanel->forceUpdate(true);
293
//Redirect mouse events to combo box action listener
294
lowerPanel->setParent(this);
295
upperPanel->setParent(this);
299
void GUIComboBox::addItem(const std::string &item)
301
if(lockItems || !item.size())
304
for(size_t t = 0; t < items.size(); t++)
308
items.push_back(item);
311
int GUIComboBox::getItemIndex(const std::string &item)
313
for(size_t t = 0; t < items.size(); t++)
320
const std::vector<std::string> &GUIComboBox::getItems() const
325
const char *GUIComboBox::getSelectedItem() const
327
return selectionIndex < 0 ? NULL : items[selectionIndex].c_str();
330
const char *GUIComboBox::getItem(size_t index) const
332
return index >= items.size() ? NULL : items[index].c_str();
335
void GUIComboBox::setScrollingColor(float r, float g, float b, float a)
337
scrollingColor.set(clamp(r, 0.0f, 255.0f),
338
clamp(g, 0.0f, 255.0f),
339
clamp(b, 0.0f, 255.0f),
340
clamp(a, 0.0f, 255.0f));
342
scrollingColor.x /= (scrollingColor.x > 1.0) ? 255.0f : 1.0f;
343
scrollingColor.y /= (scrollingColor.y > 1.0) ? 255.0f : 1.0f;
344
scrollingColor.z /= (scrollingColor.z > 1.0) ? 255.0f : 1.0f;
345
scrollingColor.w /= (scrollingColor.w > 1.0) ? 255.0f : 1.0f;
348
void GUIComboBox::setScrollingColor(const Tuple4f &rgba)
350
setScrollingColor(rgba.x, rgba.y, rgba.z, rgba.w);
353
const Tuple4f &GUIComboBox::getScrollingColor() const
355
return scrollingColor;
358
void GUIComboBox::enableScrollingRectangle(bool on)
360
displayScrollingRectangle = on;
363
bool GUIComboBox::scrollingRectangleEnabled()
365
return displayScrollingRectangle;
368
bool GUIComboBox::isDeployed()
370
if(lowerPanel) return lowerPanel->isVisible();