void QuickEdit::AddAttribute() { QModelIndex current = ui->tvEditor->selectionModel()->currentIndex(); if(!current.isValid()) return; current = current.sibling(current.row(), 0); TreeItemInterface *itemAsInterface = static_cast<TreeItemInterface*>(current.internalPointer()); BrowserNode* currentNode = static_cast<BrowserNode*>(itemAsInterface->InternalPointer()); BrowserClass* classNode; int newItemPosition = 0; if(currentNode->TypeID() == TypeIdentifier<BrowserClass>::id()) { classNode = static_cast<BrowserClass*>(currentNode); if(!classNode) return; newItemPosition = itemAsInterface->childCount(); } else if(currentNode->TypeID() *in(TypeIdentifier<BrowserOperation>::id() ,TypeIdentifier<BrowserAttribute>::id()) && current.parent().isValid()) { itemAsInterface = static_cast<TreeItemInterface*>(current.parent().internalPointer()); classNode = static_cast<BrowserClass*>(itemAsInterface->InternalPointer()); newItemPosition = current.row()+1; current = current.parent(); } else return; //classNode->addOperation() BrowserAttribute* newAttribute; if(QString(classNode->get_stereotype()) == "enum") newAttribute = static_cast<BrowserAttribute*>(classNode->addEnumItem()); else newAttribute = static_cast<BrowserAttribute*>(classNode->addAttribute()); classNode->move(newAttribute, currentNode); classNode->select_in_browser(); QModelIndex parentIndex; TreeItemInterface* parent; if(treeModel->parent(current).isValid()) { parentIndex = treeModel->parent(current); parentIndex = parentIndex.sibling(parentIndex.row(), 0); parent = static_cast<TreeItemInterface*>(parentIndex.internalPointer()); } else parent = treeModel->RootItem(); int insertIndex = parent->GetIndexOfChild(itemAsInterface); QSharedPointer<TreeItemInterface> sharedOfNode = parent->GetChildren()[insertIndex]; if(!treeModel->insertRows(newItemPosition, 1, current)) return; if(!current.isValid()) return; QModelIndex newItem = treeModel->index(newItemPosition,0,current); TreeItemInterface *newItemInterface = static_cast<TreeItemInterface*>(newItem.internalPointer()); TreeItem<BrowserNode>* newItemAsNode = static_cast<TreeItem<BrowserNode>*>(newItemInterface); newItemAsNode->SetController(attributeController); newItemAsNode->SetParent(sharedOfNode); newItemAsNode->SetInternalData(newAttribute); }