From Sergey Leontyev, "1. In StyleManager
when applying styles to a Label element the code below runs in a infinite loop. The reason for this is that nothing increments the Reader "r" in the case when applying a style to label, so I advance the reader when no match was found. ( To replicate the error apply style to any label) replaced this: while(!r.eof()) if(_styles[style]->applyStyle(t, r)) inc = true; with this: while(!r.eof()) { if(_styles[style]->applyStyle(t, r)) inc = true; else r.advanceOverCurrentFieldOrBlock(); } I tested it and it works well for me, I did not find any problems with it. 2. Added style support for Canvas element, event though there is no styles to apply yet. It is usefull for someone who inherits from Canvas class to develop another element. If applyStyle(Canvas) does not exist there is no way to apply style to the element that inherited from Canvas element. Added virtual bool applyStyle(Canvas). and in added call to apply style if the Object is of type Canvas: StyleManager::_applyStyleToObject(osg::Object* obj, const std::string& style) { ... else if(!std::string("Canvas").compare(c)) return _coerceAndApply<Canvas>(obj,style,c); "
This commit is contained in:
parent
0b39044666
commit
8ecf508fda
@ -22,6 +22,7 @@
|
||||
#include <osgWidget/Box>
|
||||
#include <osgWidget/Frame>
|
||||
#include <osgWidget/Input>
|
||||
#include <osgWidget/Canvas>
|
||||
|
||||
namespace osgWidget {
|
||||
|
||||
@ -44,6 +45,9 @@ class OSGWIDGET_EXPORT Style: public osg::Object
|
||||
virtual bool applyStyle (Box*, Reader);
|
||||
virtual bool applyStyle (Frame::Corner*, Reader);
|
||||
virtual bool applyStyle (Frame::Border*, Reader);
|
||||
virtual bool applyStyle (Canvas*, Reader);
|
||||
|
||||
|
||||
|
||||
void setStyle(const std::string& style) {
|
||||
_style = style;
|
||||
@ -104,7 +108,8 @@ class OSGWIDGET_EXPORT StyleManager: public osg::Object
|
||||
Styles _styles;
|
||||
|
||||
template<typename T>
|
||||
bool _applySpecificStyle(T* t, const std::string& style) {
|
||||
bool _applySpecificStyle(T* t, const std::string& style)
|
||||
{
|
||||
osgDB::FieldReaderIterator r;
|
||||
|
||||
std::istringstream input(_styles[style]->getStyle());
|
||||
@ -113,7 +118,15 @@ class OSGWIDGET_EXPORT StyleManager: public osg::Object
|
||||
|
||||
bool inc = false;
|
||||
|
||||
while(!r.eof()) if(_styles[style]->applyStyle(t, r)) inc = true;
|
||||
while(!r.eof())
|
||||
{
|
||||
if(_styles[style]->applyStyle(t, r))
|
||||
inc = true;
|
||||
else
|
||||
r.advanceOverCurrentFieldOrBlock();
|
||||
}
|
||||
|
||||
|
||||
|
||||
return inc;
|
||||
}
|
||||
|
@ -218,6 +218,11 @@ bool Style::applyStyle(Window* window, Reader r) {
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Style::applyStyle(Canvas* label, Reader r) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
bool Style::applyStyle(Window::EmbeddedWindow*, Reader r) {
|
||||
return false;
|
||||
}
|
||||
@ -353,6 +358,12 @@ bool StyleManager::_applyStyleToObject(osg::Object* obj, const std::string& styl
|
||||
style,
|
||||
c
|
||||
);
|
||||
else if(!std::string("Canvas").compare(c)) return _coerceAndApply<Canvas>(
|
||||
obj,
|
||||
style,
|
||||
c
|
||||
);
|
||||
|
||||
|
||||
else warn()
|
||||
<< "StyleManager does not support coercion of objects of type "
|
||||
|
Loading…
Reference in New Issue
Block a user