Merged default

This commit is contained in:
dfighter1985 2014-08-30 23:02:14 +02:00
commit f56ab5fbaa
16 changed files with 465 additions and 115 deletions

View file

@ -17,6 +17,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& ) ) );
}
BrowserCtrl::~BrowserCtrl()
@ -31,18 +32,8 @@ void BrowserCtrl::clicked( const QModelIndex &idx )
m_pvt->clear();
GeorgesQt::CFormItem *item = static_cast< GeorgesQt::CFormItem* >( idx.internalPointer() );
NLGEORGES::UFormElm &root = m_form->getRootNode();
NLGEORGES::CFormElm *rootNode = dynamic_cast< NLGEORGES::CFormElm* >( &root );
m_pvt->setRootNode( rootNode );
NLGEORGES::UFormElm *node = NULL;
bool b = false;
b = m_form->getRootNode().getNodeByName( &node, item->formName().c_str() );
if( !b || ( node == NULL ) )
return;
m_pvt->setupNode( node );
m_pvt->setupNode( item );
enableMgrConnections();
@ -53,6 +44,11 @@ void BrowserCtrl::onValueChanged( QtProperty *p, const QVariant &value )
m_pvt->onValueChanged( p, value );
}
void BrowserCtrl::onValueChanged( const QString &key, const QString &value )
{
Q_EMIT valueChanged( key, value );
}
void BrowserCtrl::onArrayResized( const QString &name, int size )
{
Q_EMIT arrayResized( name, size );

View file

@ -29,9 +29,11 @@ public Q_SLOTS:
Q_SIGNALS:
void arrayResized( const QString &name, int size );
void modified();
void valueChanged( const QString &key, const QString &value );
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();

View file

@ -2,6 +2,9 @@
#include "3rdparty/qtpropertybrowser/qttreepropertybrowser.h"
#include "3rdparty/qtpropertybrowser/qtvariantproperty.h"
#include <QVariant>
#include "formitem.h"
#include "nel/georges/form.h"
namespace
{
@ -26,6 +29,12 @@ namespace
return t;
}
NLGEORGES::UFormElm* getGeorgesNode( GeorgesQt::CFormItem *item )
{
NLGEORGES::UFormElm *n = NULL;
item->form()->getRootNode().getNodeByName( &n, item->formName().c_str() );
return n;
}
}
@ -34,7 +43,6 @@ QObject( parent )
{
mgr = new QtVariantPropertyManager();
factory = new QtVariantEditorFactory();
m_currentNode = NULL;
m_rootNode = NULL;
}
@ -70,19 +78,6 @@ void BrowserCtrlPvt::setupAtom( NLGEORGES::CFormElmStruct::CFormElmStructElm &el
m_browser->addProperty( p );
}
void BrowserCtrlPvt::setupArray( NLGEORGES::UFormElm *node )
{
NLGEORGES::CFormElmArray *arr = static_cast< NLGEORGES::CFormElmArray* >( node );
uint size = 0;
arr->getArraySize( size );
QString key = QObject::tr( "Array size" );
QtVariantProperty *p = mgr->addProperty( QVariant::Int, key );
p->setValue( size );
m_browser->addProperty( p );
}
void BrowserCtrlPvt::setupStruct( NLGEORGES::UFormElm *node )
{
NLGEORGES::CFormElmStruct *st = static_cast< NLGEORGES::CFormElmStruct* >( node );
@ -104,24 +99,54 @@ void BrowserCtrlPvt::setupStruct( NLGEORGES::UFormElm *node )
}
}
void BrowserCtrlPvt::setupNode( NLGEORGES::UFormElm *node )
void BrowserCtrlPvt::setupStruct( GeorgesQt::CFormItem *node )
{
if( node->isStruct() )
setupStruct( node );
else
NLGEORGES::UFormElm *n = getGeorgesNode( node );
if( n == NULL )
return;
m_currentNode.p = n;
setupStruct( n );
}
void BrowserCtrlPvt::setupArray( GeorgesQt::CFormItem *node )
{
NLGEORGES::UFormElm *n = getGeorgesNode( node );
uint size = 0;
if( n != NULL )
{
NLGEORGES::CFormElmArray *arr = static_cast< NLGEORGES::CFormElmArray* >( n );
arr->getArraySize( size );
m_currentNode.p = n;
}
QString key = QObject::tr( "Array size" );
QtVariantProperty *p = mgr->addProperty( QVariant::Int, key );
p->setValue( size );
m_browser->addProperty( p );
}
void BrowserCtrlPvt::setupNode( GeorgesQt::CFormItem *node )
{
m_currentNode.clear();
m_currentNode.name = node->formName().c_str();
m_rootNode = dynamic_cast< NLGEORGES::CFormElm* >( &(node->form()->getRootNode()) );
if( node->isArray() )
setupArray( node );
else
return;
setupStruct( node );
m_currentNode = node;
m_browser->setFactoryForManager( mgr, factory );
}
void BrowserCtrlPvt::clear()
{
m_browser->clear();
m_currentNode = NULL;
m_currentNode.clear();
}
@ -131,18 +156,63 @@ void BrowserCtrlPvt::onStructValueChanged( QtProperty *p, const QVariant &value
std::string v = value.toString().toUtf8().constData();
bool created = false;
m_currentNode->setValueByName( v.c_str(), k.c_str(), &created );
m_currentNode.p->setValueByName( v.c_str(), k.c_str(), &created );
QString key = m_currentNode.name + "." + p->propertyName();
Q_EMIT modified();
Q_EMIT valueChanged( key, value.toString() );
}
void BrowserCtrlPvt::createArray()
{
const NLGEORGES::CFormDfn *parentDfn;
const NLGEORGES::CFormDfn *nodeDfn;
uint indexDfn;
const NLGEORGES::CType *type;
NLGEORGES::UFormDfn::TEntryType entryType;
NLGEORGES::CFormElm *node;
bool created;
bool isArray;
m_rootNode->createNodeByName( m_currentNode.name.toUtf8().constData(), &parentDfn, indexDfn, &nodeDfn, &type, &node, entryType, isArray, created );
if( !created )
return;
m_currentNode.p = node;
NLGEORGES::CFormElmArray *arr = dynamic_cast< NLGEORGES::CFormElmArray* >( node );
QString idx = "[0]";
arr->createNodeByName( idx.toUtf8().constData(), &parentDfn, indexDfn, &nodeDfn, &type, &node, entryType, isArray, created );
std::string formName;
arr->getFormName( formName, NULL );
Q_EMIT arrayResized( formName.c_str(), 1 );
Q_EMIT modified();
}
void BrowserCtrlPvt::onArrayValueChanged( QtProperty *p, const QVariant &value )
{
NLGEORGES::CFormElmArray *arr = static_cast< NLGEORGES::CFormElmArray* >( m_currentNode );
// Newsize checks hacked in, because setting unsigned value type in QVariant crashes the property browser!
int newSize = value.toInt();
if( newSize < 0 )
return;
if( m_currentNode.p == NULL )
{
if( newSize != 1 )
return;
createArray();
return;
}
NLGEORGES::CFormElmArray *arr = static_cast< NLGEORGES::CFormElmArray* >( m_currentNode.p );
std::string formName;
arr->getFormName( formName, NULL );
int newSize = value.toInt();
int oldSize = arr->Elements.size();
if( newSize == oldSize )
@ -188,17 +258,26 @@ void BrowserCtrlPvt::onArrayValueChanged( QtProperty *p, const QVariant &value )
QString name = formName.c_str();
Q_EMIT arrayResized( name, newSize );
Q_EMIT modified();
if( newSize == 0 )
m_currentNode.p = NULL;
}
void BrowserCtrlPvt::onValueChanged( QtProperty *p, const QVariant &value )
{
if( m_currentNode == NULL )
if( m_currentNode.p == NULL )
{
if( m_currentNode.name.isEmpty() )
return;
if( m_currentNode->isStruct() )
onArrayValueChanged( p, value );
return;
}
if( m_currentNode.p->isStruct() )
onStructValueChanged( p, value );
else
if( m_currentNode->isArray() )
if( m_currentNode.p->isArray() )
onArrayValueChanged( p, value );
}

View file

@ -10,6 +10,11 @@ namespace NLGEORGES
class CFormElmStruct;
}
namespace GeorgesQt
{
class CFormItem;
}
class QtVariantPropertyManager;
class QtVariantEditorFactory;
class QtTreePropertyBrowser;
@ -24,7 +29,7 @@ public:
~BrowserCtrlPvt();
void clear();
void setupNode( NLGEORGES::UFormElm *node );
void setupNode( GeorgesQt::CFormItem *node );
void onValueChanged( QtProperty *p, const QVariant &value );
QtVariantPropertyManager* manager() const{ return mgr; }
@ -34,21 +39,44 @@ public:
Q_SIGNALS:
void arrayResized( const QString &name, int size );
void modified();
void valueChanged( const QString &key, const QString &value );
private:
void setupStruct( NLGEORGES::UFormElm *node );
void setupArray( NLGEORGES::UFormElm *node );
void setupAtom( NLGEORGES::CFormElmStruct::CFormElmStructElm &elm );
void setupStruct( GeorgesQt::CFormItem *node );
void setupArray( GeorgesQt::CFormItem *node );
void onStructValueChanged( QtProperty *p, const QVariant &value );
void onArrayValueChanged( QtProperty *p, const QVariant &value );
void createArray();
QtVariantPropertyManager *mgr;
QtVariantEditorFactory *factory;
QtTreePropertyBrowser *m_browser;
NLGEORGES::UFormElm *m_currentNode;
QString m_currentNodeName;
NLGEORGES::CFormElm *m_rootNode;
struct CurrentNode
{
CurrentNode()
{
clear();
}
void clear()
{
p = NULL;
name = "";
}
QString name;
NLGEORGES::UFormElm *p;
};
CurrentNode m_currentNode;
};
#endif

View file

@ -34,6 +34,13 @@ namespace GeorgesQt
{
CFormItem::CFormItem()
{
parentItem = NULL;
formElm = NULL;
m_form = NULL;
_StructId = 0;
_Slot = 0;
_Type = Null;
_Array = false;
}
CFormItem::~CFormItem()
@ -106,48 +113,15 @@ namespace GeorgesQt
bool CFormItem::isArray()
{
// If it wasn't a root node then lets check the node type.
const NLGEORGES::CFormDfn *parentDfn;
uint indexDfn;
const NLGEORGES::CFormDfn *nodeDfn;
const NLGEORGES::CType *nodeType;
NLGEORGES::CFormElm *node;
NLGEORGES::UFormDfn::TEntryType type;
bool array;
bool parentVDfnArray;
NLGEORGES::CForm *form = static_cast<CForm*>(m_form);
NLGEORGES::CFormElm *elm = static_cast<CFormElm*>(&form->getRootNode());
nlverify ( elm->getNodeByName (_FormName.c_str(), &parentDfn, indexDfn,
&nodeDfn, &nodeType, &node, type, array, parentVDfnArray, true, NLGEORGES_FIRST_ROUND) );
if(array && node)
return true;
return false;
return _Array;
}
bool CFormItem::isArrayMember()
{
CFormItem *parent = this->parent();
// If it wasn't a root node then lets check the node type.
const NLGEORGES::CFormDfn *parentDfn;
uint indexDfn;
const NLGEORGES::CFormDfn *nodeDfn;
const NLGEORGES::CType *nodeType;
NLGEORGES::CFormElm *parentNode;
NLGEORGES::UFormDfn::TEntryType type;
bool array;
bool parentVDfnArray;
NLGEORGES::CForm *form = static_cast<CForm*>(m_form);
NLGEORGES::CFormElm *elm = static_cast<CFormElm*>(&form->getRootNode());
nlverify ( elm->getNodeByName (parent->formName ().c_str (), &parentDfn, indexDfn,
&nodeDfn, &nodeType, &parentNode, type, array, parentVDfnArray, true, NLGEORGES_FIRST_ROUND) );
if(array && parentNode)
return true;
if( parentItem == NULL )
return false;
return parentItem->isArray();
}
QIcon CFormItem::getItemImage(CFormItem *rootItem)
@ -237,7 +211,7 @@ namespace GeorgesQt
childItems.clear();
}
CFormItem *CFormItem::add (TSub type, const char *name, uint structId, const char *formName, uint slot, NLGEORGES::UForm *formPtr)
CFormItem *CFormItem::add (TSub type, const char *name, uint structId, const char *formName, uint slot, NLGEORGES::UForm *formPtr, bool isArray)
{
CFormItem *newNode = new CFormItem();
newNode->_Type = type;
@ -247,6 +221,7 @@ namespace GeorgesQt
newNode->_FormName = formName;
newNode->_Slot = slot;
newNode->m_form = formPtr;
newNode->_Array = isArray;
appendChild(newNode);
return newNode;

View file

@ -46,7 +46,7 @@ namespace GeorgesQt
void appendChild(CFormItem *child);
CFormItem *add (TSub type, const char *name, uint structId, const char *formName, uint slot, NLGEORGES::UForm *formPtr);
CFormItem *add (TSub type, const char *name, uint structId, const char *formName, uint slot, NLGEORGES::UForm *formPtr, bool isArray );
CFormItem *child(int row);
int childCount() const;
@ -76,6 +76,13 @@ namespace GeorgesQt
void clearChildren();
bool rootItem() const{
if( parentItem == NULL )
return true;
else
return false;
}
private:
QList<CFormItem*> childItems;
QList<QVariant> itemData;
@ -88,6 +95,7 @@ namespace GeorgesQt
std::string _FormName;
TSub _Type;
uint _Slot;
bool _Array;
}; // CFormItem

View file

@ -74,7 +74,7 @@ void CGeorgesDirTreeDialog::fileSelected(QModelIndex index)
{
if (index.isValid() && !m_dirModel->isDir(index))
{
Q_EMIT selectedForm(m_dirModel->fileName(index));
Q_EMIT fileSelected(m_dirModel->fileName(index));
}
}

View file

@ -49,7 +49,7 @@ private:
QString m_ldPath;
Q_SIGNALS:
void selectedForm(const QString);
void fileSelected(const QString&);
private Q_SLOTS:
void fileSelected(QModelIndex index);

View file

@ -103,8 +103,8 @@ namespace GeorgesQt
connect(Core::ICore::instance(), SIGNAL(changeSettings()),
this, SLOT(settingsChanged()));
connect(m_georgesDirTreeDialog, SIGNAL(selectedForm(const QString)),
this, SLOT(loadFile(const QString)));
connect(m_georgesDirTreeDialog, SIGNAL(fileSelected(const QString&)),
this, SLOT(loadFile(const QString&)));
connect(qApp, SIGNAL(focusChanged(QWidget*, QWidget*)),
this, SLOT(focusChanged(QWidget*, QWidget*)));
}
@ -144,8 +144,12 @@ namespace GeorgesQt
void GeorgesEditorForm::save()
{
m_lastActiveDock->write();
m_saveAction->setEnabled(false);
m_saveAction->setEnabled(false);
QAction *saveAction = Core::ICore::instance()->menuManager()->action( Core::Constants::SAVE );
if( saveAction != NULL )
saveAction->setEnabled(false);
}
void GeorgesEditorForm::readSettings()
@ -190,12 +194,12 @@ namespace GeorgesQt
}
}
void GeorgesEditorForm::loadFile(const QString fileName)
void GeorgesEditorForm::loadFile(const QString &fileName)
{
loadFile(fileName, false);
}
void GeorgesEditorForm::loadFile(const QString fileName, bool loadFromDfn)
void GeorgesEditorForm::loadFile(const QString &fileName, bool loadFromDfn)
{
QFileInfo info(fileName);
@ -257,6 +261,10 @@ namespace GeorgesQt
{
nlwarning("Failed to load form: %s", info.fileName().toUtf8().constData());
m_dockedWidgets.last()->close();
QMessageBox::information( this,
tr( "Failed to load form..." ),
tr( "Failed to load form '%1'" ).arg( info.fileName() ) );
}
}

View file

@ -42,8 +42,8 @@ public:
public Q_SLOTS:
void open();
void loadFile(const QString fileName);
void loadFile(const QString fileName, bool loadFromDfn);
void loadFile(const QString &fileName);
void loadFile(const QString &fileName, bool loadFromDfn);
void newFile();
void save();
void settingsChanged();

View file

@ -94,6 +94,11 @@ void GeorgesEditorContext::open()
m_georgesEditorForm->open();
}
void GeorgesEditorContext::save()
{
m_georgesEditorForm->save();
}
QWidget *GeorgesEditorContext::widget()
{
return m_georgesEditorForm;

View file

@ -86,6 +86,8 @@ public:
virtual void open();
void save();
virtual QUndoStack *undoStack();
virtual QWidget *widget();

View file

@ -71,7 +71,6 @@ namespace GeorgesQt
m_ui.treeView->setHeader(m_header);
m_ui.treeView->header()->setResizeMode(QHeaderView::ResizeToContents);
m_ui.treeView->header()->setStretchLastSection(true);
m_ui.treeViewTabWidget->setTabEnabled (2,false);
m_form = 0;
m_model = NULL;
@ -91,6 +90,7 @@ namespace GeorgesQt
connect(m_browserCtrl, SIGNAL(arrayResized(const QString&,int)), this, SLOT(onArrayResized(const QString&,int)));
connect(m_browserCtrl, SIGNAL(modified()), this, SLOT(modifiedFile()));
connect(m_browserCtrl, SIGNAL(valueChanged(const QString&,const QString&)), this, SLOT(onValueChanged(const QString&,const QString&)));
}
CGeorgesTreeViewDialog::~CGeorgesTreeViewDialog()
@ -220,6 +220,9 @@ namespace GeorgesQt
else
return;
m_ui.logEdit->setPlainText( form->Header.Log.c_str() );
m_ui.logEdit->setReadOnly( true );
UFormElm *root = 0;
root = &m_form->getRootNode();
@ -316,6 +319,8 @@ namespace GeorgesQt
void CGeorgesTreeViewDialog::write( )
{
NLGEORGES::CForm *form = static_cast< NLGEORGES::CForm* >( m_form );
form->Header.Log = m_ui.logEdit->toPlainText().toUtf8().constData();
NLMISC::COFile file;
std::string s = NLMISC::CPath::lookup(loadedForm.toAscii().data(), false);
@ -468,6 +473,74 @@ namespace GeorgesQt
if( !idx.isValid() )
return;
m_ui.treeView->setCurrentIndex( idx );
log( name + " resized = " + QString::number( size ) );
}
void CGeorgesTreeViewDialog::onAppendArray()
{
QModelIndex idx = m_ui.treeView->currentIndex();
CFormItem *item = reinterpret_cast< CFormItem* >( idx.internalPointer() );
QString formName = item->formName().c_str();
int size = item->childCount();
m_model->appendArray( idx );
m_ui.treeView->reset();
m_ui.treeView->expandAll();
m_ui.treeView->setCurrentIndex( idx );
m_browserCtrl->clicked( idx );
log( formName + " resized = " + QString::number( size + 1 ) );
modifiedFile();
}
void CGeorgesTreeViewDialog::onDeleteArrayEntry()
{
QModelIndex current = m_ui.treeView->currentIndex();
QModelIndex parent = current.parent();
CFormItem *item = reinterpret_cast< CFormItem* >( current.internalPointer() );
QString formName = item->formName().c_str();
m_model->deleteArrayEntry( current );
m_ui.treeView->expandAll();
m_ui.treeView->setCurrentIndex( parent );
m_browserCtrl->clicked( parent );
log( "deleted " + formName );
modifiedFile();
}
void CGeorgesTreeViewDialog::onValueChanged( const QString &key, const QString &value )
{
log( key + " = " + value );
}
void CGeorgesTreeViewDialog::onRenameArrayEntry()
{
QModelIndex idx = m_ui.treeView->currentIndex();
CFormItem *item = static_cast< CFormItem* >( idx.internalPointer() );
QString newName = QInputDialog::getText( this,
tr( "Rename" ),
tr( "Enter new name" ),
QLineEdit::Normal,
item->name().c_str() );
m_model->renameArrayEntry( idx, newName );
QString formName = item->formName().c_str();
log( formName + " renamed = " + newName );
modifiedFile();
}
void CGeorgesTreeViewDialog::closeEvent(QCloseEvent *event)
@ -523,12 +596,17 @@ namespace GeorgesQt
// }
if(item->isArray())
{
contextMenu.addAction("Append array entry...");
QAction *appendAction = contextMenu.addAction("Append array entry...");
connect( appendAction, SIGNAL( triggered( bool ) ), this, SLOT( onAppendArray() ) );
}
else if(item->isArrayMember())
{
contextMenu.addAction("Delete array entry...");
contextMenu.addAction("Insert after array entry...");
QAction *deleteAction = contextMenu.addAction("Delete array entry...");
connect( deleteAction, SIGNAL( triggered( bool ) ), this, SLOT( onDeleteArrayEntry() ) );
QAction *renameAction = contextMenu.addAction("Rename");
connect( renameAction, SIGNAL( triggered( bool ) ), this, SLOT( onRenameArrayEntry() ) );
//contextMenu.addAction("Insert after array entry...");
}
// else if(item->getFormElm()->isStruct())
// {
@ -558,24 +636,10 @@ namespace GeorgesQt
// else if(item->getFormElm()->isAtom() && item->valueFrom() == NLGEORGES::UFormElm::ValueForm)
// contextMenu.addAction("Revert to parent/default...");
QAction *selectedItem = contextMenu.exec(QCursor::pos());
contextMenu.exec(QCursor::pos());
/*
if(selectedItem)
{
if(selectedItem->text() == "Append array entry...")
{
} // Append an array entry...
else if(selectedItem->text() == "Delete array entry...")
{
}
else if(selectedItem->text() == "Insert after array entry...")
{
}
// if(selectedItem->text() == "Add parent...")
// {
// // Get the file extension of the form so we can build a dialog pattern.
@ -624,10 +688,41 @@ namespace GeorgesQt
// }
} // if selected context menu item is valid.
*/
} // if 'm' model valid.
//if(structContext)
// delete structContext;
}
void CGeorgesTreeViewDialog::log( const QString &msg )
{
QString user = getenv( "USER" );
if( user.isEmpty() )
user = getenv( "USERNAME" );
if( user.isEmpty() )
user = "anonymous";
QTime time = QTime::currentTime();
QDate date = QDate::currentDate();
QString dateString = date.toString( "ddd MMM dd" );
QString timeString = time.toString( "HH:mm:ss" );
QString logMsg;
logMsg += dateString;
logMsg += ' ';
logMsg += timeString;
logMsg += ' ';
logMsg += QString::number( date.year() );
logMsg += ' ';
logMsg += "(";
logMsg += user;
logMsg += ")";
logMsg += ' ';
logMsg += msg;
m_ui.logEdit->appendPlainText( logMsg );
}
} /* namespace GeorgesQt */

View file

@ -104,8 +104,14 @@ namespace GeorgesQt
void headerClicked(int);
void onArrayResized( const QString &name, int size );
void onAppendArray();
void onDeleteArrayEntry();
void onValueChanged( const QString &key, const QString &value );
void onRenameArrayEntry();
private:
void log( const QString &msg );
Ui::CGeorgesTreeViewDialog m_ui;
ExpandableHeaderView *m_header;
UForm *m_form;

View file

@ -283,7 +283,7 @@ namespace GeorgesQt
NLGEORGES::CForm *formPtr = static_cast<NLGEORGES::CForm*>(m_form);
// Add the new node
CFormItem *newNode = parent->add(CFormItem::Form, name, structId, formName, slot, m_form);
CFormItem *newNode = parent->add(CFormItem::Form, name, structId, formName, slot, m_form, false);
// Can be NULL in virtual DFN
if (parentDfn)
@ -418,7 +418,7 @@ CFormItem *CGeorgesFormModel::addArray(CFormItem *parent,
uint slot)
{
// Add the new node
CFormItem *newNode = parent->add (CFormItem::Form, name, structId, formName, slot, m_form);
CFormItem *newNode = parent->add (CFormItem::Form, name, structId, formName, slot, m_form, true);
// The array exist
if (array)
@ -451,7 +451,7 @@ CFormItem *CGeorgesFormModel::addArray(CFormItem *parent,
else
{
NLGEORGES::CFormElmArray *elmPtr = array->Elements[elm].Element ? static_cast<NLGEORGES::CFormElmArray*>(array->Elements[elm].Element) : NULL;
newNode->add (CFormItem::Form, formArrayName, elm, formArrayElmName, slot, m_form);
newNode->add (CFormItem::Form, formArrayName, elm, formArrayElmName, slot, m_form, false);
}
}
}
@ -494,12 +494,153 @@ void CGeorgesFormModel::arrayResized( const QString &name, int size )
else
n = e.Name.c_str();
item->add( CFormItem::Form, n.toUtf8().constData(), i, formName.toUtf8().constData(), 0, item->form() );
item->add( CFormItem::Form, n.toUtf8().constData(), i, formName.toUtf8().constData(), 0, item->form(), false );
}
if( celm->Elements.size() == 0 )
{
NLGEORGES::CFormElmStruct *ps = dynamic_cast< NLGEORGES::CFormElmStruct* >( celm->getParent() );
if( ps != NULL )
{
const NLGEORGES::CFormDfn *parentDfn;
const NLGEORGES::CFormDfn *nodeDfn;
uint indexDfn;
const NLGEORGES::CType *nodeType;
NLGEORGES::CFormElm *node;
NLGEORGES::CFormDfn::TEntryType type;
bool isArray;
ps->deleteNodeByName( item->name().c_str(), &parentDfn, indexDfn, &nodeDfn, &nodeType, &node, type, isArray );
}
}
}
void CGeorgesFormModel::appendArray( QModelIndex idx )
{
if( !idx.isValid() )
return;
CFormItem *item = reinterpret_cast< CFormItem* >( idx.internalPointer() );
NLGEORGES::UFormElm *elm = NULL;
item->form()->getRootNode().getNodeByName( &elm, item->formName().c_str() );
const NLGEORGES::CFormDfn *parentDfn;
const NLGEORGES::CFormDfn *nodeDfn;
uint indexDfn;
const NLGEORGES::CType *type;
NLGEORGES::UFormDfn::TEntryType entryType;
NLGEORGES::CFormElm *node;
bool created;
bool isArray;
if( elm == NULL )
{
NLGEORGES::UFormElm *uroot = &item->form()->getRootNode();
NLGEORGES::CFormElm *croot = static_cast< NLGEORGES::CFormElm* >( uroot );
croot->createNodeByName( item->formName().c_str(), &parentDfn, indexDfn, &nodeDfn, &type, &node, entryType, isArray, created );
if( !created )
return;
elm = node;
}
NLGEORGES::CFormElmArray *celm = dynamic_cast< NLGEORGES::CFormElmArray* >( elm );
if( celm == NULL )
return;
unsigned long s = celm->Elements.size();
std::string nodeIdx = "[";
nodeIdx += QString::number( s ).toUtf8().constData();
nodeIdx += "]";
celm->createNodeByName( nodeIdx.c_str(), &parentDfn, indexDfn, &nodeDfn, &type, &node, entryType, isArray, created );
if( !created )
return;
std::string name = "#";
name += QString::number( s ).toUtf8().constData();
std::string formName;
node->getFormName( formName );
item->add( CFormItem::Form, name.c_str(), s, formName.c_str(), 0, item->form(), false );
}
void CGeorgesFormModel::deleteArrayEntry( QModelIndex idx )
{
CFormItem *item = reinterpret_cast< CFormItem* >( idx.internalPointer() );
NLGEORGES::UFormElm &uroot = item->form()->getRootNode();
NLGEORGES::CFormElm *root = static_cast< NLGEORGES::CFormElm* >( &item->form()->getRootNode() );
NLGEORGES::UFormElm *unode;
uroot.getNodeByName( &unode, item->formName().c_str() );
NLGEORGES::CFormElm *cnode = static_cast< NLGEORGES::CFormElm* >( unode );
NLGEORGES::CFormElmArray *arr = static_cast< NLGEORGES::CFormElmArray* >( cnode->getParent() );
NLGEORGES::CFormElm *elm = arr->Elements[ idx.row() ].Element;
Q_EMIT beginResetModel();
std::vector< NLGEORGES::CFormElmArray::CElement >::iterator itr = arr->Elements.begin() + idx.row();
arr->Elements.erase( itr );
delete elm;
item = item->parent();
item->clearChildren();
NLGEORGES::CFormElmArray *celm = arr;
for( int i = 0; i < celm->Elements.size(); i++ )
{
NLGEORGES::CFormElmArray::CElement &e = celm->Elements[ i ];
QString formName = item->formName().c_str();
formName += '[';
formName += QString::number( i );
formName += ']';
QString n;
if( e.Name.empty() )
n = "#" + QString::number( i );
else
n = e.Name.c_str();
item->add( CFormItem::Form, n.toUtf8().constData(), i, formName.toUtf8().constData(), 0, item->form(), false );
}
Q_EMIT endResetModel();
}
void CGeorgesFormModel::renameArrayEntry( QModelIndex idx, const QString &name )
{
CFormItem *item = static_cast< CFormItem* >( idx.internalPointer() );
NLGEORGES::UFormElm *elm;
item->form()->getRootNode().getNodeByName( &elm, item->formName().c_str() );
NLGEORGES::CFormElm *celm = dynamic_cast< NLGEORGES::CFormElm* >( elm );
if( celm == NULL )
return;
NLGEORGES::UFormElm *uparent = celm->getParent();
NLGEORGES::CFormElmArray *cparent = dynamic_cast< NLGEORGES::CFormElmArray* >( uparent );
if( cparent == NULL )
return;
int i = 0;
for( i = 0; i < cparent->Elements.size(); i++ )
{
if( cparent->Elements[ i ].Element == celm )
break;
}
cparent->Elements[ i ].Name = name.toUtf8().constData();
item->setName( name.toUtf8().constData() );
}
/******************************************************************************/

View file

@ -76,6 +76,9 @@ namespace GeorgesQt
}
void arrayResized( const QString &name, int size );
void appendArray( QModelIndex idx );
void deleteArrayEntry( QModelIndex idx );
void renameArrayEntry( QModelIndex idx, const QString &name );
private:
void setupModelData();
@ -100,3 +103,5 @@ namespace GeorgesQt
} /* namespace GeorgesQt */
#endif // GEORGESFORM_MODEL_H