mirror of
https://github.com/obsproject/obs-studio.git
synced 2024-09-20 13:08:50 +02:00
143 lines
3.6 KiB
C++
143 lines
3.6 KiB
C++
#include "window-basic-vcam-config.hpp"
|
|
#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);
|
|
}
|
|
}
|