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 }