00001 /* 00002 ----------------------------------------------------------------------------- 00003 This source file is part of OGRE 00004 (Object-oriented Graphics Rendering Engine) 00005 For the latest info, see http://www.ogre3d.org/ 00006 00007 Copyright © 2000-2003 The OGRE Team 00008 Also see acknowledgements in Readme.html 00009 00010 This program is free software you can redistribute it and/or modify it under 00011 the terms of the GNU Lesser General Public License as published by the Free Software 00012 Foundation either version 2 of the License, or (at your option) any later 00013 version. 00014 00015 This program is distributed in the hope that it will be useful, but WITHOUT 00016 ANY WARRANTY without even the implied warranty of MERCHANTABILITY or FITNESS 00017 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. 00018 00019 You should have received a copy of the GNU Lesser General Public License along with 00020 this program if not, write to the Free Software Foundation, Inc., 59 Temple 00021 Place - Suite 330, Boston, MA 02111-1307, USA, or go to 00022 http://www.gnu.org/copyleft/lesser.txt. 00023 ----------------------------------------------------------------------------- 00024 */ 00025 00026 #include "OgrePopupMenuGuiElement.h" 00027 #include "OgreStringConverter.h" 00028 #include "OgreGuiManager.h" 00029 #include "OgreStringResource.h" 00030 #include "OgreException.h" 00031 #include "OgreMouseEvent.h" 00032 #include <algorithm> 00033 00034 namespace Ogre { 00035 00036 String PopupMenuGuiElement::msTypeName = "PopupMenu"; 00037 PopupMenuGuiElement::CmdItemTemplate PopupMenuGuiElement::msCmdItemTemplate; 00038 PopupMenuGuiElement::CmdVSpacing PopupMenuGuiElement::msCmdVSpacing; 00039 PopupMenuGuiElement::CmdHSpacing PopupMenuGuiElement::msCmdHSpacing; 00040 PopupMenuGuiElement::CmdItemPanelMaterial PopupMenuGuiElement::msCmdItemPanelMaterial; 00041 PopupMenuGuiElement::CmdItemPanelMaterialSelected PopupMenuGuiElement::msCmdItemPanelMaterialSelected; 00042 00043 PopupMenuGuiElement::PopupMenuGuiElement(const String& name) : 00044 PanelGuiElement(name), 00045 GuiPressable(name) 00046 { 00047 if (createParamDictionary("PopupMenuGuiElement")) 00048 { 00049 addBaseParameters(); 00050 } 00051 mChildrenProcessEvents = false; 00052 00053 mSelectedElement = 0; 00054 mVSpacing = 0; 00055 mHSpacing = 0; 00056 mPixelVSpacing = 0; 00057 mPixelHSpacing = 0; 00058 mItemPanelMaterial = ""; 00059 mItemPanelMaterialSelected = ""; 00060 00061 mSelectedMenuItem = new StringResource(""); 00062 mSeparatormenuItem = new StringResource("-----------------------"); 00063 setSource(this); 00064 addMouseMotionListener(this); 00065 } 00066 //--------------------------------------------------------------------- 00067 PopupMenuGuiElement::~PopupMenuGuiElement() 00068 { 00069 for (ResourceList::iterator i = mResourceList.begin(); i != mResourceList.end(); ++i) 00070 delete *i; 00071 } 00072 00073 //--------------------------------------------------------------------- 00074 void PopupMenuGuiElement::addBaseParameters(void) 00075 { 00076 PanelGuiElement::addBaseParameters(); 00077 ParamDictionary* dict = getParamDictionary(); 00078 00079 dict->addParameter(ParameterDef("item_template", 00080 "The template of List Item objects." 00081 , PT_STRING), 00082 &PopupMenuGuiElement::msCmdItemTemplate); 00083 00084 dict->addParameter(ParameterDef("v_spacing", 00085 "The vertical spacing of the elements" 00086 , PT_STRING), 00087 &PopupMenuGuiElement::msCmdVSpacing); 00088 dict->addParameter(ParameterDef("h_spacing", 00089 "The horizontal spacing of the elements from the edge of the list" 00090 , PT_STRING), 00091 &PopupMenuGuiElement::msCmdHSpacing); 00092 dict->addParameter(ParameterDef("item_material", 00093 "The material of the item panel" 00094 , PT_STRING), 00095 &PopupMenuGuiElement::msCmdItemPanelMaterial); 00096 dict->addParameter(ParameterDef("item_material_selected", 00097 "The material of the item panel when it is selected" 00098 , PT_STRING), 00099 &PopupMenuGuiElement::msCmdItemPanelMaterialSelected); 00100 } 00101 //--------------------------------------------------------------------- 00102 // Command objects 00103 //--------------------------------------------------------------------- 00104 00105 //----------------------------------------------------------------------- 00106 String PopupMenuGuiElement::CmdItemTemplate::doGet(const void* target) const 00107 { 00108 return static_cast<const PopupMenuGuiElement*>(target)->getItemTemplateName(); 00109 } 00110 void PopupMenuGuiElement::CmdItemTemplate::doSet(void* target, const String& val) 00111 { 00112 std::vector<String> vec = val.split(); 00113 00114 static_cast<PopupMenuGuiElement*>(target)->setItemTemplateName(val); 00115 } 00116 //----------------------------------------------------------------------- 00117 String PopupMenuGuiElement::CmdVSpacing::doGet(const void* target) const 00118 { 00119 return static_cast<const PopupMenuGuiElement*>(target)->getVSpacing(); 00120 } 00121 void PopupMenuGuiElement::CmdVSpacing::doSet(void* target, const String& val) 00122 { 00123 std::vector<String> vec = val.split(); 00124 00125 static_cast<PopupMenuGuiElement*>(target)->setVSpacing(val); 00126 } 00127 //----------------------------------------------------------------------- 00128 String PopupMenuGuiElement::CmdHSpacing::doGet(const void* target) const 00129 { 00130 return static_cast<const PopupMenuGuiElement*>(target)->getHSpacing(); 00131 } 00132 void PopupMenuGuiElement::CmdHSpacing::doSet(void* target, const String& val) 00133 { 00134 std::vector<String> vec = val.split(); 00135 00136 static_cast<PopupMenuGuiElement*>(target)->setHSpacing(val); 00137 } 00138 //----------------------------------------------------------------------- 00139 String PopupMenuGuiElement::CmdItemPanelMaterialSelected::doGet(const void* target) const 00140 { 00141 return static_cast<const PopupMenuGuiElement*>(target)->getItemPanelMaterialSelected(); 00142 } 00143 void PopupMenuGuiElement::CmdItemPanelMaterialSelected::doSet(void* target, const String& val) 00144 { 00145 static_cast<PopupMenuGuiElement*>(target)->setItemPanelMaterialSelected(val); 00146 } 00147 //----------------------------------------------------------------------- 00148 String PopupMenuGuiElement::CmdItemPanelMaterial::doGet(const void* target) const 00149 { 00150 return static_cast<const PopupMenuGuiElement*>(target)->getItemPanelMaterial(); 00151 } 00152 void PopupMenuGuiElement::CmdItemPanelMaterial::doSet(void* target, const String& val) 00153 { 00154 static_cast<PopupMenuGuiElement*>(target)->setItemPanelMaterial(val); 00155 } 00156 //----------------------------------------------------------------------- 00157 String PopupMenuGuiElement::getItemTemplateName() const 00158 { 00159 return mItemTemplateName; 00160 } 00161 void PopupMenuGuiElement::setItemTemplateName(const String& val) 00162 { 00163 mItemTemplateName = val; 00164 } 00165 //----------------------------------------------------------------------- 00166 00167 void PopupMenuGuiElement::setHSpacing(const String& val) 00168 { 00169 mHSpacing = StringConverter::parseReal(val); 00170 } 00171 String PopupMenuGuiElement::getHSpacing() const 00172 { 00173 return StringConverter::toString(mHSpacing); 00174 } 00175 00176 //----------------------------------------------------------------------- 00177 00178 void PopupMenuGuiElement::setVSpacing(const String& val) 00179 { 00180 mVSpacing = StringConverter::parseReal(val); 00181 } 00182 String PopupMenuGuiElement::getVSpacing() const 00183 { 00184 return StringConverter::toString(mVSpacing); 00185 } 00186 //----------------------------------------------------------------------- 00187 String PopupMenuGuiElement::getItemPanelMaterial() const 00188 { 00189 return mItemPanelMaterial; 00190 } 00191 void PopupMenuGuiElement::setItemPanelMaterial(const String& val) 00192 { 00193 mItemPanelMaterial = val; 00194 } 00195 //----------------------------------------------------------------------- 00196 String PopupMenuGuiElement::getItemPanelMaterialSelected() const 00197 { 00198 return mItemPanelMaterialSelected; 00199 00200 } 00201 void PopupMenuGuiElement::setItemPanelMaterialSelected(const String& val) 00202 { 00203 mItemPanelMaterialSelected = val; 00204 } 00205 //----------------------------------------------------------------------- 00206 00207 void PopupMenuGuiElement::addMenuItem(Resource* r) 00208 { 00209 GuiElement* mInsideObject = 00210 GuiManager::getSingleton().createGuiElementFromTemplate(mItemTemplateName, "", getListItemName(r)); 00211 00212 // create a back panel for the item 00213 00214 GuiContainer* pBackPanel = static_cast<GuiContainer*> 00215 (GuiManager::getSingleton().createGuiElement("Panel",getListItemPanelName(r))); 00216 00217 pBackPanel->setLeft(0); 00218 pBackPanel->setWidth(getWidth()); 00219 pBackPanel->setHeight(mInsideObject->getHeight()); 00220 addChild(pBackPanel); 00221 00222 mInsideObject->setCaption(r->getName()); 00223 mInsideObject->setLeft(mVSpacing); 00224 mInsideObject->setTop(0); 00225 mInsideObject->setWidth(pBackPanel->getWidth()-mVSpacing); 00226 00227 pBackPanel->addChild((GuiContainer*)mInsideObject); 00228 00229 setSelectedItem(mInsideObject,false); 00230 } 00231 00232 void PopupMenuGuiElement::removeMenuItem(Resource* r) 00233 { 00234 GuiContainer* backPanel = static_cast<GuiContainer*> (getChild(getListItemPanelName(r))); 00235 00236 backPanel->removeChild(getListItemName(r)); 00237 removeChild(getListItemPanelName(r)); 00238 00239 GuiManager::getSingleton().destroyGuiElement(getListItemName(r)); 00240 GuiManager::getSingleton().destroyGuiElement(getListItemPanelName(r)); 00241 } 00242 //----------------------------------------------------------------------- 00243 00244 void PopupMenuGuiElement::addListItem(Resource* r) 00245 { 00246 mResourceList.push_back(r); 00247 00248 if (mResourceList.size() == 1) 00249 { 00250 addMenuItem(r); 00251 mSelectedString = r->getName(); 00252 layoutItems(); 00253 } 00254 } 00255 00256 void PopupMenuGuiElement::removeListItem(Resource* r) 00257 { 00258 bool bFound = false; 00259 ResourceList::iterator i; 00260 00261 for (i = mResourceList.begin(); i != mResourceList.end(); ++i) 00262 { 00263 if (*i == r) 00264 { 00265 delete *i; 00266 mResourceList.erase(i); 00267 bFound = true; 00268 break; 00269 } 00270 } 00271 00272 if (!bFound) 00273 { 00274 Except(Exception::ERR_ITEM_NOT_FOUND, "Cannot find Resource " + r->getName() + 00275 " to remove from list.", "PopupMenuGuiElement::removeListItem"); 00276 } 00277 } 00278 00279 String PopupMenuGuiElement::getListItemName(Resource* r) 00280 { 00281 return mName + "/" + r->getName(); 00282 } 00283 00284 String PopupMenuGuiElement::getListItemPanelName(Resource* r) 00285 { 00286 return getListItemName(r) + "/" + "BackPanel"; 00287 } 00288 00289 void PopupMenuGuiElement::layoutItems() 00290 { 00291 Real currentTop = 0; //mVSpacing; 00292 ChildIterator it = getChildIterator(); 00293 while (it.hasMoreElements()) 00294 { 00295 GuiElement* currentElement = it.getNext(); 00296 00297 currentElement->setTop(currentTop); 00298 currentTop += currentElement->getHeight() + mVSpacing; 00299 } 00300 this->setHeight(currentTop - mVSpacing); 00301 00302 _update(); 00303 } 00304 00305 void PopupMenuGuiElement::mouseDragged(MouseEvent* e) {} 00306 00307 void PopupMenuGuiElement::mouseMoved(MouseEvent* e) 00308 { 00309 MouseEvent* me = static_cast<MouseEvent*>(e); 00310 GuiElement* newSelect = GuiContainer::findElementAt(me->getX(), me->getY()); 00311 00312 if (newSelect == this || !isPressed()) // in case there are fringe pixels not in the list 00313 { 00314 newSelect = NULL; 00315 } 00316 00317 if (newSelect != mSelectedElement) 00318 { 00319 if (mSelectedElement) 00320 { 00321 setSelectedItem(mSelectedElement, false); 00322 } 00323 00324 if (newSelect) 00325 { 00326 setSelectedItem(newSelect, true); 00327 } 00328 00329 mSelectedElement = newSelect; 00330 } 00331 } 00332 00333 void PopupMenuGuiElement::mouseExited(void) 00334 { 00335 if (mSelectedElement) 00336 { 00337 setSelectedItem(mSelectedElement, false); 00338 mSelectedElement = NULL; 00339 } 00340 } 00341 00342 void PopupMenuGuiElement::mousePressed(void) 00343 { 00344 ResourceList::iterator i; 00345 00346 for (i = mResourceList.begin(); i != mResourceList.end(); ++i) 00347 { 00348 if (mSelectedString == (*i)->getName()) 00349 { 00350 removeMenuItem(*i); 00351 break; 00352 } 00353 } 00354 00355 for (i = mResourceList.begin(); i != mResourceList.end(); ++i) 00356 { 00357 addMenuItem(*i); 00358 } 00359 00360 layoutItems(); 00361 } 00362 00363 void PopupMenuGuiElement::mouseReleased(void) 00364 { 00365 ResourceList::iterator i; 00366 bool selectedItem=false; 00367 00368 if (mSelectedElement) 00369 { 00370 setActionCommand(mSelectedElement->getName()); 00371 setSelectedItem(mSelectedElement, false); 00372 mSelectedString = mSelectedElement->getCaption(); 00373 mSelectedElement = NULL; 00374 selectedItem = true; 00375 } 00376 00377 for (i = mResourceList.begin(); i != mResourceList.end(); ++i) 00378 { 00379 if (mSelectedString != (*i)->getName()) 00380 { 00381 removeMenuItem(*i); 00382 } 00383 } 00384 00385 layoutItems(); 00386 00387 if (selectedItem) 00388 { 00389 fireActionPerformed(); 00390 } 00391 } 00392 00393 Resource* PopupMenuGuiElement::getSelectedItem() 00394 { 00395 Resource* selectedResource = NULL; 00396 return selectedResource; 00397 } 00398 00399 void PopupMenuGuiElement::setSelectedItem(Resource* r, bool on) 00400 { 00401 // do later 00402 } 00403 void PopupMenuGuiElement::setSelectedItem(Resource* r) 00404 { 00405 // do later 00406 } 00407 00408 void PopupMenuGuiElement::setSelectedItem(GuiElement* item) 00409 { 00410 // do later 00411 } 00412 00413 void PopupMenuGuiElement::setSelectedItem(GuiElement* item, bool on) 00414 { 00415 if (on) 00416 { 00417 item->getParent()->setMaterialName(mItemPanelMaterialSelected); 00418 } 00419 else 00420 { 00421 if (mItemPanelMaterial == "") 00422 { 00423 // default to the list material 00424 item->getParent()->setMaterialName(mMaterialName); 00425 } 00426 else 00427 { 00428 item->getParent()->setMaterialName(mItemPanelMaterial); 00429 } 00430 } 00431 } 00432 ResourceListConstIterator PopupMenuGuiElement::getConstIterator() const 00433 { 00434 return ResourceListConstIterator(mResourceList.begin()); 00435 } 00436 00437 ResourceListConstIterator PopupMenuGuiElement::getConstEndIterator() const 00438 { 00439 return ResourceListConstIterator(mResourceList.end()); 00440 } 00441 00442 Resource* PopupMenuGuiElement::popFront() 00443 { 00444 Resource* r = mResourceList.front(); 00445 mResourceList.pop_front(); 00446 00447 return r; 00448 } 00449 00450 size_t PopupMenuGuiElement::getListSize() const 00451 { 00452 return mResourceList.size(); 00453 } 00454 00455 }
Copyright © 2002-2003 by The OGRE Team
Last modified Fri May 14 23:22:34 2004