File indexing completed on 2024-05-12 04:47:03

0001 #include "keyshelper.h"
0002 #include <QCoreApplication>
0003 #include <QDebug>
0004 #include <QKeyEvent>
0005 
0006 #include <KI18n/KLocalizedString>
0007 
0008 KeysHelper::KeysHelper(QObject *parent)
0009     : QAbstractListModel(parent)
0010 {
0011     this->setKeys();
0012 }
0013 
0014 int KeysHelper::rowCount(const QModelIndex &) const
0015 {
0016     return this->m_keys.count();
0017 }
0018 
0019 QVariant KeysHelper::data(const QModelIndex &index, int role) const
0020 {
0021     const auto key = this->m_keys.at(index.row());
0022 
0023     switch (role) {
0024     case ROLES::KEY:
0025         return key.key;
0026     case ROLES::LABEL:
0027         return key.label;
0028     case ROLES::ICON_NAME:
0029         return key.iconName;
0030     case ROLES::MODIFIER:
0031         return key.modifier;
0032     case ROLES::ITEM:
0033         return QVariant::fromValue(key);
0034     default:
0035         return QVariant();
0036     }
0037 }
0038 
0039 KeysHelper::Group KeysHelper::group() const
0040 {
0041     return m_group;
0042 }
0043 
0044 QVariantList KeysHelper::signalsGroup() const
0045 {
0046     auto insert = [](const QString &label, const int &signal) -> QVariantMap
0047     {
0048         return QVariantMap{{"label", label}, {"signal", signal}};
0049     };
0050 
0051     QVariantList res;
0052 
0053     int i = 1;
0054     res << insert("SIGHUP", i++);
0055     res << insert("SIGINT", i++);
0056     res << insert("SIGQUIT", i++);
0057     res << insert("SIGILL", i++);
0058     res << insert("SIGTRAP", i++);
0059     res << insert("SIGABRT", i++);
0060     ////    res << insert("SIGIOT", i++);
0061     res << insert("SIGBUS", i++);
0062     res << insert("SIGFPE", i++);
0063     res << insert("SIGKILL", i++);
0064     res << insert("SIGUSR1", i++);
0065     res << insert("SIGEGV", i++);
0066     res << insert("SIGUSR2", i++);
0067     res << insert("SIGPIPE", i++);
0068     res << insert("SIGALRM", i++);
0069     res << insert("SIGTERM", i++);
0070     res << insert("SIGSTKFLT", i++);
0071     res << insert("SIGCHLD", i++);
0072     res << insert("SIGCONT", i++);
0073     res << insert("SIGSTOP", i++);
0074     res << insert("SIGTSTP", i++);
0075     res << insert("SIGTTIN", i++);
0076     res << insert("SIGTTOU", i++);
0077     res << insert("SIGTSTP", i++);
0078     res << insert("SIGURG", i++);
0079 
0080     return res;
0081 }
0082 
0083 QHash<int, QByteArray> KeysHelper::roleNames() const
0084 {
0085     static QHash<int, QByteArray> roles;
0086     roles[ROLES::ITEM] = "item";
0087     roles[ROLES::KEY] = "key";
0088     roles[ROLES::LABEL] = "label";
0089     roles[ROLES::ICON_NAME] = "iconName";
0090     roles[ROLES::MODIFIER] = "modifier";
0091     return roles;
0092 }
0093 
0094 void KeysHelper::setKeys()
0095 {
0096     Q_EMIT this->beginResetModel();
0097 
0098     switch (m_group) {
0099     case Group::FN_GROUP: {
0100         this->m_keys = fnKeys();
0101         break;
0102     }
0103     case Group::NAV_GROUP: {
0104         this->m_keys = navKeys();
0105         break;
0106     }
0107     case Group::CTRL_GROUP: {
0108         this->m_keys = ctrlKeys();
0109         break;
0110     }
0111     case Group::NANO_GROUP: {
0112         this->m_keys = nanoKeys();
0113         break;
0114     }
0115     case Group::DEFAULT_GROUP: {
0116         this->m_keys = defaultKeys();
0117         break;
0118     }
0119     case Group::SIGNALS_GROUP: {
0120         this->m_keys = signalKeys();
0121         break;
0122     }
0123     default: {
0124         this->m_keys = defaultKeys();
0125     }
0126     }
0127 
0128     qDebug() << "FINISHED EMITTIGN KEYS" << this->m_keys.count();
0129 
0130     Q_EMIT this->endResetModel();
0131 }
0132 
0133 QVector<Key> KeysHelper::ctrlKeys()
0134 {
0135     QVector<Key> res;
0136     res.append({Qt::Key::Key_C, "Ctrl+C", "", Qt::Modifier::CTRL});
0137     res.append({Qt::Key::Key_V, "Ctrl+V", "", Qt::Modifier::CTRL});
0138     res.append({Qt::Key::Key_M, "Ctrl+M", "", Qt::Modifier::CTRL});
0139     res.append({Qt::Key::Key_F, "Ctrl+F", "", Qt::Modifier::CTRL});
0140     res.append({Qt::Key::Key_X, "Ctrl+X", "", Qt::Modifier::CTRL});
0141 
0142     return res;
0143 }
0144 
0145 QVector<Key> KeysHelper::fnKeys()
0146 {
0147     QVector<Key> res;
0148     res.append({Qt::Key::Key_F1, "F1"});
0149     res.append({Qt::Key::Key_F2, "F2"});
0150     res.append({Qt::Key::Key_F3, "F3"});
0151     res.append({Qt::Key::Key_F4, "F4"});
0152     res.append({Qt::Key::Key_F5, "F5"});
0153     res.append({Qt::Key::Key_F6, "F6"});
0154     res.append({Qt::Key::Key_F7, "F7"});
0155     res.append({Qt::Key::Key_F8, "F8"});
0156     res.append({Qt::Key::Key_F9, "F10"});
0157     res.append({Qt::Key::Key_F10, "F10"});
0158     res.append({Qt::Key::Key_F11, "F11"});
0159     res.append({Qt::Key::Key_F12, "F12"});
0160 
0161     return res;
0162 }
0163 
0164 QVector<Key> KeysHelper::navKeys()
0165 {
0166     QVector<Key> res;
0167     res.append({Qt::Key::Key_Up, "↑", "go-up"});
0168     res.append({Qt::Key::Key_Down, "↓", "go-down"});
0169     res.append({Qt::Key::Key_Left, "←", "go-previous"});
0170     res.append({Qt::Key::Key_Right, "→", "go-next"});
0171 
0172     return res;
0173 }
0174 
0175 QVector<Key> KeysHelper::nanoKeys()
0176 {
0177     QVector<Key> res;
0178     res.append({Qt::Key::Key_Up, "↑", "go-up"});
0179     res.append({Qt::Key::Key_Down, "↓", "go-down"});
0180 
0181     res.append({Qt::Key::Key_Left, "←", "go-previous"});
0182     res.append({Qt::Key::Key_Right, "→", "go-next"});
0183 
0184     res.append({Qt::Key::Key_G, "Ctrl+G", "", Qt::Modifier::CTRL});
0185     res.append({Qt::Key::Key_X, "Ctrl+X", "", Qt::Modifier::CTRL});
0186     res.append({Qt::Key::Key_O, "Ctrl+O", "", Qt::Modifier::CTRL});
0187     res.append({Qt::Key::Key_R, "Ctrl+R", "", Qt::Modifier::CTRL});
0188     res.append({Qt::Key::Key_W, "Ctrl+W", "", Qt::Modifier::CTRL});
0189     res.append({Qt::Key::Key_K, "Ctrl+K", "", Qt::Modifier::CTRL});
0190     res.append({Qt::Key::Key_T, "Ctrl+T", "", Qt::Modifier::CTRL});
0191     res.append({Qt::Key::Key_C, "Ctrl+C", "", Qt::Modifier::CTRL});
0192 
0193     return res;
0194 }
0195 
0196 QVector<Key> KeysHelper::defaultKeys()
0197 {
0198     QVector<Key> res;
0199     res.append({Qt::Key::Key_Up, "↑"});
0200     res.append({Qt::Key::Key_Down, "↓"});
0201     res.append({Qt::Key::Key_Tab, "Tab"});
0202     res.append({Qt::Key::Key_Escape, "Esc"});
0203     res.append({Qt::Key::Key_Control, "Ctrl"});
0204     res.append({Qt::Key::Key_Alt, "Alt"});
0205     res.append({Qt::Key::Key_C, "Ctrl+C", "", Qt::Modifier::CTRL});
0206 
0207     return res;
0208 }
0209 
0210 QVector<Key> KeysHelper::signalKeys()
0211 {
0212     QVector<Key> res;
0213 
0214     res.append({Qt::Key::Key_Z, i18n("Pause"), "", Qt::Modifier::CTRL});
0215     res.append({Qt::Key::Key_C, i18n("Interrupt"), "", Qt::Modifier::CTRL});
0216     res.append({Qt::Key::Key_Backslash, i18n("Kill"), "", Qt::Modifier::CTRL});
0217 
0218     return res;
0219 }
0220 
0221 void KeysHelper::sendKey(const int &index, QObject *object)
0222 {
0223     if (index > this->m_keys.count() && index < 0)
0224         return;
0225 
0226     const auto key = this->m_keys.at(index);
0227     QKeyEvent *event = new QKeyEvent(QEvent::KeyPress, key.key, {key.modifier});
0228     QCoreApplication::postEvent(object, event);
0229 }
0230 
0231 void KeysHelper::setGroup(Group group)
0232 {
0233     if (m_group == group)
0234         return;
0235 
0236     m_group = group;
0237     this->setKeys();
0238     Q_EMIT groupChanged();
0239 }