52static void normalizeHints(qreal &minimum, qreal &preferred, qreal &maximum, qreal &descent)
54 if (minimum >= 0 && maximum >= 0 && minimum > maximum)
58 if (minimum >= 0 && preferred < minimum) {
60 }
else if (maximum >= 0 && preferred > maximum) {
65 if (minimum >= 0 && descent > minimum)
72QGraphicsLayoutItemPrivate::QGraphicsLayoutItemPrivate(QGraphicsLayoutItem *par,
bool layout)
73 : parent(par), userSizeHints(
nullptr), isLayout(layout), ownedByLayout(
false), graphicsItem(
nullptr)
98QSizeF *QGraphicsLayoutItemPrivate::effectiveSizeHints(
const QSizeF &constraint)
const
100 Q_Q(
const QGraphicsLayoutItem);
101 QSizeF *sizeHintCache;
102 const bool hasConstraint = constraint.width() >= 0 || constraint.height() >= 0;
104 if (!sizeHintWithConstraintCacheDirty && constraint == cachedConstraint)
105 return cachedSizeHintsWithConstraints;
106 sizeHintCache = cachedSizeHintsWithConstraints;
108 if (!sizeHintCacheDirty)
109 return cachedSizeHints;
110 sizeHintCache = cachedSizeHints;
113 for (
int i = 0; i < Qt::NSizeHints; ++i) {
114 sizeHintCache[i] = constraint;
116 combineSize(sizeHintCache[i], userSizeHints[i]);
119 QSizeF &minS = sizeHintCache[Qt::MinimumSize];
120 QSizeF &prefS = sizeHintCache[Qt::PreferredSize];
121 QSizeF &maxS = sizeHintCache[Qt::MaximumSize];
122 QSizeF &descentS = sizeHintCache[Qt::MinimumDescent];
124 normalizeHints(minS.rwidth(), prefS.rwidth(), maxS.rwidth(), descentS.rwidth());
125 normalizeHints(minS.rheight(), prefS.rheight(), maxS.rheight(), descentS.rheight());
132 expandSize(maxS, prefS);
133 expandSize(maxS, minS);
137 expandSize(minS, QSizeF(0, 0));
138 boundSize(minS, prefS);
139 boundSize(minS, maxS);
141 COMBINE_SIZE(prefS, q->sizeHint(Qt::PreferredSize, prefS));
142 expandSize(prefS, minS);
143 boundSize(prefS, maxS);
149 cachedConstraint = constraint;
150 sizeHintWithConstraintCacheDirty =
false;
152 sizeHintCacheDirty =
false;
154 return sizeHintCache;
174QGraphicsItem *QGraphicsLayoutItemPrivate::parentItem()
const
176 Q_Q(
const QGraphicsLayoutItem);
178 const QGraphicsLayoutItem *parent = q;
179 while (parent && parent->isLayout()) {
180 parent = parent->parentLayoutItem();
182 return parent ? parent->graphicsItem() :
nullptr;
202void QGraphicsLayoutItemPrivate::setSize(Qt::SizeHint which,
const QSizeF &size)
204 Q_Q(QGraphicsLayoutItem);
207 if (size == userSizeHints[which])
209 }
else if (size.width() < 0 && size.height() < 0) {
213 ensureUserSizeHints();
214 userSizeHints[which] = size;
223void QGraphicsLayoutItemPrivate::setSizeComponent(
224 Qt::SizeHint which, SizeComponent component, qreal value)
226 Q_Q(QGraphicsLayoutItem);
227 ensureUserSizeHints();
228 qreal &userValue = (component == Width)
229 ? userSizeHints[which].rwidth()
230 : userSizeHints[which].rheight();
231 if (value == userValue)
238bool QGraphicsLayoutItemPrivate::hasHeightForWidth()
const
240 Q_Q(
const QGraphicsLayoutItem);
242 const QGraphicsLayout *l =
static_cast<
const QGraphicsLayout *>(q);
243 for (
int i = l->count() - 1; i >= 0; --i) {
244 if (QGraphicsLayoutItemPrivate::get(l->itemAt(i))->hasHeightForWidth())
247 }
else if (QGraphicsItem *item = q->graphicsItem()) {
248 if (item->isWidget()) {
249 QGraphicsWidget *w =
static_cast<QGraphicsWidget *>(item);
251 return QGraphicsLayoutItemPrivate::get(w->layout())->hasHeightForWidth();
255 return q->sizePolicy().hasHeightForWidth();
258bool QGraphicsLayoutItemPrivate::hasWidthForHeight()
const
260 Q_Q(
const QGraphicsLayoutItem);
262 const QGraphicsLayout *l =
static_cast<
const QGraphicsLayout *>(q);
263 for (
int i = l->count() - 1; i >= 0; --i) {
264 if (QGraphicsLayoutItemPrivate::get(l->itemAt(i))->hasWidthForHeight())
267 }
else if (QGraphicsItem *item = q->graphicsItem()) {
268 if (item->isWidget()) {
269 QGraphicsWidget *w =
static_cast<QGraphicsWidget *>(item);
271 return QGraphicsLayoutItemPrivate::get(w->layout())->hasWidthForHeight();
275 return q->sizePolicy().hasWidthForHeight();
354QGraphicsLayoutItem::QGraphicsLayoutItem(QGraphicsLayoutItem *parent,
bool isLayout)
355 : d_ptr(
new QGraphicsLayoutItemPrivate(parent, isLayout))
357 Q_D(QGraphicsLayoutItem);
359 d->sizePolicy = QSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
377QGraphicsLayoutItem::~QGraphicsLayoutItem()
379 QGraphicsLayoutItem *parentLI = parentLayoutItem();
380 if (parentLI && parentLI->isLayout()) {
381 QGraphicsLayout *lay =
static_cast<QGraphicsLayout*>(parentLI);
383 for (
int i = lay->count() - 1; i >= 0; --i) {
384 if (lay->itemAt(i) ==
this) {
434void QGraphicsLayoutItem::setSizePolicy(QSizePolicy::Policy hPolicy,
435 QSizePolicy::Policy vPolicy,
436 QSizePolicy::ControlType controlType)
438 setSizePolicy(QSizePolicy(hPolicy, vPolicy, controlType));
679void QGraphicsLayoutItem::setGeometry(
const QRectF &rect)
681 Q_D(QGraphicsLayoutItem);
682 QSizeF effectiveSize = rect.size().expandedTo(effectiveSizeHint(Qt::MinimumSize))
683 .boundedTo(effectiveSizeHint(Qt::MaximumSize));
684 d->geom = QRectF(rect.topLeft(), effectiveSize);
732QRectF QGraphicsLayoutItem::contentsRect()
const
734 qreal left, top, right, bottom;
735 getContentsMargins(&left, &top, &right, &bottom);
736 return QRectF(QPointF(), geometry().size()).adjusted(+left, +top, -right, -bottom);