94 Q_Q(
const QStatusBar);
95 const bool rtl = q->layoutDirection() == Qt::RightToLeft;
98 int right = q->width() - 12;
100#if QT_CONFIG(sizegrip)
101 if (resizer && resizer->isVisible()) {
103 left = resizer->x() + resizer->width();
105 right = resizer->x();
109 for (
const auto &item : items) {
110 if (item.isPermanent() && item.widget->isVisible()) {
112 left = qMax(left, item.widget->x() + item.widget->width() + 2);
114 right = qMin(right, item.widget->x() - 2);
118 return QRect(left, 0, right-left, q->height());
256int QStatusBar::insertWidget(
int index, QWidget *widget,
int stretch)
262 QStatusBarPrivate::SBItem item{widget, stretch, QStatusBarPrivate::Normal};
264 int idx = d->indexToLastNonPermanentWidget();
265 if (Q_UNLIKELY(index < 0 || index > d->items.size() || (idx >= 0 && index > idx + 1))) {
266 qWarning(
"QStatusBar::insertWidget: Index out of range (%d), appending widget", index);
269 d->items.insert(index, item);
271 if (!d->tempItem.isEmpty())
275 if (!QWidgetPrivate::get(widget)->isExplicitlyHidden())
320int QStatusBar::insertPermanentWidget(
int index, QWidget *widget,
int stretch)
326 QStatusBarPrivate::SBItem item{widget, stretch, QStatusBarPrivate::Permanent};
328 int idx = d->indexToLastNonPermanentWidget();
329 if (Q_UNLIKELY(index < 0 || index > d->items.size() || (idx >= 0 && index <= idx))) {
330 qWarning(
"QStatusBar::insertPermanentWidget: Index out of range (%d), appending widget", index);
331 index = d->items.size();
333 d->items.insert(index, item);
336 if (!QWidgetPrivate::get(widget)->isExplicitlyHidden())
418void QStatusBar::reformat()
425#if QT_CONFIG(sizegrip)
427 d->box =
new QHBoxLayout(
this);
428 d->box->setContentsMargins(QMargins());
429 vbox =
new QVBoxLayout;
430 d->box->addLayout(vbox);
434 vbox = d->box =
new QVBoxLayout(
this);
435 d->box->setContentsMargins(QMargins());
438 QBoxLayout* l =
new QHBoxLayout;
443 int maxH = fontMetrics().height();
446 for (i = 0; i < d->items.size(); ++i) {
447 const auto &item = d->items.at(i);
448 if (item.isPermanent())
450 l->addWidget(item.widget, item.stretch);
451 int itemH = qMin(qSmartMinSize(item.widget).height(), item.widget->maximumHeight());
452 maxH = qMax(maxH, itemH);
457 for (; i < d->items.size(); ++i) {
458 const auto &item = d->items.at(i);
459 l->addWidget(item.widget, item.stretch);
460 int itemH = qMin(qSmartMinSize(item.widget).height(), item.widget->maximumHeight());
461 maxH = qMax(maxH, itemH);
463#if QT_CONFIG(sizegrip)
465 maxH = qMax(maxH, d->resizer->sizeHint().height());
466 d->box->addSpacing(1);
467 d->box->addWidget(d->resizer, 0, Qt::AlignBottom);
471 d->savedStrut = maxH;
559void QStatusBar::hideOrShow()
562 bool haveMessage = !d->tempItem.isEmpty();
564 for (
const auto &item : std::as_const(d->items)) {
565 if (item.isPermanent())
567 if (haveMessage && item.widget->isVisible()) {
569 item.widget->setAttribute(Qt::WA_WState_ExplicitShowHide,
false);
570 }
else if (!haveMessage && !item.widget->testAttribute(Qt::WA_WState_ExplicitShowHide)) {
575 emit messageChanged(d->tempItem);
577#if QT_CONFIG(accessibility)
578 if (QAccessible::isActive()) {
579 QAccessibleEvent event(
this, QAccessible::NameChanged);
580 QAccessible::updateAccessibility(&event);
584 update(d->messageRect());
606void QStatusBar::paintEvent(QPaintEvent *event)
609 bool haveMessage = !d->tempItem.isEmpty();
614 style()->drawPrimitive(QStyle::PE_PanelStatusBar, &opt, &p,
this);
616 for (
const auto &item : std::as_const(d->items)) {
617 if (item.widget->isVisible() && (!haveMessage || item.isPermanent())) {
618 QRect ir = item.widget->geometry().adjusted(-2, -1, 2, 1);
619 if (event->rect().intersects(ir)) {
622 opt.palette = palette();
623 opt.state = QStyle::State_None;
624 style()->drawPrimitive(QStyle::PE_FrameStatusBarItem, &opt, &p, item.widget);
629 p.setPen(palette().windowText().color());
630 p.drawText(d->messageRect(), Qt::AlignLeading | Qt::AlignVCenter | Qt::TextSingleLine, d->tempItem);
646bool QStatusBar::event(QEvent *e)
651 case QEvent::LayoutRequest: {
653 int maxH = fontMetrics().height();
655 for (
const auto &item : std::as_const(d->items)) {
656 const int itemH = qMin(qSmartMinSize(item.widget).height(), item.widget->maximumHeight());
657 maxH = qMax(maxH, itemH);
660#if QT_CONFIG(sizegrip)
662 maxH = qMax(maxH, d->resizer->sizeHint().height());
665 if (maxH != d->savedStrut)
671 case QEvent::ChildRemoved:
672 for (
int i = 0; i < d->items.size(); ++i) {
673 const auto &item = d->items.at(i);
674 if (item.widget ==
static_cast<QChildEvent *>(e)->child())
675 d->items.removeAt(i);
682 return QWidget::event(e);