но как, Холмс?! |
[Feb. 14th, 2022|12:23 am] |
в принципе, редактор юзабелен. апи без особых проблем продолжает высовываться в скрипты, как довысуну — буду переносить хардкод. всё более-менее можно юзать, сейчас пользуюсь исключительно sxed, к edgap (прошлому) не возвращаюсь. но. есть проблема. нет ундо.
не, сам механизм ундо я сделал сразу, там несложно: просто ведём лог удалений и вставок. но это неудобно в реальном использовании. штука в том, что лог изменений ведёт текстовый буфер, а он не знает ни про выделеные блоки, ни про курсор, вообще ни про что кроме текста. поэтому надо, чтобы фрэймы тоже имели какую-то возможность писать в ундо-лог, и получать оттуда события. и вот тут открывается банка с червями.
во-первых, API. я не могу придумать красивого апи для этого. а это автоматически обозначает, что я что-то делаю не так.
во-вторых, redo. я бы хотел, чтобы фрэйм сохранял изменения в выделеных блоках, и иногда даже движения курсора. но такие записи автоматически уничтожают redo-записи. получается, сделал undo, перепометил блок — и всё, redo уже сделать нельзя, хоть текст и не менялся. а текст всё-таки основная сущность. ну да, фрэйм получает событие «сейчас совершается унда», так что он может откатить и что-то своё, но вести во фрэйме параллельный ундо-лог… не нравится мне это.
однако, в-третьих: для одного буфера может быть открыто несколько фреймов. это штатная возможность, не хак. и им всем надо как-то сохранять унды, и не разваливаться от ундов из другого фрейма. опять таки: с изменениями текста фрэймы справятся, это они умеют. а с другими событиями? и как, собственно, совать оные события, и разделять их потом?
в общем, как ни крути, а получается, что придётся делать параллельные ундо-логи во фрэйме и в буфере. но мне очень, очень не нравится это решение. ужасно неизящно.
да, в прошлом редакторе это тоже не было никак толком решено. но он не умел открывать несколько фрэймов для одного текста вообще, там буфер был намертво прибит гвоздями к интерфейсу просмотра и работы с ним. а redo там как раз было совершенно неюзабельно, потому что edgap писал все перемещения курсора и изменения выделений блока, поэтому redo разрушал почти сразу. |
|
|