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

--HG--
branch : gsoc2012-gui-editor
This commit is contained in:
dfighter1985 2012-08-03 03:13:39 +02:00
parent 3fc262efcf
commit 74cd9b5357
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, 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, 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; }
// 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" )
{
setIdRecurse( stripId( value ) );
return;
}
else
if( name == "active" )
@ -173,6 +174,7 @@ namespace NLGUI
bool b;
if( fromString( value, b ) )
setActive( b );
return;
}
else
if( name == "x" )
@ -180,6 +182,7 @@ namespace NLGUI
sint32 x;
if( fromString( value, x ) )
setX( x );
return;
}
else
if( name == "y" )
@ -187,6 +190,7 @@ namespace NLGUI
sint32 y;
if( fromString( value, y ) )
setY( y );
return;
}
else
if( name == "w" )
@ -194,6 +198,7 @@ namespace NLGUI
sint32 w;
if( fromString( value, w ) )
setW( w );
return;
}
else
if( name == "h" )
@ -201,25 +206,30 @@ namespace NLGUI
sint32 h;
if( fromString( value, h ) )
setH( h );
return;
}
else
if( name == "posref" )
{
convertHotSpotCouple( value.c_str(), _ParentPosRef, _PosRef );
return;
}
else
if( name == "sizeref" )
{
parseSizeRef( value.c_str() );
return;
}
if( name == "posparent" )
{
setPosParent( value );
return;
}
else
if( name == "sizeparent" )
{
setSizeParent( value );
return;
}
else
if( name == "global_color" )
@ -227,6 +237,7 @@ namespace NLGUI
bool b;
if( fromString( value, b ) )
setModulateGlobalColor( b );
return;
}
else
if( name == "render_layer" )
@ -234,6 +245,7 @@ namespace NLGUI
sint8 l;
if( fromString( value, l ) )
setRenderLayer( l );
return;
}
else
if( name == "avoid_resize_parent" )
@ -241,6 +253,7 @@ namespace NLGUI
bool b;
if( fromString( value, b ) )
setAvoidResizeParent( b );
return;
}
else
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 )
return;
disconnect( propertyMgr, SIGNAL( propertyChanged( QtProperty* ) ),
this, SLOT( onPropertyChanged( QtProperty* ) ) );
browser->clear();
CInterfaceElement *e = CWidgetManager::getInstance()->getElementFromId( id );
if( e == NULL )
return;
currentElement = id;
std::string n;
n = typeid( *e ).name();
std::string::size_type i = n.find_last_of( ':' );
@ -71,6 +76,27 @@ namespace GUIEditor
n = n.substr( i + 1, n.size() - 1 );
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 )

View file

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