10 #include "modules/MessageControl.h"
11 #include "modules/PluginControl.h"
13 #include <QMetaObject>
14 #include <QMetaMethod>
15 #include <QApplication>
17 #include "util/Commands.h"
24 this->project = project;
27 qRegisterMetaType<void *>(
"Entity *");
29 qUndoStack =
new QUndoStack(
this);
38 QString parentEntityId,
39 QMap<QString,QString>& atts,
54 sendEntityAddedMessageToPlugins(
"", ent);
66 QString parentEntityId,
73 project->
addEntity(entity, parentEntityId);
77 sendEntityAddedMessageToPlugins(
"", entity);
96 sendEntityRemovedMessageToPlugins(
"", entity);
98 QApplication::processEvents();
111 QMap<QString,QString>& atts,
122 sendEntityChangedMessageToPlugins(
"", ent);
128 QList<IPlugin*>::iterator it;
129 QList<IPlugin*> instances =
130 PluginControl::getInstance()->getPluginInstances(this->project);
132 QString slotName(
"updateFromModel()");
133 for (it = instances.begin(); it != instances.end(); it++)
136 int idxSlot = inst->metaObject()
137 ->indexOfSlot(slotName.toStdString().c_str());
140 QMetaMethod method = inst->metaObject()->method(idxSlot);
141 method.invoke(inst, Qt::DirectConnection);
147 QMap<QString,QString>& atts,
bool force)
155 if(plugin) pluginID = plugin->getPluginInstanceID();
156 else if (parser) pluginID = parser->getParserName();
164 qUndoStack->push(
new AddCommand(project, ent, parentEntityId));
167 sendEntityAddedMessageToPlugins(pluginID, ent);
174 parser->onEntityAddError(e.what());
189 QString pluginID = plugin->getPluginInstanceID();
193 qUndoStack->push(
new EditCommand(project, entity, atts));
199 sendEntityChangedMessageToPlugins(pluginID, entity);
218 QString pluginID = plugin->getPluginInstanceID();
226 QList <Entity*> willBeRemoved;
227 QStack <Entity*> stack;
236 Entity *currentEntity = stack.top();
241 willBeRemoved.push_back(currentEntity->
cloneEntity());
245 QVector <Entity *> children = currentEntity->getChildren();
246 for(
int i = 0; i < children.size(); i++)
248 stack.push(children.at(i));
256 for(
int i = willBeRemoved.size()-1; i >= 0; i--)
258 sendEntityRemovedMessageToPlugins(pluginID, willBeRemoved[i]);
260 delete willBeRemoved[i];
271 plugin->
errorMessage(tr(
"You have tried to remove a NULL entity!!"));
293 listenEntities[plugin->getPluginInstanceID()] = entityList;
301 void MessageControl::sendEntityAddedMessageToPlugins( QString pluginInstanceId,
304 QList<IPlugin*>::iterator it;
305 QList<IPlugin*> instances =
306 PluginControl::getInstance()->getPluginInstances(this->project);
308 QString slotName(
"onEntityAdded(QString,Entity*)");
310 for (it = instances.begin(); it != instances.end(); it++)
314 if(pluginIsInterestedIn(inst, entity))
316 int idxSlot = inst->metaObject()
317 ->indexOfSlot(slotName.toStdString().c_str());
320 QMetaMethod method = inst->metaObject()->method(idxSlot);
321 method.invoke(inst, Qt::DirectConnection,
322 Q_ARG(QString, pluginInstanceId),
328 emit entityAdded(pluginInstanceId, entity);
332 void MessageControl::sendEntityChangedMessageToPlugins(QString pluginInstanceId,
335 QList<IPlugin*>::iterator it;
336 QList<IPlugin*> instances =
337 PluginControl::getInstance()->getPluginInstances(this->project);
339 QString slotName(
"onEntityChanged(QString,Entity*)");
341 for (it = instances.begin(); it != instances.end(); it++)
345 if(pluginIsInterestedIn(inst, entity))
347 int idxSlot = inst->metaObject()
348 ->indexOfSlot(slotName.toStdString().c_str());
351 QMetaMethod method = inst->metaObject()->method(idxSlot);
352 method.invoke(inst, Qt::DirectConnection,
353 Q_ARG(QString, pluginInstanceId),
360 void MessageControl::sendEntityRemovedMessageToPlugins(QString pluginInstanceId,
363 QList<IPlugin*>::iterator it;
364 QList<IPlugin*> instances =
365 PluginControl::getInstance()->getPluginInstances(this->project);
367 QString slotName(
"onEntityRemoved(QString,QString)");
368 QString entityId = entity->getUniqueId();
370 for (it = instances.begin(); it != instances.end(); it++)
374 if(pluginIsInterestedIn(inst, entity))
376 int idxSlot = inst->metaObject()
377 ->indexOfSlot(slotName.toStdString().c_str());
380 QMetaMethod method = inst->metaObject()->method(idxSlot);
381 method.invoke(inst, Qt::DirectConnection,
382 Q_ARG(QString, pluginInstanceId),
383 Q_ARG(QString, entityId));
389 bool MessageControl::pluginIsInterestedIn(
IPlugin *plugin,
Entity *entity)
391 if(!listenEntities.contains(plugin->getPluginInstanceID()))
398 if(listenEntities.value(
399 plugin->getPluginInstanceID()).contains(entity->getType())
412 QString pluginId = plugin->getPluginInstanceID().left(
413 plugin->getPluginInstanceID().indexOf(
"#"));
423 void MessageControl::undo()
428 void MessageControl::redo()