aboutsummaryrefslogtreecommitdiff
path: root/src/keymap/KeySeqParser.cpp
blob: c5534eb0604b6e57875a89517d90d0f1aac429e6 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include <QWidget>
#include <QtCore>
#include <algorithm>

#include "keymap/KeySeqParser.hpp"

bool operator==(const KeyChord a, const KeyChord b) {
  return a.mod == b.mod && a.key == b.key;
}

KeySeqParser::KeySeqParser() {}

QList<KeyChord> KeySeqParser::parse(QString keySequence) {
  QList<KeyChord> keyChords;
  KeyChord lastKey;

  // TODO: Refactor
  // TODO: Support <C-S-t>
  keySequence = keySequence.toLower();
  while (!keySequence.isEmpty()) {
    int skipCount = 1;
    if (keySequence.startsWith("<c-")) {
      int nextClosing = keySequence.indexOf('>');
      auto keyName = keySequence.sliced(3, nextClosing - 3);
      lastKey.mod = lastKey.mod | Qt::KeyboardModifier::ControlModifier;
      lastKey.key = parseKey(keyName);
      skipCount = nextClosing + 1;
    } else if (keySequence.startsWith("<s-")) {
      int nextClosing = keySequence.indexOf('>');
      auto keyName = keySequence.sliced(3, nextClosing - 3);
      lastKey.mod = lastKey.mod | Qt::KeyboardModifier::ShiftModifier;
      lastKey.key = parseKey(keyName);
      skipCount = nextClosing + 1;
    } else if (keySequence.startsWith("<")) {
      int nextClosing = keySequence.indexOf('>');
      auto keyName = keySequence.sliced(1, nextClosing - 1);
      lastKey.mod = Qt::KeyboardModifier::NoModifier;
      lastKey.key = parseKey(keyName);
      skipCount = nextClosing + 1;
    } else {
      auto keyName = keySequence.first(1);
      lastKey.mod = Qt::KeyboardModifier::NoModifier;
      lastKey.key = parseKey(keyName);
    }

    keySequence.slice(std::max(1, skipCount));
    keyChords.push_back(lastKey);
    lastKey = KeyChord();
  }

  return keyChords;
}

Qt::Key KeySeqParser::parseKey(QString keyName) {
  if (keyName.length() == 0)
    return Qt::Key_T; // TODO: tmp

  if (keyName.length() == 1) {
    char c = keyName.toStdString().at(0);
    return Qt::Key(Qt::Key_A + (c - 'a'));
  }

  if (keyName == "space")
    return Qt::Key_Space;

  if (keyName == "cr")
    return Qt::Key_Return;

  if (keyName == "esc")
    return Qt::Key_Escape;

  if (keyName == "bs")
    return Qt::Key_Backspace;

  if (keyName == "tab")
    return Qt::Key_Tab;

  return Qt::Key_T;
}