From 67fd5c9acf2cce4864e1628d0e040cd404dc749c Mon Sep 17 00:00:00 2001 From: =?utf8?q?Juan=20Gonz=C3=A1lez?= Date: Mon, 14 Jan 2008 18:37:29 +0100 Subject: [PATCH] added a fancy animation to the login failure notification --- RFIDLoginManager/loginmanager.cpp | 42 ++++++++++++++++++++++++++++++++++----- RFIDLoginManager/loginmanager.h | 5 +++++ 2 files changed, 42 insertions(+), 5 deletions(-) diff --git a/RFIDLoginManager/loginmanager.cpp b/RFIDLoginManager/loginmanager.cpp index 1a852d3..5c08418 100644 --- a/RFIDLoginManager/loginmanager.cpp +++ b/RFIDLoginManager/loginmanager.cpp @@ -23,6 +23,7 @@ #include #include #include +#include #include #include @@ -55,13 +56,15 @@ extern "C" int Conversation(int num_msg, const pam_message **msg, return PAM_SUCCESS; } static struct pam_conv pam_conv = { Conversation, NULL }; + LoginManager::LoginManager ( QWidget* parent, Qt::WFlags fl ) : QWidget ( parent, fl ), Ui::Form(), backgroundItem(new QGraphicsPixmapItem()), text(new QGraphicsTextItem(backgroundItem)), failureNotification((new QGraphicsTextItem(backgroundItem))), - settings(new QSettings("opsiland","RFIDUserManager",this)) + settings(new QSettings("opsiland","RFIDUserManager",this)), + loginFailureAnimation(new QTimeLine(2000,this)) { setupUi ( this ); //TODO Make the serial port configurable from the manager... @@ -82,6 +85,9 @@ LoginManager::LoginManager ( QWidget* parent, Qt::WFlags fl ) failureNotification->setDefaultTextColor(QColor::fromRgb(255,0,0,200)); failureNotification->setPlainText("Login failed"); failureNotification->setVisible(false); + + QObject::connect(loginFailureAnimation,SIGNAL(frameChanged( int )),this,SLOT(slotAnimateLoginFailure(int))); + QObject::connect(loginFailureAnimation,SIGNAL(finished()),this,SLOT(slotHideFailure())); QObject::connect(&control,SIGNAL(readPublicModeDone(int, const QString&, const QString&)),this,SLOT(slotReadPublicModeDone(int, const QString&, const QString&))); control.readPublicModeA(); @@ -102,9 +108,11 @@ void LoginManager::resizeEvent(QResizeEvent * event) passwordItem->setPos((size.width()-passItemBounds.width())/2,2*text->boundingRect().height()); text->setPos((size.width()-text->boundingRect().width())/2,0); - failureNotification->setPos((size.width()-failureNotification->boundingRect().width())/2,2*text->boundingRect().height()+passwordItem->boundingRect().height()); + failureNotification->setPos(-failureNotification->boundingRect().width()/*(size.width()-failureNotification->boundingRect().width())/2*/,2*text->boundingRect().height()+passwordItem->boundingRect().height()); g->setSceneRect(0,0,size.width(),size.height()); + + loginFailureAnimation->setFrameRange((int)-failureNotification->boundingRect().width(),(int)(size.width()-failureNotification->boundingRect().width())/2); } void LoginManager::setBackgroundImage(const QString & filePath) @@ -129,21 +137,30 @@ void LoginManager::keyPressEvent(QKeyEvent * event) } passwordItem->setPasswordLength(0); currentPassword=""; - failureNotification->setVisible(false); + loginFailureAnimation->setDirection(QTimeLine::Backward); + if (loginFailureAnimation->state()!=QTimeLine::Running && failureNotification->isVisible()) { + loginFailureAnimation->start(); + } break; case Qt::Key_Backspace: passwordItem->setPasswordLength(passwordItem->passwordLength()-1); if (currentPassword.length()>0) { currentPassword.remove(currentPassword.length()-1,1); } - failureNotification->setVisible(false); + loginFailureAnimation->setDirection(QTimeLine::Backward); + if (loginFailureAnimation->state()!=QTimeLine::Running && failureNotification->isVisible()) { + loginFailureAnimation->start(); + } break; default: QString text = event->text(); if (!text.isEmpty()) { passwordItem->setPasswordLength(passwordItem->passwordLength()+1); currentPassword.append(text); - failureNotification->setVisible(false); + loginFailureAnimation->setDirection(QTimeLine::Backward); + if (loginFailureAnimation->state()!=QTimeLine::Running && failureNotification->isVisible()) { + loginFailureAnimation->start(); + } } } QRectF passItemBounds = passwordItem->boundingRect(); @@ -202,6 +219,10 @@ void LoginManager::doLogin() if(ret != PAM_SUCCESS) { + loginFailureAnimation->setDirection(QTimeLine::Forward); + if (loginFailureAnimation->state()!=QTimeLine::Running) { + loginFailureAnimation->start(); + } failureNotification->setVisible(true); pam_end(pamh, PAM_AUTH_ERR); pam_close_session(pamh,0); @@ -228,5 +249,16 @@ void LoginManager::doLogin() } +void LoginManager::slotAnimateLoginFailure(int xPos) +{ + failureNotification->setPos(xPos,failureNotification->pos().y()); +} + +void LoginManager::slotHideFailure() +{ + if(loginFailureAnimation->currentFrame() == loginFailureAnimation->frameForTime(0)) + failureNotification->setVisible(false); +} + diff --git a/RFIDLoginManager/loginmanager.h b/RFIDLoginManager/loginmanager.h index 6bad6c2..1629e0f 100644 --- a/RFIDLoginManager/loginmanager.h +++ b/RFIDLoginManager/loginmanager.h @@ -22,6 +22,8 @@ class QGraphicsPixmapItem; class PasswordItem; class QGraphicsTextItem; class QSettings; +class QTimeLine; + class LoginManager : public QWidget, private Ui::Form { Q_OBJECT @@ -48,9 +50,12 @@ class LoginManager : public QWidget, private Ui::Form Rdw125Control control; QSettings *settings; QString activeCard; + QTimeLine *loginFailureAnimation; protected slots: void slotReadPublicModeDone(int correct, const QString &hexData, const QString &decData); + void slotAnimateLoginFailure(int yPos); + void slotHideFailure(); }; #endif -- 2.11.4.GIT