src/GUITabbedPanel.cpp

Go to the documentation of this file.
00001 #include "glwx.h"
00002 
00003 GUITabbedPanel::GUITabbedPanel(const std::string &callback) : GUIRectangle(callback)
00004 {
00005   setTabButtonsBordersColor(0.0f, 0.0f, 0.0f);
00006   setTabButtonsColor(100, 150, 190);
00007   setFontScales(1.0f, 1.0f);
00008   setPosition(0.5, 0.5);
00009 
00010   upperPanel = new GUIPanel("tpup");
00011   lowerPanel = new GUIPanel("tpdown");
00012   mainPanel  = new GUIPanel("tpmp");
00013 
00014   mainPanel->setLayout(PL_YAXIS_LAYOUT);
00015   mainPanel->setInterval(0, 0);
00016 
00017   upperPanel->setVisibleBounds(true);
00018   upperPanel->enableBGColor(true);
00019   upperPanel->setLayout(PL_XAXIS_LAYOUT);
00020   upperPanel->setClipSize(0);
00021 
00022   lowerPanel->setVisibleBounds(true);
00023   lowerPanel->enableBGColor(true);
00024   lowerPanel->setInterval(0,0);
00025   lowerPanel->setClipSize(0);
00026 
00027   mainPanel->addWidget(upperPanel);
00028   mainPanel->addWidget(lowerPanel);
00029 
00030   widgetType = WT_TABBED_PANEL;
00031   fontIndex  = 0;
00032   lockItems  = false;
00033 }
00034 
00035 GUITabbedPanel::~GUITabbedPanel()
00036 {
00037   deleteObject(mainPanel);
00038 }
00039 
00040 GUIEventListener  *GUITabbedPanel::getEventsListener()
00041 {
00042   return this;
00043 }
00044 
00045 void  GUITabbedPanel::setFontScales(const Tuple2f &scales)
00046 {
00047   setFontScales(scales.x, scales.y);
00048 }
00049 
00050 void  GUITabbedPanel::setFontScales(float wScale, float hScale)
00051 {
00052   fontScales.x = clamp(hScale, 0.01f, 20.0f);
00053   fontScales.y = clamp(wScale, 0.01f, 20.0f);
00054 }
00055 
00056 const Tuple2f  &GUITabbedPanel::getFontScales()
00057 {
00058   return fontScales;
00059 }
00060 
00061 bool GUITabbedPanel::loadXMLSettings(const TiXmlElement *element)
00062 {
00063   if(!XMLArbiter::inspectElementInfo(element, "TabbedPanel"))
00064     return Logger::writeErrorLog("Need a TabbedPanel node in the xml file");
00065 
00066   Tuple3f     bordersColor         = upperPanel->getBordersColor();
00067   Tuple4f     bgColor              = upperPanel->getBGColor();
00068   int         count                = 0;
00069 
00070   fontScales.y  = XMLArbiter::fillComponents1f(element,   "hScale",    fontScales.y);
00071   fontScales.x  = XMLArbiter::fillComponents1f(element,   "wScale",    fontScales.x);
00072   fontIndex     = XMLArbiter::fillComponents1i(element,   "fontIndex", fontIndex);
00073 
00074   for(const TiXmlElement *child = element->FirstChildElement(); 
00075       child;
00076           child = child->NextSiblingElement() )
00077   {
00078     const char *value = child->Value();
00079     if(!value)
00080       continue;
00081 
00082     if(!strcmp(value, "Panel"))
00083     {
00084       GUIPanel *panel = new GUIPanel();
00085       if(!panel->loadXMLSettings(child) || !addPanel(panel))
00086         deleteObject(panel);
00087       continue;
00088     }
00089 
00090     if(!strcmp(value, "TabButtonsBordersColor"))
00091       XMLArbiter::fillComponents3f(child, tabButtonsBordersColor);
00092 
00093     if(!strcmp(value, "TabButtonsColor"))
00094       XMLArbiter::fillComponents3f(child, tabButtonsColor);
00095 
00096     if(!strcmp(value, "BordersColor"))
00097       XMLArbiter::fillComponents3f(child, bordersColor);
00098 
00099     if(!strcmp(value, "BGColor"))
00100       XMLArbiter::fillComponents4f(child, bgColor);
00101   }
00102 
00103   upperPanel->setBordersColor(bordersColor);
00104   lowerPanel->setBordersColor(bordersColor);
00105 
00106   upperPanel->setBGColor(bgColor);
00107   lowerPanel->setBGColor(bgColor);
00108 
00109   setFontScales(fontScales);
00110 
00111   return GUIRectangle::loadXMLSettings(element) && lowerPanel->getWidgets().size();
00112 }
00113 
00114 bool GUITabbedPanel::addPanel(GUIPanel *panel)
00115 {
00116   if(lockItems)
00117     return false;
00118 
00119   if(lowerPanel->addWidget(panel))
00120   {
00121     char buffer[256];
00122     int  count = int(lowerPanel->getWidgets().size()) - 1;
00123     sprintf(buffer, "count_tb %d", count);
00124     GUIButton *tabButton = new GUIButton(buffer);
00125     tabButton->setBordersColor(tabButtonsBordersColor);
00126     tabButton->setColor(tabButtonsColor);
00127     tabButton->setLabelString(panel->getCallbackString());
00128     tabButton->getLabel()->setFontIndex(fontIndex);
00129     tabButton->getLabel()->setScales(fontScales);
00130     tabButton->setMinAlpha((count == 0) ? 1.0f : 0.5f);
00131 
00132     upperPanel->addWidget(tabButton);
00133     panel->setVisible((count == 0));
00134     return true;
00135   }
00136   return false;
00137 }
00138 
00139 const   GUIPanel*  GUITabbedPanel::getCurrentPanel() const
00140 {
00141   const Widgets &widgets = lowerPanel->getWidgets();
00142   int   count  = int(widgets.size());
00143  
00144   for(int t = 0; t < count; t++)
00145     if(widgets[t]->isVisible())
00146        return (GUIPanel*)widgets[t];
00147 
00148   return NULL;
00149 }
00150 
00151 const   int  GUITabbedPanel::getCurrentPanelIndex() const
00152 {
00153   const Widgets &widgets = lowerPanel->getWidgets();
00154   int   count  = int(widgets.size());
00155  
00156   for(int t = 0; t < count; t++)
00157     if(widgets[t]->isVisible())
00158        return t;
00159 
00160   return -1;
00161 }
00162 
00163 void GUITabbedPanel::checkKeyboardEvents(KeyEvent &evt, int extraInfo)
00164 {
00165   upperPanel->checkKeyboardEvents(evt, extraInfo);
00166   lowerPanel->checkKeyboardEvents(evt, extraInfo);
00167 }
00168 
00169 void GUITabbedPanel::checkMouseEvents(MouseEvent &evt, int extraInfo, bool rBits)
00170 {
00171   upperPanel->checkMouseEvents(evt, extraInfo, rBits);
00172   lowerPanel->checkMouseEvents(evt, extraInfo, rBits);
00173 }
00174 
00175 void GUITabbedPanel::actionPerformed(GUIEvent &evt)
00176 {
00177   const std::string &cbs             = evt.getCallbackString();
00178   GUIRectangle      *sourceRectangle = evt.getEventSource();
00179   int                widgetType      = sourceRectangle->getWidgetType();
00180 
00181   if((widgetType == WT_BUTTON) && sourceRectangle->isClicked())
00182   {
00183     const Widgets &widgets   = lowerPanel->getWidgets(), 
00184                   &buttons   = upperPanel->getWidgets();
00185     int   target = atoi(sourceRectangle->getCallbackString().c_str() + 9),
00186           count  = int(widgets.size());
00187 
00188     for(int t = 0; t < count; t++)
00189     {
00190       widgets[t]->setVisible(t == target);
00191       ((GUIAlphaElement*)buttons[t])->setMinAlpha((t == target) ? 1.0f : 0.5f);
00192     }
00193   }
00194 }
00195 
00196 GUIButton *GUITabbedPanel::getTabButton(int index)
00197 {
00198   const Widgets &widgets = upperPanel->getWidgets();
00199   int   count  = int(widgets.size());
00200  
00201   for(int t = 0; t < count; t++)
00202     if(t == index)
00203       return (GUIButton*)widgets[t];
00204 
00205   return NULL;
00206 }
00207 
00208 void GUITabbedPanel::render(float clockTick)
00209 {
00210   if(!parent || !visible)
00211     return;
00212   lockItems = true;
00213   mainPanel->render(clockTick);
00214 }
00215 
00216 const void GUITabbedPanel::computeWindowBounds()
00217 {
00218   if(parent && update)
00219   {
00220     upperPanel->setParent(mainPanel);
00221 
00222     mainPanel->setAnchorPoint(getAnchorPoint());
00223     mainPanel->setPosition(getPosition());
00224     mainPanel->setParent(parent);
00225     mainPanel->forceUpdate(true);
00226 
00227     windowBounds = mainPanel->getWindowBounds();
00228 
00229     const Widgets & widgets     = lowerPanel->getWidgets();
00230     float           height      = 0;
00231     int             widgetCount = (int)widgets.size();
00232 
00233     for(int i = 0; i < widgetCount; i++)
00234       height = height < widgets[i]->getHeight() ? widgets[i]->getHeight() : height;
00235     lowerPanel->setDimensions(1.0f, height);
00236     upperPanel->setParent(this);
00237   }
00238 }
00239 
00240 void  GUITabbedPanel::setTabButtonsColor(const Tuple3f& color)
00241 {
00242   setTabButtonsColor(color.x, color.y, color.z);
00243 }
00244 
00245 void  GUITabbedPanel::setTabButtonsColor(float r, float g, float b)
00246 {
00247   tabButtonsColor.set(clamp(r, 0.0f, 255.0f),
00248                         clamp(g, 0.0f, 255.0f),
00249                         clamp(b, 0.0f, 255.0f));
00250 
00251   tabButtonsColor.x /= (tabButtonsColor.x > 1.0) ? 255.0f : 1.0f;
00252   tabButtonsColor.y /= (tabButtonsColor.y > 1.0) ? 255.0f : 1.0f;
00253   tabButtonsColor.z /= (tabButtonsColor.z > 1.0) ? 255.0f : 1.0f;
00254 }
00255 
00256 const Tuple3f &GUITabbedPanel::getTabButtonsColor() const 
00257 {
00258   return tabButtonsColor;
00259 }
00260 
00261 void  GUITabbedPanel::setTabButtonsBordersColor(const Tuple3f& color)
00262 {
00263   setTabButtonsBordersColor(color.x, color.y, color.z);
00264 }
00265 
00266 void  GUITabbedPanel::setTabButtonsBordersColor(float r, float g, float b)
00267 {
00268   tabButtonsBordersColor.set(clamp(r, 0.0f, 255.0f),
00269                              clamp(g, 0.0f, 255.0f),
00270                              clamp(b, 0.0f, 255.0f));
00271   tabButtonsBordersColor.x /= (tabButtonsBordersColor.x > 1.0) ? 255.0f : 1.0f;
00272   tabButtonsBordersColor.y /= (tabButtonsBordersColor.y > 1.0) ? 255.0f : 1.0f;
00273   tabButtonsBordersColor.z /= (tabButtonsBordersColor.z > 1.0) ? 255.0f : 1.0f;
00274 }
00275 
00276 GUIPanel*  GUITabbedPanel::getLowerPanel()
00277 {
00278   return lowerPanel;
00279 }
00280 
00281 const Tuple3f &GUITabbedPanel::getTabButtonsBordersColor() const 
00282 {
00283   return tabButtonsBordersColor;
00284 }
00285 

Generated on Wed Dec 5 20:32:03 2007 for GLWX by  doxygen 1.5.3