From patchwork Thu Feb 6 15:05:01 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kieran Bingham X-Patchwork-Id: 2789 Return-Path: Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id D18A7600FB for ; Thu, 6 Feb 2020 16:05:10 +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 6C2C21291; Thu, 6 Feb 2020 16:05:10 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1581001510; bh=pgfhyHX8wYkZ26Ema3OsuMR/BT1/hG5NhNo2pPjP2Q0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=b64mPuiE/Kh+yDa1jjDC3h5WDe5RU3XET9L2wZjGZDenZxx+Nhm72s2MelFG//gWd IqPyJTwuM2qHhLb3ld0vBkbRYap5KO2hcMTGwRz2TrEc1TbhdQuYF3sfzLJp6PBbIo e1nUtsG6mqtIPqe14WovHNxcPaSJR0r5I746180c= From: Kieran Bingham To: LibCamera Devel Date: Thu, 6 Feb 2020 15:05:01 +0000 Message-Id: <20200206150504.24204-4-kieran.bingham@ideasonboard.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200206150504.24204-1-kieran.bingham@ideasonboard.com> References: <20200206150504.24204-1-kieran.bingham@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH 3/6] 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: Thu, 06 Feb 2020 15:05:11 -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 --- src/qcam/main_window.cpp | 60 ++++++++++++++++++++++++++++++++++++++++ src/qcam/main_window.h | 4 +++ 2 files changed, 64 insertions(+) diff --git a/src/qcam/main_window.cpp b/src/qcam/main_window.cpp index b51a16de199d..1c7260f32d0a 100644 --- a/src/qcam/main_window.cpp +++ b/src/qcam/main_window.cpp @@ -13,6 +13,8 @@ #include #include #include +#include +#include #include #include @@ -27,6 +29,8 @@ MainWindow::MainWindow(CameraManager *cm, const OptionsParser::Options &options) { int ret; + createToolbars(cm); + title_ = "QCam " + QString::fromStdString(CameraManager::version()); setWindowTitle(title_); connect(&titleTimer_, SIGNAL(timeout()), this, SLOT(updateTitle())); @@ -53,6 +57,31 @@ MainWindow::~MainWindow() } } +int MainWindow::createToolbars(CameraManager *cm) +{ + QAction *action; + + toolbar_ = addToolBar(""); + + action = toolbar_->addAction("Quit"); + connect(action, &QAction::triggered, this, &MainWindow::quit); + + QAction *cameraAction = new QAction("&Cameras", this); + toolbar_->addAction(cameraAction); + + QToolButton *cameraButton = dynamic_cast(toolbar_->widgetForAction(cameraAction)); + + cameraButton->setPopupMode(QToolButton::InstantPopup); + + for (const std::shared_ptr &cam : cm->cameras()) { + action = new QAction(QString::fromStdString(cam->name())); + cameraButton->addAction(action); + connect(action, &QAction::triggered, this, [=]() { this->setCamera(cam); }); + } + + return 0; +} + void MainWindow::quit() { QTimer::singleShot(0, QCoreApplication::instance(), @@ -72,6 +101,37 @@ void MainWindow::updateTitle() setWindowTitle(title_ + " : " + QString::number(fps, 'f', 2) + " fps"); } +int MainWindow::setCamera(const std::shared_ptr &cam) +{ + std::cout << "Chose " << cam->name() << std::endl; + + if (cam->acquire()) { + std::cout << "Failed to acquire camera" << std::endl; + return -EBUSY; + } + + std::cout << "Switching to camera " << cam->name() << std::endl; + + stopCapture(); + camera_->release(); + + /* + * If we don't disconnect this signal, it will persist (and get + * re-added and thus duplicated later if we ever switch back to an + * previously streamed camera). This causes all sorts of pain. + * + * Perhaps releasing a camera should disconnect all (public?) connected + * signals forcefully! + */ + camera_->requestCompleted.disconnect(this, &MainWindow::requestComplete); + camera_ = cam; + camera_->requestCompleted.connect(this, &MainWindow::requestComplete); + + startCapture(); + + return 0; +} + std::string MainWindow::chooseCamera(CameraManager *cm) { QStringList cameras; diff --git a/src/qcam/main_window.h b/src/qcam/main_window.h index a11443b30b37..f7c96fdd5c30 100644 --- a/src/qcam/main_window.h +++ b/src/qcam/main_window.h @@ -44,7 +44,10 @@ private Q_SLOTS: void quit(); void updateTitle(); + int setCamera(const std::shared_ptr &cam); + private: + int createToolbars(CameraManager *cm); std::string chooseCamera(CameraManager *cm); int openCamera(CameraManager *cm); @@ -71,6 +74,7 @@ private: uint32_t previousFrames_; uint32_t framesCaptured_; + QToolBar *toolbar_; ViewFinder *viewfinder_; std::map> mappedBuffers_; };