diff --git a/code/studio/src/plugins/gui_editor/CMakeLists.txt b/code/studio/src/plugins/gui_editor/CMakeLists.txt
index 31d83ae83..f95e6c0a7 100644
--- a/code/studio/src/plugins/gui_editor/CMakeLists.txt
+++ b/code/studio/src/plugins/gui_editor/CMakeLists.txt
@@ -32,6 +32,7 @@ SET(OVQT_PLUGIN_GUI_EDITOR_HDR
editor_message_processor.h
action_list.h
texture_chooser.h
+ action_property_manager.h
)
SET(OVQT_PLUGIN_GUI_EDITOR_UIS
diff --git a/code/studio/src/plugins/gui_editor/action_property_manager.cpp b/code/studio/src/plugins/gui_editor/action_property_manager.cpp
new file mode 100644
index 000000000..9e7690a56
--- /dev/null
+++ b/code/studio/src/plugins/gui_editor/action_property_manager.cpp
@@ -0,0 +1,333 @@
+// Ryzom Core Studio GUI Editor plugin
+// 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 "action_property_manager.h"
+#include "action_list.h"
+#include
+#include
+#include
+#include
+#include
+
+
+////////////////////////////////////////////////////////////////// Manager ///////////////////////////////////////////////////////////////////////////
+
+
+struct ActionPropertyManagerPrivate
+{
+ QMap< const QtProperty*, QString > values;
+};
+
+ActionPropertyManager::ActionPropertyManager( QObject *parent ) :
+QtAbstractPropertyManager( parent )
+{
+ d_ptr = new ActionPropertyManagerPrivate();
+}
+
+ActionPropertyManager::~ActionPropertyManager()
+{
+ delete d_ptr;
+ d_ptr = NULL;
+}
+
+QString ActionPropertyManager::value( const QtProperty *p ) const
+{
+ return valueText( p );
+}
+
+void ActionPropertyManager::setValue( QtProperty *p, const QString &value )
+{
+ if( !d_ptr->values.contains( p ) )
+ return;
+
+ if( d_ptr->values[ p ] == value )
+ return;
+
+ d_ptr->values[ p ] = value;
+
+ Q_EMIT propertyChanged( p );
+ Q_EMIT valueChanged( p, value );
+}
+
+bool ActionPropertyManager::hasValue( const QtProperty *p ) const
+{
+ return d_ptr->values.contains( p );
+}
+
+QString ActionPropertyManager::valueText( const QtProperty *p ) const
+{
+ if( !d_ptr->values.contains( p ) )
+ return "";
+
+ return d_ptr->values[ p ];
+}
+
+void ActionPropertyManager::initializeProperty( QtProperty *p )
+{
+ if( d_ptr->values.contains( p ) )
+ return;
+
+ d_ptr->values[ p ] = "";
+}
+
+void ActionPropertyManager::uninitializeProperty( QtProperty *p )
+{
+ d_ptr->values.remove( p );
+}
+
+
+
+//////////////////////////////////////////////////////////////////// Factory ///////////////////////////////////////////////////////////////////////
+
+
+
+struct ActionEditorFactoryPrivate
+{
+ QMap< QtProperty*, QList< ActionPropertyEditor* > > createdEditors;
+ QMap< ActionPropertyEditor*, QtProperty* > editorToProperty;
+
+ ~ActionEditorFactoryPrivate()
+ {
+ createdEditors.clear();
+
+ QMap< ActionPropertyEditor*, QtProperty* >::iterator itr = editorToProperty.begin();
+ while( itr != editorToProperty.end() )
+ {
+ delete itr.key();
+ ++itr;
+ }
+ editorToProperty.clear();
+ }
+
+ void addEditor( QtProperty *p, ActionPropertyEditor *editor )
+ {
+ QMap< QtProperty*, QList< ActionPropertyEditor* > >::iterator itr = createdEditors.find( p );
+
+ if( itr != createdEditors.end() )
+ {
+ itr->push_back( editor );
+ }
+ else
+ {
+ QList< ActionPropertyEditor* > l;
+ l.push_back( editor );
+ createdEditors.insert( p, l );
+ }
+
+ editorToProperty.insert( editor, p );
+ }
+
+ void removeEditor( QObject *o )
+ {
+ // Remove from editorToProperty first
+ QMap< ActionPropertyEditor*, QtProperty* >::iterator itr1 = editorToProperty.begin();
+ while( itr1 != editorToProperty.end() )
+ {
+ if( itr1.key() == o )
+ break;
+
+ ++itr1;
+ }
+ if( itr1 != editorToProperty.end() )
+ editorToProperty.erase( itr1 );
+
+ // Then from createdEditors
+ QMap< QtProperty*, QList< ActionPropertyEditor* > >::iterator itr2 = createdEditors.begin();
+ while( itr2 != createdEditors.end() )
+ {
+ QList< ActionPropertyEditor* > &l = *itr2;
+ QList< ActionPropertyEditor* >::iterator itr = l.begin();
+ while( itr != l.end() )
+ {
+ if( *itr == o )
+ {
+ QList< ActionPropertyEditor* >::iterator d = itr;
+ ++itr;
+ l.erase( d );
+ continue;
+ }
+
+ ++itr;
+ }
+
+ ++itr2;
+ }
+ }
+
+};
+
+ActionEditorFactory::ActionEditorFactory( QObject *parent ) :
+QtAbstractEditorFactory( parent )
+{
+ d_ptr = new ActionEditorFactoryPrivate();
+}
+
+ActionEditorFactory::~ActionEditorFactory()
+{
+ delete d_ptr;
+ d_ptr = NULL;
+}
+
+void ActionEditorFactory::connectPropertyManager( ActionPropertyManager *manager )
+{
+ connect( manager, SIGNAL( valueChanged( QtProperty*, const QString& ) ), this, SLOT( onPropertyChanged( QtProperty*, const QString& ) ) );
+}
+
+void ActionEditorFactory::disconnectPropertyManager( ActionPropertyManager *manager )
+{
+ disconnect( manager, SIGNAL( valueChanged( QtProperty*, const QString& ) ), this, SLOT( onPropertyChanged( QtProperty*, const QString& ) ) );
+}
+
+QWidget* ActionEditorFactory::createEditor( ActionPropertyManager *manager, QtProperty *p, QWidget *parent )
+{
+ ActionPropertyEditor *editor = new ActionPropertyEditor( parent );
+ editor->setValue( manager->value( p ) );
+
+ connect( editor, SIGNAL( valueChanged( const QString& ) ), this, SLOT( onSetValue( const QString& ) ) );
+ connect( editor, SIGNAL( destroyed( QObject* ) ), this, SLOT( onEditorDestroyed( QObject* ) ) );
+
+ d_ptr->addEditor( p, editor );
+
+ return editor;
+}
+
+void ActionEditorFactory::onPropertyChanged( QtProperty *p, const QString &value )
+{
+ QMap< QtProperty*, QList< ActionPropertyEditor* > >::iterator itr = d_ptr->createdEditors.find( p );
+ if( itr == d_ptr->createdEditors.end() )
+ return;
+
+ QList< ActionPropertyEditor* > &l = *itr;
+ QList< ActionPropertyEditor* >::iterator i = l.begin();
+ while( i != l.end() )
+ {
+ ActionPropertyEditor *editor = *i;
+
+ editor->blockSignals( true );
+ editor->setValue( value );
+ editor->blockSignals( false );
+
+ ++i;
+ }
+}
+
+void ActionEditorFactory::onSetValue( const QString &value )
+{
+ QObject *s = sender();
+ ActionPropertyEditor *editor = qobject_cast< ActionPropertyEditor* >( s );
+ if( editor == NULL )
+ return;
+
+ QMap< ActionPropertyEditor*, QtProperty* >::iterator itr = d_ptr->editorToProperty.find( editor );
+ if( itr == d_ptr->editorToProperty.end() )
+ return;
+
+ QtProperty *p = *itr;
+
+ ActionPropertyManager *manager = qobject_cast< ActionPropertyManager* >( p->propertyManager() );
+ if( manager == NULL )
+ return;
+
+ blockSignals( true );
+ manager->setValue( p, value );
+ blockSignals( false );
+}
+
+void ActionEditorFactory::onEditorDestroyed( QObject *editor )
+{
+ d_ptr->removeEditor( editor );
+}
+
+
+
+//////////////////////////////////////////////////////////////////////// Editor //////////////////////////////////////////////////////////////////
+
+
+
+ActionPropertyEditor::ActionPropertyEditor( QWidget *parent ) :
+QWidget( parent )
+{
+ setupUi();
+ setupConnections();
+}
+
+ActionPropertyEditor::~ActionPropertyEditor()
+{
+}
+
+void ActionPropertyEditor::setValue( const QString &value )
+{
+ if( lineEdit->text() == value )
+ return;
+
+ disableConnections();
+ lineEdit->setText( value );
+ setupConnections();
+}
+
+void ActionPropertyEditor::showEvent( QShowEvent *e )
+{
+ QWidget::showEvent( e );
+}
+
+void ActionPropertyEditor::onToolButtonClicked()
+{
+ ActionList d;
+ d.load();
+
+ int result = d.exec();
+ if( QDialog::Accepted != result )
+ return;
+
+ lineEdit->setText( d.getSelectedAction() );
+}
+
+void ActionPropertyEditor::onTextChanged( const QString &text )
+{
+ Q_EMIT valueChanged( text );
+}
+
+void ActionPropertyEditor::setupConnections()
+{
+ connect( toolButton, SIGNAL( clicked( bool ) ), this, SLOT( onToolButtonClicked() ) );
+ connect( lineEdit, SIGNAL( textChanged( const QString& ) ), this, SLOT( onTextChanged( const QString& ) ) );
+}
+
+void ActionPropertyEditor::disableConnections()
+{
+ disconnect( toolButton, SIGNAL( clicked( bool ) ), this, SLOT( onToolButtonClicked() ) );
+ disconnect( lineEdit, SIGNAL( textChanged( const QString& ) ), this, SLOT( onTextChanged( const QString& ) ) );
+}
+
+void ActionPropertyEditor::setupUi()
+{
+ lineEdit = new QLineEdit();
+ toolButton = new QToolButton();
+ toolButton->setText( "..." );
+
+ QHBoxLayout *lt = new QHBoxLayout( this );
+ lt->setContentsMargins( 0, 0, 0, 0 );
+ lt->setSpacing( 0 );
+ lt->addWidget( lineEdit );
+ lt->addWidget( toolButton );
+
+ setFocusProxy( lineEdit );
+ setSizePolicy( QSizePolicy::Ignored, QSizePolicy::Fixed );
+
+}
+
+
diff --git a/code/studio/src/plugins/gui_editor/action_property_manager.h b/code/studio/src/plugins/gui_editor/action_property_manager.h
new file mode 100644
index 000000000..06cd714d7
--- /dev/null
+++ b/code/studio/src/plugins/gui_editor/action_property_manager.h
@@ -0,0 +1,125 @@
+// Ryzom Core Studio GUI Editor plugin
+// 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 ACTION_PROPERTY_MANAGER
+#define ACTION_PROPERTY_MANAGER
+
+#define QT_QTPROPERTYBROWSER_IMPORT
+
+#include "3rdparty/qtpropertybrowser/qtpropertybrowser.h"
+#include
+
+/////////////////////////////////////////////////////// Manager ///////////////////////////////////////////////////////////////////////////
+
+struct ActionPropertyManagerPrivate;
+
+class ActionPropertyManager : public QtAbstractPropertyManager
+{
+ Q_OBJECT
+
+public:
+ ActionPropertyManager( QObject *parent = NULL );
+ ~ActionPropertyManager();
+
+ QString value( const QtProperty *p ) const;
+
+public Q_SLOTS:
+ void setValue( QtProperty *p, const QString &value );
+
+Q_SIGNALS:
+ void valueChanged( QtProperty *p, const QString &value );
+
+protected:
+ bool hasValue( const QtProperty *p ) const;
+ QString valueText( const QtProperty *p ) const;
+ void initializeProperty( QtProperty *p );
+ void uninitializeProperty( QtProperty *p );
+
+private:
+ ActionPropertyManagerPrivate *d_ptr;
+
+ Q_DISABLE_COPY( ActionPropertyManager );
+};
+
+
+////////////////////////////////////////////////////////////////// Factory /////////////////////////////////////////////////////////////////////////
+
+struct ActionEditorFactoryPrivate;
+
+class ActionEditorFactory : public QtAbstractEditorFactory< ActionPropertyManager >
+{
+ Q_OBJECT
+
+public:
+ ActionEditorFactory( QObject *parent = NULL );
+ ~ActionEditorFactory();
+
+protected:
+ void connectPropertyManager( ActionPropertyManager *manager );
+ void disconnectPropertyManager( ActionPropertyManager *manager );
+
+ QWidget* createEditor( ActionPropertyManager *manager, QtProperty *p, QWidget *parent );
+
+private Q_SLOTS:
+ void onPropertyChanged( QtProperty *p, const QString &value );
+ void onSetValue( const QString &value );
+ void onEditorDestroyed( QObject *editor );
+
+private:
+ ActionEditorFactoryPrivate *d_ptr;
+
+ Q_DISABLE_COPY( ActionEditorFactory );
+};
+
+
+///////////////////////////////////////////////////////////////// Editor ///////////////////////////////////////////////////////////////////////////
+
+class QLineEdit;
+class QToolButton;
+
+class ActionPropertyEditor : public QWidget
+{
+ Q_OBJECT
+public:
+ ActionPropertyEditor( QWidget *parent = NULL );
+ ~ActionPropertyEditor();
+
+public Q_SLOTS:
+ void setValue( const QString &value );
+
+protected:
+ void showEvent( QShowEvent *e );
+
+private Q_SLOTS:
+ void onToolButtonClicked();
+ void onTextChanged( const QString &text );
+
+Q_SIGNALS:
+ void valueChanged( const QString &value );
+
+private:
+ void setupUi();
+ void setupConnections();
+ void disableConnections();
+
+
+ QLineEdit *lineEdit;
+ QToolButton *toolButton;
+};
+
+#endif
+
diff --git a/code/studio/src/plugins/gui_editor/property_browser_ctrl.cpp b/code/studio/src/plugins/gui_editor/property_browser_ctrl.cpp
index e3594edb0..e7029dd37 100644
--- a/code/studio/src/plugins/gui_editor/property_browser_ctrl.cpp
+++ b/code/studio/src/plugins/gui_editor/property_browser_ctrl.cpp
@@ -26,6 +26,8 @@
#include "widget_info_tree.h"
#include
+#include "action_property_manager.h"
+
namespace
{
class NelBMAlign
@@ -368,9 +370,11 @@ namespace GUIEditor
browser = NULL;
propertyMgr = new QtVariantPropertyManager;
enumMgr = new QtEnumPropertyManager;
+ actionMgr = new ActionPropertyManager;
variantFactory = new QtVariantEditorFactory;
enumFactory = new QtEnumEditorFactory;
+ actionFactory = new ActionEditorFactory;
ttPairs[ "tooltip_posref" ] = "tooltip_parent_posref";
ttPairs[ "tooltip_parent_posref" ] = "tooltip_posref";
@@ -381,11 +385,15 @@ namespace GUIEditor
CPropBrowserCtrl::~CPropBrowserCtrl()
{
+ delete actionMgr;
+ actionMgr = NULL;
delete enumMgr;
enumMgr = NULL;
delete propertyMgr;
propertyMgr = NULL;
+ delete actionFactory;
+ actionFactory = NULL;
delete variantFactory;
variantFactory = NULL;
delete enumFactory;
@@ -447,7 +455,7 @@ namespace GUIEditor
// probably the clear() method clears them too...
browser->setFactoryForManager( propertyMgr, variantFactory );
browser->setFactoryForManager( enumMgr, enumFactory );
-
+ browser->setFactoryForManager( actionMgr, actionFactory );
enablePropertyWatchers();
}
@@ -617,12 +625,27 @@ namespace GUIEditor
}
}
+
+ void CPropBrowserCtrl::onActionPropertyChanged( QtProperty *p, const QString &v )
+ {
+ QString propName = p->propertyName();
+
+ CInterfaceElement *e = CWidgetManager::getInstance()->getElementFromId( currentElement );
+ if( e == NULL )
+ return;
+
+ e->setProperty( propName.toUtf8().constData(), v.toUtf8().constData() );
+ }
+
void CPropBrowserCtrl::enablePropertyWatchers()
{
connect( propertyMgr, SIGNAL( valueChanged( QtProperty*, const QVariant& ) ),
this, SLOT( onPropertyChanged( QtProperty*, const QVariant& ) ) );
connect( enumMgr, SIGNAL( valueChanged( QtProperty*, int ) ),
this, SLOT( onEnumPropertyChanged( QtProperty*, int ) ) );
+
+ connect( actionMgr, SIGNAL( valueChanged( QtProperty*, const QString& ) ),
+ this, SLOT( onActionPropertyChanged( QtProperty*, const QString& ) ) );
}
void CPropBrowserCtrl::disablePropertyWatchers()
@@ -631,6 +654,9 @@ namespace GUIEditor
this, SLOT( onPropertyChanged( QtProperty*, const QVariant& ) ) );
disconnect( enumMgr, SIGNAL( valueChanged( QtProperty*, int ) ),
this, SLOT( onEnumPropertyChanged( QtProperty*, int ) ) );
+
+ disconnect( actionMgr, SIGNAL( valueChanged( QtProperty*, const QString& ) ),
+ this, SLOT( onActionPropertyChanged( QtProperty*, const QString& ) ) );
}
void CPropBrowserCtrl::setupProperties( const std::string &type, const CInterfaceElement *element )
@@ -656,7 +682,22 @@ namespace GUIEditor
{
QtVariantProperty *p = NULL;
QVariant v;
-
+
+ if( prop.propType == "action" )
+ {
+ std::string j = element->getProperty( prop.propName );
+
+ if( j.empty() )
+ return;
+
+ QtProperty *pp = actionMgr->addProperty( prop.propName.c_str() );
+ if( pp == NULL )
+ return;
+
+ actionMgr->setValue( pp, j.c_str() );
+ browser->addProperty( pp );
+ }
+ else
if( prop.propType == "bitmap_align" )
{
std::string j = element->getProperty( prop.propName );
diff --git a/code/studio/src/plugins/gui_editor/property_browser_ctrl.h b/code/studio/src/plugins/gui_editor/property_browser_ctrl.h
index bec4004d3..80118bc0b 100644
--- a/code/studio/src/plugins/gui_editor/property_browser_ctrl.h
+++ b/code/studio/src/plugins/gui_editor/property_browser_ctrl.h
@@ -31,6 +31,9 @@ class QtEnumEditorFactory;
class QtProperty;
class QVariant;
+class ActionPropertyManager;
+class ActionEditorFactory;
+
namespace NLGUI
{
class CInterfaceElement;
@@ -59,6 +62,7 @@ namespace GUIEditor
private Q_SLOTS:
void onPropertyChanged( QtProperty *prop, const QVariant &v );
void onEnumPropertyChanged( QtProperty *prop, int value );
+ void onActionPropertyChanged( QtProperty *p, const QString &v );
private:
void enablePropertyWatchers();
@@ -70,9 +74,11 @@ namespace GUIEditor
QtTreePropertyBrowser *browser;
QtVariantPropertyManager *propertyMgr;
QtEnumPropertyManager *enumMgr;
+ ActionPropertyManager *actionMgr;
QtVariantEditorFactory *variantFactory;
QtEnumEditorFactory *enumFactory;
+ ActionEditorFactory *actionFactory;
std::string currentElement;
std::map< std::string, SWidgetInfo > widgetInfo;
diff --git a/code/studio/src/plugins/gui_editor/widgets/CtrlBaseButton.xml b/code/studio/src/plugins/gui_editor/widgets/CtrlBaseButton.xml
index 72e362556..33f9f3a3f 100644
--- a/code/studio/src/plugins/gui_editor/widgets/CtrlBaseButton.xml
+++ b/code/studio/src/plugins/gui_editor/widgets/CtrlBaseButton.xml
@@ -60,7 +60,7 @@
onover
- string
+ action
@@ -70,7 +70,7 @@
onclick_l
- string
+ action
@@ -80,7 +80,7 @@
ondblclick_l
- string
+ action
@@ -90,7 +90,7 @@
onclick_r
- string
+ action
@@ -100,7 +100,7 @@
onlongclick_l
- string
+ action
@@ -110,7 +110,7 @@
onclock_tick
- string
+ action
diff --git a/code/studio/src/plugins/gui_editor/widgets/GroupContainer.xml b/code/studio/src/plugins/gui_editor/widgets/GroupContainer.xml
index b374bca19..3d879a150 100644
--- a/code/studio/src/plugins/gui_editor/widgets/GroupContainer.xml
+++ b/code/studio/src/plugins/gui_editor/widgets/GroupContainer.xml
@@ -110,7 +110,7 @@
on_open
- string
+ action
@@ -120,7 +120,7 @@
on_close
- string
+ action
@@ -130,7 +130,7 @@
on_close_button
- string
+ action
@@ -140,7 +140,7 @@
on_move
- string
+ action
@@ -150,7 +150,7 @@
on_deactive_check
- string
+ action
@@ -160,7 +160,7 @@
on_resize
- string
+ action
@@ -170,7 +170,7 @@
on_alpha_settings_changed
- string
+ action
@@ -180,7 +180,7 @@
on_begin_move
- string
+ action
diff --git a/code/studio/src/plugins/gui_editor/widgets/InterfaceGroup.xml b/code/studio/src/plugins/gui_editor/widgets/InterfaceGroup.xml
index b9e99d336..ddcdf01e6 100644
--- a/code/studio/src/plugins/gui_editor/widgets/InterfaceGroup.xml
+++ b/code/studio/src/plugins/gui_editor/widgets/InterfaceGroup.xml
@@ -40,7 +40,7 @@
on_active
- string
+ action
@@ -50,7 +50,7 @@
on_deactive
- string
+ action
@@ -80,7 +80,7 @@
group_onclick_r
- string
+ action
@@ -90,7 +90,7 @@
group_onclick_l
- string
+ action
@@ -100,7 +100,7 @@
on_enter
- string
+ action
handler
diff --git a/code/studio/src/plugins/gui_editor/widgets/InterfaceGroupWheel.xml b/code/studio/src/plugins/gui_editor/widgets/InterfaceGroupWheel.xml
index 62d67cc0a..b095ecac5 100644
--- a/code/studio/src/plugins/gui_editor/widgets/InterfaceGroupWheel.xml
+++ b/code/studio/src/plugins/gui_editor/widgets/InterfaceGroupWheel.xml
@@ -10,7 +10,7 @@
on_wheel_up
- string
+ action
@@ -20,7 +20,7 @@
on_wheel_down
- string
+ action