crypt of decay - редакторы, редакторы, кругом одни редакторы! [entries|archive|friends|userinfo]
ketmar

[ userinfo | ljr userinfo ]
[ archive | journal archive ]

редакторы, редакторы, кругом одни редакторы! [Dec. 7th, 2013|10:23 am]
Previous Entry Add to Memories Tell A Friend Next Entry
я так подумал, что redo от undo технически отличается только тем, что сохранять действия надо в другой стек. соответственно, поддержка redo в редакторе будет, это почти ничего не стоит.

а поддержка undo уже в контроле редактора. пошёл по пути наименьшего сопротивления и группировку вообще не делал: поскольку будет redo, то сделать слишком много undo не страшно.

ну и да: следует не забывать очищать стек redo при любых изменениях текста (кроме тех, которые от undo/redo и пришли). это несложно, libetx проследит.

конечно, в стеки можно заталкивать любые кастомные действия: контрол редактора заталкивает туда позицию курсора, например.
Linkmeow!

Comments:
[User Picture]
From:[info]gregory_777
Date:December 7th, 2013 - 02:41 pm
(Link)
Зачем другой? Undo - это движение по стеку операций вниз, redo - вверх. Если ты сделал несколько undo, а потом внёс изменения, все операции выше этого изменения уничтожаются. Ещё можно делать форк, но тогда буфер undo становится бинарным деревом, и превращается фактически в систему контроля версий с инкрементальным логированием по типу svn.
[User Picture]
From:[info]ketmar
Date:December 7th, 2013 - 02:48 pm
(Link)
потому что redo и undo — разные операции. у меня не persistent struct, в стеке лежит операция, которую надо выполнить, чтобы привести текст к нужному виду. соответственно, операция «удалить» в undo превращается во «вставить» в redo. и наоборот.

сделать persistent struct — это теоретически красиво. но в случае сей — атомная пиздецома.

в принципе, можно хранить именно «выполненое» действие, но какой смысл? функции изменения текста сами заполняют undo-стек, так пусть и redo заполняют. в итоге операции undo/redo — один и тот же код, фактически. всё, что надо — свитчнуть указатель на стеки.
From:[info]phantom
Date:December 7th, 2013 - 05:53 pm
(Link)
Да, здесь достаточно двусвязного списка.
[User Picture]
From:[info]ketmar
Date:December 7th, 2013 - 06:02 pm
(Link)
undo уже работало. чем меньше лишнего кода вносится в библиотеки самого низкого уровня — тем лучше. в данном случае механизмы записи undo, уже протестированые в низкоуровневой библиотеке, можно на халяву использовать и для redo, для этого достаточно свопнуть хранилище. один своп — это сильно меньше кода, чем выкидывание уже готового механизма и вписывание нового. тем более если учесть, что тесты я успешно похерил.
[User Picture]
From:[info]ketmar
Date:December 7th, 2013 - 06:04 pm
(Link)
вообще, как я писал, самый красивый подход тут — immutable data structure. но я заебусь на сях сраное цветное дерево в это превращать.