Основные понятия

В библиотеке uniwidgets имеется ряд основопологающих кубиков (терминов), из которых складывается библиотека, и которые используются во многих местах данной документации. Здесь приводятся определения этих терминов.

Объект отображения \n

Объекты отображения хоть и отличаются по виду, но делятся на два типа. На данный момент можно выделить типы: картинка и текст. Можно выделить еще два подтипа: картинка с мигнанием и текст с миганием. Каждому объекту отображения соответствует режим и приоритет, которые задаются в свойствах виджета. Этих объектов в виджете может быть столько сколько датчиков привязано к виджету, либо если датчик аналоговый - то сколько состояний у датчика.
Заметки:
Виджет может иметь много состояний, главное чтобы был датчик или состояние аналогового датчика соответствуещее объекту отображения.
Мигающие типы применяются для обозначения состояний АПС датчиков или обозначения переходных процессов т.е. требующих какой-то динамики в процессе.

Логика

Библиотека включает несколько видов логик, у каждой из которых своя задача:

Главный контейнер

Контейнеры помимо основной функции хранения дочерних виджетов выполняют еще несколько важных функций. Контейнер 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();
    ...
    // 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 файл и исчезает необходимость дублировать свойства для нескольких частей виджета(например, когда отображается текст и картинка и в этом случае логики отображения и состояние для текста и картинки имеют одинаковые настройки,но они разные по типу).
Исходя из вышесказанного можно выделить два вида типовых объекта:


Документация по UniWidgets. Последние изменения: Fri Oct 10 09:57:50 2014. Создано системой  doxygen 1.5.9