123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- #include "moc_window-basic-vcam-config.cpp"
- #include "window-basic-main.hpp"
- #include <qt-wrappers.hpp>
- #include <util/util.hpp>
- #include <util/platform.h>
- #include <QStandardItem>
- OBSBasicVCamConfig::OBSBasicVCamConfig(const VCamConfig &_config, bool _vcamActive, QWidget *parent)
- : config(_config),
- vcamActive(_vcamActive),
- activeType(_config.type),
- QDialog(parent),
- ui(new Ui::OBSBasicVCamConfig)
- {
- setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
- ui->setupUi(this);
- ui->outputType->addItem(QTStr("Basic.VCam.OutputType.Program"), (int)VCamOutputType::ProgramView);
- ui->outputType->addItem(QTStr("StudioMode.Preview"), (int)VCamOutputType::PreviewOutput);
- ui->outputType->addItem(QTStr("Basic.Scene"), (int)VCamOutputType::SceneOutput);
- ui->outputType->addItem(QTStr("Basic.Main.Source"), (int)VCamOutputType::SourceOutput);
- ui->outputType->setCurrentIndex(ui->outputType->findData((int)config.type));
- OutputTypeChanged();
- connect(ui->outputType, &QComboBox::currentIndexChanged, this, &OBSBasicVCamConfig::OutputTypeChanged);
- connect(ui->buttonBox, &QDialogButtonBox::accepted, this, &OBSBasicVCamConfig::UpdateConfig);
- }
- void OBSBasicVCamConfig::OutputTypeChanged()
- {
- VCamOutputType type = (VCamOutputType)ui->outputType->currentData().toInt();
- ui->outputSelection->setDisabled(false);
- auto list = ui->outputSelection;
- list->clear();
- switch (type) {
- case VCamOutputType::Invalid:
- case VCamOutputType::ProgramView:
- case VCamOutputType::PreviewOutput:
- ui->outputSelection->setDisabled(true);
- list->addItem(QTStr("Basic.VCam.OutputSelection.NoSelection"));
- break;
- case VCamOutputType::SceneOutput: {
- // Scenes in default order
- BPtr<char *> scenes = obs_frontend_get_scene_names();
- for (char **temp = scenes; *temp; temp++) {
- list->addItem(*temp);
- if (config.scene.compare(*temp) == 0)
- list->setCurrentIndex(list->count() - 1);
- }
- break;
- }
- case VCamOutputType::SourceOutput: {
- // Sources in alphabetical order
- std::vector<std::string> sources;
- auto AddSource = [&](obs_source_t *source) {
- auto name = obs_source_get_name(source);
- if (!(obs_source_get_output_flags(source) & OBS_SOURCE_VIDEO))
- return;
- sources.push_back(name);
- };
- using AddSource_t = decltype(AddSource);
- obs_enum_sources(
- [](void *data, obs_source_t *source) {
- auto &AddSource = *static_cast<AddSource_t *>(data);
- if (!obs_source_removed(source))
- AddSource(source);
- return true;
- },
- static_cast<void *>(&AddSource));
- // Sort and select current item
- sort(sources.begin(), sources.end());
- for (auto &&source : sources) {
- list->addItem(source.c_str());
- if (config.source == source)
- list->setCurrentIndex(list->count() - 1);
- }
- break;
- }
- }
- if (!vcamActive)
- return;
- requireRestart = (activeType == VCamOutputType::ProgramView && type != VCamOutputType::ProgramView) ||
- (activeType != VCamOutputType::ProgramView && type == VCamOutputType::ProgramView);
- ui->warningLabel->setVisible(requireRestart);
- }
- void OBSBasicVCamConfig::UpdateConfig()
- {
- VCamOutputType type = (VCamOutputType)ui->outputType->currentData().toInt();
- switch (type) {
- case VCamOutputType::ProgramView:
- case VCamOutputType::PreviewOutput:
- break;
- case VCamOutputType::SceneOutput:
- config.scene = ui->outputSelection->currentText().toStdString();
- break;
- case VCamOutputType::SourceOutput:
- config.source = ui->outputSelection->currentText().toStdString();
- break;
- default:
- // unknown value, don't save type
- return;
- }
- config.type = type;
- if (requireRestart) {
- emit AcceptedAndRestart(config);
- } else {
- emit Accepted(config);
- }
- }
|