1 /* 2 ----------------------------------------------------------------------------- 3 This source file is part of OGRE 4 (Object-oriented Graphics Rendering Engine) 5 For the latest info, see http://www.ogre3d.org/ 6 7 Copyright (c) 2000-2013 Torus Knot Software Ltd 8 Also see acknowledgements in Readme.html 9 10 You may use this sample code for anything you like, it is not covered by the 11 same license as the rest of the engine. 12 ----------------------------------------------------------------------------- 13 */ 14 15 #include <CEGUI/CEGUIPropertyHelper.h> 16 17 #include "OgreStringConverter.h" 18 #include "ItemSelectorViewManager.h" 19 20 //----------------------------------------------------------------------------------- 21 // ItemSelectorViewManager Methods 22 //----------------------------------------------------------------------------------- 23 #define WIDGET_XPOS 0.0 24 #define WIDGET_YSTART 0.1f 25 #define WIDGET_YOFFSET 0.13f 26 #define ITEM_YSIZE 15 27 #define ITEM_YSPACING 2 28 ItemSelectorViewManager(const Ogre::String & parentWindowName)29 ItemSelectorViewManager::ItemSelectorViewManager(const Ogre::String& parentWindowName) 30 : mItemSelectorController(0) 31 { 32 mParentWindow = CEGUI::WindowManager::getSingleton().getWindow(parentWindowName.c_str()); 33 // add a scrollable pane as a child to the parent 34 mScrollablePane = (CEGUI::ScrollablePane*)CEGUI::WindowManager::getSingleton().createWindow("TaharezLook/ScrollablePane", 35 ("MainScrollPane")); 36 mScrollablePane->setHorizontalAlignment(CEGUI::HA_CENTRE); 37 mScrollablePane->setSize(CEGUI::UVector2(CEGUI::UDim(0.9, 0), CEGUI::UDim(0.75, 0))); 38 mParentWindow->addChildWindow(mScrollablePane); 39 mScrollablePane->setPosition(CEGUI::UVector2(CEGUI::UDim(WIDGET_XPOS, 0), CEGUI::UDim(WIDGET_YSTART, 0))); 40 // setup scrollable pane to resize to inside of parent window when parent resizes 41 // scrollbars should only become visible when required 42 // automatically handled by scrollable pane 43 } 44 //----------------------------------------------------------------------------------- addItemSelector(const Ogre::String & displayText)45 void ItemSelectorViewManager::addItemSelector(const Ogre::String& displayText) 46 { 47 // add a new item selector 48 // determine new index for item 49 assert(mScrollablePane); 50 const size_t idx = mItemSelectorContainer.size(); 51 mItemSelectorContainer.push_back(ItemSelector()); 52 ItemSelector& item = mItemSelectorContainer.back(); 53 // create new checkbox 54 CEGUI::Checkbox* checkbox = item.CheckBoxWidget = (CEGUI::Checkbox*)CEGUI::WindowManager::getSingleton().createWindow("TaharezLook/Checkbox", 55 ( ("ItemCheckbox" + Ogre::StringConverter::toString(idx)).c_str() )); 56 // set checkbox ID to selector ID 57 checkbox->setID(idx); 58 checkbox->setSize(CEGUI::UVector2(CEGUI::UDim(0, 140), CEGUI::UDim(0, ITEM_YSIZE))); 59 checkbox->setText(displayText.c_str()); 60 checkbox->setProperty("HoverTextColour", CEGUI::PropertyHelper::colourToString(CEGUI::colour(1.0, 1.0, 0.0))); 61 // add event handler for when checkbox state changes 62 checkbox->subscribeEvent(CEGUI::Checkbox::EventCheckStateChanged, CEGUI::Event::Subscriber(&ItemSelectorViewManager::handleCheckStateChanged, this )); 63 checkbox->setPosition(CEGUI::UVector2(CEGUI::UDim(0, 0), CEGUI::UDim(0, 12 + (ITEM_YSIZE + ITEM_YSPACING)* static_cast<float>(idx)))); 64 // add checkbox to the scroll pane 65 mScrollablePane->addChildWindow(checkbox); 66 } 67 //----------------------------------------------------------------------------------- setItemSelectorController(ItemSelectorInterface * controller)68 void ItemSelectorViewManager::setItemSelectorController(ItemSelectorInterface* controller) 69 { 70 mItemSelectorController = controller; 71 } 72 //----------------------------------------------------------------------------------- handleCheckStateChanged(const CEGUI::EventArgs & e)73 bool ItemSelectorViewManager::handleCheckStateChanged(const CEGUI::EventArgs& e) 74 { 75 // activate controller if set 76 if (mItemSelectorController) 77 { 78 CEGUI::Checkbox* checkbox = static_cast<CEGUI::Checkbox*>( 79 static_cast<const CEGUI::WindowEventArgs&>(e).window); 80 mItemSelectorController->itemStateChanged(checkbox->getID(), checkbox->isSelected()); 81 float selectColour = checkbox->isSelected() ? 0.0f : 1.0f; 82 checkbox->setProperty("NormalTextColour", 83 CEGUI::PropertyHelper::colourToString(CEGUI::colour(selectColour, 1.0f, selectColour))); 84 } 85 return true; 86 } 87