Array resize.

--HG--
branch : gsoc2014-dfighter
This commit is contained in:
dfighter1985 2014-08-18 18:03:48 +02:00
parent 6000fe187f
commit 827faaf3e7
10 changed files with 157 additions and 1 deletions

View file

@ -14,6 +14,8 @@ QObject( browser )
{
m_pvt = new BrowserCtrlPvt();
m_pvt->setBrowser( browser );
connect( m_pvt, SIGNAL( arrayResized( const QString&, int ) ), this, SLOT( onArrayResized( const QString&, int ) ) );
}
BrowserCtrl::~BrowserCtrl()
@ -50,6 +52,11 @@ void BrowserCtrl::onValueChanged( QtProperty *p, const QVariant &value )
m_pvt->onValueChanged( p, value );
}
void BrowserCtrl::onArrayResized( const QString &name, int size )
{
Q_EMIT arrayResized( name, size );
}
void BrowserCtrl::enableMgrConnections()
{
QtVariantPropertyManager *mgr = m_pvt->manager();

View file

@ -26,8 +26,12 @@ public:
public Q_SLOTS:
void clicked( const QModelIndex &idx );
Q_SIGNALS:
void arrayResized( const QString &name, int size );
private Q_SLOTS:
void onValueChanged( QtProperty *p, const QVariant &value );
void onArrayResized( const QString &name, int size );
private:
void enableMgrConnections();

View file

@ -139,6 +139,52 @@ void BrowserCtrlPvt::onArrayValueChanged( QtProperty *p, const QVariant &value )
NLGEORGES::CFormElmArray *arr = static_cast< NLGEORGES::CFormElmArray* >( m_currentNode );
std::string formName;
arr->getFormName( formName, NULL );
int newSize = value.toInt();
int oldSize = arr->Elements.size();
if( newSize == oldSize )
return;
if( newSize < oldSize )
{
for( int i = newSize; i < oldSize; i++ )
{
delete arr->Elements[ i ].Element;
}
arr->Elements.resize( newSize );
}
else
{
arr->Elements.resize( newSize );
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;
QString idx;
for( int i = oldSize; i < newSize; i++ )
{
idx.clear();
idx += "[";
idx += QString::number( i );
idx += "]";
bool b;
b = arr->createNodeByName( idx.toUtf8().constData(), &parentDfn, indexDfn, &nodeDfn, &type, &node, entryType, isArray, created );
}
}
QString name = formName.c_str();
Q_EMIT arrayResized( name, newSize );
}
void BrowserCtrlPvt::onValueChanged( QtProperty *p, const QVariant &value )

View file

@ -31,6 +31,9 @@ public:
void setRootNode( NLGEORGES::CFormElm *root ){ m_rootNode = root; }
void setBrowser( QtTreePropertyBrowser *browser ){ m_browser = browser; }
Q_SIGNALS:
void arrayResized( const QString &name, int size );
private:
void setupStruct( NLGEORGES::UFormElm *node );
void setupArray( NLGEORGES::UFormElm *node );

View file

@ -38,7 +38,7 @@ namespace GeorgesQt
CFormItem::~CFormItem()
{
qDeleteAll(childItems);
clearChildren();
}
void CFormItem::appendChild(CFormItem *item)
@ -214,6 +214,29 @@ namespace GeorgesQt
return QIcon();
}
CFormItem* CFormItem::findItem( const QString &formName )
{
CFormItem *item = NULL;
if( _FormName.c_str() == formName )
return this;
for( int i = 0; i < childItems.count(); i++ )
{
item = childItems[ i ]->findItem( formName );
if( item != NULL )
return item;
}
return item;
}
void CFormItem::clearChildren()
{
qDeleteAll( childItems );
childItems.clear();
}
CFormItem *CFormItem::add (TSub type, const char *name, uint structId, const char *formName, uint slot, NLGEORGES::UForm *formPtr)
{
CFormItem *newNode = new CFormItem();

View file

@ -72,6 +72,10 @@ namespace GeorgesQt
QIcon getItemImage(CFormItem *rootItem);
CFormItem* findItem( const QString &formName );
void clearChildren();
private:
QList<CFormItem*> childItems;
QList<QVariant> itemData;

View file

@ -74,6 +74,7 @@ namespace GeorgesQt
m_ui.treeViewTabWidget->setTabEnabled (2,false);
m_form = 0;
m_model = NULL;
m_ui.treeView->setContextMenuPolicy(Qt::CustomContextMenu);
@ -87,11 +88,13 @@ namespace GeorgesQt
m_browserCtrl, SLOT(clicked(const QModelIndex&)));
connect(m_header, SIGNAL(headerClicked(int)),
this, SLOT(headerClicked(int)));
connect(m_browserCtrl, SIGNAL(arrayResized(const QString&,int)), this, SLOT(onArrayResized(const QString&,int)));
}
CGeorgesTreeViewDialog::~CGeorgesTreeViewDialog()
{
m_browserCtrl = NULL;
m_model = NULL;
delete m_form;
qDebug() << "DTOR";
@ -265,6 +268,8 @@ namespace GeorgesQt
setWindowTitle(loadedForm);
// //Modules::mainWin().getTabBar();
m_model = model;
}
}
@ -446,6 +451,23 @@ namespace GeorgesQt
//}
}
void CGeorgesTreeViewDialog::onArrayResized( const QString &name, int size )
{
QModelIndex current = m_ui.treeView->currentIndex();
QModelIndex parent = current.parent();
int r = current.row();
int c = current.column();
m_model->arrayResized( name, size );
m_ui.treeView->reset();
m_ui.treeView->expandAll();
QModelIndex idx = m_model->index( r, c, parent );
if( !idx.isValid() )
return;
m_ui.treeView->setCurrentIndex( idx );
}
void CGeorgesTreeViewDialog::closeEvent(QCloseEvent *event)
{
Q_EMIT closing();

View file

@ -47,6 +47,7 @@ namespace GeorgesQt
{
class CGeorges;
class CGeorgesFormModel;
class CGeorgesTreeViewDialog: public QDockWidget
{
@ -102,6 +103,8 @@ namespace GeorgesQt
void filterRows();
void headerClicked(int);
void onArrayResized( const QString &name, int size );
private:
Ui::CGeorgesTreeViewDialog m_ui;
ExpandableHeaderView *m_header;
@ -116,6 +119,7 @@ namespace GeorgesQt
bool m_modified;
BrowserCtrl *m_browserCtrl;
CGeorgesFormModel *m_model;
}; /* CGeorgesTreeViewDialog */

View file

@ -460,6 +460,46 @@ CFormItem *CGeorgesFormModel::addArray(CFormItem *parent,
}
void CGeorgesFormModel::arrayResized( const QString &name, int size )
{
CFormItem *item = m_rootItem->findItem( name );
if( item == NULL )
return;
NLGEORGES::UFormElm *elm = NULL;
item->form()->getRootNode().getNodeByName( &elm, name.toUtf8().constData() );
if( elm == NULL )
return;
NLGEORGES::CFormElmArray *celm = dynamic_cast< NLGEORGES::CFormElmArray* >( elm );
if( celm == NULL )
return;
item->clearChildren();
for( int i = 0; i < celm->Elements.size(); i++ )
{
NLGEORGES::CFormElmArray::CElement &e = celm->Elements[ i ];
QString formName = name;
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() );
}
}
/******************************************************************************/

View file

@ -74,6 +74,9 @@ namespace GeorgesQt
{
Q_EMIT dataChanged(index, index);
}
void arrayResized( const QString &name, int size );
private:
void setupModelData();
void loadFormData(NLGEORGES::UFormElm *rootElm, CFormItem *parent);