Browse Source

UI: Clean up OBSProjector creation

Shaolin 7 years ago
parent
commit
8b6641d1a8
4 changed files with 93 additions and 93 deletions
  1. 23 23
      UI/window-basic-main.cpp
  2. 2 3
      UI/window-basic-main.hpp
  3. 63 62
      UI/window-projector.cpp
  4. 5 5
      UI/window-projector.hpp

+ 23 - 23
UI/window-basic-main.cpp

@@ -5448,19 +5448,17 @@ void OBSBasic::NudgeDown()     {Nudge(1,  MoveDir::Down);}
 void OBSBasic::NudgeLeft()     {Nudge(1,  MoveDir::Left);}
 void OBSBasic::NudgeRight()    {Nudge(1,  MoveDir::Right);}
 
-void OBSBasic::OpenProjector(obs_source_t *source, int monitor, QString title,
-		ProjectorType type)
+OBSProjector *OBSBasic::OpenProjector(obs_source_t *source, int monitor,
+		QString title, ProjectorType type)
 {
 	/* seriously?  10 monitors? */
 	if (monitor > 9 || monitor > QGuiApplication::screens().size() - 1)
-		return;
-
-	OBSProjector *projector = new OBSProjector(nullptr, source,
-			title != nullptr);
+		return nullptr;
 
-	if (title != nullptr) {
-		projector->Init(monitor, true, title, type);
+	OBSProjector *projector = new OBSProjector(nullptr, source, monitor,
+			title, type);
 
+	if (monitor < 0) {
 		for (auto &projPtr : windowProjectors) {
 			if (!projPtr) {
 				projPtr = projector;
@@ -5474,9 +5472,11 @@ void OBSBasic::OpenProjector(obs_source_t *source, int monitor, QString title,
 		delete projectors[monitor];
 		projectors[monitor].clear();
 
-		projector->Init(monitor, false, nullptr, type);
 		projectors[monitor] = projector;
 	}
+
+	projector->Init();
+	return projector;
 }
 
 void OBSBasic::OpenStudioProgramProjector()
@@ -5498,7 +5498,8 @@ void OBSBasic::OpenSourceProjector()
 	if (!item)
 		return;
 
-	OpenProjector(obs_sceneitem_get_source(item), monitor, nullptr);
+	OpenProjector(obs_sceneitem_get_source(item), monitor, nullptr,
+			ProjectorType::Source);
 }
 
 void OBSBasic::OpenMultiviewProjector()
@@ -5520,47 +5521,46 @@ void OBSBasic::OpenSceneProjector()
 
 void OBSBasic::OpenStudioProgramWindow()
 {
-	int monitor = sender()->property("monitor").toInt();
-	QString title = QTStr("StudioProgramWindow");
-	OpenProjector(nullptr, monitor, title, ProjectorType::StudioProgram);
+	OpenProjector(nullptr, -1, QTStr("StudioProgramWindow"),
+			ProjectorType::StudioProgram);
 }
 
 void OBSBasic::OpenPreviewWindow()
 {
-	int monitor = sender()->property("monitor").toInt();
-	QString title = QTStr("PreviewWindow");
-	OpenProjector(nullptr, monitor, title, ProjectorType::Preview);
+	OpenProjector(nullptr, -1, QTStr("PreviewWindow"),
+			ProjectorType::Preview);
 }
 
 void OBSBasic::OpenSourceWindow()
 {
-	int monitor = sender()->property("monitor").toInt();
 	OBSSceneItem item = GetCurrentSceneItem();
 	if (!item)
 		return;
 
 	OBSSource source = obs_sceneitem_get_source(item);
 	QString title = QString::fromUtf8(obs_source_get_name(source));
-	OpenProjector(obs_sceneitem_get_source(item), monitor, title);
+
+	OpenProjector(obs_sceneitem_get_source(item), -1, title,
+			ProjectorType::Source);
 }
 
 void OBSBasic::OpenMultiviewWindow()
 {
-	int monitor = sender()->property("monitor").toInt();
-	QString title = QTStr("MultiviewWindowed");
-	OpenProjector(nullptr, monitor, title, ProjectorType::Multiview);
+	OpenProjector(nullptr, -1, QTStr("MultiviewWindowed"),
+			ProjectorType::Multiview);
 }
 
 void OBSBasic::OpenSceneWindow()
 {
-	int monitor = sender()->property("monitor").toInt();
 	OBSScene scene = GetCurrentScene();
 	if (!scene)
 		return;
 
 	OBSSource source = obs_scene_get_source(scene);
 	QString title = QString::fromUtf8(obs_source_get_name(source));
-	OpenProjector(obs_scene_get_source(scene), monitor, title);
+
+	OpenProjector(obs_scene_get_source(scene), -1, title,
+			ProjectorType::Scene);
 }
 
 void OBSBasic::OpenSavedProjectors()

+ 2 - 3
UI/window-basic-main.hpp

@@ -250,9 +250,8 @@ private:
 
 	void Nudge(int dist, MoveDir dir);
 
-	void OpenProjector(obs_source_t *source, int monitor,
-			QString title = nullptr,
-			ProjectorType type = ProjectorType::Source);
+	OBSProjector *OpenProjector(obs_source_t *source, int monitor,
+			QString title, ProjectorType type);
 
 	void GetAudioSourceFilters();
 	void GetAudioSourceProperties();

+ 63 - 62
UI/window-projector.cpp

@@ -19,14 +19,20 @@ static QList<OBSProjector *> multiviewProjectors;
 static bool updatingMultiview = false;
 static int multiviewLayout = HORIZONTAL_TOP;
 
-OBSProjector::OBSProjector(QWidget *widget, obs_source_t *source_, bool window)
+OBSProjector::OBSProjector(QWidget *widget, obs_source_t *source_, int monitor,
+		QString title, ProjectorType type_)
 	: OBSQTDisplay                 (widget,
 	                                Qt::Window),
 	  source                       (source_),
 	  removedSignal                (obs_source_get_signal_handler(source),
 	                                "remove", OBSSourceRemoved, this)
 {
-	if (!window) {
+	projectorTitle = title;
+	savedMonitor   = monitor;
+	isWindow       = savedMonitor < 0;
+	type           = type_;
+
+	if (!isWindow) {
 		setWindowFlags(Qt::FramelessWindowHint |
 				Qt::X11BypassWindowManagerHint);
 	}
@@ -51,12 +57,61 @@ OBSProjector::OBSProjector(QWidget *widget, obs_source_t *source_, bool window)
 
 	bool hideCursor = config_get_bool(GetGlobalConfig(),
 			"BasicWindow", "HideProjectorCursor");
-	if (hideCursor && !window) {
+	if (hideCursor && !isWindow) {
 		QPixmap empty(16, 16);
 		empty.fill(Qt::transparent);
 		setCursor(QCursor(empty));
 	}
 
+	if (type == ProjectorType::Multiview) {
+		obs_enter_graphics();
+		gs_render_start(true);
+		gs_vertex2f(0.001f, 0.001f);
+		gs_vertex2f(0.001f, 0.997f);
+		gs_vertex2f(0.997f, 0.997f);
+		gs_vertex2f(0.997f, 0.001f);
+		gs_vertex2f(0.001f, 0.001f);
+		outerBox = gs_render_save();
+
+		gs_render_start(true);
+		gs_vertex2f(0.04f, 0.04f);
+		gs_vertex2f(0.04f, 0.96f);
+		gs_vertex2f(0.96f, 0.96f);
+		gs_vertex2f(0.96f, 0.04f);
+		gs_vertex2f(0.04f, 0.04f);
+		innerBox = gs_render_save();
+
+		gs_render_start(true);
+		gs_vertex2f(0.15f, 0.04f);
+		gs_vertex2f(0.15f, 0.96f);
+		leftVLine = gs_render_save();
+
+		gs_render_start(true);
+		gs_vertex2f(0.85f, 0.04f);
+		gs_vertex2f(0.85f, 0.96f);
+		rightVLine = gs_render_save();
+
+		gs_render_start(true);
+		gs_vertex2f(0.0f, 0.5f);
+		gs_vertex2f(0.075f, 0.5f);
+		leftLine = gs_render_save();
+
+		gs_render_start(true);
+		gs_vertex2f(0.5f, 0.0f);
+		gs_vertex2f(0.5f, 0.09f);
+		topLine = gs_render_save();
+
+		gs_render_start(true);
+		gs_vertex2f(0.925f, 0.5f);
+		gs_vertex2f(1.0f, 0.5f);
+		rightLine = gs_render_save();
+		obs_leave_graphics();
+
+		UpdateMultiview();
+
+		multiviewProjectors.push_back(this);
+	}
+
 	App()->IncrementSleepInhibition();
 	resize(480, 270);
 }
@@ -137,25 +192,20 @@ static OBSSource CreateLabel(const char *name, size_t h)
 	return txtSource;
 }
 
-void OBSProjector::Init(int monitor, bool window, QString title,
-		ProjectorType type_)
+void OBSProjector::Init()
 {
-	savedMonitor = monitor;
-	isWindow     = window;
-	type         = type_;
-
 	bool alwaysOnTop = config_get_bool(GetGlobalConfig(),
 			"BasicWindow", "ProjectorAlwaysOnTop");
-	if (alwaysOnTop && !window)
+	if (alwaysOnTop && !isWindow)
 		SetAlwaysOnTop(this, true);
 
 	show();
 
-	if (window) {
-		UpdateProjectorTitle(title);
+	if (isWindow) {
+		UpdateProjectorTitle(projectorTitle);
 		windowedProjectors.push_back(this);
 	} else {
-		QScreen *screen = QGuiApplication::screens()[monitor];
+		QScreen *screen = QGuiApplication::screens()[savedMonitor];
 		setGeometry(screen->geometry());
 
 		QAction *action = new QAction(this);
@@ -169,55 +219,6 @@ void OBSProjector::Init(int monitor, bool window, QString title,
 	if (source)
 		obs_source_inc_showing(source);
 
-	if (type == ProjectorType::Multiview) {
-		obs_enter_graphics();
-		gs_render_start(true);
-		gs_vertex2f(0.001f, 0.001f);
-		gs_vertex2f(0.001f, 0.997f);
-		gs_vertex2f(0.997f, 0.997f);
-		gs_vertex2f(0.997f, 0.001f);
-		gs_vertex2f(0.001f, 0.001f);
-		outerBox = gs_render_save();
-
-		gs_render_start(true);
-		gs_vertex2f(0.04f, 0.04f);
-		gs_vertex2f(0.04f, 0.96f);
-		gs_vertex2f(0.96f, 0.96f);
-		gs_vertex2f(0.96f, 0.04f);
-		gs_vertex2f(0.04f, 0.04f);
-		innerBox = gs_render_save();
-
-		gs_render_start(true);
-		gs_vertex2f(0.15f, 0.04f);
-		gs_vertex2f(0.15f, 0.96f);
-		leftVLine = gs_render_save();
-
-		gs_render_start(true);
-		gs_vertex2f(0.85f, 0.04f);
-		gs_vertex2f(0.85f, 0.96f);
-		rightVLine = gs_render_save();
-
-		gs_render_start(true);
-		gs_vertex2f(0.0f, 0.5f);
-		gs_vertex2f(0.075f, 0.5f);
-		leftLine = gs_render_save();
-
-		gs_render_start(true);
-		gs_vertex2f(0.5f, 0.0f);
-		gs_vertex2f(0.5f, 0.09f);
-		topLine = gs_render_save();
-
-		gs_render_start(true);
-		gs_vertex2f(0.925f, 0.5f);
-		gs_vertex2f(1.0f, 0.5f);
-		rightLine = gs_render_save();
-		obs_leave_graphics();
-
-		UpdateMultiview();
-
-		multiviewProjectors.push_back(this);
-	}
-
 	ready = true;
 }
 

+ 5 - 5
UI/window-projector.hpp

@@ -27,8 +27,8 @@ private:
 	void mousePressEvent(QMouseEvent *event) override;
 	void mouseDoubleClickEvent(QMouseEvent *event) override;
 
-	int savedMonitor = 0;
-	bool isWindow = false;
+	int savedMonitor;
+	bool isWindow;
 	QString projectorTitle;
 	ProjectorType type = ProjectorType::Source;
 	OBSWeakSource multiviewScenes[8];
@@ -49,11 +49,11 @@ private slots:
 	void EscapeTriggered();
 
 public:
-	OBSProjector(QWidget *parent, obs_source_t *source, bool window);
+	OBSProjector(QWidget *widget, obs_source_t *source_, int monitor,
+			QString title, ProjectorType type_);
 	~OBSProjector();
 
-	void Init(int monitor, bool window, QString title,
-			ProjectorType type = ProjectorType::Source);
+	void Init();
 
 	OBSSource GetSource();
 	ProjectorType GetProjectorType();