Browse Source

UI: Add save button next to replay buffer button

Allows the ability to save replays with a button rather than with the
keyboard if desired.

Closes obsproject/obs-studio#1954
jp9000 6 years ago
parent
commit
e2fa510436

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

@@ -517,6 +517,7 @@ Basic.Main.Controls="Controls"
 Basic.Main.Connecting="Connecting..."
 Basic.Main.StartRecording="Start Recording"
 Basic.Main.StartReplayBuffer="Start Replay Buffer"
+Basic.Main.SaveReplay="Save Replay"
 Basic.Main.StartStreaming="Start Streaming"
 Basic.Main.StopRecording="Stop Recording"
 Basic.Main.PauseRecording="Pause Recording"

+ 6 - 0
UI/data/themes/Acri.qss

@@ -1044,3 +1044,9 @@ SceneTree#scenes {
     padding-right: 10px;
     margin: 0px;
 }
+
+/* Save replay icon */
+
+* [themeID="replayIconSmall"] {
+    qproperty-icon: url(./Dark/save.svg);
+}

+ 6 - 0
UI/data/themes/Dark.qss

@@ -809,3 +809,9 @@ SceneTree {
 *[gridMode="true"] SceneTree::item:checked {
     background-color: rgb(122,121,122); /* light */
 }
+
+/* Save icon */
+
+* [themeID="replayIconSmall"] {
+    qproperty-icon: url(./Dark/save.svg);
+}

+ 3 - 0
UI/data/themes/Dark/save.svg

@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="8" height="8" viewBox="0 0 8 8" fill="#d2d2d2">
+  <path d="M3 0v3h-2l3 3 3-3h-2v-3h-2zm-3 7v1h8v-1h-8z" />
+</svg>

+ 6 - 0
UI/data/themes/Rachni.qss

@@ -1372,3 +1372,9 @@ SceneTree#scenes {
     qproperty-gridItemWidth: 150;
     qproperty-gridItemHeight: 30;
 }
+
+/* Save icon */
+
+* [themeID="replayIconSmall"] {
+    qproperty-icon: url(./Dark/save.svg);
+}

+ 6 - 0
UI/data/themes/System.qss

@@ -240,3 +240,9 @@ SceneTree {
     qproperty-gridItemWidth: 150;
 	qproperty-gridItemHeight: 24;
 }
+
+/* Save icon */
+
+* [themeID="replayIconSmall"] {
+    qproperty-icon: url(:res/images/save.svg);
+}

+ 3 - 0
UI/forms/images/save.svg

@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="8" height="8" viewBox="0 0 8 8">
+  <path d="M3 0v3h-2l3 3 3-3h-2v-3h-2zm-3 7v1h8v-1h-8z" />
+</svg>

+ 1 - 0
UI/forms/obs.qrc

@@ -1,5 +1,6 @@
 <RCC>
   <qresource prefix="/res">
+    <file>images/save.svg</file>
     <file>images/media-pause.svg</file>
     <file>images/mute.svg</file>
     <file>images/refresh.svg</file>

+ 17 - 0
UI/record-button.cpp

@@ -17,3 +17,20 @@ void RecordButton::resizeEvent(QResizeEvent *event)
 
 	event->accept();
 }
+
+void ReplayBufferButton::resizeEvent(QResizeEvent *event)
+{
+	OBSBasic *main = OBSBasic::Get();
+	if (!main->replay)
+		return;
+
+	QSize replaySize = main->replay->size();
+	int height = main->ui->recordButton->size().height();
+
+	if (replaySize.height() != height || replaySize.width() != height) {
+		main->replay->setMinimumSize(height, height);
+		main->replay->setMaximumSize(height, height);
+	}
+
+	event->accept();
+}

+ 13 - 0
UI/record-button.hpp

@@ -10,3 +10,16 @@ public:
 
 	virtual void resizeEvent(QResizeEvent *event) override;
 };
+
+class ReplayBufferButton : public QPushButton {
+	Q_OBJECT
+
+public:
+	inline ReplayBufferButton(const QString &text,
+				  QWidget *parent = nullptr)
+		: QPushButton(text, parent)
+	{
+	}
+
+	virtual void resizeEvent(QResizeEvent *event) override;
+};

+ 28 - 2
UI/window-basic-main.cpp

@@ -1501,18 +1501,22 @@ void OBSBasic::ResetOutputs()
 					   : CreateSimpleOutputHandler(this));
 
 		delete replayBufferButton;
+		delete replayLayout;
 
 		if (outputHandler->replayBuffer) {
-			replayBufferButton = new QPushButton(
+			replayBufferButton = new ReplayBufferButton(
 				QTStr("Basic.Main.StartReplayBuffer"), this);
 			replayBufferButton->setCheckable(true);
 			connect(replayBufferButton.data(),
 				&QPushButton::clicked, this,
 				&OBSBasic::ReplayBufferClicked);
 
+			replayLayout = new QHBoxLayout(this);
+			replayLayout->addWidget(replayBufferButton);
+
 			replayBufferButton->setProperty("themeID",
 							"replayBufferButton");
-			ui->buttonsVLayout->insertWidget(2, replayBufferButton);
+			ui->buttonsVLayout->insertLayout(2, replayLayout);
 		}
 
 		if (sysTrayReplayBuffer)
@@ -5664,6 +5668,7 @@ void OBSBasic::ReplayBufferStart()
 		api->on_event(OBS_FRONTEND_EVENT_REPLAY_BUFFER_STARTED);
 
 	OnActivate();
+	UpdateReplayBuffer();
 
 	blog(LOG_INFO, REPLAY_BUFFER_START);
 }
@@ -5725,6 +5730,7 @@ void OBSBasic::ReplayBufferStop(int code)
 		api->on_event(OBS_FRONTEND_EVENT_REPLAY_BUFFER_STOPPED);
 
 	OnDeactivate();
+	UpdateReplayBuffer(false);
 }
 
 void OBSBasic::on_streamButton_clicked()
@@ -7602,6 +7608,26 @@ void OBSBasic::UpdatePause(bool activate)
 	}
 }
 
+void OBSBasic::UpdateReplayBuffer(bool activate)
+{
+	if (!activate || !outputHandler ||
+	    !outputHandler->ReplayBufferActive()) {
+		replay.reset();
+		return;
+	}
+
+	replay.reset(new QPushButton());
+	replay->setAccessibleName(QTStr("Basic.Main.SaveReplay"));
+	replay->setToolTip(QTStr("Basic.Main.SaveReplay"));
+	replay->setCheckable(true);
+	replay->setChecked(false);
+	replay->setProperty("themeID",
+			    QVariant(QStringLiteral("replayIconSmall")));
+	connect(replay.data(), &QAbstractButton::clicked, this,
+		&OBSBasic::ReplayBufferSave);
+	replayLayout->addWidget(replay.data());
+}
+
 #define MBYTE (1024ULL * 1024ULL)
 #define MBYTES_LEFT_STOP_REC 50ULL
 #define MAX_BYTES_LEFT (MBYTES_LEFT_STOP_REC * MBYTE)

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

@@ -157,6 +157,7 @@ class OBSBasic : public OBSMainWindow {
 	friend class AutoConfig;
 	friend class AutoConfigStreamPage;
 	friend class RecordButton;
+	friend class ReplayBufferButton;
 	friend class ExtraBrowsersModel;
 	friend class ExtraBrowsersDelegate;
 	friend struct OBSStudioAPI;
@@ -241,7 +242,9 @@ private:
 
 	QPointer<QPushButton> transitionButton;
 	QPointer<QPushButton> replayBufferButton;
+	QPointer<QHBoxLayout> replayLayout;
 	QScopedPointer<QPushButton> pause;
+	QScopedPointer<QPushButton> replay;
 
 	QScopedPointer<QSystemTrayIcon> trayIcon;
 	QPointer<QAction> sysTrayStream;
@@ -669,6 +672,7 @@ private:
 	void AutoRemux();
 
 	void UpdatePause(bool activate = true);
+	void UpdateReplayBuffer(bool activate = true);
 
 	bool LowDiskSpace();
 	void DiskSpaceMessage();