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-2006 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 | LGPL like 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 | |
---|
29 | ItemSelectorViewManager::ItemSelectorViewManager(const Ogre::String& parentWindowName) |
---|
30 | : mItemSelectorController(0) |
---|
31 | { |
---|
32 | mParentWindow = CEGUI::WindowManager::getSingleton().getWindow(parentWindowName); |
---|
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 | //----------------------------------------------------------------------------------- |
---|
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 | //----------------------------------------------------------------------------------- |
---|
68 | void ItemSelectorViewManager::setItemSelectorController(ItemSelectorInterface* controller) |
---|
69 | { |
---|
70 | mItemSelectorController = controller; |
---|
71 | } |
---|
72 | //----------------------------------------------------------------------------------- |
---|
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 | } |
---|