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

423 lines
17 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "recoUiPassword.h"
#include <QDebug>
#include <QPainter>
const int recoUiPassword::PERSON_NAME_FONT_SIZE[UiConfig::SUPPORT_SCREEN_SIZE_QUANTITY][UiConfig::SUPPORT_LANGUAGE_QUANTITY] = {
{24, 20, 14, 15, 12, 15, 14, 13, 9, 12, 10, 13, 13, 9},
{48, 40, 28, 30, 24, 30, 28, 26, 19, 26, 22, 26, 26, 19},
{48, 40, 28, 30, 24, 30, 28, 26, 19, 26, 22, 26, 26, 19},
{16, 16, 10, 12, 10, 12, 11, 10, 8, 10, 9, 10, 10, 8},
{16, 16, 10, 12, 10, 12, 11, 10, 8, 10, 9, 10, 10, 8}
};
const int recoUiPassword::WEL_MSG_FONT_SIZE[UiConfig::SUPPORT_SCREEN_SIZE_QUANTITY][UiConfig::SUPPORT_LANGUAGE_QUANTITY] = {
{16, 20, 14, 15, 12, 15, 14, 13, 9, 12, 10, 13, 13, 9},
{32, 40, 28, 30, 24, 30, 28, 26, 19, 26, 22, 26, 26, 19},
{32, 40, 28, 30, 24, 30, 28, 26, 19, 26, 22, 26, 26, 19},
{12, 12, 11, 12, 10, 12, 11, 10, 8, 10, 9, 10, 10, 8},
{12, 12, 11, 12, 10, 12, 11, 10, 8, 10, 9, 10, 10, 8}
};
const int recoUiPassword::PASSWORD_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 recoUiPassword::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 recoUiPassword::CONFIRM_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 recoUiPassword::PWD_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 recoUiPassword::CONFIRM_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 recoUiPassword::CONFIRM_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 recoUiPassword::CONFIRM_BTN_W[UiConfig::SUPPORT_SCREEN_SIZE_QUANTITY] = {344, 430, 430, 430, 430};
const int recoUiPassword::CONFIRM_BTN_H[UiConfig::SUPPORT_SCREEN_SIZE_QUANTITY] = {72, 90, 90, 90, 90};
const QString recoUiPassword::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 recoUiPassword::BACK_BTN_W[UiConfig::SUPPORT_SCREEN_SIZE_QUANTITY] = {20, 24, 24, 24, 24};
const int recoUiPassword::BACK_BTN_H[UiConfig::SUPPORT_SCREEN_SIZE_QUANTITY] = {35, 44, 44, 44, 44};
const QString recoUiPassword::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 recoUiPassword::DEL_BTN_W[UiConfig::SUPPORT_SCREEN_SIZE_QUANTITY] = {344, 35, 35, 35, 35};
const int recoUiPassword::DEL_BTN_H[UiConfig::SUPPORT_SCREEN_SIZE_QUANTITY] = {344, 24, 24, 24, 24};
const QString recoUiPassword::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"
};
recoUiPassword::recoUiPassword(QWidget *parent) : WidgetWithBackstageInterface(parent)
{
qDebug() << "recoUiPassword()";
resize(UiConfig::GetInstance()->getUiWidth(), UiConfig::GetInstance()->getUiHeight());
setAutoFillBackground(true);
QPalette palette(this->palette());
palette.setBrush(QPalette::Window,QBrush(QPixmap(PWD_BG[UiConfig::GetInstance()->getScreenConfigIndex()])));
setPalette(palette);
const int btnWidth = UiConfig::GetInstance()->getUiWidth() / 5;
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()));
QPalette labelPal;
labelPal.setColor(QPalette::Background,QColor(0, 0, 0, 0));
QFont ft;
ft.setWeight(ft.weight() * 2 > 99 ? 99 : ft.weight() * 2);//Weight must be between 0 and 99
//ft.setBold(true);
m_labelName = new QLabel(this);
//m_labelName->setText(tr("某某某"));
m_labelName->setPalette(labelPal);
ft.setPointSize(PERSON_NAME_FONT_SIZE[UiConfig::GetInstance()->getScreenConfigIndex()][UiConfig::GetInstance()->getLanguageType()]);
m_labelName->setFont(ft);
m_labelName->hide();
m_labelWelStr = new QLabel(this);
m_labelWelStr->setText(tr("欢迎光临"));
labelPal.setColor(QPalette::WindowText,QColor(203, 242, 252));
m_labelWelStr->setPalette(labelPal);
ft.setPointSize(WEL_MSG_FONT_SIZE[UiConfig::GetInstance()->getScreenConfigIndex()][UiConfig::GetInstance()->getLanguageType()]);
m_labelWelStr->setFont(ft);
m_labelWelStr->hide();
if(UiConfig::GetInstance()->isRkDevice()){
m_editPwd = new QPasswordLineEdit(this, ".");
}
else{
m_editPwd = new QPasswordLineEdit(this);
}
m_editPwd->setReadOnly(true);
QPalette lineEditPal;
lineEditPal.setColor(QPalette::Text,QColor(255, 255, 255, 255));
m_editPwd->setPalette(lineEditPal);
ft.setPointSize(PASSWORD_FONT_SIZE[UiConfig::GetInstance()->getScreenConfigIndex()][UiConfig::GetInstance()->getLanguageType()]);
m_editPwd->setFont(ft);
m_editPwd->setStyleSheet("background:transparent;border-width:0;border-style:outset");
m_editPwd->setAlignment(Qt::AlignCenter);
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;}");
/*const QString numBtnStyle = QString("QPushButton {"
"border: 0px;"
"background-color:transparent;"
"background:url(%1);"
"}"
"QPushButton:hover { "
"border: 0px;"
"background:url(%2);"
"background-repeat:none;"
"background-position:center;"
"}"
"QPushButton:pressed {"
"border: 0px;"
"background:url(%3);"
"background-repeat:none;"
"background-position:center;"
//"background-origin: content;" // 设置背景图片基于content默认是基于border的
//"padding-left: 8px;" //设置content相对于border的偏移如果此属性要对背景图片生效的话需要设置上面的属性
"}")
.arg(":/res/image/num_btn_large.png")
.arg(":/res/image/num_btn_large.png")
.arg(":/res/image/num_btn_large.png");
m_btnsNum[i]->setStyleSheet(numBtnStyle);
m_btnsNum[i]->setStyleSheet("QPushButton {"
"font-size:100px;"
"color:yellow; "
"border-radius:150px;" //圆角大小因为矩形的一半为150所以圆角大小 设置为150以后将会成为一个原型小于150就是圆角矩形了。
"background-color:rgba(0,255,0,200);" //设置按钮背景为绿色
"}"
"QPushButton:hover { "
"font-size:100px;"
"color:green;"
"border-radius:150px;"
"background-color:rgba(255,255,0,200);" //设置按钮背景为黄色 = 红+绿
"}"
"QPushButton:pressed {"
"color:orange; "
"border-width:3;"
"border-radius:150px;"
"border-color:orange;"
"border-style:solid;"
"background-color:cyan;"
"}");
*/
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()));
//m_btnClear = new QPushButton(this);
//m_btnClear->setText(tr("清空"));
//connect(m_btnClear, SIGNAL(clicked()), this, SLOT(slotBtnClicked()));
//glayMid->addWidget(m_btnClear, 3, 0);
glayMid->addWidget(m_btnsNum[0], 3, 1);
glayMid->addWidget(m_btnBackspace, 3, 2);
m_btnConfirm = new QPushButton(this);
m_btnConfirm->setText(tr("确认"));
m_btnConfirm->setPalette(btnPal);
m_btnConfirm->setFlat(true);
m_btnConfirm->setCursor(QCursor(Qt::PointingHandCursor));
m_btnConfirm->setFocusPolicy(Qt::NoFocus);
m_btnConfirm->setFixedSize(CONFIRM_BTN_W[UiConfig::GetInstance()->getScreenConfigIndex()],
UiConfig::GetInstance()->isRkDevice() ?
(CONFIRM_BTN_H[UiConfig::GetInstance()->getScreenConfigIndex()] >> 2 << 2) :
CONFIRM_BTN_H[UiConfig::GetInstance()->getScreenConfigIndex()]);
ft.setWeight(ft.weight() * 2 > 99 ? 99 : ft.weight() * 2);//Weight must be between 0 and 99
ft.setPointSize(CONFIRM_BTN_FONT_SIZE[UiConfig::GetInstance()->getScreenConfigIndex()][UiConfig::GetInstance()->getLanguageType()]);
m_btnConfirm->setFont(ft);
#if 1
const QString confirmBtnStyle = QString("background-color:transparent;"
"color:white;"
"border-image: url(%1);"
)
.arg(CONFIRM_BTN_BG[UiConfig::GetInstance()->getScreenConfigIndex()]);
#else
QString confirmBtnStyle = QString("QPushButton{background:url(%1); background-color:transparent;border: none; }" //正常
"QPushButton:hover{background:url(%2); background-color:transparent; }" //滑过
"QPushButton:pressed{background:url(%3); background-color:transparent; }") //按下
.arg(CONFIRM_BTN_BG[UiConfig::GetInstance()->getScreenConfigIndex()])
.arg(CONFIRM_BTN_DISABLE_BG[UiConfig::GetInstance()->getScreenConfigIndex()])
.arg(CONFIRM_BTN_DISABLE_BG[UiConfig::GetInstance()->getScreenConfigIndex()]);
#endif
//qDebug() << "confirmBtnStyle:" << confirmBtnStyle;
m_btnConfirm->setStyleSheet(confirmBtnStyle);
connect(m_btnConfirm, SIGNAL(clicked()), this, SLOT(slotBtnClicked()));
QVBoxLayout* vlay = new QVBoxLayout();
vlay->addWidget(m_btnBack, 1, Qt::AlignLeft | Qt::AlignTop);
vlay->addWidget(m_labelName, 1, Qt::AlignCenter | Qt::AlignTop);
vlay->addWidget(m_labelWelStr, 1, Qt::AlignCenter | Qt::AlignTop);
vlay->addWidget(m_editPwd, 80, Qt::AlignCenter | Qt::AlignBottom);
vlay->addLayout(glayMid);
vlay->addWidget(m_btnConfirm, 1, Qt::AlignCenter | Qt::AlignTop);
vlay->setContentsMargins(0, 10, 0, (UiConfig::GetInstance()->getUiHeight() / 12) >> 1 << 1);
//vlay->setMargin(0);
setLayout(vlay);
m_timer = new QTimer(this);
connect(m_timer, SIGNAL(timeout()), this, SLOT(slotTimeout()));
}
void recoUiPassword::reset(const QString& name)
{
m_editPwd->clear();
m_pwd.clear();
m_timeCnt = 0;
m_tryTime = 0;
m_timer->start(TIMEOUT);
m_btnConfirm->setEnabled(false);
slotShowPwdUiPersonName(name);
//m_backstageIf->pauseDataFlow();
m_backstageIf->stopIdentyState();
m_need2ResetDecisionCenterTimer = !name.isEmpty();
}
void recoUiPassword::slotBtnClicked()
{
qDebug() << "slotBtnClicked";
const QObject* send = sender();
if (send == m_btnConfirm) {
m_timeCnt = 0;
qDebug() << "password:" << m_pwd;
m_backstageIf->sendPassword(m_pwd.toStdString().c_str());
m_editPwd->clear();
m_pwd.clear();
m_btnConfirm->setEnabled(false);
m_timer->stop();
m_tryTime++;
if(m_tryTime >= TRY_TIME){
emit signalShowRecognizePage();
//m_backstageIf->resumeDataFlow();
}
}
else if (send == m_btnBackspace) {
m_timeCnt = 0;
QString text = m_editPwd->text();
if(text.size()){
m_pwd = m_pwd.left(m_pwd.size() - 1);
m_editPwd->setText(text.left(text.size() - 1));
m_btnConfirm->setEnabled(m_editPwd->text().length() >= PWD_LEN_MIN);
}
}
//else if (send == m_btnClear) {
//m_editPwd->clear();
//}
else if (send == m_btnBack) {
emit signalShowRecognizePage();
m_timer->stop();
//m_backstageIf->resumeDataFlow();
m_backstageIf->verifyAbort();
}
else{
m_timeCnt = 0;
if(m_editPwd->text().length() >= PWD_LEN_MAX){
return;
}
for(int i=0; i<NUM_BTNS_QTY; i++){
if(send == m_btnsNum[i]){
if(m_pwd.isEmpty() && m_tryTime){
m_labelName->hide();
m_labelWelStr->hide();
}
m_pwd += m_btnsNum[i]->text();
m_editPwd->setText(m_editPwd->text() + m_btnsNum[i]->text());
m_btnConfirm->setEnabled(m_editPwd->text().length() >= PWD_LEN_MIN);
break;
}
}
}
if(UiConfig::GetInstance()->isRkDevice()){
update();
}
}
void recoUiPassword::slotBtnPressed()
{
const QString numBtnStyle = QString("QPushButton {"
"border: 0px;"//"background-color:transparent;"
"}"
"QPushButton:pressed {"
"border: 0px;"
"background:url(%1);"
"background-repeat:none;"
"background-position:center;"
"}")
.arg(NUM_BTN[UiConfig::GetInstance()->getScreenConfigIndex()]);
dynamic_cast<QPushButton*>(sender())->setStyleSheet(numBtnStyle);
}
void recoUiPassword::slotBtnReleased()
{
qDebug() << "slotBtnReleased";
dynamic_cast<QPushButton*>(sender())->setStyleSheet("background-color:transparent;border-radius:0px;focus{outline: none;}");
}
void recoUiPassword::slotTimeout()
{
m_timeCnt++;
qDebug() << "slotTimeout:" << m_timeCnt;
if(m_need2ResetDecisionCenterTimer && m_timeCnt < (PROC_OVERTIME - BACKSTAGE_PROC_OVERTIME) ){
m_backstageIf->resetDecisionCenterTimer();
}
else if(m_timeCnt >= PROC_OVERTIME){
m_timer->stop();
emit signalShowRecognizePage();
//m_backstageIf->resumeDataFlow();
}
}
void recoUiPassword::slotShowPwdUiPersonName(const QString& name)
{
if(name.isEmpty()){
m_labelName->hide();
m_labelWelStr->hide();
}
else{
m_labelName->setText(name);
m_labelName->setStyleSheet("color:#CBF2FC;");
m_labelName->show();
m_labelWelStr->show();
}
}
void recoUiPassword::slotShowUserPwdError(int type, int color)
{
m_timer->start();
switch(type){
case 0:
m_labelName->setText(tr("密码错误"));
if(0 == color){
m_labelName->setStyleSheet("color:#DB1624;");
}
m_labelWelStr->hide();
m_labelName->show();
break;
default:
break;
}
}