Russian Qt Forum

Qt => Общие вопросы => Тема начата: Igors от Июль 22, 2016, 09:20



Название: Организация 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

в принципе с локальным стеком все довольно просто:
- до открытия окна, у вас состояние модели данных, скажем, А, затем Б, затем В
- открыли окно, рисуем - локальный стек переходит в Г, потом в Д, и так до Х, например
- закрыли окно - локальный стек ушел, а его последнее состояние перешло в основной: там теперь имеем А,Б,В,Х
- если теперь сделаем undo - то перейдем в В (т.е. то, что было до открытия окна), забыв про Г, Д и другие.
- ну и т.д.
Чуть продолжим пример. Начал рисовать, тыкнул раз мышей (шаг Г), смотрит - деталировка объекта маловата, взял и увеличил ее (шаг Д) и опять пытается рисовать (E - X). Закончил рисование, закрыл окно и давит undo. При переходе к шагу "B" рухнет т.к. не было отката для шага "Д" (данные B соответствуют деталировке которая уже изменена)

Сливать (объединять) однотипные 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
Ничего не рухнет, просто надо хранить состояния модели в каждом шаге.
B - это отдельное состояние с низкой деталировкой, Х - с высокой.
Если каждое сохранение самодостаточно (т.е. можно вернуться к сохраненному состоянию напрямую) - то это уже не undo а что-то типа "checkpoint" или "auto-save". Очевидный минус такого подхода - хранить надо уж очень много.


Название: Re: Организация undo
Отправлено: Igors от Июль 23, 2016, 13:28
RКак я раньше уже говорил - вам нужно тогда абстрагироваться от множества окон и вести лог операций над изображением, а не окон.
Т.е. у вас не будет сохранено открытие/закрытие окна, а будет  цвет изменён по "координаты". Или наложение фильтра и тому подобное.

Всё равно полный лог вести - чрезвычайно трудно. А придумать что то новое - нууу, как минимум очень сложно. Все возможные варианты были уже испробованы и смотрите их в аналогах той программы, которую вы делаете.
Цитировать
Вы рассказали много интересного и нового. Но то что ново - не интересно, а что интересно - не ново
:)


Название: Re: Организация undo
Отправлено: Bepec от Июль 23, 2016, 15:08
То, что вы не хотите использовать имеющиеся наработки, а хотите создать своё - достойно уважения...
Вот только обычно то, что обошли стороной имеющиеся наработки, или слишком затратно, или слишком неудобно.


Название: Re: Организация undo
Отправлено: Igors от Июль 23, 2016, 15:25
То, что вы не хотите использовать имеющиеся наработки, а хотите создать своё - достойно уважения...
Вот только обычно то, что обошли стороной имеющиеся наработки, или слишком затратно, или слишком неудобно.
Спасибо за хорошие слова :)  Но я никак не собирался "обходить", наоборот, я бы с удовольствием использовал накатанные решения - но увы, не вижу подходящих