Russian Qt Forum
Ноябрь 23, 2024, 08:29 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Организация undo  (Прочитано 10222 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #15 : Июль 23, 2016, 08:29 »

для невидимых изменений можно попап показывать, сообщающий что именно было изменено, с кнопкой «просмотреть изменения», например
Обдумывал подобное. Напр в меню написать не просто "Undo", а напр "Undo Painting". Это конечно лучше чем ничего, но все равно мало информативно, да и длина текста в меню уж слишком коротка. Предъявить стек undo виде окна - тоже мне хлопот много, а юзеру толку чуть. Как правило в undo закидываются целые структуры (не возиться же с каждым полем). Тип и визуальное имя структуры в общем случае неизвестны до выполнения undo

в браузерах такое есть - закрыл окно, вернул его обратно, можешь вернуться по окну в истории (undo внутри окна)
удобно
Это "история", а не undo

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

Сливать (объединять) однотипные undo в стеке можно, но это может быть и в плюс и в минус. Напр "слили после закрытия окна" - вроде логично, но лишает возможности снова открыть окно и откатиться на любое число шагов

Думаю тут вообще нет хорошего решения  Улыбающийся
Записан
Bepec
Гость
« Ответ #16 : Июль 23, 2016, 11:59 »

RКак я раньше уже говорил - вам нужно тогда абстрагироваться от множества окон и вести лог операций над изображением, а не окон.
Т.е. у вас не будет сохранено открытие/закрытие окна, а будет  цвет изменён по "координаты". Или наложение фильтра и тому подобное.

Всё равно полный лог вести - чрезвычайно трудно. А придумать что то новое - нууу, как минимум очень сложно. Все возможные варианты были уже испробованы и смотрите их в аналогах той программы, которую вы делаете.
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #17 : Июль 23, 2016, 13:00 »

При переходе к шагу "B" рухнет т.к. не было отката для шага "Д" (данные B соответствуют деталировке которая уже изменена)

Ничего не рухнет, просто надо хранить состояния модели в каждом шаге.
B - это отдельное состояние с низкой деталировкой, Х - с высокой.
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #18 : Июль 23, 2016, 13:25 »

Ничего не рухнет, просто надо хранить состояния модели в каждом шаге.
B - это отдельное состояние с низкой деталировкой, Х - с высокой.
Если каждое сохранение самодостаточно (т.е. можно вернуться к сохраненному состоянию напрямую) - то это уже не undo а что-то типа "checkpoint" или "auto-save". Очевидный минус такого подхода - хранить надо уж очень много.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #19 : Июль 23, 2016, 13:28 »

RКак я раньше уже говорил - вам нужно тогда абстрагироваться от множества окон и вести лог операций над изображением, а не окон.
Т.е. у вас не будет сохранено открытие/закрытие окна, а будет  цвет изменён по "координаты". Или наложение фильтра и тому подобное.

Всё равно полный лог вести - чрезвычайно трудно. А придумать что то новое - нууу, как минимум очень сложно. Все возможные варианты были уже испробованы и смотрите их в аналогах той программы, которую вы делаете.
Цитировать
Вы рассказали много интересного и нового. Но то что ново - не интересно, а что интересно - не ново
Улыбающийся
Записан
Bepec
Гость
« Ответ #20 : Июль 23, 2016, 15:08 »

То, что вы не хотите использовать имеющиеся наработки, а хотите создать своё - достойно уважения...
Вот только обычно то, что обошли стороной имеющиеся наработки, или слишком затратно, или слишком неудобно.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #21 : Июль 23, 2016, 15:25 »

То, что вы не хотите использовать имеющиеся наработки, а хотите создать своё - достойно уважения...
Вот только обычно то, что обошли стороной имеющиеся наработки, или слишком затратно, или слишком неудобно.
Спасибо за хорошие слова Улыбающийся  Но я никак не собирался "обходить", наоборот, я бы с удовольствием использовал накатанные решения - но увы, не вижу подходящих
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.135 секунд. Запросов: 22.