[Из песочницы] Клавиатура из пяти кнопок
Графические интерфейсы — штука удобная, но иногда их не хватает. Сделать удобный интерфейс это искусство и большая трата ресурсов. Поэтому в большинство программ можно попасть только через командную оболочку.
Интерфейс командной строки легко и удобно создавать, расширять функционал, не заботясь о пользователе.
Если надо что-то настроить, а нужного пункта в меню нет, то можно руками залезть в конфиг. Если нет доступа к конфигу, то приходится страдать.
Это я подвожу к тому, что даже имея графический интерфейс, текстовый может быть очень полезен, особенно если при разработке что-то не предусмотрели.
Размышления про клавиатуру в Flipper Zero вызвали вялотекущее обсуждение про оптимизацию способов ввода. Мне тоже нравятся велосипеды, поэтому вот пара диких идей.
Прокрутка с умной сортировкой
Будем отталкиваться от простого скролла символов.
Есть набираемый текст, навигация по тексту — стрелки влево/вправо. Чтобы выбрать символ, листаем стрелками вверх/вниз линейный список из всех символов.
Это довольно неудобно, сделаем пару улучшений.
На основе введенного пользователем текста, будем собирать статистику по n-граммам символов. В самом простом случае, берем предыдущие 4 символа, сортируем таблицу символов по частоте использования с этой тетраграммой. Пользователь начинает листать вниз и быстрее находит нужный символ. При прокрутке вверх находится фиксированный набор служебных команд, вроде пробела, удаления предыдущего символа, переключения регистра и раскладки.
Для узкого спектра задач, такой способ сгодился бы, но для человека это все-таки слишком сложно. Приходится концентрировать внимание, чтобы не пропустить нужный знак, а это утомляет.
Троичная система
А что если просто запомнить расположение нужных диапазонов символов в юникоде?
Набираем код символа, подтверждаем, набираем следующий.
Имеем 5 кнопок. Если одну будем использовать для подтверждения ввода, вторую для стирания последнего разряда, остается 3 кнопки на цифры. Допустим, вверх — 0, вправо — 1, вниз — 2.
Достаточно привыкнуть к троичной системе и выучить диапазоны нужных кодов. Удобство сомнительное, но привыкнуть к такому способу ввода, намного легче, чем зубрить морзянку. Есть некоторая избыточность, имеется возможность вводить все, от управляющих символов до эмодзи, но вряд-ли у кого-то будет нужда использовать более сотни букв и знаков пунктуации.
Двухмерный скролл
Расширим скролл в несколько рядов символов, отсортируем по частоте использования, таким образом, чтобы манхэттенское расстояние от стартовой точки до символа, было тем больше, чем он реже используется.
Получается намного удобней, никакой подготовки не требуется. Небогатый, интуитивно понятный интерфейс, вполне годится для маленького дисплея. В кнопочных телефонах подобным способом можно набирать всякие спецсимволы. Но сократив размер до одной строки, можно реализовать это и на совсем крохотных экранах.
Ввод должен быть визуально контролируемым, тогда не требуется долгое обучение (привет морзянка) и расстановка символов должна быть статичной, иначе быстрого набора не получится. Хотя, может это дело привычки, если бы у нас часто используемые кнопки сами прыгали под пальцы, мозг смог бы адаптироваться, но имеем то, что имеем.
Еще можно придумать всякие коды Хаффмана, но это лишние усложнения, плюс невозможность расширения, азбука Морзе тому пример.
Вот ссылка на код демки, используемой в посте
Подключается как питоновская библиотека, функция ternary опционально принимает строку для редактирования. Чтобы перейти из режима навигации, надо нажать стрелку вверх. В режиме редактирования набирается троичный код символа (вверх — 0, вправо — 1, вниз — 2, влево — стереть последний разряд, Enter — подтвердить). Для выхода надо нажать Enter, функция вернет отредактированную строку.
В функции roll все намного проще — стрелками выбираем символ, подтверждаем кнопкой Enter. В первой верхней строке: вставка табуляции, Shift, Backspace, пробел, перевод строки, Delete и Caps Lock.