From 27ab4aade7877bbe9a989664e65168af59c99bcb Mon Sep 17 00:00:00 2001 From: Collin Kidder Date: Tue, 9 Jun 2015 20:40:54 -0400 Subject: [PATCH] More implementation of signal/message editing --- dbchandler.cpp | 14 +++++ dbchandler.h | 1 + dbcmaineditor.cpp | 127 +++++++++++++++++++++++++++++++++++++++++++- dbcsignaleditor.cpp | 7 ++- 4 files changed, 145 insertions(+), 4 deletions(-) diff --git a/dbchandler.cpp b/dbchandler.cpp index 9c4fc5e..31d58fb 100644 --- a/dbchandler.cpp +++ b/dbchandler.cpp @@ -288,11 +288,25 @@ DBC_MESSAGE *DBCHandler::findMsgByID(int id) DBC_MESSAGE *DBCHandler::findMsgByIdx(int idx) { + if (dbc_messages.length() == 0) return NULL; if (idx < 0) return NULL; if (idx >= dbc_messages.count()) return NULL; return &dbc_messages[idx]; } +DBC_MESSAGE *DBCHandler::findMsgByName(QString name) +{ + if (dbc_messages.length() == 0) return NULL; + for (int i = 0; i < dbc_messages.length(); i++) + { + if (dbc_messages[i].name.compare(name, Qt::CaseInsensitive)) + { + return &dbc_messages[i]; + } + } + return NULL; +} + DBC_SIGNAL *DBCHandler::findSignalByName(DBC_MESSAGE *msg, QString name) { if (msg == NULL) return NULL; diff --git a/dbchandler.h b/dbchandler.h index 7ccdbc9..796f193 100644 --- a/dbchandler.h +++ b/dbchandler.h @@ -23,6 +23,7 @@ public: DBC_MESSAGE *findMsgByID(int id); DBC_MESSAGE *findMsgByIdx(int idx); + DBC_MESSAGE *findMsgByName(QString name); DBC_SIGNAL *findSignalByName(DBC_MESSAGE *msg, QString name); DBC_SIGNAL *findSignalByIdx(DBC_MESSAGE *msg, int idx); diff --git a/dbcmaineditor.cpp b/dbcmaineditor.cpp index cee8d6c..302d4fe 100644 --- a/dbcmaineditor.cpp +++ b/dbcmaineditor.cpp @@ -120,6 +120,125 @@ void DBCMainEditor::onCellChangedNode(int row,int col) void DBCMainEditor::onCellChangedMessage(int row,int col) { if (inhibitCellChanged) return; + + QTableWidgetItem *replacement = NULL; + int msgID; + QString msgName; + int msgLen; + QString msgComment; + DBC_NODE *node = dbcHandler->findNodeByIdx(ui->NodesTable->currentRow()); + if (node == NULL) dbcHandler->findNodeByIdx(0); + + switch(col) + { + case 0: //msg id + msgID = ui->MessagesTable->item(row, col)->text().toInt(NULL, 16); + if (row == ui->MessagesTable->rowCount() - 1) //new record + { + DBC_MESSAGE newMsg; + if (dbcHandler->findMsgByID(msgID) != NULL) + { + QMessageBox msg; + msg.setText("An existing msg with that ID already exists! Aborting!"); + msg.show(); + return; + } + newMsg.ID = msgID; + newMsg.name = ""; + newMsg.sender = node; + dbcHandler->dbc_messages.append(newMsg); + } + else //editing an existing record + { + DBC_MESSAGE *msg = dbcHandler->findMsgByIdx(row); + msg->ID = msgID; + } + inhibitCellChanged = true; + replacement = new QTableWidgetItem(QString::number(msgID, 16)); + ui->MessagesTable->setItem(row, col, replacement); + inhibitCellChanged = false; + break; + + case 1: //msg name + msgName = ui->MessagesTable->item(row, col)->text().simplified().replace(' ', '_'); + if (msgName.length() == 0) return; + if (row == ui->MessagesTable->rowCount() - 1) //new record + { + DBC_MESSAGE newMsg; + if (dbcHandler->findMsgByName(msgName) != NULL) + { + QMessageBox msg; + msg.setText("An existing msg with that name already exists! Aborting!"); + msg.show(); + return; + } + newMsg.ID = -1; + newMsg.name = msgName; + newMsg.sender = node; + dbcHandler->dbc_messages.append(newMsg); + } + else + { + DBC_MESSAGE *msg = dbcHandler->findMsgByIdx(row); + msg->name = msgName; + } + inhibitCellChanged = true; + replacement = new QTableWidgetItem(msgName); + ui->MessagesTable->setItem(row, col, replacement); + inhibitCellChanged = false; + break; + + case 2: //data length + msgLen = ui->MessagesTable->item(row, col)->text().toInt(); + if (msgLen < 0) msgLen = 0; + if (msgLen > 8) msgLen = 8; + if (row == ui->MessagesTable->rowCount() - 1) //new record + { + DBC_MESSAGE newMsg; + newMsg.ID = -1; + newMsg.name = ""; + newMsg.len = msgLen; + newMsg.sender = node; + dbcHandler->dbc_messages.append(newMsg); + } + else //editing an existing record + { + DBC_MESSAGE *msg = dbcHandler->findMsgByIdx(row); + msg->len = msgLen; + } + inhibitCellChanged = true; + replacement = new QTableWidgetItem(QString::number(msgLen, 16)); + ui->MessagesTable->setItem(row, col, replacement); + inhibitCellChanged = false; + + break; + case 3: //signals (number) - we don't handle anything here. User cannot directly change this value + break; + case 4: //comment + msgComment = ui->MessagesTable->item(row, col)->text().simplified(); + if (row == ui->MessagesTable->rowCount() - 1) //new record + { + DBC_MESSAGE newMsg; + newMsg.ID = -1; + newMsg.name = ""; + newMsg.len = 0; + newMsg.comment = msgComment; + newMsg.sender = node; + dbcHandler->dbc_messages.append(newMsg); + } + else //editing an existing record + { + DBC_MESSAGE *msg = dbcHandler->findMsgByIdx(row); + msg->comment = msgComment; + } + inhibitCellChanged = true; + replacement = new QTableWidgetItem(msgComment); + ui->MessagesTable->setItem(row, col, replacement); + inhibitCellChanged = false; + break; + + } + if (row == ui->MessagesTable->rowCount() - 1) { ui->MessagesTable->insertRow(ui->MessagesTable->rowCount()); @@ -129,19 +248,21 @@ void DBCMainEditor::onCellChangedMessage(int row,int col) void DBCMainEditor::onCellClickedNode(int row, int col) { //reload messages list if the currently selected row has changed. - qDebug() << "Entered at row " << row << " col " << col; + qDebug() << "Clicked at row " << row << " col " << col; if (row != currRow) { currRow = row; QTableWidgetItem *item = ui->NodesTable->item(currRow, 0); QString nodeName; - if (nodeName == NULL) return; + if (item == NULL) return; nodeName = item->text(); qDebug() << "Trying to find node with name " << nodeName; DBC_NODE *node = dbcHandler->findNodeByName(nodeName); //qDebug() << "Address of node: " << (int)node; + inhibitCellChanged = true; refreshMessagesTable(node); + inhibitCellChanged = false; } } @@ -183,6 +304,8 @@ void DBCMainEditor::refreshMessagesTable(const DBC_NODE *node) ui->MessagesTable->clearContents(); ui->MessagesTable->setRowCount(0); + qDebug() << "In refreshMessagesTable"; + int rowIdx; if (node != NULL) diff --git a/dbcsignaleditor.cpp b/dbcsignaleditor.cpp index 7ea0975..20bf064 100644 --- a/dbcsignaleditor.cpp +++ b/dbcsignaleditor.cpp @@ -46,8 +46,11 @@ void DBCSignalEditor::showEvent(QShowEvent* event) QDialog::showEvent(event); refreshSignalsList(); - fillSignalForm(&dbcMessage->msgSignals[0]); - fillValueTable(&dbcMessage->msgSignals[0]); + if (dbcMessage->msgSignals.count() > 0) + { + fillSignalForm(&dbcMessage->msgSignals[0]); + fillValueTable(&dbcMessage->msgSignals[0]); + } } void DBCSignalEditor::refreshSignalsList()