[libcamera-devel] [PATCH 06/21] qcam: main_window: Replace start and stop actions with a toggle action

Laurent Pinchart laurent.pinchart at ideasonboard.com
Mon Mar 23 15:21:50 CET 2020


The main window toolbar contains a start button and a stop button. This
allows starting an already started camera (which is currently not
handled and results in an error) or stopping an already stopped camera.
Replace the two actions with a single start/stop toggle action,
preventing UI misuse and reducing confusion.

Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
---
 src/qcam/main_window.cpp | 30 ++++++++++++++++++++----------
 src/qcam/main_window.h   |  9 ++++++---
 2 files changed, 26 insertions(+), 13 deletions(-)

diff --git a/src/qcam/main_window.cpp b/src/qcam/main_window.cpp
index afd8b9c413f5..86f92360a1a9 100644
--- a/src/qcam/main_window.cpp
+++ b/src/qcam/main_window.cpp
@@ -63,11 +63,10 @@ MainWindow::MainWindow(CameraManager *cm, const OptionsParser::Options &options)
 	adjustSize();
 
 	ret = openCamera();
-	if (!ret)
-		ret = startCapture();
-
 	if (ret < 0)
 		quit();
+
+	startStopAction_->setChecked(true);
 }
 
 MainWindow::~MainWindow()
@@ -113,11 +112,10 @@ int MainWindow::createToolbars()
 
 	toolbar_->addSeparator();
 
-	action = toolbar_->addAction(QIcon(":play-circle.svg"), "start");
-	connect(action, &QAction::triggered, this, &MainWindow::startCapture);
-
-	action = toolbar_->addAction(QIcon(":stop-circle.svg"), "stop");
-	connect(action, &QAction::triggered, this, &MainWindow::stopCapture);
+	action = toolbar_->addAction(QIcon(":play-circle.svg"), "Start Capture");
+	action->setCheckable(true);
+	connect(action, &QAction::toggled, this, &MainWindow::toggleCapture);
+	startStopAction_ = action;
 
 	action = toolbar_->addAction(QIcon(":save.svg"), "saveAs");
 	connect(action, &QAction::triggered, this, &MainWindow::saveImageAs);
@@ -159,12 +157,12 @@ void MainWindow::switchCamera(int index)
 
 	std::cout << "Switching to camera " << cam->name() << std::endl;
 
-	stopCapture();
+	startStopAction_->setChecked(false);
 
 	camera_->release();
 	camera_ = cam;
 
-	startCapture();
+	startStopAction_->setChecked(true);
 }
 
 std::string MainWindow::chooseCamera()
@@ -217,6 +215,17 @@ int MainWindow::openCamera()
 	return 0;
 }
 
+void MainWindow::toggleCapture(bool start)
+{
+	if (start) {
+		startCapture();
+		startStopAction_->setText("Stop Capture");
+	} else {
+		stopCapture();
+		startStopAction_->setText("Start Capture");
+	}
+}
+
 int MainWindow::startCapture()
 {
 	int ret;
@@ -322,6 +331,7 @@ int MainWindow::startCapture()
 	}
 
 	isCapturing_ = true;
+
 	return 0;
 
 error_disconnect:
diff --git a/src/qcam/main_window.h b/src/qcam/main_window.h
index c623120d5894..3d8d02b44696 100644
--- a/src/qcam/main_window.h
+++ b/src/qcam/main_window.h
@@ -26,6 +26,7 @@
 
 using namespace libcamera;
 
+class QAction;
 class ViewFinder;
 
 enum {
@@ -49,9 +50,7 @@ private Q_SLOTS:
 	void updateTitle();
 
 	void switchCamera(int index);
-
-	int startCapture();
-	void stopCapture();
+	void toggleCapture(bool start);
 
 	void saveImageAs();
 
@@ -60,6 +59,9 @@ private:
 	std::string chooseCamera();
 	int openCamera();
 
+	int startCapture();
+	void stopCapture();
+
 	void requestComplete(Request *request);
 	void processCapture();
 	int display(FrameBuffer *buffer);
@@ -87,6 +89,7 @@ private:
 	QQueue<FrameBuffer *> doneQueue_;
 
 	QToolBar *toolbar_;
+	QAction *startStopAction_;
 	ViewFinder *viewfinder_;
 	std::map<int, std::pair<void *, unsigned int>> mappedBuffers_;
 };
-- 
Regards,

Laurent Pinchart



More information about the libcamera-devel mailing list