From d8c215df0ec657c3b934c746eeb8529660b7b5c3 Mon Sep 17 00:00:00 2001 From: Bennik2000 Date: Mon, 27 Apr 2020 23:26:20 +0200 Subject: [PATCH] UI: Add always on top checkbox to projector context menu This checkbox overrides the global always on top setting --- UI/window-basic-main.cpp | 18 +++++++++++++++++ UI/window-basic-main.hpp | 2 ++ UI/window-projector.cpp | 43 ++++++++++++++++++++++++++++++++++++++++ UI/window-projector.hpp | 7 +++++++ 4 files changed, 70 insertions(+) diff --git a/UI/window-basic-main.cpp b/UI/window-basic-main.cpp index e77e4099e..80f027ebe 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 f44d89a04..e9dd2b6b2 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 2ea160067..77ad2d1eb 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 8b5e5a918..a3406f3d8 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); };