FaceAccess/Linguist/recoUi/recoUiCallDial.cpp
2024-07-11 11:27:12 +08:00

371 lines
14 KiB
C++

#include "recoUiCallDial.h"
#include <QDebug>
#include <QPainter>
#include "AsyncEvent.h"
#include "recoUiRecognize.h"
const int recoUiCallDial::DEV_CODE_FONT_SIZE[UiConfig::SUPPORT_SCREEN_SIZE_QUANTITY][UiConfig::SUPPORT_LANGUAGE_QUANTITY] = {
{20, 20, 14, 15, 12, 15, 14, 13, 9, 12, 10, 13, 13, 9},
{40, 40, 28, 30, 24, 30, 28, 26, 19, 26, 22, 26, 26, 19},
{40, 40, 28, 30, 24, 30, 28, 26, 19, 26, 22, 26, 26, 19},
{14, 14, 11, 12, 10, 12, 11, 10, 8, 10, 9, 10, 10, 8},
{14, 14, 11, 12, 10, 12, 11, 10, 8, 10, 9, 10, 10, 8}
};
const int recoUiCallDial::NUM_BTN_FONT_SIZE[UiConfig::SUPPORT_SCREEN_SIZE_QUANTITY][UiConfig::SUPPORT_LANGUAGE_QUANTITY] = {
{20, 20, 14, 15, 12, 15, 14, 13, 9, 12, 10, 13, 13, 9},
{40, 40, 28, 30, 24, 30, 28, 26, 19, 26, 22, 26, 26, 19},
{40, 40, 28, 30, 24, 30, 28, 26, 19, 26, 22, 26, 26, 19},
{16, 16, 11, 12, 10, 12, 11, 10, 8, 10, 9, 10, 10, 8},
{16, 16, 11, 12, 10, 12, 11, 10, 8, 10, 9, 10, 10, 8}
};
const int recoUiCallDial::CALL_BTN_FONT_SIZE[UiConfig::SUPPORT_SCREEN_SIZE_QUANTITY][UiConfig::SUPPORT_LANGUAGE_QUANTITY] = {
{20, 20, 14, 15, 12, 15, 14, 13, 9, 12, 10, 13, 13, 9},
{40, 40, 28, 30, 24, 30, 28, 26, 19, 26, 22, 26, 26, 19},
{40, 40, 28, 30, 24, 30, 28, 26, 19, 26, 22, 26, 26, 19},
{14, 14, 10, 11, 9, 11, 10, 9, 7, 9, 8, 9, 9, 7},
{14, 14, 10, 11, 9, 11, 10, 9, 7, 9, 8, 9, 9, 7}
};
const QString recoUiCallDial::DIAL_BG[UiConfig::SUPPORT_SCREEN_SIZE_QUANTITY] = {
":/res/image/pwd_bg_small.jpg",
":/res/image/pwd_bg_large.jpg",
":/res/image/pwd_bg_middle.jpg",
":/res/image/pwd_bg_large.jpg",
":/res/image/pwd_bg_middle.jpg"
};
const QString recoUiCallDial::CALL_BTN_BG[UiConfig::SUPPORT_SCREEN_SIZE_QUANTITY] = {
":/res/image/pwd_confirm_small.png",
":/res/image/pwd_confirm_large.png",
":/res/image/pwd_confirm_middle.png",
":/res/image/pwd_confirm_large.png",
":/res/image/pwd_confirm_middle.png"
};
const QString recoUiCallDial::CALL_BTN_DISABLE_BG[UiConfig::SUPPORT_SCREEN_SIZE_QUANTITY] = {
":/res/image/pwd_confirm_small_disable.png",
":/res/image/pwd_confirm_large_disable.png",
":/res/image/pwd_confirm_middle_disable.png",
":/res/image/pwd_confirm_large_disable.png",
":/res/image/pwd_confirm_middle_disable.png"
};
const int recoUiCallDial::CALL_BTN_W[UiConfig::SUPPORT_SCREEN_SIZE_QUANTITY] = {344, 430, 430, 430, 430};
const int recoUiCallDial::CALL_BTN_H[UiConfig::SUPPORT_SCREEN_SIZE_QUANTITY] = {72, 90, 90, 90, 90};
const QString recoUiCallDial::BACK_BTN[UiConfig::SUPPORT_SCREEN_SIZE_QUANTITY] = {
":/res/image/pwd_back_small.png",
":/res/image/pwd_back_large.png",
":/res/image/pwd_back_middle.png",
":/res/image/pwd_back_large.png",
":/res/image/pwd_back_middle.png"
};
const int recoUiCallDial::BACK_BTN_W[UiConfig::SUPPORT_SCREEN_SIZE_QUANTITY] = {20, 24, 24, 24, 24};
const int recoUiCallDial::BACK_BTN_H[UiConfig::SUPPORT_SCREEN_SIZE_QUANTITY] = {35, 44, 44, 44, 44};
const QString recoUiCallDial::DEL_BTN[UiConfig::SUPPORT_SCREEN_SIZE_QUANTITY] = {
":/res/image/pwd_del_small.png",
":/res/image/pwd_del_large_black.png",
":/res/image/pwd_del_middle.png",
":/res/image/pwd_del_large_black.png",
":/res/image/pwd_del_middle.png"
};
const int recoUiCallDial::DEL_BTN_W[UiConfig::SUPPORT_SCREEN_SIZE_QUANTITY] = {344, 35, 35, 35, 35};
const int recoUiCallDial::DEL_BTN_H[UiConfig::SUPPORT_SCREEN_SIZE_QUANTITY] = {344, 24, 24, 24, 24};
const QString recoUiCallDial::NUM_BTN[UiConfig::SUPPORT_SCREEN_SIZE_QUANTITY] = {
":/res/image/num_btn_small.png",
":/res/image/num_btn_large.png",
":/res/image/num_btn_middle.png",
":/res/image/num_btn_large.png",
":/res/image/num_btn_middle.png"
};
recoUiCallDial::recoUiCallDial(QWidget *parent) : WidgetWithBackstageInterface(parent)
{
qDebug() << "recoUiCallDial()";
resize(UiConfig::GetInstance()->getUiWidth(), UiConfig::GetInstance()->getUiHeight());
setAutoFillBackground(true);
QPalette palette(this->palette());
palette.setBrush(QPalette::Window,QBrush(QPixmap(DIAL_BG[UiConfig::GetInstance()->getScreenConfigIndex()])));
//palette.setBrush(QPalette::Window, Qt::white);
setPalette(palette);
const int btnWidth = UiConfig::GetInstance()->getUiWidth() / 8;
m_btnBack = new QPushButton(this);
setButtonBackImage(m_btnBack, BACK_BTN[UiConfig::GetInstance()->getScreenConfigIndex()],
BACK_BTN_W[UiConfig::GetInstance()->getScreenConfigIndex()],
BACK_BTN_H[UiConfig::GetInstance()->getScreenConfigIndex()]);
m_btnBack->setFixedSize(btnWidth, btnWidth);
//m_btnBack->setStyleSheet("QPushButton:focus{outline: none;}");
m_btnBack->setFocusPolicy(Qt::NoFocus);
connect(m_btnBack, SIGNAL(clicked()), this, SLOT(slotBtnClicked()));
QFont ft;
ft.setWeight(ft.weight() * 2 > 99 ? 99 : ft.weight() * 2);//Weight must be between 0 and 99
m_editDevCode = new QLineEdit(this);
m_editDevCode->setFixedWidth(static_cast<int>(UiConfig::GetInstance()->getUiWidth() * 0.9));
m_editDevCode->setReadOnly(true);
QPalette lineEditPal;
lineEditPal.setColor(QPalette::Text,QColor(255, 255, 255, 255));
m_editDevCode->setPalette(lineEditPal);
ft.setPointSize(DEV_CODE_FONT_SIZE[UiConfig::GetInstance()->getScreenConfigIndex()][UiConfig::GetInstance()->getLanguageType()]);
m_editDevCode->setFont(ft);
m_editDevCode->setStyleSheet("background:transparent;border-width:0;border-style:outset");
m_editDevCode->setAlignment(Qt::AlignCenter);
connect(m_editDevCode, SIGNAL(textChanged(const QString&)), this, SLOT(slotTextChanged(const QString&)));
QPalette btnPal;
btnPal.setColor(QPalette::ButtonText,QColor(255, 255, 255, 255));
QGridLayout* glayMid = new QGridLayout();
for(int i=0; i<NUM_BTNS_QTY; i++){
m_btnsNum[i] = new QPushButton(this);
m_btnsNum[i]->setText(QString::number(i));
m_btnsNum[i]->setPalette(btnPal);
ft.setPointSize(NUM_BTN_FONT_SIZE[UiConfig::GetInstance()->getScreenConfigIndex()][UiConfig::GetInstance()->getLanguageType()]);
m_btnsNum[i]->setFont(ft);
m_btnsNum[i]->setFlat(true);
m_btnsNum[i]->setCursor(QCursor(Qt::PointingHandCursor));
m_btnsNum[i]->setFocusPolicy(Qt::NoFocus);
m_btnsNum[i]->setFixedSize(btnWidth, btnWidth);
m_btnsNum[i]->setStyleSheet("background-color:transparent;border-radius:0px;focus{outline: none;}");
connect(m_btnsNum[i], SIGNAL(clicked()), this, SLOT(slotBtnClicked()));
if(!UiConfig::GetInstance()->isRkDevice()){
connect(m_btnsNum[i], SIGNAL(pressed()), this, SLOT(slotBtnPressed()));
connect(m_btnsNum[i], SIGNAL(released()), this, SLOT(slotBtnReleased()));
}
if(i > 0){
const int pos = i - 1;
glayMid->addWidget(m_btnsNum[i], pos / 3, pos % 3);
}
}
m_btnBackspace = new QPushButton(this);
setButtonBackImage(m_btnBackspace, DEL_BTN[UiConfig::GetInstance()->getScreenConfigIndex()],
DEL_BTN_W[UiConfig::GetInstance()->getScreenConfigIndex()],
DEL_BTN_H[UiConfig::GetInstance()->getScreenConfigIndex()]);
m_btnBackspace->setFixedSize(btnWidth, btnWidth);
connect(m_btnBackspace, SIGNAL(clicked()), this, SLOT(slotBtnClicked()));
glayMid->addWidget(m_btnsNum[0], 3, 1);
glayMid->addWidget(m_btnBackspace, 3, 2);
m_btnCall = new QPushButton(this);
m_btnCall->setText(tr("呼叫"));
m_btnCall->setPalette(btnPal);
m_btnCall->setFlat(true);
m_btnCall->setCursor(QCursor(Qt::PointingHandCursor));
m_btnCall->setFocusPolicy(Qt::NoFocus);
m_btnCall->setFixedSize(CALL_BTN_W[UiConfig::GetInstance()->getScreenConfigIndex()],
UiConfig::GetInstance()->isRkDevice() ?
(CALL_BTN_H[UiConfig::GetInstance()->getScreenConfigIndex()] >> 2 << 2) :
CALL_BTN_H[UiConfig::GetInstance()->getScreenConfigIndex()]);
ft.setPointSize(CALL_BTN_FONT_SIZE[UiConfig::GetInstance()->getScreenConfigIndex()][UiConfig::GetInstance()->getLanguageType()]);
m_btnCall->setFont(ft);
/*m_btnCall->setStyleSheet(QString("background-color:transparent;"
"color:white;"
"border-image: url(%1);"
).arg(CALL_BTN_BG[UiConfig::GetInstance()->getScreenConfigIndex()]));*/
m_btnCall->setStyleSheet("QPushButton {"
"border: 0px;"
"border-radius:10px;"
"background-color:rgb(31, 164, 38);"
"focus{outline: none;}"
"}"
"QPushButton:pressed {"
"background-color:rgb(31, 255, 38);"
"focus{outline: none;}"
"}");
connect(m_btnCall, SIGNAL(clicked()), this, SLOT(slotBtnClicked()));
QVBoxLayout* vlay = new QVBoxLayout();
vlay->addWidget(m_btnBack, 1, Qt::AlignLeft | Qt::AlignTop);
vlay->addWidget(m_editDevCode, 1, Qt::AlignCenter | Qt::AlignTop);
vlay->addSpacing(UiConfig::GetInstance()->getUiHeight() / 3);
vlay->addLayout(glayMid);
vlay->addStretch(100);
vlay->addWidget(m_btnCall, 1, Qt::AlignCenter | Qt::AlignBottom);
vlay->setContentsMargins(0, 10, 0, UiConfig::GetInstance()->getUiHeight() / 20);
setLayout(vlay);
m_timer = new QTimer(this);
connect(m_timer, SIGNAL(timeout()), this, SLOT(slotTimeout()));
m_tooltip = new CenterMsgWidget(this); // 不继承父组件样式
m_tooltip->hide();
m_tooltipTimer = new QTimer(this);
m_tooltipTimer->setSingleShot(true);
connect(m_tooltipTimer, &QTimer::timeout, this, &recoUiCallDial::onTooltipTimeout);
}
void recoUiCallDial::setToolip(const QString &message, int millisecondTimeout) {
if (m_tooltip != nullptr) {
m_tooltip->showMsg(message, 64);
m_tooltip->show();
m_tooltip->raise();
m_tooltipTimer->start(millisecondTimeout);
}
}
void recoUiCallDial::setPlatformConnected(bool connected) {
m_platformConnected = connected;
}
void recoUiCallDial::onTooltipTimeout(){
m_tooltip->hide();
}
void recoUiCallDial::reset()
{
m_editDevCode->clear();
m_timer->start(TIMEOUT);
m_backstageIf->stopIdentyState();
if(m_candidate){
delete m_candidate;
m_candidate = nullptr;
}
}
void recoUiCallDial::slotBtnClicked()
{
m_timer->start(TIMEOUT);
const QObject* send = sender();
if (send == m_btnCall) {
if (m_platformConnected) {
auto code = m_editDevCode->text();
if (code.isEmpty()) {
setToolip("号码不能为空", 1500);
} else {
auto iterator = std::find_if(m_devList.cbegin(), m_devList.cend(),
[&code](const stCallDev &device) { return device.code == code.toStdString(); });
if (iterator != m_devList.cend()) {
if (iterator->status == 0) {
setToolip("呼叫设备离线,请稍后重试", 1500);
} else {
m_timer->stop();
slotCall();
emit signalCallBtnPressed(QString::fromStdString(iterator->name));
}
} else {
setToolip("设备不存在", 1500);
}
}
} else {
setToolip("当前设备离线,请稍后重试", 1500);
}
}else if (send == m_btnBackspace) {
QString text = m_editDevCode->text();
if(text.size()){
m_editDevCode->setText(text.left(text.size() - 1));
}
}else if (send == m_btnBack) {
exit();
}else{
if(m_editDevCode->text().length() >= CODE_LEN_MAX){
return;
}
for(int i=0; i<NUM_BTNS_QTY; i++){
if(send == m_btnsNum[i]){
m_editDevCode->setText(m_editDevCode->text() + m_btnsNum[i]->text());
break;
}
}
}
if(UiConfig::GetInstance()->isRkDevice()){
update();
}
}
void recoUiCallDial::slotBtnPressed()
{
dynamic_cast<QPushButton*>(sender())->setStyleSheet(QString("QPushButton {"
"border: 0px;"
"}"
"QPushButton:pressed {"
"border: 0px;"
"background:url(%1);"
"background-repeat:none;"
"background-position:center;"
"}")
.arg(NUM_BTN[UiConfig::GetInstance()->getScreenConfigIndex()]));
}
void recoUiCallDial::slotBtnReleased()
{
dynamic_cast<QPushButton*>(sender())->setStyleSheet("background-color:transparent;border-radius:0px;focus{outline: none;}");
}
void recoUiCallDial::slotTimeout()
{
exit();
}
void recoUiCallDial::slotItemChoosed(int index) {
if (index < m_devList.size()) {
auto event = new AsyncEvent([=]() {
m_timer->start(TIMEOUT);
m_editDevCode->setText(QString::fromStdString(m_devList.at(index).code));
if (UiConfig::GetInstance()->isRkDevice()) {
update();
}
});
QCoreApplication::postEvent(this, event);
}
}
void recoUiCallDial::slotTextChanged(const QString& text)
{
m_devList.clear();
if(m_candidate){
delete m_candidate;
m_candidate = nullptr;
}
if(text.length() < CODE_LEN_MIN){
return;
}
m_backstageIf->queryCallDevList(text.toStdString(), m_devList);
QVector<myListWidget::SetOpnCfg> opns;
for(auto &item : m_devList){
QString dev{item.code.c_str()};
dev += "(";
dev += item.name.c_str();
if(item.status == 0){
dev += tr("-离线");
}
dev += ")";
opns.append(myListWidget::SetOpnCfg(dev));
}
showCandidate(opns);
}
void recoUiCallDial::slotCall() {
auto iterator = std::find_if(m_devList.cbegin(), m_devList.cend(),
[this](const stCallDev &device) { return device.code == m_editDevCode->text().toStdString(); });
if (iterator != m_devList.cend()) {
m_backstageIf->callDev(iterator->devTag, iterator->type);
}
}
void recoUiCallDial::showCandidate(const QVector<myListWidget::SetOpnCfg>& opns)
{
if(opns.size() == 0){
return;
}
m_candidate = new SearchBarCandidate(opns, 0, this);
m_candidate->setFixedSize(m_editDevCode->width(), m_editDevCode->height() * 5);
m_candidate->move(m_editDevCode->x(), m_editDevCode->y() + m_editDevCode->height() + 20);
m_candidate->show();
connect(m_candidate, SIGNAL(signalItemChoosed(int)), this, SLOT(slotItemChoosed(int)));
}
void recoUiCallDial::exit()
{
m_timer->stop();
emit signalShowRecognizePage();
}