177 lines
5.1 KiB
C++
177 lines
5.1 KiB
C++
/*
|
|
* Copyright (C) 2018 Tianjin KYLIN Information Technology Co., Ltd.
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 3, or (at your option)
|
|
* any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
|
*
|
|
* Authors: ZHAI Kang-ning <zhaikangning@kylinos.cn>
|
|
**/
|
|
#ifndef DIGITALAUTHDIALOG_H
|
|
#define DIGITALAUTHDIALOG_H
|
|
|
|
#include <QWidget>
|
|
#include <QPaintEvent>
|
|
#include <QPainter>
|
|
#include <QMouseEvent>
|
|
#include <QPushButton>
|
|
#include <QLabel>
|
|
#include "auth.h"
|
|
#include "digitalkeyboard.h"
|
|
#include <QTimer>
|
|
|
|
class Auth;
|
|
class MyLabel;
|
|
|
|
class DigitalAuthDialog : public QWidget
|
|
{
|
|
Q_OBJECT
|
|
public:
|
|
struct PosInCircle
|
|
{
|
|
int i; //行
|
|
int j; //列
|
|
bool isIn; //是否在范围内
|
|
};
|
|
|
|
enum LoginType{
|
|
AUTHENTICATE = 0,
|
|
RESET,
|
|
SECONDCONFIRMATION,
|
|
};
|
|
|
|
explicit DigitalAuthDialog(QWidget *parent = nullptr);
|
|
~DigitalAuthDialog();
|
|
|
|
void setPassword(const QString password);
|
|
QString getPassword();
|
|
bool checkPassword();
|
|
void reset();
|
|
void showResetPasswordPage();
|
|
int getStatus();
|
|
void showErrorMessage(QString message);
|
|
// void RecieveKey(int key);
|
|
protected:
|
|
void paintEvent(QPaintEvent *event) override;
|
|
void mouseMoveEvent(QMouseEvent *event) override;
|
|
void mousePressEvent(QMouseEvent *event) override;
|
|
void mouseReleaseEvent(QMouseEvent *event) override;
|
|
void keyPressEvent(QKeyEvent *event) override;
|
|
void closeEvent(QCloseEvent *evert) override;
|
|
|
|
void drawBg(QPainter *painter);
|
|
void drawOutCircle(QPainter *painter);
|
|
void drawFilledCircle(QPainter *painter);
|
|
void drawTipLine(QPainter *painter);
|
|
void drawInCircle(QPainter *painter);
|
|
void drawJoinLine(QPainter *painter);
|
|
void drawStatusCircle(QPainter *painter);
|
|
void drawHoverCircle(QPainter *painter);
|
|
private:
|
|
/**
|
|
* 圆形按钮,测量距离中心的距离
|
|
* @brief distance
|
|
* @param x1
|
|
* @param y1
|
|
* @param x2 圆心x坐标
|
|
* @param y2 圆心y坐标
|
|
* @return
|
|
*/
|
|
double distance(int x1, int y1, int x2, int y2);
|
|
|
|
bool isInButtonArea(int x1, int y1, int x2, int y2);
|
|
int posToNumber(int i, int j);
|
|
|
|
// void onShowMessage(const QString &message);
|
|
void cleanMessage();
|
|
|
|
void startWaiting();
|
|
void stopWaiting();
|
|
Q_SIGNALS:
|
|
void correctPassword(bool isCorrect, QString password);
|
|
void authenticateCompete(bool result);
|
|
void requestPasswordReset();
|
|
void setPinCode(QString pinCode);
|
|
void switchToReset(bool isReset);
|
|
private Q_SLOTS:
|
|
void onShowMessage(const QString &message, Auth::MessageType type);
|
|
void onShowPrompt(const QString &prompt, Auth::PromptType type);
|
|
void onAuthComplete();
|
|
public Q_SLOTS:
|
|
void startAuth();
|
|
void stopAuth();
|
|
void onNumerPress(int btn_id);
|
|
private:
|
|
QColor m_bgColor; //背景色
|
|
QColor m_outCircleColor; //外圆颜色
|
|
QColor m_tipLineColor; //提示线颜色
|
|
QColor m_circleRingColor; //圆环颜色
|
|
QColor m_circleColor; //实心圆颜色
|
|
int m_margin; //外边距
|
|
int m_radius; //圆相对半径
|
|
int m_buttonRadius; //按钮圆角半径
|
|
int m_buttonWidth; //按钮宽度
|
|
int m_buttonHeight; //按钮高度
|
|
int m_buttonStep; //按钮间距
|
|
PosInCircle m_posInCircle; //判断点是否在圆内
|
|
bool m_pressed; //鼠标按下
|
|
bool m_showText; //是否显示文字
|
|
|
|
QVector<QPoint> m_vecInputPoints; //鼠标移动选点
|
|
QPoint m_followPoint; //鼠标跟随点
|
|
QString m_password; //原密码
|
|
QString m_inputPassword; //鼠标移动选点转换为密码
|
|
|
|
//label
|
|
QLabel *m_title;
|
|
MyLabel *m_labelReset;
|
|
|
|
//密码状态更新布局
|
|
int m_statusRadius;
|
|
|
|
//认证中?
|
|
bool m_isAuthing;
|
|
|
|
//数字键盘
|
|
DigitalKeyBoard *m_digitalKeyBoard;
|
|
|
|
/**
|
|
* 二次认证相关成员变量
|
|
*/
|
|
int m_loginType = LoginType::AUTHENTICATE;
|
|
QString m_resetPassword;
|
|
QLabel *m_resetOrAuthFailure;
|
|
|
|
QLabel *m_authMessage;
|
|
|
|
//pam auth
|
|
Auth *m_auth;
|
|
|
|
// QTimer *m_timer;
|
|
};
|
|
|
|
class MyLabel : public QLabel{
|
|
Q_OBJECT
|
|
public:
|
|
MyLabel(const QString & text, QWidget *parent);
|
|
MyLabel(QWidget *parent);
|
|
|
|
Q_SIGNALS:
|
|
void onClick();
|
|
|
|
protected:
|
|
void mouseReleaseEvent(QMouseEvent *event) override;
|
|
void mousePressEvent(QMouseEvent *event) override;
|
|
};
|
|
|
|
#endif // DIGITALAUTHDIALOG_H
|