aboutsummaryrefslogtreecommitdiffstats
path: root/src/libs/modelinglib/qmt/model/mdiagram.cpp
blob: 16f73dc22a94e8a98cbe8572f1f33e0fffeb72fd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
// Copyright (C) 2016 Jochen Becher
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0 WITH Qt-GPL-exception-1.0

#include "mdiagram.h"

#include "mvisitor.h"
#include "mconstvisitor.h"
#include "qmt/diagram/delement.h"

namespace qmt {

MDiagram::MDiagram()
    : MObject(),
      // modification date is set to null value for performance reasons
      m_lastModified()
{
}

MDiagram::MDiagram(const MDiagram &rhs)
    : MObject(rhs),
      // no deep copy
      // modification date is copied (instead of set to current time) to allow exact copies of the diagram
      m_lastModified(rhs.m_lastModified),
      m_toolbarId(rhs.toolbarId())
{
}

MDiagram::~MDiagram()
{
    qDeleteAll(m_elements);
}

MDiagram &MDiagram::operator=(const MDiagram &rhs)
{
    if (this != &rhs) {
        MObject::operator=(rhs);
        // no deep copy; list of elements remains unchanged
        // modification date is copied (instead of set to current time) to allow exact copies of the diagram
        m_lastModified = rhs.m_lastModified;
        m_toolbarId = rhs.m_toolbarId;
    }
    return *this;
}

DElement *MDiagram::findDiagramElement(const Uid &key) const
{
    return m_elementMap.value(key);
}

DElement *MDiagram::findDelegate(const Uid &modelUid) const
{
    return m_modelUid2ElementMap.value(modelUid);
}

void MDiagram::setDiagramElements(const QList<DElement *> &elements)
{
    m_elements = elements;
    m_elementMap.clear();
    m_modelUid2ElementMap.clear();
    for (DElement *element : elements) {
        m_elementMap.insert(element->uid(), element);
        m_modelUid2ElementMap.insert(element->modelUid(), element);
    }
}

void MDiagram::addDiagramElement(DElement *element)
{
    QMT_ASSERT(element, return);

    m_elements.append(element);
    m_elementMap.insert(element->uid(), element);
    m_modelUid2ElementMap.insert(element->modelUid(), element);
}

void MDiagram::insertDiagramElement(int beforeElement, DElement *element)
{
    QMT_ASSERT(beforeElement >= 0 && beforeElement <= m_elements.size(), return);

    m_elements.insert(beforeElement, element);
    m_elementMap.insert(element->uid(), element);
    m_modelUid2ElementMap.insert(element->modelUid(), element);
}

void MDiagram::removeDiagramElement(int index)
{
    QMT_ASSERT(index >= 0 && index < m_elements.size(), return);

    DElement *element = m_elements.at(index);
    m_elementMap.remove(element->uid());
    m_modelUid2ElementMap.remove(element->modelUid());
    delete element;
    m_elements.removeAt(index);
}

void MDiagram::removeDiagramElement(DElement *element)
{
    QMT_ASSERT(element, return);

    removeDiagramElement(m_elements.indexOf(element));
}

void MDiagram::setLastModified(const QDateTime &lastModified)
{
    m_lastModified = lastModified;
}

void MDiagram::setLastModifiedToNow()
{
    m_lastModified = QDateTime::currentDateTime();
}

void MDiagram::setToolbarId(const QString &toolbarId)
{
    m_toolbarId = toolbarId;
}

void MDiagram::accept(MVisitor *visitor)
{
    visitor->visitMDiagram(this);
}

void MDiagram::accept(MConstVisitor *visitor) const
{
    visitor->visitMDiagram(this);
}

} // namespace qmt