Files
external_libcamera/src/apps/qcam/cam_select_dialog.cpp
T
Luca Weiss 13645ab0ab qcam: Decrease minimum width of selector dialog
On phone screens the default width is too wide, so the OK button cannot
be clicked.

Fix this by decreasing the minimum size of the dialog so it fits nicely.

Signed-off-by: Luca Weiss <luca@z3ntu.xyz>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Milan Zamazal <mzamazal@redhat.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
2024-09-11 18:23:59 +03:00

122 lines
3.2 KiB
C++

/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
* Copyright (C) 2022, Utkarsh Tiwari <utkarsh02t@gmail.com>
*
* qcam - Camera Selection dialog
*/
#include "cam_select_dialog.h"
#include <memory>
#include <libcamera/camera.h>
#include <libcamera/camera_manager.h>
#include <QComboBox>
#include <QDialogButtonBox>
#include <QFormLayout>
#include <QGuiApplication>
#include <QLabel>
#include <QScreen>
#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()));
/* Set camera information labels. */
cameraLocation_ = new QLabel;
cameraModel_ = new QLabel;
updateCameraInfo(cameraIdComboBox_->currentText());
connect(cameraIdComboBox_, &QComboBox::currentTextChanged,
this, &CameraSelectorDialog::updateCameraInfo);
/* 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->addRow("Location:", cameraLocation_);
layout->addRow("Model:", cameraModel_);
layout->addWidget(buttonBox);
/*
* Decrease the minimum width of dialog to fit on narrow screens, with a
* 20 pixels margin.
*/
QRect screenGeometry = qGuiApp->primaryScreen()->availableGeometry();
if (screenGeometry.width() < minimumWidth())
setMinimumWidth(screenGeometry.width() - 20);
}
CameraSelectorDialog::~CameraSelectorDialog() = default;
std::string CameraSelectorDialog::getCameraId()
{
return cameraIdComboBox_->currentText().toStdString();
}
/* Hotplug / Unplug Support. */
void CameraSelectorDialog::addCamera(QString cameraId)
{
cameraIdComboBox_->addItem(cameraId);
}
void CameraSelectorDialog::removeCamera(QString cameraId)
{
int cameraIndex = cameraIdComboBox_->findText(cameraId);
cameraIdComboBox_->removeItem(cameraIndex);
}
/* Camera Information */
void CameraSelectorDialog::updateCameraInfo(QString cameraId)
{
const std::shared_ptr<libcamera::Camera> &camera =
cm_->get(cameraId.toStdString());
if (!camera)
return;
const libcamera::ControlList &properties = camera->properties();
const auto &location = properties.get(libcamera::properties::Location);
if (location) {
switch (*location) {
case libcamera::properties::CameraLocationFront:
cameraLocation_->setText("Internal front camera");
break;
case libcamera::properties::CameraLocationBack:
cameraLocation_->setText("Internal back camera");
break;
case libcamera::properties::CameraLocationExternal:
cameraLocation_->setText("External camera");
break;
default:
cameraLocation_->setText("Unknown");
}
} else {
cameraLocation_->setText("Unknown");
}
const auto &model = properties.get(libcamera::properties::Model)
.value_or("Unknown");
cameraModel_->setText(QString::fromStdString(model));
}