CHANGED: #1471 The property browser widget can now actually change properties.

This commit is contained in:
dfighter1985 2012-08-03 03:13:39 +02:00
parent 607a3f188a
commit d562a50ceb
4 changed files with 72 additions and 1 deletions

View file

@ -237,7 +237,33 @@ inline bool fromString(const std::string &str, uint64 &val) { bool ret = sscanf(
inline bool fromString(const std::string &str, sint64 &val) { bool ret = sscanf(str.c_str(), "%"NL_I64"d", &val) == 1; if (!ret) val = 0; return ret; } inline bool fromString(const std::string &str, sint64 &val) { bool ret = sscanf(str.c_str(), "%"NL_I64"d", &val) == 1; if (!ret) val = 0; return ret; }
inline bool fromString(const std::string &str, float &val) { bool ret = sscanf(str.c_str(), "%f", &val) == 1; if (!ret) val = 0.0f; return ret; } inline bool fromString(const std::string &str, float &val) { bool ret = sscanf(str.c_str(), "%f", &val) == 1; if (!ret) val = 0.0f; return ret; }
inline bool fromString(const std::string &str, double &val) { bool ret = sscanf(str.c_str(), "%lf", &val) == 1; if (!ret) val = 0.0; return ret; } inline bool fromString(const std::string &str, double &val) { bool ret = sscanf(str.c_str(), "%lf", &val) == 1; if (!ret) val = 0.0; return ret; }
inline bool fromString(const std::string &str, bool &val) { val = (str.length() == 1) && str[0] != '0'; return (str.length() == 1) && (str[0] == '0' || str[0] == '1'); }
inline bool fromString(const std::string &str, bool &val)
{
if( str.length() == 1 )
{
if( str[ 0 ] == '1' )
val = true;
else
if( str[ 0 ] == '0' )
val = false;
else
return false;
}
else
{
if( str == "true" )
val = true;
else
if( str == "false" )
val = false;
else
return false;
}
return true;
}
inline bool fromString(const std::string &str, std::string &val) { val = str; return true; } inline bool fromString(const std::string &str, std::string &val) { val = str; return true; }
// stl vectors of bool use bit reference and not real bools, so define the operator for bit reference // stl vectors of bool use bit reference and not real bools, so define the operator for bit reference

View file

@ -166,6 +166,7 @@ namespace NLGUI
if( name == "id" ) if( name == "id" )
{ {
setIdRecurse( stripId( value ) ); setIdRecurse( stripId( value ) );
return;
} }
else else
if( name == "active" ) if( name == "active" )
@ -173,6 +174,7 @@ namespace NLGUI
bool b; bool b;
if( fromString( value, b ) ) if( fromString( value, b ) )
setActive( b ); setActive( b );
return;
} }
else else
if( name == "x" ) if( name == "x" )
@ -180,6 +182,7 @@ namespace NLGUI
sint32 x; sint32 x;
if( fromString( value, x ) ) if( fromString( value, x ) )
setX( x ); setX( x );
return;
} }
else else
if( name == "y" ) if( name == "y" )
@ -187,6 +190,7 @@ namespace NLGUI
sint32 y; sint32 y;
if( fromString( value, y ) ) if( fromString( value, y ) )
setY( y ); setY( y );
return;
} }
else else
if( name == "w" ) if( name == "w" )
@ -194,6 +198,7 @@ namespace NLGUI
sint32 w; sint32 w;
if( fromString( value, w ) ) if( fromString( value, w ) )
setW( w ); setW( w );
return;
} }
else else
if( name == "h" ) if( name == "h" )
@ -201,25 +206,30 @@ namespace NLGUI
sint32 h; sint32 h;
if( fromString( value, h ) ) if( fromString( value, h ) )
setH( h ); setH( h );
return;
} }
else else
if( name == "posref" ) if( name == "posref" )
{ {
convertHotSpotCouple( value.c_str(), _ParentPosRef, _PosRef ); convertHotSpotCouple( value.c_str(), _ParentPosRef, _PosRef );
return;
} }
else else
if( name == "sizeref" ) if( name == "sizeref" )
{ {
parseSizeRef( value.c_str() ); parseSizeRef( value.c_str() );
return;
} }
if( name == "posparent" ) if( name == "posparent" )
{ {
setPosParent( value ); setPosParent( value );
return;
} }
else else
if( name == "sizeparent" ) if( name == "sizeparent" )
{ {
setSizeParent( value ); setSizeParent( value );
return;
} }
else else
if( name == "global_color" ) if( name == "global_color" )
@ -227,6 +237,7 @@ namespace NLGUI
bool b; bool b;
if( fromString( value, b ) ) if( fromString( value, b ) )
setModulateGlobalColor( b ); setModulateGlobalColor( b );
return;
} }
else else
if( name == "render_layer" ) if( name == "render_layer" )
@ -234,6 +245,7 @@ namespace NLGUI
sint8 l; sint8 l;
if( fromString( value, l ) ) if( fromString( value, l ) )
setRenderLayer( l ); setRenderLayer( l );
return;
} }
else else
if( name == "avoid_resize_parent" ) if( name == "avoid_resize_parent" )
@ -241,6 +253,7 @@ namespace NLGUI
bool b; bool b;
if( fromString( value, b ) ) if( fromString( value, b ) )
setAvoidResizeParent( b ); setAvoidResizeParent( b );
return;
} }
else else
nlwarning( "Tried to set invalid property '%s' for widget '%s'", name.c_str(), _Id.c_str() ); nlwarning( "Tried to set invalid property '%s' for widget '%s'", name.c_str(), _Id.c_str() );

View file

@ -58,12 +58,17 @@ namespace GUIEditor
{ {
if( browser == NULL ) if( browser == NULL )
return; return;
disconnect( propertyMgr, SIGNAL( propertyChanged( QtProperty* ) ),
this, SLOT( onPropertyChanged( QtProperty* ) ) );
browser->clear(); browser->clear();
CInterfaceElement *e = CWidgetManager::getInstance()->getElementFromId( id ); CInterfaceElement *e = CWidgetManager::getInstance()->getElementFromId( id );
if( e == NULL ) if( e == NULL )
return; return;
currentElement = id;
std::string n; std::string n;
n = typeid( *e ).name(); n = typeid( *e ).name();
std::string::size_type i = n.find_last_of( ':' ); std::string::size_type i = n.find_last_of( ':' );
@ -71,6 +76,27 @@ namespace GUIEditor
n = n.substr( i + 1, n.size() - 1 ); n = n.substr( i + 1, n.size() - 1 );
setupProperties( n, e ); setupProperties( n, e );
connect( propertyMgr, SIGNAL( propertyChanged( QtProperty* ) ),
this, SLOT( onPropertyChanged( QtProperty* ) ) );
}
void CPropBrowserCtrl::onPropertyChanged( QtProperty *prop )
{
QString propName = prop->propertyName();
QString propValue = prop->valueText();
// for some reason booleans cannot be extracted from a QtProperty :(
if( propValue.isEmpty() )
{
QtVariantProperty *p = propertyMgr->variantProperty( prop );
if( p != NULL )
propValue = p->value().toString();
}
CInterfaceElement *e = CWidgetManager::getInstance()->getElementFromId( currentElement );
if( e == NULL )
return;
e->setProperty( propName.toStdString(), propValue.toStdString() );
} }
void CPropBrowserCtrl::setupProperties( const std::string &type, const CInterfaceElement *element ) void CPropBrowserCtrl::setupProperties( const std::string &type, const CInterfaceElement *element )

View file

@ -25,6 +25,7 @@
class QtTreePropertyBrowser; class QtTreePropertyBrowser;
class QtVariantPropertyManager; class QtVariantPropertyManager;
class QtProperty;
namespace NLGUI namespace NLGUI
{ {
@ -49,6 +50,9 @@ namespace GUIEditor
public Q_SLOTS: public Q_SLOTS:
void onSelectionChanged( std::string &id ); void onSelectionChanged( std::string &id );
private Q_SLOTS:
void onPropertyChanged( QtProperty *prop );
private: private:
void setupProperties( const std::string &type, const NLGUI::CInterfaceElement *element ); void setupProperties( const std::string &type, const NLGUI::CInterfaceElement *element );
void setupProperty( const SPropEntry &prop, const NLGUI::CInterfaceElement *element ); void setupProperty( const SPropEntry &prop, const NLGUI::CInterfaceElement *element );
@ -56,6 +60,8 @@ namespace GUIEditor
QtTreePropertyBrowser *browser; QtTreePropertyBrowser *browser;
QtVariantPropertyManager *propertyMgr; QtVariantPropertyManager *propertyMgr;
std::map< std::string, SWidgetInfo > widgetInfo; std::map< std::string, SWidgetInfo > widgetInfo;
std::string currentElement;
}; };
} }