Просмотр исходного кода

UI: Refactor main docks toggle action

Use the QAction provided by QDockWidget with new Qt connection rather
than creating a new one for each dock.
tytan652 3 лет назад
Родитель
Сommit
63e3e0acd0
2 измененных файлов с 44 добавлено и 88 удалено
  1. 0 72
      UI/forms/OBSBasic.ui
  2. 44 16
      UI/window-basic-main.cpp

+ 0 - 72
UI/forms/OBSBasic.ui

@@ -713,12 +713,6 @@
     <addaction name="lockDocks"/>
     <addaction name="resetDocks"/>
     <addaction name="separator"/>
-    <addaction name="toggleScenes"/>
-    <addaction name="toggleSources"/>
-    <addaction name="toggleMixer"/>
-    <addaction name="toggleTransitions"/>
-    <addaction name="toggleControls"/>
-    <addaction name="toggleStats"/>
    </widget>
    <addaction name="menu_File"/>
    <addaction name="menuBasic_MainMenu_Edit"/>
@@ -2187,61 +2181,6 @@
     <string>Basic.MainMenu.Docks.LockDocks</string>
    </property>
   </action>
-  <action name="toggleScenes">
-   <property name="checkable">
-    <bool>true</bool>
-   </property>
-   <property name="checked">
-    <bool>true</bool>
-   </property>
-   <property name="text">
-    <string>Basic.Main.Scenes</string>
-   </property>
-  </action>
-  <action name="toggleSources">
-   <property name="checkable">
-    <bool>true</bool>
-   </property>
-   <property name="checked">
-    <bool>true</bool>
-   </property>
-   <property name="text">
-    <string>Basic.Main.Sources</string>
-   </property>
-  </action>
-  <action name="toggleMixer">
-   <property name="checkable">
-    <bool>true</bool>
-   </property>
-   <property name="checked">
-    <bool>true</bool>
-   </property>
-   <property name="text">
-    <string>Mixer</string>
-   </property>
-  </action>
-  <action name="toggleTransitions">
-   <property name="checkable">
-    <bool>true</bool>
-   </property>
-   <property name="checked">
-    <bool>true</bool>
-   </property>
-   <property name="text">
-    <string>Basic.SceneTransitions</string>
-   </property>
-  </action>
-  <action name="toggleControls">
-   <property name="checkable">
-    <bool>true</bool>
-   </property>
-   <property name="checked">
-    <bool>true</bool>
-   </property>
-   <property name="text">
-    <string>Basic.Main.Controls</string>
-   </property>
-  </action>
   <action name="actionHelpPortal">
    <property name="text">
     <string>Basic.MainMenu.Help.HelpPortal</string>
@@ -2262,17 +2201,6 @@
     <string>Basic.MainMenu.Help.Discord</string>
    </property>
   </action>
-  <action name="toggleStats">
-   <property name="checkable">
-    <bool>true</bool>
-   </property>
-   <property name="checked">
-    <bool>true</bool>
-   </property>
-   <property name="text">
-    <string>Basic.Stats</string>
-   </property>
-  </action>
   <action name="actionShowAbout">
    <property name="text">
     <string>Basic.MainMenu.Help.About</string>

+ 44 - 16
UI/window-basic-main.cpp

@@ -251,6 +251,32 @@ void assignDockToggle(QDockWidget *dock, QAction *action)
 	dock->connect(action, &QAction::toggled, handleMenuToggle);
 }
 
+void setupDockAction(QDockWidget *dock)
+{
+	QAction *action = dock->toggleViewAction();
+
+	auto neverDisable = [action]() {
+		QSignalBlocker block(action);
+		action->setEnabled(true);
+	};
+
+	auto newToggleView = [dock](bool check) {
+		QSignalBlocker block(dock);
+		dock->setVisible(check);
+	};
+
+	// Replace the slot connected by default
+	action->disconnect(SIGNAL(triggered(bool)));
+	dock->connect(action, &QAction::triggered, newToggleView);
+
+	// Make the action unable to be disabled
+#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
+	action->connect(action, &QAction::changed, neverDisable);
+#else
+	action->connect(action, &QAction::enabledChanged, neverDisable);
+#endif
+}
+
 extern void RegisterTwitchAuth();
 extern void RegisterRestreamAuth();
 #if YOUTUBE_ENABLED
@@ -423,12 +449,20 @@ OBSBasic::OBSBasic(QWidget *parent)
 	addNudge(Qt::SHIFT | Qt::Key_Left, MoveDir::Left, 10);
 	addNudge(Qt::SHIFT | Qt::Key_Right, MoveDir::Right, 10);
 
-	assignDockToggle(ui->scenesDock, ui->toggleScenes);
-	assignDockToggle(ui->sourcesDock, ui->toggleSources);
-	assignDockToggle(ui->mixerDock, ui->toggleMixer);
-	assignDockToggle(ui->transitionsDock, ui->toggleTransitions);
-	assignDockToggle(ui->controlsDock, ui->toggleControls);
-	assignDockToggle(statsDock, ui->toggleStats);
+	/* Setup dock toggle action
+	 * And hide all docks before restoring parent geometry */
+#define SETUP_DOCK(dock)                                    \
+	setupDockAction(dock);                              \
+	ui->menuDocks->addAction(dock->toggleViewAction()); \
+	dock->setVisible(false);
+
+	SETUP_DOCK(ui->scenesDock);
+	SETUP_DOCK(ui->sourcesDock);
+	SETUP_DOCK(ui->mixerDock);
+	SETUP_DOCK(ui->transitionsDock);
+	SETUP_DOCK(ui->controlsDock);
+	SETUP_DOCK(statsDock);
+#undef SETUP_DOCK
 
 	// Register shortcuts for Undo/Redo
 	ui->actionMainUndo->setShortcut(Qt::CTRL | Qt::Key_Z);
@@ -440,14 +474,6 @@ OBSBasic::OBSBasic(QWidget *parent)
 	ui->actionMainUndo->setShortcutContext(Qt::ApplicationShortcut);
 	ui->actionMainRedo->setShortcutContext(Qt::ApplicationShortcut);
 
-	//hide all docking panes
-	ui->toggleScenes->setChecked(false);
-	ui->toggleSources->setChecked(false);
-	ui->toggleMixer->setChecked(false);
-	ui->toggleTransitions->setChecked(false);
-	ui->toggleControls->setChecked(false);
-	ui->toggleStats->setChecked(false);
-
 	QPoint curPos;
 
 	//restore parent window geometry
@@ -2015,10 +2041,12 @@ void OBSBasic::OBSInit()
 		QAction *action = new QAction(QTStr("Basic.MainMenu.Docks."
 						    "CustomBrowserDocks"),
 					      this);
-		ui->menuDocks->insertAction(ui->toggleScenes, action);
+		ui->menuDocks->insertAction(ui->scenesDock->toggleViewAction(),
+					    action);
 		connect(action, &QAction::triggered, this,
 			&OBSBasic::ManageExtraBrowserDocks);
-		ui->menuDocks->insertSeparator(ui->toggleScenes);
+		ui->menuDocks->insertSeparator(
+			ui->scenesDock->toggleViewAction());
 
 		LoadExtraBrowserDocks();
 	}