record-button.cpp 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  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, n = layout->count(); 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. auto n = layout->count();
  41. for (auto i = layout->count(); i > 0; i--) {
  42. widget = lastWidget(layout->itemAt(i - 1));
  43. if (widget)
  44. return widget;
  45. }
  46. return nullptr;
  47. }
  48. static QWidget *getNextWidget(QBoxLayout *container, QLayoutItem *item)
  49. {
  50. for (auto i = 1, n = container->count(); i < n; i++) {
  51. if (container->itemAt(i - 1) == item)
  52. return firstWidget(container->itemAt(i));
  53. }
  54. return nullptr;
  55. }
  56. ControlsSplitButton::ControlsSplitButton(const QString &text,
  57. const QVariant &themeID,
  58. void (OBSBasic::*clicked)())
  59. : QHBoxLayout(OBSBasic::Get())
  60. {
  61. button.reset(new QPushButton(text));
  62. button->setCheckable(true);
  63. button->setProperty("themeID", themeID);
  64. button->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Fixed);
  65. button->installEventFilter(this);
  66. OBSBasic *main = OBSBasic::Get();
  67. connect(button.data(), &QPushButton::clicked, main, clicked);
  68. addWidget(button.data());
  69. }
  70. void ControlsSplitButton::addIcon(const QString &name, const QVariant &themeID,
  71. void (OBSBasic::*clicked)())
  72. {
  73. icon.reset(new QPushButton());
  74. icon->setAccessibleName(name);
  75. icon->setToolTip(name);
  76. icon->setChecked(false);
  77. icon->setProperty("themeID", themeID);
  78. QSizePolicy sp;
  79. sp.setHeightForWidth(true);
  80. icon->setSizePolicy(sp);
  81. OBSBasic *main = OBSBasic::Get();
  82. connect(icon.data(), &QAbstractButton::clicked, main, clicked);
  83. addWidget(icon.data());
  84. QWidget::setTabOrder(button.data(), icon.data());
  85. auto next = getNextWidget(main->ui->buttonsVLayout, this);
  86. if (next)
  87. QWidget::setTabOrder(icon.data(), next);
  88. }
  89. void ControlsSplitButton::removeIcon()
  90. {
  91. icon.reset();
  92. }
  93. void ControlsSplitButton::insert(int index)
  94. {
  95. OBSBasic *main = OBSBasic::Get();
  96. auto count = main->ui->buttonsVLayout->count();
  97. if (index < 0)
  98. index = 0;
  99. else if (index > count)
  100. index = count;
  101. main->ui->buttonsVLayout->insertLayout(index, this);
  102. QWidget *prev = button.data();
  103. if (index > 0) {
  104. prev = lastWidget(main->ui->buttonsVLayout->itemAt(index - 1));
  105. if (prev)
  106. QWidget::setTabOrder(prev, button.data());
  107. prev = button.data();
  108. }
  109. if (icon) {
  110. QWidget::setTabOrder(button.data(), icon.data());
  111. prev = icon.data();
  112. }
  113. if (index < count) {
  114. auto next = firstWidget(
  115. main->ui->buttonsVLayout->itemAt(index + 1));
  116. if (next)
  117. QWidget::setTabOrder(prev, next);
  118. }
  119. }
  120. bool ControlsSplitButton::eventFilter(QObject *obj, QEvent *event)
  121. {
  122. if (event->type() == QEvent::Resize && icon) {
  123. QSize iconSize = icon->size();
  124. int height = button->height();
  125. if (iconSize.height() != height || iconSize.width() != height) {
  126. icon->setMinimumSize(height, height);
  127. icon->setMaximumSize(height, height);
  128. }
  129. }
  130. return QObject::eventFilter(obj, event);
  131. }