[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