19 class TabBar :
public QWidget
21 std::vector<QPushButton *> buttons;
22 static constexpr int spacing = 4;
24 int arrange(
int availableWidth,
bool place)
const
29 for(
auto *button : buttons)
31 const QSize size = button->sizeHint();
32 if(
x > 0 &&
x + size.width() > availableWidth)
35 y += rowHeight + spacing;
40 button->setGeometry(
x,
y, size.width(), size.height());
42 x += size.width() + spacing;
43 rowHeight = std::max(rowHeight, size.height());
49 void resizeEvent(QResizeEvent *
event)
override
51 QWidget::resizeEvent(
event);
52 arrange(
width(),
true);
56 QButtonGroup *
const group;
58 explicit TabBar(QWidget *
parent) : QWidget(
parent), group(
new QButtonGroup(
this))
60 QSizePolicy policy(QSizePolicy::Expanding, QSizePolicy::Preferred);
61 policy.setHeightForWidth(
true);
62 setSizePolicy(policy);
63 setAccessibleName(
"Actor tabs");
64 group->setExclusive(
true);
67 void addTab(
const QString &name)
69 auto *button =
new QPushButton(name,
this);
70 button->setCheckable(
true);
71 button->setAutoDefault(
false);
72 group->addButton(button,
static_cast<int>(buttons.size()));
73 buttons.push_back(button);
74 button->setChecked(buttons.size() == 1);
76 arrange(
width(),
true);
80 int heightForWidth(
int width)
const override
82 return arrange(
width,
false);
85 QSize minimumSizeHint()
const override
88 for(
const auto *button : buttons)
90 size = size.expandedTo(button->sizeHint());
95 QSize sizeHint()
const override
97 const int preferredWidth = std::max(320, minimumSizeHint().
width());
98 return QSize(preferredWidth, heightForWidth(preferredWidth));
103 QStackedWidget *
const pages;
107 : QWidget(
parent), bar(new TabBar(this)), pages(new QStackedWidget(this))
109 auto *layout =
new QVBoxLayout(
this);
110 layout->setContentsMargins(0, 0, 0, 0);
111 layout->setSpacing(4);
112 layout->addWidget(bar);
113 layout->addWidget(pages, 1);
114 connect(bar->group, &QButtonGroup::idClicked, pages, &QStackedWidget::setCurrentIndex);
117 int addTab(QWidget *page,
const QString &label)
119 auto *scroll =
new QScrollArea(
this);
120 scroll->setWidgetResizable(
true);
121 scroll->setFrameShape(QFrame::NoFrame);
122 scroll->setWidget(page);
123 const int index = pages->addWidget(scroll);
130 return pages->currentIndex();