Шаблон команды для отмены/повторения: когда НЕ объединять команды отмены?

Я реализую функцию отмены/повторения в нашем графическом приложении на основе Qt5, используя QUndoCommands, которые имеют удобную функцию mergeWith(): например, если пользователь неоднократно нажимает кнопку увеличения размера шрифта в моем приложении, а не создает тонну команд в списке отмены, он просто обновляет одну команду в QUndoStack. Таким образом, одна отмена вернет исходный размер шрифта.

Это здорово, но иногда я не хочу автоматически объединять команды. Например, если я перетащу элемент в новое место и оставлю его там, а затем перетащу тот же элемент в другое место: мое приложение должно создать 2 команды перемещения, а не объединить их обе в одну команду.

Итак, вот список событий, которые, я думаю, создают логический разрыв, когда пользователь ожидает, что команда НЕ будет объединена со следующей командой, даже если следующая команда изменяет то же свойство того же объекта:

  • релиз мыши
  • виджет теряет фокус
  • таймер (через ??? секунд)
  • ввод текста, после ??? символов (или это можно обработать с помощью таймера?)
  • ввод текста после нажатия определенных клавиш, например backspace?

Как указано в вопросительных знаках в моем списке, я не совсем уверен, в каких ситуациях следует подавлять команды слияния. Итак, мой вопрос: есть ли какие-либо передовые методы в этом отношении? Где их найти?


person David Burson    schedule 01.04.2016    source источник
comment
Я не знаю никаких лучших практик, но я бы посоветовал посмотреть на поведение программы, которая работает так же, как вы хотите, чтобы ваша программа вела себя, и смоделировать ее на основе этого. Текстовый редактор, например   -  person kmdreko    schedule 02.04.2016
comment
Спасибо - я так и делаю, но так легко что-то упустить. Я думаю, что это было кем-то где-то задокументировано. Однако моих поисковых навыков не хватило, чтобы найти его.   -  person David Burson    schedule 02.04.2016


Ответы (1)


FWIW, я не нашел никаких передовых практик, но для своего программного обеспечения я подавлял слияния при изменении фокуса (что в моем приложении также происходит при отпускании мыши в графической части). Кроме того, для набора текста я подавляю слияния, если позиция ввода изменяется не так, как ожидается при удалении или вводе 1 символа, и если пользователь переключается между удалением символов и вводом символов.

Я не заморачивался ни с таймером, ни с максимальным количеством символов при наборе.

person David Burson    schedule 06.04.2016