Commit 1665cfc7 authored by Sebastian Eichelbaum's avatar Sebastian Eichelbaum

[CHANGE] - Information properties now supported by the prop widgets. Also extended template.

parent 6cb8b3fc
...@@ -32,7 +32,9 @@ WPropertyBoolWidget::WPropertyBoolWidget( WPropBool property, QGridLayout* prope ...@@ -32,7 +32,9 @@ WPropertyBoolWidget::WPropertyBoolWidget( WPropBool property, QGridLayout* prope
m_checkbox( &m_parameterWidgets ), m_checkbox( &m_parameterWidgets ),
m_button( &m_parameterWidgets ), m_button( &m_parameterWidgets ),
m_layout( &m_parameterWidgets ), m_layout( &m_parameterWidgets ),
m_asButton( asButton ) m_asButton( asButton ),
m_asText( &m_informationWidgets ),
m_infoLayout( &m_informationWidgets )
{ {
// initialize members // initialize members
m_button.setCheckable( true ); m_button.setCheckable( true );
...@@ -49,6 +51,10 @@ WPropertyBoolWidget::WPropertyBoolWidget( WPropBool property, QGridLayout* prope ...@@ -49,6 +51,10 @@ WPropertyBoolWidget::WPropertyBoolWidget( WPropBool property, QGridLayout* prope
} }
m_parameterWidgets.setLayout( &m_layout ); m_parameterWidgets.setLayout( &m_layout );
// Information Output ( Property Purpose = PV_PURPOSE_INFORMATION )
m_infoLayout.addWidget( &m_asText );
m_informationWidgets.setLayout( &m_infoLayout );
// connect the modification signal of m_checkbox with our callback // connect the modification signal of m_checkbox with our callback
connect( &m_checkbox, SIGNAL( toggled( bool ) ), this, SLOT( changed() ) ); connect( &m_checkbox, SIGNAL( toggled( bool ) ), this, SLOT( changed() ) );
connect( &m_button, SIGNAL( toggled( bool ) ), this, SLOT( changed() ) ); connect( &m_button, SIGNAL( toggled( bool ) ), this, SLOT( changed() ) );
...@@ -64,6 +70,7 @@ void WPropertyBoolWidget::update() ...@@ -64,6 +70,7 @@ void WPropertyBoolWidget::update()
// simply set the new state // simply set the new state
m_checkbox.setChecked( m_boolProperty->get() ); m_checkbox.setChecked( m_boolProperty->get() );
m_button.setChecked( m_boolProperty->get() ); m_button.setChecked( m_boolProperty->get() );
m_asText.setText( m_boolProperty->get() ? QString( "Yes" ) : QString( "No") );
} }
QPushButton* WPropertyBoolWidget::getButton() QPushButton* WPropertyBoolWidget::getButton()
......
...@@ -96,6 +96,16 @@ protected: ...@@ -96,6 +96,16 @@ protected:
*/ */
bool m_asButton; bool m_asButton;
/**
* Used to show the property as text.
*/
QLabel m_asText;
/**
* The layout used for the pure output (information properties)
*/
QHBoxLayout m_infoLayout;
private: private:
public slots: public slots:
......
...@@ -38,7 +38,9 @@ WPropertyColorWidget::WPropertyColorWidget( WPropColor property, QGridLayout* pr ...@@ -38,7 +38,9 @@ WPropertyColorWidget::WPropertyColorWidget( WPropColor property, QGridLayout* pr
WPropertyWidget( property, propertyGrid, parent ), WPropertyWidget( property, propertyGrid, parent ),
m_colorProperty( property ), m_colorProperty( property ),
m_button( &m_parameterWidgets ), m_button( &m_parameterWidgets ),
m_layout() m_layout(),
m_asText( &m_informationWidgets ),
m_infoLayout( &m_informationWidgets )
{ {
// initialize members // initialize members
m_parameterWidgets.setLayout( &m_layout ); m_parameterWidgets.setLayout( &m_layout );
...@@ -46,6 +48,10 @@ WPropertyColorWidget::WPropertyColorWidget( WPropColor property, QGridLayout* pr ...@@ -46,6 +48,10 @@ WPropertyColorWidget::WPropertyColorWidget( WPropColor property, QGridLayout* pr
// layout both against each other // layout both against each other
m_layout.addWidget( &m_button ); m_layout.addWidget( &m_button );
// Information Output ( Property Purpose = PV_PURPOSE_INFORMATION )
m_infoLayout.addWidget( &m_asText );
m_informationWidgets.setLayout( &m_infoLayout );
// set the initial values // set the initial values
update(); update();
...@@ -61,6 +67,13 @@ WPropertyColorWidget::~WPropertyColorWidget() ...@@ -61,6 +67,13 @@ WPropertyColorWidget::~WPropertyColorWidget()
void WPropertyColorWidget::update() void WPropertyColorWidget::update()
{ {
m_button.setPalette( QPalette( toQColor( m_colorProperty->get() ) ) ); m_button.setPalette( QPalette( toQColor( m_colorProperty->get() ) ) );
// if this is a info property -> set background of label and some text
m_asText.setText( QString::fromStdString( m_colorProperty->getAsString() ) );
QPalette pal = QPalette();
pal.setColor( QPalette::Background, toQColor( m_colorProperty->get() ) );
m_asText.setAutoFillBackground( true );
m_asText.setPalette( pal );
} }
QColor WPropertyColorWidget::toQColor( WColor color ) QColor WPropertyColorWidget::toQColor( WColor color )
......
...@@ -76,6 +76,16 @@ protected: ...@@ -76,6 +76,16 @@ protected:
*/ */
QHBoxLayout m_layout; QHBoxLayout m_layout;
/**
* Used to show the property as text.
*/
QLabel m_asText;
/**
* The layout used for the pure output (information properties)
*/
QHBoxLayout m_infoLayout;
private: private:
/** /**
......
...@@ -38,7 +38,9 @@ WPropertyDoubleWidget::WPropertyDoubleWidget( WPropDouble property, QGridLayout* ...@@ -38,7 +38,9 @@ WPropertyDoubleWidget::WPropertyDoubleWidget( WPropDouble property, QGridLayout*
m_doubleProperty( property ), m_doubleProperty( property ),
m_slider( Qt::Horizontal, &m_parameterWidgets ), m_slider( Qt::Horizontal, &m_parameterWidgets ),
m_edit( &m_parameterWidgets ), m_edit( &m_parameterWidgets ),
m_layout( &m_parameterWidgets ) m_layout( &m_parameterWidgets ),
m_asText( &m_informationWidgets ),
m_infoLayout( &m_informationWidgets )
{ {
// initialize members // initialize members
m_edit.resize( m_edit.minimumSizeHint().width() *.8 , m_edit.size().height() ); m_edit.resize( m_edit.minimumSizeHint().width() *.8 , m_edit.size().height() );
...@@ -50,6 +52,10 @@ WPropertyDoubleWidget::WPropertyDoubleWidget( WPropDouble property, QGridLayout* ...@@ -50,6 +52,10 @@ WPropertyDoubleWidget::WPropertyDoubleWidget( WPropDouble property, QGridLayout*
m_parameterWidgets.setLayout( &m_layout ); m_parameterWidgets.setLayout( &m_layout );
// Information Output ( Property Purpose = PV_PURPOSE_INFORMATION )
m_infoLayout.addWidget( &m_asText );
m_informationWidgets.setLayout( &m_infoLayout );
update(); update();
// connect the modification signal of the edit and slider with our callback // connect the modification signal of the edit and slider with our callback
...@@ -132,8 +138,12 @@ void WPropertyDoubleWidget::update() ...@@ -132,8 +138,12 @@ void WPropertyDoubleWidget::update()
// m_edit.resize( m_edit.minimumSizeHint().width() * length / 2, m_edit.size().height() ); // m_edit.resize( m_edit.minimumSizeHint().width() * length / 2, m_edit.size().height() );
// set the initial values // set the initial values
m_edit.setText( QString( toString( m_doubleProperty->get() ).c_str() ) ); QString valStr = QString( toString( m_doubleProperty->get() ).c_str() );
m_edit.setText( valStr );
m_slider.setValue( toPercent( m_doubleProperty->get() ) ); m_slider.setValue( toPercent( m_doubleProperty->get() ) );
// do not forget to update the label
m_asText.setText( valStr );
} }
int WPropertyDoubleWidget::toPercent( double value ) int WPropertyDoubleWidget::toPercent( double value )
......
...@@ -110,6 +110,16 @@ protected: ...@@ -110,6 +110,16 @@ protected:
*/ */
double m_max; double m_max;
/**
* Used to show the property as text.
*/
QLabel m_asText;
/**
* The layout used for the pure output (information properties)
*/
QHBoxLayout m_infoLayout;
private: private:
public slots: public slots:
......
...@@ -39,7 +39,9 @@ WPropertyFilenameWidget::WPropertyFilenameWidget( WPropFilename property, QGridL ...@@ -39,7 +39,9 @@ WPropertyFilenameWidget::WPropertyFilenameWidget( WPropFilename property, QGridL
WPropertyWidget( property, propertyGrid, parent ), WPropertyWidget( property, propertyGrid, parent ),
m_fnProperty( property ), m_fnProperty( property ),
m_button( &m_parameterWidgets ), m_button( &m_parameterWidgets ),
m_layout( &m_parameterWidgets ) m_layout( &m_parameterWidgets ),
m_asText( &m_informationWidgets ),
m_infoLayout( &m_informationWidgets )
{ {
// initialize members // initialize members
m_parameterWidgets.setLayout( &m_layout ); m_parameterWidgets.setLayout( &m_layout );
...@@ -50,6 +52,10 @@ WPropertyFilenameWidget::WPropertyFilenameWidget( WPropFilename property, QGridL ...@@ -50,6 +52,10 @@ WPropertyFilenameWidget::WPropertyFilenameWidget( WPropFilename property, QGridL
// this prevents the button from resizing when a long path is selected // this prevents the button from resizing when a long path is selected
m_button.setSizePolicy( QSizePolicy::Ignored, QSizePolicy::Preferred ); m_button.setSizePolicy( QSizePolicy::Ignored, QSizePolicy::Preferred );
// Information Output ( Property Purpose = PV_PURPOSE_INFORMATION )
m_infoLayout.addWidget( &m_asText );
m_informationWidgets.setLayout( &m_infoLayout );
// set the initial values // set the initial values
update(); update();
...@@ -64,7 +70,9 @@ WPropertyFilenameWidget::~WPropertyFilenameWidget() ...@@ -64,7 +70,9 @@ WPropertyFilenameWidget::~WPropertyFilenameWidget()
void WPropertyFilenameWidget::update() void WPropertyFilenameWidget::update()
{ {
m_button.setText( QString::fromStdString( m_fnProperty->get().file_string() ) ); QString val = QString::fromStdString( m_fnProperty->get().file_string() );
m_button.setText( val );
m_asText.setText( val );
} }
void WPropertyFilenameWidget::buttonReleased() void WPropertyFilenameWidget::buttonReleased()
......
...@@ -76,6 +76,16 @@ protected: ...@@ -76,6 +76,16 @@ protected:
*/ */
QHBoxLayout m_layout; QHBoxLayout m_layout;
/**
* Used to show the property as text.
*/
QLabel m_asText;
/**
* The layout used for the pure output (information properties)
*/
QHBoxLayout m_infoLayout;
private: private:
public slots: public slots:
......
...@@ -39,7 +39,9 @@ WPropertyIntWidget::WPropertyIntWidget( WPropInt property, QGridLayout* property ...@@ -39,7 +39,9 @@ WPropertyIntWidget::WPropertyIntWidget( WPropInt property, QGridLayout* property
m_intProperty( property ), m_intProperty( property ),
m_slider( Qt::Horizontal, &m_parameterWidgets ), m_slider( Qt::Horizontal, &m_parameterWidgets ),
m_edit( &m_parameterWidgets ), m_edit( &m_parameterWidgets ),
m_layout( &m_parameterWidgets ) m_layout( &m_parameterWidgets ),
m_asText( &m_informationWidgets ),
m_infoLayout( &m_informationWidgets )
{ {
// initialize members // initialize members
m_edit.resize( m_edit.minimumSizeHint().width(), m_edit.size().height() ); m_edit.resize( m_edit.minimumSizeHint().width(), m_edit.size().height() );
...@@ -48,9 +50,12 @@ WPropertyIntWidget::WPropertyIntWidget( WPropInt property, QGridLayout* property ...@@ -48,9 +50,12 @@ WPropertyIntWidget::WPropertyIntWidget( WPropInt property, QGridLayout* property
// layout both against each other // layout both against each other
m_layout.addWidget( &m_slider ); m_layout.addWidget( &m_slider );
m_layout.addWidget( &m_edit ); m_layout.addWidget( &m_edit );
m_parameterWidgets.setLayout( &m_layout ); m_parameterWidgets.setLayout( &m_layout );
// Information Output ( Property Purpose = PV_PURPOSE_INFORMATION )
m_infoLayout.addWidget( &m_asText );
m_informationWidgets.setLayout( &m_infoLayout );
update(); update();
// connect the modification signal of the edit and slider with our callback // connect the modification signal of the edit and slider with our callback
...@@ -112,15 +117,18 @@ void WPropertyIntWidget::update() ...@@ -112,15 +117,18 @@ void WPropertyIntWidget::update()
int length = 6; // use fixed length to have a uniform look among several widgets int length = 6; // use fixed length to have a uniform look among several widgets
// resize the text widget // resize the text widget
// m_edit.setMaxLength( length ); // m_edit.setMaxLength( length );
m_edit.setMaximumWidth( m_edit.minimumSizeHint().width() * length / 2 ); m_edit.setMaximumWidth( m_edit.minimumSizeHint().width() * length / 2 );
// m_edit.setMinimumWidth( m_edit.minimumSizeHint().width() * length / 4 ); // m_edit.setMinimumWidth( m_edit.minimumSizeHint().width() * length / 4 );
// m_edit.resize( m_edit.minimumSizeHint().width() * length / 4, m_edit.size().height() ); // m_edit.resize( m_edit.minimumSizeHint().width() * length / 4, m_edit.size().height() );
// set the initial values // set the initial values
m_edit.setText( QString( boost::lexical_cast< std::string >( m_intProperty->get() ).c_str() ) ); QString valStr = QString( boost::lexical_cast< std::string >( m_intProperty->get() ).c_str() );
m_edit.setText( valStr );
m_slider.setValue( m_intProperty->get() ); m_slider.setValue( m_intProperty->get() );
// do not forget to update the label
m_asText.setText( valStr );
} }
void WPropertyIntWidget::sliderChanged( int value ) void WPropertyIntWidget::sliderChanged( int value )
......
...@@ -82,6 +82,16 @@ protected: ...@@ -82,6 +82,16 @@ protected:
*/ */
QHBoxLayout m_layout; QHBoxLayout m_layout;
/**
* Used to show the property as text.
*/
QLabel m_asText;
/**
* The layout used for the pure output (information properties)
*/
QHBoxLayout m_infoLayout;
private: private:
public slots: public slots:
......
...@@ -44,8 +44,6 @@ WPropertySelectionWidget::WPropertySelectionWidget( WPropSelection property, QGr ...@@ -44,8 +44,6 @@ WPropertySelectionWidget::WPropertySelectionWidget( WPropSelection property, QGr
m_update( false ) m_update( false )
{ {
// initialize members // initialize members
m_parameterWidgets.setLayout( &m_layout );
m_combo = NULL; m_combo = NULL;
m_list = NULL; m_list = NULL;
...@@ -102,6 +100,26 @@ WPropertySelectionWidget::WPropertySelectionWidget( WPropSelection property, QGr ...@@ -102,6 +100,26 @@ WPropertySelectionWidget::WPropertySelectionWidget( WPropSelection property, QGr
connect( m_list, SIGNAL( itemSelectionChanged() ), this, SLOT( listSelectionChanged() ) ); connect( m_list, SIGNAL( itemSelectionChanged() ), this, SLOT( listSelectionChanged() ) );
} }
// Information Output ( Property Purpose = PV_PURPOSE_INFORMATION )
// In this case -> use some disabled lists/combos here
if ( m_property->getPurpose() == PV_PURPOSE_INFORMATION )
{
m_informationWidgets.setLayout( &m_layout );
if ( m_list )
{
m_list->setEnabled( false );
}
else
{
m_combo->setEnabled( false );
}
}
else
{
m_parameterWidgets.setLayout( &m_layout );
}
// set the initial values // set the initial values
update(); update();
} }
......
...@@ -87,6 +87,7 @@ protected: ...@@ -87,6 +87,7 @@ protected:
* called when changed programmatically. * called when changed programmatically.
*/ */
bool m_update; bool m_update;
private: private:
public slots: public slots:
......
...@@ -36,7 +36,9 @@ WPropertyStringWidget::WPropertyStringWidget( WPropString property, QGridLayout* ...@@ -36,7 +36,9 @@ WPropertyStringWidget::WPropertyStringWidget( WPropString property, QGridLayout*
WPropertyWidget( property, propertyGrid, parent ), WPropertyWidget( property, propertyGrid, parent ),
m_stringProperty( property ), m_stringProperty( property ),
m_edit( &m_parameterWidgets ), m_edit( &m_parameterWidgets ),
m_layout( &m_parameterWidgets ) m_layout( &m_parameterWidgets ),
m_asText( &m_informationWidgets ),
m_infoLayout( &m_informationWidgets )
{ {
// initialize members // initialize members
m_parameterWidgets.setLayout( &m_layout ); m_parameterWidgets.setLayout( &m_layout );
...@@ -44,6 +46,13 @@ WPropertyStringWidget::WPropertyStringWidget( WPropString property, QGridLayout* ...@@ -44,6 +46,13 @@ WPropertyStringWidget::WPropertyStringWidget( WPropString property, QGridLayout*
// layout // layout
m_layout.addWidget( &m_edit ); m_layout.addWidget( &m_edit );
// Information Output ( Property Purpose = PV_PURPOSE_INFORMATION )
m_infoLayout.addWidget( &m_asText );
m_informationWidgets.setLayout( &m_infoLayout );
m_asText.setWordWrap( true );
// To have word warp work correctly -> set size policy
m_asText.setSizePolicy( QSizePolicy( QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding ) );
// set the initial values // set the initial values
update(); update();
...@@ -59,7 +68,9 @@ WPropertyStringWidget::~WPropertyStringWidget() ...@@ -59,7 +68,9 @@ WPropertyStringWidget::~WPropertyStringWidget()
void WPropertyStringWidget::update() void WPropertyStringWidget::update()
{ {
m_edit.setText( QString( m_stringProperty->get().c_str() ) ); QString val = QString( m_stringProperty->get().c_str() );
m_edit.setText( val );
m_asText.setText( val );
} }
void WPropertyStringWidget::editChanged() void WPropertyStringWidget::editChanged()
......
...@@ -77,6 +77,16 @@ protected: ...@@ -77,6 +77,16 @@ protected:
*/ */
QHBoxLayout m_layout; QHBoxLayout m_layout;
/**
* Used to show the property as text.
*/
QLabel m_asText;
/**
* The layout used for the pure output (information properties)
*/
QHBoxLayout m_infoLayout;
private: private:
public slots: public slots:
......
...@@ -30,7 +30,9 @@ WPropertyTriggerWidget::WPropertyTriggerWidget( WPropTrigger property, QGridLayo ...@@ -30,7 +30,9 @@ WPropertyTriggerWidget::WPropertyTriggerWidget( WPropTrigger property, QGridLayo
WPropertyWidget( property, propertyGrid, parent ), WPropertyWidget( property, propertyGrid, parent ),
m_triggerProperty( property ), m_triggerProperty( property ),
m_button( &m_parameterWidgets ), m_button( &m_parameterWidgets ),
m_layout( &m_parameterWidgets ) m_layout( &m_parameterWidgets ),
m_asText( &m_informationWidgets ),
m_infoLayout( &m_informationWidgets )
{ {
// initialize members // initialize members
m_button.setCheckable( true ); m_button.setCheckable( true );
...@@ -43,6 +45,10 @@ WPropertyTriggerWidget::WPropertyTriggerWidget( WPropTrigger property, QGridLayo ...@@ -43,6 +45,10 @@ WPropertyTriggerWidget::WPropertyTriggerWidget( WPropTrigger property, QGridLayo
m_layout.setContentsMargins( 1, 1, 1, 1 ); m_layout.setContentsMargins( 1, 1, 1, 1 );
m_parameterWidgets.setLayout( &m_layout ); m_parameterWidgets.setLayout( &m_layout );
// Information Output ( Property Purpose = PV_PURPOSE_INFORMATION )
m_infoLayout.addWidget( &m_asText );
m_informationWidgets.setLayout( &m_infoLayout );
// connect the modification signal of m_checkbox with our callback // connect the modification signal of m_checkbox with our callback
connect( &m_button, SIGNAL( toggled( bool ) ), this, SLOT( changed() ) ); connect( &m_button, SIGNAL( toggled( bool ) ), this, SLOT( changed() ) );
} }
...@@ -57,6 +63,9 @@ void WPropertyTriggerWidget::update() ...@@ -57,6 +63,9 @@ void WPropertyTriggerWidget::update()
// simply set the new state // simply set the new state
m_button.setChecked( m_triggerProperty->get() == WPVBaseTypes::PV_TRIGGER_TRIGGERED ); m_button.setChecked( m_triggerProperty->get() == WPVBaseTypes::PV_TRIGGER_TRIGGERED );
m_button.setEnabled( m_triggerProperty->get() == WPVBaseTypes::PV_TRIGGER_READY ); m_button.setEnabled( m_triggerProperty->get() == WPVBaseTypes::PV_TRIGGER_READY );
// do not forget to update the label
m_asText.setText( m_triggerProperty->get() == WPVBaseTypes::PV_TRIGGER_TRIGGERED ? QString( "Operation triggered" ) : QString( "Ready" ) );
} }
QPushButton* WPropertyTriggerWidget::getButton() QPushButton* WPropertyTriggerWidget::getButton()
......
...@@ -84,6 +84,16 @@ protected: ...@@ -84,6 +84,16 @@ protected:
*/ */
QHBoxLayout m_layout; QHBoxLayout m_layout;
/**
* Used to show the property as text.
*/
QLabel m_asText;
/**
* The layout used for the pure output (information properties)
*/
QHBoxLayout m_infoLayout;
private: private:
public slots: public slots:
......
...@@ -38,6 +38,7 @@ WPropertyWidget::WPropertyWidget( boost::shared_ptr< WPropertyBase > property, ...@@ -38,6 +38,7 @@ WPropertyWidget::WPropertyWidget( boost::shared_ptr< WPropertyBase > property,
m_label( this ), m_label( this ),
m_useLabel( m_propertyGrid ), m_useLabel( m_propertyGrid ),
m_parameterWidgets(), // parent gets set by the QStackWidget m_parameterWidgets(), // parent gets set by the QStackWidget
m_informationWidgets(), // parent gets set by the QStackWidget
m_invalid( false ) m_invalid( false )
{ {
if ( m_useLabel ) if ( m_useLabel )
...@@ -54,7 +55,15 @@ WPropertyWidget::WPropertyWidget( boost::shared_ptr< WPropertyBase > property, ...@@ -54,7 +55,15 @@ WPropertyWidget::WPropertyWidget( boost::shared_ptr< WPropertyBase > property,
m_propertyGrid->addWidget( this, row, 1 ); m_propertyGrid->addWidget( this, row, 1 );
} }
// add both widgets to the stacked widget, it then uses the first as default.
addWidget( &m_parameterWidgets ); addWidget( &m_parameterWidgets );
addWidget( &m_informationWidgets );
// if the purpose of the property is INFORMTION -> activate the information widget
if ( m_property->getPurpose() == PV_PURPOSE_INFORMATION )
{
setCurrentIndex( 1 );
}
// setup the update callback // setup the update callback
m_connection = m_property->getUpdateCondition()->subscribeSignal( boost::bind( &WPropertyWidget::propertyChangeNotifier, this ) ); m_connection = m_property->getUpdateCondition()->subscribeSignal( boost::bind( &WPropertyWidget::propertyChangeNotifier, this ) );
......
...@@ -113,6 +113,11 @@ protected: ...@@ -113,6 +113,11 @@ protected:
*/ */
QWidget m_parameterWidgets; QWidget m_parameterWidgets;
/**
* The widget containing a layout and provides the widgets for showing information properties.
*/
QWidget m_informationWidgets;
/** /**
* Flag denoting whether the widget is set to an invalid value. * Flag denoting whether the widget is set to an invalid value.
*/ */
......
...@@ -297,12 +297,21 @@ void WMTemplate::properties() ...@@ -297,12 +297,21 @@ void WMTemplate::properties()
// In more detail, the purpose type of the property gets set to PV_PURPOSE_INFORMATION automatically by m_infoProperties. You can, of course, // In more detail, the purpose type of the property gets set to PV_PURPOSE_INFORMATION automatically by m_infoProperties. You can, of course,
// add information properties to your custom groups or m_properties too. There, you need to set the purpose flag of the property manually: // add information properties to your custom groups or m_properties too. There, you need to set the purpose flag of the property manually:</