diff --git a/dbcmaineditor.cpp b/dbcmaineditor.cpp index 118f07c..d51fcc1 100644 --- a/dbcmaineditor.cpp +++ b/dbcmaineditor.cpp @@ -5,6 +5,8 @@ #include #include +#define MT_COLUMN_COUNT 5 + DBCMainEditor::DBCMainEditor(DBCHandler *handler, const QVector *frames, QWidget *parent) : QDialog(parent), ui(new Ui::DBCMainEditor) @@ -26,7 +28,7 @@ DBCMainEditor::DBCMainEditor(DBCHandler *handler, const QVector *frame QStringList headers2; headers2 << "Msg ID" << "Msg Name" << "Data Len" << "Signals" << "Comment"; - ui->MessagesTable->setColumnCount(5); + ui->MessagesTable->setColumnCount(MT_COLUMN_COUNT); ui->MessagesTable->setColumnWidth(0, 80); ui->MessagesTable->setColumnWidth(1, 240); ui->MessagesTable->setColumnWidth(2, 80); @@ -210,49 +212,57 @@ void DBCMainEditor::onCellChangedNode(int row,int col) void DBCMainEditor::onCellChangedMessage(int row,int col) { + QTableWidgetItem* item = NULL; + bool ret = false; + DBC_MESSAGE *msg = NULL; + uint msgID; + if (inhibitCellChanged) return; - qDebug() << "Editing row: " << row << " col: " << col; - - QTableWidgetItem *replacement = NULL; - int msgID; - QString msgName; - int msgLen; - QString msgComment; - DBC_MESSAGE newMsg; DBC_NODE *node = dbcFile->findNodeByIdx(ui->NodesTable->currentRow()); - DBC_MESSAGE *msg; if (node == NULL) { qDebug() << "No node set?!? This is bad!"; return; - //dbcHandler->findNodeByIdx(0); } - msgID = Utility::ParseStringToNum(ui->MessagesTable->item(row, 0)->text()); - qDebug() << "Msg ID of edited: " << msgID; + item = ui->MessagesTable->item(row, 0); + if(!item) return; + + msgID = Utility::ParseStringToNum2(item->text(), &ret); msg = dbcFile->messageHandler->findMsgByID(msgID); switch(col) { - case 0: //msg id - if (row == ui->MessagesTable->rowCount() - 1) //new record - { - if (dbcFile->messageHandler->findMsgByID(msgID) != NULL) + case 0: //msg id + { + /* sanity checks */ + if(!ret) + { + /* bad message id */ + ui->MessagesTable->item(row, 0)->setText(""); + return; + } + if (msg != NULL) { QMessageBox msg; msg.setParent(0); msg.setText("An existing msg with that ID already exists! Aborting!"); msg.exec(); + + ui->MessagesTable->item(row, 0)->setText(""); return; } + + /* insert row */ + DBC_MESSAGE newMsg; newMsg.ID = msgID; newMsg.name = ""; newMsg.sender = node; newMsg.len = 0; for (int i = 0; i < referenceFrames->length(); i++) { - if (referenceFrames->at(i).ID == msgID) + if ((uint) referenceFrames->at(i).ID == msgID) { newMsg.len = referenceFrames->at(i).len; break; @@ -262,95 +272,65 @@ void DBCMainEditor::onCellChangedMessage(int row,int col) /* insert message in table */ inhibitCellChanged = true; - replacement = new QTableWidgetItem(Utility::formatNumber(msgID)); - replacement->setFlags(replacement->flags() ^ Qt::ItemIsEditable); - ui->MessagesTable->setItem(row, col, replacement); - replacement = new QTableWidgetItem(QString::number(newMsg.len)); - ui->MessagesTable->setItem(row, 2, 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 - { - if (dbcFile->messageHandler->findMsgByName(msgName) != NULL) + item = ui->MessagesTable->item(row, 0); + item->setFlags(item->flags() & ~Qt::ItemIsEditable); + item->setText(Utility::formatNumber(msgID)); + + for(int i=1 ; iMessagesTable->item(row, i); + item->setFlags(item->flags() | Qt::ItemIsEditable); + } + + /* set length */ + item = ui->MessagesTable->item(row, 2); + item->setText(QString::number(newMsg.len)); + + inhibitCellChanged = false; + + /* insert a new row */ + insertBlankRow(); + break; + } + case 1: //msg name + { + QString msgName = ui->MessagesTable->item(row, 1)->text().simplified().replace(' ', '_'); + if (msgName.length() == 0) return; + if( ret && (msg!=NULL) ) + msg->name = msgName; + break; + } + case 2: //data length + { + bool parseOk = false; + uint msgLen = ui->MessagesTable->item(row, col)->text().toUInt(&parseOk); + + /* sanity checks */ + if(!parseOk) + { + ui->MessagesTable->item(row, col)->setText(""); return; } - newMsg.ID = -1; - newMsg.name = msgName; - newMsg.sender = node; - dbcFile->messageHandler->addMessage(newMsg); - } - else - { - if (msg != NULL) msg->name = msgName; - } - inhibitCellChanged = true; - replacement = new QTableWidgetItem(msgName); - ui->MessagesTable->setItem(row, col, replacement); - inhibitCellChanged = false; - break; + if (msgLen > 8) + { + msgLen = 8; + ui->MessagesTable->item(row, col)->setText(QString::number(msgLen)); + } - 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; - dbcFile->messageHandler->addMessage(newMsg); + if( ret && (msg!=NULL) ) + msg->len = msgLen; + break; } - else //editing an existing record + case 3: //signals (number) - we don't handle anything here. User cannot directly change this value + break; + case 4: //comment { - if (msg != NULL) msg->len = msgLen; + QString msgComment = ui->MessagesTable->item(row, col)->text().simplified(); + if( ret && (msgComment!=NULL) ) + msg->comment = msgComment; + break; } - 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; - dbcFile->messageHandler->addMessage(newMsg); - } - else //editing an existing record - { - if (msg != NULL) 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()); } ui->MessagesTable->setCurrentCell(row, col); @@ -465,5 +445,17 @@ void DBCMainEditor::refreshMessagesTable(const DBC_NODE *node) } //insert blank record that can be used to add new messages - ui->MessagesTable->insertRow(ui->MessagesTable->rowCount()); + insertBlankRow(); +} + +void DBCMainEditor::insertBlankRow() +{ + int rowIdx = ui->MessagesTable->rowCount(); + ui->MessagesTable->insertRow(rowIdx); + for(int i=1 ; isetFlags(item->flags() & ~Qt::ItemIsEditable); + ui->MessagesTable->setItem(rowIdx, i, item); + } } diff --git a/dbcmaineditor.h b/dbcmaineditor.h index 07e8e11..4067693 100644 --- a/dbcmaineditor.h +++ b/dbcmaineditor.h @@ -46,6 +46,7 @@ private: void closeEvent(QCloseEvent *event); void readSettings(); void writeSettings(); + void insertBlankRow(); };