53static void normalizeHints(qreal &minimum, qreal &preferred, qreal &maximum, qreal &descent)
55 if (minimum >= 0 && maximum >= 0 && minimum > maximum)
59 if (minimum >= 0 && preferred < minimum) {
61 }
else if (maximum >= 0 && preferred > maximum) {
66 if (minimum >= 0 && descent > minimum)
73QGraphicsLayoutItemPrivate::QGraphicsLayoutItemPrivate(QGraphicsLayoutItem *par,
bool layout)
74 : parent(par), userSizeHints(
nullptr), isLayout(layout), ownedByLayout(
false), graphicsItem(
nullptr)
99QSizeF *QGraphicsLayoutItemPrivate::effectiveSizeHints(
const QSizeF &constraint)
const
101 Q_Q(
const QGraphicsLayoutItem);
102 QSizeF *sizeHintCache;
103 const bool hasConstraint = constraint.width() >= 0 || constraint.height() >= 0;
105 if (!sizeHintWithConstraintCacheDirty && constraint == cachedConstraint)
106 return cachedSizeHintsWithConstraints;
107 sizeHintCache = cachedSizeHintsWithConstraints;
109 if (!sizeHintCacheDirty)
110 return cachedSizeHints;
111 sizeHintCache = cachedSizeHints;
114 for (
int i = 0; i < Qt::NSizeHints; ++i) {
115 sizeHintCache[i] = constraint;
117 combineSize(sizeHintCache[i], userSizeHints[i]);
120 QSizeF &minS = sizeHintCache[Qt::MinimumSize];
121 QSizeF &prefS = sizeHintCache[Qt::PreferredSize];
122 QSizeF &maxS = sizeHintCache[Qt::MaximumSize];
123 QSizeF &descentS = sizeHintCache[Qt::MinimumDescent];
125 normalizeHints(minS.rwidth(), prefS.rwidth(), maxS.rwidth(), descentS.rwidth());
126 normalizeHints(minS.rheight(), prefS.rheight(), maxS.rheight(), descentS.rheight());
133 expandSize(maxS, prefS);
134 expandSize(maxS, minS);
138 expandSize(minS, QSizeF(0, 0));
139 boundSize(minS, prefS);
140 boundSize(minS, maxS);
142 COMBINE_SIZE(prefS, q->sizeHint(Qt::PreferredSize, prefS));
143 expandSize(prefS, minS);
144 boundSize(prefS, maxS);
150 cachedConstraint = constraint;
151 sizeHintWithConstraintCacheDirty =
false;
153 sizeHintCacheDirty =
false;
155 return sizeHintCache;
175QGraphicsItem *QGraphicsLayoutItemPrivate::parentItem()
const
177 Q_Q(
const QGraphicsLayoutItem);
179 const QGraphicsLayoutItem *parent = q;
180 while (parent && parent->isLayout()) {
181 parent = parent->parentLayoutItem();
183 return parent ? parent->graphicsItem() :
nullptr;
203void QGraphicsLayoutItemPrivate::setSize(Qt::SizeHint which,
const QSizeF &size)
205 Q_Q(QGraphicsLayoutItem);
208 if (size == userSizeHints[which])
210 }
else if (size.width() < 0 && size.height() < 0) {
214 ensureUserSizeHints();
215 userSizeHints[which] = size;
224void QGraphicsLayoutItemPrivate::setSizeComponent(
225 Qt::SizeHint which, SizeComponent component, qreal value)
227 Q_Q(QGraphicsLayoutItem);
228 ensureUserSizeHints();
229 qreal &userValue = (component == Width)
230 ? userSizeHints[which].rwidth()
231 : userSizeHints[which].rheight();
232 if (value == userValue)
239bool QGraphicsLayoutItemPrivate::hasHeightForWidth()
const
241 Q_Q(
const QGraphicsLayoutItem);
243 const QGraphicsLayout *l =
static_cast<
const QGraphicsLayout *>(q);
244 for (
int i = l->count() - 1; i >= 0; --i) {
245 if (QGraphicsLayoutItemPrivate::get(l->itemAt(i))->hasHeightForWidth())
248 }
else if (QGraphicsItem *item = q->graphicsItem()) {
249 if (item->isWidget()) {
250 QGraphicsWidget *w =
static_cast<QGraphicsWidget *>(item);
252 return QGraphicsLayoutItemPrivate::get(w->layout())->hasHeightForWidth();
256 return q->sizePolicy().hasHeightForWidth();
259bool QGraphicsLayoutItemPrivate::hasWidthForHeight()
const
261 Q_Q(
const QGraphicsLayoutItem);
263 const QGraphicsLayout *l =
static_cast<
const QGraphicsLayout *>(q);
264 for (
int i = l->count() - 1; i >= 0; --i) {
265 if (QGraphicsLayoutItemPrivate::get(l->itemAt(i))->hasWidthForHeight())
268 }
else if (QGraphicsItem *item = q->graphicsItem()) {
269 if (item->isWidget()) {
270 QGraphicsWidget *w =
static_cast<QGraphicsWidget *>(item);
272 return QGraphicsLayoutItemPrivate::get(w->layout())->hasWidthForHeight();
276 return q->sizePolicy().hasWidthForHeight();
355QGraphicsLayoutItem::QGraphicsLayoutItem(QGraphicsLayoutItem *parent,
bool isLayout)
356 : d_ptr(
new QGraphicsLayoutItemPrivate(parent, isLayout))
358 Q_D(QGraphicsLayoutItem);
360 d->sizePolicy = QSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
378QGraphicsLayoutItem::~QGraphicsLayoutItem()
380 QGraphicsLayoutItem *parentLI = parentLayoutItem();
381 if (parentLI && parentLI->isLayout()) {
382 QGraphicsLayout *lay =
static_cast<QGraphicsLayout*>(parentLI);
384 for (
int i = lay->count() - 1; i >= 0; --i) {
385 if (lay->itemAt(i) ==
this) {
435void QGraphicsLayoutItem::setSizePolicy(QSizePolicy::Policy hPolicy,
436 QSizePolicy::Policy vPolicy,
437 QSizePolicy::ControlType controlType)
439 setSizePolicy(QSizePolicy(hPolicy, vPolicy, controlType));
680void QGraphicsLayoutItem::setGeometry(
const QRectF &rect)
682 Q_D(QGraphicsLayoutItem);
683 QSizeF effectiveSize = rect.size().expandedTo(effectiveSizeHint(Qt::MinimumSize))
684 .boundedTo(effectiveSizeHint(Qt::MaximumSize));
685 d->geom = QRectF(rect.topLeft(), effectiveSize);
733QRectF QGraphicsLayoutItem::contentsRect()
const
735 qreal left, top, right, bottom;
736 getContentsMargins(&left, &top, &right, &bottom);
737 return QRectF(QPointF(), geometry().size()).adjusted(+left, +top, -right, -bottom);