From: <and...@us...> - 2008-01-15 06:47:19
|
Revision: 542 http://python-ogre.svn.sourceforge.net/python-ogre/?rev=542&view=rev Author: andy_miller Date: 2008-01-14 22:47:21 -0800 (Mon, 14 Jan 2008) Log Message: ----------- Updated QuickGUI source to rev 313 - fixes display issues on ATI cards Revision Links: -------------- http://python-ogre.svn.sourceforge.net/python-ogre/?rev=313&view=rev Modified Paths: -------------- trunk/python-ogre/ThirdParty/quickgui/QuickGUIConfigScriptParser.cpp trunk/python-ogre/ThirdParty/quickgui/QuickGUIConfigScriptParser.h trunk/python-ogre/ThirdParty/quickgui/QuickGUIList.cpp trunk/python-ogre/ThirdParty/quickgui/QuickGUIManager.cpp trunk/python-ogre/ThirdParty/quickgui/QuickGUIPrerequisites.h trunk/python-ogre/ThirdParty/quickgui/QuickGUIQuad.cpp trunk/python-ogre/ThirdParty/quickgui/QuickGUIQuad.h trunk/python-ogre/ThirdParty/quickgui/QuickGUISkinSet.cpp trunk/python-ogre/ThirdParty/quickgui/QuickGUISkinSet.h trunk/python-ogre/ThirdParty/quickgui/QuickGUIText.cpp trunk/python-ogre/ThirdParty/quickgui/QuickGUIVertexBuffer.cpp trunk/python-ogre/ThirdParty/quickgui/QuickGUIVertexBuffer.h trunk/python-ogre/ThirdParty/quickgui/QuickGUIWidget.cpp trunk/python-ogre/ThirdParty/quickgui/QuickGUIWidget.h Added Paths: ----------- trunk/python-ogre/ThirdParty/quickgui/QuickGUIRoot.cpp trunk/python-ogre/ThirdParty/quickgui/QuickGUIRoot.h trunk/python-ogre/ThirdParty/quickgui/QuickGUITree.cpp trunk/python-ogre/ThirdParty/quickgui/QuickGUITree.h Modified: trunk/python-ogre/ThirdParty/quickgui/QuickGUIConfigScriptParser.cpp =================================================================== --- trunk/python-ogre/ThirdParty/quickgui/QuickGUIConfigScriptParser.cpp 2008-01-13 04:20:34 UTC (rev 541) +++ trunk/python-ogre/ThirdParty/quickgui/QuickGUIConfigScriptParser.cpp 2008-01-15 06:47:21 UTC (rev 542) @@ -2,16 +2,15 @@ //Original author: John Judnich #include "QuickGUIPrecompiledHeaders.h" -#include "OgreScriptLoader.h" - -#include "OgreResourceGroupManager.h" #include "OgreException.h" #include "OgreLogManager.h" +#include "OgrePrerequisites.h" +#include "OgreResourceGroupManager.h" +#include "OgreScriptLoader.h" +#include "QuickGUIConfigScriptParser.h" #include "QuickGUISkinSetManager.h" -#include "QuickGUIConfigScriptParser.h" - using namespace Ogre; namespace QuickGUI { @@ -267,6 +266,7 @@ + ConfigNode::ConfigNode(ConfigNode *parent, const String &name) { ConfigNode::name = name; Modified: trunk/python-ogre/ThirdParty/quickgui/QuickGUIConfigScriptParser.h =================================================================== --- trunk/python-ogre/ThirdParty/quickgui/QuickGUIConfigScriptParser.h 2008-01-13 04:20:34 UTC (rev 541) +++ trunk/python-ogre/ThirdParty/quickgui/QuickGUIConfigScriptParser.h 2008-01-15 06:47:21 UTC (rev 542) @@ -4,9 +4,6 @@ #ifndef __QuickGuiSkinSetParser_h_ #define __QuickGuiSkinSetParser_h_ -#include "OgreScriptLoader.h" -#include "OgrePrerequisites.h" - #include "QuickGUIPrerequisites.h" #include "QuickGUIExportDLL.h" Modified: trunk/python-ogre/ThirdParty/quickgui/QuickGUIList.cpp =================================================================== --- trunk/python-ogre/ThirdParty/quickgui/QuickGUIList.cpp 2008-01-13 04:20:34 UTC (rev 541) +++ trunk/python-ogre/ThirdParty/quickgui/QuickGUIList.cpp 2008-01-15 06:47:21 UTC (rev 542) @@ -111,9 +111,10 @@ delete mScrollPane; mScrollPane = NULL; - mGUIManager->destroyWidget(mRightScrollBar); + removeAndDestroyChild(mRightScrollBar); mRightScrollBar = NULL; - mGUIManager->destroyWidget(mBottomScrollBar); + + removeAndDestroyChild(mBottomScrollBar); mBottomScrollBar = NULL; } } Modified: trunk/python-ogre/ThirdParty/quickgui/QuickGUIManager.cpp =================================================================== --- trunk/python-ogre/ThirdParty/quickgui/QuickGUIManager.cpp 2008-01-13 04:20:34 UTC (rev 541) +++ trunk/python-ogre/ThirdParty/quickgui/QuickGUIManager.cpp 2008-01-15 06:47:21 UTC (rev 542) @@ -67,6 +67,10 @@ if( w == NULL ) return; + // If widget already queued for destruction, return. + if(std::find(mFreeList.begin(),mFreeList.end(),w) != mFreeList.end()) + return; + mFreeList.push_back(w); } @@ -186,6 +190,10 @@ return; } + // If widget already queued for destruction, return. + if(std::find(mFreeList.begin(),mFreeList.end(),w) != mFreeList.end()) + return; + if(w->getParentWidget() != NULL) w->getParentWidget()->removeAndDestroyChild(w); else Modified: trunk/python-ogre/ThirdParty/quickgui/QuickGUIPrerequisites.h =================================================================== --- trunk/python-ogre/ThirdParty/quickgui/QuickGUIPrerequisites.h 2008-01-13 04:20:34 UTC (rev 541) +++ trunk/python-ogre/ThirdParty/quickgui/QuickGUIPrerequisites.h 2008-01-15 06:47:21 UTC (rev 542) @@ -7,7 +7,7 @@ namespace QuickGUI { ////////////DRAWING///////////// - #define VERTICES_PER_QUAD 4 + #define VERTICES_PER_QUAD 6 class Rect; class Point; Modified: trunk/python-ogre/ThirdParty/quickgui/QuickGUIQuad.cpp =================================================================== --- trunk/python-ogre/ThirdParty/quickgui/QuickGUIQuad.cpp 2008-01-13 04:20:34 UTC (rev 541) +++ trunk/python-ogre/ThirdParty/quickgui/QuickGUIQuad.cpp 2008-01-15 06:47:21 UTC (rev 542) @@ -32,15 +32,10 @@ mClippingWidget(NULL), mInheritClippingWidget(true), mInheritQuadLayer(true), - mShowWithOwner(true), - mDirectXUsed(false) + mShowWithOwner(true) { mRenderSystem = Ogre::Root::getSingleton().getRenderSystem(); - // Determine if dirext X renderer used. - if(mRenderSystem->getName().find("Direct") != Ogre::String::npos) - mDirectXUsed = true; - _updateVertexColor(); } @@ -168,6 +163,8 @@ Ogre::Real top = -((absDimensions.y * 2) - 1); Ogre::Real bottom = top - (absDimensions.height * 2); + /* Reference code, back when the index buffer was used, and there were 4 vertices per quad. + // TRIANGLE 1 mVertices[0].pos = Ogre::Vector3(left, bottom, 0.f); // left-bottom mVertices[1].pos = Ogre::Vector3(right, bottom, 0.f); // right-bottom @@ -176,9 +173,8 @@ mVertices[2].pos = Ogre::Vector3(right, top, 0.f); // right-top mVertices[3].pos = Ogre::Vector3(left, top, 0.f); // left-top + */ - /* Reference code, back when the index buffer was not used, and there were 6 vertices per quad. - // TRIANGLE 1 mVertices[0].pos = Ogre::Vector3(left,bottom,0); // left-bottom mVertices[1].pos = Ogre::Vector3(right,bottom,0); // right-bottom @@ -188,8 +184,6 @@ mVertices[3].pos = Ogre::Vector3(right,bottom,0); // right-bottom mVertices[4].pos = Ogre::Vector3(right,top,0); // right-top mVertices[5].pos = Ogre::Vector3(left,top,0); // left-top - - */ } void Quad::_notifyAddedToRenderObjectGroup() @@ -243,6 +237,8 @@ { const Ogre::Vector4 actualTextureCoords(mTextureCoordinatesViaClipping); + /* Reference code, back when the index buffer was used, and there were 4 vertices per quad. + // TRIANGLE 1 : bot-left, bot-right, top-left vertices mVertices[0].uv = Ogre::Vector2(actualTextureCoords.x,actualTextureCoords.w); mVertices[1].uv = Ogre::Vector2(actualTextureCoords.z,actualTextureCoords.w); @@ -250,7 +246,7 @@ mVertices[2].uv = Ogre::Vector2(actualTextureCoords.z,actualTextureCoords.y); mVertices[3].uv = Ogre::Vector2(actualTextureCoords.x,actualTextureCoords.y); - /* Reference code, back when the index buffer was not used, and there were 6 vertices per quad. + */ // TRIANGLE 1 : bot-left, bot-right, top-left vertices mVertices[0].uv = Ogre::Vector2(actualTextureCoords.x,actualTextureCoords.w); @@ -260,12 +256,12 @@ mVertices[3].uv = Ogre::Vector2(actualTextureCoords.z,actualTextureCoords.w); mVertices[4].uv = Ogre::Vector2(actualTextureCoords.z,actualTextureCoords.y); mVertices[5].uv = Ogre::Vector2(actualTextureCoords.x,actualTextureCoords.y); - - */ } void Quad::_updateVertexColor() { + /* Reference code, back when the index buffer was used, and there were 4 vertices per quad. + // TRIANGLE 1 mRenderSystem->convertColourValue(mBottomColor,&( mVertices[0].color )); mRenderSystem->convertColourValue(mBottomColor,&( mVertices[1].color )); @@ -273,7 +269,7 @@ mRenderSystem->convertColourValue(mTopColor,&( mVertices[2].color )); mRenderSystem->convertColourValue(mTopColor,&( mVertices[3].color )); - /* Reference code, back when the index buffer was not used, and there were 6 vertices per quad. + */ // TRIANGLE 1 mRenderSystem->convertColourValue(mBottomColor,&( mVertices[0].color )); @@ -283,8 +279,6 @@ mRenderSystem->convertColourValue(mBottomColor,&( mVertices[3].color )); mRenderSystem->convertColourValue(mTopColor,&( mVertices[4].color )); mRenderSystem->convertColourValue(mTopColor,&( mVertices[5].color )); - - */ } void Quad::addToRenderObjectGroup() @@ -525,22 +519,8 @@ void Quad::setTextureCoordinates(const Ogre::Vector4& textureCoordinates) { - // DirectX interprets UV coords from a different location than OpenGL, so - // we have to modify the coordinates to get the same results. -/* if(mDirectXUsed) - { - Ogre::Real xVal = 0.5 / mPixelDimensions.width; - Ogre::Real yVal = 0.5 / mPixelDimensions.height; + mTextureCoordinates = textureCoordinates; - mTextureCoordinates = Ogre::Vector4( - textureCoordinates.x + xVal, - textureCoordinates.y + yVal, - textureCoordinates.z + xVal, - textureCoordinates.w + yVal); - } - else */ - mTextureCoordinates = textureCoordinates; - mTextureCoordsChanged = true; _clip(); Modified: trunk/python-ogre/ThirdParty/quickgui/QuickGUIQuad.h =================================================================== --- trunk/python-ogre/ThirdParty/quickgui/QuickGUIQuad.h 2008-01-13 04:20:34 UTC (rev 541) +++ trunk/python-ogre/ThirdParty/quickgui/QuickGUIQuad.h 2008-01-15 06:47:21 UTC (rev 542) @@ -104,7 +104,6 @@ GUIManager* mGUIManager; QuadContainer* mQuadContainer; Ogre::RenderSystem* mRenderSystem; - bool mDirectXUsed; Layer mLayer; bool mInheritQuadLayer; Added: trunk/python-ogre/ThirdParty/quickgui/QuickGUIRoot.cpp =================================================================== --- trunk/python-ogre/ThirdParty/quickgui/QuickGUIRoot.cpp (rev 0) +++ trunk/python-ogre/ThirdParty/quickgui/QuickGUIRoot.cpp 2008-01-15 06:47:21 UTC (rev 542) @@ -0,0 +1,77 @@ +#include "QuickGUIPrecompiledHeaders.h" + +#include "QuickGUIRoot.h" + +template<> QuickGUI::Root* Ogre::Singleton<QuickGUI::Root>::ms_Singleton = 0; + +namespace QuickGUI +{ + Root::Root() : + mGUIManagerCounter(-1) + { + // Create SkinSetManager + new SkinSetManager(); + } + + Root::~Root() + { + for(std::map<Ogre::String,GUIManager*>::iterator it = mGUIManagers.begin(); it != mGUIManagers.end(); ++it) + delete (*it).second; + mGUIManagers.clear(); + + // Destroy SkinSetManager + delete SkinSetManager::getSingletonPtr(); + } + + Root* Root::getSingletonPtr(void) + { + return ms_Singleton; + } + + Root& Root::getSingleton(void) + { + assert( ms_Singleton ); + return ( *ms_Singleton ); + } + + GUIManager* Root::createGUIManager(const Ogre::String& name, Ogre::Viewport* v) + { + // make sure name does not already exist. + if(mGUIManagers.find(name) != mGUIManagers.end()) + throw Ogre::Exception(Ogre::Exception::ERR_DUPLICATE_ITEM,"A GUIManager with name \"" + name + "\" already exists!","Root::createGUIManager"); + + GUIManager* newGUIManager = new GUIManager(name,v); + mGUIManagers[name] = newGUIManager; + + return newGUIManager; + } + + GUIManager* Root::createGUIManager(Ogre::Viewport* v) + { + ++mGUIManagerCounter; + return createGUIManager("GUIManager" + Ogre::StringConverter::toString(mGUIManagerCounter),v); + } + + void Root::destroyGUIManager(GUIManager* gm) + { + if(gm == NULL) + return; + + destroyGUIManager(gm->getName()); + } + + void Root::destroyGUIManager(const Ogre::String& name) + { + GUIManager* gm = mGUIManagers[name]; + mGUIManagers.erase(mGUIManagers.find(name)); + delete gm; + } + + GUIManager* Root::getGUIManager(const Ogre::String& name) + { + if(mGUIManagers.find(name) == mGUIManagers.end()) + return NULL; + + return mGUIManagers[name]; + } +} Added: trunk/python-ogre/ThirdParty/quickgui/QuickGUIRoot.h =================================================================== --- trunk/python-ogre/ThirdParty/quickgui/QuickGUIRoot.h (rev 0) +++ trunk/python-ogre/ThirdParty/quickgui/QuickGUIRoot.h 2008-01-15 06:47:21 UTC (rev 542) @@ -0,0 +1,42 @@ +#ifndef QUICKGUIROOT_H +#define QUICKGUIROOT_H + +#include "QuickGUIExportDLL.h" +#include "QuickGUIManager.h" +#include "QuickGUISkinSetManager.h" + +#include "OgreException.h" +#include "OgrePrerequisites.h" +#include "OgreSingleton.h" +#include "OgreViewport.h" + +#include <map> + +namespace QuickGUI +{ + class _QuickGUIExport Root : + public Ogre::Singleton<Root> + { + public: + Root(); + ~Root(); + + static Root& getSingleton(void); + static Root* getSingletonPtr(void); + + GUIManager* createGUIManager(const Ogre::String& name, Ogre::Viewport* v); + GUIManager* createGUIManager(Ogre::Viewport* v); + + void destroyGUIManager(GUIManager* gm); + void destroyGUIManager(const Ogre::String& name); + + GUIManager* getGUIManager(const Ogre::String& name); + + protected: + int mGUIManagerCounter; + + std::map<Ogre::String,GUIManager*> mGUIManagers; + }; +} + +#endif Modified: trunk/python-ogre/ThirdParty/quickgui/QuickGUISkinSet.cpp =================================================================== --- trunk/python-ogre/ThirdParty/quickgui/QuickGUISkinSet.cpp 2008-01-13 04:20:34 UTC (rev 541) +++ trunk/python-ogre/ThirdParty/quickgui/QuickGUISkinSet.cpp 2008-01-15 06:47:21 UTC (rev 542) @@ -21,6 +21,9 @@ { _determineExtension(t); + mHorizontalTexelOffset = Ogre::Root::getSingleton().getRenderSystem()->getHorizontalTexelOffset(); + mVerticalTexelOffset = Ogre::Root::getSingleton().getRenderSystem()->getVerticalTexelOffset(); + // if skinset doesn't exists if (loadSkin() == false) { @@ -81,10 +84,10 @@ Ogre::Vector4 texCoord; if (dimension) { - texCoord.x = Ogre::StringConverter::parseReal(dimension->getValues()[0]); - texCoord.y = Ogre::StringConverter::parseReal(dimension->getValues()[1]); - texCoord.z = Ogre::StringConverter::parseReal(dimension->getValues()[2]); - texCoord.w = Ogre::StringConverter::parseReal(dimension->getValues()[3]); + texCoord.x = Ogre::StringConverter::parseReal(dimension->getValues()[0]) + (mHorizontalTexelOffset / mTextureWidth); + texCoord.y = Ogre::StringConverter::parseReal(dimension->getValues()[1]) + (mVerticalTexelOffset / mTextureHeight); + texCoord.z = Ogre::StringConverter::parseReal(dimension->getValues()[2]) + (mHorizontalTexelOffset / mTextureWidth); + texCoord.w = Ogre::StringConverter::parseReal(dimension->getValues()[3]) + (mVerticalTexelOffset / mTextureHeight); } //ConfigNode *rotation = skinRootNode->findChild("rotation"); @@ -109,6 +112,11 @@ return false; } + bool SkinSet::overTransparentPixel(const Ogre::String& skinComponent, int xPos, int yPos) + { + return false; + } + void SkinSet::saveSkin() { ConfigScriptSerializer serializer; Modified: trunk/python-ogre/ThirdParty/quickgui/QuickGUISkinSet.h =================================================================== --- trunk/python-ogre/ThirdParty/quickgui/QuickGUISkinSet.h 2008-01-13 04:20:34 UTC (rev 541) +++ trunk/python-ogre/ThirdParty/quickgui/QuickGUISkinSet.h 2008-01-15 06:47:21 UTC (rev 542) @@ -68,6 +68,10 @@ bool containsImage(Ogre::String textureName); Ogre::String getImageExtension() const; + /* + * Retrieve material used for this Skinset. + */ + Ogre::String getMaterialName() { return mMaterialName; } Ogre::String getSkinName() const; // Return the name of the skin for this SkinSet Ogre::String getTextureName() const; @@ -94,11 +98,17 @@ */ bool loadSkin(); + /** Returns true if the relative coordinates are over a transparent pixel, false otherwise. + @param + skinComponent The name to be embedded Image to query. + @param + xPos The relative position of the horizontal pixel in the image. + @param + yPos The relative position of the vertical pixel in the image. + */ + bool overTransparentPixel(const Ogre::String& skinComponent, int xPos, int yPos); + /* - * Retrieve material used for this Skinset. - */ - Ogre::String getMaterialName() { return mMaterialName; } - /* * set material used for this Skinset. */ void setMaterialName(const Ogre::String& materialName){ mMaterialName = materialName; } @@ -121,6 +131,9 @@ Ogre::uint mTextureWidth; Ogre::uint mTextureHeight; + Ogre::Real mHorizontalTexelOffset; + Ogre::Real mVerticalTexelOffset; + // This map connects individual textures to its UV coordinates, within // the SkinSet Texture. std::map<Ogre::String,Ogre::Vector4> mTextureMap; Modified: trunk/python-ogre/ThirdParty/quickgui/QuickGUIText.cpp =================================================================== --- trunk/python-ogre/ThirdParty/quickgui/QuickGUIText.cpp 2008-01-13 04:20:34 UTC (rev 541) +++ trunk/python-ogre/ThirdParty/quickgui/QuickGUIText.cpp 2008-01-15 06:47:21 UTC (rev 542) @@ -549,7 +549,7 @@ void Text::selectCharacters(unsigned int startIndex, unsigned int endIndex) { - if( (mCaption.length() == 0) || (startIndex >= mCaption.length()) ) + if( (mCaption.length() == 0) || (startIndex >= static_cast<unsigned int>(mCharacters.size())) ) return; mSelectStart = startIndex; Added: trunk/python-ogre/ThirdParty/quickgui/QuickGUITree.cpp =================================================================== --- trunk/python-ogre/ThirdParty/quickgui/QuickGUITree.cpp (rev 0) +++ trunk/python-ogre/ThirdParty/quickgui/QuickGUITree.cpp 2008-01-15 06:47:21 UTC (rev 542) @@ -0,0 +1,549 @@ +#include "QuickGUIPrecompiledHeaders.h" +#include "QuickGUIManager.h" +#include "QuickGUITree.h" + +namespace QuickGUI +{ + /** TreeItem Constructor + */ + TreeItem::TreeItem(const std::string &name, const std::string &id, const std::string &skinName, Tree *tree, double iconsize, GUIManager *mGUIManager): + _item(NULL), _parent(NULL), _minus(NULL) , _place(true), mSkinName(skinName), + _name(name), _id(id), _tree(tree), _next(NULL), _previous(NULL), _visible(true), _thumbtails(NULL), _down(false), + _IconSize(iconsize), _guiManager(mGUIManager) + { + _child.clear(); + } + + void TreeItem::setItem(MenuLabel *item) + { + _item = item; + //effects + _item->addEventHandler(Widget::EVENT_MOUSE_ENTER,&TreeItem::onMouseEntersItem,this); + _item->addEventHandler(Widget::EVENT_MOUSE_LEAVE,&TreeItem::onMouseLeavesItem,this); + _item->addEventHandler(Widget::EVENT_MOUSE_BUTTON_DOWN,&TreeItem::onMouseButtonDownItem,this); + _item->addEventHandler(Widget::EVENT_MOUSE_CLICK_DOUBLE, &TreeItem::onMouseClickDouble, this); + } + void TreeItem::onMouseEntersItem(const EventArgs& args) + { + if (_down) + return; + this->getItem()->setSkinComponent(".tree.button.over"); + this->getItem()->setSkin(_item->getSkin()); + } + void TreeItem::onMouseLeavesItem(const EventArgs& args) + { + if (_down) + return; + this->getItem()->setSkinComponent(".tree.button"); + this->getItem()->setSkin(_item->getSkin()); + } + void TreeItem::onMouseButtonDownItem(const EventArgs& args) + { + _down = true; + this->getItem()->setSkinComponent(".tree.button.down"); + this->getItem()->setSkin(_item->getSkin()); + _tree->onItemPushDown(_id); + } + + void TreeItem::onMouseButtonDownItemLeave() + { + _down = false; + this->getItem()->setSkinComponent(".tree.button"); + this->getItem()->setSkin(_item->getSkin()); + } + + void TreeItem::onMouseClickDouble(const EventArgs& args) + { + _place = !_place; + if(_place) + _tree->open(_id); + else + _tree->close(_id); + } + + void TreeItem::onMouseButtonDown(const EventArgs& args) + { + _place = !_place; + + if(_place) + _tree->open(_id); + else + _tree->close(_id); + } + + TreeItem::~TreeItem() + { + //delete from parent child's list + if (_parent) + _parent->removeChild(_id); + + setVisible(false); + _tree->removeAndDestroyChild(_thumbtails); + _tree->removeAndDestroyChild(_minus); + } + + std::vector<TreeItem *> &TreeItem::getChilds() + { + return _child; + } + + void TreeItem::removeChild(const std::string &id) + { + std::vector<TreeItem *>::iterator itb = _child.begin(); + for(; itb != _child.end(); ++itb) + if ((*itb)->getId() == id) + { + _child.erase(itb); + break; + } + } + QuickGUI::Image *TreeItem::addChild(TreeItem *Item) + { + _child.push_back(Item); + if (!_minus) // set image + - + { + Sheet *mSheet = _guiManager->getDefaultSheet(); + _minus = mSheet->createImage(); + _minus->setSkinComponent(".tree.minus"); + _minus->setSize(_IconSize, _IconSize); + _minus->setInheritClippingWidget(true); + _minus->setInheritOpacity(true); + _minus->setInheritQuadLayer(true); + _minus->addEventHandler(Widget::EVENT_MOUSE_BUTTON_DOWN, &TreeItem::onMouseButtonDown, this); + return _minus; + } + return NULL; + } + + void TreeItem::setThumbtails(const std::string &pic) + { + if (!_thumbtails) + { + Sheet *mSheet = _guiManager->getDefaultSheet(); + _thumbtails = mSheet->createImage(); + } + _thumbtails->setMaterial(pic); + _thumbtails->setSize(_IconSize, _IconSize); + if (_thumbtails->getParentSheet()) + _thumbtails->getParentSheet()->removeChild(_thumbtails); + _tree->addChild(_thumbtails); + _thumbtails->setPosition(_item->getXPosition() + (1.5 * _IconSize) / 2, _item->getYPosition() + (_item->getHeight() - _IconSize) / 2); + } + void TreeItem::setYPosition(double y) + { + _item->setYPosition(y); + if (_minus) + _minus->setYPosition(y); + if (_thumbtails) + _thumbtails->setYPosition(y); + } + + void TreeItem::setVisible(bool vis) + { + _visible = vis; + if (_visible) + { + _item->show(); + if (_minus) + _minus->show(); + if (_thumbtails) + _thumbtails->show(); + } + else + { + _item->hide(); + if (_minus) + _minus->hide(); + if (_thumbtails) + _thumbtails->hide(); + } + } + /** Tree Constructor + */ + Tree::Tree(const std::string &name, QuickGUI::GUIManager *mGUIManager, double padding) + : List(name,mGUIManager), _guiManager(mGUIManager), _lastChild(NULL), _iconSize(15), _name(name), _selected(NULL), _padding(padding) + { + // create the root Item + TreeItem *root = new TreeItem("root", "root", "qgui", this, 0, mGUIManager); + _lists["root"] = root; + + MenuLabel *item = addMenuLabel(); + root->setItem(item); + item->setXPosition(0); + item->setYPosition(- item->getHeight()); + root->setLag(-_padding / 2); + } + + Tree::~Tree() + { + std::map<std::string, TreeItem *>::iterator itb = _lists.begin(); + std::map<std::string, TreeItem *>::iterator ite = _lists.end(); + + for (; itb != ite; ++itb) + delete itb->second; + } + + void Tree::deleteChild(TreeItem *me) + { + // delete from List and destroy all childs + std::vector<TreeItem *>::iterator childItr; + for (childItr = me->getChilds().begin(); childItr != me->getChilds().end(); ++childItr) + { + if (!(*childItr)->getChilds().empty()) + { + deleteChild(*childItr); + continue; + } + + WidgetArray::iterator it = mItems.begin(); + while(it != mItems.end()) + { + bool deleted = false; + if ((*childItr) && (*it) == (*childItr)->getItem()) + { + _lists[(*childItr)->getId()] = NULL; + (*childItr)->setParent(NULL); + delete (*childItr); + //mGUIManager->destroyWidget((*it)); + it = mItems.erase(it); + deleted = true; + } + if (!deleted && (*it)== me->getItem()) + { + //mGUIManager->destroyWidget((*it)); + it = mItems.erase(it); + deleted = true; + } + if (!deleted) + ++it; + } + } + _lists[me->getId()] = NULL; + me->setParent(NULL); + delete me; + } + + void Tree::deleteItem(const std::string &id) + { + TreeItem *me = _lists[id]; + TreeItem *prev; + TreeItem *next; + + if (!me || me == _lists["root"]) + return; + + next = _lists[GetLastChild(id)]->getNext(); + prev = me->getPrevious(); + + if (_lastChild == me) + _lastChild = prev; + + if (next) + next->setPrevious(prev); + if (prev) + prev->setNext(next); + + me->getParent()->removeChild(id); + deleteChild(me); + + slideDown(prev); + + resize(); + } + + const std::string Tree::addInList(const std::string &name, const std::string &text, const std::string &parent, const std::string &LoadAfter) + { + TreeItem *par = _lists[parent]; + + if (!par) + return ""; + + // check for unique id; and create Item menulabel + std::string id = createId(name); + TreeItem *child = new TreeItem(name, id, mSkinName, this, _iconSize, _guiManager); + _lists[id] = child; + child->setLag(par->getLag() + 20); + child->setParent(par); + MenuLabel *item = this->addMenuLabel(); + item->setText(text); + item->setHorizontalAlignment(QuickGUI::Label::HA_LEFT); + child->setItem(item); + + // setImage + - + Image *img = par->addChild(child); + if (img) + { + if (img->getParentWidget()) + img->getParentWidget()->removeChild(img); + addChild(img); + img->setPosition(par->getItem()->getPosition().x, par->getItem()->getPosition().y); + img->setSkin(mSkinName, true); + img->appearOverWidget(this); + img->setPosition(par->getItem()->getXPosition() - (_iconSize / 2), par->getItem()->getYPosition() + (par->getItem()->getHeight() - _iconSize) / 2); + } + + + if ((parent == "root" || _lists["root"]->getId() == parent) && LoadAfter.empty()) // if we to add this item under all other + { + item->setXPosition(item->getPosition().x + child->getLag()); + child->setPrevious(_lastChild); + if (_lastChild) + _lastChild->setNext(child); + _lastChild = child; + } + else if (!LoadAfter.empty())// If we add this item after an other + addAfterTreeItem(LoadAfter, child); + else // else we add this item at the bootom of parent + addAfterTreeItem(GetLastChild(parent), child); + if (item->getWidth() == getWidth()) + item->setWidth(getWidth() - (item->getXPosition() + child->getLag())); + + + //look if parent is visible + + if (child->getVisible() && !par->getVisible()) + { + child->setVisible(false); + return id; + } + + //Now we will check if Item is in good place on Y + if (!child->getPrevious()) + return id; + + // try to find the last previous visible item; + TreeItem *previousVisible; + for (previousVisible = child->getPrevious(); previousVisible && !previousVisible->getVisible(); previousVisible = previousVisible->getPrevious()) + ; + if (previousVisible && previousVisible->getVisible()) + child->setYPosition(previousVisible->getItem()->getYPosition() + child->getItem()->getHeight()); + return id; + } + + std::string Tree::createId(const std::string& name) + { + if (_lists.find(name) == _lists.end()) + return name; + std::string id = name + "_0"; + for (unsigned int i = 1; _lists.find(id) != _lists.end(); ++i) + { + id = name + "_"; + std::ostringstream os; + os << i; + id += os.str(); + } + return id; + } + + void Tree::hideTreeItems(const std::string &id) + { + TreeItem *child = _lists[id]; + + if (!child) + return; + + std::vector<TreeItem *>::iterator itb = child->getChilds().begin(); + std::vector<TreeItem *>::iterator ite = child->getChilds().end(); + + for (; itb != ite; ++itb) + if ((*itb)) + { + if ((*itb)->getNext()) + { + (*itb)->getNext()->setYPosition((*itb)->getItem()->getYPosition()); + hideTreeItems((*itb)->getId()); + } + (*itb)->setVisible(false); + + if ((*itb)->getName() == "load_intro") + std::cout << "fait ?\n"; + + if ((itb+1) == ite) + slideUp((*itb)); + } + } + + void Tree::showTreeItems(const std::string &id) + { + TreeItem *child = _lists[id]; + + if (!child) + return; + + std::vector<TreeItem *>::iterator itb = child->getChilds().begin(); + std::vector<TreeItem *>::iterator ite = child->getChilds().end(); + + for (; itb != ite; ++itb) + if ((*itb)) + { + if ((*itb)->getPrevious() && (*itb)->getParent() && !parentIsPlace((*itb))) + (*itb)->setYPosition((*itb)->getPrevious()->getItem()->getYPosition()); + else + { + if ((*itb)->getPrevious()) + (*itb)->setYPosition((*itb)->getPrevious()->getItem()->getYPosition() + (*itb)->getPrevious()->getItem()->getHeight()); + + (*itb)->setVisible(true); + } + showTreeItems((*itb)->getId()); + + if ((itb+1) == ite) + slideDown((*itb)); + } + } + + + void Tree::slideUp(TreeItem *child) + { + if (child && child->getNext()) + { + double y = child->getItem()->getYPosition(); + if (child->getVisible()) + y += child->getItem()->getHeight(); + child->getNext()->setYPosition(y); + slideUp(child->getNext()); + } + } + + void Tree::slideDown(TreeItem *child) + { + // try to find the last previous visible item; + TreeItem *previousVisible; + TreeItem *children; + for (previousVisible = child->getPrevious(); previousVisible && !previousVisible->getVisible(); previousVisible = previousVisible->getPrevious()) + ; + if (!previousVisible) + previousVisible = _lists["root"]; + + for (children = child; children; children = children->getNext()) + { + double y = previousVisible->getItem()->getYPosition(); + if (children->getVisible()) + { + y += previousVisible->getItem()->getHeight(); + children->setYPosition(y); + previousVisible = children; + } + } + } + + void Tree::addAfterTreeItem(const std::string &id, TreeItem *item) + { + TreeItem *before = _lists[id]; + + if (!before) + return; + + if (before->getNext()) + before->getNext()->setPrevious(item); + else + _lastChild = item; + item->setPrevious(before); + item->setNext(before->getNext()); + before->setNext(item); + + item->getItem()->setXPosition(item->getItem()->getXPosition() + item->getLag()); + slideDown(item); + } + + std::string Tree::GetLastChild(const std::string &id, const std::string &parentId) + { + TreeItem *child = _lists[id]; + if (!child) + return std::string(id); + std::string parent = parentId; + + if (parentId.empty()) + parent = id; + + while (child->getNext() && hasParent(child->getNext(), parent)) + child = child->getNext(); + return child->getId(); + } + bool Tree::hasParent(TreeItem *child, const std::string &id) + { + TreeItem *par = child->getParent(); + while (par) + { + if (par->getId() == id) + return true; + par = par->getParent(); + } + return false; + } + bool Tree::parentIsPlace(TreeItem *child) + { + for (TreeItem *parent = child->getParent(); parent; parent = parent->getParent()) + if (!parent->getPlace()) + return false; + return true; + } + void Tree::setThumbtails(const std::string &id, const std::string &pic) + { + TreeItem *it = _lists[id]; + + if (!it) + return; + + it->setThumbtails(pic); + } + + void Tree::onItemPushDown(const std::string &id) + { + if (_selected && _selected != _lists[id]) + _selected->onMouseButtonDownItemLeave(); + _selected = _lists[id]; + } + + const std::string Tree::GetSelectedName() + { + if (_selected) + return _selected->getName(); + return ""; + } + const std::string Tree::GetSelectedID() + { + if (_selected) + return _selected->getId(); + return ""; + } + void Tree::close(const std::string &id) + { + TreeItem *item = _lists[id]; + if (!item || id == "root") + return; + if (item->getChilds().empty()) + return; + + item->setPlace(false); + hideTreeItems(id); + QuickGUI::Image * img = item->getImage(); + img->setSkinComponent(".tree.plus"); + img->setSkin(mSkinName, true); + + resize(); + } + + void Tree::open(const std::string &id) + { + TreeItem *item = _lists[id]; + if (!item || id == "root") + return; + if (item->getChilds().empty()) + return; + + item->setPlace(true); + showTreeItems(id); + QuickGUI::Image * img = item->getImage(); + img->setSkinComponent(".tree.minus"); + img->setSkin(mSkinName, true); + resize(); + } + + void Tree::resize() + { + // for resize scrollbar CHANGE IT !!!!! + //getScrollPane()->manageWidgets(); + setSize(getSize()); + } +} // namespace Added: trunk/python-ogre/ThirdParty/quickgui/QuickGUITree.h =================================================================== --- trunk/python-ogre/ThirdParty/quickgui/QuickGUITree.h (rev 0) +++ trunk/python-ogre/ThirdParty/quickgui/QuickGUITree.h 2008-01-15 06:47:21 UTC (rev 542) @@ -0,0 +1,165 @@ +#ifndef QUICKGUITREE_H +#define QUICKGUITREE_H + +#include "OgreStringConverter.h" + +#include "QuickGUIPrerequisites.h" +#include "QuickGUIBorder.h" +#include "QuickGUIButton.h" +#include "QuickGUICheckBox.h" +#include "QuickGUIComboBox.h" +#include "QuickGUIConsole.h" +#include "QuickGUIImage.h" +#include "QuickGUIPanel.h" +#include "QuickGUILabelArea.h" +#include "QuickGUINStateButton.h" +#include "QuickGUIProgressBar.h" +#include "QuickGUIScrollPane.h" +#include "QuickGUIText.h" +#include "QuickGUITextBox.h" +#include "QuickGUIHorizontalTrackBar.h" +#include "QuickGUIVerticalTrackBar.h" +#include "QuickGUIWidget.h" + +#include <iostream> +#include <vector> + +using std::vector; +using std::string; +using std::map; + +namespace QuickGUI +{ + class Tree; + class TreeItem; + + /** Represents an Item in the Tree + @remarks + A Tree Widget can hold a number of TreeItems. + */ + class TreeItem + { + public: + /** Constructor + @param + name The name to be given to the TreeItem . + @param + id The id to be given to the TreeItem (must be unique). + @param + skinName The name of the skin to get graphics from + */ + TreeItem(const string &name,const string &id, const string &skinName, Tree *tree, double iconsize, GUIManager *mGuiManager); + ~TreeItem(); + + double getLag(){ return _lag; } + bool getVisible(){ return _visible; } + bool getPlace(){ return _place; } + TreeItem *getParent(){ return _parent; } + vector<TreeItem *> &getChilds(); + string &getName(){ return _name;} + string &getId(){ return _id;} + MenuLabel * getItem() { return _item; } + Image * getImage(){ return _minus; } + Image * getThumbtails(){ return _thumbtails; } + TreeItem *getPrevious(){ return _previous; } + TreeItem *getNext(){ return _next; } + + + void removeChild(const string &name); + void setYPosition(double y); + void setVisible(bool vis); + void setItem(MenuLabel *item); + void setPrevious(TreeItem *pre){ _previous = pre; } + void setNext(TreeItem * next){ _next = next; } + QuickGUI::Image *addChild(TreeItem *Item); + void setParent(TreeItem *Item){ _parent = Item; } + void setLag(double lag){ _lag = lag; } + void setPlace(bool place){ _place = place; } + void setThumbtails(const string &pic); + void onMouseButtonDownItemLeave(); + private: //effects + + void onMouseClickDouble(const EventArgs& args); + void onMouseButtonDown(const EventArgs& args); + void onMouseEntersItem(const EventArgs& args); + void onMouseLeavesItem(const EventArgs& args); + void onMouseButtonDownItem(const EventArgs& args); + + private: + GUIManager * _guiManager; + QuickGUI::Image *_minus; // - + button + QuickGUI::Image *_thumbtails; + TreeItem *_parent; + vector<TreeItem *> _child; + double _lag; + double _IconSize; + bool _place; + bool _visible; + bool _down; + + /* heritage */ + TreeItem *_next; + TreeItem *_previous; + Tree *_tree; + string mSkinName; + string _id; + string _name; + MenuLabel *_item; + }; + + + /** Represents a Tree View Widget + */ + + class _QuickGUIExport Tree : + public List + { + public: + /** Constructor + @param + name The name to be given to the Tree Widget. + @param + mGUIManager + @param + padding ChildTreeItem's left padding inherited from parent TreeItem. Default value 20 + */ + Tree(const string &name, QuickGUI::GUIManager *mGUIManager, double padding = 20); + + const string addInList(const string &name, const string &text, const string &parent = "root", const string &LoadAfter = ""); + void hideTreeItems(const string &name); + void showTreeItems(const string &name); + + void deleteItem(const string &name); + void addAfterTreeItem(const string &name, TreeItem *item); + string GetLastChild(const string &name, const string &parent = ""); + void setThumbtails(const string &name, const string &pic); + void onItemPushDown(const string &name); + const string GetSelectedName(); + const string GetSelectedID(); + void close(const string &id); + void open(const string &id); + ~Tree(); + + private: + bool hasParent(TreeItem *child, const string &name); + bool parentIsPlace(TreeItem *child); + void slideUp(TreeItem *child); + void slideDown(TreeItem *child); + void deleteChild(TreeItem *me); + string createId(const string& name); + void resize(); + + private: + double _padding; + TreeItem *_selected; + string _name; + string _id; + double _iconSize; + TreeItem *_lastChild; + map<string, TreeItem *> _lists; + QuickGUI::GUIManager *_guiManager; + }; +} + +#endif + Modified: trunk/python-ogre/ThirdParty/quickgui/QuickGUIVertexBuffer.cpp =================================================================== --- trunk/python-ogre/ThirdParty/quickgui/QuickGUIVertexBuffer.cpp 2008-01-13 04:20:34 UTC (rev 541) +++ trunk/python-ogre/ThirdParty/quickgui/QuickGUIVertexBuffer.cpp 2008-01-15 06:47:21 UTC (rev 542) @@ -16,7 +16,6 @@ mRenderSystem = Ogre::Root::getSingleton().getRenderSystem(); mTextureManager = Ogre::TextureManager::getSingletonPtr(); _createVertexBuffer(); - _createIndexBuffer(); // Initialise blending modes to be used. We use these every frame, so we'll set them up now to save time later. mColorBlendMode.blendType = Ogre::LBT_COLOUR; @@ -37,7 +36,6 @@ VertexBuffer::~VertexBuffer() { _destroyVertexBuffer(); - _destroyIndexBuffer(); } void VertexBuffer::_createVertexBuffer() @@ -61,23 +59,6 @@ mRenderOperation.useIndexes = false; } - void VertexBuffer::_createIndexBuffer() - { - mRenderOperation.useIndexes = true; - mRenderOperation.indexData = new Ogre::IndexData(); - mRenderOperation.indexData->indexStart = 0; - - // Create the Index Buffer - size_t indexCount = (mVertexBufferSize / 4) * 6; - - mIndexBuffer = Ogre::HardwareBufferManager::getSingleton( ).createIndexBuffer( - ((mVertexBufferSize > 655534) ? Ogre::HardwareIndexBuffer::IT_32BIT: Ogre::HardwareIndexBuffer::IT_16BIT), - indexCount, - Ogre::HardwareBuffer::HBU_DYNAMIC_WRITE_ONLY_DISCARDABLE, - false); - mRenderOperation.indexData->indexBuffer = mIndexBuffer; - } - void VertexBuffer::_declareVertexStructure() { Ogre::VertexDeclaration* vd = mRenderOperation.vertexData->vertexDeclaration; @@ -113,13 +94,6 @@ mVertexBuffer.setNull(); } - void VertexBuffer::_destroyIndexBuffer() - { - delete mRenderOperation.indexData; - mRenderOperation.indexData = NULL; - mIndexBuffer.setNull(); - } - void VertexBuffer::_initRenderState() { // make sure we're rendering to the correct viewport @@ -145,7 +119,6 @@ // initialise texture settings mRenderSystem->_setTextureCoordCalculation(0, Ogre::TEXCALC_NONE); mRenderSystem->_setTextureCoordSet(0, 0); - //mRenderSystem->_setTextureUnitFiltering(0, Ogre::FO_NONE, Ogre::FO_NONE, Ogre::FO_NONE); mRenderSystem->_setTextureUnitFiltering(0, Ogre::FO_LINEAR, Ogre::FO_LINEAR, Ogre::FO_POINT); mRenderSystem->_setTextureAddressingMode(0, mTextureAddressMode); mRenderSystem->_setTextureMatrix(0, Ogre::Matrix4::IDENTITY); @@ -173,8 +146,7 @@ */ unsigned int quadCounter = 0; - size_t indexOffset = 0; - mRenderOperation.vertexData->vertexStart = 0; + size_t vertexOffset = 0; for(TextureChangeList::iterator materialChangeIt = mMaterialChangeList.begin(); materialChangeIt != mMaterialChangeList.end(); ++materialChangeIt) { @@ -184,9 +156,8 @@ mRenderOperation.vertexData->vertexCount = textureChangeQuadSize * VERTICES_PER_QUAD; - mRenderOperation.indexData->indexStart = indexOffset; - mRenderOperation.indexData->indexCount = textureChangeQuadSize * 6; - indexOffset += mRenderOperation.indexData->indexCount; + mRenderOperation.vertexData->vertexStart = vertexOffset; + vertexOffset += mRenderOperation.vertexData->vertexCount; } // Render @@ -265,10 +236,8 @@ void VertexBuffer::resizeVertexBuffer( const size_t numberOfVertices ) { _destroyVertexBuffer(); - _destroyIndexBuffer(); mVertexBufferSize = numberOfVertices; _createVertexBuffer(); - _createIndexBuffer(); } void VertexBuffer::setData(QuadList* l) @@ -356,46 +325,5 @@ } mVertexBuffer->unlock(); } - - // Fill Index Buffer - { - // Handles 32bits indexes for really loud UI. - if (mIndexBuffer->getType() == Ogre::HardwareIndexBuffer::IT_32BIT) - { - unsigned int* mIndexBufferPtr = (unsigned int*)mIndexBuffer->lock ( Ogre::HardwareVertexBuffer::HBL_DISCARD ); - unsigned int offset = 0; - for (size_t k = 0; k < quadCount; k++) - { - *mIndexBufferPtr++ = offset + 0; - *mIndexBufferPtr++ = offset + 1; - *mIndexBufferPtr++ = offset + 3; - - *mIndexBufferPtr++ = offset + 1; - *mIndexBufferPtr++ = offset + 2; - *mIndexBufferPtr++ = offset + 3; - - offset += 4; - } - mIndexBuffer->unlock(); - } - else - { - unsigned short* mIndexBufferPtr = (unsigned short*)mIndexBuffer->lock ( Ogre::HardwareVertexBuffer::HBL_DISCARD ); - unsigned short offset = 0; - for (size_t k = 0; k < quadCount; k++) - { - *mIndexBufferPtr++ = offset + 0; - *mIndexBufferPtr++ = offset + 1; - *mIndexBufferPtr++ = offset + 3; - - *mIndexBufferPtr++ = offset + 1; - *mIndexBufferPtr++ = offset + 2; - *mIndexBufferPtr++ = offset + 3; - - offset += 4; - } - mIndexBuffer->unlock(); - } - } } } Modified: trunk/python-ogre/ThirdParty/quickgui/QuickGUIVertexBuffer.h =================================================================== --- trunk/python-ogre/ThirdParty/quickgui/QuickGUIVertexBuffer.h 2008-01-13 04:20:34 UTC (rev 541) +++ trunk/python-ogre/ThirdParty/quickgui/QuickGUIVertexBuffer.h 2008-01-15 06:47:21 UTC (rev 542) @@ -63,10 +63,6 @@ Ogre::HardwareVertexBufferSharedPtr mVertexBuffer; size_t mVertexBufferSize; // the maximum number of vertices the buffer can hold. size_t mVertexBufferUsage; // the current number of vertices stored in the buffer. - -#if VERTICES_PER_QUAD == 4 - Ogre::HardwareIndexBufferSharedPtr mIndexBuffer; -#endif // Every RenderSystem::_render(mRenderOperation) constitutes a batch. Ogre::RenderOperation mRenderOperation; @@ -83,7 +79,6 @@ // NOTE: we do not need a _clearVertexBuffer function, since we get new, blank memory when locking with HBL_DISCARD. void _createVertexBuffer(); - void _createIndexBuffer(); /* * Define the size and data types that form a *Vertex*, to be used in the VertexBuffer. @@ -92,8 +87,6 @@ void _declareVertexStructure(); void _destroyVertexBuffer(); void _renderVertexBuffer(); - - void _destroyIndexBuffer(); }; } Modified: trunk/python-ogre/ThirdParty/quickgui/QuickGUIWidget.cpp =================================================================== --- trunk/python-ogre/ThirdParty/quickgui/QuickGUIWidget.cpp 2008-01-13 04:20:34 UTC (rev 541) +++ trunk/python-ogre/ThirdParty/quickgui/QuickGUIWidget.cpp 2008-01-15 06:47:21 UTC (rev 542) @@ -12,6 +12,7 @@ { Widget::Widget(const Ogre::String& name, GUIManager* gm) : mCanResize(false), + mClippingEnabled(true), mClippingWidget(0), mDragXOnly(false), mDragYOnly(false), @@ -440,6 +441,11 @@ mGUIManager->setActiveWidget(this); } + Rect Widget::getActualDimensions() + { + return Rect(getActualPosition(),getActualSize()); + } + Ogre::Real Widget::getActualOpacity() { if((mParentWidget == NULL) || (!mInheritOpacity)) @@ -453,6 +459,16 @@ return getScreenPosition() + getScrollOffset(); } + Size Widget::getActualSize() + { + if( (mParentWidget == NULL) || !mClippingEnabled ) + return mSize; + + Rect r = getDimensions().getIntersection(Rect(mParentWidget->getActualPosition(),mParentWidget->getActualSize())); + + return Size(r.width,r.height); + } + WidgetArray* Widget::getChildWidgetList() { return &mChildWidgets; @@ -494,6 +510,11 @@ return NULL; } + bool Widget::getClippingEnabled() + { + return mClippingEnabled; + } + bool Widget::getGainFocusOnClick() { return mGainFocusOnClick; @@ -1020,12 +1041,15 @@ { if((*it)->getInstanceName() == widgetName) { - WidgetEventArgs args((*it)); - fireEvent(EVENT_CHILD_REMOVED,args); + Widget* w = (*it); (*it)->setQuadContainer(NULL); (*it)->setParent(NULL); mChildWidgets.erase(it); + + WidgetEventArgs args(w); + fireEvent(EVENT_CHILD_REMOVED,args); + return; } } @@ -1048,7 +1072,7 @@ void Widget::removeAndDestroyChild(Widget* w) { - if((w == NULL) || (mGUIManager == NULL) || (std::find(mChildWidgets.begin(),mChildWidgets.end(),w) == mChildWidgets.end())) + if((w == NULL) || (mGUIManager == NULL) || (w->getParentWidget() != this)) return; removeChild(w); @@ -1098,6 +1122,11 @@ } } + void Widget::setClippingEnabled(bool enable) + { + mClippingEnabled = enable; + } + void Widget::setDimensions(const Rect& pixelDimensions) { setPosition(pixelDimensions.x,pixelDimensions.y); Modified: trunk/python-ogre/ThirdParty/quickgui/QuickGUIWidget.h =================================================================== --- trunk/python-ogre/ThirdParty/quickgui/QuickGUIWidget.h 2008-01-13 04:20:34 UTC (rev 541) +++ trunk/python-ogre/ThirdParty/quickgui/QuickGUIWidget.h 2008-01-15 06:47:21 UTC (rev 542) @@ -165,7 +165,7 @@ } void addEventHandler(Event EVENT, MemberFunctionSlot* function); - template<typename T> void addEventListener(Event EVENT, void (T::*function)(const EventArgs&), T* obj) + template<typename T> void addEventListener(void (T::*function)(const EventArgs&), T* obj) { mEventListeners.push_back(new MemberFunctionPointer<T>(function,obj)); } @@ -214,6 +214,7 @@ * Sets focus to the widget by firing an activation event. */ virtual void focus(); + Rect getActualDimensions(); Ogre::Real getActualOpacity(); /** * Returns the position of the widget as it would be drawn on the screen. @@ -221,9 +222,11 @@ * getScreenPosition() + getScrollOffset(). */ Point getActualPosition(); + Size getActualSize(); WidgetArray* getChildWidgetList(); Widget* getChildWidget(const Ogre::String& name); Widget* getChildWidget(Type t, unsigned int index); + bool getClippingEnabled(); Rect getDimensions(); GUIManager* getGUIManager(); int getNumberOfHandlers(Event e); @@ -362,6 +365,7 @@ void removeAndDestroyChild(Widget* w); void removeAndDestroyChild(const Ogre::String& widgetName); bool resizingAllowed(); + void setClippingEnabled(bool enable); /** * Manually set the Dimensions of the widget. */ @@ -486,6 +490,7 @@ // PROPERTIES bool mCanResize; + bool mClippingEnabled; Widget* mClippingWidget; bool mInheritClippingWidget; bool mDragXOnly; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |