Блок задач

3. Структуры данных

Темы
Сложность 4

Задача «Горячие клавиши»

Разработать класс, позволяющий манипулировать горячими клавишами. Горячая клавиша - клавиша или сочетание клавиш на клавиатуре, которому сопоставлено некоторое действие, команда.

Входные данные

Текстовый файл (или несколько), содержащий набор горячих клавиш и назначенных им команд. Пример:

Ctrl+Alt+Del = reset
Ctrl+C = copy
Ctrl+Ins = copy
Ctrl+V = paste
Shift+Ins = paste
Ctrl+X = cut
Shift+Del = cut
F1 = help

Сочетания клавиш даны как строки, в рамках задачи можно считать, что названия сочетаний оформлены всегда правильно и однотипно, например, сперва Ctrl (если есть), затем Alt (если есть), затем Shift (если есть), затем название клавиши с заглавной буквы. Названия команд также заданы как строки.

Постановка задачи

Разработать класс, позволяющий манипулировать горячими клавишами. Примерный интерфейс:

#include <string>
#include <vector>

class HotkeyMap {
public:
    const std::string & operator[](const std::string & key) const;

    bool add_key(const std::string & key, const std::string & cmd);

    size_t add_cmd(const C & cmd, std::vector < std::string > keys);

    bool remove_key(const std::string & key);
    bool remove_cmd(const std::string & cmd);

    std::vector<std::string> get_cmds(void) const;
    std::vector<std::string> get_keys(const std::string & cmd) const;

    HotkeyMap copy(void) const;
    std::vector<std::string> merge(const HotkeyMap & map);
    void clean(void);
};
  • operator [] - находит команду связанную с горячей клавишей. По логике, эта функция наиболее часто вызываемая и потому должна быть быстрой.
  • add_key - добавляет связку “горячая клавиша - команда”. Если данная клавиша уже привязана к другой команде (конфликт при добавлении в контейнер), то ничего не делает, возвращает false.
  • add_cmd - добавляет набор горячих клавиш для указанной команды. Если возник конфликт, процесс добавления прерывается, и возвращаемое значение указывает на номер конфликтной горячей клавиши в наборе.
  • remove_key - удаляет горячую клавишу. Если указанная горячая клавиша отсутствует в контейнере - возвращает false.
  • remove_cmd - удаляет команду и все связанные с ней горячие клавиши. Если заданная команда отсутствует в контейнере - возвращает false.
  • get_cmds - возвращает все команды.
  • get_keys - возвращает все горячие клавиши для указанной команды.
  • copy - создаёт полную копию контейнера
  • merge - объединяет содержимое контейнеров и возвращает список конфликтующих горячих клавиш.
  • clean - очищает контейнер.

Выходные данные

Варианты:

1) Даны два файла с наборами горячих клавиш и назначенных им команд. Загрузить файлы, распечатать, объединить, распечатать список конфликтов, объединенный результат записать в третий файл.

Пример вывода программы:

file1:
copy    Ctrl+C, Ctrl+Ins, 
paste   Ctrl+V, Shift+Ins, 
reset   Ctrl+Alt+Del, 

file2:
move    Ctrl+M, F6, 
copy    Ctrl+C, F5, 
search  Ctrl+V, F7, 

conflicts: 1
Ctrl+V

file3 = file1.merge(file2):
copy    Ctrl+C, Ctrl+Ins, F5, 
paste   Ctrl+V, Shift+Ins, 
reset   Ctrl+Alt+Del, 
move    Ctrl+M, F6, 
search  F7, 

2) Дан файл с набором горячих клавиш и назначенных им команд, а так же файл со списком горячих клавиш и команд которые нужно удалить. Загрузить оба файла, удалить горячие клавиши и команды, сохранить результат в третий файл.

Пример вывода программы:

file1:
copy    Ctrl+C, Ctrl+Ins, F5, 
paste   Ctrl+V, Shift+Ins, 
reset   Ctrl+Alt+Del, 
move    Ctrl+M, F6, 
search  F7, 

remove items:
Ctrl+Alt+Del
Ctrl+Ins
move

file2:
copy    Ctrl+C, F5, 
paste   Ctrl+V, Shift+Ins, 
search  F7,