9#if defined(Q_OS_VISIONOS)
10#include "visionos/qquick3dxranchormanager_visionos_p.h"
12#include "openxr/qquick3dxranchormanager_openxr_p.h"
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
46 switch (classification) {
47 case QQuick3DXrSpatialAnchorListModel::ClassificationFlag::Wall:
48 return QStringLiteral(
"wall");
49 case QQuick3DXrSpatialAnchorListModel::ClassificationFlag::Ceiling:
50 return QStringLiteral(
"ceiling");
51 case QQuick3DXrSpatialAnchorListModel::ClassificationFlag::Floor:
52 return QStringLiteral(
"floor");
53 case QQuick3DXrSpatialAnchorListModel::ClassificationFlag::Table:
54 return QStringLiteral(
"table");
55 case QQuick3DXrSpatialAnchorListModel::ClassificationFlag::Seat:
56 return QStringLiteral(
"seat");
57 case QQuick3DXrSpatialAnchorListModel::ClassificationFlag::Window:
58 return QStringLiteral(
"window");
59 case QQuick3DXrSpatialAnchorListModel::ClassificationFlag::Door:
60 return QStringLiteral(
"door");
61 case QQuick3DXrSpatialAnchorListModel::ClassificationFlag::Other:
62 return QStringLiteral(
"other");
70 switch (classification) {
71 case QQuick3DXrSpatialAnchor::Classification::Unknown:
72 return QQuick3DXrSpatialAnchorListModel::ClassificationFlag::Other;
73 case QQuick3DXrSpatialAnchor::Classification::Wall:
74 return QQuick3DXrSpatialAnchorListModel::ClassificationFlag::Wall;
75 case QQuick3DXrSpatialAnchor::Classification::Ceiling:
76 return QQuick3DXrSpatialAnchorListModel::ClassificationFlag::Ceiling;
77 case QQuick3DXrSpatialAnchor::Classification::Floor:
78 return QQuick3DXrSpatialAnchorListModel::ClassificationFlag::Floor;
79 case QQuick3DXrSpatialAnchor::Classification::Table:
80 return QQuick3DXrSpatialAnchorListModel::ClassificationFlag::Table;
81 case QQuick3DXrSpatialAnchor::Classification::Seat:
82 return QQuick3DXrSpatialAnchorListModel::ClassificationFlag::Seat;
83 case QQuick3DXrSpatialAnchor::Classification::Window:
84 return QQuick3DXrSpatialAnchorListModel::ClassificationFlag::Window;
85 case QQuick3DXrSpatialAnchor::Classification::Door:
86 return QQuick3DXrSpatialAnchorListModel::ClassificationFlag::Door;
87 case QQuick3DXrSpatialAnchor::Classification::Other:
88 return QQuick3DXrSpatialAnchorListModel::ClassificationFlag::Other;
91 Q_UNREACHABLE_RETURN(QQuick3DXrSpatialAnchorListModel::ClassificationFlag::Other);
97 m_anchorManager = QQuick3DXrAnchorManager::instance();
98 if (m_anchorManager) {
99 connect(m_anchorManager, &QQuick3DXrAnchorManager::anchorAdded,
this, &QQuick3DXrSpatialAnchorListModel::handleAnchorAdded);
101 connect(m_anchorManager, &QQuick3DXrAnchorManager::anchorRemoved,
this, &QQuick3DXrSpatialAnchorListModel::handleAnchorRemoved);
105 qWarning(
"SpatialAnchorModel: Failed to get anchor manager instance");
111 if (parent.isValid() || m_anchorManager ==
nullptr)
114 const auto &anchors = anchorsFiltered();
116 return anchors.size();
121 if (!index.isValid() || m_anchorManager ==
nullptr)
124 const auto &anchors = anchorsFiltered();
127 if (index.row() < 0 || index.row() >= anchors.count())
130 const auto &anchor = anchors.at(index.row());
133 return QVariant::fromValue(anchor);
141 QHash<
int, QByteArray> roles;
142 roles[Anchor] =
"anchor";
147
148
149
150
151
152
153
154
155
156
160 if (m_anchorManager ==
nullptr)
164 m_anchorManager->requestSceneCapture();
169 if (m_anchorManager ==
nullptr)
172 m_anchorManager->queryAllAnchors();
178 if (matchesAnchorFilter(anchor)) {
196 if (matchesAnchorFilter(anchor)) {
204
205
206
207
208
209
210
211
212
221 if (m_filterMode == newFilterMode)
223 m_filterMode = newFilterMode;
226 handleAnchorRemoved({});
228 emit filterModeChanged();
232
233
234
238 return m_uuids.values();
243 QSet<QString> newFilter { filter.cbegin(), filter.cend() };
245 if (m_uuids == newFilter)
251 handleAnchorRemoved({});
253 emit identifierFilterChanged();
257
258
259
260
261
262
263
264
265
266
267
268
269
270
274 return m_classFilter;
279 if (m_classFilter == newClassFilter)
282 m_classFilter = newClassFilter;
284 m_classStringFilter.clear();
286 constexpr size_t classifcationCount = (
sizeof(std::underlying_type_t<ClassificationFlag>) * 8) - 1;
287 for (size_t i = 0; i < classifcationCount; ++i) {
288 ClassificationFlag classification =
static_cast<ClassificationFlag>(size_t(m_classFilter) & (size_t(1) << i));
289 auto name = getClassificationString(classification);
291 m_classStringFilter.insert(name);
295 handleAnchorRemoved({});
297 emit classificationFilterChanged();
301
302
303
304
305
306
307
308
309
310
311
314 return m_classStringFilter.values();
319 for (
const auto &entry : newClassStringFilter) {
320 if (!entry.isEmpty())
321 m_classStringFilter.insert(entry.toLower());
325 handleAnchorRemoved({});
327 emit classificationStringFilterChanged();
332 if (m_filterMode == FilterMode::Classification) {
333 QString classificationString;
334 const auto classification = anchor->classification();
335 if (classification != QQuick3DXrSpatialAnchor::Classification::Other) {
336 const auto classificationFlagType = getClassificationFlagType(classification);
337 classificationString = getClassificationString(classificationFlagType);
341 classificationString = anchor->classificationString().toLower();
343 return m_classStringFilter.contains(classificationString.toLower());
344 }
else if (m_filterMode == FilterMode::Identifier) {
345 const auto uuid = anchor->identifier();
346 return m_uuids.contains(uuid);
355 QList<QQuick3DXrSpatialAnchor *> anchors;
356 const auto &unfilteredAnchors = m_anchorManager->anchors();
357 if (m_filterMode == FilterMode::All) {
358 anchors = unfilteredAnchors;
360 for (
const auto &anchor : unfilteredAnchors) {
361 if (matchesAnchorFilter(anchor))
362 anchors.push_back(anchor);
void sceneCaptureCompleted()
void anchorUpdated(QQuick3DXrSpatialAnchor *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)