Added support for Virtual Structs.

This commit is contained in:
dfighter1985 2014-09-09 21:57:30 +02:00
parent 9554a827ca
commit ee76b77160
10 changed files with 117 additions and 0 deletions

View file

@ -37,6 +37,7 @@ QObject( browser )
connect( m_pvt, SIGNAL( arrayResized( const QString&, int ) ), this, SLOT( onArrayResized( const QString&, int ) ) );
connect( m_pvt, SIGNAL( modified() ), this, SLOT( onModified() ) );
connect( m_pvt, SIGNAL( valueChanged( const QString&, const QString& ) ), this, SLOT( onValueChanged( const QString&, const QString& ) ) );
connect( m_pvt, SIGNAL( vstructChanged( const QString& ) ), this, SLOT( onVStructChanged( const QString& ) ) );
}
BrowserCtrl::~BrowserCtrl()
@ -78,6 +79,11 @@ void BrowserCtrl::onModified()
Q_EMIT modified();
}
void BrowserCtrl::onVStructChanged( const QString &name )
{
Q_EMIT vstructChanged( name );
}
void BrowserCtrl::enableMgrConnections()
{
QtVariantPropertyManager *mgr = m_pvt->manager();

View file

@ -48,12 +48,14 @@ Q_SIGNALS:
void arrayResized( const QString &name, int size );
void modified();
void valueChanged( const QString &key, const QString &value );
void vstructChanged( const QString &name );
private Q_SLOTS:
void onValueChanged( QtProperty *p, const QVariant &value );
void onValueChanged( const QString &key, const QString &value );
void onArrayResized( const QString &name, int size );
void onModified();
void onVStructChanged( const QString &name );
private:
void enableMgrConnections();

View file

@ -180,6 +180,23 @@ void BrowserCtrlPvt::setupStruct( GeorgesQt::CFormItem *node )
setupStruct( n );
}
void BrowserCtrlPvt::setupVStruct( GeorgesQt::CFormItem *node )
{
NLGEORGES::UFormElm *n = getGeorgesNode( node );
if( n == NULL )
return;
m_currentNode.p = n;
NLGEORGES::CFormElmVirtualStruct *vs = static_cast< NLGEORGES::CFormElmVirtualStruct* >( n );
QtVariantProperty *p = mgr->addProperty( QVariant::String, "Dfn filename" );
mgr->setValue( p, vs->DfnFilename.c_str() );
m_browser->addProperty( p );
setupStruct( n );
}
void BrowserCtrlPvt::setupArray( GeorgesQt::CFormItem *node )
{
NLGEORGES::UFormElm *n = getGeorgesNode( node );
@ -239,6 +256,9 @@ void BrowserCtrlPvt::setupNode( GeorgesQt::CFormItem *node )
if( node->isStruct() )
setupStruct( node );
else
if( node->isVStruct() )
setupVStruct( node );
else
if( node->isAtom() )
setupAtom( node );
@ -266,6 +286,24 @@ void BrowserCtrlPvt::onStructValueChanged( QtProperty *p, const QVariant &value
Q_EMIT valueChanged( key, value.toString() );
}
void BrowserCtrlPvt::onVStructValueChanged( QtProperty *p, const QVariant &value )
{
if( p->propertyName() != "Dfn filename" )
{
onStructValueChanged( p, value );
return;
}
NLGEORGES::CFormElmVirtualStruct *vs = static_cast< NLGEORGES::CFormElmVirtualStruct* >( m_currentNode.p );
vs->DfnFilename = value.toString().toUtf8().constData();
QString key = m_currentNode.name + "." + p->propertyName();
Q_EMIT modified();
Q_EMIT valueChanged( key, value.toString() );
Q_EMIT vstructChanged( m_currentNode.name );
}
void BrowserCtrlPvt::createArray()
{
const NLGEORGES::CFormDfn *parentDfn;
@ -385,6 +423,9 @@ void BrowserCtrlPvt::onValueChanged( QtProperty *p, const QVariant &value )
return;
}
if( m_currentNode.p->isVirtualStruct() )
onVStructValueChanged( p, value );
else
if( m_currentNode.p->isStruct() )
onStructValueChanged( p, value );
else

View file

@ -58,16 +58,19 @@ Q_SIGNALS:
void arrayResized( const QString &name, int size );
void modified();
void valueChanged( const QString &key, const QString &value );
void vstructChanged( const QString &name );
private:
void setupStruct( NLGEORGES::UFormElm *node );
void setupAtom( NLGEORGES::CFormElmStruct *st, int idx );
void setupStruct( GeorgesQt::CFormItem *node );
void setupVStruct( GeorgesQt::CFormItem *node );
void setupArray( GeorgesQt::CFormItem *node );
void setupAtom( GeorgesQt::CFormItem *node );
void onStructValueChanged( QtProperty *p, const QVariant &value );
void onVStructValueChanged( QtProperty *p, const QVariant &value );
void onArrayValueChanged( QtProperty *p, const QVariant &value );
void onAtomValueChanged( QtProperty *p, const QVariant &value );
void createArray();

View file

@ -238,6 +238,13 @@ namespace GeorgesQt
childItems.clear();
}
void CFormItem::removeChild( int idx )
{
CFormItem *item = childItems[ idx ];
childItems.removeAt( idx );
delete item;
}
CFormItem *CFormItem::add (TSub type, const char *name, uint structId, const char *formName, uint slot, NLGEORGES::UForm *formPtr, TType itemType )
{
CFormItem *newNode = new CFormItem();

View file

@ -87,6 +87,8 @@ namespace GeorgesQt
void clearChildren();
void removeChild( int idx );
bool rootItem() const{
if( parentItem == NULL )
return true;

View file

@ -90,6 +90,7 @@ namespace GeorgesQt
connect(m_browserCtrl, SIGNAL(modified()), this, SLOT(modifiedFile()));
connect(m_browserCtrl, SIGNAL(valueChanged(const QString&,const QString&)), this, SLOT(onValueChanged(const QString&,const QString&)));
connect(m_browserCtrl, SIGNAL(vstructChanged(const QString&)), this, SLOT( onVStructChanged(const QString&)));
}
CGeorgesTreeViewDialog::~CGeorgesTreeViewDialog()
@ -575,6 +576,21 @@ namespace GeorgesQt
modifiedFile();
}
void CGeorgesTreeViewDialog::onVStructChanged( const QString &name )
{
QModelIndex idx = m_ui.treeView->currentIndex();
QModelIndex parent = idx.parent();
int row = idx.row();
m_model->changeVStructDfn( idx );
idx = m_model->index( row, 0, parent );
m_ui.treeView->expandAll();
m_ui.treeView->setCurrentIndex( idx );
m_browserCtrl->clicked( idx );
}
void CGeorgesTreeViewDialog::closeEvent(QCloseEvent *event)
{
Q_EMIT closing();

View file

@ -101,6 +101,7 @@ namespace GeorgesQt
void onAppendArray();
void onDeleteArrayEntry();
void onValueChanged( const QString &key, const QString &value );
void onVStructChanged( const QString &name );
void onRenameArrayEntry();
private:

View file

@ -45,6 +45,8 @@
#include "georges_editor_form.h"
#include "actions.h"
#include "georges.h"
using namespace NLGEORGES;
namespace GeorgesQt
@ -691,6 +693,42 @@ void CGeorgesFormModel::renameArrayEntry( QModelIndex idx, const QString &name )
item->setName( name.toUtf8().constData() );
}
void CGeorgesFormModel::changeVStructDfn( QModelIndex idx )
{
CFormItem *item = static_cast< CFormItem* >( idx.internalPointer() );
QString vstruct = item->formName().c_str();
NLGEORGES::UFormElm *uelm = NULL;
m_form->getRootNode().getNodeByName( &uelm, vstruct.toUtf8().constData() );
if( uelm == NULL )
return;
NLGEORGES::CFormElmVirtualStruct *vs = static_cast< NLGEORGES::CFormElmVirtualStruct* >( uelm );
CGeorges g;
NLGEORGES::UFormDfn *udfn = g.loadFormDfn( vs->DfnFilename );
if( udfn == NULL )
return;
NLGEORGES::CFormDfn *cdfn = static_cast< NLGEORGES::CFormDfn* >( udfn );
vs->build( cdfn );
beginResetModel();
CFormItem *parent = item->parent();
int row = idx.row();
QString name = item->name().c_str();
QString formName = item->formName().c_str();
parent->removeChild( row );
addItem( parent, vs, cdfn, name.toUtf8().constData(), row, formName.toUtf8().constData() );
endResetModel();
}
/******************************************************************************/
void CGeorgesFormModel::loadFormHeader()

View file

@ -83,6 +83,7 @@ namespace GeorgesQt
void appendArray( QModelIndex idx );
void deleteArrayEntry( QModelIndex idx );
void renameArrayEntry( QModelIndex idx, const QString &name );
void changeVStructDfn( QModelIndex idx );
private:
void setupModelData();