diff --git a/dbc/dbcmaineditor.cpp b/dbc/dbcmaineditor.cpp index e3ea24e..2aa5825 100644 --- a/dbc/dbcmaineditor.cpp +++ b/dbc/dbcmaineditor.cpp @@ -368,6 +368,32 @@ void DBCMainEditor::updatedMessage(DBC_MESSAGE *msg) QString msgInfo = Utility::formatCANID(msg->ID) + " " + msg->name; if (msg->comment.count() > 0) msgInfo.append(" - ").append(msg->comment); item->setText(0, msgInfo); + //editor could have changed the parent Node too. Have to figure out which node + //is parent in the GUI and compare that to parent in the data. + DBC_NODE *oldParent = dbcFile->findNodeByName(item->parent()->text(0)); + if (oldParent != msg->sender) + { + qDebug() << "Changed parent of message. Trying to rehome it."; + QTreeWidgetItem *newParent = nullptr; + if (nodeToItem.contains(msg->sender)) newParent = nodeToItem.value(msg->sender); + else //new node created within message editor. Create the item and then use it + { + QTreeWidgetItem *newNodeItem = new QTreeWidgetItem(); + newNodeItem->setText(0, msg->sender->name); + newNodeItem->setIcon(0, nodeIcon); + newNodeItem->setData(0, Qt::UserRole, 1); + ui->treeDBC->addTopLevelItem(newNodeItem); + nodeToItem.insert(msg->sender, newNodeItem); + itemToNode.insert(newNodeItem, msg->sender); + newParent = newNodeItem; + } + + QTreeWidgetItem *prevParent = nodeToItem.value(oldParent); + prevParent->removeChild(item); + newParent->addChild(item); + ui->treeDBC->setCurrentItem(item); + ui->treeDBC->sortItems(0, Qt::AscendingOrder); //resort because we just moved an item + } } else qDebug() << "That mesage doesn't exist. That's a bug dude."; } diff --git a/dbc/dbcmessageeditor.cpp b/dbc/dbcmessageeditor.cpp index 8b3a426..2366696 100644 --- a/dbc/dbcmessageeditor.cpp +++ b/dbc/dbcmessageeditor.cpp @@ -17,11 +17,13 @@ DBCMessageEditor::DBCMessageEditor(QWidget *parent) : dbcHandler = DBCHandler::getReference(); dbcMessage = nullptr; + suppressEditCallbacks = false; connect(ui->lineComment, &QLineEdit::editingFinished, [=]() { if (dbcMessage == nullptr) return; + if (suppressEditCallbacks) return; if (dbcMessage->comment != ui->lineComment->text()) dbcFile->setDirtyFlag(); dbcMessage->comment = ui->lineComment->text(); emit updatedTreeInfo(dbcMessage); @@ -31,6 +33,7 @@ DBCMessageEditor::DBCMessageEditor(QWidget *parent) : [=]() { if (dbcMessage == nullptr) return; + if (suppressEditCallbacks) return; if (dbcMessage->ID != Utility::ParseStringToNum(ui->lineFrameID->text())) dbcFile->setDirtyFlag(); dbcMessage->ID = Utility::ParseStringToNum(ui->lineFrameID->text()); emit updatedTreeInfo(dbcMessage); @@ -40,6 +43,7 @@ DBCMessageEditor::DBCMessageEditor(QWidget *parent) : [=]() { if (dbcMessage == nullptr) return; + if (suppressEditCallbacks) return; if (dbcMessage->name != ui->lineMsgName->text().simplified().replace(' ', '_')) dbcFile->setDirtyFlag(); dbcMessage->name = ui->lineMsgName->text().simplified().replace(' ', '_'); emit updatedTreeInfo(dbcMessage); @@ -49,13 +53,47 @@ DBCMessageEditor::DBCMessageEditor(QWidget *parent) : [=]() { if (dbcMessage == nullptr) return; + if (suppressEditCallbacks) return; if (dbcMessage->len != Utility::ParseStringToNum(ui->lineFrameLen->text())) dbcFile->setDirtyFlag(); dbcMessage->len = Utility::ParseStringToNum(ui->lineFrameLen->text()); }); + connect(ui->comboSender, &QComboBox::currentTextChanged, + [=](const QString newText) + { + if (dbcMessage == nullptr) return; + if (suppressEditCallbacks) return; + DBC_NODE *node = dbcFile->findNodeByName(newText); + if (!node) return; + if (node != dbcMessage->sender) dbcFile->setDirtyFlag(); + dbcMessage->sender = node; + emit updatedTreeInfo(dbcMessage); + }); + + connect(ui->comboSender->lineEdit(), &QLineEdit::editingFinished, + [=]() + { + if (dbcMessage == nullptr) return; + if (suppressEditCallbacks) return; + QString newText = ui->comboSender->currentText(); + DBC_NODE *node = dbcFile->findNodeByName(newText); + if (!node) + { + DBC_NODE newNode; + newNode.name = newText; + dbcFile->dbc_nodes.append(newNode); + node = dbcFile->findNodeByName(newText); + ui->comboSender->addItem(newText); + } + if (node != dbcMessage->sender) dbcFile->setDirtyFlag(); + dbcMessage->sender = node; + emit updatedTreeInfo(dbcMessage); + }); + connect(ui->btnTextColor, &QAbstractButton::clicked, [=]() { + if (suppressEditCallbacks) return; QColor newColor = QColorDialog::getColor(dbcMessage->fgColor); if (dbcMessage->fgColor != newColor) dbcFile->setDirtyFlag(); dbcMessage->fgColor = newColor; @@ -77,6 +115,7 @@ DBCMessageEditor::DBCMessageEditor(QWidget *parent) : connect(ui->btnBackgroundColor, &QAbstractButton::clicked, [=]() { + if (suppressEditCallbacks) return; QColor newColor = QColorDialog::getColor(dbcMessage->bgColor); if (dbcMessage->bgColor != newColor) dbcFile->setDirtyFlag(); dbcMessage->bgColor = newColor; @@ -133,10 +172,13 @@ void DBCMessageEditor::setFileIdx(int idx) if (idx < 0 || idx > dbcHandler->getFileCount() - 1) return; dbcFile = dbcHandler->getFileByIdx(idx); + suppressEditCallbacks = true; + ui->comboSender->clear(); for (int x = 0; x < dbcFile->dbc_nodes.count(); x++) { ui->comboSender->addItem(dbcFile->dbc_nodes[x].name); } + suppressEditCallbacks = false; } void DBCMessageEditor::readSettings() @@ -175,10 +217,12 @@ void DBCMessageEditor::showEvent(QShowEvent* event) void DBCMessageEditor::refreshView() { + suppressEditCallbacks = true; + ui->lineComment->setText(dbcMessage->comment); ui->lineFrameID->setText(Utility::formatCANID(dbcMessage->ID)); ui->lineMsgName->setText(dbcMessage->name); - ui->lineFrameLen->setText(QString::number(dbcMessage->len)); + ui->lineFrameLen->setText(QString::number(dbcMessage->len)); for (int i = 0; i < ui->comboSender->count(); i++) { if (ui->comboSender->itemText(i) == dbcMessage->sender->name) @@ -188,6 +232,8 @@ void DBCMessageEditor::refreshView() } } + suppressEditCallbacks = false; + generateSampleText(); } diff --git a/dbc/dbcmessageeditor.h b/dbc/dbcmessageeditor.h index 5388466..473b54d 100644 --- a/dbc/dbcmessageeditor.h +++ b/dbc/dbcmessageeditor.h @@ -30,6 +30,7 @@ private: DBCHandler *dbcHandler; DBC_MESSAGE *dbcMessage; DBCFile *dbcFile; + bool suppressEditCallbacks; void closeEvent(QCloseEvent *event); bool eventFilter(QObject *obj, QEvent *event); diff --git a/ui/dbcmessageeditor.ui b/ui/dbcmessageeditor.ui index c4b3a2a..7ce6554 100644 --- a/ui/dbcmessageeditor.ui +++ b/ui/dbcmessageeditor.ui @@ -78,7 +78,11 @@ - + + + true + +