From patchwork Wed Aug 31 05:49:32 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Utkarsh Tiwari X-Patchwork-Id: 17265 Return-Path: X-Original-To: parsemail@patchwork.libcamera.org Delivered-To: parsemail@patchwork.libcamera.org Received: from lancelot.ideasonboard.com (lancelot.ideasonboard.com [92.243.16.209]) by patchwork.libcamera.org (Postfix) with ESMTPS id 65BAAC3272 for ; Wed, 31 Aug 2022 05:49:56 +0000 (UTC) Received: from lancelot.ideasonboard.com (localhost [IPv6:::1]) by lancelot.ideasonboard.com (Postfix) with ESMTP id 158F361FC0; Wed, 31 Aug 2022 07:49:56 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org; s=mail; t=1661924996; bh=pBtWysisUXQZjFS1DaxfJbevz+8j9IQ0PqWmQ3oVr+g=; h=To:Date:In-Reply-To:References:Subject:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=RC1kYB701+h1IHOnnBh7lTAaVBC5PNdp+cfIEVepipK0GphMuHN7qPNeAX4UYN2C1 suqqPTaM301pH8fvuyhCcOx71CoKXJnnwbSSElEf6hA9zUnFDGpmQRInr1hMIRLs5P USrrr961Qm/vnTSEOyO3OWNd7fRDxhkP+kx5UzRAqDT8jqNEXEg/pyQRKrHd+hVQU2 mUUJzMPPfj6iOs1pkznfF/jZZa7K2qErWSvCk6Y3MkK8Skj7Dj9PfpG95C8cPpeFeX X2KTc5gOCKLGMP7bu6b7lw8CR5B1uY9hnlf6qee0BSZkPWmYhXzbH5NLxBobIwRB6E Xa681tFMT7/LA== Received: from mail-pf1-x42e.google.com (mail-pf1-x42e.google.com [IPv6:2607:f8b0:4864:20::42e]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id B2C7061FC0 for ; Wed, 31 Aug 2022 07:49:53 +0200 (CEST) Authentication-Results: lancelot.ideasonboard.com; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="FCZFzW7t"; dkim-atps=neutral Received: by mail-pf1-x42e.google.com with SMTP id 72so13434650pfx.9 for ; Tue, 30 Aug 2022 22:49:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc; bh=B9kMzQ/ssEmSlT0Blg3p++oQte936a/cWGLiumonPLE=; b=FCZFzW7tAhsfDivh6CQfSFEnA8TEREwijBL3ApZBAvIiATMalmqGbFDdpLlQUQlW2I 5ehDiwwLFaRk+ziO9L6sOZpjSAxbBhRhOCSiYL3bpclZ7BbdRDz6+n6MpjBnN/dV0tml GJZo4jUNDRAHz5XTjsZEDTNuJXEVcarYyW7Ug0sufmLGMpEXI2NuYMymRpJk6treopMH Qxa84LBa+oiydPW5Fh8klgwJ7C0uoxl2a/A+mU6ZxKJUzulb/a/yg/+l9KBDB3iER7cH UC9Q0wflMEPckBo0s5UQObj5v2ntreLo88mLwXQoYvil0SrvF+rrIlVX2f1NJigtUw8j PvXQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc; bh=B9kMzQ/ssEmSlT0Blg3p++oQte936a/cWGLiumonPLE=; b=l2H+dileZP9PI0Up4rmx7Mw+tTOpvaYApRXFm7vX+Cns6y2dvLCoRF17hrXx+CyJRZ xhecJmkBXIPptF3CsxZPUZvWAK2q6by39HBQb8wFXNZGlwboPpHjL0wJcCpOhz6a/Nox R0sEVz2VBMloIOwyZRk60vdeHchyLErk4ypomYssujuUyBk4NTGdzOd5nxjYC4ymh3S8 Rqk+Ud8EdASA93Ob/ztlwWwcqC5dEQ+0Yp0VtCGfKlwYFuFihCd/2GNmFeff7ANFE2W1 W+qT8zgahuV9Qx2JBZ13ZzNgVu4fniacpF9de7UFyP003eeO5Iti5X4BMXc3VBZWdIlk ZluQ== X-Gm-Message-State: ACgBeo0akT2zl8B/B15wmTK9DyWSbtrWWLMRyL+Zm6A2mIi3hazvPRo9 q9CpK1bJum/K7/NGpOik6okDteYRjXs= X-Google-Smtp-Source: AA6agR7+0ZiNetMTj2+XSfdbs33U41OJvWKKldSRnFS3q5ri7u281d/pNNtB82FtYzK1iUu9Xj1mGg== X-Received: by 2002:a05:6a00:1384:b0:538:73c5:91ff with SMTP id t4-20020a056a00138400b0053873c591ffmr8888834pfg.54.1661924991961; Tue, 30 Aug 2022 22:49:51 -0700 (PDT) Received: from devut-HP-Laptop-14q-cs0xxx.. ([103.36.82.122]) by smtp.gmail.com with ESMTPSA id q19-20020aa79833000000b00537eacc8fa6sm8307333pfl.40.2022.08.30.22.49.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 30 Aug 2022 22:49:51 -0700 (PDT) To: libcamera-devel@lists.libcamera.org Date: Wed, 31 Aug 2022 11:19:32 +0530 Message-Id: <20220831054938.21617-2-utkarsh02t@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220831054938.21617-1-utkarsh02t@gmail.com> References: <20220831054938.21617-1-utkarsh02t@gmail.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v9 1/7] qcam: Use QDialog for selection of cameras at startup X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Utkarsh Tiwari via libcamera-devel From: Utkarsh Tiwari Reply-To: Utkarsh Tiwari Errors-To: libcamera-devel-bounces@lists.libcamera.org Sender: "libcamera-devel" 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 Reviewed-by: Kieran Bingham Reviewed-by: Laurent Pinchart --- Difference from v8: 1. s/by the console/on the command line in the commit msg 2. Removed header from cam_select_dialog.cpp 3. Drop 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 + * + * cam_select_dialog.cpp - qcam - Camera Selection dialog + */ + +#include "cam_select_dialog.h" + +#include +#include + +#include +#include +#include +#include + +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 + * + * cam_select_dialog.h - qcam - Camera Selection dialog + */ + +#pragma once + +#include + +#include +#include + +#include + +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 #include #include -#include #include #include #include @@ -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 &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(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', ])