diff --git a/code/nel/include/nel/gui/group_editbox_decor.h b/code/nel/include/nel/gui/group_editbox_decor.h
new file mode 100644
index 000000000..a2b540608
--- /dev/null
+++ b/code/nel/include/nel/gui/group_editbox_decor.h
@@ -0,0 +1,49 @@
+// Ryzom - MMORPG Framework
+// Copyright (C) 2014 Laszlo Kis-Adam
+// Copyright (C) 2010 Winch Gate Property Limited
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as
+// published by the Free Software Foundation, either version 3 of the
+// License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with this program. If not, see .
+
+#ifndef GROUP_EDITBOX_DECOR
+#define GROUP_EDITBOX_DECOR
+
+#include "nel/gui/group_editbox.h"
+
+namespace NLGUI
+{
+ /// Decorated CGroupEditBox
+ class CGroupEditBoxDecor : public CGroupEditBox
+ {
+ public:
+ DECLARE_UI_CLASS( CGroupEditBoxDecor )
+
+ CGroupEditBoxDecor( const TCtorParam ¶m );
+ ~CGroupEditBoxDecor();
+
+ std::string getProperty( const std::string &name ) const;
+ void setProperty( const std::string &name, const std::string &value );
+ xmlNodePtr serialize( xmlNodePtr parentNode, const char *type ) const;
+ bool parse( xmlNodePtr cur, CInterfaceGroup *parent );
+ void draw();
+ void updateCoords();
+
+ static void forceLink();
+
+ private:
+ class EBDPrivate *_Pvt;
+ };
+}
+
+#endif
+
diff --git a/code/nel/include/nel/gui/interface_element.h b/code/nel/include/nel/gui/interface_element.h
index c1f6d20e7..e2f9ffc87 100644
--- a/code/nel/include/nel/gui/interface_element.h
+++ b/code/nel/include/nel/gui/interface_element.h
@@ -117,6 +117,7 @@ namespace NLGUI
editorSelected = false;
serializable = true;
+ _EditorSelectable = true;
}
// dtor
@@ -531,9 +532,16 @@ namespace NLGUI
/// Aligns the element to the other element specified
void alignTo( CInterfaceElement *other );
+ /// Specifies if the widget can be selected in the editor
+ void setEditorSelectable( bool b ){ _EditorSelectable = b; }
+
+ /// Tells if the widget can be selected in the editor
+ bool isEditorSelectable() const{ return _EditorSelectable; }
+
protected:
bool editorSelected;
+ bool _EditorSelectable;
static bool editorMode;
diff --git a/code/nel/src/gui/group_editbox.cpp b/code/nel/src/gui/group_editbox.cpp
index 92ae46703..8c8ae867c 100644
--- a/code/nel/src/gui/group_editbox.cpp
+++ b/code/nel/src/gui/group_editbox.cpp
@@ -1548,13 +1548,17 @@ namespace NLGUI
{
_ViewText->setParent( this );
_ViewText->setIdRecurse( "edit_text" );
- _ViewText->setHardText( "sometext" );
+ _ViewText->setHardText( "" );
_ViewText->setPosRef( Hotspot_TL );
_ViewText->setParentPosRef( Hotspot_TL );
addView( _ViewText );
+
+ sint32 w,h;
+ w = std::max( sint32( _ViewText->getFontWidth() * _ViewText->getText().size() ), getW() );
+ h = std::max( sint32( _ViewText->getFontHeight() ), getH() );
- setH( _ViewText->getFontHeight() );
- setW( _ViewText->getFontWidth() * _ViewText->getText().size() );
+ setH( h );
+ setW( w );
}
else
@@ -1562,6 +1566,8 @@ namespace NLGUI
}
}
+ _ViewText->setEditorSelectable( false );
+
// For MultiLine editbox, clip the end space, else weird when edit space at end of line (nothing happens)
if(_ViewText)
_ViewText->setMultiLineClipEndSpace(true);
diff --git a/code/nel/src/gui/group_editbox_decor.cpp b/code/nel/src/gui/group_editbox_decor.cpp
new file mode 100644
index 000000000..50241789e
--- /dev/null
+++ b/code/nel/src/gui/group_editbox_decor.cpp
@@ -0,0 +1,357 @@
+// Ryzom - MMORPG Framework
+// Copyright (C) 2014 Laszlo Kis-Adam
+// Copyright (C) 2010 Winch Gate Property Limited
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as
+// published by the Free Software Foundation, either version 3 of the
+// License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with this program. If not, see .
+
+#include "stdpch.h"
+#include "nel/gui/group_editbox_decor.h"
+#include "nel/gui/view_bitmap.h"
+
+namespace NLGUI
+{
+ class EBDPrivate
+ {
+ public:
+ enum Textures
+ {
+ BG,
+ L,
+ R,
+ TM,
+ BM,
+ TL,
+ TR,
+ BL,
+ BR,
+ TCOUNT
+ };
+
+ EBDPrivate()
+ {
+ for( int i = 0; i < TCOUNT; i++ )
+ {
+ _Textures.push_back( new CViewBitmap( CViewBase::TCtorParam() ) );
+ }
+ }
+
+ ~EBDPrivate()
+ {
+ for( int i = 0; i < _Textures.size(); i++ )
+ delete _Textures[ i ];
+ _Textures.clear();
+ }
+
+ void draw()
+ {
+ for( int i = 0; i < _Textures.size(); i++ )
+ {
+ CViewBitmap *bm = _Textures[ i ];
+ bm->draw();
+ }
+ }
+
+ void updateCoords()
+ {
+ for( int i = 0; i < _Textures.size(); i++ )
+ {
+ CViewBitmap *bm = _Textures[ i ];
+ bm->fitTexture();
+ }
+
+ // W and H parameters depend on the sizes of the other textures
+ // Negative sizes mean that the sizes are that much smaller than the parent
+ sint32 w,h;
+ h = _Textures[ TL ]->getHReal() + _Textures[ BL ]->getHReal();
+ h *= -1;
+ _Textures[ L ]->setH( h );
+
+ h = _Textures[ TR ]->getHReal() + _Textures[ BR ]->getHReal();
+ h *= -1;
+ _Textures[ R ]->setH( h );
+
+ w = _Textures[ TL ]->getWReal() + _Textures[ TR ]->getWReal();
+ w *= -1;
+ _Textures[ TM ]->setW( w );
+
+ w = _Textures[ BL ]->getWReal() + _Textures[ BR ]->getWReal();
+ w *= -1;
+ _Textures[ BM ]->setW( w );
+
+ h = _Textures[ TM ]->getHReal() + _Textures[ BM ]->getHReal();
+ h *= -1;
+ w = _Textures[ L ]->getWReal() + _Textures[ R ]->getWReal();
+ w *= -1;
+ _Textures[ BG ]->setW( w );
+ _Textures[ BG ]->setH( h );
+
+ for( int i = 0; i < _Textures.size(); i++ )
+ {
+ CViewBitmap *bm = _Textures[ i ];
+ bm->updateCoords();
+ }
+ }
+
+ void setup( CInterfaceGroup *parent )
+ {
+ for( int i = 0; i < _Textures.size(); i++ )
+ {
+ CViewBitmap *bm = _Textures[ i ];
+ bm->setParent( parent );
+ bm->setParentPos( parent );
+ bm->setParentSize( parent );
+ bm->setEditorSelectable( false );
+ }
+
+ _Textures[ TL ]->setPosRef( Hotspot_TL );
+ _Textures[ TL ]->setParentPosRef( Hotspot_TL );
+
+ _Textures[ TM ]->setPosRef( Hotspot_TM );
+ _Textures[ TM ]->setParentPosRef( Hotspot_TM );
+ _Textures[ TM ]->setScale( true );
+ _Textures[ TM ]->setSizeRef( "w" );
+
+ _Textures[ TR ]->setPosRef( Hotspot_TR );
+ _Textures[ TR ]->setParentPosRef( Hotspot_TR );
+
+ _Textures[ BL ]->setPosRef( Hotspot_BL );
+ _Textures[ BL ]->setParentPosRef( Hotspot_BL );
+
+ _Textures[ BM ]->setPosRef( Hotspot_BM );
+ _Textures[ BM ]->setParentPosRef( Hotspot_BM );
+ _Textures[ BM ]->setScale( true );
+ _Textures[ BM ]->setSizeRef( "w" );
+
+ _Textures[ BR ]->setPosRef( Hotspot_BR );
+ _Textures[ BR ]->setParentPosRef( Hotspot_BR );
+
+ _Textures[ L ]->setPosRef( Hotspot_ML );
+ _Textures[ L ]->setParentPosRef( Hotspot_ML );
+ _Textures[ L ]->setScale( true );
+ _Textures[ L ]->setSizeRef( "h" );
+
+ _Textures[ R ]->setPosRef( Hotspot_MR );
+ _Textures[ R ]->setParentPosRef( Hotspot_MR );
+ _Textures[ R ]->setScale( true );
+ _Textures[ R ]->setSizeRef( "h" );
+
+ _Textures[ BG ]->setPosRef( Hotspot_MM );
+ _Textures[ BG ]->setParentPosRef( Hotspot_MM );
+ _Textures[ BG ]->setScale( true );
+ _Textures[ BG ]->setSizeRef( "wh" );
+ _Textures[ BG ]->setRenderLayer( -1 );
+ }
+
+ std::vector< CViewBitmap* > _Textures;
+ };
+
+ NLMISC_REGISTER_OBJECT( CViewBase, CGroupEditBoxDecor, std::string, "edit_box_decor" );
+
+ CGroupEditBoxDecor::CGroupEditBoxDecor( const TCtorParam ¶m ) :
+ CGroupEditBox( param )
+ {
+ _Pvt = new EBDPrivate();
+ _Pvt->setup( this );
+ }
+
+ CGroupEditBoxDecor::~CGroupEditBoxDecor()
+ {
+ delete _Pvt;
+ _Pvt = NULL;
+ }
+
+ std::string CGroupEditBoxDecor::getProperty( const std::string &name ) const
+ {
+ if( name == "tx_tl" )
+ {
+ return _Pvt->_Textures[ EBDPrivate::TL ]->getTexture();
+ }
+ else
+ if( name == "tx_tm" )
+ {
+ return _Pvt->_Textures[ EBDPrivate::TM ]->getTexture();
+ }
+ else
+ if( name == "tx_tr" )
+ {
+ return _Pvt->_Textures[ EBDPrivate::TR ]->getTexture();
+ }
+ else
+ if( name == "tx_bl" )
+ {
+ return _Pvt->_Textures[ EBDPrivate::BL ]->getTexture();
+ }
+ else
+ if( name == "tx_bm" )
+ {
+ return _Pvt->_Textures[ EBDPrivate::BM ]->getTexture();
+ }
+ else
+ if( name == "tx_br" )
+ {
+ return _Pvt->_Textures[ EBDPrivate::BR ]->getTexture();
+ }
+ else
+ if( name == "tx_l" )
+ {
+ return _Pvt->_Textures[ EBDPrivate::L ]->getTexture();
+ }
+ else
+ if( name == "tx_r" )
+ {
+ return _Pvt->_Textures[ EBDPrivate::R ]->getTexture();
+ }
+ else
+ if( name == "tx_bg" )
+ {
+ return _Pvt->_Textures[ EBDPrivate::BG ]->getTexture();
+ }
+ else
+ return CGroupEditBox::getProperty( name );
+ }
+
+ void CGroupEditBoxDecor::setProperty( const std::string &name, const std::string &value )
+ {
+ if( name == "tx_tl" )
+ {
+ _Pvt->_Textures[ EBDPrivate::TL ]->setTexture( value );
+ }
+ else
+ if( name == "tx_tm" )
+ {
+ _Pvt->_Textures[ EBDPrivate::TM ]->setTexture( value );
+ }
+ else
+ if( name == "tx_tr" )
+ {
+ _Pvt->_Textures[ EBDPrivate::TR ]->setTexture( value );
+ }
+ else
+ if( name == "tx_bl" )
+ {
+ _Pvt->_Textures[ EBDPrivate::BL ]->setTexture( value );
+ }
+ else
+ if( name == "tx_bm" )
+ {
+ _Pvt->_Textures[ EBDPrivate::BM ]->setTexture( value );
+ }
+ else
+ if( name == "tx_br" )
+ {
+ _Pvt->_Textures[ EBDPrivate::BR ]->setTexture( value );
+ }
+ else
+ if( name == "tx_l" )
+ {
+ _Pvt->_Textures[ EBDPrivate::L ]->setTexture( value );
+ }
+ else
+ if( name == "tx_r" )
+ {
+ _Pvt->_Textures[ EBDPrivate::R ]->setTexture( value );
+ }
+ else
+ if( name == "tx_bg" )
+ {
+ _Pvt->_Textures[ EBDPrivate::BG ]->setTexture( value );
+ }
+ else
+ CGroupEditBox::setProperty( name, value );
+ }
+
+ xmlNodePtr CGroupEditBoxDecor::serialize( xmlNodePtr parentNode, const char *type ) const
+ {
+ xmlNodePtr node = CGroupEditBox::serialize( parentNode, type );
+ if( node == NULL )
+ return NULL;
+
+ xmlSetProp( node, BAD_CAST "tx_tl", BAD_CAST _Pvt->_Textures[ EBDPrivate::TL ]->getTexture().c_str() );
+ xmlSetProp( node, BAD_CAST "tx_tr", BAD_CAST _Pvt->_Textures[ EBDPrivate::TM ]->getTexture().c_str() );
+ xmlSetProp( node, BAD_CAST "tx_tm", BAD_CAST _Pvt->_Textures[ EBDPrivate::TR ]->getTexture().c_str() );
+ xmlSetProp( node, BAD_CAST "tx_bl", BAD_CAST _Pvt->_Textures[ EBDPrivate::BL ]->getTexture().c_str() );
+ xmlSetProp( node, BAD_CAST "tx_bm", BAD_CAST _Pvt->_Textures[ EBDPrivate::BM ]->getTexture().c_str() );
+ xmlSetProp( node, BAD_CAST "tx_br", BAD_CAST _Pvt->_Textures[ EBDPrivate::BR ]->getTexture().c_str() );
+ xmlSetProp( node, BAD_CAST "tx_l", BAD_CAST _Pvt->_Textures[ EBDPrivate::L ]->getTexture().c_str() );
+ xmlSetProp( node, BAD_CAST "tx_r", BAD_CAST _Pvt->_Textures[ EBDPrivate::R ]->getTexture().c_str() );
+ xmlSetProp( node, BAD_CAST "tx_bg", BAD_CAST _Pvt->_Textures[ EBDPrivate::BG ]->getTexture().c_str() );
+
+ return node;
+ }
+
+ bool CGroupEditBoxDecor::parse( xmlNodePtr cur, CInterfaceGroup *parent )
+ {
+ if( !CGroupEditBox::parse( cur, parent ) )
+ return false;
+
+ CXMLAutoPtr prop;
+
+ prop = ( char* ) xmlGetProp( cur, BAD_CAST "tx_tl" );
+ if( prop )
+ _Pvt->_Textures[ EBDPrivate::TL ]->setTexture( ( const char* )prop );
+
+ prop = ( char* ) xmlGetProp( cur, BAD_CAST "tx_tm" );
+ if( prop )
+ _Pvt->_Textures[ EBDPrivate::TM ]->setTexture( ( const char* )prop );
+
+ prop = ( char* ) xmlGetProp( cur, BAD_CAST "tx_tr" );
+ if( prop )
+ _Pvt->_Textures[ EBDPrivate::TR ]->setTexture( ( const char* )prop );
+
+ prop = ( char* ) xmlGetProp( cur, BAD_CAST "tx_bl" );
+ if( prop )
+ _Pvt->_Textures[ EBDPrivate::BL ]->setTexture( ( const char* )prop );
+
+ prop = ( char* ) xmlGetProp( cur, BAD_CAST "tx_bm" );
+ if( prop )
+ _Pvt->_Textures[ EBDPrivate::BM ]->setTexture( ( const char* )prop );
+
+ prop = ( char* ) xmlGetProp( cur, BAD_CAST "tx_br" );
+ if( prop )
+ _Pvt->_Textures[ EBDPrivate::BR ]->setTexture( ( const char* )prop );
+
+ prop = ( char* ) xmlGetProp( cur, BAD_CAST "tx_l" );
+ if( prop )
+ _Pvt->_Textures[ EBDPrivate::L ]->setTexture( ( const char* )prop );
+
+ prop = ( char* ) xmlGetProp( cur, BAD_CAST "tx_r" );
+ if( prop )
+ _Pvt->_Textures[ EBDPrivate::R ]->setTexture( ( const char* )prop );
+
+ prop = ( char* ) xmlGetProp( cur, BAD_CAST "tx_bg" );
+ if( prop )
+ _Pvt->_Textures[ EBDPrivate::BG ]->setTexture( ( const char* )prop );
+
+ return true;
+ }
+
+ void CGroupEditBoxDecor::draw()
+ {
+ CGroupEditBox::draw();
+
+ _Pvt->draw();
+ }
+
+ void CGroupEditBoxDecor::updateCoords()
+ {
+ CGroupEditBox::updateCoords();
+ _Pvt->updateCoords();
+ }
+
+ void CGroupEditBoxDecor::forceLink()
+ {
+ }
+}
+
+
diff --git a/code/nel/src/gui/link_hack.cpp b/code/nel/src/gui/link_hack.cpp
index 06a8c23e8..3ecc6fb0a 100644
--- a/code/nel/src/gui/link_hack.cpp
+++ b/code/nel/src/gui/link_hack.cpp
@@ -20,6 +20,7 @@
#include "nel/gui/dbview_number.h"
#include "nel/gui/dbview_quantity.h"
#include "nel/gui/view_pointer.h"
+#include "nel/gui/group_editbox_decor.h"
namespace NLGUI
{
@@ -39,5 +40,6 @@ namespace NLGUI
force_link_dbgroup_select_number_cpp();
force_link_dbgroup_combo_box_cpp();
force_link_group_wheel_cpp();
+ CGroupEditBoxDecor::forceLink();
}
}
\ No newline at end of file
diff --git a/code/nel/src/gui/widget_manager.cpp b/code/nel/src/gui/widget_manager.cpp
index 81fbaf28b..4591d7554 100644
--- a/code/nel/src/gui/widget_manager.cpp
+++ b/code/nel/src/gui/widget_manager.cpp
@@ -2436,6 +2436,9 @@ namespace NLGUI
CCtrlBase *ctrl= _CtrlsUnderPointer[i];
if (ctrl && ctrl->isCapturable() && ctrl->isInGroup( pNewCurrentWnd ) )
{
+ if( CInterfaceElement::getEditorMode() && !ctrl->isEditorSelectable() )
+ continue;
+
uint d = ctrl->getDepth( pNewCurrentWnd );
if (d > nMaxDepth)
{
@@ -2454,6 +2457,9 @@ namespace NLGUI
CViewBase *v = _ViewsUnderPointer[i];
if( ( v != NULL ) && v->isInGroup( pNewCurrentWnd ) )
{
+ if( CInterfaceElement::getEditorMode() && !v->isEditorSelectable() )
+ continue;
+
_CapturedView = v;
captured = true;
break;
diff --git a/code/studio/src/plugins/gui_editor/widget_info_tree_node.h b/code/studio/src/plugins/gui_editor/widget_info_tree_node.h
index 0de9e6977..8aefe6f0f 100644
--- a/code/studio/src/plugins/gui_editor/widget_info_tree_node.h
+++ b/code/studio/src/plugins/gui_editor/widget_info_tree_node.h
@@ -75,6 +75,10 @@ namespace GUIEditor
// copy the properties to the child, since they inherit them
for( std::vector< SPropEntry >::const_iterator itr = this->info.props.begin(); itr != this->info.props.end(); ++itr )
{
+ // Don't add property if already exists, since it's an override.
+ if( node->hasProperty( itr->propName ) )
+ continue;
+
node->addProperty( *itr );
}
}
diff --git a/code/studio/src/plugins/gui_editor/widgets/GroupEditBoxDecor.xml b/code/studio/src/plugins/gui_editor/widgets/GroupEditBoxDecor.xml
new file mode 100644
index 000000000..67865e707
--- /dev/null
+++ b/code/studio/src/plugins/gui_editor/widgets/GroupEditBoxDecor.xml
@@ -0,0 +1,68 @@
+
+
+ GroupEditBoxDecor
+ CGroupEditBoxDecor
+ edit_box_decor
+ GroupEditBox
+
+ false
+
+
+
+
+ w
+ int
+ 150
+
+
+ h
+ int
+ 25
+
+
+ tx_tl
+ texture
+ log_eb_tl.tga
+
+
+ tx_tm
+ texture
+ log_eb_t.tga
+
+
+ tx_tr
+ texture
+ log_eb_tr.tga
+
+
+ tx_bl
+ texture
+ log_eb_bl.tga
+
+
+ tx_bm
+ texture
+ log_eb_b.tga
+
+
+ tx_br
+ texture
+ log_eb_br.tga
+
+
+ tx_l
+ texture
+ log_eb_l.tga
+
+
+ tx_r
+ texture
+ log_eb_r.tga
+
+
+ tx_bg
+ texture
+ log_eb_m.tga
+
+
+