I
про мув читал что-то
Max
Всем привет. Обращаюсь за помощью в знатокам. Пожалуйста, уделите 2 минуты на прочтение.
ИНТРО
Есть приложние, написаное на Qt, но можна абстрагироватся на любое приложение с UI. Задача - интегрировать туда
Ctrl+Z
и
Ctrl+Shift+Z
Сразу предупрежу, не надо меня отправлять в Qt чат, это вопрос по скорее по архитектуре приложения, чем по реализации на конкретном фреймворке.
Qt дает функционал для работы с Undo/Redo фичей, то есть готовый QUndoStack, и каждая команда обворачивается в QUndoCommand класс и пихается в QUndoStack.
ПРОБЛЕМА
Все бы ничего, но сам UI достаточно сложный, и написан сложно. Например, есть команда прицепить текст на блок. Затем удалим блок. При откате мы восстановим блок, но речь в том, что все это через new/delete, и все поинтеры, которые засовывались в команду в стэк, например чтоб текст засетал себе родителя, сразу протухают, то есть текст думает, что привязан к несуществующему на самом-то деле блоку.
Поскольку одними текстами-блоками дело не ограничено, а нагуглить у меня сходу не удалось, спрошу здесь.
ВОПРОС
Кто имел подобный опыт, или может читал что-нибудь об интеграции Undo/Redo в сложные приложения, посоветуйте.
Заранее спасибо.
🦥Alex Fails
ну, могу посоветовать хранить не сырые указатели, а шаредопойнтеры
Aidar
Всем привет. Обращаюсь за помощью в знатокам. Пожалуйста, уделите 2 минуты на прочтение.
ИНТРО
Есть приложние, написаное на Qt, но можна абстрагироватся на любое приложение с UI. Задача - интегрировать туда
Ctrl+Z
и
Ctrl+Shift+Z
Сразу предупрежу, не надо меня отправлять в Qt чат, это вопрос по скорее по архитектуре приложения, чем по реализации на конкретном фреймворке.
Qt дает функционал для работы с Undo/Redo фичей, то есть готовый QUndoStack, и каждая команда обворачивается в QUndoCommand класс и пихается в QUndoStack.
ПРОБЛЕМА
Все бы ничего, но сам UI достаточно сложный, и написан сложно. Например, есть команда прицепить текст на блок. Затем удалим блок. При откате мы восстановим блок, но речь в том, что все это через new/delete, и все поинтеры, которые засовывались в команду в стэк, например чтоб текст засетал себе родителя, сразу протухают, то есть текст думает, что привязан к несуществующему на самом-то деле блоку.
Поскольку одними текстами-блоками дело не ограничено, а нагуглить у меня сходу не удалось, спрошу здесь.
ВОПРОС
Кто имел подобный опыт, или может читал что-нибудь об интеграции Undo/Redo в сложные приложения, посоветуйте.
Заранее спасибо.
так я не понял, там же должна быть команда восстановления блока
Aidar
просто блок нужно идентифицировать не указателем
Aidar
если и указателем то както запоминать новый указатель или типа того
Egor
Всем привет. Обращаюсь за помощью в знатокам. Пожалуйста, уделите 2 минуты на прочтение.
ИНТРО
Есть приложние, написаное на Qt, но можна абстрагироватся на любое приложение с UI. Задача - интегрировать туда
Ctrl+Z
и
Ctrl+Shift+Z
Сразу предупрежу, не надо меня отправлять в Qt чат, это вопрос по скорее по архитектуре приложения, чем по реализации на конкретном фреймворке.
Qt дает функционал для работы с Undo/Redo фичей, то есть готовый QUndoStack, и каждая команда обворачивается в QUndoCommand класс и пихается в QUndoStack.
ПРОБЛЕМА
Все бы ничего, но сам UI достаточно сложный, и написан сложно. Например, есть команда прицепить текст на блок. Затем удалим блок. При откате мы восстановим блок, но речь в том, что все это через new/delete, и все поинтеры, которые засовывались в команду в стэк, например чтоб текст засетал себе родителя, сразу протухают, то есть текст думает, что привязан к несуществующему на самом-то деле блоку.
Поскольку одними текстами-блоками дело не ограничено, а нагуглить у меня сходу не удалось, спрошу здесь.
ВОПРОС
Кто имел подобный опыт, или может читал что-нибудь об интеграции Undo/Redo в сложные приложения, посоветуйте.
Заранее спасибо.
Паттерн "Команда", заабстрагировать все действия в него и сделать операцию "примени и верни обратную команду"? Только надо будет аккуратно с тем, что именно есть "команда"
Max
ну, могу посоветовать хранить не сырые указатели, а шаредопойнтеры
УТОЧНЕНИЕ
Дело не только в поинтерах, это частичный случай. По сути, есть дофига мегаклассов, каждые спокойно, нарушая инкапсуляцию, читают/меняют данные других классов, все через *опу короче. Поэтому вероятность отстрелить ноги крайне высока.
Тем более, что, например, создание того же текста дергает новые модальные окна, которые дергают кучу других вещей, и т.п.
Aidar
нужно или хранить блоки в памяти пока команда удаления в стеке или менять идентификацию блоков
Egor
Berkus
Всем привет. Обращаюсь за помощью в знатокам. Пожалуйста, уделите 2 минуты на прочтение.
ИНТРО
Есть приложние, написаное на Qt, но можна абстрагироватся на любое приложение с UI. Задача - интегрировать туда
Ctrl+Z
и
Ctrl+Shift+Z
Сразу предупрежу, не надо меня отправлять в Qt чат, это вопрос по скорее по архитектуре приложения, чем по реализации на конкретном фреймворке.
Qt дает функционал для работы с Undo/Redo фичей, то есть готовый QUndoStack, и каждая команда обворачивается в QUndoCommand класс и пихается в QUndoStack.
ПРОБЛЕМА
Все бы ничего, но сам UI достаточно сложный, и написан сложно. Например, есть команда прицепить текст на блок. Затем удалим блок. При откате мы восстановим блок, но речь в том, что все это через new/delete, и все поинтеры, которые засовывались в команду в стэк, например чтоб текст засетал себе родителя, сразу протухают, то есть текст думает, что привязан к несуществующему на самом-то деле блоку.
Поскольку одними текстами-блоками дело не ограничено, а нагуглить у меня сходу не удалось, спрошу здесь.
ВОПРОС
Кто имел подобный опыт, или может читал что-нибудь об интеграции Undo/Redo в сложные приложения, посоветуйте.
Заранее спасибо.
смотри Sean Parent, "Inheritance is the base class of evil"
Berkus
там про это всё есть
Aidar
не вижу смысла не хранить блоки в памяти(или их значимую часть)
Aidar
всеравно для восстановления нужны эти данные
Anatoly
Max
Если б у меня был вариант все переписать по человечески, не нарушая ООП подходы и сохраняя нормальную архитектуру, я б с радостью это сделал.
Andrei
Anatoly
либо наводи порядок, либо страдай. других вариантов не остается
Egor
Можно наводить порядок в подмножестве кода
Egor
И, скажем, при совершении неподдерживаемых операций обнулять нафиг стэк undo
Matway
Aidar
Aidar
этож не синглтоны
Aidar
ну или make_shared_from_this
Max
Я пожалуй приведу пример проблемы кодом. Пару мин
Денис
Всем привет!
Народ, надо сделать tcp-сервер на чистом си
В задании сказано вот что
Денис
Это значит принять всю последовательность и только после выделить субпоследовательность или можно по мере поступления?
Max
Ссылка на код
https://ideone.com/9Pp8OV
Вопрос
Есть общий интерфейс UndoCommand. Чтобы использовать метод класса View, я через std::bind передаю в команду сам метод для коллбэка и параметры. Пусть есть такой воркфлоу:
1. Добавили блок.
2. Добавили на него текст.
3. Удалили блок.
4. Ctrl + Z.
Блок был удален с кучи, при восстановлении поинтер на него устареет у текста. Кроме того, я должен передавать все эти var1-3 для работы метода, так как он их использует.
ВОПРОС
Какого хрена я этим занимаюсь?(зачеркнуто).
Как это правильно организовать на сущесвтующей архитектуре?
P.S. Данный пример илюстрирует только малую долю зависимостей, есть например классы, которые должны всегда иметь валидные поинтеры на все элементы виджета и т.п.
UPD
class MyCommand : public UndoCommand
🦥Alex Fails
пункт 3 - надо не удалять из кучи а пометить на удаление
Max
Но я так понимаю, выбор у меня невелик :)
🦥Alex Fails
ну да
Berkus
🦥Alex Fails
тебе ж надо будет как-то откатываться к тому, что было "удалено"
Egor
Max
Egor
Кажется, что сначала должна выполниться команда "отменить удаление блока", а уже потом "восстановить текст на удалённом блоке".
Egor
Тогда, действительно, самым простым кажется вместо удаления при помощи какого-нибудь delete передавать владение команде в стеке.
Egor
И тогда никакие указатели не устаревают
Egor
Если есть инвариант, что надо уметь восстанавливать только последнюю совершённую команду и что отмена восстанавливает состояние _в точности_ (в том числе с указателями)
Egor
Мне кажется, что перед чтением паттернов надо придумать что _должно происходить с точки зрения пользователя_. Странно думать про код, когда неясно, как проверять корректность.
Max
Max
Max
Мне в принципе суть понятна, и понятно, как бы я это хотел реализовать с самого начала, но к сожалению существующий код разбит не по командах, а на спагетти. Было б по другому, не было б проблем.
Всем спасибо за рекомендации, буду разбираться дальше.
Egor
Max
Berkus
Berkus
FailsBot
http://en.cppreference.com/w/cpp/filesystem/path/empty
Matwey
Vladislav
🦥Alex Fails
дык триггернули. там сломался медиавики очередной, шлет html вместо жисона. Позже отдебажу.
Anonymous
🦥Alex Fails
там не cppreference, там другой
Anonymous
А... А какой?
Matwey
Matwey
Ему медиавики на каждый чих нужна что-ли?
Anonymous
Очевидно, что вместо JSON пришел HTML, ошибка парсинга, никто не поймал экзепшен ибо не ожидалось, бот сложился.
🦥Alex Fails
Matwey
Ггг
Matwey
Ну надо было на erlang писать
🦥Alex Fails
нет, надо было try-catch Добавить, из-за которого тоже падает
Matwey
Если серьезно, какая-то странная отмазка. Получить из внешнего мира данные и не ожидать, что они будут невалидными
Matwey
Я вот в первую очередь ожидаю, что мне пидарасы с той стороны мусора насыпали вместо данных!
Anonymous
Anonymous
Там и HTML вместо JSON приходил, и ответы не соответствовали схеме...
Anonymous
Собсно я и забросил либу для их чуда.
Matwey
Vladislav
🦥Alex Fails
да потому что достали уже просить его исправить XD
всем говорю, что как доделаю дела покритичнее - поправлю