window-basic-vcam-config.cpp 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. #include "window-basic-vcam-config.hpp"
  2. #include "window-basic-main.hpp"
  3. #include "qt-wrappers.hpp"
  4. #include <util/util.hpp>
  5. #include <util/platform.h>
  6. #include <QStandardItem>
  7. OBSBasicVCamConfig::OBSBasicVCamConfig(const VCamConfig &_config,
  8. bool _vcamActive, QWidget *parent)
  9. : config(_config),
  10. vcamActive(_vcamActive),
  11. activeType(_config.type),
  12. QDialog(parent),
  13. ui(new Ui::OBSBasicVCamConfig)
  14. {
  15. setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
  16. ui->setupUi(this);
  17. ui->outputType->addItem(QTStr("Basic.VCam.OutputType.Program"),
  18. (int)VCamOutputType::ProgramView);
  19. ui->outputType->addItem(QTStr("StudioMode.Preview"),
  20. (int)VCamOutputType::PreviewOutput);
  21. ui->outputType->addItem(QTStr("Basic.Scene"),
  22. (int)VCamOutputType::SceneOutput);
  23. ui->outputType->addItem(QTStr("Basic.Main.Source"),
  24. (int)VCamOutputType::SourceOutput);
  25. ui->outputType->setCurrentIndex(
  26. ui->outputType->findData((int)config.type));
  27. OutputTypeChanged();
  28. connect(ui->outputType, &QComboBox::currentIndexChanged, this,
  29. &OBSBasicVCamConfig::OutputTypeChanged);
  30. connect(ui->buttonBox, &QDialogButtonBox::accepted, this,
  31. &OBSBasicVCamConfig::UpdateConfig);
  32. }
  33. void OBSBasicVCamConfig::OutputTypeChanged()
  34. {
  35. VCamOutputType type =
  36. (VCamOutputType)ui->outputType->currentData().toInt();
  37. ui->outputSelection->setDisabled(false);
  38. auto list = ui->outputSelection;
  39. list->clear();
  40. switch (type) {
  41. case VCamOutputType::Invalid:
  42. case VCamOutputType::ProgramView:
  43. case VCamOutputType::PreviewOutput:
  44. ui->outputSelection->setDisabled(true);
  45. list->addItem(QTStr("Basic.VCam.OutputSelection.NoSelection"));
  46. break;
  47. case VCamOutputType::SceneOutput: {
  48. // Scenes in default order
  49. BPtr<char *> scenes = obs_frontend_get_scene_names();
  50. for (char **temp = scenes; *temp; temp++) {
  51. list->addItem(*temp);
  52. if (config.scene.compare(*temp) == 0)
  53. list->setCurrentIndex(list->count() - 1);
  54. }
  55. break;
  56. }
  57. case VCamOutputType::SourceOutput: {
  58. // Sources in alphabetical order
  59. std::vector<std::string> sources;
  60. auto AddSource = [&](obs_source_t *source) {
  61. auto name = obs_source_get_name(source);
  62. if (!(obs_source_get_output_flags(source) &
  63. OBS_SOURCE_VIDEO))
  64. return;
  65. sources.push_back(name);
  66. };
  67. using AddSource_t = decltype(AddSource);
  68. obs_enum_sources(
  69. [](void *data, obs_source_t *source) {
  70. auto &AddSource =
  71. *static_cast<AddSource_t *>(data);
  72. if (!obs_source_removed(source))
  73. AddSource(source);
  74. return true;
  75. },
  76. static_cast<void *>(&AddSource));
  77. // Sort and select current item
  78. sort(sources.begin(), sources.end());
  79. for (auto &&source : sources) {
  80. list->addItem(source.c_str());
  81. if (config.source == source)
  82. list->setCurrentIndex(list->count() - 1);
  83. }
  84. break;
  85. }
  86. }
  87. if (!vcamActive)
  88. return;
  89. requireRestart = (activeType == VCamOutputType::ProgramView &&
  90. type != VCamOutputType::ProgramView) ||
  91. (activeType != VCamOutputType::ProgramView &&
  92. type == VCamOutputType::ProgramView);
  93. ui->warningLabel->setVisible(requireRestart);
  94. }
  95. void OBSBasicVCamConfig::UpdateConfig()
  96. {
  97. VCamOutputType type =
  98. (VCamOutputType)ui->outputType->currentData().toInt();
  99. switch (type) {
  100. case VCamOutputType::ProgramView:
  101. case VCamOutputType::PreviewOutput:
  102. break;
  103. case VCamOutputType::SceneOutput:
  104. config.scene = ui->outputSelection->currentText().toStdString();
  105. break;
  106. case VCamOutputType::SourceOutput:
  107. config.source =
  108. ui->outputSelection->currentText().toStdString();
  109. break;
  110. default:
  111. // unknown value, don't save type
  112. return;
  113. }
  114. config.type = type;
  115. if (requireRestart) {
  116. emit AcceptedAndRestart(config);
  117. } else {
  118. emit Accepted(config);
  119. }
  120. }