Merge pull request #2102 from cg2121/toggle-projector-mode

UI: Add ability to change projector type
This commit is contained in:
Jim
2019-11-24 02:39:49 -08:00
committed by GitHub
5 changed files with 172 additions and 122 deletions
+43 -72
View File
@@ -601,11 +601,8 @@ obs_data_array_t *OBSBasic::SaveProjectors()
obs_data_release(data);
};
for (QPointer<QWidget> &proj : projectors)
saveProjector(static_cast<OBSProjector *>(proj.data()));
for (QPointer<QWidget> &proj : windowProjectors)
saveProjector(static_cast<OBSProjector *>(proj.data()));
for (size_t i = 0; i < projectors.size(); i++)
saveProjector(static_cast<OBSProjector *>(projectors[i]));
return savedProjectors;
}
@@ -2685,7 +2682,10 @@ void OBSBasic::RenameSources(OBSSource source, QString newName,
volumes[i]->SetName(newName);
}
OBSProjector::RenameProjector(prevName, newName);
for (size_t i = 0; i < projectors.size(); i++) {
if (projectors[i]->GetSource() == source)
projectors[i]->RenameProjector(prevName, newName);
}
SaveProject();
@@ -3745,15 +3745,6 @@ void OBSBasic::CloseDialogs()
}
}
for (QPointer<QWidget> &projector : windowProjectors) {
delete projector;
projector.clear();
}
for (QPointer<QWidget> &projector : projectors) {
delete projector;
projector.clear();
}
if (!stats.isNull())
stats->close(); //call close to save Stats geometry
if (!remux.isNull())
@@ -3795,6 +3786,13 @@ void OBSBasic::ClearSceneData()
ClearQuickTransitions();
ui->transitions->clear();
for (size_t i = 0; i < projectors.size(); i++) {
if (projectors[i])
delete projectors[i];
}
projectors.clear();
obs_set_output_source(0, nullptr);
obs_set_output_source(1, nullptr);
obs_set_output_source(2, nullptr);
@@ -4024,8 +4022,8 @@ void OBSBasic::EditSceneName()
item->setFlags(flags);
}
static void AddProjectorMenuMonitors(QMenu *parent, QObject *target,
const char *slot)
void OBSBasic::AddProjectorMenuMonitors(QMenu *parent, QObject *target,
const char *slot)
{
QAction *action;
QList<QScreen *> screens = QGuiApplication::screens();
@@ -6452,32 +6450,29 @@ void OBSBasic::NudgeRight()
Nudge(1, MoveDir::Right);
}
void OBSBasic::DeleteProjector(OBSProjector *projector)
{
for (size_t i = 0; i < projectors.size(); i++) {
if (projectors[i] == projector) {
projectors[i]->deleteLater();
projectors.erase(projectors.begin() + i);
break;
}
}
}
OBSProjector *OBSBasic::OpenProjector(obs_source_t *source, int monitor,
QString title, ProjectorType type)
ProjectorType type)
{
/* seriously? 10 monitors? */
if (monitor > 9 || monitor > QGuiApplication::screens().size() - 1)
return nullptr;
OBSProjector *projector =
new OBSProjector(nullptr, source, monitor, title, type);
new OBSProjector(nullptr, source, monitor, type);
if (monitor < 0) {
for (auto &projPtr : windowProjectors) {
if (!projPtr) {
projPtr = projector;
projector = nullptr;
}
}
if (projector)
windowProjectors.push_back(projector);
} else {
delete projectors[monitor];
projectors[monitor].clear();
projectors[monitor] = projector;
}
if (projector)
projectors.emplace_back(projector);
return projector;
}
@@ -6485,13 +6480,13 @@ OBSProjector *OBSBasic::OpenProjector(obs_source_t *source, int monitor,
void OBSBasic::OpenStudioProgramProjector()
{
int monitor = sender()->property("monitor").toInt();
OpenProjector(nullptr, monitor, nullptr, ProjectorType::StudioProgram);
OpenProjector(nullptr, monitor, ProjectorType::StudioProgram);
}
void OBSBasic::OpenPreviewProjector()
{
int monitor = sender()->property("monitor").toInt();
OpenProjector(nullptr, monitor, nullptr, ProjectorType::Preview);
OpenProjector(nullptr, monitor, ProjectorType::Preview);
}
void OBSBasic::OpenSourceProjector()
@@ -6501,14 +6496,14 @@ void OBSBasic::OpenSourceProjector()
if (!item)
return;
OpenProjector(obs_sceneitem_get_source(item), monitor, nullptr,
OpenProjector(obs_sceneitem_get_source(item), monitor,
ProjectorType::Source);
}
void OBSBasic::OpenMultiviewProjector()
{
int monitor = sender()->property("monitor").toInt();
OpenProjector(nullptr, monitor, nullptr, ProjectorType::Multiview);
OpenProjector(nullptr, monitor, ProjectorType::Multiview);
}
void OBSBasic::OpenSceneProjector()
@@ -6518,20 +6513,18 @@ void OBSBasic::OpenSceneProjector()
if (!scene)
return;
OpenProjector(obs_scene_get_source(scene), monitor, nullptr,
OpenProjector(obs_scene_get_source(scene), monitor,
ProjectorType::Scene);
}
void OBSBasic::OpenStudioProgramWindow()
{
OpenProjector(nullptr, -1, QTStr("StudioProgramWindow"),
ProjectorType::StudioProgram);
OpenProjector(nullptr, -1, ProjectorType::StudioProgram);
}
void OBSBasic::OpenPreviewWindow()
{
OpenProjector(nullptr, -1, QTStr("PreviewWindow"),
ProjectorType::Preview);
OpenProjector(nullptr, -1, ProjectorType::Preview);
}
void OBSBasic::OpenSourceWindow()
@@ -6541,16 +6534,14 @@ void OBSBasic::OpenSourceWindow()
return;
OBSSource source = obs_sceneitem_get_source(item);
QString title = QString::fromUtf8(obs_source_get_name(source));
OpenProjector(obs_sceneitem_get_source(item), -1, title,
OpenProjector(obs_sceneitem_get_source(item), -1,
ProjectorType::Source);
}
void OBSBasic::OpenMultiviewWindow()
{
OpenProjector(nullptr, -1, QTStr("MultiviewWindowed"),
ProjectorType::Multiview);
OpenProjector(nullptr, -1, ProjectorType::Multiview);
}
void OBSBasic::OpenSceneWindow()
@@ -6560,10 +6551,8 @@ void OBSBasic::OpenSceneWindow()
return;
OBSSource source = obs_scene_get_source(scene);
QString title = QString::fromUtf8(obs_source_get_name(source));
OpenProjector(obs_scene_get_source(scene), -1, title,
ProjectorType::Scene);
OpenProjector(obs_scene_get_source(scene), -1, ProjectorType::Scene);
}
void OBSBasic::OpenSavedProjectors()
@@ -6578,33 +6567,15 @@ void OBSBasic::OpenSavedProjectors()
if (!source)
continue;
QString title = nullptr;
if (info->monitor < 0)
title = QString::fromUtf8(
obs_source_get_name(source));
projector = OpenProjector(source, info->monitor, title,
projector = OpenProjector(source, info->monitor,
info->type);
obs_source_release(source);
break;
}
case ProjectorType::Preview: {
default: {
projector = OpenProjector(nullptr, info->monitor,
QTStr("PreviewWindow"),
ProjectorType::Preview);
break;
}
case ProjectorType::StudioProgram: {
projector = OpenProjector(nullptr, info->monitor,
QTStr("StudioProgramWindow"),
ProjectorType::StudioProgram);
break;
}
case ProjectorType::Multiview: {
projector = OpenProjector(nullptr, info->monitor,
QTStr("MultiviewWindowed"),
ProjectorType::Multiview);
info->type);
break;
}
}