Привет, ЛОР. С 8м марта тебя.
Вопрос по архитектуре. Существует следующая схема:
Основная структура:
[theme]
+-------steps
+-------replacers
Дополнительные структуры:
[steps]
+-------data
+-------painter
+-------releaser
[replacers]
+-------target
+-------replacer
Суть в чем - эта штука отвечает за отрисовку тем. Steps - это шаги для отрисовки. Каждый шаг может быть примитивом (квадрат, круг, etc), эффектом (gauss, etc) или, например, текстом. Чтобы не городить огороды я стандартизировал тип для хранения шага ([steps] выше). Т.е. там теперь хранится коллбек на отрисовщика (типа зачем блоку обратки тем знать про то, как рисовать квадрат, если этим может заниматься стандартизированный модуль квадрата), указатель на releaser (типа если модуль обработки примитива аллоцировал память для чего-то, пусть сам, так как он знакет как, освобождает), и указатель на void *, где хранятся данные, нужные для шага (ширина, высота, цвет, etc).
Блок replacers отвечает за следующую вещь - если в теме будет сказано «напиши „Вася“ по позиции 1,103 черным цветом шрифтом Tahoma», он напишет. Но практической пользы ноль. Поэтому тут объявляются «замены» - т.е. Например в файле темы будет написано «напиши »$BUTTONCAPTION" по позиции 1,103 черным цветом шрифтом Tahoma", а в функции ButtonSetCaption будет добавляться замена в массив Replacers -> $BUTTONCAPTION; MyButton.
Теперь проблема - функция painter в примитивах имеет сигнатуру - (изображение, где рисовать, указатель на блок данных). Каждый обработчик в своем модуле знает как интерпретировать указатель на блок данных, поэтому ему проблем нет. Но при этом обработчик painter в примитиве «надпись» не знает о заменах. поэтому он будет писать «$BUTTONCAPTION» вместо кепшена самой кнопки. Я не могу дать этому примитиву указатель на массив замен, так как тогда мне придется менять сигнатуру функции и давать такой указатель ВСЕМ примитивам. А всем остальным этот указатель не нужен, он нужен только примитиву «Надпись». Я так же не могу производить замены уровнем выше, потому что обработчик тем не знает, какого типа примитив лежит по этому адресу, у него только указатель на отрисовщик, указатель на освободитель и указатель на блок памяти без опознавательных знаков.
В общем загнал себя в угол. Есть идеи, как решить? Если непонятно объяснил, могу схемами.