1
0

record-button.cpp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. #include "record-button.hpp"
  2. #include "window-basic-main.hpp"
  3. void RecordButton::resizeEvent(QResizeEvent *event)
  4. {
  5. OBSBasic *main = OBSBasic::Get();
  6. if (!main->pause)
  7. return;
  8. QSize pauseSize = main->pause->size();
  9. int height = main->ui->recordButton->size().height();
  10. if (pauseSize.height() != height || pauseSize.width() != height) {
  11. main->pause->setMinimumSize(height, height);
  12. main->pause->setMaximumSize(height, height);
  13. }
  14. event->accept();
  15. }
  16. static QWidget *firstWidget(QLayoutItem *item)
  17. {
  18. auto widget = item->widget();
  19. if (widget)
  20. return widget;
  21. auto layout = item->layout();
  22. if (!layout)
  23. return nullptr;
  24. auto n = layout->count();
  25. for (auto i = 0; i < n; i++) {
  26. widget = firstWidget(layout->itemAt(i));
  27. if (widget)
  28. return widget;
  29. }
  30. return nullptr;
  31. }
  32. static QWidget *lastWidget(QLayoutItem *item)
  33. {
  34. auto widget = item->widget();
  35. if (widget)
  36. return widget;
  37. auto layout = item->layout();
  38. if (!layout)
  39. return nullptr;
  40. for (auto i = layout->count(); i > 0; i--) {
  41. widget = lastWidget(layout->itemAt(i - 1));
  42. if (widget)
  43. return widget;
  44. }
  45. return nullptr;
  46. }
  47. static QWidget *getNextWidget(QBoxLayout *container, QLayoutItem *item)
  48. {
  49. for (auto i = 1, n = container->count(); i < n; i++) {
  50. if (container->itemAt(i - 1) == item)
  51. return firstWidget(container->itemAt(i));
  52. }
  53. return nullptr;
  54. }
  55. ControlsSplitButton::ControlsSplitButton(const QString &text,
  56. const QVariant &themeID,
  57. void (OBSBasic::*clicked)())
  58. : QHBoxLayout()
  59. {
  60. button.reset(new QPushButton(text));
  61. button->setCheckable(true);
  62. button->setProperty("themeID", themeID);
  63. button->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Fixed);
  64. button->installEventFilter(this);
  65. OBSBasic *main = OBSBasic::Get();
  66. connect(button.data(), &QPushButton::clicked, main, clicked);
  67. addWidget(button.data());
  68. }
  69. void ControlsSplitButton::addIcon(const QString &name, const QVariant &themeID,
  70. void (OBSBasic::*clicked)())
  71. {
  72. icon.reset(new QPushButton());
  73. icon->setAccessibleName(name);
  74. icon->setToolTip(name);
  75. icon->setChecked(false);
  76. icon->setProperty("themeID", themeID);
  77. QSizePolicy sp;
  78. sp.setHeightForWidth(true);
  79. icon->setSizePolicy(sp);
  80. OBSBasic *main = OBSBasic::Get();
  81. connect(icon.data(), &QAbstractButton::clicked, main, clicked);
  82. addWidget(icon.data());
  83. QWidget::setTabOrder(button.data(), icon.data());
  84. auto next = getNextWidget(main->ui->buttonsVLayout, this);
  85. if (next)
  86. QWidget::setTabOrder(icon.data(), next);
  87. }
  88. void ControlsSplitButton::removeIcon()
  89. {
  90. icon.reset();
  91. }
  92. void ControlsSplitButton::insert(int index)
  93. {
  94. OBSBasic *main = OBSBasic::Get();
  95. auto count = main->ui->buttonsVLayout->count();
  96. if (index < 0)
  97. index = 0;
  98. else if (index > count)
  99. index = count;
  100. main->ui->buttonsVLayout->insertLayout(index, this);
  101. QWidget *prev = button.data();
  102. if (index > 0) {
  103. prev = lastWidget(main->ui->buttonsVLayout->itemAt(index - 1));
  104. if (prev)
  105. QWidget::setTabOrder(prev, button.data());
  106. prev = button.data();
  107. }
  108. if (icon) {
  109. QWidget::setTabOrder(button.data(), icon.data());
  110. prev = icon.data();
  111. }
  112. if (index < count) {
  113. auto next = firstWidget(
  114. main->ui->buttonsVLayout->itemAt(index + 1));
  115. if (next)
  116. QWidget::setTabOrder(prev, next);
  117. }
  118. }
  119. bool ControlsSplitButton::eventFilter(QObject *obj, QEvent *event)
  120. {
  121. if (event->type() == QEvent::Resize && icon) {
  122. QSize iconSize = icon->size();
  123. int height = button->height();
  124. if (iconSize.height() != height || iconSize.width() != height) {
  125. icon->setMinimumSize(height, height);
  126. icon->setMaximumSize(height, height);
  127. }
  128. }
  129. return QObject::eventFilter(obj, event);
  130. }