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

UI: Add modular UI

Changes the UI to an adjustable user interface, allowing the user to
fully customize how the scenes list, sources list, the mixer,
transitions, and the buttons are oriented on the main window window.
jp9000 8 лет назад
Родитель
Сommit
25bb8a444f
4 измененных файлов с 871 добавлено и 333 удалено
  1. 4 0
      UI/data/locale/en-US.ini
  2. 761 306
      UI/forms/OBSBasic.ui
  3. 101 26
      UI/window-basic-main.cpp
  4. 5 1
      UI/window-basic-main.hpp

+ 4 - 0
UI/data/locale/en-US.ini

@@ -429,6 +429,7 @@ Basic.Main.AddSourceHelp.Text="You need to have at least 1 scene to add a source
 # basic mode main window
 Basic.Main.Scenes="Scenes"
 Basic.Main.Sources="Sources"
+Basic.Main.Controls="Controls"
 Basic.Main.Connecting="Connecting..."
 Basic.Main.StartRecording="Start Recording"
 Basic.Main.StartReplayBuffer="Start Replay Buffer"
@@ -487,6 +488,9 @@ Basic.MainMenu.Edit.AdvAudio="&Advanced Audio Properties"
 # basic mode view menu
 Basic.MainMenu.View="&View"
 Basic.MainMenu.View.Toolbars="&Toolbars"
+Basic.MainMenu.View.Docks="Docks"
+Basic.MainMenu.View.Docks.ResetUI="Reset UI"
+Basic.MainMenu.View.Docks.LockUI="Lock UI"
 Basic.MainMenu.View.Toolbars.Listboxes="&Listboxes"
 Basic.MainMenu.View.SceneTransitions="S&cene Transitions"
 Basic.MainMenu.View.StatusBar="&Status Bar"

Разница между файлами не показана из-за своего большого размера
+ 761 - 306
UI/forms/OBSBasic.ui


+ 101 - 26
UI/window-basic-main.cpp

@@ -145,6 +145,8 @@ OBSBasic::OBSBasic(QWidget *parent)
 	ui->setupUi(this);
 	ui->previewDisabledLabel->setVisible(false);
 
+	startingDockLayout = saveState();
+
 	copyActionsDynamicProperties();
 
 	ui->sources->setItemDelegate(new VisibilityItemDelegate(ui->sources));
@@ -257,6 +259,33 @@ OBSBasic::OBSBasic(QWidget *parent)
 	addNudge(Qt::Key_Down, SLOT(NudgeDown()));
 	addNudge(Qt::Key_Left, SLOT(NudgeLeft()));
 	addNudge(Qt::Key_Right, SLOT(NudgeRight()));
+
+	auto assignDockToggle = [this](QDockWidget *dock, QAction *action)
+	{
+		auto handleWindowToggle = [action] (bool vis)
+		{
+			action->blockSignals(true);
+			action->setChecked(vis);
+			action->blockSignals(false);
+		};
+		auto handleMenuToggle = [dock] (bool check)
+		{
+			dock->blockSignals(true);
+			dock->setVisible(check);
+			dock->blockSignals(false);
+		};
+
+		dock->connect(dock->toggleViewAction(), &QAction::toggled,
+				handleWindowToggle);
+		dock->connect(action, &QAction::toggled,
+				handleMenuToggle);
+	};
+
+	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);
 }
 
 static void SaveAudioDevice(const char *name, int channel, obs_data_t *parent,
@@ -1355,7 +1384,6 @@ void OBSBasic::OBSInit()
 		} \
 	} while (false)
 
-	SET_VISIBILITY("ShowTransitions", toggleSceneTransitions);
 	SET_VISIBILITY("ShowListboxToolbars", toggleListboxToolbars);
 	SET_VISIBILITY("ShowStatusBar", toggleStatusBar);
 #undef SET_VISIBILITY
@@ -1419,24 +1447,26 @@ void OBSBasic::OBSInit()
 	show();
 #endif
 
-	QList<int> defSizes;
-
-	int top = config_get_int(App()->GlobalConfig(), "BasicWindow",
-			"splitterTop");
-	int bottom = config_get_int(App()->GlobalConfig(), "BasicWindow",
-			"splitterBottom");
-
-	if (!top || !bottom) {
-		defSizes = ui->mainSplitter->sizes();
-		int total = defSizes[0] + defSizes[1];
-		defSizes[0] = total * 75 / 100;
-		defSizes[1] = total - defSizes[0];
+	const char *dockStateStr = config_get_string(App()->GlobalConfig(),
+			"BasicWindow", "DockState");
+	if (!dockStateStr) {
+		on_resetUI_triggered();
 	} else {
-		defSizes.push_back(top);
-		defSizes.push_back(bottom);
+		QByteArray dockState =
+			QByteArray::fromBase64(QByteArray(dockStateStr));
+		if (!restoreState(dockState))
+			on_resetUI_triggered();
 	}
 
-	ui->mainSplitter->setSizes(defSizes);
+	config_set_default_bool(App()->GlobalConfig(), "BasicWindow",
+			"DocksLocked", true);
+
+	bool docksLocked = config_get_bool(App()->GlobalConfig(),
+			"BasicWindow", "DocksLocked");
+	on_lockUI_toggled(docksLocked);
+	ui->lockUI->blockSignals(true);
+	ui->lockUI->setChecked(docksLocked);
+	ui->lockUI->blockSignals(false);
 
 	SystemTray(true);
 
@@ -1758,13 +1788,8 @@ OBSBasic::~OBSBasic()
 	config_set_int(App()->GlobalConfig(), "General", "LastVersion",
 			LIBOBS_API_VER);
 
-	QList<int> splitterSizes = ui->mainSplitter->sizes();
 	bool alwaysOnTop = IsAlwaysOnTop(this);
 
-	config_set_int(App()->GlobalConfig(), "BasicWindow", "splitterTop",
-			splitterSizes[0]);
-	config_set_int(App()->GlobalConfig(), "BasicWindow", "splitterBottom",
-			splitterSizes[1]);
 	config_set_bool(App()->GlobalConfig(), "BasicWindow", "PreviewEnabled",
 			previewEnabled);
 	config_set_bool(App()->GlobalConfig(), "BasicWindow", "AlwaysOnTop",
@@ -1777,6 +1802,8 @@ OBSBasic::~OBSBasic()
 			"EditPropertiesMode", editPropertiesMode);
 	config_set_bool(App()->GlobalConfig(), "BasicWindow",
 			"PreviewProgramMode", IsPreviewProgramMode());
+	config_set_bool(App()->GlobalConfig(), "BasicWindow",
+			"DocksLocked", ui->lockUI->isChecked());
 	config_save_safe(App()->GlobalConfig(), "tmp", nullptr);
 
 #ifdef _WIN32
@@ -2981,6 +3008,10 @@ void OBSBasic::closeEvent(QCloseEvent *event)
 				"BasicWindow", "geometry",
 				saveGeometry().toBase64().constData());
 
+	config_set_string(App()->GlobalConfig(),
+			"BasicWindow", "DockState",
+			saveState().toBase64().constData());
+
 	if (outputHandler && outputHandler->Active()) {
 		SetShowing(true);
 
@@ -5253,13 +5284,57 @@ int OBSBasic::GetProfilePath(char *path, size_t size, const char *file) const
 	return snprintf(path, size, "%s/%s/%s", profiles_path, profile, file);
 }
 
-void OBSBasic::on_toggleSceneTransitions_toggled(bool visible)
+void OBSBasic::on_resetUI_triggered()
 {
-	ui->sceneTransitionsLabel->setVisible(visible);
-	ui->transitionsContainer->setVisible(visible);
+	restoreState(startingDockLayout);
 
-	config_set_bool(App()->GlobalConfig(), "BasicWindow",
-			"ShowTransitions", visible);
+	int cx = width();
+	int cy = height();
+
+	int cx22_5 = cx * 225 / 1000;
+	int cx5 = cx * 5 / 100;
+
+	cy = cy * 225 / 1000;
+
+	int mixerSize = cx - (cx22_5 * 2 + cx5 * 2);
+
+	QList<QDockWidget*> docks {
+		ui->scenesDock,
+		ui->sourcesDock,
+		ui->mixerDock,
+		ui->transitionsDock,
+		ui->controlsDock
+	};
+
+	QList<int> sizes {
+		cx22_5,
+		cx22_5,
+		mixerSize,
+		cx5,
+		cx5
+	};
+
+	ui->scenesDock->setVisible(true);
+	ui->sourcesDock->setVisible(true);
+	ui->mixerDock->setVisible(true);
+	ui->transitionsDock->setVisible(true);
+	ui->controlsDock->setVisible(true);
+
+	resizeDocks(docks, {cy, cy, cy, cy, cy}, Qt::Vertical);
+	resizeDocks(docks, sizes, Qt::Horizontal);
+}
+
+void OBSBasic::on_lockUI_toggled(bool lock)
+{
+	QDockWidget::DockWidgetFeatures features = lock
+		? QDockWidget::NoDockWidgetFeatures
+		: QDockWidget::AllDockWidgetFeatures;
+
+	ui->scenesDock->setFeatures(features);
+	ui->sourcesDock->setFeatures(features);
+	ui->mixerDock->setFeatures(features);
+	ui->transitionsDock->setFeatures(features);
+	ui->controlsDock->setFeatures(features);
 }
 
 void OBSBasic::on_toggleListboxToolbars_toggled(bool visible)

+ 5 - 1
UI/window-basic-main.hpp

@@ -348,6 +348,8 @@ private:
 
 	QList<QPoint> visDlgPositions;
 
+	QByteArray startingDockLayout;
+
 	obs_data_array_t *SaveProjectors();
 	void LoadSavedProjectors(obs_data_array_t *savedProjectors);
 
@@ -615,7 +617,6 @@ private slots:
 
 	void on_actionAlwaysOnTop_triggered();
 
-	void on_toggleSceneTransitions_toggled(bool visible);
 	void on_toggleListboxToolbars_toggled(bool visible);
 	void on_toggleStatusBar_toggled(bool visible);
 
@@ -629,6 +630,9 @@ private slots:
 	void on_autoConfigure_triggered();
 	void on_stats_triggered();
 
+	void on_resetUI_triggered();
+	void on_lockUI_toggled(bool lock);
+
 	void logUploadFinished(const QString &text, const QString &error);
 
 	void updateCheckFinished();

Некоторые файлы не были показаны из-за большого количества измененных файлов