window-basic-vcam-config.cpp 3.6 KB

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