52 if (m_selectedItems.removeOne(item))
53 delete m_highlightItems.take(item);
58 if (!syncSelectedItems(items))
61 QList<QObject*> objectList;
62 objectList.reserve(items.size());
63 for (QQuickItem *item : items)
66 sendCurrentObjects(objectList);
73 highlightItem->showName(point);
80 ds << QByteArray(
EVENT) << m_eventId++ << QByteArray(
SELECT);
83 debugIds.reserve(objects.size());
84 for (QObject *object : objects)
85 debugIds << QQmlDebugService::idForObject(object);
88 emit messageToClient(QQmlInspectorService::s_key, ds.data());
96 object->setParent(newParent);
97 QQuickItem *newParentItem = qobject_cast<QQuickItem*>(newParent);
98 QQuickItem *item = qobject_cast<QQuickItem*>(object);
99 if (newParentItem && item)
100 item->setParentItem(newParentItem);
150 QQmlComponent m_component;
154bool GlobalInspector::createQmlObject(
int requestId,
const QString &qml, QObject *parent,
155 const QStringList &importList,
const QString &filename)
160 QQmlContext *parentContext = QQmlEngine::contextForObject(parent);
165 for (
const QString &s : importList)
166 imports += s + QLatin1Char(
'\n');
169 connect(objectCreator, &ObjectCreator::result,
this, &
GlobalInspector::sendResult);
170 objectCreator->run((imports + qml).toUtf8(), QUrl::fromLocalFile(filename));
176 m_windowInspectors.append(
new QQuickWindowInspector(window,
this));
181 for (QList<QmlJSDebugger::QQuickWindowInspector *>::Iterator i = m_windowInspectors.begin();
182 i != m_windowInspectors.end();) {
183 if ((*i)->quickWindow() == window) {
185 i = m_windowInspectors.erase(i);
194 for (QmlJSDebugger::QQuickWindowInspector *inspector : std::as_const(m_windowInspectors)) {
195 if (inspector->quickWindow() == window)
196 inspector->setParentWindow(parentWindow);
200bool GlobalInspector::syncSelectedItems(
const QList<QQuickItem *> &items)
202 bool selectionChanged =
false;
205 const auto selectedItemsCopy = m_selectedItems;
206 for (QQuickItem *item : selectedItemsCopy) {
207 if (items.contains(item))
210 selectionChanged =
true;
211 item->disconnect(
this);
212 m_selectedItems.removeOne(item);
213 delete m_highlightItems.take(item);
217 for (QQuickItem *item : items) {
218 if (m_selectedItems.contains(item))
221 selectionChanged =
true;
224 connect(item, &QObject::destroyed,
this, [
this, item]() { removeFromSelectedItems(item); });
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);