window-basic-vcam-config.cpp 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  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. OBSBasicVCamConfig::OBSBasicVCamConfig(const VCamConfig &_config,
  7. QWidget *parent)
  8. : config(_config), QDialog(parent), ui(new Ui::OBSBasicVCamConfig)
  9. {
  10. setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
  11. ui->setupUi(this);
  12. ui->outputType->setCurrentIndex(config.type);
  13. OutputTypeChanged(config.type);
  14. connect(ui->outputType, SIGNAL(currentIndexChanged(int)), this,
  15. SLOT(OutputTypeChanged(int)));
  16. connect(ui->buttonBox, &QDialogButtonBox::accepted, this,
  17. &OBSBasicVCamConfig::UpdateConfig);
  18. }
  19. void OBSBasicVCamConfig::OutputTypeChanged(int type)
  20. {
  21. auto list = ui->outputSelection;
  22. list->clear();
  23. switch ((VCamOutputType)type) {
  24. case VCamOutputType::InternalOutput:
  25. list->addItem(QTStr("Basic.VCam.InternalDefault"));
  26. list->addItem(QTStr("Basic.VCam.InternalPreview"));
  27. list->setCurrentIndex(config.internal);
  28. break;
  29. case VCamOutputType::SceneOutput: {
  30. // Scenes in default order
  31. BPtr<char *> scenes = obs_frontend_get_scene_names();
  32. for (char **temp = scenes; *temp; temp++) {
  33. list->addItem(*temp);
  34. if (config.scene.compare(*temp) == 0)
  35. list->setCurrentIndex(list->count() - 1);
  36. }
  37. break;
  38. }
  39. case VCamOutputType::SourceOutput: {
  40. // Sources in alphabetical order
  41. std::vector<std::string> sources;
  42. auto AddSource = [&](obs_source_t *source) {
  43. auto name = obs_source_get_name(source);
  44. if (!(obs_source_get_output_flags(source) &
  45. OBS_SOURCE_VIDEO))
  46. return;
  47. sources.push_back(name);
  48. };
  49. using AddSource_t = decltype(AddSource);
  50. obs_enum_sources(
  51. [](void *data, obs_source_t *source) {
  52. auto &AddSource =
  53. *static_cast<AddSource_t *>(data);
  54. if (!obs_source_removed(source))
  55. AddSource(source);
  56. return true;
  57. },
  58. static_cast<void *>(&AddSource));
  59. // Sort and select current item
  60. sort(sources.begin(), sources.end());
  61. for (auto &&source : sources) {
  62. list->addItem(source.c_str());
  63. if (config.source == source)
  64. list->setCurrentIndex(list->count() - 1);
  65. }
  66. break;
  67. }
  68. }
  69. }
  70. void OBSBasicVCamConfig::UpdateConfig()
  71. {
  72. VCamOutputType type = (VCamOutputType)ui->outputType->currentIndex();
  73. switch (type) {
  74. case VCamOutputType::InternalOutput:
  75. config.internal =
  76. (VCamInternalType)ui->outputSelection->currentIndex();
  77. break;
  78. case VCamOutputType::SceneOutput:
  79. config.scene = ui->outputSelection->currentText().toStdString();
  80. break;
  81. case VCamOutputType::SourceOutput:
  82. config.source =
  83. ui->outputSelection->currentText().toStdString();
  84. break;
  85. default:
  86. // unknown value, don't save type
  87. return;
  88. }
  89. config.type = type;
  90. emit Accepted(config);
  91. }