Added ability to delete nodes, messages, signals within tree.

This commit is contained in:
Collin Kidder
2020-07-26 14:49:08 -04:00
parent 1a1ccb5fec
commit 4cfb4b903a
3 changed files with 187 additions and 32 deletions
+20 -6
View File
@@ -46,9 +46,16 @@ bool DBCSignalHandler::addSignal(DBC_SIGNAL &sig)
bool DBCSignalHandler::removeSignal(DBC_SIGNAL *sig)
{
Q_UNUSED(sig)
//if (sigs.removeAll(*sig) > 0) return true;
return false;
qDebug() << "Total # of signals: " << getCount();
for (int i = 0; i < getCount(); i++)
{
if (sigs[i].name == sig->name)
{
sigs.removeAt(i);
qDebug() << "Removed signal at idx " << i;
}
}
return true;
}
bool DBCSignalHandler::removeSignal(int idx)
@@ -173,9 +180,16 @@ bool DBCMessageHandler::addMessage(DBC_MESSAGE &msg)
bool DBCMessageHandler::removeMessage(DBC_MESSAGE *msg)
{
Q_UNUSED(msg);
//if (messages.removeAll(*msg) > 0) return true;
return false;
qDebug() << "Total # of messages: " << getCount();
for (int i = 0; i < getCount(); i++)
{
if (messages[i].name == msg->name)
{
messages.removeAt(i);
qDebug() << "Removed message at idx " << i;
}
}
return true;
}
bool DBCMessageHandler::removeMessageByIndex(int idx)
+160 -26
View File
@@ -93,6 +93,17 @@ bool DBCMainEditor::eventFilter(QObject *obj, QEvent *event)
case Qt::Key_F4:
handleSearchBackward();
break;
case Qt::Key_F5:
newNode();
break;
case Qt::Key_F6:
newMessage();
break;
case Qt::Key_F7:
newSignal();
break;
case Qt::Key_Delete:
deleteCurrentTreeItem();
}
return true;
} else {
@@ -280,6 +291,9 @@ void DBCMainEditor::refreshTree()
nodeToItem.clear();
messageToItem.clear();
signalToItem.clear();
itemToNode.clear();
itemToMessage.clear();
itemToSignal.clear();
if (dbcFile->findNodeByName("Vector__XXX") == nullptr)
{
@@ -299,6 +313,7 @@ void DBCMainEditor::refreshTree()
nodeItem->setIcon(0, nodeIcon);
nodeItem->setData(0, Qt::UserRole, 1);
nodeToItem.insert(node, nodeItem);
itemToNode.insert(nodeItem, node);
for (int x = 0; x < dbcFile->messageHandler->getCount(); x++)
{
DBC_MESSAGE *msg = dbcFile->messageHandler->findMsgByIdx(x);
@@ -311,6 +326,7 @@ void DBCMainEditor::refreshTree()
msgItem->setIcon(0, messageIcon);
msgItem->setData(0, Qt::UserRole, 2);
messageToItem.insert(msg, msgItem);
itemToMessage.insert(msgItem, msg);
for (int i = 0; i < msg->sigHandler->getCount(); i++)
{
DBC_SIGNAL *sig = msg->sigHandler->findSignalByIdx(i);
@@ -323,6 +339,7 @@ void DBCMainEditor::refreshTree()
else sigItem->setIcon(0, signalIcon);
sigItem->setData(0, Qt::UserRole, 3);
signalToItem.insert(sig, sigItem);
itemToSignal.insert(sigItem, sig);
}
}
}
@@ -352,7 +369,7 @@ void DBCMainEditor::updatedMessage(DBC_MESSAGE *msg)
if (msg->comment.count() > 0) msgInfo.append(" - ").append(msg->comment);
item->setText(0, msgInfo);
}
else qDebug() << "Shit?! That mesage doesn't exist. That's a bug dude.";
else qDebug() << "That mesage doesn't exist. That's a bug dude.";
}
void DBCMainEditor::updatedSignal(DBC_SIGNAL *sig)
@@ -364,7 +381,7 @@ void DBCMainEditor::updatedSignal(DBC_SIGNAL *sig)
if (sig->comment.count() > 0) sigInfo.append(" - ").append(sig->comment);
item->setText(0, sigInfo);
}
else qDebug() << "Shit?! That signal doesn't exist. That's a bug dude.";
else qDebug() << "That signal doesn't exist. That's a bug dude.";
}
void DBCMainEditor::newNode()
@@ -379,6 +396,7 @@ void DBCMainEditor::newNode()
nodeItem->setIcon(0, nodeIcon);
nodeItem->setData(0, Qt::UserRole, 1);
nodeToItem.insert(nodePtr, nodeItem);
itemToNode.insert(nodeItem, nodePtr);
ui->treeDBC->addTopLevelItem(nodeItem);
ui->treeDBC->setCurrentItem(nodeItem);
}
@@ -391,6 +409,7 @@ void DBCMainEditor::newMessage()
QTreeWidgetItem *msgItem = nullptr;
nodeItem = ui->treeDBC->currentItem();
int typ = nodeItem->data(0, Qt::UserRole).toInt();
if (!nodeItem) return; //nothing selected!
if (typ == 2)
{
msgItem = nodeItem;
@@ -443,6 +462,7 @@ void DBCMainEditor::newMessage()
newMsgItem->setIcon(0, messageIcon);
newMsgItem->setData(0, Qt::UserRole, 2);
messageToItem.insert(msgPtr, newMsgItem);
itemToMessage.insert(newMsgItem, msgPtr);
nodeItem->addChild(newMsgItem);
ui->treeDBC->setCurrentItem(newMsgItem);
}
@@ -452,7 +472,9 @@ void DBCMainEditor::newSignal()
QTreeWidgetItem *msgItem = nullptr;
QTreeWidgetItem *sigItem = nullptr;
msgItem = ui->treeDBC->currentItem();
if (!msgItem) return; //nothing selected!
int typ = msgItem->data(0, Qt::UserRole).toInt();
if (typ == 1) return; //can't add signals to a node!
if (typ == 3)
{
sigItem = msgItem;
@@ -482,6 +504,7 @@ void DBCMainEditor::newSignal()
sig.name = msgItem->text(0).split(" ")[1] + "Sig" + QString::number(randGen.bounded(500));
}
sig.parentMessage = msg;
msg->sigHandler->addSignal(sig);
sigPtr = msg->sigHandler->findSignalByIdx(msg->sigHandler->getCount() - 1);
QTreeWidgetItem *newSigItem = new QTreeWidgetItem();
@@ -493,39 +516,150 @@ void DBCMainEditor::newSignal()
else newSigItem->setIcon(0, signalIcon);
newSigItem->setData(0, Qt::UserRole, 3);
signalToItem.insert(sigPtr, newSigItem);
itemToSignal.insert(newSigItem, sigPtr);
msgItem->addChild(newSigItem);
ui->treeDBC->setCurrentItem(newSigItem);
}
//gets confirmation before calling the real routines that delete things
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)
QTreeWidgetItem *currItem = ui->treeDBC->currentItem();
int typ = currItem->data(0, Qt::UserRole).toInt();
QString idString;
int msgID;
DBC_MESSAGE *msg;
DBC_NODE *node;
int numMsg = 0, numSig = 0;
QMessageBox::StandardButton confirmDialog;
switch (typ)
{
ui->NodesTable->removeRow(thisRow);
dbcFile->dbc_nodes.removeAt(thisRow);
inhibitCellChanged = true;
refreshMessagesTable(&dbcFile->dbc_nodes[0]);
ui->NodesTable->selectRow(0);
inhibitCellChanged = false;
} */
case 1: //deleting a node cascades deletion down to messages and signals
node = dbcFile->findNodeByName(currItem->text(0));
if (!node) return;
for (int x = 0; x < dbcFile->messageHandler->getCount(); x++)
{
if (dbcFile->messageHandler->findMsgByIdx(x)->sender == node)
{
numMsg++;
numSig += dbcFile->messageHandler->findMsgByIdx(x)->sigHandler->getCount();
}
}
confirmDialog = QMessageBox::question(this, "Really?", "Are you sure you want to delete this node, its\n"
+ QString::number(numMsg) + " messages, and their " + QString::number(numSig) + " combined signals?", QMessageBox::Yes|QMessageBox::No);
if (confirmDialog == QMessageBox::Yes)
{
if (itemToNode.contains(currItem))
{
DBC_NODE *node = itemToNode.value(currItem);
deleteNode(node);
}
else
{
qDebug() << "WTF, could not find the node in the map. That should not happen.";
}
}
break;
case 2: //cascades to removing all signals too.
idString = currItem->text(0).split(" ")[0];
msgID = static_cast<uint32_t>(Utility::ParseStringToNum(idString));
msg = dbcFile->messageHandler->findMsgByID(msgID);
confirmDialog = QMessageBox::question(this, "Really?", "Are you sure you want to delete\nthis message and its "
+ QString::number(msg->sigHandler->getCount()) + " signals?", QMessageBox::Yes|QMessageBox::No);
if (confirmDialog == QMessageBox::Yes)
{
QTreeWidgetItem *currItem = ui->treeDBC->currentItem();
if (itemToMessage.contains(currItem))
{
DBC_MESSAGE *msg = itemToMessage.value(currItem);
deleteMessage(msg);
}
else
{
qDebug() << "WTF, could not find the message in the map. That should not happen.";
}
}
break;
case 3: //no cascade, just this one signal.
confirmDialog = QMessageBox::question(this, "Really?", "Are you sure you want to delete this signal?",
QMessageBox::Yes|QMessageBox::No);
if (confirmDialog == QMessageBox::Yes)
{
QTreeWidgetItem *currItem = ui->treeDBC->currentItem();
if (itemToSignal.contains(currItem))
{
DBC_SIGNAL *sig = itemToSignal.value(currItem);
deleteSignal(sig);
}
else
{
qDebug() << "WTF, could not find the signal in the map. That should not happen.";
}
}
break;
}
}
//void DBCMainEditor::deleteCurrentMessage()
//{
/*
int thisRow = ui->MessagesTable->currentRow();
QTableWidgetItem* thisItem = ui->MessagesTable->item(thisRow, 0);
if (!thisItem) return;
if (thisItem->text().length() > 0)
//these don't ask for permission. You call it, it disappears forever.
void DBCMainEditor::deleteNode(DBC_NODE *node)
{
qDebug() << "Going through with it you mass deleter!";
if (!nodeToItem.contains(node)) return;
QTreeWidgetItem *currItem = nodeToItem[node];
//don't actually store which messages are associated to which nodes so just iterate through the messages list and whack the ones
//that claim to be associated to this node.
int numItems = dbcFile->messageHandler->getCount();
for (int i = numItems - 1; i > -1; i--)
{
ui->MessagesTable->removeRow(thisRow);
dbcFile->messageHandler->removeMessageByIndex(thisRow);
if (dbcFile->messageHandler->findMsgByIdx(i)->sender == node) deleteMessage(dbcFile->messageHandler->findMsgByIdx(i));
}
*/
//}
for (int j = 0; j < dbcFile->dbc_nodes.count(); j++)
{
if (dbcFile->dbc_nodes.at(j).name == node->name) dbcFile->dbc_nodes.removeAt(j);
}
nodeToItem.remove(node);
itemToNode.remove(currItem);
ui->treeDBC->removeItemWidget(currItem, 0);
delete currItem;
}
void DBCMainEditor::deleteMessage(DBC_MESSAGE *msg)
{
qDebug() << "Deleting the message and all signals. Bye bye!";
if (!messageToItem.contains(msg)) return;
QTreeWidgetItem *currItem = messageToItem[msg];
int numItems = msg->sigHandler->getCount();
for (int i = numItems - 1; i > -1; i--)
{
deleteSignal(msg->sigHandler->findSignalByIdx(i));
}
dbcFile->messageHandler->removeMessage(msg);
itemToMessage.remove(currItem);
messageToItem.remove(msg);
ui->treeDBC->removeItemWidget(currItem, 0);
delete currItem;
}
void DBCMainEditor::deleteSignal(DBC_SIGNAL *sig)
{
qDebug() << "Signal about to vanish.";
if (!signalToItem.contains(sig)) return;
QTreeWidgetItem *currItem = signalToItem[sig];
sig->parentMessage->sigHandler->removeSignal(sig);
itemToSignal.remove(currItem);
signalToItem.remove(sig);
ui->treeDBC->removeItemWidget(currItem, 0);
delete currItem;
}
+7
View File
@@ -35,6 +35,9 @@ private slots:
void currentItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *prev);
void onCustomMenuTree(QPoint);
void deleteCurrentTreeItem();
void deleteNode(DBC_NODE *node);
void deleteMessage(DBC_MESSAGE *msg);
void deleteSignal(DBC_SIGNAL *sig);
void handleSearch();
void handleSearchForward();
void handleSearchBackward();
@@ -58,9 +61,13 @@ private:
QIcon multiplexedSignalIcon;
QList<QTreeWidgetItem *> searchItems;
int searchItemPos;
//bidirectional mapping of QTreeWidget items back and forth to DBC objects
QMap<DBC_NODE*, QTreeWidgetItem *> nodeToItem;
QMap<DBC_MESSAGE*, QTreeWidgetItem *> messageToItem;
QMap<DBC_SIGNAL*, QTreeWidgetItem *> signalToItem;
QMap<QTreeWidgetItem*, DBC_NODE*> itemToNode;
QMap<QTreeWidgetItem*, DBC_MESSAGE*> itemToMessage;
QMap<QTreeWidgetItem*, DBC_SIGNAL*> itemToSignal;
QRandomGenerator randGen;
void showEvent(QShowEvent* event);