28QQuickDesignerSupport::~QQuickDesignerSupport()
30 typedef QHash<QQuickItem*, QSGLayer*>::iterator ItemTextureHashIt;
32 for (ItemTextureHashIt iterator = m_itemTextureHash.begin(), end = m_itemTextureHash.end(); iterator != end; ++iterator) {
33 QSGLayer *texture = iterator.value();
34 QQuickItem *item = iterator.key();
35 QQuickItemPrivate::get(item)->derefFromEffectItem(
true);
40void QQuickDesignerSupport::refFromEffectItem(QQuickItem *referencedItem,
bool hide)
42 if (referencedItem ==
nullptr)
45 QQuickItemPrivate::get(referencedItem)->refFromEffectItem(hide);
46 QQuickWindowPrivate::get(referencedItem->window())->updateDirtyNode(referencedItem);
48 Q_ASSERT(QQuickItemPrivate::get(referencedItem)->rootNode());
50 if (!m_itemTextureHash.contains(referencedItem)) {
51 QSGRenderContext *rc = QQuickWindowPrivate::get(referencedItem->window())->context;
52 QSGLayer *texture = rc->sceneGraphContext()->createLayer(rc);
54 QSizeF itemSize = referencedItem->size();
55 texture->setLive(
true);
56 texture->setItem(QQuickItemPrivate::get(referencedItem)->rootNode());
57 texture->setRect(QRectF(QPointF(0, 0), itemSize));
58 texture->setSize(itemSize.toSize());
59 texture->setRecursive(
true);
60 texture->setFormat(QSGLayer::RGBA8);
61 texture->setHasMipmaps(
false);
63 m_itemTextureHash.insert(referencedItem, texture);
76QImage QQuickDesignerSupport::renderImageForItem(QQuickItem *referencedItem,
const QRectF &boundingRect,
const QSize &imageSize)
78 if (referencedItem ==
nullptr || referencedItem->parentItem() ==
nullptr) {
79 qDebug() << __FILE__ << __LINE__ <<
"Warning: Item can be rendered.";
83 QSGLayer *renderTexture = m_itemTextureHash.value(referencedItem);
85 Q_ASSERT(renderTexture);
86 if (renderTexture ==
nullptr)
88 renderTexture->setRect(boundingRect);
89 renderTexture->setSize(imageSize);
90 renderTexture->setItem(QQuickItemPrivate::get(referencedItem)->rootNode());
91 renderTexture->markDirtyTexture();
92 renderTexture->updateTexture();
94 QImage renderImage = renderTexture->toImage();
97 if (renderImage.size().isEmpty())
98 qDebug() << __FILE__ << __LINE__ <<
"Warning: Image is empty.";
150 switch (anchorLine) {
151 case QQuickAnchors::LeftAnchor:
return QLatin1String(
"left");
152 case QQuickAnchors::RightAnchor:
return QLatin1String(
"right");
153 case QQuickAnchors::TopAnchor:
return QLatin1String(
"top");
154 case QQuickAnchors::BottomAnchor:
return QLatin1String(
"bottom");
155 case QQuickAnchors::HCenterAnchor:
return QLatin1String(
"horizontalCenter");
156 case QQuickAnchors::VCenterAnchor:
return QLatin1String(
"verticalCenter");
157 case QQuickAnchors::BaselineAnchor:
return QLatin1String(
"baseline");
158 case QQuickAnchors::InvalidAnchor:
159 default:
return QString();
178bool QQuickDesignerSupport::isAnchoredTo(QQuickItem *fromItem, QQuickItem *toItem)
180 QQuickItemPrivate *fromItemPrivate = QQuickItemPrivate::get(fromItem);
181 QQuickAnchors *anchors = fromItemPrivate->anchors();
182 return anchors->fill() == toItem
183 || anchors->centerIn() == toItem
184 || anchors->bottom().item == toItem
185 || anchors->top().item == toItem
186 || anchors->left().item == toItem
187 || anchors->right().item == toItem
188 || anchors->verticalCenter().item == toItem
189 || anchors->horizontalCenter().item == toItem
190 || anchors->baseline().item == toItem;
193bool QQuickDesignerSupport::areChildrenAnchoredTo(QQuickItem *fromItem, QQuickItem *toItem)
195 const auto childItems = fromItem->childItems();
196 for (QQuickItem *childItem : childItems) {
198 if (isAnchoredTo(childItem, toItem))
201 if (areChildrenAnchoredTo(childItem, toItem))
217 if (name == QLatin1String(
"anchors.top"))
218 return QQuickAnchors::TopAnchor;
220 if (name == QLatin1String(
"anchors.left"))
221 return QQuickAnchors::LeftAnchor;
223 if (name == QLatin1String(
"anchors.bottom"))
224 return QQuickAnchors::BottomAnchor;
226 if (name == QLatin1String(
"anchors.right"))
227 return QQuickAnchors::RightAnchor;
229 if (name == QLatin1String(
"anchors.horizontalCenter"))
230 return QQuickAnchors::HCenterAnchor;
232 if (name == QLatin1String(
"anchors.verticalCenter"))
233 return QQuickAnchors::VCenterAnchor;
235 if (name == QLatin1String(
"anchors.baseline"))
236 return QQuickAnchors::BaselineAnchor;
239 Q_ASSERT_X(
false, Q_FUNC_INFO,
"wrong anchor name - this should never happen");
240 return QQuickAnchors::LeftAnchor;
243bool QQuickDesignerSupport::hasAnchor(QQuickItem *item,
const QString &name)
245 if (!isValidAnchorName(name))
248 if (name == QLatin1String(
"anchors.fill"))
249 return anchors(item)->fill() !=
nullptr;
251 if (name == QLatin1String(
"anchors.centerIn"))
252 return anchors(item)->centerIn() !=
nullptr;
254 if (name == QLatin1String(
"anchors.right"))
255 return anchors(item)->right().item !=
nullptr;
257 if (name == QLatin1String(
"anchors.top"))
258 return anchors(item)->top().item !=
nullptr;
260 if (name == QLatin1String(
"anchors.left"))
261 return anchors(item)->left().item !=
nullptr;
263 if (name == QLatin1String(
"anchors.bottom"))
264 return anchors(item)->bottom().item !=
nullptr;
266 if (name == QLatin1String(
"anchors.horizontalCenter"))
267 return anchors(item)->horizontalCenter().item !=
nullptr;
269 if (name == QLatin1String(
"anchors.verticalCenter"))
270 return anchors(item)->verticalCenter().item !=
nullptr;
272 if (name == QLatin1String(
"anchors.baseline"))
273 return anchors(item)->baseline().item !=
nullptr;
275 return anchors(item)->usedAnchors().testFlag(anchorLineFlagForName(name));
290std::pair<QString, QObject*> QQuickDesignerSupport::anchorLineTarget(QQuickItem *item,
const QString &name, QQmlContext *context)
292 QObject *targetObject =
nullptr;
295 if (name == QLatin1String(
"anchors.fill")) {
296 targetObject = anchors(item)->fill();
297 }
else if (name == QLatin1String(
"anchors.centerIn")) {
298 targetObject = anchors(item)->centerIn();
300 QQmlProperty metaProperty(item, name, context);
301 if (!metaProperty.isValid())
302 return std::pair<QString, QObject*>();
304 QQuickAnchorLine anchorLine = metaProperty.read().value<QQuickAnchorLine>();
305 if (anchorLine.anchorLine != QQuickAnchors::InvalidAnchor) {
306 targetObject = anchorLine.item;
307 targetName = propertyNameForAnchorLine(anchorLine.anchorLine);
312 return std::pair<QString, QObject*>(targetName, targetObject);
315void QQuickDesignerSupport::resetAnchor(QQuickItem *item,
const QString &name)
317 if (name == QLatin1String(
"anchors.fill")) {
318 anchors(item)->resetFill();
319 }
else if (name == QLatin1String(
"anchors.centerIn")) {
320 anchors(item)->resetCenterIn();
321 }
else if (name == QLatin1String(
"anchors.top")) {
322 anchors(item)->resetTop();
323 }
else if (name == QLatin1String(
"anchors.left")) {
324 anchors(item)->resetLeft();
325 }
else if (name == QLatin1String(
"anchors.right")) {
326 anchors(item)->resetRight();
327 }
else if (name == QLatin1String(
"anchors.bottom")) {
328 anchors(item)->resetBottom();
329 }
else if (name == QLatin1String(
"anchors.horizontalCenter")) {
330 anchors(item)->resetHorizontalCenter();
331 }
else if (name == QLatin1String(
"anchors.verticalCenter")) {
332 anchors(item)->resetVerticalCenter();
333 }
else if (name == QLatin1String(
"anchors.baseline")) {
334 anchors(item)->resetBaseline();
338void QQuickDesignerSupport::emitComponentCompleteSignalForAttachedProperty(QObject *object)
343 QQmlData *data = QQmlData::get(object);
344 if (data && data->context) {
345 QQmlComponentAttached *componentAttached = data->context->componentAttacheds();
346 while (componentAttached) {
347 if (componentAttached->parent())
348 if (componentAttached->parent() == object)
349 emit componentAttached->completed();
351 componentAttached = componentAttached->next();
356QList<QObject*> QQuickDesignerSupport::statesForItem(QQuickItem *item)
358 QList<QObject*> objectList;
359 const QList<QQuickState *> stateList = QQuickItemPrivate::get(item)->_states()->states();
361 objectList.reserve(stateList.size());
362 for (QQuickState* state : stateList)
363 objectList.append(state);