Subversion Repositories tpanel

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
62 andreas 1
/*
111 andreas 2
 * Copyright (C) 2021, 2022 by Andreas Theofilu <andreas@theosys.at>
62 andreas 3
 *
4
 * This program is free software; you can redistribute it and/or modify
5
 * it under the terms of the GNU General Public License as published by
6
 * the Free Software Foundation; either version 3 of the License, or
7
 * (at your option) any later version.
8
 *
9
 * This program is distributed in the hope that it will be useful,
10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
 * GNU General Public License for more details.
13
 *
14
 * You should have received a copy of the GNU General Public License
15
 * along with this program; if not, write to the Free Software Foundation,
16
 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA
17
 */
18
 
19
#include <QPushButton>
71 andreas 20
#include <QSound>
62 andreas 21
 
22
#include "tqkeyboard.h"
23
#include "ui_keyboard.h"
24
#include "terror.h"
63 andreas 25
#include "tresources.h"
71 andreas 26
#include "tconfig.h"
111 andreas 27
#include "tpagemanager.h"
62 andreas 28
 
111 andreas 29
extern TPageManager *gPageManager;              //!< The pointer to the global defined main class.
30
 
63 andreas 31
TQKeyboard::TQKeyboard(const std::string& init, const std::string& prompt, QWidget *parent, bool priv)
62 andreas 32
    : QDialog(parent),
71 andreas 33
      TSystemSound(TConfig::getSystemPath(TConfig::SOUNDS)),
62 andreas 34
      ui(new Ui::TQKeyboard),
63 andreas 35
      mPrivate(priv),
62 andreas 36
      mText(init)
37
{
63 andreas 38
    DECL_TRACER("TQKeyboard::TQKeyboard(const std::string& init, const std::string& prompt, QWidget *parent, bool priv)");
62 andreas 39
 
40
    ui->setupUi(this);
41
    connect(ui->key_Enter, SIGNAL(pressed()), this, SLOT(accept()));
42
    connect(ui->key_Cancel, SIGNAL(pressed()), this, SLOT(reject()));
43
 
44
    connect(ui->key_A, SIGNAL(pressed()), this, SLOT(keyA()));
45
    connect(ui->key_B, SIGNAL(pressed()), this, SLOT(keyB()));
46
    connect(ui->key_C, SIGNAL(pressed()), this, SLOT(keyC()));
47
    connect(ui->key_D, SIGNAL(pressed()), this, SLOT(keyD()));
48
    connect(ui->key_E, SIGNAL(pressed()), this, SLOT(keyE()));
49
    connect(ui->key_F, SIGNAL(pressed()), this, SLOT(keyF()));
50
    connect(ui->key_G, SIGNAL(pressed()), this, SLOT(keyG()));
51
    connect(ui->key_H, SIGNAL(pressed()), this, SLOT(keyH()));
52
    connect(ui->key_I, SIGNAL(pressed()), this, SLOT(keyI()));
53
    connect(ui->key_J, SIGNAL(pressed()), this, SLOT(keyJ()));
54
    connect(ui->key_K, SIGNAL(pressed()), this, SLOT(keyK()));
55
    connect(ui->key_L, SIGNAL(pressed()), this, SLOT(keyL()));
56
    connect(ui->key_M, SIGNAL(pressed()), this, SLOT(keyM()));
57
    connect(ui->key_N, SIGNAL(pressed()), this, SLOT(keyN()));
58
    connect(ui->key_O, SIGNAL(pressed()), this, SLOT(keyO()));
59
    connect(ui->key_P, SIGNAL(pressed()), this, SLOT(keyP()));
60
    connect(ui->key_Q, SIGNAL(pressed()), this, SLOT(keyQ()));
61
    connect(ui->key_R, SIGNAL(pressed()), this, SLOT(keyR()));
62
    connect(ui->key_S, SIGNAL(pressed()), this, SLOT(keyS()));
63
    connect(ui->key_T, SIGNAL(pressed()), this, SLOT(keyT()));
64
    connect(ui->key_U, SIGNAL(pressed()), this, SLOT(keyU()));
65
    connect(ui->key_V, SIGNAL(pressed()), this, SLOT(keyV()));
66
    connect(ui->key_W, SIGNAL(pressed()), this, SLOT(keyW()));
67
    connect(ui->key_X, SIGNAL(pressed()), this, SLOT(keyX()));
68
    connect(ui->key_Y, SIGNAL(pressed()), this, SLOT(keyY()));
69
    connect(ui->key_Z, SIGNAL(pressed()), this, SLOT(keyZ()));
70
    connect(ui->key_AE, SIGNAL(pressed()), this, SLOT(keyAE()));
71
    connect(ui->key_OE, SIGNAL(pressed()), this, SLOT(keyOE()));
72
    connect(ui->key_UE, SIGNAL(pressed()), this, SLOT(keyUE()));
73
    connect(ui->key_SS, SIGNAL(pressed()), this, SLOT(keySS()));
74
    connect(ui->key_Caret, SIGNAL(pressed()), this, SLOT(keyCaret()));
75
    connect(ui->key_SQ, SIGNAL(pressed()), this, SLOT(keySQ()));
76
    connect(ui->key_Backspace, SIGNAL(pressed()), this, SLOT(keyBackspace()));
77
    connect(ui->key_Plus, SIGNAL(pressed()), this, SLOT(keyPlus()));
78
    connect(ui->key_Hash, SIGNAL(pressed()), this, SLOT(keyHash()));
79
    connect(ui->key_Komma, SIGNAL(pressed()), this, SLOT(keyKomma()));
80
    connect(ui->key_Dot, SIGNAL(pressed()), this, SLOT(keyDot()));
81
    connect(ui->key_Dash, SIGNAL(pressed()), this, SLOT(keyDash()));
82
    connect(ui->key_GtLt, SIGNAL(pressed()), this, SLOT(keyGtLt()));
83
    connect(ui->key_Tab, SIGNAL(pressed()), this, SLOT(keyTab()));
84
    connect(ui->key_Caps, SIGNAL(pressed()), this, SLOT(keyCaps()));
85
    connect(ui->key_Shift, SIGNAL(pressed()), this, SLOT(keyShift()));
86
    connect(ui->key_Blank, SIGNAL(pressed()), this, SLOT(keyBlank()));
87
    connect(ui->key_Clear, SIGNAL(pressed()), this, SLOT(keyClear()));
88
    connect(ui->key_AltGR, SIGNAL(pressed()), this, SLOT(keyAltGr()));
89
    connect(ui->key_1, SIGNAL(pressed()), this, SLOT(key1()));
90
    connect(ui->key_2, SIGNAL(pressed()), this, SLOT(key2()));
91
    connect(ui->key_3, SIGNAL(pressed()), this, SLOT(key3()));
92
    connect(ui->key_4, SIGNAL(pressed()), this, SLOT(key4()));
93
    connect(ui->key_5, SIGNAL(pressed()), this, SLOT(key5()));
94
    connect(ui->key_6, SIGNAL(pressed()), this, SLOT(key6()));
95
    connect(ui->key_7, SIGNAL(pressed()), this, SLOT(key7()));
96
    connect(ui->key_8, SIGNAL(pressed()), this, SLOT(key8()));
97
    connect(ui->key_9, SIGNAL(pressed()), this, SLOT(key9()));
98
    connect(ui->key_0, SIGNAL(pressed()), this, SLOT(key0()));
99
 
100
    ui->label_Prompt->setText(prompt.c_str());
63 andreas 101
 
102
    if (!mPrivate)
103
        ui->label_TextLine->setText(init.c_str());
104
    else
105
        ui->label_TextLine->setText(fillString('*', mText.length()).c_str());
62 andreas 106
}
107
 
108
TQKeyboard::~TQKeyboard()
109
{
110
    DECL_TRACER("TQKeyboard::~TQKeyboard()");
111
    delete ui;
112
}
113
 
114
void TQKeyboard::doResize()
115
{
116
    DECL_TRACER("TQKeyboard::doResize()");
117
 
118
    QRect rect = this->geometry();
119
#if defined(Q_OS_ANDROID) || defined(Q_OS_IOS)
120
    QSize size = this->size();
121
    size.scale(scale(size.width()), scale(size.height()), Qt::KeepAspectRatio);
122
    this->resize(size);
123
#endif
124
    QWidget *parent = this->parentWidget();
125
 
126
    if (parent)     // Move window to lower left corner
127
    {
128
        rect = parent->geometry();
129
        this->move(0, rect.height() - this->geometry().height());
130
    }
131
#if defined(Q_OS_ANDROID) || defined(Q_OS_IOS)
132
    // Iterate through childs and resize them
133
    QObjectList childs = children();
134
    QList<QObject *>::Iterator iter;
135
 
136
    for (iter = childs.begin(); iter != childs.end(); ++iter)
137
    {
138
        QString name = iter.i->t()->objectName();
139
        QObject *obj = iter.i->t();
140
 
141
        if (name.startsWith("key_"))
142
        {
143
            QPushButton *bt = dynamic_cast<QPushButton *>(obj);
144
            size = bt->size();
145
            size.scale(scale(size.width()), scale(size.height()), Qt::KeepAspectRatio);
146
            bt->resize(size);
147
            rect = bt->geometry();
148
            bt->move(scale(rect.left()), scale(rect.top()));
149
        }
150
        else    // It's a label
151
        {
152
            QLabel *lb = dynamic_cast<QLabel *>(obj);
153
            size = lb->size();
154
            size.scale(scale(size.width()), scale(size.height()), Qt::KeepAspectRatio);
155
            lb->resize(size);
156
            rect = lb->geometry();
157
            lb->move(scale(rect.left()), scale(rect.top()));
158
        }
159
    }
160
#endif
161
}
162
 
163
void TQKeyboard::setKey(Ui::KEYS_t key)
164
{
71 andreas 165
    DECL_TRACER("TQKeyboard::setKey(Ui::KEYS_t key)");
166
 
62 andreas 167
    switch(key)
168
    {
169
        case Ui::KEY_0:         mText += ((mShift || mCaps) ? "=" : (mGr ? "}" : "0")); break;
170
        case Ui::KEY_1:         mText += ((mShift || mCaps) ? "!" : "1"); break;
171
        case Ui::KEY_2:         mText += ((mShift || mCaps) ? "\"" : (mGr ? "²" : "2")); break;
172
        case Ui::KEY_3:         mText += ((mShift || mCaps) ? "§" : (mGr ? "³" : "3")); break;
173
        case Ui::KEY_4:         mText += ((mShift || mCaps) ? "$" : "4"); break;
174
        case Ui::KEY_5:         mText += ((mShift || mCaps) ? "%" : "5"); break;
175
        case Ui::KEY_6:         mText += ((mShift || mCaps) ? "&" : "6"); break;
176
        case Ui::KEY_7:         mText += ((mShift || mCaps) ? "/" : (mGr ? "{" : "7")); break;
177
        case Ui::KEY_8:         mText += ((mShift || mCaps) ? "(" : (mGr ? "[" : "8")); break;
178
        case Ui::KEY_9:         mText += ((mShift || mCaps) ? ")" : (mGr ? "]" : "9")); break;
179
        case Ui::KEY_A:         mText += ((mShift || mCaps) ? "A" : "a"); break;
180
        case Ui::KEY_B:         mText += ((mShift || mCaps) ? "B" : "b"); break;
181
        case Ui::KEY_C:         mText += ((mShift || mCaps) ? "C" : "c"); break;
182
        case Ui::KEY_D:         mText += ((mShift || mCaps) ? "D" : "d"); break;
183
        case Ui::KEY_E:         mText += ((mShift || mCaps) ? "E" : (mGr ? "€" : "e")); break;
184
        case Ui::KEY_F:         mText += ((mShift || mCaps) ? "F" : "f"); break;
185
        case Ui::KEY_G:         mText += ((mShift || mCaps) ? "G" : "g"); break;
186
        case Ui::KEY_H:         mText += ((mShift || mCaps) ? "H" : "h"); break;
187
        case Ui::KEY_I:         mText += ((mShift || mCaps) ? "I" : "i"); break;
188
        case Ui::KEY_J:         mText += ((mShift || mCaps) ? "J" : "j"); break;
189
        case Ui::KEY_K:         mText += ((mShift || mCaps) ? "K" : "k"); break;
190
        case Ui::KEY_L:         mText += ((mShift || mCaps) ? "L" : "l"); break;
191
        case Ui::KEY_M:         mText += ((mShift || mCaps) ? "M" : (mGr ? "µ" : "m")); break;
192
        case Ui::KEY_N:         mText += ((mShift || mCaps) ? "N" : "n"); break;
193
        case Ui::KEY_O:         mText += ((mShift || mCaps) ? "O" : "o"); break;
194
        case Ui::KEY_P:         mText += ((mShift || mCaps) ? "P" : "p"); break;
195
        case Ui::KEY_Q:         mText += ((mShift || mCaps) ? "Q" : (mGr ? "@" : "q")); break;
196
        case Ui::KEY_R:         mText += ((mShift || mCaps) ? "R" : "r"); break;
197
        case Ui::KEY_S:         mText += ((mShift || mCaps) ? "S" : "s"); break;
198
        case Ui::KEY_T:         mText += ((mShift || mCaps) ? "T" : "t"); break;
199
        case Ui::KEY_U:         mText += ((mShift || mCaps) ? "U" : "u"); break;
200
        case Ui::KEY_V:         mText += ((mShift || mCaps) ? "V" : "v"); break;
201
        case Ui::KEY_W:         mText += ((mShift || mCaps) ? "W" : "w"); break;
202
        case Ui::KEY_X:         mText += ((mShift || mCaps) ? "X" : "x"); break;
203
        case Ui::KEY_Y:         mText += ((mShift || mCaps) ? "Y" : "y"); break;
204
        case Ui::KEY_Z:         mText += ((mShift || mCaps) ? "Z" : "z"); break;
205
        case Ui::KEY_AE:        mText += ((mShift || mCaps) ? "Ä" : "ä"); break;
206
        case Ui::KEY_OE:        mText += ((mShift || mCaps) ? "Ö" : "ö"); break;
207
        case Ui::KEY_UE:        mText += ((mShift || mCaps) ? "Ü" : "ü"); break;
208
        case Ui::KEY_SS:        mText += ((mShift || mCaps) ? "?" : (mGr ? "\\" : "ß")); break;
209
        case Ui::KEY_SQ:        mText += ((mShift || mCaps) ? "`" : "´"); break;
210
        case Ui::KEY_Caret:     mText += ((mShift || mCaps) ? "°" : "^"); break;
211
        case Ui::KEY_Clear:     mText.clear(); break;
212
        case Ui::KEY_Backspace: mText = mText.substr(0, mText.length() -1); break;
213
        case Ui::KEY_Plus:      mText += ((mShift || mCaps) ? "*" : (mGr ? "~" : "+")); break;
214
        case Ui::KEY_Hash:      mText += ((mShift || mCaps) ? "'" : "#"); break;
215
        case Ui::KEY_Komma:     mText += ((mShift || mCaps) ? ";" : ","); break;
216
        case Ui::KEY_Dot:       mText += ((mShift || mCaps) ? ":" : "."); break;
217
        case Ui::KEY_Dash:      mText += ((mShift || mCaps) ? "_" : "-"); break;
218
        case Ui::KEY_GtLt:      mText += ((mShift || mCaps) ? ">" : (mGr ? "|" : "<")); break;
219
        case Ui::KEY_Tab:       mText += "\t"; break;
220
        case Ui::KEY_Caps:      mCaps = !mCaps; break;
221
        case Ui::KEY_Shift:     mShift = true; break;
222
        case Ui::KEY_AltGR:     mGr = true; break;
223
        case Ui::KEY_Blank:     mText += " "; break;
224
    }
225
 
226
    if (key != Ui::KEY_Shift)
227
        mShift = false;
228
 
229
    if (key != Ui::KEY_AltGR)
230
        mGr = false;
231
 
111 andreas 232
    if (mMaxLen > 0 && mText.length() > (size_t)mMaxLen)
233
        mText = mText.substr(0, mMaxLen);
234
 
63 andreas 235
    if (!mPrivate)
236
        ui->label_TextLine->setText(mText.c_str());
237
    else
238
        ui->label_TextLine->setText(fillString('*', mText.length()).c_str());
71 andreas 239
 
240
    if (getSystemSoundState())
241
    {
242
        std::string snd = getTouchFeedbackSound();
243
        MSG_DEBUG("Playing sound: " << snd);
244
        QSound::play(snd.c_str());
245
    }
111 andreas 246
 
247
    if (gPageManager && gPageManager->getPassThrough() && !mText.empty() &&
248
        key != Ui::KEY_Backspace && key != Ui::KEY_Clear &&
249
        key != Ui::KEY_Shift && key != Ui::KEY_AltGR && key != Ui::KEY_Caps)
250
    {
251
        size_t pos = mText.length() - 1;
252
        gPageManager->sendKeyStroke(mText[pos]);
253
    }
62 andreas 254
}
255
 
111 andreas 256
void TQKeyboard::setString(const std::string& str)
257
{
258
    DECL_TRACER("TQKeyboard::setString(const string& str)");
259
 
260
    mText += str;
261
 
262
    if (mMaxLen > 0 && mText.length() > (size_t)mMaxLen)
263
        mText = mText.substr(0, mMaxLen);
264
 
265
    if (!mPrivate)
266
        ui->label_TextLine->setText(mText.c_str());
267
    else
268
        ui->label_TextLine->setText(fillString('*', mText.length()).c_str());
269
}
270
 
62 andreas 271
int TQKeyboard::scale(int value)
272
{
273
    if (value <= 0 || mScaleFactor == 1.0)
274
        return value;
275
 
276
    return (int)((double)value * mScaleFactor);
277
}