diff --git a/code/nel/include/nel/misc/string_common.h b/code/nel/include/nel/misc/string_common.h index b7adecf0f..4a455247d 100644 --- a/code/nel/include/nel/misc/string_common.h +++ b/code/nel/include/nel/misc/string_common.h @@ -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 diff --git a/code/nel/src/gui/interface_element.cpp b/code/nel/src/gui/interface_element.cpp index 51dbf392f..8660ce080 100644 --- a/code/nel/src/gui/interface_element.cpp +++ b/code/nel/src/gui/interface_element.cpp @@ -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() ); diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/gui_editor/property_browser_ctrl.cpp b/code/nel/tools/3d/object_viewer_qt/src/plugins/gui_editor/property_browser_ctrl.cpp index 4d4ed02f3..223837a9b 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/gui_editor/property_browser_ctrl.cpp +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/gui_editor/property_browser_ctrl.cpp @@ -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 ) diff --git a/code/nel/tools/3d/object_viewer_qt/src/plugins/gui_editor/property_browser_ctrl.h b/code/nel/tools/3d/object_viewer_qt/src/plugins/gui_editor/property_browser_ctrl.h index 90b719138..5e4747cdc 100644 --- a/code/nel/tools/3d/object_viewer_qt/src/plugins/gui_editor/property_browser_ctrl.h +++ b/code/nel/tools/3d/object_viewer_qt/src/plugins/gui_editor/property_browser_ctrl.h @@ -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; }; }