forked from qt-creator/qt-creator
ModelEditor: Improve performance of loading large models
Change-Id: Ic162d4805827cae9d34d7af9b6d56f3580b0f41d Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
This commit is contained in:
@@ -43,6 +43,47 @@
|
|||||||
|
|
||||||
namespace qmt {
|
namespace qmt {
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
struct IconKey {
|
||||||
|
IconKey(StereotypeIcon::Element element, const QList<QString> &stereotypes, const QString &defaultIconPath,
|
||||||
|
const Uid &styleUid, const QSize &size, const QMarginsF &margins, qreal lineWidth)
|
||||||
|
: m_element(element),
|
||||||
|
m_stereotypes(stereotypes),
|
||||||
|
m_defaultIconPath(defaultIconPath),
|
||||||
|
m_styleUid(styleUid),
|
||||||
|
m_size(size),
|
||||||
|
m_margins(margins),
|
||||||
|
m_lineWidth(lineWidth)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
const StereotypeIcon::Element m_element;
|
||||||
|
const QList<QString> m_stereotypes;
|
||||||
|
const QString m_defaultIconPath;
|
||||||
|
const Uid m_styleUid;
|
||||||
|
const QSize m_size;
|
||||||
|
const QMarginsF m_margins;
|
||||||
|
const qreal m_lineWidth;
|
||||||
|
};
|
||||||
|
|
||||||
|
bool operator==(const IconKey &lhs, const IconKey &rhs) {
|
||||||
|
return lhs.m_element == rhs.m_element
|
||||||
|
&& lhs.m_stereotypes == rhs.m_stereotypes
|
||||||
|
&& lhs.m_defaultIconPath == rhs.m_defaultIconPath
|
||||||
|
&& lhs.m_styleUid == rhs.m_styleUid
|
||||||
|
&& lhs.m_size == rhs.m_size
|
||||||
|
&& lhs.m_margins == rhs.m_margins
|
||||||
|
&& lhs.m_lineWidth == rhs.m_lineWidth;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint qHash(const IconKey &key) {
|
||||||
|
return ::qHash(key.m_element) + qHash(key.m_stereotypes) + qHash(key.m_defaultIconPath)
|
||||||
|
+ qHash(key.m_styleUid) + ::qHash(key.m_size.width()) + ::qHash(key.m_size.height());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
class StereotypeController::StereotypeControllerPrivate
|
class StereotypeController::StereotypeControllerPrivate
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@@ -51,6 +92,7 @@ public:
|
|||||||
QHash<QString, CustomRelation> m_relationIdToCustomRelationMap;
|
QHash<QString, CustomRelation> m_relationIdToCustomRelationMap;
|
||||||
QList<Toolbar> m_toolbars;
|
QList<Toolbar> m_toolbars;
|
||||||
QList<Toolbar> m_elementToolbars;
|
QList<Toolbar> m_elementToolbars;
|
||||||
|
QHash<IconKey, QIcon> m_iconMap;
|
||||||
};
|
};
|
||||||
|
|
||||||
StereotypeController::StereotypeController(QObject *parent) :
|
StereotypeController::StereotypeController(QObject *parent) :
|
||||||
@@ -131,9 +173,10 @@ QIcon StereotypeController::createIcon(StereotypeIcon::Element element, const QL
|
|||||||
const QString &defaultIconPath, const Style *style, const QSize &size,
|
const QString &defaultIconPath, const Style *style, const QSize &size,
|
||||||
const QMarginsF &margins, qreal lineWidth)
|
const QMarginsF &margins, qreal lineWidth)
|
||||||
{
|
{
|
||||||
// TODO implement cache with key build from element, stereotypes, defaultIconPath, style, size and margins
|
IconKey key(element, stereotypes, defaultIconPath, style->uid(), size, margins, lineWidth);
|
||||||
// TODO implement unique id for style which can be used as key
|
QIcon icon = d->m_iconMap.value(key);
|
||||||
QIcon icon;
|
if (!icon.isNull())
|
||||||
|
return icon;
|
||||||
QString stereotypeIconId = findStereotypeIconId(element, stereotypes);
|
QString stereotypeIconId = findStereotypeIconId(element, stereotypes);
|
||||||
if (!stereotypeIconId.isEmpty()) {
|
if (!stereotypeIconId.isEmpty()) {
|
||||||
StereotypeIcon stereotypeIcon = findStereotypeIcon(stereotypeIconId);
|
StereotypeIcon stereotypeIcon = findStereotypeIcon(stereotypeIconId);
|
||||||
@@ -202,6 +245,7 @@ QIcon StereotypeController::createIcon(StereotypeIcon::Element element, const QL
|
|||||||
}
|
}
|
||||||
if (icon.isNull() && !defaultIconPath.isEmpty())
|
if (icon.isNull() && !defaultIconPath.isEmpty())
|
||||||
icon = QIcon(defaultIconPath);
|
icon = QIcon(defaultIconPath);
|
||||||
|
d->m_iconMap.insert(key, icon);
|
||||||
return icon;
|
return icon;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -26,6 +26,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "qmt/infrastructure/qmt_global.h"
|
#include "qmt/infrastructure/qmt_global.h"
|
||||||
|
#include "qmt/infrastructure/uid.h"
|
||||||
|
|
||||||
#include <QString>
|
#include <QString>
|
||||||
#include <QPen>
|
#include <QPen>
|
||||||
@@ -45,6 +46,7 @@ public:
|
|||||||
explicit Style(Type type);
|
explicit Style(Type type);
|
||||||
virtual ~Style();
|
virtual ~Style();
|
||||||
|
|
||||||
|
Uid uid() const { return m_uid; }
|
||||||
Type type() const { return m_type; }
|
Type type() const { return m_type; }
|
||||||
QPen linePen() const { return m_linePen; }
|
QPen linePen() const { return m_linePen; }
|
||||||
void setLinePen(const QPen &pen);
|
void setLinePen(const QPen &pen);
|
||||||
@@ -68,6 +70,7 @@ public:
|
|||||||
void setHeaderFont(const QFont &font);
|
void setHeaderFont(const QFont &font);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
Uid m_uid;
|
||||||
Type m_type;
|
Type m_type;
|
||||||
QPen m_linePen;
|
QPen m_linePen;
|
||||||
QPen m_outerLinePen;
|
QPen m_outerLinePen;
|
||||||
|
Reference in New Issue
Block a user