127 QToolBoxButton *lastButton = currentPage ? currentPage->button :
nullptr;
130 for (
const auto &page : pageList) {
131 QToolBoxButton *tB = page->button;
135 QWidget *tW = page->widget;
137 QPalette p = tB->palette();
138 p.setColor(tB->backgroundRole(), tW->palette().color(tW->backgroundRole()));
141 }
else if (tB->backgroundRole() != QPalette::Window) {
142 tB->setBackgroundRole(QPalette::Window);
145 after = tB == lastButton;
152 QSize iconSize(8, 8);
153 if (!icon().isNull()) {
154 int icone = style()->pixelMetric(QStyle::PM_SmallIconSize,
nullptr, parentWidget() );
155 iconSize += QSize(icone + 2, icone);
157 QSize textSize = fontMetrics().size(Qt::TextShowMnemonic, text()) + QSize(0, 8);
159 return QSize(iconSize.width() + textSize.width(), qMax(iconSize.height(), textSize.height()));
174 option->initFrom(
this);
176 option->state |= QStyle::State_Selected;
178 option->state |= QStyle::State_Sunken;
179 option->text = text();
180 option->icon = icon();
182 QToolBox *toolBox =
static_cast<QToolBox *>(parentWidget());
183 const int widgetCount = toolBox->count();
184 const int currIndex = toolBox->currentIndex();
185 if (widgetCount == 1) {
186 option->position = QStyleOptionToolBox::OnlyOneTab;
187 }
else if (indexInPage == 0) {
188 option->position = QStyleOptionToolBox::Beginning;
189 }
else if (indexInPage == widgetCount - 1) {
190 option->position = QStyleOptionToolBox::End;
192 option->position = QStyleOptionToolBox::Middle;
194 if (currIndex == indexInPage - 1) {
195 option->selectedPosition = QStyleOptionToolBox::PreviousIsSelected;
196 }
else if (currIndex == indexInPage + 1) {
197 option->selectedPosition = QStyleOptionToolBox::NextIsSelected;
199 option->selectedPosition = QStyleOptionToolBox::NotAdjacent;
261QToolBox::QToolBox(QWidget *parent, Qt::WindowFlags f)
262 : QFrame(*
new QToolBoxPrivate, parent, f)
265 d->layout =
new QVBoxLayout(
this);
266 d->layout->setContentsMargins(QMargins());
267 setBackgroundRole(QPalette::Button);
309int QToolBox::insertItem(
int index, QWidget *widget,
const QIcon &icon,
const QString &text)
315 connect(widget, SIGNAL(destroyed(QObject*)),
this, SLOT(_q_widgetDestroyed(QObject*)));
317 auto newPage = std::make_unique<QToolBoxPrivate::Page>();
320 c.button =
new QToolBoxButton(
this);
321 c.button->setObjectName(
"qt_toolbox_toolboxbutton"_L1);
322 connect(c.button, SIGNAL(clicked()),
this, SLOT(_q_buttonClicked()));
324 c.sv =
new QScrollArea(
this);
325 c.sv->setWidget(widget);
326 c.sv->setWidgetResizable(
true);
328 c.sv->setFrameStyle(QFrame::NoFrame);
333 if (index < 0 || index >=
static_cast<
int>(d->pageList.size())) {
334 index =
static_cast<
int>(d->pageList.size());
335 d->pageList.push_back(std::move(newPage));
336 d->layout->addWidget(c.button);
337 d->layout->addWidget(c.sv);
339 setCurrentIndex(index);
341 d->pageList.insert(d->pageList.cbegin() + index, std::move(newPage));
343 if (d->currentPage) {
344 QWidget *current = d->currentPage->widget;
345 int oldindex = indexOf(current);
346 if (index <= oldindex) {
347 d->currentPage =
nullptr;
348 setCurrentIndex(oldindex);
388void QToolBox::setCurrentIndex(
int index)
391 QToolBoxPrivate::Page *c = d->page(index);
392 if (!c || d->currentPage == c)
395 c->button->setSelected(
true);
396 if (d->currentPage) {
397 d->currentPage->sv->hide();
398 d->currentPage->button->setSelected(
false);
401 d->currentPage->sv->show();
403 emit currentChanged(index);
428 const QToolBoxPrivate::Page *
const c = page(object);
432 layout->removeWidget(c->sv);
433 layout->removeWidget(c->button);
434 c->sv->deleteLater();
437 bool removeCurrent = c == currentPage;
438 pageList.erase(std::remove_if(pageList.begin(), pageList.end(), pageEquals(c)), pageList.end());
441 currentPage =
nullptr;
442 emit q->currentChanged(-1);
443 }
else if (removeCurrent) {
444 currentPage =
nullptr;
445 q->setCurrentIndex(0);
454void QToolBox::removeItem(
int index)
457 if (QWidget *w = widget(index)) {
458 disconnect(w, SIGNAL(destroyed(QObject*)),
this, SLOT(_q_widgetDestroyed(QObject*)));
461 d->_q_widgetDestroyed(w);
528int QToolBox::indexOf(
const QWidget *widget)
const
531 const QToolBoxPrivate::Page *c = (widget ? d->page(widget) :
nullptr);
534 const auto it = std::find_if(d->pageList.cbegin(), d->pageList.cend(), pageEquals(c));
535 if (it == d->pageList.cend())
537 return static_cast<
int>(it - d->pageList.cbegin());
545void QToolBox::setItemEnabled(
int index,
bool enabled)
548 QToolBoxPrivate::Page *c = d->page(index);
552 c->button->setEnabled(enabled);
553 if (!enabled && c == d->currentPage) {
554 int curIndexUp = index;
555 int curIndexDown = curIndexUp;
556 const int count =
static_cast<
int>(d->pageList.size());
557 while (curIndexUp > 0 || curIndexDown < count-1) {
558 if (curIndexDown < count-1) {
559 if (d->page(++curIndexDown)->button->isEnabled()) {
560 index = curIndexDown;
564 if (curIndexUp > 0) {
565 if (d->page(--curIndexUp)->button->isEnabled()) {
571 setCurrentIndex(index);