51 if (QQuickItem *item = qobject_cast<QQuickItem*>(object)) {
52 if (m_selectedItems.removeOne(item))
53 delete m_highlightItems.take(item);
59 if (!syncSelectedItems(items))
62 QList<QObject*> objectList;
63 objectList.reserve(items.size());
64 for (QQuickItem *item : items)
67 sendCurrentObjects(objectList);
74 highlightItem->showName(point);
81 ds << QByteArray(
EVENT) << m_eventId++ << QByteArray(
SELECT);
84 debugIds.reserve(objects.size());
85 for (QObject *object : objects)
86 debugIds << QQmlDebugService::idForObject(object);
89 emit messageToClient(QQmlInspectorService::s_key, ds.data());
97 object->setParent(newParent);
98 QQuickItem *newParentItem = qobject_cast<QQuickItem*>(newParent);
99 QQuickItem *item = qobject_cast<QQuickItem*>(object);
100 if (newParentItem && item)
101 item->setParentItem(newParentItem);
151 QQmlComponent m_component;
155bool GlobalInspector::createQmlObject(
int requestId,
const QString &qml, QObject *parent,
156 const QStringList &importList,
const QString &filename)
161 QQmlContext *parentContext = QQmlEngine::contextForObject(parent);
166 for (
const QString &s : importList)
167 imports += s + QLatin1Char(
'\n');
170 connect(objectCreator, &ObjectCreator::result,
this, &GlobalInspector::sendResult);
171 objectCreator->run((imports + qml).toUtf8(), QUrl::fromLocalFile(filename));
177 m_windowInspectors.append(
new QQuickWindowInspector(window,
this));
182 for (QList<QmlJSDebugger::QQuickWindowInspector *>::Iterator i = m_windowInspectors.begin();
183 i != m_windowInspectors.end();) {
184 if ((*i)->quickWindow() == window) {
186 i = m_windowInspectors.erase(i);
195 for (QmlJSDebugger::QQuickWindowInspector *inspector : std::as_const(m_windowInspectors)) {
196 if (inspector->quickWindow() == window)
197 inspector->setParentWindow(parentWindow);
201bool GlobalInspector::syncSelectedItems(
const QList<QQuickItem *> &items)
203 bool selectionChanged =
false;
206 const auto selectedItemsCopy = m_selectedItems;
207 for (QQuickItem *item : selectedItemsCopy) {
208 if (items.contains(item))
211 selectionChanged =
true;
212 item->disconnect(
this);
213 m_selectedItems.removeOne(item);
214 delete m_highlightItems.take(item);
218 for (QQuickItem *item : items) {
219 if (m_selectedItems.contains(item))
222 selectionChanged =
true;
223 connect(item, &QObject::destroyed,
this, &GlobalInspector::removeFromSelectedItems);
224 m_selectedItems.append(item);
225 for (QQuickWindowInspector *inspector : std::as_const(m_windowInspectors)) {
226 if (inspector->isEnabled() && inspector->quickWindow() == item->window()) {
227 m_highlightItems.insert(item,
new SelectionHighlight(titleForItem(item), item,
228 inspector->overlay()));
234 return selectionChanged;
239 QString className = QLatin1String(item->metaObject()->className());
240 QString objectStringId = idStringForObject(item);
242#if QT_CONFIG(regularexpression)
243 className.remove(QRegularExpression(QLatin1String(
"_QMLTYPE_\\d+")));
244 className.remove(QRegularExpression(QLatin1String(
"_QML_\\d+")));
246 if (className.startsWith(QLatin1String(
"QQuick")))
247 className = className.mid(6);
249 QString constructedName;
251 if (!objectStringId.isEmpty()) {
252 constructedName = objectStringId + QLatin1String(
" (") + className + QLatin1Char(
')');
253 }
else if (!item->objectName().isEmpty()) {
254 constructedName = item->objectName() + QLatin1String(
" (") + className + QLatin1Char(
')');
256 constructedName = className;
259 return constructedName;
264 QQmlContext *context = qmlContext(obj);
266 QQmlRefPointer<QQmlContextData> cdata = QQmlContextData::get(context);
268 return cdata->findObjectId(obj);
276 QQmlDebugPacket ds(message);
284 ds >> requestId >> command;
287 for (QQuickWindowInspector *inspector : std::as_const(m_windowInspectors))
288 inspector->setEnabled(
true);
289 success = !m_windowInspectors.isEmpty();
290 }
else if (command ==
DISABLE) {
291 setSelectedItems(QList<QQuickItem*>());
292 for (QQuickWindowInspector *inspector : std::as_const(m_windowInspectors))
293 inspector->setEnabled(
false);
294 success = !m_windowInspectors.isEmpty();
295 }
else if (command ==
SELECT) {
299 QList<QQuickItem *> selectedObjects;
300 for (
int debugId : std::as_const(debugIds)) {
301 if (QQuickItem *obj =
302 qobject_cast<QQuickItem *>(QQmlDebugService::objectForId(debugId)))
303 selectedObjects << obj;
305 syncSelectedItems(selectedObjects);
309 QUnifiedTimer::instance()->setSpeedModifier(1 / speed);
313 for (QmlJSDebugger::QQuickWindowInspector *inspector : std::as_const(m_windowInspectors))
314 inspector->setShowAppOnTop(showOnTop);
315 success = !m_windowInspectors.isEmpty();
321 ds >> qml >> parentId >> imports >> filename;
322 if (QObject *parent = QQmlDebugService::objectForId(parentId)) {
323 if (createQmlObject(requestId, qml, parent, imports, filename))
335 if (QObject *obj = QQmlDebugService::objectForId(debugId))
341 int debugId, newParent;
342 ds >> debugId >> newParent;
343 success = reparentQmlObject(QQmlDebugService::objectForId(debugId),
344 QQmlDebugService::objectForId(newParent));
346 qWarning() <<
"Warning: Not handling command:" << command;
350 qWarning() <<
"Warning: Not handling type:" << type <<
REQUEST;
354 sendResult(requestId, success);
360 rs << QByteArray(
RESPONSE) << requestId << success;
361 emit messageToClient(QQmlInspectorService::s_key, rs.data());
367 qDeleteAll(m_highlightItems);