93 Q_Q(
const QStatusBar);
94 const bool rtl = q->layoutDirection() == Qt::RightToLeft;
97 int right = q->width() - 12;
99#if QT_CONFIG(sizegrip)
100 if (resizer && resizer->isVisible()) {
102 left = resizer->x() + resizer->width();
104 right = resizer->x();
108 for (
const auto &item : items) {
109 if (item.isPermanent() && item.widget->isVisible()) {
111 left = qMax(left, item.widget->x() + item.widget->width() + 2);
113 right = qMin(right, item.widget->x() - 2);
117 return QRect(left, 0, right-left, q->height());
255int QStatusBar::insertWidget(
int index, QWidget *widget,
int stretch)
261 QStatusBarPrivate::SBItem item{widget, stretch, QStatusBarPrivate::Normal};
263 int idx = d->indexToLastNonPermanentWidget();
264 if (Q_UNLIKELY(index < 0 || index > d->items.size() || (idx >= 0 && index > idx + 1))) {
265 qWarning(
"QStatusBar::insertWidget: Index out of range (%d), appending widget", index);
268 d->items.insert(index, item);
270 if (!d->tempItem.isEmpty())
274 if (!QWidgetPrivate::get(widget)->isExplicitlyHidden())
319int QStatusBar::insertPermanentWidget(
int index, QWidget *widget,
int stretch)
325 QStatusBarPrivate::SBItem item{widget, stretch, QStatusBarPrivate::Permanent};
327 int idx = d->indexToLastNonPermanentWidget();
328 if (Q_UNLIKELY(index < 0 || index > d->items.size() || (idx >= 0 && index <= idx))) {
329 qWarning(
"QStatusBar::insertPermanentWidget: Index out of range (%d), appending widget", index);
330 index = d->items.size();
332 d->items.insert(index, item);
335 if (!QWidgetPrivate::get(widget)->isExplicitlyHidden())
417void QStatusBar::reformat()
424#if QT_CONFIG(sizegrip)
426 d->box =
new QHBoxLayout(
this);
427 d->box->setContentsMargins(QMargins());
428 vbox =
new QVBoxLayout;
429 d->box->addLayout(vbox);
433 vbox = d->box =
new QVBoxLayout(
this);
434 d->box->setContentsMargins(QMargins());
437 QBoxLayout* l =
new QHBoxLayout;
442 int maxH = fontMetrics().height();
445 for (i = 0; i < d->items.size(); ++i) {
446 const auto &item = d->items.at(i);
447 if (item.isPermanent())
449 l->addWidget(item.widget, item.stretch);
450 int itemH = qMin(qSmartMinSize(item.widget).height(), item.widget->maximumHeight());
451 maxH = qMax(maxH, itemH);
456 for (; i < d->items.size(); ++i) {
457 const auto &item = d->items.at(i);
458 l->addWidget(item.widget, item.stretch);
459 int itemH = qMin(qSmartMinSize(item.widget).height(), item.widget->maximumHeight());
460 maxH = qMax(maxH, itemH);
462#if QT_CONFIG(sizegrip)
464 maxH = qMax(maxH, d->resizer->sizeHint().height());
465 d->box->addSpacing(1);
466 d->box->addWidget(d->resizer, 0, Qt::AlignBottom);
470 d->savedStrut = maxH;
558void QStatusBar::hideOrShow()
561 bool haveMessage = !d->tempItem.isEmpty();
563 for (
const auto &item : std::as_const(d->items)) {
564 if (item.isPermanent())
566 if (haveMessage && item.widget->isVisible()) {
568 item.widget->setAttribute(Qt::WA_WState_ExplicitShowHide,
false);
569 }
else if (!haveMessage && !item.widget->testAttribute(Qt::WA_WState_ExplicitShowHide)) {
574 emit messageChanged(d->tempItem);
576#if QT_CONFIG(accessibility)
577 if (QAccessible::isActive()) {
578 QAccessibleEvent event(
this, QAccessible::NameChanged);
579 QAccessible::updateAccessibility(&event);
583 update(d->messageRect());
605void QStatusBar::paintEvent(QPaintEvent *event)
608 bool haveMessage = !d->tempItem.isEmpty();
613 style()->drawPrimitive(QStyle::PE_PanelStatusBar, &opt, &p,
this);
615 for (
const auto &item : std::as_const(d->items)) {
616 if (item.widget->isVisible() && (!haveMessage || item.isPermanent())) {
617 QRect ir = item.widget->geometry().adjusted(-2, -1, 2, 1);
618 if (event->rect().intersects(ir)) {
621 opt.palette = palette();
622 opt.state = QStyle::State_None;
623 style()->drawPrimitive(QStyle::PE_FrameStatusBarItem, &opt, &p, item.widget);
628 p.setPen(palette().windowText().color());
629 p.drawText(d->messageRect(), Qt::AlignLeading | Qt::AlignVCenter | Qt::TextSingleLine, d->tempItem);
645bool QStatusBar::event(QEvent *e)
650 case QEvent::LayoutRequest: {
652 int maxH = fontMetrics().height();
654 for (
const auto &item : std::as_const(d->items)) {
655 const int itemH = qMin(qSmartMinSize(item.widget).height(), item.widget->maximumHeight());
656 maxH = qMax(maxH, itemH);
659#if QT_CONFIG(sizegrip)
661 maxH = qMax(maxH, d->resizer->sizeHint().height());
664 if (maxH != d->savedStrut)
670 case QEvent::ChildRemoved:
671 for (
int i = 0; i < d->items.size(); ++i) {
672 const auto &item = d->items.at(i);
673 if (item.widget ==
static_cast<QChildEvent *>(e)->child())
674 d->items.removeAt(i);
681 return QWidget::event(e);