diff --git a/UI/window-basic-main.cpp b/UI/window-basic-main.cpp index e77e4099e85afcacef9e610898b936ee98cc39e6..80f027ebed036d809f0ab647fbe835c373ffaa45 100644 --- a/UI/window-basic-main.cpp +++ b/UI/window-basic-main.cpp @@ -590,6 +590,7 @@ obs_data_array_t *OBSBasic::SaveProjectors() obs_data_t *data = obs_data_create(); ProjectorType type = projector->GetProjectorType(); + switch (type) { case ProjectorType::Scene: case ProjectorType::Source: { @@ -601,11 +602,20 @@ obs_data_array_t *OBSBasic::SaveProjectors() default: break; } + obs_data_set_int(data, "monitor", projector->GetMonitor()); obs_data_set_int(data, "type", static_cast(type)); obs_data_set_string( data, "geometry", projector->saveGeometry().toBase64().constData()); + + if (projector->IsAlwaysOnTopOverridden()) + obs_data_set_bool(data, "alwaysOnTop", + projector->IsAlwaysOnTop()); + + obs_data_set_bool(data, "alwaysOnTopOverridden", + projector->IsAlwaysOnTopOverridden()); + obs_data_array_push_back(savedProjectors, data); obs_data_release(data); }; @@ -792,6 +802,10 @@ void OBSBasic::LoadSavedProjectors(obs_data_array_t *array) info->geometry = std::string(obs_data_get_string(data, "geometry")); info->name = std::string(obs_data_get_string(data, "name")); + info->alwaysOnTop = obs_data_get_bool(data, "alwaysOnTop"); + info->alwaysOnTopOverridden = + obs_data_get_bool(data, "alwaysOnTopOverridden"); + savedProjectorsArray.emplace_back(info); obs_data_release(data); @@ -6872,6 +6886,10 @@ void OBSBasic::OpenSavedProjector(SavedProjectorInfo *info) Qt::LeftToRight, Qt::AlignCenter, size(), rect)); } + + if (info->alwaysOnTopOverridden) + projector->SetIsAlwaysOnTop(info->alwaysOnTop, + true); } } } diff --git a/UI/window-basic-main.hpp b/UI/window-basic-main.hpp index f44d89a04905ef5d3fd726bcdb0862ef6aa99696..e9dd2b6b2565fae8eeecc2264ab1687abb0e8b80 100644 --- a/UI/window-basic-main.hpp +++ b/UI/window-basic-main.hpp @@ -82,6 +82,8 @@ struct SavedProjectorInfo { int monitor; std::string geometry; std::string name; + bool alwaysOnTop; + bool alwaysOnTopOverridden; }; struct QuickTransition { diff --git a/UI/window-projector.cpp b/UI/window-projector.cpp index 2ea160067764363396b57b0305c1330a04a3d208..77ad2d1ebbcba7f814cdb91cf7ebc8d7df0e6fe2 100644 --- a/UI/window-projector.cpp +++ b/UI/window-projector.cpp @@ -10,6 +10,8 @@ #include "platform.hpp" static QList multiviewProjectors; +static QList allProjectors; + static bool updatingMultiview = false, drawLabel, drawSafeArea, mouseSwitching, transitionOnDoubleClick; static MultiviewLayout multiviewLayout; @@ -41,6 +43,10 @@ OBSProjector::OBSProjector(QWidget *widget, obs_source_t *source_, int monitor, addAction(action); connect(action, SIGNAL(triggered()), this, SLOT(EscapeTriggered())); + isAlwaysOnTop = config_get_bool(GetGlobalConfig(), "BasicWindow", + "ProjectorAlwaysOnTop"); + SetAlwaysOnTop(this, isAlwaysOnTop); + setAttribute(Qt::WA_DeleteOnClose, true); //disable application quit when last window closed @@ -121,6 +127,8 @@ OBSProjector::OBSProjector(QWidget *widget, obs_source_t *source_, int monitor, if (source) obs_source_inc_showing(source); + allProjectors.push_back(this); + ready = true; show(); @@ -837,6 +845,16 @@ void OBSProjector::mousePressEvent(QMouseEvent *event) this, SLOT(ResizeToContent())); } + QAction *alwaysOnTopButton = + new QAction(QTStr("Basic.MainMenu.AlwaysOnTop"), this); + alwaysOnTopButton->setCheckable(true); + alwaysOnTopButton->setChecked(isAlwaysOnTop); + + connect(alwaysOnTopButton, &QAction::toggled, this, + &OBSProjector::AlwaysOnTopToggled); + + popup.addAction(alwaysOnTopButton); + popup.addAction(QTStr("Close"), this, SLOT(EscapeTriggered())); popup.exec(QCursor::pos()); } @@ -862,6 +880,8 @@ void OBSProjector::EscapeTriggered() { OBSBasic *main = reinterpret_cast(App()->GetMainWindow()); main->DeleteProjector(this); + + allProjectors.removeAll(this); } void OBSProjector::UpdateMultiview() @@ -1087,8 +1107,31 @@ void OBSProjector::ResizeToContent() resize(newX, newY); } +void OBSProjector::AlwaysOnTopToggled(bool isAlwaysOnTop) +{ + SetIsAlwaysOnTop(isAlwaysOnTop, true); +} + void OBSProjector::closeEvent(QCloseEvent *event) { EscapeTriggered(); event->accept(); } + +bool OBSProjector::IsAlwaysOnTop() const +{ + return isAlwaysOnTop; +} + +bool OBSProjector::IsAlwaysOnTopOverridden() const +{ + return isAlwaysOnTopOverridden; +} + +void OBSProjector::SetIsAlwaysOnTop(bool isAlwaysOnTop, bool isOverridden) +{ + this->isAlwaysOnTop = isAlwaysOnTop; + this->isAlwaysOnTopOverridden = isOverridden; + + SetAlwaysOnTop(this, isAlwaysOnTop); +} diff --git a/UI/window-projector.hpp b/UI/window-projector.hpp index 8b5e5a918070dd8b1583cc15e564c50b4511abc9..a3406f3d8d99279bfdeee00551b8e1204667e459 100644 --- a/UI/window-projector.hpp +++ b/UI/window-projector.hpp @@ -36,6 +36,8 @@ private: void mouseDoubleClickEvent(QMouseEvent *event) override; void closeEvent(QCloseEvent *event) override; + bool isAlwaysOnTop; + bool isAlwaysOnTopOverridden = false; int savedMonitor = -1; ProjectorType type = ProjectorType::Source; std::vector multiviewScenes; @@ -80,6 +82,7 @@ private slots: void OpenFullScreenProjector(); void ResizeToContent(); void OpenWindowedProjector(); + void AlwaysOnTopToggled(bool alwaysOnTop); public: OBSProjector(QWidget *widget, obs_source_t *source_, int monitor, @@ -92,4 +95,8 @@ public: static void UpdateMultiviewProjectors(); void RenameProjector(QString oldName, QString newName); void SetHideCursor(); + + bool IsAlwaysOnTop() const; + bool IsAlwaysOnTopOverridden() const; + void SetIsAlwaysOnTop(bool isAlwaysOnTop, bool isOverridden); };