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( arrayResized( const QString&, int ) ), this, SLOT( onArrayResized( const QString&, int ) ) );
connect( m_pvt, SIGNAL( modified() ), this, SLOT( onModified() ) ); 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() BrowserCtrl::~BrowserCtrl()
@ -31,18 +32,8 @@ void BrowserCtrl::clicked( const QModelIndex &idx )
m_pvt->clear(); m_pvt->clear();
GeorgesQt::CFormItem *item = static_cast< GeorgesQt::CFormItem* >( idx.internalPointer() ); 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() ); m_pvt->setupNode( item );
if( !b || ( node == NULL ) )
return;
m_pvt->setupNode( node );
enableMgrConnections(); enableMgrConnections();
@ -53,6 +44,11 @@ void BrowserCtrl::onValueChanged( QtProperty *p, const QVariant &value )
m_pvt->onValueChanged( p, 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 ) void BrowserCtrl::onArrayResized( const QString &name, int size )
{ {
Q_EMIT arrayResized( name, size ); Q_EMIT arrayResized( name, size );

View file

@ -29,9 +29,11 @@ public Q_SLOTS:
Q_SIGNALS: Q_SIGNALS:
void arrayResized( const QString &name, int size ); void arrayResized( const QString &name, int size );
void modified(); void modified();
void valueChanged( const QString &key, const QString &value );
private Q_SLOTS: private Q_SLOTS:
void onValueChanged( QtProperty *p, const QVariant &value ); void onValueChanged( QtProperty *p, const QVariant &value );
void onValueChanged( const QString &key, const QString &value );
void onArrayResized( const QString &name, int size ); void onArrayResized( const QString &name, int size );
void onModified(); void onModified();

View file

@ -2,6 +2,9 @@
#include "3rdparty/qtpropertybrowser/qttreepropertybrowser.h" #include "3rdparty/qtpropertybrowser/qttreepropertybrowser.h"
#include "3rdparty/qtpropertybrowser/qtvariantproperty.h" #include "3rdparty/qtpropertybrowser/qtvariantproperty.h"
#include <QVariant> #include <QVariant>
#include "formitem.h"
#include "nel/georges/form.h"
namespace namespace
{ {
@ -26,6 +29,12 @@ namespace
return t; 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(); mgr = new QtVariantPropertyManager();
factory = new QtVariantEditorFactory(); factory = new QtVariantEditorFactory();
m_currentNode = NULL;
m_rootNode = NULL; m_rootNode = NULL;
} }
@ -70,19 +78,6 @@ void BrowserCtrlPvt::setupAtom( NLGEORGES::CFormElmStruct::CFormElmStructElm &el
m_browser->addProperty( p ); 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 ) void BrowserCtrlPvt::setupStruct( NLGEORGES::UFormElm *node )
{ {
NLGEORGES::CFormElmStruct *st = static_cast< NLGEORGES::CFormElmStruct* >( 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() ) NLGEORGES::UFormElm *n = getGeorgesNode( node );
setupStruct( node ); if( n == NULL )
else 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() ) if( node->isArray() )
setupArray( node ); setupArray( node );
else else
return; setupStruct( node );
m_currentNode = node;
m_browser->setFactoryForManager( mgr, factory ); m_browser->setFactoryForManager( mgr, factory );
} }
void BrowserCtrlPvt::clear() void BrowserCtrlPvt::clear()
{ {
m_browser->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(); std::string v = value.toString().toUtf8().constData();
bool created = false; 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 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 ) 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; std::string formName;
arr->getFormName( formName, NULL ); arr->getFormName( formName, NULL );
int newSize = value.toInt();
int oldSize = arr->Elements.size(); int oldSize = arr->Elements.size();
if( newSize == oldSize ) if( newSize == oldSize )
@ -188,17 +258,26 @@ void BrowserCtrlPvt::onArrayValueChanged( QtProperty *p, const QVariant &value )
QString name = formName.c_str(); QString name = formName.c_str();
Q_EMIT arrayResized( name, newSize ); Q_EMIT arrayResized( name, newSize );
Q_EMIT modified(); Q_EMIT modified();
if( newSize == 0 )
m_currentNode.p = NULL;
} }
void BrowserCtrlPvt::onValueChanged( QtProperty *p, const QVariant &value ) void BrowserCtrlPvt::onValueChanged( QtProperty *p, const QVariant &value )
{ {
if( m_currentNode == NULL ) if( m_currentNode.p == NULL )
{
if( m_currentNode.name.isEmpty() )
return; return;
if( m_currentNode->isStruct() ) onArrayValueChanged( p, value );
return;
}
if( m_currentNode.p->isStruct() )
onStructValueChanged( p, value ); onStructValueChanged( p, value );
else else
if( m_currentNode->isArray() ) if( m_currentNode.p->isArray() )
onArrayValueChanged( p, value ); onArrayValueChanged( p, value );
} }

View file

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

View file

@ -34,6 +34,13 @@ namespace GeorgesQt
{ {
CFormItem::CFormItem() CFormItem::CFormItem()
{ {
parentItem = NULL;
formElm = NULL;
m_form = NULL;
_StructId = 0;
_Slot = 0;
_Type = Null;
_Array = false;
} }
CFormItem::~CFormItem() CFormItem::~CFormItem()
@ -106,48 +113,15 @@ namespace GeorgesQt
bool CFormItem::isArray() bool CFormItem::isArray()
{ {
// If it wasn't a root node then lets check the node type. return _Array;
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;
} }
bool CFormItem::isArrayMember() bool CFormItem::isArrayMember()
{ {
CFormItem *parent = this->parent(); if( parentItem == NULL )
// 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;
return false; return false;
return parentItem->isArray();
} }
QIcon CFormItem::getItemImage(CFormItem *rootItem) QIcon CFormItem::getItemImage(CFormItem *rootItem)
@ -237,7 +211,7 @@ namespace GeorgesQt
childItems.clear(); 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(); CFormItem *newNode = new CFormItem();
newNode->_Type = type; newNode->_Type = type;
@ -247,6 +221,7 @@ namespace GeorgesQt
newNode->_FormName = formName; newNode->_FormName = formName;
newNode->_Slot = slot; newNode->_Slot = slot;
newNode->m_form = formPtr; newNode->m_form = formPtr;
newNode->_Array = isArray;
appendChild(newNode); appendChild(newNode);
return newNode; return newNode;

View file

@ -46,7 +46,7 @@ namespace GeorgesQt
void appendChild(CFormItem *child); 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); CFormItem *child(int row);
int childCount() const; int childCount() const;
@ -76,6 +76,13 @@ namespace GeorgesQt
void clearChildren(); void clearChildren();
bool rootItem() const{
if( parentItem == NULL )
return true;
else
return false;
}
private: private:
QList<CFormItem*> childItems; QList<CFormItem*> childItems;
QList<QVariant> itemData; QList<QVariant> itemData;
@ -88,6 +95,7 @@ namespace GeorgesQt
std::string _FormName; std::string _FormName;
TSub _Type; TSub _Type;
uint _Slot; uint _Slot;
bool _Array;
}; // CFormItem }; // CFormItem

View file

@ -74,7 +74,7 @@ void CGeorgesDirTreeDialog::fileSelected(QModelIndex index)
{ {
if (index.isValid() && !m_dirModel->isDir(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; QString m_ldPath;
Q_SIGNALS: Q_SIGNALS:
void selectedForm(const QString); void fileSelected(const QString&);
private Q_SLOTS: private Q_SLOTS:
void fileSelected(QModelIndex index); void fileSelected(QModelIndex index);

View file

@ -103,8 +103,8 @@ namespace GeorgesQt
connect(Core::ICore::instance(), SIGNAL(changeSettings()), connect(Core::ICore::instance(), SIGNAL(changeSettings()),
this, SLOT(settingsChanged())); this, SLOT(settingsChanged()));
connect(m_georgesDirTreeDialog, SIGNAL(selectedForm(const QString)), connect(m_georgesDirTreeDialog, SIGNAL(fileSelected(const QString&)),
this, SLOT(loadFile(const QString))); this, SLOT(loadFile(const QString&)));
connect(qApp, SIGNAL(focusChanged(QWidget*, QWidget*)), connect(qApp, SIGNAL(focusChanged(QWidget*, QWidget*)),
this, SLOT(focusChanged(QWidget*, QWidget*))); this, SLOT(focusChanged(QWidget*, QWidget*)));
} }
@ -144,8 +144,12 @@ namespace GeorgesQt
void GeorgesEditorForm::save() void GeorgesEditorForm::save()
{ {
m_lastActiveDock->write(); 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() void GeorgesEditorForm::readSettings()
@ -190,12 +194,12 @@ namespace GeorgesQt
} }
} }
void GeorgesEditorForm::loadFile(const QString fileName) void GeorgesEditorForm::loadFile(const QString &fileName)
{ {
loadFile(fileName, false); loadFile(fileName, false);
} }
void GeorgesEditorForm::loadFile(const QString fileName, bool loadFromDfn) void GeorgesEditorForm::loadFile(const QString &fileName, bool loadFromDfn)
{ {
QFileInfo info(fileName); QFileInfo info(fileName);
@ -257,6 +261,10 @@ namespace GeorgesQt
{ {
nlwarning("Failed to load form: %s", info.fileName().toUtf8().constData()); nlwarning("Failed to load form: %s", info.fileName().toUtf8().constData());
m_dockedWidgets.last()->close(); 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: public Q_SLOTS:
void open(); void open();
void loadFile(const QString fileName); void loadFile(const QString &fileName);
void loadFile(const QString fileName, bool loadFromDfn); void loadFile(const QString &fileName, bool loadFromDfn);
void newFile(); void newFile();
void save(); void save();
void settingsChanged(); void settingsChanged();

View file

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

View file

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

View file

@ -71,7 +71,6 @@ namespace GeorgesQt
m_ui.treeView->setHeader(m_header); m_ui.treeView->setHeader(m_header);
m_ui.treeView->header()->setResizeMode(QHeaderView::ResizeToContents); m_ui.treeView->header()->setResizeMode(QHeaderView::ResizeToContents);
m_ui.treeView->header()->setStretchLastSection(true); m_ui.treeView->header()->setStretchLastSection(true);
m_ui.treeViewTabWidget->setTabEnabled (2,false);
m_form = 0; m_form = 0;
m_model = NULL; 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(arrayResized(const QString&,int)), this, SLOT(onArrayResized(const QString&,int)));
connect(m_browserCtrl, SIGNAL(modified()), this, SLOT(modifiedFile())); 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() CGeorgesTreeViewDialog::~CGeorgesTreeViewDialog()
@ -220,6 +220,9 @@ namespace GeorgesQt
else else
return; return;
m_ui.logEdit->setPlainText( form->Header.Log.c_str() );
m_ui.logEdit->setReadOnly( true );
UFormElm *root = 0; UFormElm *root = 0;
root = &m_form->getRootNode(); root = &m_form->getRootNode();
@ -316,6 +319,8 @@ namespace GeorgesQt
void CGeorgesTreeViewDialog::write( ) void CGeorgesTreeViewDialog::write( )
{ {
NLGEORGES::CForm *form = static_cast< NLGEORGES::CForm* >( m_form );
form->Header.Log = m_ui.logEdit->toPlainText().toUtf8().constData();
NLMISC::COFile file; NLMISC::COFile file;
std::string s = NLMISC::CPath::lookup(loadedForm.toAscii().data(), false); std::string s = NLMISC::CPath::lookup(loadedForm.toAscii().data(), false);
@ -468,6 +473,74 @@ namespace GeorgesQt
if( !idx.isValid() ) if( !idx.isValid() )
return; return;
m_ui.treeView->setCurrentIndex( idx ); 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) void CGeorgesTreeViewDialog::closeEvent(QCloseEvent *event)
@ -523,12 +596,17 @@ namespace GeorgesQt
// } // }
if(item->isArray()) 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()) else if(item->isArrayMember())
{ {
contextMenu.addAction("Delete array entry..."); QAction *deleteAction = contextMenu.addAction("Delete array entry...");
contextMenu.addAction("Insert after 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()) // else if(item->getFormElm()->isStruct())
// { // {
@ -558,24 +636,10 @@ namespace GeorgesQt
// else if(item->getFormElm()->isAtom() && item->valueFrom() == NLGEORGES::UFormElm::ValueForm) // else if(item->getFormElm()->isAtom() && item->valueFrom() == NLGEORGES::UFormElm::ValueForm)
// contextMenu.addAction("Revert to parent/default..."); // contextMenu.addAction("Revert to parent/default...");
QAction *selectedItem = contextMenu.exec(QCursor::pos()); contextMenu.exec(QCursor::pos());
/*
if(selectedItem) 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...") // if(selectedItem->text() == "Add parent...")
// { // {
// // Get the file extension of the form so we can build a dialog pattern. // // 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 selected context menu item is valid.
*/
} // if 'm' model valid. } // if 'm' model valid.
//if(structContext) //if(structContext)
// delete 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 */ } /* namespace GeorgesQt */

View file

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

View file

@ -283,7 +283,7 @@ namespace GeorgesQt
NLGEORGES::CForm *formPtr = static_cast<NLGEORGES::CForm*>(m_form); NLGEORGES::CForm *formPtr = static_cast<NLGEORGES::CForm*>(m_form);
// Add the new node // 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 // Can be NULL in virtual DFN
if (parentDfn) if (parentDfn)
@ -418,7 +418,7 @@ CFormItem *CGeorgesFormModel::addArray(CFormItem *parent,
uint slot) uint slot)
{ {
// Add the new node // 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 // The array exist
if (array) if (array)
@ -451,7 +451,7 @@ CFormItem *CGeorgesFormModel::addArray(CFormItem *parent,
else else
{ {
NLGEORGES::CFormElmArray *elmPtr = array->Elements[elm].Element ? static_cast<NLGEORGES::CFormElmArray*>(array->Elements[elm].Element) : NULL; 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 else
n = e.Name.c_str(); 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 arrayResized( const QString &name, int size );
void appendArray( QModelIndex idx );
void deleteArrayEntry( QModelIndex idx );
void renameArrayEntry( QModelIndex idx, const QString &name );
private: private:
void setupModelData(); void setupModelData();
@ -100,3 +103,5 @@ namespace GeorgesQt
} /* namespace GeorgesQt */ } /* namespace GeorgesQt */
#endif // GEORGESFORM_MODEL_H #endif // GEORGESFORM_MODEL_H