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 }