KDStateMachineEditor API Documentation 2.1
Loading...
Searching...
No Matches
abstractscene.cpp
Go to the documentation of this file.
1/*
2 This file is part of the KDAB State Machine Editor Library.
3
4 SPDX-FileCopyrightText: 2014 Klarälvdalens Datakonsult AB, a KDAB Group company <info@kdab.com>
5 Author: Kevin Funk <kevin.funk@kdab.com>
6
7 SPDX-License-Identifier: LGPL-2.1-only OR LicenseRef-KDAB-KDStateMachineEditor
8
9 Licensees holding valid commercial KDAB State Machine Editor Library
10 licenses may use this file in accordance with the KDAB State Machine Editor
11 Library License Agreement provided with the Software.
12
13 Contact info@kdab.com if any conditions of this licensing are not clear to you.
14*/
15
16#include "abstractscene.h"
17#include "abstractscene_p.h"
18
19#include "debug.h"
21
22#include <QItemSelectionModel>
23
24using namespace KDSME;
25
26class KDSME::AbstractSceneContextMenuEventPrivate
27{
28public:
29 Element *m_elementUnderCursor = nullptr;
30};
31
32AbstractSceneContextMenuEvent::AbstractSceneContextMenuEvent(Reason reason, const QPoint &pos, const QPoint &globalPos, Qt::KeyboardModifiers modifiers, Element *elementUnderCursor) // clazy:exclude=function-args-by-value
33 : QContextMenuEvent(reason, pos, globalPos, modifiers)
34 , d(new AbstractSceneContextMenuEventPrivate)
35{
36 d->m_elementUnderCursor = elementUnderCursor;
37}
38
42
44{
45 return d->m_elementUnderCursor;
46}
47
48AbstractScenePrivate::AbstractScenePrivate(AbstractScene *qq)
49 : q(qq)
50 , m_model(nullptr)
51 , m_instantiator(nullptr)
52 , m_editTriggers(AbstractScene::NoEditTriggers)
53 , m_state(AbstractScene::NoState)
54{
55}
56
57bool AbstractScene::event(QEvent *event)
58{
59 if (auto contextMenuEvent = dynamic_cast<AbstractSceneContextMenuEvent *>(event)) {
60 switch (d->m_contextMenuPolicy) {
61 case Qt::CustomContextMenu:
62 event->accept();
63 Q_EMIT customContextMenuEvent(contextMenuEvent);
64 break;
65 default:
66 event->ignore();
67 break;
68 }
69 }
70
71 if (event->isAccepted())
72 return true;
73
74 return QQuickItem::event(event);
75}
76
78 : QQuickItem(parent)
79 , d(new AbstractScenePrivate(this))
80{
81}
82
83AbstractScene::~AbstractScene() = default; // NOLINT(clang-analyzer-cplusplus.NewDelete)
84
85QAbstractItemModel *AbstractScene::model() const
86{
87 return d->m_model;
88}
89
90void AbstractScene::setModel(QAbstractItemModel *model)
91{
92 if (d->m_model == model)
93 return;
94
95 if (d->m_model) {
96 disconnect(d->m_model, &QAbstractItemModel::rowsAboutToBeRemoved,
98 disconnect(d->m_model, &QAbstractItemModel::rowsInserted,
100 disconnect(d->m_model, &QAbstractItemModel::rowsMoved,
102 disconnect(d->m_model, &QAbstractItemModel::columnsMoved,
104 disconnect(d->m_model, &QAbstractItemModel::layoutChanged,
106 }
107
108 d->m_model = model;
109
110 if (d->m_model) {
111 connect(d->m_model, &QAbstractItemModel::rowsAboutToBeRemoved,
113 connect(d->m_model, &QAbstractItemModel::rowsInserted,
115 connect(d->m_model, &QAbstractItemModel::rowsMoved,
117 connect(d->m_model, &QAbstractItemModel::columnsMoved,
119 connect(d->m_model, &QAbstractItemModel::layoutChanged,
121 }
122
123 auto *itemSelectionModel = new QItemSelectionModel(d->m_model, this);
124 connect(d->m_model, &QAbstractItemModel::destroyed, itemSelectionModel, &QItemSelectionModel::deleteLater);
125 setSelectionModel(itemSelectionModel);
126
127 Q_EMIT modelChanged(d->m_model);
128}
129
130QItemSelectionModel *AbstractScene::selectionModel() const
131{
132 return d->m_selectionModel;
133}
134
135void AbstractScene::setSelectionModel(QItemSelectionModel *selectionModel)
136{
137 Q_ASSERT(selectionModel);
138 if (selectionModel && selectionModel->model() != d->m_model) {
139 qCWarning(KDSME_VIEW) << "QAbstractItemView::setSelectionModel() failed: "
140 "Trying to set a selection model, which works on "
141 "a different model than the view.";
142 return;
143 }
144
145 if (d->m_selectionModel) {
146 disconnect(d->m_selectionModel, &QItemSelectionModel::selectionChanged,
148 disconnect(d->m_selectionModel, &QItemSelectionModel::currentChanged,
150 }
151
152 d->m_selectionModel = selectionModel;
153
154 if (d->m_selectionModel) {
155 connect(d->m_selectionModel, &QItemSelectionModel::selectionChanged,
157 connect(d->m_selectionModel, &QItemSelectionModel::currentChanged,
159 }
160}
161
163{
164 return d->m_instantiator;
165}
166
167void AbstractScene::setInstantiator(QQuickItem *instantiator)
168{
169 if (d->m_instantiator == instantiator)
170 return;
171
172 if (!dynamic_cast<InstantiatorInterface *>(instantiator)) {
173 qCDebug(KDSME_VIEW) << "Instantiator object must implement InstantiatorInterface";
174 return;
175 }
176
177 d->m_instantiator = instantiator;
178 d->m_instantiator->setParentItem(this);
179 Q_EMIT instantiatorChanged(d->m_instantiator);
180}
181
182AbstractScene::EditTriggers AbstractScene::editTriggers() const
183{
184 return d->m_editTriggers;
185}
186
187void AbstractScene::setEditTriggers(AbstractScene::EditTriggers triggers)
188{
189 d->m_editTriggers = triggers;
190}
191
192Qt::ContextMenuPolicy AbstractScene::contextMenuPolicy() const
193{
194 return d->m_contextMenuPolicy;
195}
196
197void AbstractScene::setContextMenuPolicy(Qt::ContextMenuPolicy contextMenuPolicy)
198{
199 if (d->m_contextMenuPolicy == contextMenuPolicy) {
200 return;
201 }
202
203 d->m_contextMenuPolicy = contextMenuPolicy;
204 Q_EMIT contextMenuPolicyChanged(d->m_contextMenuPolicy);
205}
206
207QObject *AbstractScene::itemForIndex(const QModelIndex &index) const
208{
209 const auto *iface = dynamic_cast<InstantiatorInterface *>(d->m_instantiator);
210 return iface ? iface->itemForIndex(index) : nullptr;
211}
212
214{
215 return d->m_state;
216}
217
219{
220 if (d->m_state == state)
221 return;
222
223 d->m_state = state;
224 Q_EMIT viewStateChanged(d->m_state);
225}
226
228{
229 return d->m_selectionModel ? d->m_selectionModel->currentIndex() : QModelIndex();
230}
231
232void AbstractScene::setCurrentIndex(const QModelIndex &index)
233{
234 if (!d->m_selectionModel) {
235 return;
236 }
237
238 d->m_selectionModel->setCurrentIndex(index, QItemSelectionModel::SelectCurrent);
239}
240
241void AbstractScene::selectionChanged(const QItemSelection &selected, const QItemSelection &deselected)
242{
243 Q_UNUSED(selected);
244 Q_UNUSED(deselected);
245}
246
247void AbstractScene::currentChanged(const QModelIndex &current, const QModelIndex &previous)
248{
249 Q_UNUSED(current);
250 Q_UNUSED(previous);
251}
252
253void AbstractScene::rowsAboutToBeRemoved(const QModelIndex &parent, int start, int end)
254{
255 Q_UNUSED(parent);
256 Q_UNUSED(start);
257 Q_UNUSED(end);
258}
259
260void AbstractScene::rowsInserted(const QModelIndex &parent, int start, int end)
261{
262 Q_UNUSED(parent);
263 Q_UNUSED(start);
264 Q_UNUSED(end);
265}
266
virtual QObject * itemForIndex(const QModelIndex &index) const =0
AbstractSceneContextMenuEvent(Reason reason, const QPoint &pos, const QPoint &globalPos, Qt::KeyboardModifiers modifiers={}, Element *elementUnderCursor=nullptr)
QItemSelectionModel * selectionModel() const
virtual ~AbstractScene()
QObject * itemForIndex(const QModelIndex &index) const
virtual void setSelectionModel(QItemSelectionModel *selectionModel)
void setInstantiator(QQuickItem *instantiator)
QQuickItem * instantiator
void instantiatorChanged(QObject *instantiator)
void setViewState(KDSME::AbstractScene::ViewState state)
QAbstractItemModel * model
void setCurrentIndex(const QModelIndex &index)
Qt::ContextMenuPolicy contextMenuPolicy() const
void contextMenuPolicyChanged(Qt::ContextMenuPolicy contextMenuPolicy)
void setEditTriggers(EditTriggers triggers)
void customContextMenuEvent(KDSME::AbstractSceneContextMenuEvent *event)
AbstractScene(QQuickItem *parent=nullptr)
void setContextMenuPolicy(Qt::ContextMenuPolicy contextMenuPolicy)
virtual void setModel(QAbstractItemModel *model)
virtual void currentChanged(const QModelIndex &current, const QModelIndex &previous)
void modelChanged(QAbstractItemModel *model)
void viewStateChanged(KDSME::AbstractScene::ViewState state)
bool event(QEvent *event) override
virtual void rowsAboutToBeRemoved(const QModelIndex &parent, int start, int end)
virtual void layoutChanged()
virtual void selectionChanged(const QItemSelection &selected, const QItemSelection &deselected)
QModelIndex currentIndex() const
virtual void rowsInserted(const QModelIndex &parent, int start, int end)
EditTriggers editTriggers() const

© Klarälvdalens Datakonsult AB (KDAB)
"The Qt, C++ and OpenGL Experts"
https://www.kdab.com/
KDStateMachineEditor
Create Qt State Machine metacode using a graphical user interface
https://github.com/KDAB/KDStateMachineEditor
Generated on Tue Jul 15 2025 15:21:47 for KDStateMachineEditor API Documentation by doxygen 1.9.8