Browse Source

UI: Add always on top checkbox to projector context menu

This checkbox overrides the global always on top setting
Bennik2000 5 years ago
parent
commit
d8c215df0e
4 changed files with 70 additions and 0 deletions
  1. 18 0
      UI/window-basic-main.cpp
  2. 2 0
      UI/window-basic-main.hpp
  3. 43 0
      UI/window-projector.cpp
  4. 7 0
      UI/window-projector.hpp

+ 18 - 0
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<int>(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);
 		}
 	}
 }

+ 2 - 0
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 {

+ 43 - 0
UI/window-projector.cpp

@@ -10,6 +10,8 @@
 #include "platform.hpp"
 
 static QList<OBSProjector *> multiviewProjectors;
+static QList<OBSProjector *> 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<OBSBasic *>(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);
+}

+ 7 - 0
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<OBSWeakSource> 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);
 };