From 1a1ccb5fec6e78c4623c052874dd3f8ef13dda5e Mon Sep 17 00:00:00 2001 From: Collin Kidder Date: Thu, 23 Jul 2020 21:52:43 -0400 Subject: [PATCH] Initial implementation of adding nodes, messages, signals with new tree style. --- dbc/dbcmaineditor.cpp | 238 ++++++++++++++++++++++++++++++++++++------ dbc/dbcmaineditor.h | 6 ++ 2 files changed, 212 insertions(+), 32 deletions(-) diff --git a/dbc/dbcmaineditor.cpp b/dbc/dbcmaineditor.cpp index 7dc2e10..47569b2 100644 --- a/dbc/dbcmaineditor.cpp +++ b/dbc/dbcmaineditor.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include #include "helpwindow.h" @@ -25,6 +26,11 @@ DBCMainEditor::DBCMainEditor( const QVector *frames, QWidget *parent) connect(ui->btnSearchNext, &QAbstractButton::clicked, this, &DBCMainEditor::handleSearchForward); connect(ui->btnSearchPrev, &QAbstractButton::clicked, this, &DBCMainEditor::handleSearchBackward); connect(ui->treeDBC, &QTreeWidget::doubleClicked, this, &DBCMainEditor::onTreeDoubleClicked); + connect(ui->treeDBC, &QTreeWidget::currentItemChanged, this, &DBCMainEditor::currentItemChanged); + connect(ui->btnDelete, &QAbstractButton::clicked, this, &DBCMainEditor::deleteCurrentTreeItem); + connect(ui->btnNewNode, &QAbstractButton::clicked, this, &DBCMainEditor::newNode); + connect(ui->btnNewMessage, &QAbstractButton::clicked, this, &DBCMainEditor::newMessage); + connect(ui->btnNewSignal, &QAbstractButton::clicked, this, &DBCMainEditor::newSignal); sigEditor = new DBCSignalEditor(this); msgEditor = new DBCMessageEditor(this); @@ -142,38 +148,6 @@ void DBCMainEditor::onCustomMenuTree(QPoint point) } -void DBCMainEditor::deleteCurrentTreeItem() -{ - /* - int thisRow = ui->NodesTable->currentRow(); - QTableWidgetItem* thisItem = ui->NodesTable->item(thisRow, 0); - if (!thisItem) return; - QString nodeName = thisItem->text(); - if (nodeName.length() > 0 && nodeName.compare("Vector__XXX", Qt::CaseInsensitive) != 0) - { - ui->NodesTable->removeRow(thisRow); - dbcFile->dbc_nodes.removeAt(thisRow); - inhibitCellChanged = true; - refreshMessagesTable(&dbcFile->dbc_nodes[0]); - ui->NodesTable->selectRow(0); - inhibitCellChanged = false; - } */ -} - -//void DBCMainEditor::deleteCurrentMessage() -//{ - /* - int thisRow = ui->MessagesTable->currentRow(); - QTableWidgetItem* thisItem = ui->MessagesTable->item(thisRow, 0); - if (!thisItem) return; - if (thisItem->text().length() > 0) - { - ui->MessagesTable->removeRow(thisRow); - dbcFile->messageHandler->removeMessageByIndex(thisRow); - } - */ -//} - void DBCMainEditor::handleSearch() { searchItems = ui->treeDBC->findItems(ui->lineSearch->text(),Qt::MatchContains | Qt::MatchRecursive); @@ -208,6 +182,43 @@ void DBCMainEditor::handleSearchBackward() ui->lblSearchPos->setText("Search Results: " + QString::number(searchItemPos + 1) + " of " + QString::number(searchItems.count())); } +void DBCMainEditor::currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *prev) +{ + Q_UNUSED(prev) + if (!current) + { + ui->btnNewMessage->setEnabled(false); + ui->btnNewSignal->setEnabled(false); + ui->btnDelete->setEnabled(false); + return; + } + switch (current->data(0, Qt::UserRole).toInt()) + { + case 1: //node + ui->btnNewNode->setEnabled(true); + ui->btnNewMessage->setEnabled(true); + ui->btnNewSignal->setEnabled(false); + ui->btnDelete->setEnabled(true); + break; + case 2: //message + ui->btnNewNode->setEnabled(true); + ui->btnNewMessage->setEnabled(true); + ui->btnNewSignal->setEnabled(true); + ui->btnDelete->setEnabled(true); + break; + case 3: //signal + ui->btnNewNode->setEnabled(true); + ui->btnNewMessage->setEnabled(true); + ui->btnNewSignal->setEnabled(true); + ui->btnDelete->setEnabled(true); + break; + default: + ui->btnNewMessage->setEnabled(false); + ui->btnNewSignal->setEnabled(false); + ui->btnDelete->setEnabled(false); + } +} + //Double clicking is interpreted as a desire to edit the given item. void DBCMainEditor::onTreeDoubleClicked(const QModelIndex &index) { @@ -355,3 +366,166 @@ void DBCMainEditor::updatedSignal(DBC_SIGNAL *sig) } else qDebug() << "Shit?! That signal doesn't exist. That's a bug dude."; } + +void DBCMainEditor::newNode() +{ + DBC_NODE node; + DBC_NODE *nodePtr; + node.name = "Unnamed" + QString::number(randGen.bounded(50000)); + dbcFile->dbc_nodes.append(node); + nodePtr = dbcFile->findNodeByName(node.name); + QTreeWidgetItem *nodeItem = new QTreeWidgetItem(); + nodeItem->setText(0, node.name); + nodeItem->setIcon(0, nodeIcon); + nodeItem->setData(0, Qt::UserRole, 1); + nodeToItem.insert(nodePtr, nodeItem); + ui->treeDBC->addTopLevelItem(nodeItem); + ui->treeDBC->setCurrentItem(nodeItem); +} + + +//create a new message with it's parent being the node we're currently within +void DBCMainEditor::newMessage() +{ + QTreeWidgetItem *nodeItem = nullptr; + QTreeWidgetItem *msgItem = nullptr; + nodeItem = ui->treeDBC->currentItem(); + int typ = nodeItem->data(0, Qt::UserRole).toInt(); + if (typ == 2) + { + msgItem = nodeItem; + nodeItem = nodeItem->parent(); + } + if (typ == 3) + { + msgItem = nodeItem->parent(); + nodeItem = msgItem->parent(); + } + + DBC_NODE *node = dbcFile->findNodeByName(nodeItem->data(0, Qt::DisplayRole).toString()); + DBC_MESSAGE msg; + DBC_MESSAGE *msgPtr; + if (msgItem) + { + QString idString = msgItem->text(0).split(" ")[0]; + int msgID = static_cast(Utility::ParseStringToNum(idString)); + DBC_MESSAGE *oldMsg = dbcFile->messageHandler->findMsgByID(msgID); + if (oldMsg) + { + msg.name = oldMsg->name + QString::number(randGen.bounded(1000)); + msg.ID = oldMsg->ID + 1; + msg.len = oldMsg->len; + msg.bgColor = oldMsg->bgColor; + msg.fgColor = oldMsg->fgColor; + msg.comment = oldMsg->comment; + } + else + { + msg.name = nodeItem->text(0) + "Msg" + QString::number(randGen.bounded(500)); + msg.ID = 0; + msg.len = 0; + } + } + else + { + msg.name = nodeItem->text(0) + "Msg" + QString::number(randGen.bounded(500)); + msg.ID = 0; + msg.len = 0; + } + msg.sender = node; + + dbcFile->messageHandler->addMessage(msg); + msgPtr = dbcFile->messageHandler->findMsgByIdx(dbcFile->messageHandler->getCount() - 1); + QTreeWidgetItem *newMsgItem = new QTreeWidgetItem(); + QString msgInfo = Utility::formatCANID(msg.ID) + " " + msg.name; + if (msg.comment.count() > 0) msgInfo.append(" - ").append(msg.comment); + newMsgItem->setText(0, msgInfo); + newMsgItem->setIcon(0, messageIcon); + newMsgItem->setData(0, Qt::UserRole, 2); + messageToItem.insert(msgPtr, newMsgItem); + nodeItem->addChild(newMsgItem); + ui->treeDBC->setCurrentItem(newMsgItem); +} + +void DBCMainEditor::newSignal() +{ + QTreeWidgetItem *msgItem = nullptr; + QTreeWidgetItem *sigItem = nullptr; + msgItem = ui->treeDBC->currentItem(); + int typ = msgItem->data(0, Qt::UserRole).toInt(); + if (typ == 3) + { + sigItem = msgItem; + msgItem = msgItem->parent(); + } + + QString idString = msgItem->text(0).split(" ")[0]; + int msgID = static_cast(Utility::ParseStringToNum(idString)); + DBC_MESSAGE *msg = dbcFile->messageHandler->findMsgByID(msgID); + DBC_SIGNAL sig; + DBC_SIGNAL *sigPtr; + if (sigItem) + { + DBC_SIGNAL *oldSig = msg->sigHandler->findSignalByName(sigItem->text(0).split(" ")[0]); + if (oldSig) + { + sig = *oldSig; //copy it all over + sig.name = sig.name + QString::number(randGen.bounded(100)); + } + else + { + sig.name = msgItem->text(0).split(" ")[1] + "Sig" + QString::number(randGen.bounded(500)); + } + } + else + { + sig.name = msgItem->text(0).split(" ")[1] + "Sig" + QString::number(randGen.bounded(500)); + } + + msg->sigHandler->addSignal(sig); + sigPtr = msg->sigHandler->findSignalByIdx(msg->sigHandler->getCount() - 1); + QTreeWidgetItem *newSigItem = new QTreeWidgetItem(); + QString sigInfo = sig.name; + if (sig.comment.count() > 0) sigInfo.append(" - ").append(sig.comment); + newSigItem->setText(0, sigInfo); + if (sig.isMultiplexed) newSigItem->setIcon(0, multiplexedSignalIcon); + else if (sig.isMultiplexor) newSigItem->setIcon(0, multiplexorSignalIcon); + else newSigItem->setIcon(0, signalIcon); + newSigItem->setData(0, Qt::UserRole, 3); + signalToItem.insert(sigPtr, newSigItem); + msgItem->addChild(newSigItem); + ui->treeDBC->setCurrentItem(newSigItem); + +} + +void DBCMainEditor::deleteCurrentTreeItem() +{ + /* + int thisRow = ui->NodesTable->currentRow(); + QTableWidgetItem* thisItem = ui->NodesTable->item(thisRow, 0); + if (!thisItem) return; + QString nodeName = thisItem->text(); + if (nodeName.length() > 0 && nodeName.compare("Vector__XXX", Qt::CaseInsensitive) != 0) + { + ui->NodesTable->removeRow(thisRow); + dbcFile->dbc_nodes.removeAt(thisRow); + inhibitCellChanged = true; + refreshMessagesTable(&dbcFile->dbc_nodes[0]); + ui->NodesTable->selectRow(0); + inhibitCellChanged = false; + } */ +} + +//void DBCMainEditor::deleteCurrentMessage() +//{ + /* + int thisRow = ui->MessagesTable->currentRow(); + QTableWidgetItem* thisItem = ui->MessagesTable->item(thisRow, 0); + if (!thisItem) return; + if (thisItem->text().length() > 0) + { + ui->MessagesTable->removeRow(thisRow); + dbcFile->messageHandler->removeMessageByIndex(thisRow); + } + */ +//} diff --git a/dbc/dbcmaineditor.h b/dbc/dbcmaineditor.h index b16e940..82cff20 100644 --- a/dbc/dbcmaineditor.h +++ b/dbc/dbcmaineditor.h @@ -5,6 +5,7 @@ #include #include #include +#include #include "dbchandler.h" #include "dbcsignaleditor.h" #include "dbcmessageeditor.h" @@ -31,11 +32,15 @@ public slots: private slots: void onTreeDoubleClicked(const QModelIndex &index); + void currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *prev); void onCustomMenuTree(QPoint); void deleteCurrentTreeItem(); void handleSearch(); void handleSearchForward(); void handleSearchBackward(); + void newNode(); + void newMessage(); + void newSignal(); private: Ui::DBCMainEditor *ui; @@ -56,6 +61,7 @@ private: QMap nodeToItem; QMap messageToItem; QMap signalToItem; + QRandomGenerator randGen; void showEvent(QShowEvent* event); void closeEvent(QCloseEvent *event);