[libcamera-devel] [PATCH v2 4/7] qcam: Introduce a toolbar and camera switching

Laurent Pinchart laurent.pinchart at ideasonboard.com
Fri Feb 14 01:27:16 CET 2020


Hi Kieran,

Thank you for the patch.

On Fri, Feb 14, 2020 at 12:18:07AM +0000, Kieran Bingham wrote:
> Implement a quit button, and a list of cameras.
> 
> Selecting a different camera from the Toolbar will stop the current
> stream, and start streaming the chosen camera device if it can be
> acquired.
> 
> Signed-off-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
> 
> ---
> v2:
> 
>  - Add name to toolbar
>  - Rename setCamera to switchCamera
>  - Disable right click context menu on toolbar.
>  - Utilise a combo box for camera selections
>  - Squash in "qcam: Expose quit method for MainWindow"
> 
>  src/qcam/main_window.cpp | 64 ++++++++++++++++++++++++++++++++++++++--
>  src/qcam/main_window.h   |  5 ++++
>  2 files changed, 67 insertions(+), 2 deletions(-)
> 
> diff --git a/src/qcam/main_window.cpp b/src/qcam/main_window.cpp
> index 2ed84cacf655..0e9e717b7e1a 100644
> --- a/src/qcam/main_window.cpp
> +++ b/src/qcam/main_window.cpp
> @@ -10,9 +10,12 @@
>  #include <string>
>  #include <sys/mman.h>
>  
> +#include <QComboBox>
>  #include <QCoreApplication>
>  #include <QInputDialog>
>  #include <QTimer>
> +#include <QToolBar>
> +#include <QToolButton>
>  
>  #include <libcamera/camera_manager.h>
>  #include <libcamera/version.h>
> @@ -27,6 +30,8 @@ MainWindow::MainWindow(CameraManager *cm, const OptionsParser::Options &options)
>  {
>  	int ret;
>  
> +	createToolbars();
> +
>  	title_ = "QCam " + QString::fromStdString(CameraManager::version());
>  	setWindowTitle(title_);
>  	connect(&titleTimer_, SIGNAL(timeout()), this, SLOT(updateTitle()));
> @@ -40,8 +45,7 @@ MainWindow::MainWindow(CameraManager *cm, const OptionsParser::Options &options)
>  		ret = startCapture();
>  
>  	if (ret < 0)
> -		QTimer::singleShot(0, QCoreApplication::instance(),
> -				   &QCoreApplication::quit);
> +		quit();
>  }
>  
>  MainWindow::~MainWindow()
> @@ -53,6 +57,39 @@ MainWindow::~MainWindow()
>  	}
>  }
>  
> +int MainWindow::createToolbars()
> +{
> +	QAction *action;
> +
> +	toolbar_ = addToolBar("Main");
> +
> +	/* Disable right click context menu */

I know we need to update checkstyle.py for this...

> +	toolbar_->setContextMenuPolicy(Qt::PreventContextMenu);
> +
> +	action = toolbar_->addAction("Quit");
> +	connect(action, &QAction::triggered, this, &MainWindow::quit);
> +
> +	/* Camera selection */

And here too.

Reviewed-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>

> +	QComboBox *cameraCombo = new QComboBox();
> +	connect(cameraCombo, QOverload<int>::of(&QComboBox::activated),
> +		this, &MainWindow::switchCamera);
> +
> +	for (const std::shared_ptr<Camera> &cam : cm_->cameras())
> +		cameraCombo->addItem(QString::fromStdString(cam->name()));
> +
> +	toolbar_->addWidget(cameraCombo);
> +
> +	toolbar_->addSeparator();
> +
> +	return 0;
> +}
> +
> +void MainWindow::quit()
> +{
> +	QTimer::singleShot(0, QCoreApplication::instance(),
> +			   &QCoreApplication::quit);
> +}
> +
>  void MainWindow::updateTitle()
>  {
>  	unsigned int duration = frameRateInterval_.elapsed();
> @@ -66,6 +103,29 @@ void MainWindow::updateTitle()
>  	setWindowTitle(title_ + " : " + QString::number(fps, 'f', 2) + " fps");
>  }
>  
> +void MainWindow::switchCamera(int index)
> +{
> +	const auto &cameras = cm_->cameras();
> +	if (static_cast<unsigned int>(index) >= cameras.size())
> +		return;
> +
> +	const std::shared_ptr<Camera> &cam = cameras[index];
> +
> +	if (cam->acquire()) {
> +		std::cout << "Failed to acquire camera " << cam->name() << std::endl;
> +		return;
> +	}
> +
> +	std::cout << "Switching to camera " << cam->name() << std::endl;
> +
> +	stopCapture();
> +
> +	camera_->release();
> +	camera_ = cam;
> +
> +	startCapture();
> +}
> +
>  std::string MainWindow::chooseCamera()
>  {
>  	QStringList cameras;
> diff --git a/src/qcam/main_window.h b/src/qcam/main_window.h
> index d19cda16e36b..12af103f87d0 100644
> --- a/src/qcam/main_window.h
> +++ b/src/qcam/main_window.h
> @@ -41,9 +41,13 @@ public:
>  	~MainWindow();
>  
>  private Q_SLOTS:
> +	void quit();
>  	void updateTitle();
>  
> +	void switchCamera(int index);
> +
>  private:
> +	int createToolbars();
>  	std::string chooseCamera();
>  	int openCamera();
>  
> @@ -71,6 +75,7 @@ private:
>  	uint32_t previousFrames_;
>  	uint32_t framesCaptured_;
>  
> +	QToolBar *toolbar_;
>  	ViewFinder *viewfinder_;
>  	std::map<int, std::pair<void *, unsigned int>> mappedBuffers_;
>  };

-- 
Regards,

Laurent Pinchart


More information about the libcamera-devel mailing list