В библиотеке
uniwidgets имеется ряд основопологающих кубиков (терминов), из которых складывается библиотека, и которые используются во многих местах данной документации. Здесь приводятся определения этих терминов.
Объекты отображения хоть и отличаются по виду, но делятся на два типа. На данный момент можно выделить типы: картинка и текст. Можно выделить еще два подтипа: картинка с мигнанием и текст с миганием. Каждому объекту отображения соответствует режим и приоритет, которые задаются в свойствах виджета. Этих объектов в виджете может быть столько сколько датчиков привязано к виджету, либо если датчик аналоговый - то сколько состояний у датчика.
- Заметки:
- Виджет может иметь много состояний, главное чтобы был датчик или состояние аналогового датчика соответствуещее объекту отображения.
Мигающие типы применяются для обозначения состояний АПС датчиков или обозначения переходных процессов т.е. требующих какой-то динамики в процессе.
Библиотека включает несколько видов логик, у каждой из которых своя задача:
- логика работы с датчиком(логика состояния) - этот тип логик взаимодействует с датчиками
- логика отображения - этот тип логики отвечает за внешенее отображение виджета
Логика состояния отвечает за формирование запросов на изменение состояния виджета в зависимости от значения отслеживаемого датчика. Другими словами логика следит за датчиком и при его изменении подает сигнал об изменении состояния датчика. Этот сигнал направляется во вторую логику - логику отображения. В логике отображения сигнал от логики состояния учитывается,но отображать или не отображать что-либо на экране зависит от алгоритма логики. Сигнал от логики состояния это какой-либо режим определенный в свойствах логики(режимы или mode определены в UniWidgetsTypes). Каждому режиму соответствует приоритет на основание которого можно определить порядок вывода состояний. Вообщем когда виджет отображает состояние единственного датчика, то тут просто выводится состояние "включено" при срабатывании датчика. И при сбросе датчика и квитировании сигнала (если сигнал АПС) это новое состояние тоже сбрасывается и отображается состояние "выключено". Это самый простой вариант, но все усложняется когда один виджет отвечает за отображение состояний нескольких датчиков! Здесь уже нужны приоритеты и алгоритм для их учета при отображении. - Заметки:
- логика отображения у виджета одна,а логик состояния может быть несколько, точнее сколько нужно.
Следует выделить особый вид логики Uniwidgets::LinkLogic. Он служит за отслеживание состояния связи с SharedMemory. При срабатывании датчика логика выставляет специальную переменную в UniWidgets::SimpleObject и виджет "сереет".
Контейнеры помимо основной функции хранения дочерних виджетов выполняют еще несколько важных функций. Контейнер ProxyWidget обеспечивает связь с SharedMemory и произодит начальную инициализацию для вложенных контейнеров(наследуемых от
UVoid),а также обработку появления и пропадания связи с SharedMemory.
Контейнер
UniWidgets::SimpleObject хранит коннектор к SharedMemory и предоставляет возможность логикам с помощью этого коннектора обращаться к объектам SharedMemory, заказывать, сохранять датчики и следить за их изменениями,а также обрабатывать появление различных сообщений. Далее так как это контейнер, то он содержит информацию о содержащихся в нем дочерних виджетах и позволяет дочернему виджету запросить список. Дочерние виджеты хранятся с определенными типами(определенными в
UniWidgetsTypes),чтобы можно было получать список виджетов по типу (например, получить все картинки или найти все индикаторы). ... Также контейнер SimpleObject производит инициализацию виджетов при передачи сигналов о подсоединении к SharedMemory(on_connect) и при сигнале on_realize,а также вызывает обработку сигнала разрыва связи с SharedMemory(on_disconnect) у дочерних виджетов.
Типовые объекты - это сложные, составные виджеты состоящие из нескольких простых сконфигурированых по размерам и размещению в контейнере объектов. Например, виджет
UniWidgets::GDG состоит из множества более простых объектов, которые наследованы от
UniWidgets::AbstractTypical и название классов начинается с Typical(например,
UniWidgets::TypicalState, UniWidgets::Typicalindicator и т.д.).Эти объекты сами по себе не являются виджетами,а служат только для того чтобы сконфигурировать простые виджеты(логики, объекты отображения) как если бы это делалось вручную в glade-файле.
- Заметки:
- В конечный виджет может содержать не только Typical объекты, но и любые другие простые виджеты(логики, картинки и т.п.). Typical объекты просто упрощают конфигурирование виджета, чтобы не нужно было создавать в самом виджете вложенные контейнеры и в них не добавлять созданные картинки и логики.
Пример такого объекта:
AbstractTypical(SimpleObject) --|
|-- ShowLogic(Text или Image)
|-- StateLogic(Text или Image) - (можно указывать несколько т.е. на каждый дискретный датчик своя логика состояния,
| либо испольовать одну логику, но с аналоговым датчиком).
|-- (Image,ImageBlink,
| SimpleText или Text) - (состояний столько, сколько датчиков или если датчкик аналоговый, то состояний | датчика которые нужно отобразить в виджете и состояние отключен )
|....
Это краткое представление объекта
UniWidgets::TypicalState и тому подобных объектов.
Далее этот объект помещается в класс конечного виджета и в виджете после задания свойств для объекта вызывается метод configure() этого объекта, в котором происходит полное конфигурирование его составных частей (создание и размещение картинок, конфигурирование логик и т.д.).
Рассмотрим на примере
UniWidgets::GDG вышеописанные действия:
class GDG : public SimpleObject
{
public:
...
protected:
...
virtual void on_realize();
virtual void on_connect() throw();
...
private:
...
TypicalState state_key;
TypicalState state_D;
TypicalState state_G;
...
void on_configure();
...
ADD_PROPERTY( node, UniSetTypes::ObjectId )
ADD_PROPERTY( svg_path, Glib::ustring )
ADD_PROPERTY( name_path, Glib::RefPtr<Gdk::Pixbuf> )
ADD_PROPERTY( g_off_path, Glib::RefPtr<Gdk::Pixbuf> )
...
В классе объявлены вложенные объекты TypicalState для state_key, state_D, state_G и в методе on_configure происходит их конфигурирование и вызов метода configure() в конце для каждого объекта.
...
void GDG::on_realize()
{
SimpleObject::on_realize();
on_rectangle_changed();
if (!is_configured )
{
is_configured = true;
on_configure();
}
}
void GDG::on_connect() throw()
{
SimpleObject::on_connect();
on_rectangle_changed();
if (!is_configured )
{
is_configured = true;
on_configure();
}
}
void GDG::on_configure()
{
...
state_key.set_rect(*key_rect);
try
{
state_key.set_path(mOFF, Gdk::Pixbuf::create_from_file(get_svg_path() + img_key_off_path));
...
}
catch ( Glib::FileError err )
{
cerr << get_name() << ": " << err.what() <<endl;
}
catch ( Gdk::PixbufError err )
{
cerr << get_name() << ": " << err.what() <<endl;
}
state_key.set_state_ai(get_key_ai());
state_key.set_node(get_node());
state_key.set_lock_view(property_lock_view());
state_key.configure();
put(state_key,
key_rect->get_x(),
key_rect->get_y());
state_D.set_rect(*D_rect);
state_D.set_path(mOFF, get_d_off_path());
...
state_D.set_state_ai(get_d_ai());
state_D.set_node(get_node());
state_D.set_lock_view(property_lock_view());
state_D.configure();
put(state_D,
D_rect->get_x(),
D_rect->get_y());
state_G.set_rect(*G_rect);
state_G.set_path(mOFF, get_g_off_path());
...
state_G.set_state_ai(get_g_ai());
state_G.set_node(get_node());
state_G.set_lock_view(property_lock_view());
state_G.configure();
put(state_G,
G_rect->get_x(),
G_rect->get_y());
...
state_key.show();
state_D.show();
state_G.show();
...
show();
}
...
Данный пример показывает как упрощается работа с виджетом если разбить их на несколько отдельных частей(модулей) и в конечном итоге сильно разгружается glade файл и исчезает необходимость дублировать свойства для нескольких частей виджета(например, когда отображается текст и картинка и в этом случае логики отображения и состояние для текста и картинки имеют одинаковые настройки,но они разные по типу).
Исходя из вышесказанного можно выделить два вида типовых объекта:
- Конечные типовые виджеты(UniWidgets::GDG,...).
- Типовые объекты для упрощения создания и конфигурирования простых виджетов(TypicalState,...).