View Issue Details
ID | Project | Category | View Status | Date Submitted | Last Update |
---|---|---|---|---|---|
0000867 | Far Manager | Editor | public | 2009-05-16 12:09 | 2010-05-02 20:40 |
Reporter | lort | Assigned To | lort | ||
Priority | normal | Severity | feature | Reproducibility | have not tried |
Status | closed | Resolution | fixed | ||
Fixed in Version | 2.0 | ||||
Summary | 0000867: Поддержка redo в редакторе | ||||
Description | Добавил в редактор поддержку redo, повесил на CtrlShiftZ. Сейчас не работает ограничение на размер undo, может его вообще убрать стоит? Заодно убрал поле UndoNext в EditorUndoData, группа операций, которые должны откатываться за один раз, теперь заключается между записями с типом UNDO_STARTBLOCK и UNDO_ENDBLOCK, предлагаю добавить в API/макросы возможность создания таких записей - тогда можно будет самому создавать атомарно откатываемые операции. | ||||
Additional Information | для информации http://forum.farmanager.com/viewtopic.php?f=6&t=2725&p=38003&hilit=MultiEdit#p38003 | ||||
Tags | No tags attached. | ||||
Build | 1010 | ||||
2009-05-16 12:09
|
|
|
> Сейчас не работает ограничение на размер undo, может его вообще убрать стоит? Я таки думаю, что стоит оставить верхний предел, но выставить его по умолчанию в 0, т.е. без ограничения (и вывести опцию в настройки). Возможно имеет смысл как-то в статусной строке индицировать о достижении предела (если задан). |
2009-05-18 20:17
|
|
|
Ограничение вернул. А как насчёт апи с макросами? Предлагаю что-нибудь вроде: EditorControl(ECTL_UNDOBLOCK, 0) - пометить начало блока операций EditorControl(ECTL_UNDOBLOCK, (void*)1) - пометить конец блока операций и в макросах соответственно: Editor.UndoBlock(0) и Editor.UndoBlock(1) |
|
ECTL_UNDOBLOCK - как то коробит и... в памяти сразу возникает мысль про выделенные в редакторе блоки (если я правильно понял, то UNDO_STARTBLOCK и UNDO_ENDBLOCK - это некие маркеры начала и конца атомарной операции). Переименовать бы, например, просто UNDO_START и UNDO_END :-) На счет АПИ: аналогично. Я бы обозвал это как ECTL_UNDOREDO, а в качестве Param для EditorControl - некую структуру, аля struct EditorUndoRedo { int Command; // EUR_GETINFO,EUR_BEGIN,EUR_END,EUR_UNDO,EUR_REDO DWORD_PTR Reserved[3]; // ХЗ, надо подумать... }; ("структуру" - чтобы на будущее заложить возможность расширения работы с undo/redo) На счет макросов - без проблем, но потом, когда сабж заработает (ибо находу править и то и то - накладно с точки зрения пользователя) :-) |
|
...кстати, увидел в дифе dlist.* а чем не устроил TList.hpp? |
2009-05-19 20:53
|
|
|
Сдалал ECTL_UNDOREDO. Насчёт TList - здесь, думаю, можно и его приделать, но вообще он мне не понравился тем, что там всего один итератор, который жестко к классу привязан. Например такая задача: есть некий список, надо построить из него меню, и когда ползователь жмёт Delete на каком-нибудь элементе, надо соответствующий элемент из списка удалять. С моим списком можно просто в UserData сохранять указатель на элемент и потом удалять его с помощью MyList.Delete(указатель), а если через TList делать то придётся номер элемента в списке сохранять и потом по всему списку этот элемент искать |
|
Ну плодить одинаковые классы не надо, можно: 1. улучшить tlist 2. сделать новый класс который наследует tlist и добавляет нужный функционал (как например сделано в истории). |
|
Тогда предагаю DList за основу взять, TList пока всё равно мало где используется, history и namelist я переделаю. |
|
Вопрос. Если что-то или кто-то сделал ECTL_UNDOREDO(EUR_BEGIN), потом что-то сделал и... не поставил в конце ECTL_UNDOREDO(EUR_END). Как себя поведет ФАР в этом случае? По поводу DList. Разумнее разделить: сначала сделать этот патч, а потом, отдельным патчем курочить хистори и намелист. |
|
Ну против DList тогда ничего не имею, класс хитрый :) Но тогда будем ждать отдельного патча для его заюзывания везде (наверно можно и за место tstack тоже). |
|
а зачем tstack убирать? он почти узкоспециализированный, свою работу делает отлично... моя твоя непонимайт |
|
Ну понесло меня немного :) |
|
>Если что-то или кто-то сделал ECTL_UNDOREDO(EUR_BEGIN), потом что-то сделал и... не поставил в конце ECTL_UNDOREDO(EUR_END). >Как себя поведет ФАР в этом случае? Фар будет считать что всё, что дальше - это одна большая атомарная операция, если размер буфера ограничен то через некоторое время undo вообще работать перестанет, и не заработает пока фар UNDO_END не получит. Патч для history и namelist в выходные, наверно, сделаю. |
|
И в новых файлах поставь копирайт как надо. dlist я надеюсь это твой личный код? |
2009-05-23 18:37
|
|
|
Да, код мой, патч для замены TList на DList сделал - DList.zip, там же новые DList.* с копирайтами, в DList.hpp я ещё описание методов добавил. |
|
937 + 938. Надо видимо ещё хэлп обновить упоминанием про реду. |
|
кроме хелпа - добавить клавишу на AltShiftBS (для единообразия, в дополнение к CtrlShiftZ) |
|
Про макросы. Как мальчика назовем? Предлагается вариант V=Editor.Undo(N) здесь N: 0 - BEGIN - начало блочной операции 1 - END - конец блочной операции 2 - UNDO - сделать таки Undo 3 - REDO - сделать Redo Хотя... А что будет вот в таком варианте (и вариации) BEGIN UNDO END Здесь Undo применится к... чему? к предыдущему блоку или к нынешнему? Кстати, lort, а нет желания поработать над темой Undo/Redo в строках ввода? (комстрока, строки ввода в диалогах... - все, что юзает класс Edit, кроме редактора, т.к. здесь уже есть) |
|
ну это ты наверняка значешь (код смотрел, анализировал), или просто "по идеи так"? |
|
а как потом себя ундатор поведет, когда достигнет END? |
|
Я правильно понял, что UNDO/REDO в середине должен разделить блок на 2? |
|
Подумав, поудалял свои старые заметки. >Хотя... А что будет вот в таком варианте (и вариации) >BEGIN UNDO END >Здесь Undo применится к... чему? к предыдущему блоку или к нынешнему? Более гибким будет вариант "Undo применится к предыдущему действию" (не блоку) Соответственно при этом никакого разделения не возникает. Остаётся вопрос что делать с непарными бегинами и эндами. (Непарный BEGIN - второй BEGIN при незакрытом первом Непарный END - END без предшествующего BEGIN'а) Предлагаю бегины замещать а энды игнорировать. |
|
>Предлагается вариант V=Editor.Undo(N) Нормально вроде >Хотя... А что будет вот в таком варианте (и вариации) >BEGIN UNDO END Сейчас UNDO просто удалит BEGIN и в результате один END останется, стоит, наверно, вообще UNDO в таких случаях отключать, то есть при такой последовательноси: действие1 BEGIN действие2 UNDO1 UNDO2 END UNDO3 UNDO1 откатывает действие2, UNDO2 ничего не делает, UNDO3 откатывает действие1 Вложенные блоки, вроде BEGIN1 действие1 BEGIN2 действие2 действие3 END2 END1 это вполне нормальная ситуация, если сделать здесь в конце UNDO то откатится всё до BEGIN1 Вот одиночный END может быть проблеммой - сейчас если для него UNDO сделать то откатится вообще всё, я добавлю проверку для такого случая Насчёт Undo/Redo в строках ввода - может потом как-нибудь, сейчас в редакторе работу с не OEM кодировками для старых плагинов сделать хочу, а то S&R текст портит, потом ещё хотел что-нибудь вроде плагина Multi-panel к фару приделать, но с поддержкой плагиновых панелей |
|
>действие1 BEGIN действие2 UNDO1 UNDO2 END UNDO3 >UNDO1 откатывает действие2, UNDO2 ничего не делает, UNDO3 откатывает действие1 а)А как насчёт того чтобы UNDO2 откатывало действие1 и перемещало туда BEGIN? б)И раз допустимы вложенные блоки то нужна возможность как-то получать информацию о том что мы находимся в блоке такой-то вложенности (для того чтобы корректно закрывать END'ы) в)И ещё неплохо иметь функцию просто отменяющую последний BEGIN |
|
А зачем всё это может понадобиться? Я себе использование так вижу - плагин или макрос как-то изменяет текст в редакторе и хочет чтобы эти изменения откатывались за один раз, тогда просто в начале последовательности действий ставится BEGIN, а в конце - END, и неважно какая там сейчас вложенность и какие именно действия между BEGIN и END находятся. |
|
Хочется более полного контроля контроля над процессом. В частности: а) "стоит, наверно, вообще UNDO в таких случаях отключать" - лучше не отключать "UNDO2 ничего не делает" - это для пользователя не очень понятно, поскольку никак не визуализируется. То что при этом удаляется BEGIN - тоже не всегда хорошо: можно случайно удалить, и потом напрасно на него рассчитывать б) в) Нет контроля над вложенностью блоков, поэтому случайный лишний END может нам напакостить. Пока это всё используется плагином - всё в принципе контролируемо, а вот если будут макросы, которые пользователь станет вручную вызывать... Может получится как-то неаккуратненько. В целом, мелочи конечно... можно и обойтись |
|
Пользователь, макросы - эти слова в месте не живут поэтому не надо воротить тут разного. |
|
Не понял почему пользователи не живут с макросами |
|
Потому что тот человек который пишет макросы используя макро-язык он уже ну ни как не простой тупой пользователь. И поэтому то что верно для плагинов, также верно и для макросов. |
|
1)Ну у продвинутого пользователя запросто может "дрогнуть рука", не хуже чем у тупого. 2)Плагин устанавливающий блоки, к примеру, сам может учесть где он сделал вложенные блоки, и вложенные во вложенные, и т. д. - это ж программа. В случае же макросов, вызываемых горячей клавишей... Пользователь вряд ли сознательно сможет пользоваться вложенными блоками - не станет же он считать в уме до какого уровня вложенности он там уже дошёл, а никакой индикации нет. Другое дело, что можно написать умный макрос, но для этого должны быть доступны средства контроля над вложенностью. (Просто пояснил написанное выше) |
|
А поясните, как им пользоваться в макросах? Или я бегу впереди паровоза, и это ещё не реализовано? PS: Заодно хотелка — иметь параметр для макроса — «Single undo block», и соответственно ставить его при записи. Чтоб не возиться вручную с этими editor.undo(0) … editor.undo(1) |
|
Макросы ещё не реализованы. Если вручную не возится, то editor.undo(3) просто отменит последнее действие. Что вы имели ввиду под «Single undo block» и при записи чего его надо ставить? |
|
Я подразумевал, что между BEGIN и END никаких пользовательских действий вообще быть не должно - тогда никаких проблем со вложенностью и не будет. Вообще вложенность там нужна из-за того, что действия, которые макрос/плагин вызывает, могут сами из нескольких действий состоять, например удаление блока строк в фаре реализовано как блок BEGIN - END внутри которого отдельные строки удаляются. |
|
> Что вы имели ввиду под «Single undo block» и при записи чего его надо ставить? Я имел в виду опцию, аналогичную «Разрешить во время выполнения вывод на экран», и при записи — макроса, естественно. > Если вручную не возится, то editor.undo(3) просто отменит последнее действие. Нет, не то. Это отменит последний атом, а мне хочется, чтоб при записи макроса была возможность поставить ему (макросу) флаг, который бы позволил отменить весь макрос за одно действие. Вручную. Без того, чтоб редактировать макрос отдельно. lort, а что будет, если между editor.undo(0) и editor.undo(1) пользователь прервёт макрос? Откат будет именно до editor.undo(0)? |
|
2lort >Я подразумевал, что между BEGIN и END никаких пользовательских действий вообще >быть не должно - тогда никаких проблем со вложенностью и не будет. vskirdin намерен довавить в макроязык функции для управления блоками undo Таким образом они станут доступны пользователю, который сможет использовать их для своих целей. Отсюда потенциально возникают проблемы с вложенностью. Впрочем, "умные" макросы способны избавить от этих потенциальных проблем, но для этого нужно реализовать дополнительно то о чём я говорил выше. Если интересно, то могу привести примеры таких макросов. Если неинтересно - тоже ничего страшного: в худшем случае пользователь просто потеряет Undo, а это можно пережить. |
|
>>Я подразумевал, что между BEGIN и END никаких пользовательских действий вообще >>быть не должно - тогда никаких проблем со вложенностью и не будет. >vskirdin намерен довавить в макроязык функции для управления блоками undo ну как бы макросы макросами, но АПИ уже есть, так что фраза "между BEGIN и END никаких пользовательских действий" - звучит оптимистично :-) |
|
2Kildor Не думаю что такая опция будет шибко полезна. Разве трудно будет добавить в свой макрос editor.undo(0) ... editor.undo(1)? А выше в обсуждении речь идёт о том случае, когда editor.undo(0) и editor.undo(1) будут находится вообще в РАЗНЫХ макросах (назначены на разные сочетания). На вопрос который вы задаёте lort'у он уже отвечал выше >действие1 BEGIN действие2 UNDO1 UNDO2 END UNDO3 >UNDO1 откатывает действие2, UNDO2 ничего не делает, UNDO3 откатывает действие1 |
|
Под "пользовательскими действиями" я имел в виду интерактивную работу с редактором - поставил BEGIN, набрал какой-то текст, поставил END. Нужны примеры зачем такое может понадобиться. При прерывании макроса в середине получится незакрытый BEGIN, и тут действитально пользователь удивится если на нём UNDO работать прекратит. Так что пусть лучше всё остаётся как есть - UNDO удаляет BEGIN. |
|
>Нужны примеры зачем такое может понадобиться. Например: перед использованием какого-либо старого плагина ставим (вручную) BEGIN, а после - END. Не всегда можно намакростить сразу "BEGIN <вызов плагина> END" - ведь многие плагины работают интерактивно. |
|
А если что-то вроде такого попробовать? Editor.Undo(0) вызов плагина $while(условие) %key=waitkey(); eval(%key) $end Editor.Undo(1) |
|
А что именно предполагается в качестве условия? В случае интерактивного использования плагинов придётся довольно хитрые условия придумывать (и отлаживать) И не надо забывать что макрос может прерваться по Ctrl-Break... В общем выкрутится можно и без того что я предлагал, но это сильно сужает возможности |
|
>А что именно предполагается в качестве условия? $while(!Editor) например >В случае интерактивного использования плагинов придётся довольно хитрые условия придумывать (и отлаживать) А про какие плагины речь? >И не надо забывать что макрос может прерваться по Ctrl-Break... А зачем его прерывать? Я в реальной работе, по моему, ни разу не прерывал, только при отладке. Тут к тому же макрос будет интерактивный, если с waitkey и eval делать |
|
>$while(!Editor) например Ага, теперь понял ваш интерактивный макрос. Надо попробовать в реальных условиях. 2vskirdin > 2 - UNDO - сделать таки Undo > 3 - REDO - сделать Redo А это надо? Ведь есть CtrlZ и т.д. |
|
> А это надо? Ведь есть CtrlZ и т.д. в середине макроса встречается CtrlZ - ты на 100 процентов уверен, что это не про Diz`ы? |
|
привет, вот на это кто-нибудь взглянет или новый тикет открыть? http://forum.farmanager.com/viewtopic.php?p=46391#p46391 (там и фикс, собственно, предлагается) суть - когда плагин зовет undo\redo происходит перерисовка - это нехорошо, так как undo\redo у плагина может быть только частью изменений и в результате имеем лишние мелькания экрана и прочие эффекты, которые глаз еще как успевает заметить. |
|
С лишней перерисовкой при вызове undo из плагина - lort на пляже в отпустке или есть сложности и помощь какая нужна? Если на пляже, нет проблем, подожду. Если сложности, я готов помочь. Раз undo теперь есть, то хочется его задействовать в уже существующем у меня сценарии, но по уму пока не получается из-за дефекта с отрисовкой.. |
|
Я не в отпуске, просто времени сейчас свободного мало, перерисовку убрал в 1010 билде |
|
lort, спасибо большое за фикс с перерисовкой, извини за мою нетерпеливось. Эту часть фикса проверил, все работает отлично, если оно и могло что-то закосить, я этого пока найти не могу. |
|
Хоть я теперь уже вполне счастлив с новыми возможностями, есть один вопрос вам на подумать. Хотелкой я даже это не называю. В некоторых сценариях было бы таки неплохо вырубить внутренний механизм Undo\Redo либо временно определенными командами, либо для некоторого редактора вообще на всю сессию. Просто действительно есть случаи, когда Undo\Redo не нужен, а работа в редакторе идет будь здоров при этом, тогдаа производительность и ресурсы страдают ни за что. |
|
Ну и команда, чтоб очисть буффер анду для текущего редактора. |
|
lort, а посмотри ка тикет 0000185 |
Date Modified | Username | Field | Change |
---|---|---|---|
2009-05-16 12:09 | lort | New Issue | |
2009-05-16 12:09 | lort | File Added: redo.zip | |
2009-05-18 07:07 | vskirdin | Note Added: 0003156 | |
2009-05-18 20:17 | lort | File Added: redo2.zip | |
2009-05-18 20:18 | lort | Note Added: 0003158 | |
2009-05-19 08:22 | vskirdin | Note Added: 0003160 | |
2009-05-19 08:48 | vskirdin | Note Added: 0003161 | |
2009-05-19 09:29 | alexy | Status | new => assigned |
2009-05-19 09:29 | alexy | Assigned To | => vskirdin |
2009-05-19 20:53 | lort | File Added: redo3.zip | |
2009-05-19 20:58 | lort | Note Added: 0003182 | |
2009-05-19 21:03 | alexy | Note Added: 0003183 | |
2009-05-20 18:57 | lort | Note Added: 0003187 | |
2009-05-21 07:25 | vskirdin | Note Added: 0003188 | |
2009-05-21 07:55 | alexy | Note Added: 0003189 | |
2009-05-21 08:12 | vskirdin | Note Added: 0003190 | |
2009-05-21 08:16 | alexy | Note Added: 0003191 | |
2009-05-21 21:07 | lort | Note Added: 0003206 | |
2009-05-21 21:47 | alexy | Note Added: 0003207 | |
2009-05-23 18:37 | lort | File Added: DList.zip | |
2009-05-23 18:38 | lort | Note Added: 0003228 | |
2009-05-23 20:06 | alexy | Assigned To | vskirdin => alexy |
2009-05-23 20:30 | alexy | Note Added: 0003229 | |
2009-05-23 20:30 | alexy | Status | assigned => feedback |
2009-05-24 06:14 | vskirdin | Note Added: 0003232 | |
2009-05-24 10:20 | alexy | Relationship added | related to 0000033 |
2009-05-24 10:20 | alexy | Relationship added | related to 0000353 |
2009-05-25 10:38 | vskirdin | Note Added: 0003244 | |
2009-05-25 11:09 | vskirdin | Note Added: 0003249 | |
2009-05-25 11:11 | alexy | Assigned To | alexy => vskirdin |
2009-05-25 12:11 | vskirdin | Note Added: 0003253 | |
2009-05-25 12:34 | vskirdin | Note Added: 0003255 | |
2009-05-25 20:29 | JohnDoe | Note Added: 0003270 | |
2009-05-25 20:42 | JohnDoe | Note Edited: 0003270 | |
2009-05-25 23:10 | lort | Note Added: 0003271 | |
2009-05-26 07:39 | JohnDoe | Note Added: 0003272 | |
2009-05-26 08:35 | vskirdin | Additional Information Updated | |
2009-05-26 08:52 | JohnDoe | Note Edited: 0003272 | |
2009-05-26 14:39 | lort | Note Added: 0003274 | |
2009-05-26 15:31 | JohnDoe | Note Edited: 0003272 | |
2009-05-26 15:50 | JohnDoe | Note Added: 0003276 | |
2009-05-26 15:53 | JohnDoe | Note Edited: 0003276 | |
2009-05-26 16:36 | alexy | Note Added: 0003278 | |
2009-05-26 16:43 | JohnDoe | Note Added: 0003280 | |
2009-05-26 16:45 | alexy | Note Added: 0003281 | |
2009-05-26 17:19 | JohnDoe | Note Added: 0003282 | |
2009-05-26 18:07 | Kildor | Note Added: 0003284 | |
2009-05-26 18:31 | JohnDoe | Note Added: 0003285 | |
2009-05-26 20:44 | lort | Note Added: 0003287 | |
2009-05-27 02:08 | Kildor | Note Added: 0003288 | |
2009-05-27 14:32 | JohnDoe | Note Added: 0003300 | |
2009-05-27 14:35 | vskirdin | Note Added: 0003301 | |
2009-05-27 14:44 | JohnDoe | Note Added: 0003302 | |
2009-05-27 23:02 | lort | Note Added: 0003308 | |
2009-05-28 07:27 | JohnDoe | Note Added: 0003320 | |
2009-05-29 00:49 | lort | Note Added: 0003352 | |
2009-05-29 07:28 | JohnDoe | Note Added: 0003356 | |
2009-05-30 01:33 | lort | Note Added: 0003372 | |
2009-05-30 08:23 | JohnDoe | Note Added: 0003374 | |
2009-05-30 11:07 | vskirdin | Note Added: 0003377 | |
2009-06-18 10:32 | NightRoman | Note Added: 0003616 | |
2009-06-18 10:40 | alexy | Status | feedback => assigned |
2009-06-18 10:40 | alexy | Assigned To | vskirdin => lort |
2009-06-22 11:46 | NightRoman | Note Added: 0003632 | |
2009-06-22 19:02 | lort | Note Added: 0003634 | |
2009-06-23 09:03 | NightRoman | Note Added: 0003638 | |
2009-06-23 16:12 | NightRoman | Note Added: 0003639 | |
2009-06-23 16:15 | alexy | Note Added: 0003640 | |
2009-07-22 06:57 | vskirdin | Note Added: 0003776 | |
2010-05-02 20:40 | alexy | Build | => 1010 |
2010-05-02 20:40 | alexy | Status | assigned => closed |
2010-05-02 20:40 | alexy | Resolution | open => fixed |
2010-05-02 20:40 | alexy | Fixed in Version | => 2.0 |