nabbla (nabbla1) wrote,
nabbla
nabbla1

Categories:

"Умное" сохранение

Продолжим тему древовидного undo, еще недельку с ним поразвлекаюсь и, глядишь, отпустит. А пока даже тег новый ввел: древовидный undo.

Еще одна страшная команда, способная свести на нет всю работу - это сохранение! В большинстве программ опасно даже простое save и autosave, ведь они не умеют сохранять историю изменений в файл, только текущее состояние.

Но с деревом изменений, сохраняющимся в файле проекта, обычный save (сохранить под тем же именем) уже не страшен. Страшен только "сохранить как", ведь мы можем случайно перезаписать какой-то важный файл.

Классика жанра, ценность которой стремится к нулю. ДА, я только что выбрал файл из списка и понимаю, что он уже существует! Единственный случай, когда этот вопрос полезен - это если в папке лежит огромная куча файлов, вводишь имя с клавиатуры и оказывается, что такое имя уже есть.

У нас на двери из подъезда однажды повесили записку: будьте предельно осторожны, на улице гололед! Я вышел, а там и правда гололед, подумал, какой сервис! Но день шел за днем, а записку никто и не думал снимать и она перестала действовать. С этим диалогом та же проблема: слишком часто он появляется не к месту.

Сегодня сделал свою реализацию, прошу любить и жаловать. Напомню, я пишу довольно-таки абстрактную библиотеку для работы с проектами, которую смогу с минимальными усилиями встраивать в любую из своих программ, а пока подопытным кроликом выступает ImageGraph2Txt (да, для нее тоже теперь есть тег).


Если мы выбрали для сохранения существующий файл, программа проявляет любопытство: а что за файл такой? Пытается открыть его как свой родной документ.

Если файл не имеет отношения к данной программе, он открыться не сможет и высветится предупреждение:

Не сказать, что очень оригинально, а что еще остается... Впрочем, такие случаи должны быть редки, ведь можно свое расширение сделать для файлов проекта, это сейчас я все в txt сохраняю, чтобы легко было и вручную посмотреть, что там лежит.

Если файл успешно считался и оказалось, что это действительно файл проекта, то производится их сравнение, довольно простая рекурсивная процедура. В текущем проекте и только что открытом мы прыгаем в корень дерева, в пустой проект в том самом виде, каким его создал конструктор. Именно тогда все команды возвращаются в состояние, когда они хранят информацию, нужную для их выполнения, а не для отмены операции. В таком виде их можно сравнивать.

По результатам сравнения может оказаться, что в файле лежала старая версия того же самого проекта, что мы сохраняем сейчас. Если это так, мы молча сохраняем новую версию, зная, что и старая никуда не делась, мало того, в истории изменений отмечено, в какую дату и время производились какие сохранения, так что и искать старую версию долго не придется.

Возможен вариант, что документ, лежащий в файле и текущий имеют общее начало, но потом разошлись. Тогда появится нечто такое:


И если выбрать объединение файлов, то из двух деревьев получится одно, активной ветвью будет та, которую мы сохранили, но и к старой можно будет вернуться. Скажем, так было:

потом загрузили img+axis.txt и решили отметить нижнюю кривую:

и потом сохранили ее в max.txt:


Как видно, общая для обеих команда order=1 (выставить линейную интерполяцию вместо сплайнов) не раздвоилась, хотя ее сделали уже ПОСЛЕ сохранения в img+axis. По временным меткам можно восстановить всю картину.

В сущности, так можно объединить даже проекты, не имеющие ничего общего! Раздвоение произойдет сразу из корня, и это будет как бы несколько вкладок, только реализованных в виде непересекающихся параллельных вселенных.

Пора учиться мыслить в пяти измерениях, два из которых - ветвящееся время! Не бояться шастать взад-вперед, создавать закутки в пространстве-времени для своих черновиков и комментариев (Hello, Sweetie!), а дальше моя фантазия, увы, пробуксовывает, привык к родным трем измерениям, цепляюсь всеми конечностями.

PS. для слияния деревьев понадобилась дополнительная процедура Assimilate, которая зохавывает все ветви из второго дерева и прицепляет их к первому. Безжизненный трупик второго дерева отправляется в мусор, впрочем оно с самого начала было "зомби", оторванное от мира. Сопротивление бесполезно!

PPS. Ссылка на текущую версию. При открытии программы сразу должен загрузиться сегодняшний пример (он лежит в current_project.txt), историю изменений можно открыть или в меню правка->журнал, или в выпадающем меню undo/redo в панели инструментов.

Когда открыта история изменений, достаточно щелкнуть по интересующему состоянию, чтобы перейти в него. В самом начале лежит необрезанная картинка, printscreen)
Tags: imagegraph2txt, Древовидный Undo, программки
Subscribe

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your IP address will be recorded 

  • 4 comments