Forráskód Böngészése

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 4 éve
szülő
commit
f2fda20572
3 módosított fájl, 136 hozzáadás és 68 törlés
  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 name="minimumSize">
        <size>
-        <width>740</width>
+        <width>0</width>
         <height>30</height>
        </size>
       </property>

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

@@ -301,6 +301,8 @@ OBSBasic::OBSBasic(QWidget *parent)
 
 		if (obs_get_video_info(&ovi))
 			ResizePreview(ovi.base_width, ovi.base_height);
+
+		UpdateContextBarVisibility();
 	};
 
 	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)
 {
 	if (strcmp(id, "ffmpeg_source") != 0)
@@ -3072,82 +3094,109 @@ void OBSBasic::UpdateContextBar(bool force)
 
 	OBSSceneItem item = GetCurrentSceneItem();
 
-	ClearContextBar();
-
 	if (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);
 		uint32_t flags = obs_source_get_output_flags(source);
 
 		ui->sourceInteractButton->setVisible(flags &
 						     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;
@@ -3171,6 +3220,7 @@ void OBSBasic::UpdateContextBar(bool force)
 		ui->sourcePropertiesButton->setEnabled(
 			obs_source_configurable(source));
 	} else {
+		ClearContextBar();
 		ui->contextSourceIcon->hide();
 		ui->contextSourceIconSpacer->show();
 		ui->contextSourceLabel->setText(
@@ -3180,6 +3230,16 @@ void OBSBasic::UpdateContextBar(bool force)
 		ui->sourcePropertiesButton->setEnabled(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)

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

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