7#if defined(Q_OS_VISIONOS)
8#include "visionos/qquick3dxranchormanager_visionos_p.h"
10#include "openxr/qquick3dxranchormanager_openxr_p.h"
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
44 switch (classification) {
45 case QQuick3DXrSpatialAnchorListModel::ClassificationFlag::Wall:
46 return QStringLiteral(
"wall");
47 case QQuick3DXrSpatialAnchorListModel::ClassificationFlag::Ceiling:
48 return QStringLiteral(
"ceiling");
49 case QQuick3DXrSpatialAnchorListModel::ClassificationFlag::Floor:
50 return QStringLiteral(
"floor");
51 case QQuick3DXrSpatialAnchorListModel::ClassificationFlag::Table:
52 return QStringLiteral(
"table");
53 case QQuick3DXrSpatialAnchorListModel::ClassificationFlag::Seat:
54 return QStringLiteral(
"seat");
55 case QQuick3DXrSpatialAnchorListModel::ClassificationFlag::Window:
56 return QStringLiteral(
"window");
57 case QQuick3DXrSpatialAnchorListModel::ClassificationFlag::Door:
58 return QStringLiteral(
"door");
59 case QQuick3DXrSpatialAnchorListModel::ClassificationFlag::Other:
60 return QStringLiteral(
"other");
68 switch (classification) {
69 case QQuick3DXrSpatialAnchor::Classification::Unknown:
70 return QQuick3DXrSpatialAnchorListModel::ClassificationFlag::Other;
71 case QQuick3DXrSpatialAnchor::Classification::Wall:
72 return QQuick3DXrSpatialAnchorListModel::ClassificationFlag::Wall;
73 case QQuick3DXrSpatialAnchor::Classification::Ceiling:
74 return QQuick3DXrSpatialAnchorListModel::ClassificationFlag::Ceiling;
75 case QQuick3DXrSpatialAnchor::Classification::Floor:
76 return QQuick3DXrSpatialAnchorListModel::ClassificationFlag::Floor;
77 case QQuick3DXrSpatialAnchor::Classification::Table:
78 return QQuick3DXrSpatialAnchorListModel::ClassificationFlag::Table;
79 case QQuick3DXrSpatialAnchor::Classification::Seat:
80 return QQuick3DXrSpatialAnchorListModel::ClassificationFlag::Seat;
81 case QQuick3DXrSpatialAnchor::Classification::Window:
82 return QQuick3DXrSpatialAnchorListModel::ClassificationFlag::Window;
83 case QQuick3DXrSpatialAnchor::Classification::Door:
84 return QQuick3DXrSpatialAnchorListModel::ClassificationFlag::Door;
85 case QQuick3DXrSpatialAnchor::Classification::Other:
86 return QQuick3DXrSpatialAnchorListModel::ClassificationFlag::Other;
89 Q_UNREACHABLE_RETURN(QQuick3DXrSpatialAnchorListModel::ClassificationFlag::Other);
95 m_anchorManager = QQuick3DXrAnchorManager::instance();
96 if (m_anchorManager) {
97 connect(m_anchorManager, &QQuick3DXrAnchorManager::anchorAdded,
this, &QQuick3DXrSpatialAnchorListModel::handleAnchorAdded);
98 connect(m_anchorManager, &QQuick3DXrAnchorManager::anchorUpdated,
this, &QQuick3DXrSpatialAnchorListModel::handleAnchorUpdated);
99 connect(m_anchorManager, &QQuick3DXrAnchorManager::anchorRemoved,
this, &QQuick3DXrSpatialAnchorListModel::handleAnchorRemoved);
100 connect(m_anchorManager, &QQuick3DXrAnchorManager::sceneCaptureCompleted,
this, [
this]{queryAnchors();});
103 qWarning(
"SpatialAnchorModel: Failed to get anchor manager instance");
109 if (parent.isValid() || m_anchorManager ==
nullptr)
112 const auto &anchors = anchorsFiltered();
114 return anchors.size();
119 if (!index.isValid() || m_anchorManager ==
nullptr)
122 const auto &anchors = anchorsFiltered();
125 if (index.row() < 0 || index.row() >= anchors.count())
128 const auto &anchor = anchors.at(index.row());
131 return QVariant::fromValue(anchor);
139 QHash<
int, QByteArray> roles;
140 roles[Anchor] =
"anchor";
145
146
147
148
149
150
151
152
153
154
158 if (m_anchorManager ==
nullptr)
162 m_anchorManager->requestSceneCapture();
167 if (m_anchorManager ==
nullptr)
170 m_anchorManager->queryAllAnchors();
176 if (matchesAnchorFilter(anchor)) {
194 if (matchesAnchorFilter(anchor)) {
202
203
204
205
206
207
208
209
210
219 if (m_filterMode == newFilterMode)
221 m_filterMode = newFilterMode;
224 handleAnchorRemoved({});
226 emit filterModeChanged();
230
231
232
236 return m_uuids.values();
241 QSet<QString> newFilter { filter.cbegin(), filter.cend() };
243 if (m_uuids == newFilter)
249 handleAnchorRemoved({});
251 emit identifierFilterChanged();
255
256
257
258
259
260
261
262
263
264
265
266
267
268
272 return m_classFilter;
277 if (m_classFilter == newClassFilter)
280 m_classFilter = newClassFilter;
282 m_classStringFilter.clear();
284 constexpr size_t classifcationCount = (
sizeof(std::underlying_type_t<ClassificationFlag>) * 8) - 1;
285 for (size_t i = 0; i < classifcationCount; ++i) {
286 ClassificationFlag classification =
static_cast<ClassificationFlag>(size_t(m_classFilter) & (size_t(1) << i));
287 auto name = getClassificationString(classification);
289 m_classStringFilter.insert(name);
293 handleAnchorRemoved({});
295 emit classificationFilterChanged();
299
300
301
302
303
304
305
306
307
308
309
312 return m_classStringFilter.values();
317 for (
const auto &entry : newClassStringFilter) {
318 if (!entry.isEmpty())
319 m_classStringFilter.insert(entry.toLower());
323 handleAnchorRemoved({});
325 emit classificationStringFilterChanged();
330 if (m_filterMode == FilterMode::Classification) {
331 QString classificationString;
332 const auto classification = anchor->classification();
333 if (classification != QQuick3DXrSpatialAnchor::Classification::Other) {
334 const auto classificationFlagType = getClassificationFlagType(classification);
335 classificationString = getClassificationString(classificationFlagType);
339 classificationString = anchor->classificationString().toLower();
341 return m_classStringFilter.contains(classificationString.toLower());
342 }
else if (m_filterMode == FilterMode::Identifier) {
343 const auto uuid = anchor->identifier();
344 return m_uuids.contains(uuid);
353 QList<QQuick3DXrSpatialAnchor *> anchors;
354 const auto &unfilteredAnchors = m_anchorManager->anchors();
355 if (m_filterMode == FilterMode::All) {
356 anchors = unfilteredAnchors;
358 for (
const auto &anchor : unfilteredAnchors) {
359 if (matchesAnchorFilter(anchor))
360 anchors.push_back(anchor);
QStringList classificationStringFilter() const
\qmlproperty list<string> XrSpatialAnchorListModel::classificationStringFilter
int rowCount(const QModelIndex &parent) const override
Returns the number of rows under the given parent.
ClassificationFlags classificationFilter() const
\qmlproperty enumeration XrSpatialAnchorListModel::classificationFilter
Q_INVOKABLE void queryAnchors()
Q_INVOKABLE void requestSceneCapture()
\qmlmethod void XrSpatialAnchorListModel::requestSceneCapture()
QStringList identifierFilter() const
\qmlproperty list<string> XrSpatialAnchorListModel::identifierFilter
QVariant data(const QModelIndex &index, int role) const override
Returns the data stored under the given role for the item referred to by the index.
FilterMode filterMode() const
\qmlproperty enumeration XrSpatialAnchorListModel::filterMode
void setFilterMode(FilterMode newFilterMode)
void setClassificationFilter(ClassificationFlags newClassFilter)
void setIdentifierFilter(const QStringList &filter)
QQuick3DXrSpatialAnchorListModel(QObject *parent=nullptr)
void setClassificationStringFilter(const QStringList &newClassStringFilter)
QHash< int, QByteArray > roleNames() const override
Combined button and popup list for selecting options.
static QT_BEGIN_NAMESPACE QString getClassificationString(QQuick3DXrSpatialAnchorListModel::ClassificationFlag classification)
static QQuick3DXrSpatialAnchorListModel::ClassificationFlag getClassificationFlagType(QQuick3DXrSpatialAnchor::Classification classification)