From patchwork Fri Feb 14 00:18:07 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kieran Bingham X-Patchwork-Id: 2829 Return-Path: Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id 0AD1A61A2B for ; Fri, 14 Feb 2020 01:18:15 +0100 (CET) Received: from localhost.localdomain (cpc89242-aztw30-2-0-cust488.18-1.cable.virginm.net [86.31.129.233]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id A31179D3; Fri, 14 Feb 2020 01:18:14 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1581639494; bh=n8Ke77ofzJzoVF6fV89MLufSYAARGKeBWO4ic7rqD7U=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=OLP0PQne3AE7KSYTDyZyAdgUw1ILYgVZc4Xa8dtlNR/y+etPdAl+cPvOAeZih3Frp ZZnd4T7hSDm8NDnLVwacdtsEhhKKhDOddVbxCLmasCUW7DOmvG6xQjnB+1dLtgaBG9 dvfsIWr+vOqbK8LhsT4illUg2k7072PTZHKodl2o= From: Kieran Bingham To: libcamera devel Date: Fri, 14 Feb 2020 00:18:07 +0000 Message-Id: <20200214001810.19302-5-kieran.bingham@ideasonboard.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200214001810.19302-1-kieran.bingham@ideasonboard.com> References: <20200214001810.19302-1-kieran.bingham@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH v2 4/7] qcam: Introduce a toolbar and camera switching 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-List-Received-Date: Fri, 14 Feb 2020 00:18:15 -0000 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 Reviewed-by: Laurent Pinchart --- 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 #include +#include #include #include #include +#include +#include #include #include @@ -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 */ + toolbar_->setContextMenuPolicy(Qt::PreventContextMenu); + + action = toolbar_->addAction("Quit"); + connect(action, &QAction::triggered, this, &MainWindow::quit); + + /* Camera selection */ + QComboBox *cameraCombo = new QComboBox(); + connect(cameraCombo, QOverload::of(&QComboBox::activated), + this, &MainWindow::switchCamera); + + for (const std::shared_ptr &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(index) >= cameras.size()) + return; + + const std::shared_ptr &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> mappedBuffers_; };