xref: /OK3568_Linux_fs/app/qsetting/qtkeyboard.cpp (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 #include "qtkeyboard.h"
2 #include "ui_qtkeyboard.h"
3 #include <QDebug>
4 #include <QTimer>
5 #include <QDesktopWidget>
6 
7 QKeyBoard* QKeyBoard::_instance = nullptr;
8 #define str_board_close "Close"
9 #define SHIFT_ON "SHIFT"
10 #define SHIFT_OFF "shift"
11 
QKeyBoard(QWidget * parent)12 QKeyBoard::QKeyBoard(QWidget *parent) : QWidget(parent),
13     ui(new Ui::QKeyBoard),
14     isShiftOn(false),
15     lineEdit(nullptr),
16     mousePressed(false)
17 {
18     ui->setupUi(this);
19     ui->btna->setProperty("btnLetter", true);
20     ui->btnb->setProperty("btnLetter", true);
21     ui->btnc->setProperty("btnLetter", true);
22     ui->btnd->setProperty("btnLetter", true);
23     ui->btne->setProperty("btnLetter", true);
24     ui->btnf->setProperty("btnLetter", true);
25     ui->btng->setProperty("btnLetter", true);
26     ui->btnh->setProperty("btnLetter", true);
27     ui->btni->setProperty("btnLetter", true);
28     ui->btnj->setProperty("btnLetter", true);
29     ui->btnk->setProperty("btnLetter", true);
30     ui->btnl->setProperty("btnLetter", true);
31     ui->btnm->setProperty("btnLetter", true);
32     ui->btnn->setProperty("btnLetter", true);
33     ui->btno->setProperty("btnLetter", true);
34     ui->btnp->setProperty("btnLetter", true);
35     ui->btnq->setProperty("btnLetter", true);
36     ui->btnr->setProperty("btnLetter", true);
37     ui->btns->setProperty("btnLetter", true);
38     ui->btnt->setProperty("btnLetter", true);
39     ui->btnu->setProperty("btnLetter", true);
40     ui->btnv->setProperty("btnLetter", true);
41     ui->btnw->setProperty("btnLetter", true);
42     ui->btnx->setProperty("btnLetter", true);
43     ui->btny->setProperty("btnLetter", true);
44     ui->btnz->setProperty("btnLetter", true);
45 
46     const QRect availableGeometry = QApplication::desktop()->availableGeometry();
47     QFont font;
48     font.setPixelSize(availableGeometry.height()/20);
49     setWindowFlags(Qt::WindowStaysOnTopHint | Qt::FramelessWindowHint);
50     connect(qApp, SIGNAL(focusChanged(QWidget*, QWidget*)),
51             this, SLOT(slot_onApplicationFocusChanged(QWidget*, QWidget*)));
52     qApp->installEventFilter(this);
53 
54     QList<QPushButton*> btns = this->findChildren<QPushButton*>();
55     foreach (QPushButton *button, btns) {
56         connect(button, SIGNAL(clicked()), this, SLOT(btn_clicked()));
57         button->setFont(font);
58     }
59 }
60 
~QKeyBoard()61 QKeyBoard::~QKeyBoard()
62 {
63     delete ui;
64     _instance = nullptr;
65 }
66 
changeInputType(bool on)67 void QKeyBoard::changeInputType(bool on)
68 {
69     QString str;
70     ui->btnShift->setText(on?SHIFT_ON:SHIFT_OFF);
71     QList<QPushButton*> buttons = this->findChildren<QPushButton*>();
72     foreach (QPushButton *button, buttons) {
73         if (button->property("btnLetter").toBool()) {
74             if (on)
75                 button->setText(button->text().toUpper());
76             else
77                 button->setText(button->text().toLower());
78         } else if(! button->objectName().compare("btnApostrophe")){
79             button->setText(on?"\"":"\'");
80         } else if(! button->objectName().compare("btnBackslash")){
81             button->setText(on?"|":"\\");
82         } else if(! button->objectName().compare("btnComma")){
83             button->setText(on?"<":",");
84         } else if(! button->objectName().compare("btnDash")){
85             button->setText(on?"_":"-");
86         } else if(! button->objectName().compare("btnDot")){
87             button->setText(on?">":".");
88         } else if(! button->objectName().compare("btnEquals")){
89             button->setText(on?"+":"=");
90         } else if(! button->objectName().compare("btnSemicolon")){
91             button->setText(on?":":";");
92         } else if(! button->objectName().compare("btnSlash")){
93             button->setText(on?"?":"/");
94         } else if(! button->objectName().compare("btnOther1")){
95             button->setText(on?"~":"`");
96         } else if(! button->objectName().compare("btnOther2")){
97             button->setText(on?"{":"[");
98         } else if(! button->objectName().compare("btnOther3")){
99             button->setText(on?"}":"]");
100         } else if(! button->objectName().compare("btn1")){
101             button->setText(on?"!":"1");
102         } else if(! button->objectName().compare("btn2")){
103             button->setText(on?"@":"2");
104         } else if(! button->objectName().compare("btn3")){
105             button->setText(on?"#":"3");
106         } else if(! button->objectName().compare("btn4")){
107             button->setText(on?"$":"4");
108         } else if(! button->objectName().compare("btn5")){
109             button->setText(on?"%":"5");
110         } else if(! button->objectName().compare("btn6")){
111             button->setText(on?"^":"6");
112         } else if(! button->objectName().compare("btn7")){
113             button->setText(on?"&":"7");
114         } else if(! button->objectName().compare("btn8")){
115             button->setText(on?"*":"8");
116         } else if(! button->objectName().compare("btn9")){
117             button->setText(on?"(":"9");
118         } else if(! button->objectName().compare("btn0")){
119             button->setText(on?")":"0");
120         }
121     }
122 }
123 
showPanel()124 void QKeyBoard::showPanel()
125 {
126     changeInputType(isShiftOn);
127     this->setVisible(true);
128 }
129 
hidePanel()130 void QKeyBoard::hidePanel()
131 {
132     this->setVisible(false);
133 }
134 
slot_onApplicationFocusChanged(QWidget *,QWidget * nowWidget)135 void QKeyBoard::slot_onApplicationFocusChanged(QWidget *, QWidget *nowWidget)
136 {
137     if (nowWidget != nullptr && !this->isAncestorOf(nowWidget)) {
138         if (nowWidget->inherits("QLineEdit")) {
139             lineEdit = (QLineEdit*)nowWidget;
140             showPanel();
141         } else {
142             hidePanel();
143         }
144 
145         const QRect availableGeometry = QApplication::desktop()->availableGeometry();
146         resize(availableGeometry.width(), height());
147         move(0, availableGeometry.height() - height());
148     }
149 }
150 
btn_clicked()151 void QKeyBoard::btn_clicked()
152 {
153     if (lineEdit == nullptr) {
154         return;
155     }
156 
157     QPushButton *button = (QPushButton*)sender();
158     QString objectName = button->objectName();
159     if (objectName == "btnBackspace") {
160         lineEdit->backspace();
161     } else if (objectName == "btnClose") {
162         // foucs other widget first.
163         if (lineEdit && lineEdit->parentWidget())
164             lineEdit->parentWidget()->setFocus();
165         hidePanel();
166     } else if (objectName == "btnSpace") {
167         insertValue(" ");
168     } else if (objectName == "btnShift") {
169         isShiftOn = (isShiftOn == true) ? false : true;
170         changeInputType(isShiftOn);
171     } else {
172         insertValue(button->text());
173     }
174 }
175 
insertValue(const QString & value)176 void QKeyBoard::insertValue(const QString &value)
177 {
178     if (lineEdit->text().length() < 20)
179         lineEdit->insert(value);
180 }
181 
mousePressEvent(QMouseEvent * event)182 void QKeyBoard::mousePressEvent(QMouseEvent *event)
183 {
184     if (event->button() == Qt::LeftButton) {
185         mousePressed = true;
186         mousePoint = event->globalPos() - this->pos();
187         event->accept();
188     }
189 }
190 
mouseMoveEvent(QMouseEvent * event)191 void QKeyBoard::mouseMoveEvent(QMouseEvent *event)
192 {
193     if (mousePressed && event->buttons() == Qt::LeftButton) {
194         this->move(event->globalPos() - mousePoint);
195         event->accept();
196     }
197 }
198 
mouseReleaseEvent(QMouseEvent *)199 void QKeyBoard::mouseReleaseEvent(QMouseEvent *)
200 {
201     mousePressed = false;
202 }
203