[libcamera-devel] [PATCH 2/4] qcam: Support Hotplug for Camera Selection Dialog

Umang Jain umang.jain at ideasonboard.com
Thu Aug 4 11:22:00 CEST 2022


Hi Utkarsh

Thank you for the patch.

On 8/3/22 23:25, Utkarsh Tiwari via libcamera-devel wrote:
> Currently if there is HotPlug event when the user is on the Camera
> selection dialog, the QComboBox didn't update to reflect the change.
>
> If the cameraIdComboBox_ contains a valid QComboBox then update it to
> reflect the HotPlug change. Check the validity of QComboBox pointer by
> guarding it with a QPointer.
>
> Signed-off-by: Utkarsh Tiwari <utkarsh02t at gmail.com>
> ---
>   src/qcam/main_window.cpp | 23 +++++++++++++++--------
>   src/qcam/main_window.h   |  4 ++++
>   2 files changed, 19 insertions(+), 8 deletions(-)
>
> diff --git a/src/qcam/main_window.cpp b/src/qcam/main_window.cpp
> index 7761a6c6..80a73b68 100644
> --- a/src/qcam/main_window.cpp
> +++ b/src/qcam/main_window.cpp
> @@ -293,18 +293,15 @@ void MainWindow::switchCamera(int index)
>   
>   std::string MainWindow::chooseCamera()
>   {
> -	QStringList cameras;
>   	std::string result;
>   
>   	/* Present a dialog box to pick a camera. */
>   	QDialog *cameraSelectDialog = new QDialog(this);
>   
>   	/* Setup a QComboBox to display camera Ids. */
> +	cameraIdComboBox_ = new QComboBox;
>   	for (const std::shared_ptr<Camera> &cam : cm_->cameras())
> -		cameras.push_back(QString::fromStdString(cam->id()));
> -
> -	QComboBox *cameraIdComboBox = new QComboBox;
> -	cameraIdComboBox->addItems(cameras);
> +		cameraIdComboBox_->addItem(QString::fromStdString(cam->id()));
>   
>   	/* Setup QDialogButtonBox. */
>   	QDialogButtonBox *dialogButtonBox = new QDialogButtonBox;
> @@ -313,7 +310,7 @@ std::string MainWindow::chooseCamera()
>   
>   	connect(dialogButtonBox, &QDialogButtonBox::accepted,
>   		this, [&]() {
> -			result = cameraIdComboBox->currentText().toStdString();
> +			result = cameraIdComboBox_->currentText().toStdString();
>   			cameraSelectDialog->accept();
>   		});
>   
> @@ -325,7 +322,7 @@ std::string MainWindow::chooseCamera()
>   
>   	/* Setup the layout for the dialog. */
>   	QFormLayout *cameraSelectLayout = new QFormLayout(cameraSelectDialog);
> -	cameraSelectLayout->addRow("Camera: ", cameraIdComboBox);
> +	cameraSelectLayout->addRow("Camera: ", cameraIdComboBox_);
>   	cameraSelectLayout->addWidget(dialogButtonBox);
>   
>   	cameraSelectDialog->exec();
> @@ -628,7 +625,12 @@ void MainWindow::processHotplug(HotplugEvent *e)
>   	HotplugEvent::PlugEvent event = e->hotplugEvent();
>   
>   	if (event == HotplugEvent::HotPlug) {
> -		cameraCombo_->addItem(QString::fromStdString(camera->id()));
> +		QString cameraId = QString::fromStdString(camera->id());
> +		cameraCombo_->addItem(cameraId);
> +
> +		/* Update cameraIdCombox_ to include the new camera. */
> +		if (cameraIdComboBox_)
> +			cameraIdComboBox_->addItem(cameraId);
>   	} else if (event == HotplugEvent::HotUnplug) {
>   		/* Check if the currently-streaming camera is removed. */
>   		if (camera == camera_.get()) {
> @@ -638,6 +640,11 @@ void MainWindow::processHotplug(HotplugEvent *e)
>   			cameraCombo_->setCurrentIndex(0);
>   		}
>   
> +		if (cameraIdComboBox_) {
> +			int cameraIdIndex = cameraIdComboBox_->findText(QString::fromStdString(camera_->id()));
> +			cameraIdComboBox_->removeItem(cameraIdIndex);
> +		}
> +
>   		int camIndex = cameraCombo_->findText(QString::fromStdString(camera->id()));
>   		cameraCombo_->removeItem(camIndex);
>   	}
> diff --git a/src/qcam/main_window.h b/src/qcam/main_window.h
> index fc70920f..b8122eb9 100644
> --- a/src/qcam/main_window.h
> +++ b/src/qcam/main_window.h
> @@ -23,7 +23,9 @@
>   #include <QMainWindow>
>   #include <QMutex>
>   #include <QObject>
> +#include <QPointer>
>   #include <QQueue>
> +#include <QStringList>
>   #include <QTimer>
>   
>   #include "../cam/stream_options.h"
> @@ -99,6 +101,8 @@ private:
>   	QString title_;
>   	QTimer titleTimer_;
>   
> +	QPointer<QComboBox> cameraIdComboBox_;


You can simply start with a private cameraIdComboBox_ member in 1/4, 
rather than defining it locally, then making it private here.

> +
>   	/* Options */
>   	const OptionsParser::Options &options_;
>   


More information about the libcamera-devel mailing list