18class QStackedLayoutPrivate :
public QLayoutPrivate
20 Q_DECLARE_PUBLIC(QStackedLayout)
22 QStackedLayoutPrivate() : index(-1), stackingMode(QStackedLayout::StackOne) {}
23 QLayoutItem* replaceAt(
int index, QLayoutItem *newitem) override;
24 QList<QLayoutItem *> list;
26 QStackedLayout::StackingMode stackingMode;
29QLayoutItem* QStackedLayoutPrivate::replaceAt(
int idx, QLayoutItem *newitem)
32 if (idx < 0 || idx >= list.size() || !newitem)
34 QWidget *wdg = newitem->widget();
35 if (Q_UNLIKELY(!wdg)) {
36 qWarning(
"QStackedLayout::replaceAt: Only widgets can be added");
39 QLayoutItem *orgitem = list.at(idx);
40 list.replace(idx, newitem);
42 q->setCurrentIndex(index);
200int QStackedLayout::insertWidget(
int index, QWidget *widget)
203 addChildWidget(widget);
204 index = qMin(index, d->list.size());
206 index = d->list.size();
207 QWidgetItem *wi = QLayoutPrivate::createWidgetItem(
this, widget);
208 d->list.insert(index, wi);
211 setCurrentIndex(index);
213 if (index <= d->index)
215 if (d->stackingMode == StackOne)
219 emit widgetAdded(index);
244QLayoutItem *QStackedLayout::takeAt(
int index)
247 if (index <0 || index >= d->list.size())
249 QLayoutItem *item = d->list.takeAt(index);
250 if (index == d->index) {
252 if ( d->list.size() > 0 ) {
253 int newIndex = (index == d->list.size()) ? index-1 : index;
254 setCurrentIndex(newIndex);
256 emit currentChanged(-1);
258 }
else if (index < d->index) {
261 emit widgetRemoved(index);
262 if (item->widget() && !qt_wasDeleted(item->widget()))
263 item->widget()->hide();
275void QStackedLayout::setCurrentIndex(
int index)
278 QWidget *prev = currentWidget();
279 QWidget *next = widget(index);
280 if (!next || next == prev)
283 bool reenableUpdates =
false;
284 QWidget *parent = parentWidget();
286 if (parent && parent->updatesEnabled()) {
287 reenableUpdates =
true;
288 parent->setUpdatesEnabled(
false);
291 QPointer<QWidget> fw = parent ? parent->window()->focusWidget() :
nullptr;
292 const bool focusWasOnOldPage = fw && (prev && prev->isAncestorOf(fw));
296 if (d->stackingMode == StackOne)
308 if (focusWasOnOldPage) {
310 if (QWidget *nfw = next->focusWidget())
314 if (QWidget *i = fw) {
315 while ((i = i->nextInFocusChain()) != fw) {
316 if (((i->focusPolicy() & Qt::TabFocus) == Qt::TabFocus)
317 && !i->focusProxy() && i->isVisibleTo(next) && i->isEnabled()
318 && next->isAncestorOf(i)) {
331 parent->setUpdatesEnabled(
true);
332 emit currentChanged(index);
417QSize QStackedLayout::sizeHint()
const
419 Q_D(
const QStackedLayout);
421 int n = d->list.size();
423 for (
int i = 0; i < n; ++i)
424 if (QWidget *widget = d->list.at(i)->widget()) {
425 QSize ws(widget->sizeHint());
426 if (widget->sizePolicy().horizontalPolicy() == QSizePolicy::Ignored)
428 if (widget->sizePolicy().verticalPolicy() == QSizePolicy::Ignored)
430 s = s.expandedTo(ws);
453void QStackedLayout::setGeometry(
const QRect &rect)
456 switch (d->stackingMode) {
458 if (QWidget *widget = currentWidget())
459 widget->setGeometry(rect);
462 if (
const int n = d->list.size())
463 for (
int i = 0; i < n; ++i)
464 if (QWidget *widget = d->list.at(i)->widget())
465 widget->setGeometry(rect);
489int QStackedLayout::heightForWidth(
int width)
const
491 const int n = count();
494 for (
int i = 0; i < n; ++i) {
495 if (QLayoutItem *item = itemAt(i)) {
496 if (QWidget *w = item->widget())
498
499
500
501
502
503 hfw = qMax(hfw, w->heightForWidth(width));
506 hfw = qMax(hfw, minimumSize().height());
542void QStackedLayout::setStackingMode(StackingMode stackingMode)
545 if (d->stackingMode == stackingMode)
547 d->stackingMode = stackingMode;
549 const int n = d->list.size();
553 switch (d->stackingMode) {
555 if (
const int idx = currentIndex())
556 for (
int i = 0; i < n; ++i)
557 if (QWidget *widget = d->list.at(i)->widget())
558 widget->setVisible(i == idx);
562 if (
const QWidget *widget = currentWidget())
563 geometry = widget->geometry();
564 for (
int i = 0; i < n; ++i)
565 if (QWidget *widget = d->list.at(i)->widget()) {
566 if (!geometry.isNull())
567 widget->setGeometry(geometry);
568 widget->setVisible(
true);