File indexing completed on 2024-05-05 17:04:26
0001 /* This file is part of the KDE project 0002 * Copyright (C) 2012 Arjen Hiemstra <ahiemstra@heimr.nl> 0003 * 0004 * This program is free software; you can redistribute it and/or modify 0005 * it under the terms of the GNU General Public License as published by 0006 * the Free Software Foundation; either version 2 of the License, or 0007 * (at your option) any later version. 0008 * 0009 * This program is distributed in the hope that it will be useful, 0010 * but WITHOUT ANY WARRANTY; without even the implied warranty of 0011 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 0012 * GNU General Public License for more details. 0013 * 0014 * You should have received a copy of the GNU General Public License 0015 * along with this program; if not, write to the Free Software 0016 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 0017 */ 0018 0019 #include "KeyboardModel.h" 0020 0021 struct Key { 0022 explicit Key(QString keyText, KeyboardModel::KeyType key = KeyboardModel::NormalKey, float size = 1.0f) 0023 : text(keyText), 0024 keyType(key), 0025 width(size) 0026 { 0027 } 0028 0029 QString text; 0030 KeyboardModel::KeyType keyType; 0031 float width; 0032 }; 0033 0034 class KeyboardModel::Private 0035 { 0036 public: 0037 Private() 0038 : mode(NormalMode), 0039 currentKeys(&normalKeys), 0040 useBuiltIn(true) 0041 { 0042 #ifdef Q_OS_WIN 0043 //useBuiltIn = false; 0044 #endif 0045 } 0046 KeyboardMode mode; 0047 QList<Key> *currentKeys; 0048 QList<Key> normalKeys; 0049 QList<Key> capitalKeys; 0050 QList<Key> numericKeys; 0051 bool useBuiltIn; 0052 }; 0053 0054 KeyboardModel::KeyboardModel(QObject* parent) 0055 : QAbstractListModel(parent), d(new Private) 0056 { 0057 QHash<int, QByteArray> roleNames; 0058 roleNames.insert(TextRole, "text"); 0059 roleNames.insert(TypeRole, "keyType"); 0060 roleNames.insert(WidthRole, "width"); 0061 setRoleNames(roleNames); 0062 } 0063 0064 KeyboardModel::~KeyboardModel() 0065 { 0066 delete d; 0067 } 0068 0069 void KeyboardModel::classBegin() 0070 { 0071 0072 } 0073 0074 void KeyboardModel::componentComplete() 0075 { 0076 //Set up keys 0077 0078 //Normal mode 0079 //First row 0080 d->normalKeys.append(Key("q")); 0081 d->normalKeys.append(Key("w")); 0082 d->normalKeys.append(Key("e")); 0083 d->normalKeys.append(Key("r")); 0084 d->normalKeys.append(Key("t")); 0085 d->normalKeys.append(Key("y")); 0086 d->normalKeys.append(Key("u")); 0087 d->normalKeys.append(Key("i")); 0088 d->normalKeys.append(Key("o")); 0089 d->normalKeys.append(Key("p")); 0090 d->normalKeys.append(Key(QChar(0x232B), BackspaceKey, 2.0f)); 0091 //Second row 0092 d->normalKeys.append(Key("", SpacerKey, 0.5f)); 0093 d->normalKeys.append(Key("a")); 0094 d->normalKeys.append(Key("s")); 0095 d->normalKeys.append(Key("d")); 0096 d->normalKeys.append(Key("f")); 0097 d->normalKeys.append(Key("g")); 0098 d->normalKeys.append(Key("h")); 0099 d->normalKeys.append(Key("j")); 0100 d->normalKeys.append(Key("k")); 0101 d->normalKeys.append(Key("l")); 0102 d->normalKeys.append(Key("'")); 0103 d->normalKeys.append(Key(QChar(0x23CE), EnterKey, 1.5f)); 0104 //Third row 0105 d->normalKeys.append(Key(QChar(0x21E7), ShiftKey)); 0106 d->normalKeys.append(Key("z")); 0107 d->normalKeys.append(Key("x")); 0108 d->normalKeys.append(Key("c")); 0109 d->normalKeys.append(Key("v")); 0110 d->normalKeys.append(Key("b")); 0111 d->normalKeys.append(Key("n")); 0112 d->normalKeys.append(Key("m")); 0113 d->normalKeys.append(Key(",")); 0114 d->normalKeys.append(Key(".")); 0115 d->normalKeys.append(Key("?")); 0116 d->normalKeys.append(Key(QChar(0x21E7), ShiftKey)); 0117 //Fourth row 0118 d->normalKeys.append(Key("&123", NumericModeKey, 2.f)); 0119 //d->normalKeys.append(Key("Ctrl", SpacerKey)); 0120 //d->normalKeys.append(Key(QChar(0x263A), SpacerKey)); 0121 d->normalKeys.append(Key(" ", NormalKey, 6.f)); 0122 d->normalKeys.append(Key(QChar(0x2190), LeftArrowKey, 2.f)); 0123 d->normalKeys.append(Key(QChar(0x2192), RightArrowKey, 2.f)); 0124 //d->normalKeys.append(Key("Close", CloseKey)); 0125 0126 //Capital mode 0127 //First row 0128 d->capitalKeys.append(Key("Q")); 0129 d->capitalKeys.append(Key("W")); 0130 d->capitalKeys.append(Key("E")); 0131 d->capitalKeys.append(Key("R")); 0132 d->capitalKeys.append(Key("T")); 0133 d->capitalKeys.append(Key("Y")); 0134 d->capitalKeys.append(Key("U")); 0135 d->capitalKeys.append(Key("I")); 0136 d->capitalKeys.append(Key("O")); 0137 d->capitalKeys.append(Key("P")); 0138 d->capitalKeys.append(Key(QChar(0x232B), BackspaceKey, 2.0f)); 0139 //Second row 0140 d->capitalKeys.append(Key("", SpacerKey, 0.5f)); 0141 d->capitalKeys.append(Key("A")); 0142 d->capitalKeys.append(Key("S")); 0143 d->capitalKeys.append(Key("D")); 0144 d->capitalKeys.append(Key("F")); 0145 d->capitalKeys.append(Key("G")); 0146 d->capitalKeys.append(Key("H")); 0147 d->capitalKeys.append(Key("J")); 0148 d->capitalKeys.append(Key("K")); 0149 d->capitalKeys.append(Key("L")); 0150 d->capitalKeys.append(Key("\"")); 0151 d->capitalKeys.append(Key(QChar(0x23CE), EnterKey, 1.5f)); 0152 //Third row 0153 d->capitalKeys.append(Key(QChar(0x21E7), ShiftKey)); 0154 d->capitalKeys.append(Key("Z")); 0155 d->capitalKeys.append(Key("X")); 0156 d->capitalKeys.append(Key("C")); 0157 d->capitalKeys.append(Key("V")); 0158 d->capitalKeys.append(Key("B")); 0159 d->capitalKeys.append(Key("N")); 0160 d->capitalKeys.append(Key("M")); 0161 d->capitalKeys.append(Key(";")); 0162 d->capitalKeys.append(Key(":")); 0163 d->capitalKeys.append(Key("!")); 0164 d->capitalKeys.append(Key(QChar(0x21E7), ShiftKey)); 0165 //Fourth row 0166 d->capitalKeys.append(Key("&123", NumericModeKey, 2.f)); 0167 //d->capitalKeys.append(Key("Ctrl", SpacerKey)); 0168 //d->capitalKeys.append(Key(QChar(0x263A), SpacerKey)); 0169 d->capitalKeys.append(Key(" ", NormalKey, 6.f)); 0170 d->capitalKeys.append(Key(QChar(0x2190), LeftArrowKey, 2.f)); 0171 d->capitalKeys.append(Key(QChar(0x2192), RightArrowKey, 2.f)); 0172 //d->capitalKeys.append(Key("Close", CloseKey)); 0173 0174 //Capital mode 0175 //First row 0176 //d->numericKeys.append(Key(QChar(0x21B9), SpacerKey)); 0177 d->numericKeys.append(Key("!")); 0178 d->numericKeys.append(Key("@")); 0179 d->numericKeys.append(Key("#")); 0180 d->numericKeys.append(Key("$")); 0181 d->numericKeys.append(Key("%")); 0182 d->numericKeys.append(Key("&")); 0183 d->numericKeys.append(Key("", SpacerKey, 0.5f)); 0184 d->numericKeys.append(Key("1")); 0185 d->numericKeys.append(Key("2")); 0186 d->numericKeys.append(Key("3")); 0187 //d->numericKeys.append(Key("", SpacerKey, 0.5f)); 0188 d->numericKeys.append(Key(QChar(0x232B), BackspaceKey, 2.f)); 0189 //Second row 0190 //d->numericKeys.append(Key("", SpacerKey)); 0191 d->numericKeys.append(Key("(")); 0192 d->numericKeys.append(Key(")")); 0193 d->numericKeys.append(Key("-")); 0194 d->numericKeys.append(Key("_")); 0195 d->numericKeys.append(Key("=")); 0196 d->numericKeys.append(Key("+")); 0197 d->numericKeys.append(Key("", SpacerKey, 0.5f)); 0198 d->numericKeys.append(Key("4")); 0199 d->numericKeys.append(Key("5")); 0200 d->numericKeys.append(Key("6")); 0201 //d->numericKeys.append(Key("", SpacerKey, 0.5f)); 0202 d->numericKeys.append(Key(QChar(0x23CE), EnterKey, 2.f)); 0203 //Third row 0204 //d->numericKeys.append(Key("", SpacerKey)); 0205 d->numericKeys.append(Key("\\")); 0206 d->numericKeys.append(Key(";")); 0207 d->numericKeys.append(Key(":")); 0208 d->numericKeys.append(Key("\"")); 0209 d->numericKeys.append(Key("*")); 0210 d->numericKeys.append(Key("/")); 0211 d->numericKeys.append(Key("", SpacerKey, 0.5f)); 0212 d->numericKeys.append(Key("7")); 0213 d->numericKeys.append(Key("8")); 0214 d->numericKeys.append(Key("9")); 0215 d->numericKeys.append(Key("", SpacerKey, 1.f)); 0216 //Fourth row 0217 d->numericKeys.append(Key("&123", NumericModeKey, 2.f)); 0218 //d->numericKeys.append(Key("Ctrl", SpacerKey)); 0219 //d->numericKeys.append(Key(QChar(0x263A), SpacerKey)); 0220 d->numericKeys.append(Key(QChar(0x2190), LeftArrowKey, 1.5f)); 0221 d->numericKeys.append(Key(" ", NormalKey, 2.5f)); 0222 d->numericKeys.append(Key("", SpacerKey, 0.5f)); 0223 d->numericKeys.append(Key("0", NormalKey, 2.f)); 0224 d->numericKeys.append(Key(".")); 0225 d->numericKeys.append(Key("", SpacerKey, .5f)); 0226 d->numericKeys.append(Key(QChar(0x2192), RightArrowKey, 1.5f)); 0227 //d->numericKeys.append(Key("Close", CloseKey)); 0228 } 0229 0230 QVariant KeyboardModel::data(const QModelIndex& index, int role) const 0231 { 0232 if (!index.isValid()) 0233 return QVariant(); 0234 0235 switch(role) { 0236 case TextRole: 0237 return d->currentKeys->at(index.row()).text; 0238 case TypeRole: 0239 return QVariant::fromValue<int>(d->currentKeys->at(index.row()).keyType); 0240 case WidthRole: 0241 return d->currentKeys->at(index.row()).width; 0242 default: 0243 break; 0244 } 0245 0246 return QVariant(); 0247 } 0248 0249 int KeyboardModel::rowCount(const QModelIndex& parent) const 0250 { 0251 Q_UNUSED(parent) 0252 return d->currentKeys->count(); 0253 } 0254 0255 KeyboardModel::KeyboardMode KeyboardModel::keyboardMode() const 0256 { 0257 return d->mode; 0258 } 0259 0260 void KeyboardModel::setKeyboardMode(KeyboardModel::KeyboardMode mode) 0261 { 0262 if (mode != d->mode) { 0263 d->mode = mode; 0264 0265 beginRemoveRows(QModelIndex(), 0, d->currentKeys->count() - 1); 0266 endRemoveRows(); 0267 0268 switch(d->mode) { 0269 case NormalMode: 0270 d->currentKeys = &d->normalKeys; 0271 break; 0272 case CapitalMode: 0273 d->currentKeys = &d->capitalKeys; 0274 break; 0275 case NumericMode: 0276 d->currentKeys = &d->numericKeys; 0277 break; 0278 } 0279 0280 beginInsertRows(QModelIndex(), 0, d->currentKeys->count() - 1); 0281 endInsertRows(); 0282 0283 emit keyboardModeChanged(); 0284 } 0285 } 0286 0287 bool KeyboardModel::useBuiltIn() const 0288 { 0289 return d->useBuiltIn; 0290 }