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