mirror of
https://github.com/WarmUpTill/SceneSwitcher.git
synced 2026-10-31 13:16:00 -05:00
201 lines
5.5 KiB
C++
201 lines
5.5 KiB
C++
#include "macro-action-create-source.hpp"
|
|
|
|
#include <QGridLayout>
|
|
#include <QLabel>
|
|
|
|
namespace advss {
|
|
|
|
const std::string MacroActionCreateSource::id = "create_source";
|
|
|
|
bool MacroActionCreateSource::_registered = MacroActionFactory::Register(
|
|
MacroActionCreateSource::id,
|
|
{MacroActionCreateSource::Create, MacroActionCreateSourceEdit::Create,
|
|
"AdvSceneSwitcher.action.createSource"});
|
|
|
|
bool MacroActionCreateSource::PerformAction()
|
|
{
|
|
OBSSourceAutoRelease sceneSource =
|
|
obs_weak_source_get_source(_scene.GetScene(false));
|
|
auto scene = obs_scene_from_source(sceneSource);
|
|
if (!scene) {
|
|
blog(LOG_WARNING,
|
|
"cannot create source on invalid scene \"%s\"",
|
|
_scene.ToString(true).c_str());
|
|
return true;
|
|
}
|
|
|
|
OBSSourceAutoRelease source = obs_source_create(
|
|
_sourceType.c_str(), _sourceName.c_str(), nullptr, nullptr);
|
|
if (!source) {
|
|
blog(LOG_WARNING, "failed to create source of type \"%s\"",
|
|
_sourceType.c_str());
|
|
return true;
|
|
}
|
|
|
|
if (!obs_scene_add(scene, source)) {
|
|
blog(LOG_WARNING, "failed to add source \"%s\" to scene \"%s\"",
|
|
obs_source_get_name(source),
|
|
_scene.ToString(true).c_str());
|
|
return true;
|
|
}
|
|
|
|
SetTempVarValue("sourceName", obs_source_get_name(source));
|
|
return true;
|
|
}
|
|
|
|
void MacroActionCreateSource::LogAction() const
|
|
{
|
|
ablog(LOG_INFO, "create source \"%s\" of type \"%s\" on scene \"%s\"",
|
|
_sourceName.c_str(), _sourceType.c_str(),
|
|
_scene.ToString(true).c_str());
|
|
}
|
|
|
|
bool MacroActionCreateSource::Save(obs_data_t *obj) const
|
|
{
|
|
MacroAction::Save(obj);
|
|
_scene.Save(obj);
|
|
obs_data_set_string(obj, "sourceType", _sourceType.c_str());
|
|
_sourceName.Save(obj, "sourceName");
|
|
return true;
|
|
}
|
|
|
|
bool MacroActionCreateSource::Load(obs_data_t *obj)
|
|
{
|
|
MacroAction::Load(obj);
|
|
_scene.Load(obj);
|
|
_sourceType = obs_data_get_string(obj, "sourceType");
|
|
_sourceName.Load(obj, "sourceName");
|
|
return true;
|
|
}
|
|
|
|
std::string MacroActionCreateSource::GetShortDesc() const
|
|
{
|
|
return _scene.ToString() + " - " + _sourceName.UnresolvedValue();
|
|
}
|
|
|
|
std::shared_ptr<MacroAction> MacroActionCreateSource::Create(Macro *m)
|
|
{
|
|
return std::make_shared<MacroActionCreateSource>(m);
|
|
}
|
|
|
|
std::shared_ptr<MacroAction> MacroActionCreateSource::Copy() const
|
|
{
|
|
return std::make_shared<MacroActionCreateSource>(*this);
|
|
}
|
|
|
|
void MacroActionCreateSource::ResolveVariablesToFixedValues()
|
|
{
|
|
_scene.ResolveVariables();
|
|
_sourceName.ResolveVariables();
|
|
}
|
|
|
|
void MacroActionCreateSource::SetupTempVars()
|
|
{
|
|
MacroAction::SetupTempVars();
|
|
AddTempvar(
|
|
"sourceName",
|
|
obs_module_text("AdvSceneSwitcher.tempVar.createSource.name"),
|
|
obs_module_text(
|
|
"AdvSceneSwitcher.tempVar.createSource.name.description"));
|
|
}
|
|
|
|
static void populateSourceTypeSelection(QComboBox *list)
|
|
{
|
|
size_t idx = 0;
|
|
const char *type = nullptr;
|
|
const char *unversionedType = nullptr;
|
|
while (obs_enum_input_types2(idx++, &type, &unversionedType)) {
|
|
const uint32_t caps = obs_get_source_output_flags(type);
|
|
if ((caps & OBS_SOURCE_CAP_DISABLED) != 0) {
|
|
continue;
|
|
}
|
|
const char *name = obs_source_get_display_name(type);
|
|
list->addItem(name ? name : unversionedType, unversionedType);
|
|
}
|
|
list->model()->sort(0);
|
|
}
|
|
|
|
MacroActionCreateSourceEdit::MacroActionCreateSourceEdit(
|
|
QWidget *parent, std::shared_ptr<MacroActionCreateSource> entryData)
|
|
: QWidget(parent),
|
|
_scenes(new SceneSelectionWidget(this, true, false, true, true)),
|
|
_sourceTypes(new FilterComboBox(
|
|
this, obs_module_text("AdvSceneSwitcher.selectItem"))),
|
|
_sourceName(new VariableLineEdit(this)),
|
|
_sourceNameHelp(new HelpIcon(
|
|
obs_module_text(
|
|
"AdvSceneSwitcher.action.createSource.name.help"),
|
|
this))
|
|
{
|
|
populateSourceTypeSelection(_sourceTypes);
|
|
|
|
QWidget::connect(_scenes, SIGNAL(SceneChanged(const SceneSelection &)),
|
|
this, SLOT(SceneChanged(const SceneSelection &)));
|
|
QWidget::connect(_sourceTypes, SIGNAL(currentIndexChanged(int)), this,
|
|
SLOT(SourceTypeChanged(int)));
|
|
QWidget::connect(_sourceName, SIGNAL(editingFinished()), this,
|
|
SLOT(SourceNameChanged()));
|
|
|
|
auto layout = new QGridLayout;
|
|
int row = 0;
|
|
layout->addWidget(
|
|
new QLabel(obs_module_text(
|
|
"AdvSceneSwitcher.action.createSource.scene")),
|
|
row, 0);
|
|
layout->addWidget(_scenes, row, 1);
|
|
++row;
|
|
layout->addWidget(new QLabel(obs_module_text(
|
|
"AdvSceneSwitcher.action.createSource.type")),
|
|
row, 0);
|
|
layout->addWidget(_sourceTypes, row, 1);
|
|
++row;
|
|
layout->addWidget(new QLabel(obs_module_text(
|
|
"AdvSceneSwitcher.action.createSource.name")),
|
|
row, 0);
|
|
layout->addWidget(_sourceName, row, 1);
|
|
layout->addWidget(_sourceNameHelp, row, 2);
|
|
layout->setColumnStretch(1, 1);
|
|
setLayout(layout);
|
|
|
|
_entryData = entryData;
|
|
UpdateEntryData();
|
|
_loading = false;
|
|
}
|
|
|
|
void MacroActionCreateSourceEdit::UpdateEntryData()
|
|
{
|
|
if (!_entryData) {
|
|
return;
|
|
}
|
|
|
|
_scenes->SetScene(_entryData->_scene);
|
|
_sourceTypes->setCurrentIndex(_sourceTypes->findData(
|
|
QString::fromStdString(_entryData->_sourceType)));
|
|
_sourceName->setText(_entryData->_sourceName);
|
|
}
|
|
|
|
void MacroActionCreateSourceEdit::SceneChanged(const SceneSelection &scene)
|
|
{
|
|
GUARD_LOADING_AND_LOCK();
|
|
_entryData->_scene = scene;
|
|
emit HeaderInfoChanged(
|
|
QString::fromStdString(_entryData->GetShortDesc()));
|
|
}
|
|
|
|
void MacroActionCreateSourceEdit::SourceTypeChanged(int idx)
|
|
{
|
|
GUARD_LOADING_AND_LOCK();
|
|
_entryData->_sourceType =
|
|
_sourceTypes->itemData(idx).toString().toStdString();
|
|
}
|
|
|
|
void MacroActionCreateSourceEdit::SourceNameChanged()
|
|
{
|
|
GUARD_LOADING_AND_LOCK();
|
|
_entryData->_sourceName = _sourceName->text().toStdString();
|
|
emit HeaderInfoChanged(
|
|
QString::fromStdString(_entryData->GetShortDesc()));
|
|
}
|
|
|
|
} // namespace advss
|