У меня вырисовывается следующая концепция.
Иерархия виджетов общепринятая. Здесь вопросов нет.
Но виджеты (как мне кажется) не могут существовать сами по себе (создаваться, исчезать), т.е. нужен некий оконный менджер, пусть и однопоточный.
У меня это некий виджет, унаследованный от базового FDesktop, который на эране отрисовывает фоновую картинку, кнопочки по бокам экрана (там есть физические кнопки, тачскрин не приклеен)
Тут как это примерно выглядит.( На звук не обращайте внимание. Забыл телевизор выключить.)В общем сейчас там одно окно отрисовывается, но это сделано "в лоб".
Хочется упорядоченности.
У меня появилась мысль. Окна все заранее конструируются (как, например в QT).
В классе виджета FDesktop есть "пул" на некоторое количество базовых виджетов, примерно так
CODE
class FDesktop : private FWidget, ....
{
public:
...
private:
FWidget* widgetPool[ 100 ];
};
В этом пуле хранятся адреса всех виджетов, которые создаются и уничтожаются в процессе работы (не принадлежат рабочему столу). Кнопки, часики, обои - это все принадлежит рабочему столу.
У рабочего стола вызывается метод его отриосвки desktop.draw() с некоторой периодичностью, который "смотрит" в пул, и если там есть указатели не на нулевые адреса "активных, под фокусом" виджетов, то вызывает их методы draw().
Если есть сообщение от именно клавиатуры, то оно приходит виджету под фокусом (тут вроде без исключений, т.к. пользователь работает с "текущим" окном всегда). Конечно, могут быть заранее заданные комбинации клавиш (типа CTRL + ALT +DEL во многих ОС), когда они перехватываются в данном случае "рабочем столом", а еще лучше вообще не передаются в графическую подсистему. В любом случае, виджеты на них не должны реагировать.
В общем у меня пока плохо укладывается идея управления окнами. Как их создавать, удалять, обновлять и т.п.
Вот, например, мой виджет FButton, в конструкторе принимает следующее
CODE
FButton( FPoint, uint32_t width, uint32_t height, void* callbackFunc );
Пояснения, думаю, не требуются. Правильно ли, идеологически, в данном случае задавать реакцию при нажатию на кнопку таким образом (через указатель) на функцию? Вроде бы да. Ведь кнопка может быть нажата через тачскрин, выбрана кнопками "стрелками", или энкодером. И каждый раз проверять откуда пришло сообщение о нажатии на кнопку не совсем оптимально. Проще отработать некую функцию просто по нажатию на кнопку. Даже если на нее не нажимали, а установили ей ствойство pressed в true.
В общем как-то так, пока смутно...
И, нужно ли обнавлять виджеты, если они "прикрыты" в данный момент активным окном? Проще ведь отрисовывать виджет только под фокусом, и то, что ему принадлежит (т.е. дерево виджетов, начиная с родителя )?
Покопал коды Microchip Library, других библиотек. Но немного сложновато разобраться в их механизме...(
Спасибо!