diff options
Diffstat (limited to 'src/libs/modelinglib/qmt/style')
-rw-r--r-- | src/libs/modelinglib/qmt/style/defaultstyleengine.cpp | 201 | ||||
-rw-r--r-- | src/libs/modelinglib/qmt/style/defaultstyleengine.h | 8 | ||||
-rw-r--r-- | src/libs/modelinglib/qmt/style/relationvisuals.cpp | 58 | ||||
-rw-r--r-- | src/libs/modelinglib/qmt/style/relationvisuals.h | 42 | ||||
-rw-r--r-- | src/libs/modelinglib/qmt/style/stylecontroller.cpp | 6 | ||||
-rw-r--r-- | src/libs/modelinglib/qmt/style/stylecontroller.h | 4 | ||||
-rw-r--r-- | src/libs/modelinglib/qmt/style/styledrelation.cpp | 6 | ||||
-rw-r--r-- | src/libs/modelinglib/qmt/style/styledrelation.h | 6 | ||||
-rw-r--r-- | src/libs/modelinglib/qmt/style/styleengine.h | 4 |
9 files changed, 290 insertions, 45 deletions
diff --git a/src/libs/modelinglib/qmt/style/defaultstyleengine.cpp b/src/libs/modelinglib/qmt/style/defaultstyleengine.cpp index 74e91837dc..bce1804892 100644 --- a/src/libs/modelinglib/qmt/style/defaultstyleengine.cpp +++ b/src/libs/modelinglib/qmt/style/defaultstyleengine.cpp @@ -5,6 +5,7 @@ #include "defaultstyle.h" #include "objectvisuals.h" +#include "relationvisuals.h" #include "styledobject.h" #include "styledrelation.h" @@ -14,6 +15,7 @@ #include "qmt/diagram/ditem.h" #include "qmt/diagram/dannotation.h" #include "qmt/infrastructure/qmtassert.h" +#include "qmt/stereotype/customrelation.h" #include <utils/algorithm.h> @@ -73,25 +75,29 @@ bool operator==(const ObjectStyleKey &lhs, const ObjectStyleKey &rhs) class RelationStyleKey { public: - RelationStyleKey(StyleEngine::ElementType elementType = StyleEngine::TypeOther, - DObject::VisualPrimaryRole visualPrimaryRole = DObject::PrimaryRoleNormal) + RelationStyleKey(StyleEngine::ElementType elementType, const RelationVisuals &relationVisuals, + bool withObject = false) : m_elementType(elementType), - m_visualPrimaryRole(visualPrimaryRole) + m_relationVisuals(relationVisuals), + m_withObject(withObject) { } StyleEngine::ElementType m_elementType = StyleEngine::TypeOther; - DObject::VisualPrimaryRole m_visualPrimaryRole = DObject::PrimaryRoleNormal; + RelationVisuals m_relationVisuals; + bool m_withObject = false; }; size_t qHash(const RelationStyleKey &styleKey) { - return ::qHash(styleKey.m_elementType) ^ ::qHash(styleKey.m_visualPrimaryRole); + return ::qHash(styleKey.m_elementType) ^ qHash(styleKey.m_relationVisuals); } bool operator==(const RelationStyleKey &lhs, const RelationStyleKey &rhs) { - return lhs.m_elementType == rhs.m_elementType && lhs.m_visualPrimaryRole == rhs.m_visualPrimaryRole; + return lhs.m_elementType == rhs.m_elementType + && lhs.m_relationVisuals == rhs.m_relationVisuals + && lhs.m_withObject == rhs.m_withObject; } class AnnotationStyleKey @@ -253,34 +259,6 @@ const Style *DefaultStyleEngine::applyObjectStyle(const Style *baseStyle, StyleE return derivedStyle; } -static bool areStackingRoles(DObject::VisualPrimaryRole rhsPrimaryRole, - DObject::VisualSecondaryRole rhsSecondaryRole, - DObject::VisualPrimaryRole lhsPrimaryRole, - DObject::VisualSecondaryRole lhsSecondaryRols) -{ - switch (rhsSecondaryRole) { - case DObject::SecondaryRoleNone: - case DObject::SecondaryRoleLighter: - case DObject::SecondaryRoleDarker: - case DObject::SecondaryRoleFlat: - switch (lhsSecondaryRols) { - case DObject::SecondaryRoleNone: - case DObject::SecondaryRoleLighter: - case DObject::SecondaryRoleDarker: - case DObject::SecondaryRoleFlat: - return lhsPrimaryRole == rhsPrimaryRole; - case DObject::SecondaryRoleSoften: - case DObject::SecondaryRoleOutline: - return false; - } - break; - case DObject::SecondaryRoleSoften: - case DObject::SecondaryRoleOutline: - return false; - } - return true; -} - const Style *DefaultStyleEngine::applyObjectStyle(const Style *baseStyle, const StyledObject &styledObject, const Parameters *parameters) { @@ -325,10 +303,12 @@ const Style *DefaultStyleEngine::applyObjectStyle(const Style *baseStyle, const } int depth = 0; if (!depths.isEmpty()) { - for (auto it = depths.cbegin(); it != depths.cend(); ++it) { - if (it->m_elementType == elementType - && areStackingRoles(it->m_visualPrimaryRole, it->m_visualSecondaryRole, - styledVisualPrimaryRole, styledVisualSecondaryRole)) { + const QList<int> keys = Utils::sorted(depths.keys()); + for (int d : keys) { + DepthProperties properties = depths.value(d); + if (properties.m_elementType == elementType + && areStackingRoles(properties.m_visualPrimaryRole, properties.m_visualSecondaryRole, + styledVisualPrimaryRole, styledVisualSecondaryRole)) { ++depth; } else { depth = 0; @@ -345,13 +325,100 @@ const Style *DefaultStyleEngine::applyObjectStyle(const Style *baseStyle, const parameters); } +const Style *DefaultStyleEngine::applyRelationStyle(const Style *baseStyle, ElementType elementType, const RelationVisuals &relationVisuals, const Parameters *parameters) +{ + Q_UNUSED(parameters); + + RelationStyleKey key(elementType, relationVisuals); + const Style *derivedStyle = m_relationStyleMap.value(key); + if (!derivedStyle) { + auto style = new Style(baseStyle->type()); + static QColor customColors[] = { + QColor(0xEE, 0x8E, 0x99).darker(110), // ROLE_CUSTOM1, + QColor(0x80, 0xAF, 0x47).lighter(130), // ROLE_CUSTOM2, + QColor(0xFF, 0xA1, 0x5B).lighter(100), // ROLE_CUSTOM3, + QColor(0x55, 0xC4, 0xCF).lighter(120), // ROLE_CUSTOM4, + QColor(0xFF, 0xE1, 0x4B) // ROLE_CUSTOM5, + }; + + int index = static_cast<int>(relationVisuals.visualPrimaryRole()) - static_cast<int>(DRelation::PrimaryRoleCustom1); + QColor lineColor = index >= 0 && index <= 4 ? customColors[index] : Qt::black; + switch (relationVisuals.visualSecondaryRole()) { + case DRelation::SecondaryRoleNone: + break; + case DRelation::SecondaryRoleWarning: + lineColor = Qt::yellow; + break; + case DRelation::SecondaryRoleError: + lineColor = Qt::red; + break; + case DRelation::SecondaryRoleSoften: + lineColor = Qt::gray; + break; + } + + QColor fillColor = lineColor == Qt::black ? Qt::darkGray : lineColor.lighter(150); + QPen linePen = baseStyle->linePen(); + linePen.setWidth(1); + linePen.setColor(lineColor); + style->setLinePen(linePen); + QBrush textBrush = baseStyle->textBrush(); + textBrush.setColor(Qt::black); + style->setTextBrush(textBrush); + QBrush brush = baseStyle->fillBrush(); + brush.setColor(fillColor); + brush.setStyle(Qt::SolidPattern); + style->setFillBrush(brush); + style->setNormalFont(baseStyle->normalFont()); + style->setSmallFont(baseStyle->smallFont()); + style->setHeaderFont(baseStyle->headerFont()); + m_relationStyleMap.insert(key, style); + derivedStyle = style; + } + return derivedStyle; +} + const Style *DefaultStyleEngine::applyRelationStyle(const Style *baseStyle, const StyledRelation &styledRelation, const Parameters *parameters) { Q_UNUSED(parameters) ElementType elementType = objectType(styledRelation.endA()); - RelationStyleKey key(elementType, styledRelation.endA() ? styledRelation.endA()->visualPrimaryRole() : DObject::PrimaryRoleNormal); + RelationVisuals relationVisuals; + if (styledRelation.customRelation()) { + switch (styledRelation.customRelation()->colorType()) { + case CustomRelation::ColorType::EndA: + // TODO implement + break; + case CustomRelation::ColorType::EndB: + // TODO implement + break; + case CustomRelation::ColorType::Custom: + // TODO implement + break; + case CustomRelation::ColorType::Warning: + relationVisuals.setVisualSecondaryRole(DRelation::VisualSecondaryRole::SecondaryRoleWarning); + break; + case CustomRelation::ColorType::Error: + relationVisuals.setVisualSecondaryRole(DRelation::VisualSecondaryRole::SecondaryRoleError); + break; + case CustomRelation::ColorType::Soften: + relationVisuals.setVisualSecondaryRole(DRelation::VisualSecondaryRole::SecondaryRoleSoften); + break; + } + relationVisuals.setEmphasized(styledRelation.customRelation()->emphasized()); + } + if (styledRelation.endA()) + relationVisuals.setVisualObjectPrimaryRole(styledRelation.endA()->visualPrimaryRole()); + if (styledRelation.relation()) { + if (styledRelation.relation()->visualPrimaryRole() != DRelation::VisualPrimaryRole::PrimaryRoleNormal) + relationVisuals.setVisualPrimaryRole(styledRelation.relation()->visualPrimaryRole()); + if (styledRelation.relation()->visualSecondaryRole() != DRelation::VisualSecondaryRole::SecondaryRoleNone) + relationVisuals.setVisualSecondaryRole(styledRelation.relation()->visualSecondaryRole()); + if (styledRelation.relation()->isVisualEmphasized()) + relationVisuals.setEmphasized(styledRelation.relation()->isVisualEmphasized()); + } + RelationStyleKey key(elementType, relationVisuals, true); const Style *derivedStyle = m_relationStyleMap.value(key); if (!derivedStyle) { auto style = new Style(baseStyle->type()); @@ -365,12 +432,36 @@ const Style *DefaultStyleEngine::applyRelationStyle(const Style *baseStyle, cons QColor lineColor = DefaultStyleEngine::lineColor(objectType(object), objectVisuals); QColor fillColor = lineColor; + static QColor customColors[] = { + QColor(0xEE, 0x8E, 0x99).darker(110), // ROLE_CUSTOM1, + QColor(0x80, 0xAF, 0x47).lighter(130), // ROLE_CUSTOM2, + QColor(0xFF, 0xA1, 0x5B).lighter(100), // ROLE_CUSTOM3, + QColor(0x55, 0xC4, 0xCF).lighter(120), // ROLE_CUSTOM4, + QColor(0xFF, 0xE1, 0x4B) // ROLE_CUSTOM5, + }; + + int index = static_cast<int>(relationVisuals.visualPrimaryRole()) - static_cast<int>(DRelation::PrimaryRoleCustom1); + lineColor = (index >= 0 && index <= 4) ? customColors[index] : lineColor; + switch (relationVisuals.visualSecondaryRole()) { + case DRelation::SecondaryRoleNone: + break; + case DRelation::SecondaryRoleWarning: + lineColor = QColor(0xffc800); + break; + case DRelation::SecondaryRoleError: + lineColor = Qt::red; + break; + case DRelation::SecondaryRoleSoften: + lineColor = Qt::gray; + break; + } + QPen linePen = baseStyle->linePen(); - linePen.setWidth(1); + linePen.setWidth(relationVisuals.isEmphasized() ? 3 : 1); linePen.setColor(lineColor); style->setLinePen(linePen); QBrush textBrush = baseStyle->textBrush(); - textBrush.setColor(QColor("black")); + textBrush.setColor(Qt::black); style->setTextBrush(textBrush); QBrush brush = baseStyle->fillBrush(); brush.setColor(fillColor); @@ -497,6 +588,34 @@ DefaultStyleEngine::ElementType DefaultStyleEngine::objectType(const DObject *ob return elementType; } +bool DefaultStyleEngine::areStackingRoles(DObject::VisualPrimaryRole rhsPrimaryRole, + DObject::VisualSecondaryRole rhsSecondaryRole, + DObject::VisualPrimaryRole lhsPrimaryRole, + DObject::VisualSecondaryRole lhsSecondaryRols) +{ + switch (rhsSecondaryRole) { + case DObject::SecondaryRoleNone: + case DObject::SecondaryRoleLighter: + case DObject::SecondaryRoleDarker: + case DObject::SecondaryRoleFlat: + switch (lhsSecondaryRols) { + case DObject::SecondaryRoleNone: + case DObject::SecondaryRoleLighter: + case DObject::SecondaryRoleDarker: + case DObject::SecondaryRoleFlat: + return lhsPrimaryRole == rhsPrimaryRole; + case DObject::SecondaryRoleSoften: + case DObject::SecondaryRoleOutline: + return false; + } + break; + case DObject::SecondaryRoleSoften: + case DObject::SecondaryRoleOutline: + return false; + } + return true; +} + QColor DefaultStyleEngine::baseColor(ElementType elementType, ObjectVisuals objectVisuals) { if (objectVisuals.visualSecondaryRole() == DObject::SecondaryRoleOutline) diff --git a/src/libs/modelinglib/qmt/style/defaultstyleengine.h b/src/libs/modelinglib/qmt/style/defaultstyleengine.h index 67cdf9ed85..b5ebe557e0 100644 --- a/src/libs/modelinglib/qmt/style/defaultstyleengine.h +++ b/src/libs/modelinglib/qmt/style/defaultstyleengine.h @@ -37,6 +37,9 @@ public: const Parameters *parameters) override; const Style *applyObjectStyle(const Style *baseStyle, const StyledObject &styledObject, const Parameters *parameters) override; + const Style *applyRelationStyle(const Style *baseStyle, ElementType elementType, + const RelationVisuals &relationVisuals, + const Parameters *parameters) override; const Style *applyRelationStyle(const Style *baseStyle, const StyledRelation &styledRelation, const Parameters *parameters) override; const Style *applyAnnotationStyle(const Style *baseStyle, const DAnnotation *annotation, @@ -54,6 +57,11 @@ private: ElementType objectType(const DObject *object); + bool areStackingRoles(DObject::VisualPrimaryRole rhsPrimaryRole, + DObject::VisualSecondaryRole rhsSecondaryRole, + DObject::VisualPrimaryRole lhsPrimaryRole, + DObject::VisualSecondaryRole lhsSecondaryRols); + QColor baseColor(ElementType elementType, ObjectVisuals objectVisuals); QColor lineColor(ElementType elementType, const ObjectVisuals &objectVisuals); QColor fillColor(ElementType elementType, const ObjectVisuals &objectVisuals); diff --git a/src/libs/modelinglib/qmt/style/relationvisuals.cpp b/src/libs/modelinglib/qmt/style/relationvisuals.cpp new file mode 100644 index 0000000000..d297047ae1 --- /dev/null +++ b/src/libs/modelinglib/qmt/style/relationvisuals.cpp @@ -0,0 +1,58 @@ +// Copyright (C) 2024 Jochen Becher +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 + +#include "relationvisuals.h" + +namespace qmt { + +RelationVisuals::RelationVisuals() {} + +RelationVisuals::RelationVisuals(DObject::VisualPrimaryRole visualObjectPrimaryRole, + DRelation::VisualPrimaryRole visualPrimaryRole, + DRelation::VisualSecondaryRole visualSecondaryRole, + bool emphasized) + : m_visualObjectPrimaryRole(visualObjectPrimaryRole) + , m_visualPrimaryRole(visualPrimaryRole) + , m_visualSecondaryRole(visualSecondaryRole) + , m_isEmphasized(emphasized) +{} + +RelationVisuals::~RelationVisuals() {} + +void RelationVisuals::setVisualPrimaryRole(DRelation::VisualPrimaryRole VisualPrimaryRole) +{ + m_visualPrimaryRole = VisualPrimaryRole; +} + +void RelationVisuals::setVisualObjectPrimaryRole(DObject::VisualPrimaryRole visualPrimaryRole) +{ + m_visualObjectPrimaryRole = visualPrimaryRole; +} + +void RelationVisuals::setVisualSecondaryRole(DRelation::VisualSecondaryRole visualSecondaryRole) +{ + m_visualSecondaryRole = visualSecondaryRole; +} + +void RelationVisuals::setEmphasized(bool emphasized) +{ + m_isEmphasized = emphasized; +} + +bool operator==(const RelationVisuals &lhs, const RelationVisuals &rhs) +{ + return lhs.visualObjectPrimaryRole() == rhs.visualObjectPrimaryRole() + && lhs.visualPrimaryRole() == rhs.visualPrimaryRole() + && lhs.visualSecondaryRole() == rhs.visualSecondaryRole() + && lhs.isEmphasized() == rhs.isEmphasized(); +} + +size_t qHash(const RelationVisuals &relationVisuals) +{ + return ::qHash(static_cast<int>(relationVisuals.visualObjectPrimaryRole())) + ^ ::qHash(static_cast<int>(relationVisuals.visualPrimaryRole())) + ^ ::qHash(static_cast<int>(relationVisuals.visualSecondaryRole())) + ^ ::qHash(relationVisuals.isEmphasized()); +} + +} // namespace qmt diff --git a/src/libs/modelinglib/qmt/style/relationvisuals.h b/src/libs/modelinglib/qmt/style/relationvisuals.h new file mode 100644 index 0000000000..be87a7d291 --- /dev/null +++ b/src/libs/modelinglib/qmt/style/relationvisuals.h @@ -0,0 +1,42 @@ +// Copyright (C) 2024 Jochen Becher +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 + +#pragma once + +#include "qmt/diagram/drelation.h" +#include "qmt/diagram/dobject.h" + +#include <QColor> + +namespace qmt { + +class QMT_EXPORT RelationVisuals +{ +public: + RelationVisuals(); + RelationVisuals(DObject::VisualPrimaryRole visualObjectPrimaryRole, + DRelation::VisualPrimaryRole visualPrimaryRole, + DRelation::VisualSecondaryRole visualSecondaryRole, + bool emphasized); + ~RelationVisuals(); + + DObject::VisualPrimaryRole visualObjectPrimaryRole() const { return m_visualObjectPrimaryRole; } + void setVisualObjectPrimaryRole(DObject::VisualPrimaryRole visualPrimaryRole); + DRelation::VisualPrimaryRole visualPrimaryRole() const { return m_visualPrimaryRole; } + void setVisualPrimaryRole(DRelation::VisualPrimaryRole visualPrimaryRole); + DRelation::VisualSecondaryRole visualSecondaryRole() const { return m_visualSecondaryRole; } + void setVisualSecondaryRole(DRelation::VisualSecondaryRole visualSecondaryRole); + bool isEmphasized() const { return m_isEmphasized; } + void setEmphasized(bool emphasized); + +private: + DObject::VisualPrimaryRole m_visualObjectPrimaryRole = DObject::PrimaryRoleNormal; + DRelation::VisualPrimaryRole m_visualPrimaryRole = DRelation::PrimaryRoleNormal; + DRelation::VisualSecondaryRole m_visualSecondaryRole = DRelation::SecondaryRoleNone; + bool m_isEmphasized = false; +}; + +bool operator==(const RelationVisuals &lhs, const RelationVisuals &rhs); +size_t qHash(const RelationVisuals &relationVisuals); + +} // namespace qmt diff --git a/src/libs/modelinglib/qmt/style/stylecontroller.cpp b/src/libs/modelinglib/qmt/style/stylecontroller.cpp index 5cd50c1738..bbfc28622e 100644 --- a/src/libs/modelinglib/qmt/style/stylecontroller.cpp +++ b/src/libs/modelinglib/qmt/style/stylecontroller.cpp @@ -63,6 +63,12 @@ const Style *StyleController::adaptObjectStyle(const StyledObject &object) return m_defaultStyleEngine->applyObjectStyle(m_defaultStyle.data(), object, ¶meters); } +const Style *StyleController::adaptRelationStyle(StyleEngine::ElementType elementType, const RelationVisuals &relationVisuals) +{ + Parameters parameters(this); + return m_defaultStyleEngine->applyRelationStyle(m_defaultStyle.data(), elementType, relationVisuals, ¶meters); +} + const Style *StyleController::adaptRelationStyle(const StyledRelation &relation) { Parameters parameters(this); diff --git a/src/libs/modelinglib/qmt/style/stylecontroller.h b/src/libs/modelinglib/qmt/style/stylecontroller.h index 2627bb2caa..afa566460f 100644 --- a/src/libs/modelinglib/qmt/style/stylecontroller.h +++ b/src/libs/modelinglib/qmt/style/stylecontroller.h @@ -4,7 +4,6 @@ #pragma once #include "styleengine.h" -#include "qmt/diagram/dobject.h" #include <QObject> #include <QScopedPointer> @@ -14,6 +13,7 @@ namespace qmt { class Style; class ObjectVisuals; class StyledObject; +class RelationVisuals; class StyledRelation; class DAnnotation; class DBoundary; @@ -33,6 +33,8 @@ public: const Style *adaptObjectStyle(StyleEngine::ElementType elementType, const ObjectVisuals &objectVisuals); const Style *adaptObjectStyle(const StyledObject &object); + const Style *adaptRelationStyle(StyleEngine::ElementType elementType, + const RelationVisuals &relationVisuals); const Style *adaptRelationStyle(const StyledRelation &relation); const Style *adaptAnnotationStyle(const DAnnotation *annotation); const Style *adaptBoundaryStyle(const DBoundary *boundary); diff --git a/src/libs/modelinglib/qmt/style/styledrelation.cpp b/src/libs/modelinglib/qmt/style/styledrelation.cpp index 3c78abf96d..144e5f22ac 100644 --- a/src/libs/modelinglib/qmt/style/styledrelation.cpp +++ b/src/libs/modelinglib/qmt/style/styledrelation.cpp @@ -5,10 +5,12 @@ namespace qmt { -StyledRelation::StyledRelation(const DRelation *relation, const DObject *endA, const DObject *endB) +StyledRelation::StyledRelation(const DRelation *relation, const DObject *endA, const DObject *endB, + const CustomRelation *customRelation) : m_relation(relation), m_endA(endA), - m_endB(endB) + m_endB(endB), + m_customRelation(customRelation) { } diff --git a/src/libs/modelinglib/qmt/style/styledrelation.h b/src/libs/modelinglib/qmt/style/styledrelation.h index 422947908e..27e8735463 100644 --- a/src/libs/modelinglib/qmt/style/styledrelation.h +++ b/src/libs/modelinglib/qmt/style/styledrelation.h @@ -9,21 +9,25 @@ namespace qmt { class DRelation; class DObject; +class CustomRelation; class QMT_EXPORT StyledRelation { public: - StyledRelation(const DRelation *relation, const DObject *endA, const DObject *endB); + StyledRelation(const DRelation *relation, const DObject *endA, const DObject *endB, + const CustomRelation *customRelation); ~StyledRelation(); const DRelation *relation() const { return m_relation; } const DObject *endA() const { return m_endA; } const DObject *endB() const { return m_endB; } + const CustomRelation *customRelation() const { return m_customRelation; } private: const DRelation *m_relation = nullptr; const DObject *m_endA = nullptr; const DObject *m_endB = nullptr; + const CustomRelation *m_customRelation = nullptr; }; } // namespace qmt diff --git a/src/libs/modelinglib/qmt/style/styleengine.h b/src/libs/modelinglib/qmt/style/styleengine.h index e78f4303d9..463a62a194 100644 --- a/src/libs/modelinglib/qmt/style/styleengine.h +++ b/src/libs/modelinglib/qmt/style/styleengine.h @@ -14,6 +14,7 @@ namespace qmt { class Style; class ObjectVisuals; class StyledObject; +class RelationVisuals; class StyledRelation; class DAnnotation; @@ -51,6 +52,9 @@ public: const Parameters *parameters) = 0; virtual const Style *applyObjectStyle(const Style *baseStyle, const StyledObject &, const Parameters *) = 0; + virtual const Style *applyRelationStyle(const Style *baseStyle, ElementType elementType, + const RelationVisuals &relationVisuals, + const Parameters *) = 0; virtual const Style *applyRelationStyle(const Style *baseStyle, const StyledRelation &, const Parameters *) = 0; virtual const Style *applyAnnotationStyle(const Style *baseStyle, const DAnnotation *, |