|
@@ -123,6 +123,9 @@ OBSBasic::OBSBasic(QWidget *parent)
|
|
|
: OBSMainWindow (parent),
|
|
: OBSMainWindow (parent),
|
|
|
ui (new Ui::OBSBasic)
|
|
ui (new Ui::OBSBasic)
|
|
|
{
|
|
{
|
|
|
|
|
+ projectorArray.resize(10, "");
|
|
|
|
|
+ previewProjectorArray.resize(10, 0);
|
|
|
|
|
+
|
|
|
setAcceptDrops(true);
|
|
setAcceptDrops(true);
|
|
|
|
|
|
|
|
ui->setupUi(this);
|
|
ui->setupUi(this);
|
|
@@ -262,7 +265,9 @@ static void SaveAudioDevice(const char *name, int channel, obs_data_t *parent,
|
|
|
static obs_data_t *GenerateSaveData(obs_data_array_t *sceneOrder,
|
|
static obs_data_t *GenerateSaveData(obs_data_array_t *sceneOrder,
|
|
|
obs_data_array_t *quickTransitionData, int transitionDuration,
|
|
obs_data_array_t *quickTransitionData, int transitionDuration,
|
|
|
obs_data_array_t *transitions,
|
|
obs_data_array_t *transitions,
|
|
|
- OBSScene &scene, OBSSource &curProgramScene)
|
|
|
|
|
|
|
+ OBSScene &scene, OBSSource &curProgramScene,
|
|
|
|
|
+ obs_data_array_t *savedProjectorList,
|
|
|
|
|
+ obs_data_array_t *savedPreviewProjectorList)
|
|
|
{
|
|
{
|
|
|
obs_data_t *saveData = obs_data_create();
|
|
obs_data_t *saveData = obs_data_create();
|
|
|
|
|
|
|
@@ -303,6 +308,9 @@ static obs_data_t *GenerateSaveData(obs_data_array_t *sceneOrder,
|
|
|
obs_data_set_array(saveData, "sources", sourcesArray);
|
|
obs_data_set_array(saveData, "sources", sourcesArray);
|
|
|
obs_data_set_array(saveData, "quick_transitions", quickTransitionData);
|
|
obs_data_set_array(saveData, "quick_transitions", quickTransitionData);
|
|
|
obs_data_set_array(saveData, "transitions", transitions);
|
|
obs_data_set_array(saveData, "transitions", transitions);
|
|
|
|
|
+ obs_data_set_array(saveData, "saved_projectors", savedProjectorList);
|
|
|
|
|
+ obs_data_set_array(saveData, "saved_preview_projectors",
|
|
|
|
|
+ savedPreviewProjectorList);
|
|
|
obs_data_array_release(sourcesArray);
|
|
obs_data_array_release(sourcesArray);
|
|
|
|
|
|
|
|
obs_data_set_string(saveData, "current_transition",
|
|
obs_data_set_string(saveData, "current_transition",
|
|
@@ -360,6 +368,36 @@ obs_data_array_t *OBSBasic::SaveSceneListOrder()
|
|
|
return sceneOrder;
|
|
return sceneOrder;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+obs_data_array_t *OBSBasic::SaveProjectors()
|
|
|
|
|
+{
|
|
|
|
|
+ obs_data_array_t *saveProjector = obs_data_array_create();
|
|
|
|
|
+
|
|
|
|
|
+ for (size_t i = 0; i < projectorArray.size(); i++) {
|
|
|
|
|
+ obs_data_t *data = obs_data_create();
|
|
|
|
|
+ obs_data_set_string(data, "saved_projectors",
|
|
|
|
|
+ projectorArray.at(i).c_str());
|
|
|
|
|
+ obs_data_array_push_back(saveProjector, data);
|
|
|
|
|
+ obs_data_release(data);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return saveProjector;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+obs_data_array_t *OBSBasic::SavePreviewProjectors()
|
|
|
|
|
+{
|
|
|
|
|
+ obs_data_array_t *saveProjector = obs_data_array_create();
|
|
|
|
|
+
|
|
|
|
|
+ for (size_t i = 0; i < previewProjectorArray.size(); i++) {
|
|
|
|
|
+ obs_data_t *data = obs_data_create();
|
|
|
|
|
+ obs_data_set_int(data, "saved_preview_projectors",
|
|
|
|
|
+ previewProjectorArray.at(i));
|
|
|
|
|
+ obs_data_array_push_back(saveProjector, data);
|
|
|
|
|
+ obs_data_release(data);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return saveProjector;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
void OBSBasic::Save(const char *file)
|
|
void OBSBasic::Save(const char *file)
|
|
|
{
|
|
{
|
|
|
OBSScene scene = GetCurrentScene();
|
|
OBSScene scene = GetCurrentScene();
|
|
@@ -370,9 +408,12 @@ void OBSBasic::Save(const char *file)
|
|
|
obs_data_array_t *sceneOrder = SaveSceneListOrder();
|
|
obs_data_array_t *sceneOrder = SaveSceneListOrder();
|
|
|
obs_data_array_t *transitions = SaveTransitions();
|
|
obs_data_array_t *transitions = SaveTransitions();
|
|
|
obs_data_array_t *quickTrData = SaveQuickTransitions();
|
|
obs_data_array_t *quickTrData = SaveQuickTransitions();
|
|
|
|
|
+ obs_data_array_t *savedProjectorList = SaveProjectors();
|
|
|
|
|
+ obs_data_array_t *savedPreviewProjectorList = SavePreviewProjectors();
|
|
|
obs_data_t *saveData = GenerateSaveData(sceneOrder, quickTrData,
|
|
obs_data_t *saveData = GenerateSaveData(sceneOrder, quickTrData,
|
|
|
ui->transitionDuration->value(), transitions,
|
|
ui->transitionDuration->value(), transitions,
|
|
|
- scene, curProgramScene);
|
|
|
|
|
|
|
+ scene, curProgramScene, savedProjectorList,
|
|
|
|
|
+ savedPreviewProjectorList);
|
|
|
|
|
|
|
|
obs_data_set_bool(saveData, "preview_locked", ui->preview->Locked());
|
|
obs_data_set_bool(saveData, "preview_locked", ui->preview->Locked());
|
|
|
obs_data_set_int(saveData, "scaling_mode",
|
|
obs_data_set_int(saveData, "scaling_mode",
|
|
@@ -392,6 +433,8 @@ void OBSBasic::Save(const char *file)
|
|
|
obs_data_array_release(sceneOrder);
|
|
obs_data_array_release(sceneOrder);
|
|
|
obs_data_array_release(quickTrData);
|
|
obs_data_array_release(quickTrData);
|
|
|
obs_data_array_release(transitions);
|
|
obs_data_array_release(transitions);
|
|
|
|
|
+ obs_data_array_release(savedProjectorList);
|
|
|
|
|
+ obs_data_array_release(savedPreviewProjectorList);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
static void LoadAudioDevice(const char *name, int channel, obs_data_t *parent)
|
|
static void LoadAudioDevice(const char *name, int channel, obs_data_t *parent)
|
|
@@ -491,6 +534,32 @@ void OBSBasic::LoadSceneListOrder(obs_data_array_t *array)
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+void OBSBasic::LoadSavedProjectors(obs_data_array_t *array)
|
|
|
|
|
+{
|
|
|
|
|
+ size_t num = obs_data_array_count(array);
|
|
|
|
|
+
|
|
|
|
|
+ for (size_t i = 0; i < num; i++) {
|
|
|
|
|
+ obs_data_t *data = obs_data_array_item(array, i);
|
|
|
|
|
+ projectorArray.at(i) = obs_data_get_string(data,
|
|
|
|
|
+ "saved_projectors");
|
|
|
|
|
+
|
|
|
|
|
+ obs_data_release(data);
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+void OBSBasic::LoadSavedPreviewProjectors(obs_data_array_t *array)
|
|
|
|
|
+{
|
|
|
|
|
+ size_t num = obs_data_array_count(array);
|
|
|
|
|
+
|
|
|
|
|
+ for (size_t i = 0; i < num; i++) {
|
|
|
|
|
+ obs_data_t *data = obs_data_array_item(array, i);
|
|
|
|
|
+ previewProjectorArray.at(i) = obs_data_get_int(data,
|
|
|
|
|
+ "saved_preview_projectors");
|
|
|
|
|
+
|
|
|
|
|
+ obs_data_release(data);
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
static void LogFilter(obs_source_t*, obs_source_t *filter, void *v_val)
|
|
static void LogFilter(obs_source_t*, obs_source_t *filter, void *v_val)
|
|
|
{
|
|
{
|
|
|
const char *name = obs_source_get_name(filter);
|
|
const char *name = obs_source_get_name(filter);
|
|
@@ -618,6 +687,23 @@ void OBSBasic::Load(const char *file)
|
|
|
ui->transitionDuration->setValue(newDuration);
|
|
ui->transitionDuration->setValue(newDuration);
|
|
|
SetTransition(curTransition);
|
|
SetTransition(curTransition);
|
|
|
|
|
|
|
|
|
|
+ obs_data_array_t *savedProjectors = obs_data_get_array(data,
|
|
|
|
|
+ "saved_projectors");
|
|
|
|
|
+
|
|
|
|
|
+ if (savedProjectors)
|
|
|
|
|
+ LoadSavedProjectors(savedProjectors);
|
|
|
|
|
+
|
|
|
|
|
+ obs_data_array_release(savedProjectors);
|
|
|
|
|
+
|
|
|
|
|
+ obs_data_array_t *savedPreviewProjectors = obs_data_get_array(data,
|
|
|
|
|
+ "saved_preview_projectors");
|
|
|
|
|
+
|
|
|
|
|
+ if (savedPreviewProjectors)
|
|
|
|
|
+ LoadSavedPreviewProjectors(savedPreviewProjectors);
|
|
|
|
|
+
|
|
|
|
|
+ obs_data_array_release(savedPreviewProjectors);
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
retryScene:
|
|
retryScene:
|
|
|
curScene = obs_get_source_by_name(sceneName);
|
|
curScene = obs_get_source_by_name(sceneName);
|
|
|
curProgramScene = obs_get_source_by_name(programSceneName);
|
|
curProgramScene = obs_get_source_by_name(programSceneName);
|
|
@@ -1259,6 +1345,8 @@ void OBSBasic::OBSInit()
|
|
|
ui->mainSplitter->setSizes(defSizes);
|
|
ui->mainSplitter->setSizes(defSizes);
|
|
|
|
|
|
|
|
SystemTray(true);
|
|
SystemTray(true);
|
|
|
|
|
+
|
|
|
|
|
+ OpenSavedProjectors();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void OBSBasic::InitHotkeys()
|
|
void OBSBasic::InitHotkeys()
|
|
@@ -1891,6 +1979,14 @@ void OBSBasic::RenameSources(QString newName, QString prevName)
|
|
|
volumes[i]->SetName(newName);
|
|
volumes[i]->SetName(newName);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ std::string newText = newName.toUtf8().constData();
|
|
|
|
|
+ std::string prevText = prevName.toUtf8().constData();
|
|
|
|
|
+
|
|
|
|
|
+ for (size_t j = 0; j < projectorArray.size(); j++) {
|
|
|
|
|
+ if (projectorArray.at(j) == prevText)
|
|
|
|
|
+ projectorArray.at(j) = newText;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
SaveProject();
|
|
SaveProject();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -4751,15 +4847,30 @@ void OBSBasic::NudgeRight() {Nudge(1, MoveDir::Right);}
|
|
|
void OBSBasic::OpenProjector(obs_source_t *source, int monitor)
|
|
void OBSBasic::OpenProjector(obs_source_t *source, int monitor)
|
|
|
{
|
|
{
|
|
|
/* seriously? 10 monitors? */
|
|
/* seriously? 10 monitors? */
|
|
|
- if (monitor > 9)
|
|
|
|
|
|
|
+ if (monitor > 9 || monitor > QGuiApplication::screens().size() - 1)
|
|
|
return;
|
|
return;
|
|
|
|
|
|
|
|
|
|
+ bool isPreview = false;
|
|
|
|
|
+
|
|
|
|
|
+ if (source == nullptr)
|
|
|
|
|
+ isPreview = true;
|
|
|
|
|
+
|
|
|
delete projectors[monitor];
|
|
delete projectors[monitor];
|
|
|
projectors[monitor].clear();
|
|
projectors[monitor].clear();
|
|
|
|
|
|
|
|
|
|
+ RemoveSavedProjectors(monitor);
|
|
|
|
|
+
|
|
|
OBSProjector *projector = new OBSProjector(nullptr, source);
|
|
OBSProjector *projector = new OBSProjector(nullptr, source);
|
|
|
- projector->Init(monitor);
|
|
|
|
|
|
|
|
|
|
|
|
+ const char *name = obs_source_get_name(source);
|
|
|
|
|
+
|
|
|
|
|
+ if (isPreview) {
|
|
|
|
|
+ previewProjectorArray.at((size_t)monitor) = 1;
|
|
|
|
|
+ } else {
|
|
|
|
|
+ projectorArray.at((size_t)monitor) = name;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ projector->Init(monitor);
|
|
|
projectors[monitor] = projector;
|
|
projectors[monitor] = projector;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -4789,6 +4900,42 @@ void OBSBasic::OpenSceneProjector()
|
|
|
OpenProjector(obs_scene_get_source(scene), monitor);
|
|
OpenProjector(obs_scene_get_source(scene), monitor);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+void OBSBasic::OpenSavedProjectors()
|
|
|
|
|
+{
|
|
|
|
|
+ bool projectorSave = config_get_bool(GetGlobalConfig(),
|
|
|
|
|
+ "BasicWindow", "SaveProjectors");
|
|
|
|
|
+
|
|
|
|
|
+ if (projectorSave) {
|
|
|
|
|
+ for (size_t i = 0; i < projectorArray.size(); i++) {
|
|
|
|
|
+ if (projectorArray.at(i).empty() == false) {
|
|
|
|
|
+ OBSSource source = obs_get_source_by_name(
|
|
|
|
|
+ projectorArray.at(i).c_str());
|
|
|
|
|
+
|
|
|
|
|
+ if (!source) {
|
|
|
|
|
+ RemoveSavedProjectors((int)i);
|
|
|
|
|
+ obs_source_release(source);
|
|
|
|
|
+ continue;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ OpenProjector(source, (int)i);
|
|
|
|
|
+ obs_source_release(source);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ for (size_t i = 0; i < previewProjectorArray.size(); i++) {
|
|
|
|
|
+ if (previewProjectorArray.at(i) == 1) {
|
|
|
|
|
+ OpenProjector(nullptr, (int)i);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+void OBSBasic::RemoveSavedProjectors(int monitor)
|
|
|
|
|
+{
|
|
|
|
|
+ previewProjectorArray.at((size_t)monitor) = 0;
|
|
|
|
|
+ projectorArray.at((size_t)monitor) = "";
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
void OBSBasic::UpdateTitleBar()
|
|
void OBSBasic::UpdateTitleBar()
|
|
|
{
|
|
{
|
|
|
stringstream name;
|
|
stringstream name;
|