76 groupStruct->
setId(pinGroup->get_id());
78 groupStruct->
setType(pinGroup->get_type());
79 for (
auto pin : pinGroup->get_pins())
83 pinStruct->
setId(pin->get_id());
85 pinStruct->
setType(pin->get_type());
88 tempGroupList.
append(groupStruct);
93 for(
auto group : tempGroupList){
97 PinType groupType = group->getPinType();
100 groupItem->setId(group->getId());
101 groupItem->setName(group->getName());
102 groupItem->setDirection(groupDirection);
103 groupItem->setType(groupType);
104 for (
auto item : group->getChildren())
113 pinItem->setName(pin->
getName());
114 pinItem->setDirection(pinDirection);
115 pinItem->setType(pinType);
117 groupItem->appendChild(pinItem);
120 mAssignedPinNames.
insert(pinItem->getName());
128 groupItem->appendChild(dummyPin);
135 mAssignedGroupNames.
insert(groupItem->getName());
159 if (renamePinGroup(pinItem,
input))
160 pinItem->setName(
input);
166 if(renamePin(pinItem,
input))
167 pinItem->setName(
input);
176 if(!renamePinGroup(pinItem,
input))
181 mInvalidGroups.append(pinItem);
187 pinItem->appendChild(initialPin);
194 pinItem->appendChild(dummyPin);
199 pinItem->getParent()->appendChild(dummyGroup);
204 newPinGroup->
setId(pinItem->getId());
205 newPinGroup->
setName(pinItem->getName());
207 newPinGroup->
setType(pinItem->getPinType());
219 if(!renamePin(pinItem,
input))
221 PinItem* parentGroup =
static_cast<PinItem*
>(pinItem->getParent());
227 mInvalidPins.append(pinItem);
233 pinItem->getParent()->appendChild(dummyPin);
244 if(renamePin(pinItem,
input))
245 pinItem->setName(
input);
266 pinItem->setDirection(directionString);
267 for(
auto child : pinItem->getChildren())
272 handleInvalidPinUpdate(pin);
275 handleInvalidGroupUpdate(pinItem);
283 PinItem* parentGroup =
static_cast<PinItem*
>(pinItem->getParent());
285 warning.
setText(
QString(
"You are about to create an %1 pin in an %2 pin group")
286 .
arg(directionString)
292 pinItem->setDirection(pinDirection);
293 handleInvalidPinUpdate(pinItem);
298 pinItem->setDirection(pinDirection);
299 handleInvalidPinUpdate(pinItem);
320 pinItem->setType(pinType);
321 handleInvalidPinUpdate(pinItem);
325 pinItem->setType(pinType);
329 pinItem->setType(pinType);
330 for(
auto child : pinItem->getChildren())
335 handleInvalidPinUpdate(pin);
338 handleInvalidGroupUpdate(pinItem);
342 pinItem->setType(pinType);
354 if(group->getName() == pinItem->getName()){
355 for(
auto item : group->getChildren()){
368 void PinModel::addPinToPinGroup(
PinItem* pinItem,
PinItem* groupItem)
378 bool PinModel::renamePin(PinItem* pinItem,
const QString& newName)
389 if(isNameAvailable(newName, pinItem)){
391 mAssignedPinNames.
remove(pinItem->getName());
392 mAssignedPinNames.
insert(newName);
395 pinItem->setName(newName);
403 bool PinModel::renamePinGroup(PinItem* groupItem,
const QString& newName)
413 if(isNameAvailable(newName, groupItem)){
415 mAssignedGroupNames.
remove(groupItem->getName());
416 mAssignedGroupNames.
insert(newName);
420 groupItem->setName(newName);
436 bool PinModel::isNameAvailable(
const QString& newName, PinItem* treeItem){
438 if(newName == treeItem->getName())
445 if (mAssignedGroupNames.
contains(newName))
447 log_warning(
"gui",
"Pin group name '{}' not available, another group with that name exists.", newName.
toStdString());
450 if (!mAssignedPinNames.
contains(newName))
455 for (BaseTreeItem* bti : treeItem->getChildren())
457 if (
static_cast<PinItem*
>(bti)->getName() == newName)
460 log_warning(
"gui",
"Pin group name '{}' not available, another group contains a pin with that name.", newName.
toStdString());
465 QString groupName =
static_cast<PinItem*
>(treeItem->getParent())->getName();
467 if(groupName == newName && !mAssignedPinNames.
contains(newName))
473 return !(mAssignedGroupNames.
contains(newName) || mAssignedPinNames.
contains(newName));
478 void PinModel::handleInvalidPinUpdate(PinItem* pinItem)
480 if(!isNameAvailable(pinItem->getName(), pinItem)
486 mInvalidPins.removeAll(pinItem);
489 auto pinGroup =
static_cast<PinItem*
>(pinItem->getParent());
490 handleInvalidGroupUpdate(pinGroup);
493 void PinModel::handleInvalidGroupUpdate(PinItem* groupItem){
501 for(
auto baseTreeItem : groupItem->getChildren()){
502 auto childPin =
static_cast<PinItem*
>(baseTreeItem);
588 void PinModel::printGateMember()
590 qInfo() <<
"Printing PinGroups and Pins";
592 qInfo() <<
"PinGroup: " << pinGroup->getName() <<
" " << pinGroup->getId();
593 for(
auto item : pinGroup->getChildren()){
594 PinItem* pin =
static_cast<PinItem*
>(item);
595 qInfo() <<
" Pin: " << pin->getName() <<
" " << pin->getId();
607 PinItem* pinGroup =
static_cast<PinItem*
>(item);
608 takenGroupIds.
insert(pinGroup->getId());
609 for(
auto item : pinGroup->getChildren()){
610 PinItem* pin =
static_cast<PinItem*
>(item);
611 takenPinIds.
insert(pin->getId());
620 while(takenGroupIds.
contains(counter)){
625 while(takenPinIds.
contains(counter)){
666 for(
auto i : item->getChildren()){
667 item->removeChild(i);
686 handleItemRemoved(item);
713 handleItemRemoved(item);
717 void PinModel::handleItemRemoved(
PinItem* item)
(Future) Base class for all tree models related to the details widget.
virtual QList< BaseTreeItem * > getChildren() const
virtual bool removeChild(BaseTreeItem *child)
virtual int getChildCount() const
virtual void appendChild(BaseTreeItem *child)
The BaseTreeModel implements generic standard functions of a tree model.
QModelIndex getIndexFromItem(BaseTreeItem *item) const
virtual QModelIndex index(int row, int column, const QModelIndex &parent=QModelIndex()) const override
virtual Qt::ItemFlags flags(const QModelIndex &index) const override
BaseTreeItem * getRootItem() const
void setHeaderLabels(const QStringList &label)
BaseTreeItem * getItemFromIndex(QModelIndex index) const
std::vector< PinGroup< GatePin > * > get_pin_groups(const std::function< bool(PinGroup< GatePin > *)> &filter=nullptr) const
PinDirection getDirection() const
TreeItemType getItemType() const
PinType getPinType() const
void setName(const QString &name)
void setType(const QString &type)
QString getDirectionAsText() const
void setDirection(const QString &direction)
QList< PinItem * > getInputPins()
PinModel(QObject *parent=nullptr)
QList< PinItem * > getOutputPins()
Qt::ItemFlags flags(const QModelIndex &index) const override
void handleEditDirection(QModelIndex index, const QString &directionString)
QList< PinItem * > getPinGroups() const
void setGate(GateType *gate)
QList< PinItem * > getInternalPins()
void handleEditName(QModelIndex index, const QString &input)
void editNewDone(QModelIndex index)
void handleDeleteItem(QModelIndex index)
void handleEditType(QModelIndex index, const QString &typeString)
#define log_warning(channel,...)
@ counter
Counter operation.
std::string enum_to_string(T e)
void beginInsertRows(const QModelIndex &parent, int first, int last)
void beginRemoveRows(const QModelIndex &parent, int first, int last)
void dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector< int > &roles)
void append(const T &value)
virtual int exec() override
void setWindowTitle(const QString &title)
void setText(const QString &text)
void * internalPointer() const const
bool isValid() const const
QModelIndex parent() const const
QString tr(const char *sourceText, const char *disambiguation, int n)
bool contains(const T &value) const const
QSet::iterator insert(const T &value)
bool remove(const T &value)
QString arg(qlonglong a, int fieldWidth, int base, QChar fillChar) const const
QString fromStdString(const std::string &str)
std::string toStdString() const const
virtual QValidator::State validate(QString &input, int &pos) const const=0