Quellcode durchsuchen

UI: Minimize context bar when too small

This change removes the minimum total size from the context bar, instead
removing certain elements when the size is too small. This means that
users will still be able to make OBS smaller in width while keeping the
context bar enabled.

First, the properties, filter and interact buttons will get reduced to
just the symbols, if it gets even smaller the source specific menus are
hidden.
gxalpha vor 4 Jahren
Ursprung
Commit
f2fda20572
3 geänderte Dateien mit 136 neuen und 68 gelöschten Zeilen
  1. 1 1
      UI/forms/OBSBasic.ui
  2. 127 67
      UI/window-basic-main.cpp
  3. 8 0
      UI/window-basic-main.hpp

+ 1 - 1
UI/forms/OBSBasic.ui

@@ -205,7 +205,7 @@
       </property>
       </property>
       <property name="minimumSize">
       <property name="minimumSize">
        <size>
        <size>
-        <width>740</width>
+        <width>0</width>
         <height>30</height>
         <height>30</height>
        </size>
        </size>
       </property>
       </property>

+ 127 - 67
UI/window-basic-main.cpp

@@ -301,6 +301,8 @@ OBSBasic::OBSBasic(QWidget *parent)
 
 
 		if (obs_get_video_info(&ovi))
 		if (obs_get_video_info(&ovi))
 			ResizePreview(ovi.base_width, ovi.base_height);
 			ResizePreview(ovi.base_width, ovi.base_height);
+
+		UpdateContextBarVisibility();
 	};
 	};
 
 
 	connect(windowHandle(), &QWindow::screenChanged, displayResize);
 	connect(windowHandle(), &QWindow::screenChanged, displayResize);
@@ -3047,6 +3049,26 @@ void OBSBasic::ClearContextBar()
 	}
 	}
 }
 }
 
 
+void OBSBasic::UpdateContextBarVisibility()
+{
+	int width = ui->centralwidget->size().width();
+
+	ContextBarSize contextBarSizeNew;
+	if (width >= 740) {
+		contextBarSizeNew = ContextBarSize_Normal;
+	} else if (width >= 600) {
+		contextBarSizeNew = ContextBarSize_Reduced;
+	} else {
+		contextBarSizeNew = ContextBarSize_Minimized;
+	}
+
+	if (contextBarSize == contextBarSizeNew)
+		return;
+
+	contextBarSize = contextBarSizeNew;
+	UpdateContextBarDeferred();
+}
+
 static bool is_network_media_source(obs_source_t *source, const char *id)
 static bool is_network_media_source(obs_source_t *source, const char *id)
 {
 {
 	if (strcmp(id, "ffmpeg_source") != 0)
 	if (strcmp(id, "ffmpeg_source") != 0)
@@ -3072,82 +3094,109 @@ void OBSBasic::UpdateContextBar(bool force)
 
 
 	OBSSceneItem item = GetCurrentSceneItem();
 	OBSSceneItem item = GetCurrentSceneItem();
 
 
-	ClearContextBar();
-
 	if (item) {
 	if (item) {
 		obs_source_t *source = obs_sceneitem_get_source(item);
 		obs_source_t *source = obs_sceneitem_get_source(item);
+
+		bool updateNeeded = true;
+		QLayoutItem *la = ui->emptySpace->layout()->itemAt(0);
+		if (la) {
+			if (SourceToolbar *toolbar =
+				    dynamic_cast<SourceToolbar *>(
+					    la->widget())) {
+				if (toolbar->GetSource() == source)
+					updateNeeded = false;
+			} else if (MediaControls *toolbar =
+					   dynamic_cast<MediaControls *>(
+						   la->widget())) {
+				if (toolbar->GetSource() == source)
+					updateNeeded = false;
+			}
+		}
+
 		const char *id = obs_source_get_unversioned_id(source);
 		const char *id = obs_source_get_unversioned_id(source);
 		uint32_t flags = obs_source_get_output_flags(source);
 		uint32_t flags = obs_source_get_output_flags(source);
 
 
 		ui->sourceInteractButton->setVisible(flags &
 		ui->sourceInteractButton->setVisible(flags &
 						     OBS_SOURCE_INTERACTION);
 						     OBS_SOURCE_INTERACTION);
 
 
-		if (flags & OBS_SOURCE_CONTROLLABLE_MEDIA) {
-			if (!is_network_media_source(source, id)) {
-				MediaControls *mediaControls =
-					new MediaControls(ui->emptySpace);
-				mediaControls->SetSource(source);
-
-				ui->emptySpace->layout()->addWidget(
-					mediaControls);
+		if (contextBarSize >= ContextBarSize_Reduced &&
+		    (updateNeeded || force)) {
+			ClearContextBar();
+			if (flags & OBS_SOURCE_CONTROLLABLE_MEDIA) {
+				if (!is_network_media_source(source, id)) {
+					MediaControls *mediaControls =
+						new MediaControls(
+							ui->emptySpace);
+					mediaControls->SetSource(source);
+
+					ui->emptySpace->layout()->addWidget(
+						mediaControls);
+				}
+			} else if (strcmp(id, "browser_source") == 0) {
+				BrowserToolbar *c = new BrowserToolbar(
+					ui->emptySpace, source);
+				ui->emptySpace->layout()->addWidget(c);
+
+			} else if (strcmp(id, "wasapi_input_capture") == 0 ||
+				   strcmp(id, "wasapi_output_capture") == 0 ||
+				   strcmp(id, "coreaudio_input_capture") == 0 ||
+				   strcmp(id, "coreaudio_output_capture") ==
+					   0 ||
+				   strcmp(id, "pulse_input_capture") == 0 ||
+				   strcmp(id, "pulse_output_capture") == 0 ||
+				   strcmp(id, "alsa_input_capture") == 0) {
+				AudioCaptureToolbar *c =
+					new AudioCaptureToolbar(ui->emptySpace,
+								source);
+				c->Init();
+				ui->emptySpace->layout()->addWidget(c);
+
+			} else if (strcmp(id, "window_capture") == 0 ||
+				   strcmp(id, "xcomposite_input") == 0) {
+				WindowCaptureToolbar *c =
+					new WindowCaptureToolbar(ui->emptySpace,
+								 source);
+				c->Init();
+				ui->emptySpace->layout()->addWidget(c);
+
+			} else if (strcmp(id, "monitor_capture") == 0 ||
+				   strcmp(id, "display_capture") == 0 ||
+				   strcmp(id, "xshm_input") == 0) {
+				DisplayCaptureToolbar *c =
+					new DisplayCaptureToolbar(
+						ui->emptySpace, source);
+				c->Init();
+				ui->emptySpace->layout()->addWidget(c);
+
+			} else if (strcmp(id, "dshow_input") == 0) {
+				DeviceCaptureToolbar *c =
+					new DeviceCaptureToolbar(ui->emptySpace,
+								 source);
+				ui->emptySpace->layout()->addWidget(c);
+
+			} else if (strcmp(id, "game_capture") == 0) {
+				GameCaptureToolbar *c = new GameCaptureToolbar(
+					ui->emptySpace, source);
+				ui->emptySpace->layout()->addWidget(c);
+
+			} else if (strcmp(id, "image_source") == 0) {
+				ImageSourceToolbar *c = new ImageSourceToolbar(
+					ui->emptySpace, source);
+				ui->emptySpace->layout()->addWidget(c);
+
+			} else if (strcmp(id, "color_source") == 0) {
+				ColorSourceToolbar *c = new ColorSourceToolbar(
+					ui->emptySpace, source);
+				ui->emptySpace->layout()->addWidget(c);
+
+			} else if (strcmp(id, "text_ft2_source") == 0 ||
+				   strcmp(id, "text_gdiplus") == 0) {
+				TextSourceToolbar *c = new TextSourceToolbar(
+					ui->emptySpace, source);
+				ui->emptySpace->layout()->addWidget(c);
 			}
 			}
-		} else if (strcmp(id, "browser_source") == 0) {
-			BrowserToolbar *c =
-				new BrowserToolbar(ui->emptySpace, source);
-			ui->emptySpace->layout()->addWidget(c);
-
-		} else if (strcmp(id, "wasapi_input_capture") == 0 ||
-			   strcmp(id, "wasapi_output_capture") == 0 ||
-			   strcmp(id, "coreaudio_input_capture") == 0 ||
-			   strcmp(id, "coreaudio_output_capture") == 0 ||
-			   strcmp(id, "pulse_input_capture") == 0 ||
-			   strcmp(id, "pulse_output_capture") == 0 ||
-			   strcmp(id, "alsa_input_capture") == 0) {
-			AudioCaptureToolbar *c =
-				new AudioCaptureToolbar(ui->emptySpace, source);
-			c->Init();
-			ui->emptySpace->layout()->addWidget(c);
-
-		} else if (strcmp(id, "window_capture") == 0 ||
-			   strcmp(id, "xcomposite_input") == 0) {
-			WindowCaptureToolbar *c = new WindowCaptureToolbar(
-				ui->emptySpace, source);
-			c->Init();
-			ui->emptySpace->layout()->addWidget(c);
-
-		} else if (strcmp(id, "monitor_capture") == 0 ||
-			   strcmp(id, "display_capture") == 0 ||
-			   strcmp(id, "xshm_input") == 0) {
-			DisplayCaptureToolbar *c = new DisplayCaptureToolbar(
-				ui->emptySpace, source);
-			c->Init();
-			ui->emptySpace->layout()->addWidget(c);
-
-		} else if (strcmp(id, "dshow_input") == 0) {
-			DeviceCaptureToolbar *c = new DeviceCaptureToolbar(
-				ui->emptySpace, source);
-			ui->emptySpace->layout()->addWidget(c);
-
-		} else if (strcmp(id, "game_capture") == 0) {
-			GameCaptureToolbar *c =
-				new GameCaptureToolbar(ui->emptySpace, source);
-			ui->emptySpace->layout()->addWidget(c);
-
-		} else if (strcmp(id, "image_source") == 0) {
-			ImageSourceToolbar *c =
-				new ImageSourceToolbar(ui->emptySpace, source);
-			ui->emptySpace->layout()->addWidget(c);
-
-		} else if (strcmp(id, "color_source") == 0) {
-			ColorSourceToolbar *c =
-				new ColorSourceToolbar(ui->emptySpace, source);
-			ui->emptySpace->layout()->addWidget(c);
-
-		} else if (strcmp(id, "text_ft2_source") == 0 ||
-			   strcmp(id, "text_gdiplus") == 0) {
-			TextSourceToolbar *c =
-				new TextSourceToolbar(ui->emptySpace, source);
-			ui->emptySpace->layout()->addWidget(c);
+		} else if (contextBarSize == ContextBarSize_Minimized) {
+			ClearContextBar();
 		}
 		}
 
 
 		QIcon icon;
 		QIcon icon;
@@ -3171,6 +3220,7 @@ void OBSBasic::UpdateContextBar(bool force)
 		ui->sourcePropertiesButton->setEnabled(
 		ui->sourcePropertiesButton->setEnabled(
 			obs_source_configurable(source));
 			obs_source_configurable(source));
 	} else {
 	} else {
+		ClearContextBar();
 		ui->contextSourceIcon->hide();
 		ui->contextSourceIcon->hide();
 		ui->contextSourceIconSpacer->show();
 		ui->contextSourceIconSpacer->show();
 		ui->contextSourceLabel->setText(
 		ui->contextSourceLabel->setText(
@@ -3180,6 +3230,16 @@ void OBSBasic::UpdateContextBar(bool force)
 		ui->sourcePropertiesButton->setEnabled(false);
 		ui->sourcePropertiesButton->setEnabled(false);
 		ui->sourceInteractButton->setVisible(false);
 		ui->sourceInteractButton->setVisible(false);
 	}
 	}
+
+	if (contextBarSize == ContextBarSize_Normal) {
+		ui->sourcePropertiesButton->setText(QTStr("Properties"));
+		ui->sourceFiltersButton->setText(QTStr("Filters"));
+		ui->sourceInteractButton->setText(QTStr("Interact"));
+	} else {
+		ui->sourcePropertiesButton->setText("");
+		ui->sourceFiltersButton->setText("");
+		ui->sourceInteractButton->setText("");
+	}
 }
 }
 
 
 static inline bool SourceMixerHidden(obs_source_t *source)
 static inline bool SourceMixerHidden(obs_source_t *source)

+ 8 - 0
UI/window-basic-main.hpp

@@ -195,6 +195,12 @@ class OBSBasic : public OBSMainWindow {
 		DropType_Url,
 		DropType_Url,
 	};
 	};
 
 
+	enum ContextBarSize {
+		ContextBarSize_Minimized,
+		ContextBarSize_Reduced,
+		ContextBarSize_Normal
+	};
+
 private:
 private:
 	obs_frontend_callbacks *api = nullptr;
 	obs_frontend_callbacks *api = nullptr;
 
 
@@ -210,6 +216,7 @@ private:
 	long disableSaving = 1;
 	long disableSaving = 1;
 	bool projectChanged = false;
 	bool projectChanged = false;
 	bool previewEnabled = true;
 	bool previewEnabled = true;
+	ContextBarSize contextBarSize = ContextBarSize_Normal;
 
 
 	std::deque<SourceCopyInfo> clipboard;
 	std::deque<SourceCopyInfo> clipboard;
 	OBSWeakSource copyFiltersSource;
 	OBSWeakSource copyFiltersSource;
@@ -1118,6 +1125,7 @@ public slots:
 	void ClearContextBar();
 	void ClearContextBar();
 	void UpdateContextBar(bool force = false);
 	void UpdateContextBar(bool force = false);
 	void UpdateContextBarDeferred(bool force = false);
 	void UpdateContextBarDeferred(bool force = false);
+	void UpdateContextBarVisibility();
 
 
 public:
 public:
 	explicit OBSBasic(QWidget *parent = 0);
 	explicit OBSBasic(QWidget *parent = 0);