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