1 /*
2 * SPDX-FileCopyrightText: 2014 Andreas Cord-Landwehr <cordlandwehr@kde.org>
3 *
4 * SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
5 */
6
7 #include "edgewrapper.h"
8 #include "documentwrapper.h"
9 #include "edgetype.h"
10 #include "edge.h"
11 #include "edgetypestyle.h"
12 #include <KLocalizedString>
13 #include <QDebug>
14 #include <QEvent>
15
16 using namespace GraphTheory;
17
EdgeWrapper(EdgePtr edge,DocumentWrapper * documentWrapper)18 EdgeWrapper::EdgeWrapper(EdgePtr edge, DocumentWrapper *documentWrapper)
19 : m_edge(edge)
20 , m_documentWrapper(documentWrapper)
21 {
22 connect(m_edge.data(), &Edge::styleChanged, this, [=] () {
23 Q_EMIT colorChanged(m_edge->type()->style()->color());
24 } );
25 connect(m_edge.data(), &Edge::dynamicPropertiesChanged, this, &EdgeWrapper::updateDynamicProperties);
26 connect(m_edge.data(), &Edge::typeChanged, this, &EdgeWrapper::typeChanged);
27 updateDynamicProperties();
28 }
29
~EdgeWrapper()30 EdgeWrapper::~EdgeWrapper()
31 {
32
33 }
34
edge() const35 EdgePtr EdgeWrapper::edge() const
36 {
37 return m_edge;
38 }
39
type() const40 int EdgeWrapper::type() const
41 {
42 return m_edge->type()->id();
43 }
44
setType(int typeId)45 void EdgeWrapper::setType(int typeId)
46 {
47 EdgeTypePtr newType = m_edge->type();
48 if (newType->id() == typeId) {
49 return;
50 }
51 const auto edgeTypes = m_edge->from()->document()->edgeTypes();
52 for (const EdgeTypePtr &type : edgeTypes) {
53 if (type->id() == typeId) {
54 newType = type;
55 break;
56 }
57 }
58 if (newType == m_edge->type()) {
59 QString command = QString("edge.type = %1)").arg(typeId);
60 Q_EMIT message(i18nc("@info:shell", "%1: edge type ID %2 not registered", command, typeId), Kernel::ErrorMessage);
61 return;
62 }
63 m_edge->setType(newType);
64 // change signal will be emitted by connection to m_node signal
65 }
66
from() const67 GraphTheory::NodeWrapper * EdgeWrapper::from() const
68 {
69 return m_documentWrapper->nodeWrapper(m_edge->from());
70 }
71
to() const72 GraphTheory::NodeWrapper * EdgeWrapper::to() const
73 {
74 return m_documentWrapper->nodeWrapper(m_edge->to());
75 }
76
directed() const77 bool EdgeWrapper::directed() const
78 {
79 if (m_edge->type()->direction() == EdgeType::Unidirectional) {
80 return true;
81 }
82 return false;
83 }
84
event(QEvent * e)85 bool EdgeWrapper::event(QEvent *e)
86 {
87 if (e->type() == QEvent::DynamicPropertyChange) {
88 QDynamicPropertyChangeEvent *propertyEvent = static_cast<QDynamicPropertyChangeEvent *>(e);
89 QString name = QString::fromUtf8(propertyEvent->propertyName());
90 QVariant value = property(propertyEvent->propertyName());
91 // only propagate property to edge object if it is registered
92 if (m_edge->dynamicProperties().contains(name)) {
93 m_edge->setDynamicProperty(name, value);
94 }
95 return true;
96 }
97 return QObject::event(e);
98 }
99
updateDynamicProperties()100 void EdgeWrapper::updateDynamicProperties()
101 {
102 const auto dynamicProperties = m_edge->dynamicProperties();
103 for (const QString &property : dynamicProperties) {
104 // property value must not be set to QVariant::Invalid, else the properties are not accessible
105 // from the script engine
106 if (m_edge->dynamicProperty(property).isValid()) {
107 setProperty(property.toUtf8(), m_edge->dynamicProperty(property));
108 } else {
109 setProperty(property.toUtf8(), QVariant::Int);
110 }
111 }
112 }
113