ModelEditor: Improve performance on finding a model delegate

Change-Id: Ide45583093d1d95c433858fc57c8c6ff772783a7
Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
This commit is contained in:
Jochen Becher
2018-10-01 21:36:04 +02:00
parent e07ea0c811
commit 651f6c0b1b
3 changed files with 15 additions and 8 deletions

View File

@@ -429,18 +429,12 @@ DElement *DiagramController::findElement(const Uid &key, const MDiagram *diagram
bool DiagramController::hasDelegate(const MElement *modelElement, const MDiagram *diagram) const bool DiagramController::hasDelegate(const MElement *modelElement, const MDiagram *diagram) const
{ {
// PERFORM smarter implementation after map is introduced
return findDelegate(modelElement, diagram) != nullptr; return findDelegate(modelElement, diagram) != nullptr;
} }
DElement *DiagramController::findDelegate(const MElement *modelElement, const MDiagram *diagram) const DElement *DiagramController::findDelegate(const MElement *modelElement, const MDiagram *diagram) const
{ {
// PERFORM use map to increase performance return diagram->findDelegate(modelElement->uid());
foreach (DElement *diagramElement, diagram->diagramElements()) {
if (diagramElement->modelUid().isValid() && diagramElement->modelUid() == modelElement->uid())
return diagramElement;
}
return nullptr;
} }
void DiagramController::startUpdateElement(DElement *element, MDiagram *diagram, UpdateAction updateAction) void DiagramController::startUpdateElement(DElement *element, MDiagram *diagram, UpdateAction updateAction)

View File

@@ -69,12 +69,20 @@ DElement *MDiagram::findDiagramElement(const Uid &key) const
return m_elementMap.value(key); return m_elementMap.value(key);
} }
DElement *MDiagram::findDelegate(const Uid &modelUid) const
{
return m_modelUid2ElementMap.value(modelUid);
}
void MDiagram::setDiagramElements(const QList<DElement *> &elements) void MDiagram::setDiagramElements(const QList<DElement *> &elements)
{ {
m_elements = elements; m_elements = elements;
m_elementMap.clear(); m_elementMap.clear();
for (DElement *element : elements) m_modelUid2ElementMap.clear();
for (DElement *element : elements) {
m_elementMap.insert(element->uid(), element); m_elementMap.insert(element->uid(), element);
m_modelUid2ElementMap.insert(element->modelUid(), element);
}
} }
void MDiagram::addDiagramElement(DElement *element) void MDiagram::addDiagramElement(DElement *element)
@@ -83,6 +91,7 @@ void MDiagram::addDiagramElement(DElement *element)
m_elements.append(element); m_elements.append(element);
m_elementMap.insert(element->uid(), element); m_elementMap.insert(element->uid(), element);
m_modelUid2ElementMap.insert(element->modelUid(), element);
} }
void MDiagram::insertDiagramElement(int beforeElement, DElement *element) void MDiagram::insertDiagramElement(int beforeElement, DElement *element)
@@ -91,6 +100,7 @@ void MDiagram::insertDiagramElement(int beforeElement, DElement *element)
m_elements.insert(beforeElement, element); m_elements.insert(beforeElement, element);
m_elementMap.insert(element->uid(), element); m_elementMap.insert(element->uid(), element);
m_modelUid2ElementMap.insert(element->modelUid(), element);
} }
void MDiagram::removeDiagramElement(int index) void MDiagram::removeDiagramElement(int index)
@@ -99,6 +109,7 @@ void MDiagram::removeDiagramElement(int index)
DElement *element = m_elements.at(index); DElement *element = m_elements.at(index);
m_elementMap.remove(element->uid()); m_elementMap.remove(element->uid());
m_modelUid2ElementMap.remove(element->modelUid());
delete element; delete element;
m_elements.removeAt(index); m_elements.removeAt(index);
} }

View File

@@ -45,6 +45,7 @@ public:
const QList<DElement *> &diagramElements() const { return m_elements; } const QList<DElement *> &diagramElements() const { return m_elements; }
DElement *findDiagramElement(const Uid &key) const; DElement *findDiagramElement(const Uid &key) const;
DElement *findDelegate(const Uid &modelUid) const;
void setDiagramElements(const QList<DElement *> &elements); void setDiagramElements(const QList<DElement *> &elements);
void addDiagramElement(DElement *element); void addDiagramElement(DElement *element);
@@ -65,6 +66,7 @@ public:
private: private:
QList<DElement *> m_elements; QList<DElement *> m_elements;
QHash<Uid, DElement *> m_elementMap; QHash<Uid, DElement *> m_elementMap;
QHash<Uid, DElement *> m_modelUid2ElementMap;
QDateTime m_lastModified; QDateTime m_lastModified;
QString m_toolbarId; QString m_toolbarId;
}; };