[libcamera-devel] [PATCH 06/21] qcam: main_window: Replace start and stop actions with a toggle action
Kieran Bingham
kieran.bingham at ideasonboard.com
Mon Mar 23 16:03:51 CET 2020
Hi Laurent,
On 23/03/2020 14:21, Laurent Pinchart wrote:
> 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.
Oh - I was actually using this as a test already :-) - I have used it to
start a running stream, and stop a stopped stream.
It even found a bug in a pipeline already - but perhaps that just
highlights that we need a pipeline validation tool already, so it's not
particularly a requirement of the GUI interface.
>
Otherwise a question below - but:
Reviewed-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
> 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");
Shouldn't this update the icon to reflect the change in state somehow?
> + }
> +}
> +
> 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
--
Kieran
More information about the libcamera-devel
mailing list