редакторы, редакторы, кругом одни редакторы! |
[Dec. 7th, 2013|10:23 am] |
я так подумал, что redo от undo технически отличается только тем, что сохранять действия надо в другой стек. соответственно, поддержка redo в редакторе будет, это почти ничего не стоит.
а поддержка undo уже в контроле редактора. пошёл по пути наименьшего сопротивления и группировку вообще не делал: поскольку будет redo, то сделать слишком много undo не страшно.
ну и да: следует не забывать очищать стек redo при любых изменениях текста (кроме тех, которые от undo/redo и пришли). это несложно, libetx проследит.
конечно, в стеки можно заталкивать любые кастомные действия: контрол редактора заталкивает туда позицию курсора, например. |
|
|
Comments: |
Зачем другой? Undo - это движение по стеку операций вниз, redo - вверх. Если ты сделал несколько undo, а потом внёс изменения, все операции выше этого изменения уничтожаются. Ещё можно делать форк, но тогда буфер undo становится бинарным деревом, и превращается фактически в систему контроля версий с инкрементальным логированием по типу svn.
![[User Picture]](http://lj.rossia.org/userpic/197531/22349) | From: | ketmar |
Date: | December 7th, 2013 - 02:48 pm |
---|
| | | (Link) |
|
потому что redo и undo — разные операции. у меня не persistent struct, в стеке лежит операция, которую надо выполнить, чтобы привести текст к нужному виду. соответственно, операция «удалить» в undo превращается во «вставить» в redo. и наоборот.
сделать persistent struct — это теоретически красиво. но в случае сей — атомная пиздецома.
в принципе, можно хранить именно «выполненое» действие, но какой смысл? функции изменения текста сами заполняют undo-стек, так пусть и redo заполняют. в итоге операции undo/redo — один и тот же код, фактически. всё, что надо — свитчнуть указатель на стеки.
Да, здесь достаточно двусвязного списка.
![[User Picture]](http://lj.rossia.org/userpic/197531/22349) | From: | ketmar |
Date: | December 7th, 2013 - 06:02 pm |
---|
| | | (Link) |
|
undo уже работало. чем меньше лишнего кода вносится в библиотеки самого низкого уровня — тем лучше. в данном случае механизмы записи undo, уже протестированые в низкоуровневой библиотеке, можно на халяву использовать и для redo, для этого достаточно свопнуть хранилище. один своп — это сильно меньше кода, чем выкидывание уже готового механизма и вписывание нового. тем более если учесть, что тесты я успешно похерил.
![[User Picture]](http://lj.rossia.org/userpic/197531/22349) | From: | ketmar |
Date: | December 7th, 2013 - 06:04 pm |
---|
| | | (Link) |
|
вообще, как я писал, самый красивый подход тут — immutable data structure. но я заебусь на сях сраное цветное дерево в это превращать. | |