Название: Организация undo Отправлено: Igors от Июль 22, 2016, 09:20 Добрый день
Пример: юзер открыл одно из немодальных окон приложения и чего-то там рисует мышью. Конечно пишем undo, можно откатить назад каждое действие рисования. Все хорошо. Но вот юзер закрыл это окно и занялся чем-то другим. Если сейчас он будет давить undo - оно сработает "столь же корректно", но окно-то уже закрыто, что откатил - хз. Как это сделать "более дружественным"? Спасибо Название: Re: Организация undo Отправлено: gil9red от Июль 22, 2016, 09:29 А почему нельзя применять undo только к окну с фокусом?
Название: Re: Организация undo Отправлено: Racheengel от Июль 22, 2016, 11:29 Надо делать локальный стек для каждого контекста редактирования (в этом случае - "окна").
Окно закрыли - стек сбросился. Название: Re: Организация undo Отправлено: Igors от Июль 22, 2016, 12:04 А почему нельзя применять undo только к окну с фокусом? А как его "не применять"? Это же развалит стек undo Надо делать локальный стек для каждого контекста редактирования (в этом случае - "окна"). Первый раз такое слышу. Очень легко привести пример когда локальный стек не будет работать корректноОкно закрыли - стек сбросился. Название: Re: Организация undo Отправлено: Racheengel от Июль 22, 2016, 12:16 Первый раз такое слышу. Очень легко привести пример когда локальный стек не будет работать корректно Локальный стек существует только в момент, когда открыто окно редактора. Как только его закрыли - действия, сделанные в этом редакторе, отменить уже не получится. Они как бы "замораживаются". Вы же этого хотите добиться? Название: Re: Организация undo Отправлено: Bepec от Июль 22, 2016, 12:31 Если заморочиться, можно "открытие/закрытие" окна вносить в undo. Тогда у вас сохранится полный стек событий и ундо будет работать корректно.
Хотя тут уже возникает вопрос к "окну", хранит ли оно изменения, или при закрытии удаляет. Название: Re: Организация undo Отправлено: Igors от Июль 22, 2016, 12:53 Локальный стек существует только в момент, когда открыто окно редактора. Это в общем случае некорректно, другие undo могут использовать данные рисованияКак только его закрыли - действия, сделанные в этом редакторе, отменить уже не получится. Они как бы "замораживаются". Пока не знаю чего хочу :) Юзер сообщил об этой проблеме - резоны тут конечно есть, а вот решения может и не быть.Вы же этого хотите добиться? Если заморочиться, можно "открытие/закрытие" окна вносить в undo. Никто не обещал что "открытие/закрытие" - операции безобидные, нейтральные. Напр не так уж редко окно перед открытием показывает какие-то модальные месяги. Одних только типов undo за сотню, хотя бы найти все такие места - уже не одна неделяНазвание: Re: Организация undo Отправлено: Bepec от Июль 22, 2016, 13:02 А что вы хотите, если вы решили контролировать в Undo все окна, все диалоги, все закрытия и открытия, конечно вам придётся вводить новый тип, выискивать все места, заносить всё в стек.
Или же вы решите локализовать проблемы в стеке undo для каждого окна. Тогда всё будет в разы проще. Название: Re: Организация undo Отправлено: Igors от Июль 22, 2016, 13:16 Или же вы решите локализовать проблемы в стеке undo для каждого окна. Тогда всё будет в разы проще. Опять не задумываясь повторяете то что услышали. Два и более "параллельных" undo - это кобыло-собачий бред :)Название: Re: Организация undo Отправлено: Bepec от Июль 22, 2016, 13:35 Не два, а один.
Один, просто с локализацией по окнам. Закрыли окно - удалили из стека все undo для окна. Так что получается один, просто с привязкой к окну. PS вы читайте мои сообщения, а не додумывайте. Если не понятно, задавайте вопрос, я вам уточню неясные моменты. А додумывать за человека не надо :) Название: Re: Организация undo Отправлено: Igors от Июль 22, 2016, 13:56 Один, просто с локализацией по окнам. Закрыли окно - удалили из стека все undo для окна. undo операции надо выполнять, а не удалять - ну вот так undo работаетТак что получается один, просто с привязкой к окну. PS вы читайте мои сообщения, а не додумывайте. Если не понятно, задавайте вопрос, я вам уточню неясные моменты. Типа "а я вам еще больше наплету всякой фигни - все равно рано или поздно устанете мне отвечать" :) Название: Re: Организация undo Отправлено: Bepec от Июль 22, 2016, 14:28 Нет, тут как раз вы должны решить, что ВАМ надо.
1) Если вам надо, чтобы все операции были отменяемыми, включая модальные окна/открытие/закрытие окон, сохранение/удаление содержимого, то вам полюбому придётся вести полный undo, на каждое действие. 2) Но т.к. это на мой взгляд избыточно и нерационально (да и вообще undo обычно работает только в главном окне), то я предлагал реализовать локализованные изменения. Которые можно откатить ДО закрытия окна. Если возникнет нужда отменять действия ПОСЛЕ закрытия окна, то вам нужен вариант 1. Название: Re: Организация undo Отправлено: kambala от Июль 22, 2016, 16:55 для невидимых изменений можно попап показывать, сообщающий что именно было изменено, с кнопкой «просмотреть изменения», например
Название: Re: Организация undo Отправлено: qate от Июль 22, 2016, 23:10 Как это сделать "более дружественным"? в браузерах такое есть - закрыл окно, вернул его обратно, можешь вернуться по окну в истории (undo внутри окна) удобно Название: Re: Организация undo Отправлено: Racheengel от Июль 23, 2016, 00:09 в принципе с локальным стеком все довольно просто:
- до открытия окна, у вас состояние модели данных, скажем, А, затем Б, затем В - открыли окно, рисуем - локальный стек переходит в Г, потом в Д, и так до Х, например - закрыли окно - локальный стек ушел, а его последнее состояние перешло в основной: там теперь имеем А,Б,В,Х - если теперь сделаем undo - то перейдем в В (т.е. то, что было до открытия окна), забыв про Г, Д и другие. - ну и т.д. Название: Re: Организация undo Отправлено: Igors от Июль 23, 2016, 08:29 для невидимых изменений можно попап показывать, сообщающий что именно было изменено, с кнопкой «просмотреть изменения», например Обдумывал подобное. Напр в меню написать не просто "Undo", а напр "Undo Painting". Это конечно лучше чем ничего, но все равно мало информативно, да и длина текста в меню уж слишком коротка. Предъявить стек undo виде окна - тоже мне хлопот много, а юзеру толку чуть. Как правило в undo закидываются целые структуры (не возиться же с каждым полем). Тип и визуальное имя структуры в общем случае неизвестны до выполнения undoв браузерах такое есть - закрыл окно, вернул его обратно, можешь вернуться по окну в истории (undo внутри окна) Это "история", а не undo удобно в принципе с локальным стеком все довольно просто: Чуть продолжим пример. Начал рисовать, тыкнул раз мышей (шаг Г), смотрит - деталировка объекта маловата, взял и увеличил ее (шаг Д) и опять пытается рисовать (E - X). Закончил рисование, закрыл окно и давит undo. При переходе к шагу "B" рухнет т.к. не было отката для шага "Д" (данные B соответствуют деталировке которая уже изменена)- до открытия окна, у вас состояние модели данных, скажем, А, затем Б, затем В - открыли окно, рисуем - локальный стек переходит в Г, потом в Д, и так до Х, например - закрыли окно - локальный стек ушел, а его последнее состояние перешло в основной: там теперь имеем А,Б,В,Х - если теперь сделаем undo - то перейдем в В (т.е. то, что было до открытия окна), забыв про Г, Д и другие. - ну и т.д. Сливать (объединять) однотипные undo в стеке можно, но это может быть и в плюс и в минус. Напр "слили после закрытия окна" - вроде логично, но лишает возможности снова открыть окно и откатиться на любое число шагов Думаю тут вообще нет хорошего решения :) Название: Re: Организация undo Отправлено: Bepec от Июль 23, 2016, 11:59 RКак я раньше уже говорил - вам нужно тогда абстрагироваться от множества окон и вести лог операций над изображением, а не окон.
Т.е. у вас не будет сохранено открытие/закрытие окна, а будет цвет изменён по "координаты". Или наложение фильтра и тому подобное. Всё равно полный лог вести - чрезвычайно трудно. А придумать что то новое - нууу, как минимум очень сложно. Все возможные варианты были уже испробованы и смотрите их в аналогах той программы, которую вы делаете. Название: Re: Организация undo Отправлено: Racheengel от Июль 23, 2016, 13:00 При переходе к шагу "B" рухнет т.к. не было отката для шага "Д" (данные B соответствуют деталировке которая уже изменена) Ничего не рухнет, просто надо хранить состояния модели в каждом шаге. B - это отдельное состояние с низкой деталировкой, Х - с высокой. Название: Re: Организация undo Отправлено: Igors от Июль 23, 2016, 13:25 Ничего не рухнет, просто надо хранить состояния модели в каждом шаге. Если каждое сохранение самодостаточно (т.е. можно вернуться к сохраненному состоянию напрямую) - то это уже не undo а что-то типа "checkpoint" или "auto-save". Очевидный минус такого подхода - хранить надо уж очень много. B - это отдельное состояние с низкой деталировкой, Х - с высокой. Название: Re: Организация undo Отправлено: Igors от Июль 23, 2016, 13:28 RКак я раньше уже говорил - вам нужно тогда абстрагироваться от множества окон и вести лог операций над изображением, а не окон. Т.е. у вас не будет сохранено открытие/закрытие окна, а будет цвет изменён по "координаты". Или наложение фильтра и тому подобное. Всё равно полный лог вести - чрезвычайно трудно. А придумать что то новое - нууу, как минимум очень сложно. Все возможные варианты были уже испробованы и смотрите их в аналогах той программы, которую вы делаете. Цитировать Вы рассказали много интересного и нового. Но то что ново - не интересно, а что интересно - не ново :)Название: Re: Организация undo Отправлено: Bepec от Июль 23, 2016, 15:08 То, что вы не хотите использовать имеющиеся наработки, а хотите создать своё - достойно уважения...
Вот только обычно то, что обошли стороной имеющиеся наработки, или слишком затратно, или слишком неудобно. Название: Re: Организация undo Отправлено: Igors от Июль 23, 2016, 15:25 То, что вы не хотите использовать имеющиеся наработки, а хотите создать своё - достойно уважения... Спасибо за хорошие слова :) Но я никак не собирался "обходить", наоборот, я бы с удовольствием использовал накатанные решения - но увы, не вижу подходящихВот только обычно то, что обошли стороной имеющиеся наработки, или слишком затратно, или слишком неудобно. |