Browse Source

Implement context menu on 'sources' box

jp9000 11 years ago
parent
commit
ff2a2cceb3

+ 5 - 0
build/data/obs-studio/locale/en.txt

@@ -10,6 +10,7 @@ Yes="Yes"
 No="No"
 Add="Add"
 Remove="Remove"
+Rename="Rename"
 Properties="Properties"
 MoveUp="Move Up"
 MoveDown="Move Down"
@@ -26,6 +27,10 @@ NameExists.Text="The name is already in use."
 
 NoNameEntered="Please enter a valid name"
 
+# confirm delete dialog box
+ConfirmRemove.Title="Confirm Remove"
+ConfirmRemove.Text="Are you sure you wish to remove '$1'?"
+
 # output connect messages
 Output.ConnectFail.Title="Failed to connect"
 Output.ConnectFail.BadPath="Invalid Path or Connection URL.  Please check your settings to confirm that they are valid."

+ 8 - 2
obs/forms/OBSBasic.ui

@@ -152,6 +152,9 @@
                  <verstretch>0</verstretch>
                 </sizepolicy>
                </property>
+               <property name="contextMenuPolicy">
+                <enum>Qt::CustomContextMenu</enum>
+               </property>
                <property name="frameShape">
                 <enum>QFrame::NoFrame</enum>
                </property>
@@ -257,6 +260,9 @@
                  <verstretch>0</verstretch>
                 </sizepolicy>
                </property>
+               <property name="contextMenuPolicy">
+                <enum>Qt::CustomContextMenu</enum>
+               </property>
                <property name="frameShape">
                 <enum>QFrame::NoFrame</enum>
                </property>
@@ -467,7 +473,7 @@
     <property name="title">
      <string>Basic.MainMenu.Edit</string>
     </property>
-    <widget class="QMenu" name="menuBasic_MainMenu_Edit_Transform">
+    <widget class="QMenu" name="transformMenu">
      <property name="title">
       <string>Basic.MainMenu.Edit.Transform</string>
      </property>
@@ -488,7 +494,7 @@
     <addaction name="actionUndo"/>
     <addaction name="actionRedo"/>
     <addaction name="separator"/>
-    <addaction name="menuBasic_MainMenu_Edit_Transform"/>
+    <addaction name="transformMenu"/>
    </widget>
    <addaction name="menu_File"/>
    <addaction name="menuBasic_MainMenu_Edit"/>

+ 56 - 2
obs/window-basic-main.cpp

@@ -88,6 +88,12 @@ OBSBasic::OBSBasic(QWidget *parent)
 			this,
 			SLOT(SceneItemNameEdited(QWidget*,
 					QAbstractItemDelegate::EndEditHint)));
+
+	removeItemAction = new QAction(QTStr("Remove"), this);
+	removeItemAction->setShortcut(QKeySequence(Qt::Key_Delete));
+	connect(removeItemAction, SIGNAL(triggered()),
+			this, SLOT(RemoveSelectedItem()));
+	addAction(removeItemAction);
 }
 
 static void SaveAudioDevice(const char *name, int channel, obs_data_t parent)
@@ -786,6 +792,25 @@ void OBSBasic::DeactivateAudioSource(OBSSource source)
 	}
 }
 
+void OBSBasic::RemoveSelectedItem()
+{
+	OBSSceneItem item = GetCurrentSceneItem();
+	if (item) {
+		obs_source_t source = obs_sceneitem_getsource(item);
+		const char   *name  = obs_source_getname(source);
+
+		QString text = QTStr("ConfirmRemove.Text");
+		text.replace("$1", QT_UTF8(name));
+
+		QMessageBox::StandardButton button;
+		button = QMessageBox::question(this,
+				QTStr("ConfirmRemove.Remove"), text);
+
+		if (button == QMessageBox::Yes)
+			obs_sceneitem_remove(item);
+	}
+}
+
 /* OBS Callbacks */
 
 void OBSBasic::SceneItemAdded(void *data, calldata_t params)
@@ -1211,6 +1236,11 @@ void OBSBasic::on_scenes_currentItemChanged(QListWidgetItem *current,
 	UNUSED_PARAMETER(prev);
 }
 
+void OBSBasic::EditSceneName()
+{
+	ui->scenes->editItem(ui->scenes->currentItem());
+}
+
 void OBSBasic::on_scenes_customContextMenuRequested(const QPoint &pos)
 {
 	/* TODO */
@@ -1315,10 +1345,34 @@ void OBSBasic::on_sources_currentItemChanged(QListWidgetItem *current,
 	UNUSED_PARAMETER(prev);
 }
 
+void OBSBasic::EditSceneItemName()
+{
+	ui->sources->editItem(ui->sources->currentItem());
+}
+
 void OBSBasic::on_sources_customContextMenuRequested(const QPoint &pos)
 {
-	/* TODO */
-	UNUSED_PARAMETER(pos);
+	QListWidgetItem *item = ui->sources->itemAt(pos);
+
+	QMenu popup;
+	QPointer<QMenu> addSourceMenu = CreateAddSourcePopupMenu();
+	if (addSourceMenu)
+		popup.addMenu(addSourceMenu);
+
+	if (item) {
+		if (addSourceMenu)
+			popup.addSeparator();
+
+		popup.addAction(QTStr("Rename"), this,
+				SLOT(EditSceneItemName()));
+		popup.addAction(removeItemAction);
+		popup.addMenu(ui->transformMenu);
+		popup.addSeparator();
+		popup.addAction(QTStr("Properties"), this,
+				SLOT(on_actionSourceProperties_triggered()));
+	}
+
+	popup.exec(QCursor::pos());
 }
 
 void OBSBasic::AddSource(const char *id)

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

@@ -19,6 +19,7 @@
 
 #include <QNetworkAccessManager>
 #include <QBuffer>
+#include <QAction>
 #include <obs.hpp>
 #include <unordered_map>
 #include <vector>
@@ -60,6 +61,8 @@ private:
 
 	QNetworkAccessManager networkManager;
 
+	QPointer<QAction> removeItemAction;
+
 	QBuffer       logUploadPostData;
 	QNetworkReply *logUploadReply = nullptr;
 	QByteArray    logUploadReturnData;
@@ -145,6 +148,8 @@ private slots:
 	void ActivateAudioSource(OBSSource source);
 	void DeactivateAudioSource(OBSSource source);
 
+	void RemoveSelectedItem();
+
 private:
 	/* OBS Callbacks */
 	static void SceneItemAdded(void *data, calldata_t params);
@@ -244,6 +249,9 @@ private slots:
 
 	void AddSourceFromAction();
 
+	void EditSceneName();
+	void EditSceneItemName();
+
 	void SceneNameEdited(QWidget *editor,
 			QAbstractItemDelegate::EndEditHint endHint);
 	void SceneItemNameEdited(QWidget *editor,