52 if (QQuickItem *item = qobject_cast<QQuickItem*>(object)) {
53 if (m_selectedItems.removeOne(item))
54 delete m_highlightItems.take(item);
60 if (!syncSelectedItems(items))
63 QList<QObject*> objectList;
64 objectList.reserve(items.size());
65 for (QQuickItem *item : items)
68 sendCurrentObjects(objectList);
75 highlightItem->showName(point);
82 ds << QByteArray(
EVENT) << m_eventId++ << QByteArray(
SELECT);
85 debugIds.reserve(objects.size());
86 for (QObject *object : objects)
87 debugIds << QQmlDebugService::idForObject(object);
90 emit messageToClient(QQmlInspectorService::s_key, ds.data());
98 object->setParent(newParent);
99 QQuickItem *newParentItem = qobject_cast<QQuickItem*>(newParent);
100 QQuickItem *item = qobject_cast<QQuickItem*>(object);
101 if (newParentItem && item)
102 item->setParentItem(newParentItem);
152 QQmlComponent m_component;
156bool GlobalInspector::createQmlObject(
int requestId,
const QString &qml, QObject *parent,
157 const QStringList &importList,
const QString &filename)
162 QQmlContext *parentContext = QQmlEngine::contextForObject(parent);
167 for (
const QString &s : importList)
168 imports += s + QLatin1Char(
'\n');
171 connect(objectCreator, &ObjectCreator::result,
this, &GlobalInspector::sendResult);
172 objectCreator->run((imports + qml).toUtf8(), QUrl::fromLocalFile(filename));
178 m_windowInspectors.append(
new QQuickWindowInspector(window,
this));
183 for (QList<QmlJSDebugger::QQuickWindowInspector *>::Iterator i = m_windowInspectors.begin();
184 i != m_windowInspectors.end();) {
185 if ((*i)->quickWindow() == window) {
187 i = m_windowInspectors.erase(i);
196 for (QmlJSDebugger::QQuickWindowInspector *inspector : std::as_const(m_windowInspectors)) {
197 if (inspector->quickWindow() == window)
198 inspector->setParentWindow(parentWindow);
202bool GlobalInspector::syncSelectedItems(
const QList<QQuickItem *> &items)
204 bool selectionChanged =
false;
207 const auto selectedItemsCopy = m_selectedItems;
208 for (QQuickItem *item : selectedItemsCopy) {
209 if (items.contains(item))
212 selectionChanged =
true;
213 item->disconnect(
this);
214 m_selectedItems.removeOne(item);
215 delete m_highlightItems.take(item);
219 for (QQuickItem *item : items) {
220 if (m_selectedItems.contains(item))
223 selectionChanged =
true;
224 connect(item, &QObject::destroyed,
this, &GlobalInspector::removeFromSelectedItems);
225 m_selectedItems.append(item);
226 for (QQuickWindowInspector *inspector : std::as_const(m_windowInspectors)) {
227 if (inspector->isEnabled() && inspector->quickWindow() == item->window()) {
228 m_highlightItems.insert(item,
new SelectionHighlight(titleForItem(item), item,
229 inspector->overlay()));
235 return selectionChanged;
240 QString className = QLatin1String(item->metaObject()->className());
241 QString objectStringId = idStringForObject(item);
243#if QT_CONFIG(regularexpression)
244 className.remove(QRegularExpression(QLatin1String(
"_QMLTYPE_\\d+")));
245 className.remove(QRegularExpression(QLatin1String(
"_QML_\\d+")));
247 if (className.startsWith(QLatin1String(
"QQuick")))
248 className = className.mid(6);
250 QString constructedName;
252 if (!objectStringId.isEmpty()) {
253 constructedName = objectStringId + QLatin1String(
" (") + className + QLatin1Char(
')');
254 }
else if (!item->objectName().isEmpty()) {
255 constructedName = item->objectName() + QLatin1String(
" (") + className + QLatin1Char(
')');
257 constructedName = className;
260 return constructedName;
265 QQmlContext *context = qmlContext(obj);
267 QQmlRefPointer<QQmlContextData> cdata = QQmlContextData::get(context);
269 return cdata->findObjectId(obj);
277 QQmlDebugPacket ds(message);
285 ds >> requestId >> command;
288 for (QQuickWindowInspector *inspector : std::as_const(m_windowInspectors))
289 inspector->setEnabled(
true);
290 success = !m_windowInspectors.isEmpty();
291 }
else if (command ==
DISABLE) {
292 setSelectedItems(QList<QQuickItem*>());
293 for (QQuickWindowInspector *inspector : std::as_const(m_windowInspectors))
294 inspector->setEnabled(
false);
295 success = !m_windowInspectors.isEmpty();
296 }
else if (command ==
SELECT) {
300 QList<QQuickItem *> selectedObjects;
301 for (
int debugId : std::as_const(debugIds)) {
302 if (QQuickItem *obj =
303 qobject_cast<QQuickItem *>(QQmlDebugService::objectForId(debugId)))
304 selectedObjects << obj;
306 syncSelectedItems(selectedObjects);
310 QUnifiedTimer::instance()->setSpeedModifier(1 / speed);
314 for (QmlJSDebugger::QQuickWindowInspector *inspector : std::as_const(m_windowInspectors))
315 inspector->setShowAppOnTop(showOnTop);
316 success = !m_windowInspectors.isEmpty();
322 ds >> qml >> parentId >> imports >> filename;
323 if (QObject *parent = QQmlDebugService::objectForId(parentId)) {
324 if (createQmlObject(requestId, qml, parent, imports, filename))
336 if (QObject *obj = QQmlDebugService::objectForId(debugId))
342 int debugId, newParent;
343 ds >> debugId >> newParent;
344 success = reparentQmlObject(QQmlDebugService::objectForId(debugId),
345 QQmlDebugService::objectForId(newParent));
347 qWarning() <<
"Warning: Not handling command:" << command;
351 qWarning() <<
"Warning: Not handling type:" << type <<
REQUEST;
355 sendResult(requestId, success);
361 rs << QByteArray(
RESPONSE) << requestId << success;
362 emit messageToClient(QQmlInspectorService::s_key, rs.data());
368 qDeleteAll(m_highlightItems);