для невидимых изменений можно попап показывать, сообщающий что именно было изменено, с кнопкой «просмотреть изменения», например
Обдумывал подобное. Напр в меню написать не просто "Undo", а напр "Undo Painting". Это конечно лучше чем ничего, но все равно мало информативно, да и длина текста в меню уж слишком коротка. Предъявить стек undo виде окна - тоже мне хлопот много, а юзеру толку чуть. Как правило в undo закидываются целые структуры (не возиться же с каждым полем). Тип и визуальное имя структуры в общем случае неизвестны до выполнения undo
в браузерах такое есть - закрыл окно, вернул его обратно, можешь вернуться по окну в истории (undo внутри окна)
удобно
Это "история", а не undo
в принципе с локальным стеком все довольно просто:
- до открытия окна, у вас состояние модели данных, скажем, А, затем Б, затем В
- открыли окно, рисуем - локальный стек переходит в Г, потом в Д, и так до Х, например
- закрыли окно - локальный стек ушел, а его последнее состояние перешло в основной: там теперь имеем А,Б,В,Х
- если теперь сделаем undo - то перейдем в В (т.е. то, что было до открытия окна), забыв про Г, Д и другие.
- ну и т.д.
Чуть продолжим пример. Начал рисовать, тыкнул раз мышей (шаг Г), смотрит - деталировка объекта маловата, взял и увеличил ее (шаг Д) и опять пытается рисовать (E - X). Закончил рисование, закрыл окно и давит undo. При переходе к шагу "B" рухнет т.к. не было отката для шага "Д" (данные B соответствуют деталировке которая уже изменена)
Сливать (объединять) однотипные undo в стеке можно, но это может быть и в плюс и в минус. Напр "слили после закрытия окна" - вроде логично, но лишает возможности снова открыть окно и откатиться на любое число шагов
Думаю тут вообще нет хорошего решения