Я реалізую додаток Java, що включає стек скасування / повторення. Я помітив, що деякі програми (наприклад TextEdit на Mac OS X) дозволяють вибрати "Скасувати введення тексту" в меню "Редагувати" після введення тексту. Я також хотів би реалізувати таку річ у своєму додатку, але мені дуже важко знайти вказівки щодо того, як вона повинна вести себе.
З деякими спробами та помилками я найкраще здогадуюсь про те, як поводиться скасування друку TextEdit:
- Коли користувач вводить новий символ (або набирає ключ видалення), з'єднайте його з попереднім елементом Скасувати введення тексту, якщо він знаходиться у верхній частині стека скасування, якщо не трапляється одна з наступних ситуацій.
- Завжди створюйте новий елемент «Скасувати введення тексту» після того, як користувач продовжить вводити принаймні 15 секунд бездіяльності
- Завжди створюйте новий елемент Скасувати введення тексту після того, як користувач вводить протягом тривалого періоду часу та виконує якусь умову (не вдалося зрозуміти, чи це було на основі часу чи на основі кількості символів).
- Завжди створюйте новий елемент Скасувати введення тексту, коли вибраний будь-який текст, а потім видалено або перезаписано (вибравши текст, не внести змін, потім повернутися до початкової точки вставки та продовжуючи вводити це не запускає)
На практиці стратегія Apple, здається, працює (принаймні, це працює для мене під час введення), але, як зазначалося в останньому пункті, я не зміг зрозуміти правила. Крім того, схоже, що інші програми дотримуються різних правил, таких як Microsoft Word. Google не створив визначений перелік правил для будь-якої реалізації функції скасування друку, і я не натрапив на кращі практики щодо того, як він повинен вести себе. То як воно має поводитися? Або це лише до примх програміста?
EDIT: Просто для уточнення, зараз мене не цікавлять деталі впровадження. Мені особливо цікаво, чи існує авторитетна довідка (наприклад, найкраща практика чи документ із користувальницьким інтерфейсом), що описує це чи опис того, як воно реалізується у кількох продуктах.
124<delete>3
, після його скасування та повторного повторення це призведе до 123
. Я здогадуюсь, що перевага цього полягає в тому, що це призводить до остаточного стану тексту користувача, дещо як вищенаведена пропозиція.