Как и обещал в
этой теме опишу немного то, чего я достиг за последние 10 дней.
А последние 10 дней я занимался полным переписыванием всей основы плагина, пытаясь инкапсулировать всю работу, не связанную конкретно с работой кастомного объекта. И походу меня скоро уволят, так как я занимаюсь этим в рабочее время
Итак, до этого для создания кастомного объекта требовалось создать порядка 12 файлов: класс самого примитива, класс описания (об этом отдельно позже), класс функции (или командный класс), класс со свойствами примитива (их названия, типы, описания и ограничения для числовых типов), специальный класс для работы с палитрой, специальный класс для работы со свойствами нескольких примитивов, UserControl для палитры со свойствами, три класса с overrule, класс стиля и UserControl для стиля.
При этом в разработке каждого примитива было жутко много копипаста и очень похожего кода. И очень много рутины.
Когда было выполнено три примитива и были изучены многие подводные камни, пришло время рефакторинга. Причем, пока я этим занимался, то я отчетливо осознавал, что с нуля не смог бы так сделать. Так что тонна говнокода, которая стала превращаться в конфекту, был просто необходима.
Что имеем теперь - для создания нового примтива в плагине требуется реализовать всего 6 классов, 3 из которых - overrule, а один - просто описалово. Шееесть, Карл!
Немного расскажу и покажу:
Класс описания - это класс, в котором просто заполняются значения, которые в основном нужны для построения ленты. Вот пример класса для Линии обрыва (все примеры на этом примитиве покажу):
Извините, вам запрещён просмотр содержимого спойлеров.
В этом классе и в других есть метод
Language.GetItem, который часто везде повторяется. С его помощью получаются локализованные значения по ключу, согласно текущим настройкам языка у пользователя. В комментариях стараюсь подписывать на русском что там выводится
OsnapOverrule и
ObjectOverrule - покажу их следующими, так как они самые маленькие и однотипные. На самом деле даже не однотипные, а практически одинаковые во всех примитивах, но сделать универсально у меня пока не получилось
Извините, вам запрещён просмотр содержимого спойлеров.
Извините, вам запрещён просмотр содержимого спойлеров.
Класс функции (команд) - в этом классе происходит инициализация для каждого примитива (например, подключение overrule и каких-то еще специфичных данных) и содержатся команды:
Извините, вам запрещён просмотр содержимого спойлеров.
Обратите внимание на команду - все действия, которые там происходят, аналогичны во всех примитивах: регистрация имени примитива в таблице зарегистрированных приложений (RegAppTable), получение стиля для примитива, создание экземпляра класса кастомного примитива, создание блока, применение стиля и вставка с использование Jig. При этом создана универсальная Jig, которая подойдет скорее всего для всех примитивов. Если джига отработала нормально, то в блок записываются данные в XData, по которым можно обработать/описать кастомный примитив.
И что самое главное - все это работает само и реализовано в базовых классах, фабриках и пр.
Ну и самое главное - класс самого примитива:
Извините, вам запрещён просмотр содержимого спойлеров.
Если посмотреть внимательно, то станет ясно - тут по сути нужно разработать один метод - UpdateEntities - в этом методе происходит построение простых примитивов внутри блока. Чтобы это было возможно и после создания примитива (т.е. для последующего его редактирования). При этом значения свойств, которые нужны для работы, нужно сохранять в XData. А для этого этим свойствам достаточно указать атрибут [SaveToXData]. Чтобы свойства отображались в палитре свойств или в редакторе стилей, то им указывается атрибут EntityProperty с нужными параметрами. Отображаемое имя и описание указываются ключами локализации - такая уж специфика конкретно в моем плагине.