aboutsummaryrefslogtreecommitdiffstats
path: root/src/libs/modelinglib
diff options
context:
space:
mode:
authorJochen Becher <jochen_becher@gmx.de>2018-10-01 21:25:13 +0200
committerJochen Becher <jochen_becher@gmx.de>2018-10-08 17:08:55 +0000
commite07ea0c811a022b63ae4e37cc4d0265968be159a (patch)
treee844250a8c230b2d3a409b1023104b76e160312d /src/libs/modelinglib
parente8625433bebeeaa960fd8d683f5d34197cf07ecc (diff)
ModelEditor: Improve performance
Use an additional hash map finding elements on diagram faster. Change-Id: I91adf9e3d0f79662895ffa61ca616438100529d6 Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
Diffstat (limited to 'src/libs/modelinglib')
-rw-r--r--src/libs/modelinglib/qmt/diagram_controller/dupdatevisitor.cpp3
-rw-r--r--src/libs/modelinglib/qmt/model/mdiagram.cpp18
-rw-r--r--src/libs/modelinglib/qmt/model/mdiagram.h2
3 files changed, 13 insertions, 10 deletions
diff --git a/src/libs/modelinglib/qmt/diagram_controller/dupdatevisitor.cpp b/src/libs/modelinglib/qmt/diagram_controller/dupdatevisitor.cpp
index 4b99d5e69a..6b3695f1ba 100644
--- a/src/libs/modelinglib/qmt/diagram_controller/dupdatevisitor.cpp
+++ b/src/libs/modelinglib/qmt/diagram_controller/dupdatevisitor.cpp
@@ -152,12 +152,11 @@ void DUpdateVisitor::visitMRelation(const MRelation *relation)
drelation->setStereotypes(relation->stereotypes());
if (isUpdating(relation->name() != drelation->name()))
drelation->setName(relation->name());
- // TODO improve performance of MDiagram::findDiagramElement
DObject *endAObject = dynamic_cast<DObject *>(m_diagram->findDiagramElement(drelation->endAUid()));
if (!endAObject || relation->endAUid() != endAObject->modelUid()) {
(void) isUpdating(true);
endAObject = nullptr;
- // TODO use DiagramController::findDelegate (and improve performance of that method)
+ // TODO use DiagramController::findDelegate
foreach (DElement *diagramElement, m_diagram->diagramElements()) {
if (diagramElement->modelUid().isValid() && diagramElement->modelUid() == relation->endAUid()) {
endAObject = dynamic_cast<DObject *>(diagramElement);
diff --git a/src/libs/modelinglib/qmt/model/mdiagram.cpp b/src/libs/modelinglib/qmt/model/mdiagram.cpp
index 7f9d7e8789..dbd8487ed9 100644
--- a/src/libs/modelinglib/qmt/model/mdiagram.cpp
+++ b/src/libs/modelinglib/qmt/model/mdiagram.cpp
@@ -40,7 +40,7 @@ MDiagram::MDiagram()
MDiagram::MDiagram(const MDiagram &rhs)
: MObject(rhs),
- m_elements(),
+ // no deep copy
// modification date is copied (instead of set to current time) to allow exact copies of the diagram
m_lastModified(rhs.m_lastModified),
m_toolbarId(rhs.toolbarId())
@@ -66,17 +66,15 @@ MDiagram &MDiagram::operator=(const MDiagram &rhs)
DElement *MDiagram::findDiagramElement(const Uid &key) const
{
- // PERFORM introduce map for better performance
- foreach (DElement *element, m_elements) {
- if (element->uid() == key)
- return element;
- }
- return nullptr;
+ return m_elementMap.value(key);
}
void MDiagram::setDiagramElements(const QList<DElement *> &elements)
{
m_elements = elements;
+ m_elementMap.clear();
+ for (DElement *element : elements)
+ m_elementMap.insert(element->uid(), element);
}
void MDiagram::addDiagramElement(DElement *element)
@@ -84,6 +82,7 @@ void MDiagram::addDiagramElement(DElement *element)
QMT_ASSERT(element, return);
m_elements.append(element);
+ m_elementMap.insert(element->uid(), element);
}
void MDiagram::insertDiagramElement(int beforeElement, DElement *element)
@@ -91,13 +90,16 @@ void MDiagram::insertDiagramElement(int beforeElement, DElement *element)
QMT_ASSERT(beforeElement >= 0 && beforeElement <= m_elements.size(), return);
m_elements.insert(beforeElement, element);
+ m_elementMap.insert(element->uid(), element);
}
void MDiagram::removeDiagramElement(int index)
{
QMT_ASSERT(index >= 0 && index < m_elements.size(), return);
- delete m_elements.at(index);
+ DElement *element = m_elements.at(index);
+ m_elementMap.remove(element->uid());
+ delete element;
m_elements.removeAt(index);
}
diff --git a/src/libs/modelinglib/qmt/model/mdiagram.h b/src/libs/modelinglib/qmt/model/mdiagram.h
index 41f54cfec2..879b7c0021 100644
--- a/src/libs/modelinglib/qmt/model/mdiagram.h
+++ b/src/libs/modelinglib/qmt/model/mdiagram.h
@@ -27,6 +27,7 @@
#include "mobject.h"
+#include <QHash>
#include <QDateTime>
namespace qmt {
@@ -63,6 +64,7 @@ public:
private:
QList<DElement *> m_elements;
+ QHash<Uid, DElement *> m_elementMap;
QDateTime m_lastModified;
QString m_toolbarId;
};