Added Caps Lock check and warning at askpassphrasedialog.
authorNick Bosma <nick.bosma@gmail.com>
Sat, 15 Oct 2011 18:56:06 +0000 (20:56 +0200)
committerNick Bosma <nick.bosma@gmail.com>
Tue, 18 Oct 2011 14:07:52 +0000 (16:07 +0200)
src/qt/askpassphrasedialog.cpp
src/qt/askpassphrasedialog.h
src/qt/forms/askpassphrasedialog.ui

index a297513..f55491f 100644 (file)
@@ -6,17 +6,25 @@
 
 #include <QMessageBox>
 #include <QPushButton>
+#include <QKeyEvent>
 
 AskPassphraseDialog::AskPassphraseDialog(Mode mode, QWidget *parent) :
     QDialog(parent),
     ui(new Ui::AskPassphraseDialog),
     mode(mode),
-    model(0)
+    model(0),
+    fCapsLock(false)
 {
     ui->setupUi(this);
     ui->passEdit1->setMaxLength(MAX_PASSPHRASE_SIZE);
     ui->passEdit2->setMaxLength(MAX_PASSPHRASE_SIZE);
     ui->passEdit3->setMaxLength(MAX_PASSPHRASE_SIZE);
+    
+    // Setup Caps Lock detection.
+    ui->passEdit1->installEventFilter(this);
+    ui->passEdit2->installEventFilter(this);
+    ui->passEdit3->installEventFilter(this);
+    ui->capsLabel->clear();
 
     switch(mode)
     {
@@ -184,3 +192,46 @@ void AskPassphraseDialog::textChanged()
     }
     ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(acceptable);
 }
+
+bool AskPassphraseDialog::event(QEvent *event)
+{
+    // Detect Caps Lock key press.
+    if (event->type() == QEvent::KeyPress) {
+        QKeyEvent *ke = static_cast<QKeyEvent *>(event);
+        if (ke->key() == Qt::Key_CapsLock) {
+            fCapsLock = !fCapsLock;
+        }
+        if (fCapsLock) {
+            ui->capsLabel->setText(tr("Warning: The Caps Lock key is on."));
+        } else {
+            ui->capsLabel->clear();
+        }
+    }
+    return QWidget::event(event);
+}
+
+bool AskPassphraseDialog::eventFilter(QObject *, QEvent *event)
+{
+    /* Detect Caps Lock. 
+     * There is no good OS-independent way to check a key state in Qt, but we
+     * can detect Caps Lock by checking for the following condition:
+     * Shift key is down and the result is a lower case character, or
+     * Shift key is not down and the result is an upper case character.
+     */
+    if (event->type() == QEvent::KeyPress) {
+        QKeyEvent *ke = static_cast<QKeyEvent *>(event);
+        QString str = ke->text();
+        if (str.length() != 0) {
+            const QChar *psz = str.unicode();
+            bool fShift = (ke->modifiers() & Qt::ShiftModifier) != 0;
+            if ((fShift && psz->isLower()) || (!fShift && psz->isUpper())) {
+                fCapsLock = true;
+                ui->capsLabel->setText(tr("Warning: The Caps Lock key is on."));
+            } else if (psz->isLetter()) {
+                fCapsLock = false;
+                ui->capsLabel->clear();
+            }
+        }
+    }
+    return false;
+}
index 761612c..0c70891 100644 (file)
@@ -32,9 +32,12 @@ private:
     Ui::AskPassphraseDialog *ui;
     Mode mode;
     WalletModel *model;
+    bool fCapsLock;
 
 private slots:
     void textChanged();
+    bool event(QEvent *event);
+    bool eventFilter(QObject *, QEvent *event);
 };
 
 #endif // ASKPASSPHRASEDIALOG_H
index 70d9180..f1f2ef3 100644 (file)
@@ -7,7 +7,7 @@
     <x>0</x>
     <y>0</y>
     <width>589</width>
-    <height>228</height>
+    <height>239</height>
    </rect>
   </property>
   <property name="sizePolicy">
        </property>
       </widget>
      </item>
+     <item row="4" column="1">
+      <widget class="QLabel" name="capsLabel">
+       <property name="styleSheet">
+        <string notr="true">#capsLabel {
+       font: bold;
+}</string>
+       </property>
+       <property name="text">
+        <string>TextLabel</string>
+       </property>
+       <property name="alignment">
+        <set>Qt::AlignCenter</set>
+       </property>
+      </widget>
+     </item>
     </layout>
    </item>
    <item>