From 83682370bdf2e50fd83bc005b1505213a9612ab4 Mon Sep 17 00:00:00 2001 From: Lubos Dolezel Date: Fri, 5 Jun 2015 15:18:11 +0200 Subject: Visual DTMF feedback, clipboard support (fixes #4 and #5) --- CMakeLists.txt | 2 +- src/gui/dtmfform.cpp | 218 +++++--- src/gui/dtmfform.h | 9 +- src/gui/dtmfform.ui | 1457 +++++++++++++++++++++++++++----------------------- 4 files changed, 938 insertions(+), 748 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 769c440..8df0546 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,7 +4,7 @@ cmake_minimum_required(VERSION 2.6.0 FATAL_ERROR) set(PRODUCT_VERSION "1.9.0") set(PRODUCT_DATE "June 1, 2015") -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -ggdb -O0") OPTION(WITH_ZRTP "Enable ZRTP encrypted calls" OFF) OPTION(WITH_SPEEX "Enable the Speex codec" OFF) diff --git a/src/gui/dtmfform.cpp b/src/gui/dtmfform.cpp index bd61830..d5d02d9 100644 --- a/src/gui/dtmfform.cpp +++ b/src/gui/dtmfform.cpp @@ -1,4 +1,6 @@ #include "dtmfform.h" +#include +#include /* * Constructs a DtmfForm which is a child of 'parent', with the @@ -11,6 +13,12 @@ DtmfForm::DtmfForm(QWidget* parent) : QDialog(parent) { setupUi(this); + + // Speed 40/40 (i.e. one tone every 80ms) + m_insertTimer.setInterval(80); + m_insertTimer.setSingleShot(false); + + connect(&m_insertTimer, SIGNAL(timeout()), this, SLOT(insertNextKey())); } /* @@ -105,71 +113,149 @@ void DtmfForm::dtmfD() void DtmfForm::keyPressEvent(QKeyEvent *e) { // DTMF keys - switch (e->key()) { - case Qt::Key_1: - dtmf1(); - break; - case Qt::Key_2: - case Qt::Key_A: - case Qt::Key_B: - case Qt::Key_C: - dtmf2(); - break; - case Qt::Key_3: - case Qt::Key_D: - case Qt::Key_E: - case Qt::Key_F: - dtmf3(); - break; - case Qt::Key_4: - case Qt::Key_G: - case Qt::Key_H: - case Qt::Key_I: - dtmf4(); - break; - case Qt::Key_5: - case Qt::Key_J: - case Qt::Key_K: - case Qt::Key_L: - dtmf5(); - break; - case Qt::Key_6: - case Qt::Key_M: - case Qt::Key_N: - case Qt::Key_O: - dtmf6(); - break; - case Qt::Key_7: - case Qt::Key_P: - case Qt::Key_Q: - case Qt::Key_R: - case Qt::Key_S: - dtmf7(); - break; - case Qt::Key_8: - case Qt::Key_T: - case Qt::Key_U: - case Qt::Key_V: - dtmf8(); - break; - case Qt::Key_9: - case Qt::Key_W: - case Qt::Key_X: - case Qt::Key_Y: - case Qt::Key_Z: - dtmf9(); - break; - case Qt::Key_0: - case Qt::Key_Space: - dtmf0(); - break; - case Qt::Key_Asterisk: - dtmfStar(); - break; - case Qt::Key_NumberSign: - dtmfPound(); - break; - default: - e->ignore(); + if ((e->modifiers() & (Qt::ControlModifier | Qt::AltModifier | Qt::MetaModifier)) + == Qt::NoModifier) + { + switch (e->key()) { + case Qt::Key_1: + onePushButton->animateClick(); + break; + case Qt::Key_2: + case Qt::Key_A: + case Qt::Key_B: + case Qt::Key_C: + twoPushButton->animateClick(); + break; + case Qt::Key_3: + case Qt::Key_D: + case Qt::Key_E: + case Qt::Key_F: + threePushButton->animateClick(); + dtmf3(); + break; + case Qt::Key_4: + case Qt::Key_G: + case Qt::Key_H: + case Qt::Key_I: + fourPushButton->animateClick(); + break; + case Qt::Key_5: + case Qt::Key_J: + case Qt::Key_K: + case Qt::Key_L: + fivePushButton->animateClick(); + break; + case Qt::Key_6: + case Qt::Key_M: + case Qt::Key_N: + case Qt::Key_O: + sixPushButton->animateClick(); + break; + case Qt::Key_7: + case Qt::Key_P: + case Qt::Key_Q: + case Qt::Key_R: + case Qt::Key_S: + sevenPushButton->animateClick(); + break; + case Qt::Key_8: + case Qt::Key_T: + case Qt::Key_U: + case Qt::Key_V: + eightPushButton->animateClick(); + break; + case Qt::Key_9: + case Qt::Key_W: + case Qt::Key_X: + case Qt::Key_Y: + case Qt::Key_Z: + ninePushButton->animateClick(); + break; + case Qt::Key_0: + case Qt::Key_Space: + zeroPushButton->animateClick(); + break; + case Qt::Key_Asterisk: + starPushButton->animateClick(); + break; + case Qt::Key_NumberSign: + poundPushButton->animateClick(); + break; + default: + e->ignore(); + } + } + else if ((e->modifiers() == Qt::ShiftModifier && e->key() == Qt::Key_Insert) + || (e->modifiers() == Qt::ControlModifier && e->key() == Qt::Key_V)) + { + // Insert from clipboard + QClipboard *clipboard = QApplication::clipboard(); + QString text = clipboard->text(); + + if (!text.isEmpty()) + { + m_remainingKeys = text; + insertNextKey(); + m_insertTimer.start(); + } } } + +void DtmfForm::insertNextKey() +{ + QChar key; + bool keyValid; + + do + { + keyValid = true; + key = m_remainingKeys[0].toLower(); + m_remainingKeys = m_remainingKeys.mid(1); + + switch (key.toLatin1()) { + case '0': + zeroPushButton->animateClick(); + break; + case '1': + onePushButton->animateClick(); + break; + case '2': + twoPushButton->animateClick(); + break; + case '3': + threePushButton->animateClick(); + break; + case '4': + fourPushButton->animateClick(); + break; + case '5': + fivePushButton->animateClick(); + break; + case '6' : + sixPushButton->animateClick(); + break; + case '7': + sevenPushButton->animateClick(); + break; + case '8': + eightPushButton->animateClick(); + break; + case '9': + ninePushButton->animateClick(); + break; + case '#': + poundPushButton->animateClick(); + break; + case '*': + starPushButton->animateClick(); + break; + default: + keyValid = false; + break; + } + } + while (!keyValid); + + if (m_remainingKeys.isEmpty()) + m_insertTimer.stop(); +} diff --git a/src/gui/dtmfform.h b/src/gui/dtmfform.h index a9c6b45..82ad117 100644 --- a/src/gui/dtmfform.h +++ b/src/gui/dtmfform.h @@ -3,6 +3,7 @@ #include #include +#include #include "ui_dtmfform.h" class DtmfForm : public QDialog, private Ui::DtmfForm @@ -30,10 +31,16 @@ public slots: void dtmfB(); void dtmfC(); void dtmfD(); - void keyPressEvent(QKeyEvent* e); + void insertNextKey(); + +protected: + void keyPressEvent(QKeyEvent* e); signals: void digits(const QString&); +private: + QTimer m_insertTimer; + QString m_remainingKeys; }; #endif // DTMFFORM_H diff --git a/src/gui/dtmfform.ui b/src/gui/dtmfform.ui index 0afc026..ceac3b5 100644 --- a/src/gui/dtmfform.ui +++ b/src/gui/dtmfform.ui @@ -1,685 +1,782 @@ - - - - - DtmfForm - - - - 0 - 0 - 350 - 302 - - - - - 5 - 5 - 0 - 0 - - - - Twinkle - DTMF - - - - - - Keypad - - - - - - - 10 - - - - - - - - :/icons/images/dtmf-2.png:/icons/images/dtmf-2.png - - - - 22 - 22 - - - - 2 - - - - - - - - 10 - - - - - - - - :/icons/images/dtmf-3.png:/icons/images/dtmf-3.png - - - - 22 - 22 - - - - 3 - - - - - - - - - - - :/icons/images/dtmf-a.png:/icons/images/dtmf-a.png - - - - 22 - 22 - - - - Over decadic A. Normally not needed. - - - - - - - - 194 - 202 - 210 - - - - - - - - - 194 - 202 - 210 - - - - - - - - - 194 - 202 - 210 - - - - - - - - - - - - - - - - :/icons/images/dtmf-4.png:/icons/images/dtmf-4.png - - - - 22 - 22 - - - - 4 - - - - - - - - - - - :/icons/images/dtmf-5.png:/icons/images/dtmf-5.png - - - - 22 - 22 - - - - 5 - - - - - - - - - - - :/icons/images/dtmf-6.png:/icons/images/dtmf-6.png - - - - 22 - 22 - - - - 6 - - - - - - - - - - - :/icons/images/dtmf-b.png:/icons/images/dtmf-b.png - - - - 22 - 22 - - - - Over decadic B. Normally not needed. - - - - - - - - 194 - 202 - 210 - - - - - - - - - 194 - 202 - 210 - - - - - - - - - 194 - 202 - 210 - - - - - - - - - - - - - - - - :/icons/images/dtmf-7.png:/icons/images/dtmf-7.png - - - - 22 - 22 - - - - 7 - - - - - - - - - - - :/icons/images/dtmf-8.png:/icons/images/dtmf-8.png - - - - 22 - 22 - - - - 8 - - - - - - - - - - - :/icons/images/dtmf-9.png:/icons/images/dtmf-9.png - - - - 22 - 22 - - - - 9 - - - - - - - - - - - :/icons/images/dtmf-c.png:/icons/images/dtmf-c.png - - - - 22 - 22 - - - - Over decadic C. Normally not needed. - - - - - - - - 194 - 202 - 210 - - - - - - - - - 194 - 202 - 210 - - - - - - - - - 194 - 202 - 210 - - - - - - - - - - - - - - - - :/icons/images/dtmf-star.png:/icons/images/dtmf-star.png - - - - 22 - 22 - - - - Star (*) - - - - - - - - - - - :/icons/images/dtmf-0.png:/icons/images/dtmf-0.png - - - - 22 - 22 - - - - 0 - - - - - - - - - - - :/icons/images/dtmf-pound.png:/icons/images/dtmf-pound.png - - - - 22 - 22 - - - - Pound (#) - - - - - - - - - - - :/icons/images/dtmf-d.png:/icons/images/dtmf-d.png - - - - 22 - 22 - - - - Over decadic D. Normally not needed. - - - - - - - - 194 - 202 - 210 - - - - - - - - - 194 - 202 - 210 - - - - - - - - - 194 - 202 - 210 - - - - - - - - - - - - - 10 - - - - - - - - :/icons/images/dtmf-1.png:/icons/images/dtmf-1.png - - - - 22 - 22 - - - - true - - - 1 - - - - - + + DtmfForm + + + + 0 + 0 + 350 + 302 + + + + + 0 + 0 + + + + Twinkle - DTMF + + + + + + Keypad + + + + + + + 0 + 0 + + + + + 8 + + + + 2 + + + 2 +abc + + - - - - - - - 291 - 20 - - - - QSizePolicy::Expanding - - - Qt::Horizontal - - - - - - - &Close - - - Alt+C - - - true - - - - + + + + + 0 + 0 + + + + 3 + + + 3 +def + + + + + + + 0 + 0 + + + + + + + + + 194 + 202 + 210 + + + + + + + + + 194 + 202 + 210 + + + + + + + + + 194 + 202 + 210 + + + + + + + + Over decadic A. Normally not needed. + + + A + + + + + + + + 0 + 0 + + + + 4 + + + 4 +ghi + + + + + + + + 0 + 0 + + + + 5 + + + 5 +jkl + + + + + + + + 0 + 0 + + + + 6 + + + 6 +mno + + + + + + + + 0 + 0 + + + + + + + + + 194 + 202 + 210 + + + + + + + + + 194 + 202 + 210 + + + + + + + + + 194 + 202 + 210 + + + + + + + + Over decadic B. Normally not needed. + + + B + + + + + + + + 0 + 0 + + + + 7 + + + 7 +pqrs + + + + + + + + 0 + 0 + + + + 8 + + + 8 +tuv + + + + + + + + 0 + 0 + + + + 9 + + + 9 +wxyz + + + + + + + + 0 + 0 + + + + + + + + + 194 + 202 + 210 + + + + + + + + + 194 + 202 + 210 + + + + + + + + + 194 + 202 + 210 + + + + + + + + Over decadic C. Normally not needed. + + + C + + + + + + + + 0 + 0 + + + + Star (*) + + + * + + + + + + + + 0 + 0 + + + + 0 + + + 0 + + + + + + + + 0 + 0 + + + + Pound (#) + + + # + + + + + + + + 0 + 0 + + + + + + + + + 194 + 202 + 210 + + + + + + + + + 194 + 202 + 210 + + + + + + + + + 194 + 202 + 210 + + + + + + + + Over decadic D. Normally not needed. + + + D + + + + + + + + 0 + 0 + + + + 1 + + + 1 + + + true + + + + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Expanding + + + + 291 + 20 + + + + + + + + &Close + + + Alt+C + + + true + + + - - - - onePushButton - twoPushButton - threePushButton - aPushButton - fourPushButton - fivePushButton - sixPushButton - bPushButton - sevenPushButton - eightPushButton - ninePushButton - cPushButton - starPushButton - zeroPushButton - poundPushButton - dPushButton - closePushButton - - - - - - - closePushButton - clicked() - DtmfForm - accept() - - - onePushButton - clicked() - DtmfForm - dtmf1() - - - twoPushButton - clicked() - DtmfForm - dtmf2() - - - threePushButton - clicked() - DtmfForm - dtmf3() - - - fourPushButton - clicked() - DtmfForm - dtmf4() - - - fivePushButton - clicked() - DtmfForm - dtmf5() - - - sixPushButton - clicked() - DtmfForm - dtmf6() - - - sevenPushButton - clicked() - DtmfForm - dtmf7() - - - eightPushButton - clicked() - DtmfForm - dtmf8() - - - ninePushButton - clicked() - DtmfForm - dtmf9() - - - zeroPushButton - clicked() - DtmfForm - dtmf0() - - - starPushButton - clicked() - DtmfForm - dtmfStar() - - - poundPushButton - clicked() - DtmfForm - dtmfPound() - - - aPushButton - clicked() - DtmfForm - dtmfA() - - - bPushButton - clicked() - DtmfForm - dtmfB() - - - cPushButton - clicked() - DtmfForm - dtmfC() - - - dPushButton - clicked() - DtmfForm - dtmfD() - - + + + + + + onePushButton + twoPushButton + threePushButton + aPushButton + fourPushButton + fivePushButton + sixPushButton + bPushButton + sevenPushButton + eightPushButton + ninePushButton + cPushButton + starPushButton + zeroPushButton + poundPushButton + dPushButton + closePushButton + + + + + closePushButton + clicked() + DtmfForm + accept() + + + 20 + 20 + + + 20 + 20 + + + + + onePushButton + clicked() + DtmfForm + dtmf1() + + + 20 + 20 + + + 20 + 20 + + + + + twoPushButton + clicked() + DtmfForm + dtmf2() + + + 20 + 20 + + + 20 + 20 + + + + + threePushButton + clicked() + DtmfForm + dtmf3() + + + 20 + 20 + + + 20 + 20 + + + + + fourPushButton + clicked() + DtmfForm + dtmf4() + + + 20 + 20 + + + 20 + 20 + + + + + fivePushButton + clicked() + DtmfForm + dtmf5() + + + 20 + 20 + + + 20 + 20 + + + + + sixPushButton + clicked() + DtmfForm + dtmf6() + + + 20 + 20 + + + 20 + 20 + + + + + sevenPushButton + clicked() + DtmfForm + dtmf7() + + + 20 + 20 + + + 20 + 20 + + + + + eightPushButton + clicked() + DtmfForm + dtmf8() + + + 20 + 20 + + + 20 + 20 + + + + + ninePushButton + clicked() + DtmfForm + dtmf9() + + + 20 + 20 + + + 20 + 20 + + + + + zeroPushButton + clicked() + DtmfForm + dtmf0() + + + 20 + 20 + + + 20 + 20 + + + + + starPushButton + clicked() + DtmfForm + dtmfStar() + + + 20 + 20 + + + 20 + 20 + + + + + poundPushButton + clicked() + DtmfForm + dtmfPound() + + + 20 + 20 + + + 20 + 20 + + + + + aPushButton + clicked() + DtmfForm + dtmfA() + + + 20 + 20 + + + 20 + 20 + + + + + bPushButton + clicked() + DtmfForm + dtmfB() + + + 20 + 20 + + + 20 + 20 + + + + + cPushButton + clicked() + DtmfForm + dtmfC() + + + 20 + 20 + + + 20 + 20 + + + + + dPushButton + clicked() + DtmfForm + dtmfD() + + + 20 + 20 + + + 20 + 20 + + + + -- cgit v1.2.3