Message ID | 20220831054938.21617-2-utkarsh02t@gmail.com |
---|---|
State | Accepted |
Headers | show |
Series |
|
Related | show |
On Wed, Aug 31, 2022 at 11:19:32AM +0530, Utkarsh Tiwari wrote: > Currently we use QInputDialog convenience dialogs to allow the user to > select a camera. This doesn't allow adding of more information (such as > camera location, model etc). > > Create a QDialog with a QFormLayout that shows a QComboBox with camera > Ids. Use a QDialogButtonBox to provide buttons for accepting and > cancelling the action. > > The CameraSelectorDialog is only initialized the first time when the > MainWindow is created. > > From this commit we cease to auto select the camera if only a single > camera is available to libcamera. We would always display the selection > dialog with the exception being that being if the camera is supplied on > the command line. > > Signed-off-by: Utkarsh Tiwari <utkarsh02t@gmail.com> > Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> > Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> > --- > Difference from v8: > 1. s/by the console/on the command line in the commit msg > 2. Removed <string> header from cam_select_dialog.cpp > 3. Drop <QDialog> from cam_select_dialog.cpp > 4. QComboBox is forward-declared in cam_select_dialog.h > 5. ~CameraSelectorDialog() implementation now resides in .cpp > 6. CameraSelectorDialog is forward-declared in main_window.h > src/qcam/cam_select_dialog.cpp | 50 ++++++++++++++++++++++++++++++++++ > src/qcam/cam_select_dialog.h | 35 ++++++++++++++++++++++++ > src/qcam/main_window.cpp | 27 ++++-------------- > src/qcam/main_window.h | 3 ++ > src/qcam/meson.build | 2 ++ > 5 files changed, 96 insertions(+), 21 deletions(-) > create mode 100644 src/qcam/cam_select_dialog.cpp > create mode 100644 src/qcam/cam_select_dialog.h > > diff --git a/src/qcam/cam_select_dialog.cpp b/src/qcam/cam_select_dialog.cpp > new file mode 100644 > index 00000000..a49d822b > --- /dev/null > +++ b/src/qcam/cam_select_dialog.cpp > @@ -0,0 +1,50 @@ > +/* SPDX-License-Identifier: GPL-2.0-or-later */ > +/* > + * Copyright (C) 2022, Utkarsh Tiwari <utkarsh02t@gmail.com> > + * > + * cam_select_dialog.cpp - qcam - Camera Selection dialog > + */ > + > +#include "cam_select_dialog.h" > + > +#include <libcamera/camera.h> > +#include <libcamera/camera_manager.h> > + > +#include <QComboBox> > +#include <QDialogButtonBox> > +#include <QFormLayout> > +#include <QString> > + > +CameraSelectorDialog::CameraSelectorDialog(libcamera::CameraManager *cameraManager, > + QWidget *parent) > + : QDialog(parent), cm_(cameraManager) > +{ > + /* Use a QFormLayout for the dialog. */ > + QFormLayout *layout = new QFormLayout(this); > + > + /* Setup the camera id combo-box. */ > + cameraIdComboBox_ = new QComboBox; > + for (const auto &cam : cm_->cameras()) > + cameraIdComboBox_->addItem(QString::fromStdString(cam->id())); > + > + /* Setup the QDialogButton Box */ > + QDialogButtonBox *buttonBox = > + new QDialogButtonBox(QDialogButtonBox::Ok | > + QDialogButtonBox::Cancel); > + > + connect(buttonBox, &QDialogButtonBox::accepted, > + this, &QDialog::accept); > + connect(buttonBox, &QDialogButtonBox::rejected, > + this, &QDialog::reject); > + > + /* Set the layout. */ > + layout->addRow("Camera:", cameraIdComboBox_); > + layout->addWidget(buttonBox); > +} > + > +CameraSelectorDialog::~CameraSelectorDialog() = default; > + > +std::string CameraSelectorDialog::getCameraId() > +{ > + return cameraIdComboBox_->currentText().toStdString(); > +} > diff --git a/src/qcam/cam_select_dialog.h b/src/qcam/cam_select_dialog.h > new file mode 100644 > index 00000000..c31f4f82 > --- /dev/null > +++ b/src/qcam/cam_select_dialog.h > @@ -0,0 +1,35 @@ > +/* SPDX-License-Identifier: GPL-2.0-or-later */ > +/* > + * Copyright (C) 2022, Utkarsh Tiwari <utkarsh02t@gmail.com> > + * > + * cam_select_dialog.h - qcam - Camera Selection dialog > + */ > + > +#pragma once > + > +#include <string> > + > +#include <libcamera/camera.h> > +#include <libcamera/camera_manager.h> > + > +#include <QDialog> > + > +class QComboBox; > + > +class CameraSelectorDialog : public QDialog > +{ > + Q_OBJECT > +public: > + CameraSelectorDialog(libcamera::CameraManager *cameraManager, > + QWidget *parent); > + You can drop this blank line. > + ~CameraSelectorDialog(); > + > + std::string getCameraId(); > + > +private: > + libcamera::CameraManager *cm_; > + > + /* UI elements. */ > + QComboBox *cameraIdComboBox_; > +}; > diff --git a/src/qcam/main_window.cpp b/src/qcam/main_window.cpp > index 7433d647..14bcf03e 100644 > --- a/src/qcam/main_window.cpp > +++ b/src/qcam/main_window.cpp > @@ -19,7 +19,6 @@ > #include <QFileDialog> > #include <QImage> > #include <QImageWriter> > -#include <QInputDialog> > #include <QMutexLocker> > #include <QStandardPaths> > #include <QStringList> > @@ -30,6 +29,7 @@ > > #include "../cam/image.h" > > +#include "cam_select_dialog.h" > #include "dng_writer.h" > #ifndef QT_NO_OPENGL > #include "viewfinder_gl.h" > @@ -144,6 +144,8 @@ MainWindow::MainWindow(CameraManager *cm, const OptionsParser::Options &options) > cm_->cameraAdded.connect(this, &MainWindow::addCamera); > cm_->cameraRemoved.connect(this, &MainWindow::removeCamera); > > + cameraSelectorDialog_ = new CameraSelectorDialog(cm_, this); > + > /* Open the camera and start capture. */ > ret = openCamera(); > if (ret < 0) { > @@ -290,34 +292,17 @@ void MainWindow::switchCamera(int index) > > std::string MainWindow::chooseCamera() > { > - QStringList cameras; > - bool result; > - > - /* If only one camera is available, use it automatically. */ > - if (cm_->cameras().size() == 1) > - return cm_->cameras()[0]->id(); > - > - /* Present a dialog box to pick a camera. */ > - for (const std::shared_ptr<Camera> &cam : cm_->cameras()) > - cameras.append(QString::fromStdString(cam->id())); > - > - QString id = QInputDialog::getItem(this, "Select Camera", > - "Camera:", cameras, 0, > - false, &result); > - if (!result) > + if (cameraSelectorDialog_->exec() != QDialog::Accepted) > return std::string(); > > - return id.toStdString(); > + return cameraSelectorDialog_->getCameraId(); > } > > int MainWindow::openCamera() > { > std::string cameraName; > > - /* > - * Use the camera specified on the command line, if any, or display the > - * camera selection dialog box otherwise. > - */ > + /* Use camera provided on the command line else prompt for selection.*/ Anything wrong with the current comment ? > if (options_.isSet(OptCamera)) > cameraName = static_cast<std::string>(options_[OptCamera]); > else > diff --git a/src/qcam/main_window.h b/src/qcam/main_window.h > index fc70920f..def44605 100644 > --- a/src/qcam/main_window.h > +++ b/src/qcam/main_window.h > @@ -35,6 +35,7 @@ class QComboBox; > > class Image; > class HotplugEvent; > +class CameraSelectorDialog; Alphabetical order please. > > enum { > OptCamera = 'c', > @@ -99,6 +100,8 @@ private: > QString title_; > QTimer titleTimer_; > > + CameraSelectorDialog *cameraSelectorDialog_; > + > /* Options */ > const OptionsParser::Options &options_; > > diff --git a/src/qcam/meson.build b/src/qcam/meson.build > index c46f4631..61861ea6 100644 > --- a/src/qcam/meson.build > +++ b/src/qcam/meson.build > @@ -18,6 +18,7 @@ qcam_sources = files([ > '../cam/image.cpp', > '../cam/options.cpp', > '../cam/stream_options.cpp', > + 'cam_select_dialog.cpp', > 'format_converter.cpp', > 'main.cpp', > 'main_window.cpp', > @@ -26,6 +27,7 @@ qcam_sources = files([ > ]) > > qcam_moc_headers = files([ > + 'cam_select_dialog.h', > 'main_window.h', > 'viewfinder_qt.h', > ])
diff --git a/src/qcam/cam_select_dialog.cpp b/src/qcam/cam_select_dialog.cpp new file mode 100644 index 00000000..a49d822b --- /dev/null +++ b/src/qcam/cam_select_dialog.cpp @@ -0,0 +1,50 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Copyright (C) 2022, Utkarsh Tiwari <utkarsh02t@gmail.com> + * + * cam_select_dialog.cpp - qcam - Camera Selection dialog + */ + +#include "cam_select_dialog.h" + +#include <libcamera/camera.h> +#include <libcamera/camera_manager.h> + +#include <QComboBox> +#include <QDialogButtonBox> +#include <QFormLayout> +#include <QString> + +CameraSelectorDialog::CameraSelectorDialog(libcamera::CameraManager *cameraManager, + QWidget *parent) + : QDialog(parent), cm_(cameraManager) +{ + /* Use a QFormLayout for the dialog. */ + QFormLayout *layout = new QFormLayout(this); + + /* Setup the camera id combo-box. */ + cameraIdComboBox_ = new QComboBox; + for (const auto &cam : cm_->cameras()) + cameraIdComboBox_->addItem(QString::fromStdString(cam->id())); + + /* Setup the QDialogButton Box */ + QDialogButtonBox *buttonBox = + new QDialogButtonBox(QDialogButtonBox::Ok | + QDialogButtonBox::Cancel); + + connect(buttonBox, &QDialogButtonBox::accepted, + this, &QDialog::accept); + connect(buttonBox, &QDialogButtonBox::rejected, + this, &QDialog::reject); + + /* Set the layout. */ + layout->addRow("Camera:", cameraIdComboBox_); + layout->addWidget(buttonBox); +} + +CameraSelectorDialog::~CameraSelectorDialog() = default; + +std::string CameraSelectorDialog::getCameraId() +{ + return cameraIdComboBox_->currentText().toStdString(); +} diff --git a/src/qcam/cam_select_dialog.h b/src/qcam/cam_select_dialog.h new file mode 100644 index 00000000..c31f4f82 --- /dev/null +++ b/src/qcam/cam_select_dialog.h @@ -0,0 +1,35 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Copyright (C) 2022, Utkarsh Tiwari <utkarsh02t@gmail.com> + * + * cam_select_dialog.h - qcam - Camera Selection dialog + */ + +#pragma once + +#include <string> + +#include <libcamera/camera.h> +#include <libcamera/camera_manager.h> + +#include <QDialog> + +class QComboBox; + +class CameraSelectorDialog : public QDialog +{ + Q_OBJECT +public: + CameraSelectorDialog(libcamera::CameraManager *cameraManager, + QWidget *parent); + + ~CameraSelectorDialog(); + + std::string getCameraId(); + +private: + libcamera::CameraManager *cm_; + + /* UI elements. */ + QComboBox *cameraIdComboBox_; +}; diff --git a/src/qcam/main_window.cpp b/src/qcam/main_window.cpp index 7433d647..14bcf03e 100644 --- a/src/qcam/main_window.cpp +++ b/src/qcam/main_window.cpp @@ -19,7 +19,6 @@ #include <QFileDialog> #include <QImage> #include <QImageWriter> -#include <QInputDialog> #include <QMutexLocker> #include <QStandardPaths> #include <QStringList> @@ -30,6 +29,7 @@ #include "../cam/image.h" +#include "cam_select_dialog.h" #include "dng_writer.h" #ifndef QT_NO_OPENGL #include "viewfinder_gl.h" @@ -144,6 +144,8 @@ MainWindow::MainWindow(CameraManager *cm, const OptionsParser::Options &options) cm_->cameraAdded.connect(this, &MainWindow::addCamera); cm_->cameraRemoved.connect(this, &MainWindow::removeCamera); + cameraSelectorDialog_ = new CameraSelectorDialog(cm_, this); + /* Open the camera and start capture. */ ret = openCamera(); if (ret < 0) { @@ -290,34 +292,17 @@ void MainWindow::switchCamera(int index) std::string MainWindow::chooseCamera() { - QStringList cameras; - bool result; - - /* If only one camera is available, use it automatically. */ - if (cm_->cameras().size() == 1) - return cm_->cameras()[0]->id(); - - /* Present a dialog box to pick a camera. */ - for (const std::shared_ptr<Camera> &cam : cm_->cameras()) - cameras.append(QString::fromStdString(cam->id())); - - QString id = QInputDialog::getItem(this, "Select Camera", - "Camera:", cameras, 0, - false, &result); - if (!result) + if (cameraSelectorDialog_->exec() != QDialog::Accepted) return std::string(); - return id.toStdString(); + return cameraSelectorDialog_->getCameraId(); } int MainWindow::openCamera() { std::string cameraName; - /* - * Use the camera specified on the command line, if any, or display the - * camera selection dialog box otherwise. - */ + /* Use camera provided on the command line else prompt for selection.*/ if (options_.isSet(OptCamera)) cameraName = static_cast<std::string>(options_[OptCamera]); else diff --git a/src/qcam/main_window.h b/src/qcam/main_window.h index fc70920f..def44605 100644 --- a/src/qcam/main_window.h +++ b/src/qcam/main_window.h @@ -35,6 +35,7 @@ class QComboBox; class Image; class HotplugEvent; +class CameraSelectorDialog; enum { OptCamera = 'c', @@ -99,6 +100,8 @@ private: QString title_; QTimer titleTimer_; + CameraSelectorDialog *cameraSelectorDialog_; + /* Options */ const OptionsParser::Options &options_; diff --git a/src/qcam/meson.build b/src/qcam/meson.build index c46f4631..61861ea6 100644 --- a/src/qcam/meson.build +++ b/src/qcam/meson.build @@ -18,6 +18,7 @@ qcam_sources = files([ '../cam/image.cpp', '../cam/options.cpp', '../cam/stream_options.cpp', + 'cam_select_dialog.cpp', 'format_converter.cpp', 'main.cpp', 'main_window.cpp', @@ -26,6 +27,7 @@ qcam_sources = files([ ]) qcam_moc_headers = files([ + 'cam_select_dialog.h', 'main_window.h', 'viewfinder_qt.h', ])