obs-studio/UI/record-button.cpp

161 lines
3.6 KiB
C++

#include "record-button.hpp"
#include "window-basic-main.hpp"
void RecordButton::resizeEvent(QResizeEvent *event)
{
OBSBasic *main = OBSBasic::Get();
if (!main->pause)
return;
QSize pauseSize = main->pause->size();
int height = main->ui->recordButton->size().height();
if (pauseSize.height() != height || pauseSize.width() != height) {
main->pause->setMinimumSize(height, height);
main->pause->setMaximumSize(height, height);
}
event->accept();
}
static QWidget *firstWidget(QLayoutItem *item)
{
auto widget = item->widget();
if (widget)
return widget;
auto layout = item->layout();
if (!layout)
return nullptr;
auto n = layout->count();
for (auto i = 0, n = layout->count(); i < n; i++) {
widget = firstWidget(layout->itemAt(i));
if (widget)
return widget;
}
return nullptr;
}
static QWidget *lastWidget(QLayoutItem *item)
{
auto widget = item->widget();
if (widget)
return widget;
auto layout = item->layout();
if (!layout)
return nullptr;
auto n = layout->count();
for (auto i = layout->count(); i > 0; i--) {
widget = lastWidget(layout->itemAt(i - 1));
if (widget)
return widget;
}
return nullptr;
}
static QWidget *getNextWidget(QBoxLayout *container, QLayoutItem *item)
{
for (auto i = 1, n = container->count(); i < n; i++) {
if (container->itemAt(i - 1) == item)
return firstWidget(container->itemAt(i));
}
return nullptr;
}
ControlsSplitButton::ControlsSplitButton(const QString &text,
const QVariant &themeID,
void (OBSBasic::*clicked)())
: QHBoxLayout(OBSBasic::Get())
{
button.reset(new QPushButton(text));
button->setCheckable(true);
button->setProperty("themeID", themeID);
button->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Fixed);
button->installEventFilter(this);
OBSBasic *main = OBSBasic::Get();
connect(button.data(), &QPushButton::clicked, main, clicked);
addWidget(button.data());
}
void ControlsSplitButton::addIcon(const QString &name, const QVariant &themeID,
void (OBSBasic::*clicked)())
{
icon.reset(new QPushButton());
icon->setAccessibleName(name);
icon->setToolTip(name);
icon->setChecked(false);
icon->setProperty("themeID", themeID);
QSizePolicy sp;
sp.setHeightForWidth(true);
icon->setSizePolicy(sp);
OBSBasic *main = OBSBasic::Get();
connect(icon.data(), &QAbstractButton::clicked, main, clicked);
addWidget(icon.data());
QWidget::setTabOrder(button.data(), icon.data());
auto next = getNextWidget(main->ui->buttonsVLayout, this);
if (next)
QWidget::setTabOrder(icon.data(), next);
}
void ControlsSplitButton::removeIcon()
{
icon.reset();
}
void ControlsSplitButton::insert(int index)
{
OBSBasic *main = OBSBasic::Get();
auto count = main->ui->buttonsVLayout->count();
if (index < 0)
index = 0;
else if (index > count)
index = count;
main->ui->buttonsVLayout->insertLayout(index, this);
QWidget *prev = button.data();
if (index > 0) {
prev = lastWidget(main->ui->buttonsVLayout->itemAt(index - 1));
if (prev)
QWidget::setTabOrder(prev, button.data());
prev = button.data();
}
if (icon) {
QWidget::setTabOrder(button.data(), icon.data());
prev = icon.data();
}
if (index < count) {
auto next = firstWidget(
main->ui->buttonsVLayout->itemAt(index + 1));
if (next)
QWidget::setTabOrder(prev, next);
}
}
bool ControlsSplitButton::eventFilter(QObject *obj, QEvent *event)
{
if (event->type() == QEvent::Resize && icon) {
QSize iconSize = icon->size();
int height = button->height();
if (iconSize.height() != height || iconSize.width() != height) {
icon->setMinimumSize(height, height);
icon->setMaximumSize(height, height);
}
}
return QObject::eventFilter(obj, event);
}