Russian Qt Forum
Ноябрь 23, 2024, 00:06
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Общие вопросы
>
Организация undo
Страниц: [
1
]
2
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Организация undo (Прочитано 10196 раз)
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Организация undo
«
:
Июль 22, 2016, 09:20 »
Добрый день
Пример: юзер открыл одно из немодальных окон приложения и чего-то там рисует мышью. Конечно пишем undo, можно откатить назад каждое действие рисования. Все хорошо. Но вот юзер закрыл это окно и занялся чем-то другим. Если сейчас он будет давить undo - оно сработает "столь же корректно", но окно-то уже закрыто, что откатил - хз.
Как это сделать "более дружественным"?
Спасибо
Записан
gil9red
Administrator
Джедай : наставник для всех
Offline
Сообщений: 1805
Re: Организация undo
«
Ответ #1 :
Июль 22, 2016, 09:29 »
А почему нельзя применять undo только к окну с фокусом?
Записан
https://github.com/gil9red
https://ru.stackoverflow.com/users/201445/gil9red
Racheengel
Джедай : наставник для всех
Offline
Сообщений: 2679
Я работал с дискетам 5.25 :(
Re: Организация undo
«
Ответ #2 :
Июль 22, 2016, 11:29 »
Надо делать локальный стек для каждого контекста редактирования (в этом случае - "окна").
Окно закрыли - стек сбросился.
Записан
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
Сообщений: 11445
Re: Организация undo
«
Ответ #3 :
Июль 22, 2016, 12:04 »
Цитата: gil9red от Июль 22, 2016, 09:29
А почему нельзя применять undo только к окну с фокусом?
А как его "не применять"? Это же развалит стек undo
Цитата: Racheengel от Июль 22, 2016, 11:29
Надо делать локальный стек для каждого контекста редактирования (в этом случае - "окна").
Окно закрыли - стек сбросился.
Первый раз такое слышу. Очень легко привести пример когда локальный стек не будет работать корректно
Записан
Racheengel
Джедай : наставник для всех
Offline
Сообщений: 2679
Я работал с дискетам 5.25 :(
Re: Организация undo
«
Ответ #4 :
Июль 22, 2016, 12:16 »
Цитата: Igors от Июль 22, 2016, 12:04
Первый раз такое слышу. Очень легко привести пример когда локальный стек не будет работать корректно
Локальный стек существует только в момент, когда открыто окно редактора.
Как только его закрыли - действия, сделанные в этом редакторе, отменить уже не получится.
Они как бы "замораживаются".
Вы же этого хотите добиться?
Записан
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 не волк, в лес не уйдёт
Bepec
Гость
Re: Организация undo
«
Ответ #5 :
Июль 22, 2016, 12:31 »
Если заморочиться, можно "открытие/закрытие" окна вносить в undo. Тогда у вас сохранится полный стек событий и ундо будет работать корректно.
Хотя тут уже возникает вопрос к "окну", хранит ли оно изменения, или при закрытии удаляет.
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Организация undo
«
Ответ #6 :
Июль 22, 2016, 12:53 »
Цитата: Racheengel от Июль 22, 2016, 12:16
Локальный стек существует только в момент, когда открыто окно редактора.
Как только его закрыли - действия, сделанные в этом редакторе, отменить уже не получится.
Это в общем случае некорректно, другие undo могут использовать данные рисования
Цитата: Racheengel от Июль 22, 2016, 12:16
Они как бы "замораживаются".
Вы же этого хотите добиться?
Пока не знаю чего хочу
Юзер сообщил об этой проблеме - резоны тут конечно есть, а вот решения может и не быть.
Цитата: Bepec от Июль 22, 2016, 12:31
Если заморочиться, можно "открытие/закрытие" окна вносить в undo.
Никто не обещал что "открытие/закрытие" - операции безобидные, нейтральные. Напр не так уж редко окно перед открытием показывает какие-то модальные месяги. Одних только типов undo за сотню, хотя бы найти все такие места - уже не одна неделя
Записан
Bepec
Гость
Re: Организация undo
«
Ответ #7 :
Июль 22, 2016, 13:02 »
А что вы хотите, если вы решили контролировать в Undo все окна, все диалоги, все закрытия и открытия, конечно вам придётся вводить новый тип, выискивать все места, заносить всё в стек.
Или же вы решите локализовать проблемы в стеке undo для каждого окна. Тогда всё будет в разы проще.
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Организация undo
«
Ответ #8 :
Июль 22, 2016, 13:16 »
Цитата: Bepec от Июль 22, 2016, 13:02
Или же вы решите локализовать проблемы в стеке undo для каждого окна. Тогда всё будет в разы проще.
Опять не задумываясь повторяете то что услышали. Два и более "параллельных" undo - это кобыло-собачий бред
Записан
Bepec
Гость
Re: Организация undo
«
Ответ #9 :
Июль 22, 2016, 13:35 »
Не два, а один.
Один, просто с локализацией по окнам. Закрыли окно - удалили из стека все undo для окна.
Так что получается один, просто с привязкой к окну.
PS вы читайте мои сообщения, а не додумывайте. Если не понятно, задавайте вопрос, я вам уточню неясные моменты. А додумывать за человека не надо
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Организация undo
«
Ответ #10 :
Июль 22, 2016, 13:56 »
Цитата: Bepec от Июль 22, 2016, 13:35
Один, просто с локализацией по окнам. Закрыли окно - удалили из стека все undo для окна.
Так что получается один, просто с привязкой к окну.
undo операции надо выполнять, а не удалять - ну вот так undo работает
Цитата: Bepec от Июль 22, 2016, 13:35
PS вы читайте мои сообщения, а не додумывайте. Если не понятно, задавайте вопрос, я вам уточню неясные моменты.
Типа "а я вам еще больше наплету всякой фигни - все равно рано или поздно устанете мне отвечать"
Записан
Bepec
Гость
Re: Организация undo
«
Ответ #11 :
Июль 22, 2016, 14:28 »
Нет, тут как раз вы должны решить, что ВАМ надо.
1) Если вам надо, чтобы все операции были отменяемыми, включая модальные окна/открытие/закрытие окон, сохранение/удаление содержимого, то вам полюбому придётся вести полный undo, на каждое действие.
2) Но т.к. это на мой взгляд избыточно и нерационально (да и вообще undo обычно работает только в главном окне), то я предлагал реализовать локализованные изменения. Которые можно откатить ДО закрытия окна. Если возникнет нужда отменять действия ПОСЛЕ закрытия окна, то вам нужен вариант 1.
Записан
kambala
Джедай : наставник для всех
Offline
Сообщений: 4747
Re: Организация undo
«
Ответ #12 :
Июль 22, 2016, 16:55 »
для невидимых изменений можно попап показывать, сообщающий что именно было изменено, с кнопкой «просмотреть изменения», например
Записан
Изучением C++ вымощена дорога в Qt.
UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
qate
Супер
Offline
Сообщений: 1177
Re: Организация undo
«
Ответ #13 :
Июль 22, 2016, 23:10 »
Цитата: Igors от Июль 22, 2016, 09:20
Как это сделать "более дружественным"?
в браузерах такое есть - закрыл окно, вернул его обратно, можешь вернуться по окну в истории (undo внутри окна)
удобно
Записан
Racheengel
Джедай : наставник для всех
Offline
Сообщений: 2679
Я работал с дискетам 5.25 :(
Re: Организация undo
«
Ответ #14 :
Июль 23, 2016, 00:09 »
в принципе с локальным стеком все довольно просто:
- до открытия окна, у вас состояние модели данных, скажем, А, затем Б, затем В
- открыли окно, рисуем - локальный стек переходит в Г, потом в Д, и так до Х, например
- закрыли окно - локальный стек ушел, а его последнее состояние перешло в основной: там теперь имеем А,Б,В,Х
- если теперь сделаем undo - то перейдем в В (т.е. то, что было до открытия окна), забыв про Г, Д и другие.
- ну и т.д.
Записан
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 не волк, в лес не уйдёт
Страниц: [
1
]
2
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...