瀏覽代碼

UI: Use 'reorder' signal for scene item reordering

The old signals for for reordering have been removed; the new signal to
use is the 'reorder' signal, which means that the list needs to be
refreshed.
jp9000 10 年之前
父節點
當前提交
f4704cf4a8
共有 2 個文件被更改,包括 74 次插入50 次删除
  1. 69 45
      obs/window-basic-main.cpp
  2. 5 5
      obs/window-basic-main.hpp

+ 69 - 45
obs/window-basic-main.cpp

@@ -1,6 +1,7 @@
 /******************************************************************************
-    Copyright (C) 2013-2014 by Hugh Bailey <[email protected]>
+    Copyright (C) 2013-2015 by Hugh Bailey <[email protected]>
                                Zachary Lund <[email protected]>
+                               Philippe Groarke <[email protected]>
 
     This program is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
@@ -761,14 +762,8 @@ void OBSBasic::AddScene(OBSSource source)
 			OBSBasic::SceneItemSelected, this);
 	signal_handler_connect(handler, "item_deselect",
 			OBSBasic::SceneItemDeselected, this);
-	signal_handler_connect(handler, "item_move_up",
-			OBSBasic::SceneItemMoveUp, this);
-	signal_handler_connect(handler, "item_move_down",
-			OBSBasic::SceneItemMoveDown, this);
-	signal_handler_connect(handler, "item_move_top",
-			OBSBasic::SceneItemMoveTop, this);
-	signal_handler_connect(handler, "item_move_bottom",
-			OBSBasic::SceneItemMoveBottom, this);
+	signal_handler_connect(handler, "reorder",
+			OBSBasic::SceneReordered, this);
 }
 
 void OBSBasic::RemoveScene(OBSSource source)
@@ -1100,8 +1095,73 @@ void OBSBasic::RemoveSelectedSceneItem()
 	}
 }
 
+struct ReorderInfo {
+	int idx = 0;
+	OBSBasic *window;
+
+	inline ReorderInfo(OBSBasic *window_) : window(window_) {}
+};
+
+void OBSBasic::ReorderSceneItem(obs_sceneitem_t *item, size_t idx)
+{
+	int count = ui->sources->count();
+	int idx_inv = count - (int)idx - 1;
+
+	for (int i = 0; i < count; i++) {
+		QListWidgetItem *listItem = ui->sources->item(i);
+		QVariant v = listItem->data(Qt::UserRole);
+		OBSSceneItem sceneItem = v.value<OBSSceneItem>();
+
+		if (sceneItem == item) {
+			if ((int)idx_inv != i) {
+				bool sel = (ui->sources->currentRow() == i);
+
+				listItem = ui->sources->takeItem(i);
+				if (listItem)  {
+					ui->sources->insertItem(idx_inv,
+							listItem);
+					if (sel)
+						ui->sources->setCurrentRow(
+								idx_inv);
+				}
+			}
+
+			break;
+		}
+	}
+}
+
+void OBSBasic::ReorderSources(OBSScene scene)
+{
+	ReorderInfo info(this);
+
+	if (scene != GetCurrentScene())
+		return;
+
+	obs_scene_enum_items(scene,
+			[] (obs_scene_t*, obs_sceneitem_t *item, void *p)
+			{
+				ReorderInfo *info =
+					reinterpret_cast<ReorderInfo*>(p);
+
+				info->window->ReorderSceneItem(item,
+					info->idx++);
+				return true;
+			}, &info);
+}
+
 /* OBS Callbacks */
 
+void OBSBasic::SceneReordered(void *data, calldata_t *params)
+{
+	OBSBasic *window = static_cast<OBSBasic*>(data);
+
+	obs_scene_t *scene = (obs_scene_t*)calldata_ptr(params, "scene");
+
+	QMetaObject::invokeMethod(window, "ReorderSources",
+			Q_ARG(OBSScene, OBSScene(scene)));
+}
+
 void OBSBasic::SceneItemAdded(void *data, calldata_t *params)
 {
 	OBSBasic *window = static_cast<OBSBasic*>(data);
@@ -1287,42 +1347,6 @@ void OBSBasic::RenderMain(void *data, uint32_t cx, uint32_t cy)
 	UNUSED_PARAMETER(cy);
 }
 
-void OBSBasic::SceneItemMoveUp(void *data, calldata_t *params)
-{
-	OBSSceneItem item = (obs_sceneitem_t*)calldata_ptr(params, "item");
-	QMetaObject::invokeMethod(static_cast<OBSBasic*>(data),
-			"MoveSceneItem",
-			Q_ARG(OBSSceneItem, OBSSceneItem(item)),
-			Q_ARG(obs_order_movement, OBS_ORDER_MOVE_UP));
-}
-
-void OBSBasic::SceneItemMoveDown(void *data, calldata_t *params)
-{
-	OBSSceneItem item = (obs_sceneitem_t*)calldata_ptr(params, "item");
-	QMetaObject::invokeMethod(static_cast<OBSBasic*>(data),
-			"MoveSceneItem",
-			Q_ARG(OBSSceneItem, OBSSceneItem(item)),
-			Q_ARG(obs_order_movement, OBS_ORDER_MOVE_DOWN));
-}
-
-void OBSBasic::SceneItemMoveTop(void *data, calldata_t *params)
-{
-	OBSSceneItem item = (obs_sceneitem_t*)calldata_ptr(params, "item");
-	QMetaObject::invokeMethod(static_cast<OBSBasic*>(data),
-			"MoveSceneItem",
-			Q_ARG(OBSSceneItem, OBSSceneItem(item)),
-			Q_ARG(obs_order_movement, OBS_ORDER_MOVE_TOP));
-}
-
-void OBSBasic::SceneItemMoveBottom(void *data, calldata_t *params)
-{
-	OBSSceneItem item = (obs_sceneitem_t*)calldata_ptr(params, "item");
-	QMetaObject::invokeMethod(static_cast<OBSBasic*>(data),
-			"MoveSceneItem",
-			Q_ARG(OBSSceneItem, OBSSceneItem(item)),
-			Q_ARG(obs_order_movement, OBS_ORDER_MOVE_BOTTOM));
-}
-
 /* Main class functions */
 
 obs_service_t *OBSBasic::GetService()

+ 5 - 5
obs/window-basic-main.hpp

@@ -158,8 +158,11 @@ private slots:
 	void RemoveSelectedScene();
 	void RemoveSelectedSceneItem();
 
+	void ReorderSources(OBSScene scene);
+
 private:
 	/* OBS Callbacks */
+	static void SceneReordered(void *data, calldata_t *params);
 	static void SceneItemAdded(void *data, calldata_t *params);
 	static void SceneItemRemoved(void *data, calldata_t *params);
 	static void SceneItemSelected(void *data, calldata_t *params);
@@ -172,11 +175,6 @@ private:
 	static void ChannelChanged(void *data, calldata_t *params);
 	static void RenderMain(void *data, uint32_t cx, uint32_t cy);
 
-	static void SceneItemMoveUp(void *data, calldata_t *params);
-	static void SceneItemMoveDown(void *data, calldata_t *params);
-	static void SceneItemMoveTop(void *data, calldata_t *params);
-	static void SceneItemMoveBottom(void *data, calldata_t *params);
-
 	void ResizePreview(uint32_t cx, uint32_t cy);
 
 	void AddSource(const char *id);
@@ -219,6 +217,8 @@ public:
 	void SaveService();
 	bool LoadService();
 
+	void ReorderSceneItem(obs_sceneitem_t *item, size_t idx);
+
 protected:
 	virtual void closeEvent(QCloseEvent *event) override;
 	virtual void changeEvent(QEvent *event) override;