27QQuickDesignerSupport::~QQuickDesignerSupport()
29 typedef QHash<QQuickItem*, QSGLayer*>::iterator ItemTextureHashIt;
31 for (ItemTextureHashIt iterator = m_itemTextureHash.begin(), end = m_itemTextureHash.end(); iterator != end; ++iterator) {
32 QSGLayer *texture = iterator.value();
33 QQuickItem *item = iterator.key();
34 QQuickItemPrivate::get(item)->derefFromEffectItem(
true);
39void QQuickDesignerSupport::refFromEffectItem(QQuickItem *referencedItem,
bool hide)
41 if (referencedItem ==
nullptr)
44 QQuickItemPrivate::get(referencedItem)->refFromEffectItem(hide);
45 QQuickWindowPrivate::get(referencedItem->window())->updateDirtyNode(referencedItem);
47 Q_ASSERT(QQuickItemPrivate::get(referencedItem)->rootNode());
49 if (!m_itemTextureHash.contains(referencedItem)) {
50 QSGRenderContext *rc = QQuickWindowPrivate::get(referencedItem->window())->context;
51 QSGLayer *texture = rc->sceneGraphContext()->createLayer(rc);
53 QSizeF itemSize = referencedItem->size();
54 texture->setLive(
true);
55 texture->setItem(QQuickItemPrivate::get(referencedItem)->rootNode());
56 texture->setRect(QRectF(QPointF(0, 0), itemSize));
57 texture->setSize(itemSize.toSize());
58 texture->setRecursive(
true);
59 texture->setFormat(QSGLayer::RGBA8);
60 texture->setHasMipmaps(
false);
62 m_itemTextureHash.insert(referencedItem, texture);
75QImage QQuickDesignerSupport::renderImageForItem(QQuickItem *referencedItem,
const QRectF &boundingRect,
const QSize &imageSize)
77 if (referencedItem ==
nullptr || referencedItem->parentItem() ==
nullptr) {
78 qDebug() << __FILE__ << __LINE__ <<
"Warning: Item can be rendered.";
82 QSGLayer *renderTexture = m_itemTextureHash.value(referencedItem);
84 Q_ASSERT(renderTexture);
85 if (renderTexture ==
nullptr)
87 renderTexture->setRect(boundingRect);
88 renderTexture->setSize(imageSize);
89 renderTexture->setItem(QQuickItemPrivate::get(referencedItem)->rootNode());
90 renderTexture->markDirtyTexture();
91 renderTexture->updateTexture();
93 QImage renderImage = renderTexture->toImage();
96 if (renderImage.size().isEmpty())
97 qDebug() << __FILE__ << __LINE__ <<
"Warning: Image is empty.";
149 switch (anchorLine) {
150 case QQuickAnchors::LeftAnchor:
return QLatin1String(
"left");
151 case QQuickAnchors::RightAnchor:
return QLatin1String(
"right");
152 case QQuickAnchors::TopAnchor:
return QLatin1String(
"top");
153 case QQuickAnchors::BottomAnchor:
return QLatin1String(
"bottom");
154 case QQuickAnchors::HCenterAnchor:
return QLatin1String(
"horizontalCenter");
155 case QQuickAnchors::VCenterAnchor:
return QLatin1String(
"verticalCenter");
156 case QQuickAnchors::BaselineAnchor:
return QLatin1String(
"baseline");
157 case QQuickAnchors::InvalidAnchor:
158 default:
return QString();
177bool QQuickDesignerSupport::isAnchoredTo(QQuickItem *fromItem, QQuickItem *toItem)
179 QQuickItemPrivate *fromItemPrivate = QQuickItemPrivate::get(fromItem);
180 QQuickAnchors *anchors = fromItemPrivate->anchors();
181 return anchors->fill() == toItem
182 || anchors->centerIn() == toItem
183 || anchors->bottom().item == toItem
184 || anchors->top().item == toItem
185 || anchors->left().item == toItem
186 || anchors->right().item == toItem
187 || anchors->verticalCenter().item == toItem
188 || anchors->horizontalCenter().item == toItem
189 || anchors->baseline().item == toItem;
192bool QQuickDesignerSupport::areChildrenAnchoredTo(QQuickItem *fromItem, QQuickItem *toItem)
194 const auto childItems = fromItem->childItems();
195 for (QQuickItem *childItem : childItems) {
197 if (isAnchoredTo(childItem, toItem))
200 if (areChildrenAnchoredTo(childItem, toItem))
216 if (name == QLatin1String(
"anchors.top"))
217 return QQuickAnchors::TopAnchor;
219 if (name == QLatin1String(
"anchors.left"))
220 return QQuickAnchors::LeftAnchor;
222 if (name == QLatin1String(
"anchors.bottom"))
223 return QQuickAnchors::BottomAnchor;
225 if (name == QLatin1String(
"anchors.right"))
226 return QQuickAnchors::RightAnchor;
228 if (name == QLatin1String(
"anchors.horizontalCenter"))
229 return QQuickAnchors::HCenterAnchor;
231 if (name == QLatin1String(
"anchors.verticalCenter"))
232 return QQuickAnchors::VCenterAnchor;
234 if (name == QLatin1String(
"anchors.baseline"))
235 return QQuickAnchors::BaselineAnchor;
238 Q_ASSERT_X(
false, Q_FUNC_INFO,
"wrong anchor name - this should never happen");
239 return QQuickAnchors::LeftAnchor;
242bool QQuickDesignerSupport::hasAnchor(QQuickItem *item,
const QString &name)
244 if (!isValidAnchorName(name))
247 if (name == QLatin1String(
"anchors.fill"))
248 return anchors(item)->fill() !=
nullptr;
250 if (name == QLatin1String(
"anchors.centerIn"))
251 return anchors(item)->centerIn() !=
nullptr;
253 if (name == QLatin1String(
"anchors.right"))
254 return anchors(item)->right().item !=
nullptr;
256 if (name == QLatin1String(
"anchors.top"))
257 return anchors(item)->top().item !=
nullptr;
259 if (name == QLatin1String(
"anchors.left"))
260 return anchors(item)->left().item !=
nullptr;
262 if (name == QLatin1String(
"anchors.bottom"))
263 return anchors(item)->bottom().item !=
nullptr;
265 if (name == QLatin1String(
"anchors.horizontalCenter"))
266 return anchors(item)->horizontalCenter().item !=
nullptr;
268 if (name == QLatin1String(
"anchors.verticalCenter"))
269 return anchors(item)->verticalCenter().item !=
nullptr;
271 if (name == QLatin1String(
"anchors.baseline"))
272 return anchors(item)->baseline().item !=
nullptr;
274 return anchors(item)->usedAnchors().testFlag(anchorLineFlagForName(name));
289std::pair<QString, QObject*> QQuickDesignerSupport::anchorLineTarget(QQuickItem *item,
const QString &name, QQmlContext *context)
291 QObject *targetObject =
nullptr;
294 if (name == QLatin1String(
"anchors.fill")) {
295 targetObject = anchors(item)->fill();
296 }
else if (name == QLatin1String(
"anchors.centerIn")) {
297 targetObject = anchors(item)->centerIn();
299 QQmlProperty metaProperty(item, name, context);
300 if (!metaProperty.isValid())
301 return std::pair<QString, QObject*>();
303 QQuickAnchorLine anchorLine = metaProperty.read().value<QQuickAnchorLine>();
304 if (anchorLine.anchorLine != QQuickAnchors::InvalidAnchor) {
305 targetObject = anchorLine.item;
306 targetName = propertyNameForAnchorLine(anchorLine.anchorLine);
311 return std::pair<QString, QObject*>(targetName, targetObject);
314void QQuickDesignerSupport::resetAnchor(QQuickItem *item,
const QString &name)
316 if (name == QLatin1String(
"anchors.fill")) {
317 anchors(item)->resetFill();
318 }
else if (name == QLatin1String(
"anchors.centerIn")) {
319 anchors(item)->resetCenterIn();
320 }
else if (name == QLatin1String(
"anchors.top")) {
321 anchors(item)->resetTop();
322 }
else if (name == QLatin1String(
"anchors.left")) {
323 anchors(item)->resetLeft();
324 }
else if (name == QLatin1String(
"anchors.right")) {
325 anchors(item)->resetRight();
326 }
else if (name == QLatin1String(
"anchors.bottom")) {
327 anchors(item)->resetBottom();
328 }
else if (name == QLatin1String(
"anchors.horizontalCenter")) {
329 anchors(item)->resetHorizontalCenter();
330 }
else if (name == QLatin1String(
"anchors.verticalCenter")) {
331 anchors(item)->resetVerticalCenter();
332 }
else if (name == QLatin1String(
"anchors.baseline")) {
333 anchors(item)->resetBaseline();
337void QQuickDesignerSupport::emitComponentCompleteSignalForAttachedProperty(QObject *object)
342 QQmlData *data = QQmlData::get(object);
343 if (data && data->context) {
344 QQmlComponentAttached *componentAttached = data->context->componentAttacheds();
345 while (componentAttached) {
346 if (componentAttached->parent())
347 if (componentAttached->parent() == object)
348 emit componentAttached->completed();
350 componentAttached = componentAttached->next();
355QList<QObject*> QQuickDesignerSupport::statesForItem(QQuickItem *item)
357 QList<QObject*> objectList;
358 const QList<QQuickState *> stateList = QQuickItemPrivate::get(item)->_states()->states();
360 objectList.reserve(stateList.size());
361 for (QQuickState* state : stateList)
362 objectList.append(state);