You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							122 lines
						
					
					
						
							3.8 KiB
						
					
					
				
			
		
		
	
	
							122 lines
						
					
					
						
							3.8 KiB
						
					
					
				| #include <QApplication>
 | |
| 
 | |
| #include "tools/cabana/commands.h"
 | |
| 
 | |
| // EditMsgCommand
 | |
| 
 | |
| EditMsgCommand::EditMsgCommand(const MessageId &id, const QString &name, int size, const QString &comment, QUndoCommand *parent)
 | |
|     : id(id), new_name(name), new_size(size), new_comment(comment), QUndoCommand(parent) {
 | |
|   if (auto msg = dbc()->msg(id)) {
 | |
|     old_name = msg->name;
 | |
|     old_size = msg->size;
 | |
|     old_comment = msg->comment;
 | |
|     setText(QObject::tr("edit message %1:%2").arg(name).arg(id.address));
 | |
|   } else {
 | |
|     setText(QObject::tr("new message %1:%2").arg(name).arg(id.address));
 | |
|   }
 | |
| }
 | |
| 
 | |
| void EditMsgCommand::undo() {
 | |
|   if (old_name.isEmpty())
 | |
|     dbc()->removeMsg(id);
 | |
|   else
 | |
|     dbc()->updateMsg(id, old_name, old_size, old_comment);
 | |
| }
 | |
| 
 | |
| void EditMsgCommand::redo() {
 | |
|   dbc()->updateMsg(id, new_name, new_size, new_comment);
 | |
| }
 | |
| 
 | |
| // RemoveMsgCommand
 | |
| 
 | |
| RemoveMsgCommand::RemoveMsgCommand(const MessageId &id, QUndoCommand *parent) : id(id), QUndoCommand(parent) {
 | |
|   if (auto msg = dbc()->msg(id)) {
 | |
|     message = *msg;
 | |
|     setText(QObject::tr("remove message %1:%2").arg(message.name).arg(id.address));
 | |
|   }
 | |
| }
 | |
| 
 | |
| void RemoveMsgCommand::undo() {
 | |
|   if (!message.name.isEmpty()) {
 | |
|     dbc()->updateMsg(id, message.name, message.size, message.comment);
 | |
|     for (auto s : message.getSignals())
 | |
|       dbc()->addSignal(id, *s);
 | |
|   }
 | |
| }
 | |
| 
 | |
| void RemoveMsgCommand::redo() {
 | |
|   if (!message.name.isEmpty())
 | |
|     dbc()->removeMsg(id);
 | |
| }
 | |
| 
 | |
| // AddSigCommand
 | |
| 
 | |
| AddSigCommand::AddSigCommand(const MessageId &id, const cabana::Signal &sig, QUndoCommand *parent)
 | |
|     : id(id), signal(sig), QUndoCommand(parent) {
 | |
|   setText(QObject::tr("add signal %1 to %2:%3").arg(sig.name).arg(msgName(id)).arg(id.address));
 | |
| }
 | |
| 
 | |
| void AddSigCommand::undo() {
 | |
|   dbc()->removeSignal(id, signal.name);
 | |
|   if (msg_created) dbc()->removeMsg(id);
 | |
| }
 | |
| 
 | |
| void AddSigCommand::redo() {
 | |
|   if (auto msg = dbc()->msg(id); !msg) {
 | |
|     msg_created = true;
 | |
|     dbc()->updateMsg(id, dbc()->newMsgName(id), can->lastMessage(id).dat.size(), "");
 | |
|   }
 | |
|   signal.name = dbc()->newSignalName(id);
 | |
|   signal.max = std::pow(2, signal.size) - 1;
 | |
|   dbc()->addSignal(id, signal);
 | |
| }
 | |
| 
 | |
| // RemoveSigCommand
 | |
| 
 | |
| RemoveSigCommand::RemoveSigCommand(const MessageId &id, const cabana::Signal *sig, QUndoCommand *parent)
 | |
|     : id(id), QUndoCommand(parent) {
 | |
|   sigs.push_back(*sig);
 | |
|   if (sig->type == cabana::Signal::Type::Multiplexor) {
 | |
|     for (const auto &s : dbc()->msg(id)->sigs) {
 | |
|       if (s->type == cabana::Signal::Type::Multiplexed) {
 | |
|         sigs.push_back(*s);
 | |
|       }
 | |
|     }
 | |
|   }
 | |
|   setText(QObject::tr("remove signal %1 from %2:%3").arg(sig->name).arg(msgName(id)).arg(id.address));
 | |
| }
 | |
| 
 | |
| void RemoveSigCommand::undo() { for (const auto &s : sigs) dbc()->addSignal(id, s); }
 | |
| void RemoveSigCommand::redo() { for (const auto &s : sigs) dbc()->removeSignal(id, s.name); }
 | |
| 
 | |
| // EditSignalCommand
 | |
| 
 | |
| EditSignalCommand::EditSignalCommand(const MessageId &id, const cabana::Signal *sig, const cabana::Signal &new_sig, QUndoCommand *parent)
 | |
|     : id(id), QUndoCommand(parent) {
 | |
|   sigs.push_back({*sig, new_sig});
 | |
|   if (sig->type == cabana::Signal::Type::Multiplexor && new_sig.type == cabana::Signal::Type::Normal) {
 | |
|     // convert all multiplexed signals to normal signals
 | |
|     auto msg = dbc()->msg(id);
 | |
|     assert(msg);
 | |
|     for (const auto &s : msg->sigs) {
 | |
|       if (s->type == cabana::Signal::Type::Multiplexed) {
 | |
|         auto new_s = *s;
 | |
|         new_s.type = cabana::Signal::Type::Normal;
 | |
|         sigs.push_back({*s, new_s});
 | |
|       }
 | |
|     }
 | |
|   }
 | |
|   setText(QObject::tr("edit signal %1 in %2:%3").arg(sig->name).arg(msgName(id)).arg(id.address));
 | |
| }
 | |
| 
 | |
| void EditSignalCommand::undo() { for (const auto &s : sigs) dbc()->updateSignal(id, s.second.name, s.first); }
 | |
| void EditSignalCommand::redo() { for (const auto &s : sigs) dbc()->updateSignal(id, s.first.name, s.second); }
 | |
| 
 | |
| namespace UndoStack {
 | |
| 
 | |
| QUndoStack *instance() {
 | |
|   static QUndoStack *undo_stack = new QUndoStack(qApp);
 | |
|   return undo_stack;
 | |
| }
 | |
| 
 | |
| }  // namespace UndoStack
 | |
| 
 |