|
UniWidgets
1.0.0
|
В библиотеке uniwidgets имеется ряд основопологающих кубиков (терминов), из которых складывается библиотека, и которые используются во многих местах данной документации. Здесь приводятся определения этих терминов.
Объекты отображения хоть и отличаются по виду, но делятся на два типа. На данный момент можно выделить типы: картинка и текст. Можно выделить еще два подтипа: картинка с мигнанием и текст с миганием. Каждому объекту отображения соответствует режим и приоритет, которые задаются в свойствах виджета. Этих объектов в виджете может быть столько сколько датчиков привязано к виджету, либо если датчик аналоговый - то сколько состояний у датчика.
Библиотека включает несколько видов логик, у каждой из которых своя задача:
Контейнеры помимо основной функции хранения дочерних виджетов выполняют еще несколько важных функций. Контейнер 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-файле.
Пример такого объекта:
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(); ... // Properties 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()
{
...
// Key
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();
// The SimpleObject::on_realize will be called after this put
put(state_key,
key_rect->get_x(),
key_rect->get_y());
// Diesel
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();
// The SimpleObject::on_realize will be called after this put
put(state_D,
D_rect->get_x(),
D_rect->get_y());
// Generator
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();
// The SimpleObject::on_realize will be called after this put
put(state_G,
G_rect->get_x(),
G_rect->get_y());
...
state_key.show();
state_D.show();
state_G.show();
...
show();
}
...
Данный пример показывает как упрощается работа с виджетом если разбить их на несколько отдельных частей(модулей) и в конечном итоге сильно разгружается glade файл и исчезает необходимость дублировать свойства для нескольких частей виджета(например, когда отображается текст и картинка и в этом случае логики отображения и состояние для текста и картинки имеют одинаковые настройки,но они разные по типу).
Исходя из вышесказанного можно выделить два вида типовых объекта:
1.7.6.1