[Предыдущая] [Содержание] [Индекс] [Следующая]

Использование Суперклассов Виджетов

Эта глава охватывает следующие темы:

Эта глава описывает общие виджеты суперклассы. Используйте эту информацию, чтобы определить, делает ли метод суперкласса то, в чем нуждается ваш виджет. С этим знанием Вы можете решить, занять ли метод (наследование отмены), добавить метод к цепочке, или использовать функции PtSuperClass*.


Обратите внимание: Важно прочитать спецификации каждого из суперклассов вашего виджета перед использованием любой из функций PtSuperClass*().

PtWidget

Суперкласс PtWidget обеспечивает фундаментальные функциональные возможности всех виджетов Фотона.

Классовая иерархия

PtWidget

Флаги класса

Pt_RECTANGULAR

Методы

PtWidget определяет методы класса, описанные ниже.

Метод По Умолчанию

Нет.

Метод Инициализации

Нет.

Метод Размерности

Вычисляет размерности виджета не учитывая границы или поля. Размерности рассчитываются основываясь на позиции (Pt_ARG_POS) и измерениях (Pt_ARG_DIM) виджета. Для непересекающихся виджетов (например виджеты PtWindow), позиция равна (0, 0).

Метод Подключения

Определяет, нуждается ли виджет в области, и если так, какие события области должны быть непрозрачными и/или чувствительными.

Если виджет определяет растровый курсор, он установлен как данные области. Если виджет уже имеет область, то она модифицирована с непрозрачными/чувствительными данными и данными области. Это делается через PhRegionChange().

Если виджет не имеет области, но требует ее, она создается через PhRegionOpen().

Наконец, если виджет не окно, любые обратные вызовы горячих клавиш, присоединенные к виджету, регистрируются с самым близким непересекающимся родителем (класс PtWindow). Это делается через PtSetResources().

Метод Реализации

Нет.

Метод Дереализации

Если виджет имеет область, то она закрывается. Все потомки (члены widget->rid) установлены в 0. Если виджет не окно, любые присоединенные обратные вызовы горячих клавиш отсоединяются от непересекающегося родителя.

Размерности этого виджета повреждаются родителем. Все дочерние виджеты этого виджета дереализованы. Любой из этих виджетов, имеющих ограничивающего родителя с установленным Pt_SET_CHILD_UNREALIZED_F вызывает эту функцию. Все вункции из цепочки обратных вызовов Pt_CB_UNREALIZED будет вызвана (сверху вниз).

Метод Разрушения

Вызывается, когда образец виджета удаляется. Освобождает widget->widget_data. Любая память, автоматически распределенная ресурсом, выпущена (эта память не должна быть освобождена в методе Разрушения). Любые ресурсы, которые Вы освобождаете, должны устанавливать указатель в NULL, чтобы предотвратить двигатель виджета от освобождения памяти второй раз. Следующие типы ресурсов автоматически распределяют и выпускают память:

Действия виджета

Необработанные обратные вызовы поддержываются для Ph_EV_BUT_PRESS, Ph_EV_BUT_RELEASE, Ph_EV_BUT_REPEAT и Ph_EV_KEY событий.

Если в цепочке обратных вызовов Pt_CB_FILTER имеются обратные вызовы, которые имеют маску события, которая соответствует типу текущего события, то эти обратные вызовы вызываются. Если значение, возвращенное обратным вызовом фильтра большее чем 0, это значение возвращается. Если имеются всплывающие подсказки, зарегистрированные с этим виджетом, список всплывающих подсказок проверяется, чтобы определить, должна ли всплывающая подсказка быть включена и/или выключена.

Если событие это событие Ph_EV_KEY, событие дается находящимуся в фокусе дочерниму виджету виджета, если таковой имеется. Если событие не использовано виджетом, обрабатывается цепочка горячих клавиш самого близкого непересекающегося родителя, чтобы видеть, является ли клавиша горячей. Если соответствия горячей клавиши найдено, вызывается обратный вызов горячей клавиши, и событие используется (возврат Pt_END).

Если событие это нажатие, отпускание или повторение кнопки, каждый дочерний виджет, пересекающий событие, находится через PtContainerHit(), пока один из этих виджетов не использует событие.

Когда пересекающийся виджет найден, прямоугольник события переводится относительно левого верхнего угла холста пересекающегося виджета. Как только трансляция выполнена, событие дается пересекающемуся виджету через absorbed = PtEventHandler(). После возврата, прямоугольник события депереводится тем же способом.

Если все следующее истина:

тогда фокус дается этому виджету, и event->processing_flags имеет флаг Ph_DIRECTED_FOCUS установленным. Если PtEventHandler() возвращает Pt_END, событие рассматривается использованным, и возвращается Pt_END.

Дополнительный шаг выполняется, если событие и _Pt_->current равны NULL: регистрируется поглащающий виджет с целью доставить искусственные отпускания соответствующему виджету в более позднее время.

if( widget->rid ) 
    //if the event was not absorbed, take it back.
    cbinfo->event->collector.rid = widget->rid;

if( ( ( absorbed != Pt_CONTINUE ) || 
      ( cbinfo->event->processing_flags & Ph_BACK_EVENT ) )
      &&  wp && cbinfo->event->type == Ph_EV_BUT_PRESS
      && ( !_Pt_->current || _Pt_->current == wp ) )
    {
    if ( wp->flags & Pt_DESTROYED )
        _Pt_->current = (PtWidget_t *)Pt_END;
    else
        _Pt_->current = wp;
    }

Как только событие было использовано или больше нет пересекающихся событий, возвращается Pt_END. Иначе возвращается поглощенный.

Определения Ресурсов

static const PtResourceRec_t resources[] = {
    { Pt_ARG_AREA,          Pt_CHANGE_CANVAS, 0,
        Pt_ARG_IS_STRUCT( PtWidget_t, area )},
    { Pt_ARG_BEVEL_WIDTH,   Pt_CHANGE_CANVAS_REDRAW, 0,
        Pt_ARG_IS_NUMBER( PtWidget_t, border_width ) },
    { Pt_ARG_CURSOR_TYPE,       core_modify_cursor, 0,
        Pt_ARG_IS_NUMBER( PtWidget_t, cursor_type )},
    { Pt_ARG_CURSOR_COLOR,  core_modify_cursor, 0,
        Pt_ARG_IS_NUMBER( PtWidget_t, cursor_color )},
    { Pt_ARG_DATA,          Pt_CHANGE_INVISIBLE, 0,
        Pt_ARG_IS_ALLOC( PtWidget_t, data )},
    { Pt_ARG_DIM,               Pt_CHANGE_CANVAS, 0,
        Pt_ARG_IS_STRUCT( PtWidget_t, area.size )},
    { Pt_ARG_FLAGS,         PtModifyFlags, 0,
        Pt_ARG_IS_FLAGS( PtWidget_t, flags )},
    { Pt_ARG_POS,               Pt_CHANGE_CANVAS, 0,
        Pt_ARG_IS_STRUCT( PtWidget_t, area.pos ) },
    { Pt_ARG_RESIZE_FLAGS,      Pt_CHANGE_RESIZE, 0,
        Pt_ARG_IS_FLAGS( PtWidget_t, resize_flags )},
    { Pt_CB_DESTROYED,      Pt_CHANGE_INVISIBLE, 0,
        Pt_ARG_IS_CALLBACK_LIST( PtWidget_t, destroyed )},
    { Pt_CB_HOTKEY,         core_modify_hotkey_callbacks, 0,
        Pt_ARG_IS_CALLBACK_LIST( PtWidget_t, hotkeys )},
    { Pt_CB_RAW_EVENT,      core_modify_raw_callbacks, 0,
        Pt_ARG_IS_LINK( PtWidget_t, callbacks )},
    { Pt_CB_REALIZED,           Pt_CHANGE_INVISIBLE, 0,
        Pt_ARG_IS_CALLBACK_LIST( PtWidget_t, realized )},
    { Pt_CB_UNREALIZED,     Pt_CHANGE_INVISIBLE, 0,
        Pt_ARG_IS_CALLBACK_LIST( PtWidget_t, unrealized )},
    { Pt_ARG_USER_DATA,     Pt_CHANGE_INVISIBLE, 0,
        Pt_ARG_IS_ALLOC( PtWidget_t, user_data )},
    { Pt_ARG_HELP_TOPIC,        Pt_CHANGE_INVISIBLE, 0,
        Pt_ARG_IS_STRING( PtWidget_t, help_topic )
    },
    { Pt_CB_BLOCKED,            Pt_CHANGE_INVISIBLE, 0,
        Pt_ARG_IS_CALLBACK_LIST( PtWidget_t, blocked )},
    { Pt_ARG_BITMAP_CURSOR, bitmap_cursor_change, 0, 
        Pt_ARG_IS_ALLOC( PtWidget_t, bitmap_cursor )
    },
    { Pt_ARG_EFLAGS,    PtModifyEFlags, 0,
        Pt_ARG_IS_FLAGS( PtWidget_t, eflags )},
    { Pt_CB_IS_DESTROYED, Pt_CHANGE_INVISIBLE, 0, 
        Pt_ARG_IS_CALLBACK_LIST( PtWidget_t, is_destroyed ) },
    { Pt_CB_DND, Pt_CHANGE_INVISIBLE, 0, 
        Pt_ARG_IS_CALLBACK_LIST( PtWidget_t, dnd ) },
    { Pt_ARG_EXTENT,    core_modify_extent, 0,
        Pt_ARG_IS_STRUCT( PtWidget_t, extent ) },
    { Pt_CB_OUTBOUND, Pt_CHANGE_INVISIBLE, 0, 
        Pt_ARG_IS_CALLBACK_LIST( PtWidget_t, outbound ) },
    { Pt_ARG_WIDTH,             Pt_CHANGE_CANVAS, 0,
        Pt_ARG_IS_NUMBER( PtWidget_t, area.size.w )},
    { Pt_ARG_HEIGHT,                Pt_CHANGE_CANVAS, 0,
        Pt_ARG_IS_NUMBER( PtWidget_t, area.size.h )},
    { Pt_ARG_MINIMUM_DIM,           Pt_CHANGE_RESIZE, 0,
        Pt_ARG_IS_STRUCT( PtWidget_t, min_dim )},
    { Pt_CB_FILTER, Pt_CHANGE_INVISIBLE, NULL, 
        Pt_ARG_IS_LINK( PtWidget_t, filter ) },
    { Pt_ARG_POINTER, Pt_CHANGE_INVISIBLE, NULL, 
        Pt_ARG_IS_POINTER( PtWidget_t, ptr ) },
};

Функции

static core_modify_cursor()
Устанавливает ресурс через прямое назначение и если реализовано, устанавливает бит Ph_REGION_CURSOR в widget->flags. Если этот флаг включен, когда вызвана функция PtUpdate() (смотрите Справочное Руководство по Библиотеке - Library Reference Фотона), будет выполнена PhRegionChange(), чтобы изменить курсор области или создать область, если не существует.
static core_modify_raw_callbacks()
Устанавливает ресурс через PtSetStruct() и корректирует чувствительность области виджета.
static core_modify_hotkey_callbacks()
Устанавливает ресурс через PtSetStruct() и если реализовано, присоединяет любые обратные вызовы горячих клавиш неоконного виджета его непересекающемуся родителю.
int PtModifyFlags()
Сбрасывает биты флага только для чтения от маски и применяет оставшийся флаг к widget->flags. Изменение в следующих битах флага может заставить виджет изменяться:
Pt_AUTOHIGHLIGHT
Требует область и чувствительность к событиям Ph_EV_BOUNDARY через PhRegionChange() или метод Подключения PtWidget.
Pt_ETCH_HIGHLIGHT
Изменяет размеры, устанавливая бит Pt_WIDGET_RESIZE в widget->flags.
Pt_SET
Если Pt_SELECT_NOREDRAW не установлен во флагах виджета, виджет вынудит перерисовку, вызывая PtDamageWidget().
Pt_HIGHLIGHTED
Виджет вынудит перерисовку, вызывая PtDamageWidget().

PtBasic

Обеспечивает фундаментальное поведение виджета Фотона и обратные вызовы.

Классовая иерархия

PtWidget --> PtBasic

Расширения класса

Виджет PtBasic добавляет три метода уровня класса к фундаментальным функциональным возможностям виджета. Для законченных описаний, смотрите "Методы класса" в главе Анатомия Виджета.

typedef struct Pt_basic_widget_class {
     PtWidgetClass_t   core;
     void  (*got_focus_f)( PtWidget_t *, PhEvent_t * );
     void  (*lost_focus_f)( PtWidget_t *, PhEvent_t * );
     void  (*calc_opaque_f)( PtWidget_t * );
     } PtBasicWidgetClass_t;

#define Pt_SET_GOT_FOCUS_F (Pt_ARG_IS_POINTER(PtBasicWidgetClass_t,got_focus_f))
#define Pt_SET_LOST_FOCUS_F (Pt_ARG_IS_POINTER(PtBasicWidgetClass_t,lost_focus_f))
#define Pt_SET_CALC_OPAQUE_F (Pt_ARG_IS_POINTER(PtBasicWidgetClass_t,calc_opaque_f))

Методы

PtBasic определяет методы класса, описанные ниже.

Метод По Умолчанию

widget->border_width = 1;
widget->cursor_color = Ph_CURSOR_DEFAULT_COLOR;
widget->resize_flags |= Pt_RESIZE_XY_AS_REQUIRED;
widget->eflags = Pt_DAMAGE_ON_FOCUS;

basic->border_color = basic->fill_color = Pg_LGREY;
basic->flags = Pt_ALL_ETCHES | Pt_ALL_BEVELS | 
                  Pt_ALL_OUTLINES | Pt_FLAT_FILL;
basic->inline_color = basic->outline_color = PgGrey( 0x4b );

Метод Инициализации

Нет.

Метод Размерности

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

Метод размерности вычисляет непрозрачный прямоугольник виджета и определяет, установлен ли флаг Pt_OPAQUE виджета. Непрозрачный прямоугольник, widget->opaque, указывает:

Этот прямоугольник это область, способная к затенению любых виджетов ниже нее. Виджеты, полностью затененные другим виджетом, не рисуются.

Метод Подключения

Проверяет член структуры calc_opaque_f класса PtBasic. Если не NULL, функция вызывается. Функция calc_opaque_f() ответственна за установку или очистку флага Pt_OPAQUE виджета. Если виджет имеет прямоугольную область, блокирующую что нибудь ниже, флаг Pt_OPAQUE должен быть установлен, и widget->opaque_rect должна идентифицировать эту прямоугольную область. Иначе, флаг Pt_OPAQUE должен быть очищен.


Обратите внимание: Если цвет заполнения виджета Pg_TRANSPARENT или basic->roundness больше чем 0, виджет не должен быть помечен как непрозрачный.

Метод Реализации

Наследуется от PtWidget.

Метод Рисования

Метод Рисования PtBasic рисует прямоугольник, заполненный текущим цветом заполнения. Рамка виджета рисуется, если Pt_HIGHLIGHTED бит флагов виджета установлен, и ширина рамки больше чем 0.

Если Pt_SET бит установлен, рамка выполняется перевернутой (то есть цвет верхней границы используется, чтобы рисовать нижнюю границу и наоборот). Метод Рисования PtBasic также обрабатывает исполнение фокуса.

Метод Дереализации

Нет.

Метод Разрушения

Нет.

Метод Получения Фокуса

Повреждает виджеты, имеющие флаги Pt_FOCUS_RENDER и Pt_DAMAGE_ON_FOCUS установленными. Подсвечивает и вызывает список обратных вызовов basic->arm (Pt_CB_ARM), если этот виджет имеет флаг Pt_AUTOHIGHLIGHT установленным. Вызывает список обратных вызовов basic->got_focus (Pt_CB_GOT_FOCUS) используя PtInvokeCallbackList().

Метод Потери Фокуса

Повреждает виджеты, имеющие флаги Pt_FOCUS_RENDER и Pt_DAMAGE_ON_FOCUS установленными. Подвысвечивает и вызывает список обратных вызовов basic->disarm (Pt_CB_DISARM), если этот виджет имеет флаг Pt_AUTOHIGHLIGHT установленным. Вызывает список обратных вызовов basic->got_focus (Pt_CB_LOST_FOCUS) через PtInvokeCallbackList().

Метод Расчета Непрозрачного Прямоугольника

Устанавливает или очищает флаг Pt_OPAQUE виджета (ресурс Pt_ARG_FLAGS) основываясь на цвете заполнения виджета, округлости и текущем значении флага Pt_RECTANGULAR в структуре класса виджета.

Действия виджета

PtBasic чувствителен к следующим событиям:

Ph_EV_BUT_PRESS
Виджет устанавливает/очищает флаги Pt_SET, вызывает Pt_CB_ARM (и возможно Pt_CB_ACTIVATE, если кнопка переключатель выбрана) и Pt_CB_MENU (если правая кнопка мыши нажата).
Ph_EV_BUT_REPEAT
Виджет вызывает обратные вызовы Pt_CB_REPEAT.
Ph_EV_BUT_RELEASE
Виджет вызывает обратные вызовы Pt_CB_DISARM. Если реальный выпуск (в противоположность искуственному) получен, виджет также вызывает Pt_CB_ACTIVATE.
Ph_EV_BOUNDARY
Виджет управляет подсвечиванием виджетов установкой флага Pt_AUTOHIGHLIGHT.

Необработанные обратные вызовы возвращают Pt_CONTINUE, чтобы позволить продолжение цепочки.


Обратите внимание: Если ваш класс виджета определяет Pt_SET_RAW_CALLBACKS, запомните это: если ваш необработанный обратный вызов чувствителен к одному из событий, перечисленных выше, и обратный вызов возвращает Pt_END или Pt_HALT, поведение PtBasic для этого события не будет происходить, если Вы не вызовите необработанные обработчики PtBasic'а внутри обратного вызова до возвращения. Это может быть сделано через PtSuperClassRawEvent().

Определения ресурса

static const PtResourceRec_t resources[] =
{
    { Pt_ARG_FLAGS, basic_modify_flags, NULL,
      Pt_ARG_IS_FLAGS( PtWidget_t, flags ) },
    { Pt_ARG_INLINE_COLOR, Pt_CHANGE_INVISIBLE, NULL,
      Pt_ARG_IS_COLOR( PtBasicWidget_t, inline_color ) },
    { Pt_ARG_COLOR, Pt_CHANGE_REDRAW, NULL,
      Pt_ARG_IS_COLOR( PtBasicWidget_t, color ) },
    { Pt_ARG_FILL_COLOR, Pt_CHANGE_INVISIBLE, NULL,
      Pt_ARG_IS_COLOR( PtBasicWidget_t, fill_color ) },
    { Pt_ARG_FILL_PATTERN, Pt_CHANGE_REDRAW, NULL,
      Pt_ARG_IS_STRUCT( PtBasicWidget_t, fill_pattern ) },
    { Pt_ARG_MARGIN_HEIGHT, Pt_CHANGE_CANVAS, NULL,
      Pt_ARG_IS_NUMBER( PtBasicWidget_t, margin_height ) },
    { Pt_ARG_MARGIN_WIDTH, Pt_CHANGE_CANVAS, NULL,
      Pt_ARG_IS_NUMBER( PtBasicWidget_t, margin_width ) },
    { Pt_ARG_OUTLINE_COLOR, Pt_CHANGE_INVISIBLE, NULL, 
      Pt_ARG_IS_COLOR( PtBasicWidget_t, outline_color ) },
    { Pt_CB_ARM, Pt_CHANGE_INVISIBLE, NULL, 
      Pt_ARG_IS_CALLBACK_LIST( PtBasicWidget_t, arm ) },
    { Pt_CB_DISARM, Pt_CHANGE_INVISIBLE, NULL, 
      Pt_ARG_IS_CALLBACK_LIST( PtBasicWidget_t, disarm ) },
    { Pt_CB_ACTIVATE, Pt_CHANGE_INVISIBLE, NULL, 
      Pt_ARG_IS_CALLBACK_LIST( PtBasicWidget_t, activate ) },
    { Pt_CB_GOT_FOCUS, Pt_CHANGE_INVISIBLE, NULL, 
      Pt_ARG_IS_CALLBACK_LIST( PtBasicWidget_t, got_focus ) },
    { Pt_CB_LOST_FOCUS, Pt_CHANGE_INVISIBLE, NULL, 
      Pt_ARG_IS_CALLBACK_LIST( PtBasicWidget_t, lost_focus ) },
    { Pt_CB_REPEAT, Pt_CHANGE_INVISIBLE, NULL, 
      Pt_ARG_IS_CALLBACK_LIST( PtBasicWidget_t, repeat ) },
    { Pt_ARG_TRANS_PATTERN, Pt_CHANGE_RESIZE_REDRAW, NULL, 
      Pt_ARG_IS_STRUCT( PtBasicWidget_t, trans_pattern ) },
    { Pt_ARG_BASIC_FLAGS, basic_modify_flags, NULL, 
      Pt_ARG_IS_FLAGS( PtBasicWidget_t, flags ) },
    { Pt_CB_MENU, Pt_CHANGE_INVISIBLE, NULL, 
      Pt_ARG_IS_CALLBACK_LIST( PtBasicWidget_t, menu ) },
    { Pt_ARG_CONTRAST, Pt_CHANGE_INVISIBLE, NULL, 
      Pt_ARG_IS_NUMBER( PtBasicWidget_t, contrast ) },
    { Pt_ARG_BEVEL_CONTRAST, Pt_CHANGE_INVISIBLE, NULL, 
      Pt_ARG_IS_NUMBER( PtBasicWidget_t, border_contrast ) },
    { Pt_ARG_BEVEL_COLOR, Pt_CHANGE_INVISIBLE, NULL, 
      Pt_ARG_IS_COLOR( PtBasicWidget_t, border_color ) },
    { Pt_ARG_LIGHT_FILL_COLOR, Pt_CHANGE_INVISIBLE, NULL, 
      Pt_ARG_IS_COLOR( PtBasicWidget_t, top_flat_color ) },
    { Pt_ARG_DARK_FILL_COLOR, Pt_CHANGE_INVISIBLE, NULL, 
      Pt_ARG_IS_COLOR( PtBasicWidget_t, bot_flat_color ) },
    { Pt_ARG_DARK_BEVEL_COLOR, Pt_CHANGE_INVISIBLE, NULL, 
      Pt_ARG_IS_COLOR( PtBasicWidget_t, bot_border_color ) },
    { Pt_ARG_LIGHT_BEVEL_COLOR, Pt_CHANGE_INVISIBLE, NULL, 
      Pt_ARG_IS_COLOR( PtBasicWidget_t, top_border_color ) },
};

Функции

static void basic_modify_flags()
Для Pt_ARG_FLAGS, эта функция:
  • повторно вычисляет непрозрачный прямоугольник, если флаг подсветки изменяется
  • повреждает виджет, если флаг Pt_GHOST изменяется
  • позволяет любым другим изменениям флагов быть обработанными через PtSuperClassSetResources()
void basic_modify()
Устанавливает цвет заполнения и значения округлости. Вызывает метод Подключения PtBasic (который вызывает метод Расчета Непрозрачного Прямоугольника), и повторно исследует состояние очистки/непрозрачности виджета через PtUpdateVisibility().
Обратите внимание: Установка бита Pt_CONSUME_EVENTS ресурса eflags PtWidget'а управляет, потребляет ли виджет любое событие, данное ему. Контейнерные виджеты устанавливают этот бит по умолчанию, чтобы предотвратить события от прохождения к подклассифицируемым виджетам ниже них.

PtContainer

Этот суперкласс обеспечивает новое начало координат, отсечение и ограничения для дочерних виджетов виджета. Если вы создаете виджет с дочерними виджетами, мы рекомендуем, чтобы Вы делали ваш виджет подклассом PtContainer или одного из его подклассов.


Обратите внимание: Контейнер может иметь свой собственный метод Рисования, чтобы выполнить любые специфические для виджета данные (кроме дочерних виджетов).

Классовая иерархия

PtWidget --> PtBasic --> PtContainer

Расширения класса

typedef struct Pt_container_widget_class {
    PtBasicWidgetClass_t    basic;
    void    (*child_created_f)( PtWidget_t *widget,
                                PtWidget_t *child );
    int     (*child_settingresource_f)(PtWidget_t *widget,
                                       PtWidget_t *child,
                                       PtArg_t const *argt);
    int     (*child_gettingresource_f)(PtWidget_t *widget,
                                       PtWidget_t *child,
                                       PtArg_t *argt );
    int     (*child_realizing_f)( PtWidget_t *widget,
                                  PtWidget_t *child );
    void    (*child_realized_f)( PtWidget_t *widget,
                                 PtWidget_t *child );
    void    (*child_unrealizing_f)( PtWidget_t *widget,
                                    PtWidget_t *child );
    void    (*child_unrealized_f)( PtWidget_t *widget,
                                   PtWidget_t *child );
    void    (*child_destroyed_f)( PtWidget_t *widget,
                                  PtWidget_t *child );
    void    (*child_move_resize_f)( PtWidget_t *widget,
                                    PtWidget_t *child,
                                    PhArea_t *current_area,
                                    PhRect_t *current_extent,
                                    PhArea_t *old_area,
                                    PhRect_t *old_extent );
    int     (*child_getting_focus_f)( PtWidget_t *widget,
                                      PtWidget_t *child,
                                      PhEvent_t *event );
    int     (*child_losing_focus_f)( PtWidget_t *widget,
                                     PtWidget_t *child,
                                     PhEvent_t *event );
    PtWidget_t * (*child_redirect_f)( PtWidget_t *,
                                      PtWidgetClassRef_t *);

} PtContainerClass_t;

#define Pt_SET_CHILD_SETTINGRESOURCE_F \
        (Pt_ARG_MODE_PTR|offsetof(PtContainerClass_t, \
                                  child_settingresource_f))
#define Pt_SET_CHILD_GETTINGRESOURCE_F \
        (Pt_ARG_MODE_PTR|offsetof(PtContainerClass_t, \
                                  child_gettingresource_f))
#define Pt_SET_CHILD_REALIZING_F \
        (Pt_ARG_MODE_PTR|offsetof(PtContainerClass_t, \
                                  child_realizing_f))
#define Pt_SET_CHILD_REALIZED_F \
        (Pt_ARG_MODE_PTR|offsetof(PtContainerClass_t, \
                                  child_realized_f))
#define Pt_SET_CHILD_UNREALIZING_F \
        (Pt_ARG_MODE_PTR|offsetof(PtContainerClass_t, \
                                  child_unrealizing_f)) 
#define Pt_SET_CHILD_UNREALIZED_F \
        (Pt_ARG_MODE_PTR|offsetof(PtContainerClass_t, \
                                  child_unrealized_f)) 
#define Pt_SET_CHILD_CREATED_F \
        (Pt_ARG_MODE_PTR|offsetof(PtContainerClass_t, \
                                  child_created_f)) 
#define Pt_SET_CHILD_DESTROYED_F \
        (Pt_ARG_MODE_PTR|offsetof(PtContainerClass_t, \
                                  child_destroyed_f)) 
#define Pt_SET_CHILD_MOVED_RESIZED_F \
        (Pt_ARG_MODE_PTR|offsetof(PtContainerClass_t, \
                                  child_move_resize_f)) 
#define Pt_SET_CHILD_GETTING_FOCUS_F \
        (Pt_ARG_MODE_PTR|offsetof(PtContainerClass_t, \
                                  child_getting_focus_f)) 
#define Pt_SET_CHILD_LOSING_FOCUS_F \
        (Pt_ARG_MODE_PTR|offsetof(PtContainerClass_t, \
                                  child_losing_focus_f)) 
#define Pt_SET_CHILD_REDIRECT_F \
        (Pt_ARG_MODE_PTR|offsetof(PtContainerClass_t, \
                                  child_redirect_f))

Методы

PtContainer определяет методы класса, описанные ниже.

Метод По Умолчанию

PtContainerWidget_t *ctnr =(PtContainerWidget_t *)widget;
PtBasicWidget_t *basic = (void *)widget;

widget->eflags |= Pt_CONSUME_EVENTS;
widget->border_width = 0;
widget->resize_flags &= ~Pt_RESIZE_XY_BITS;
basic->flags = Pt_ALL_BEVELS | Pt_FLAT_FILL;
ctnr->flags = Pt_ANCHOR_CHILD_HORIZONTAL |
                 Pt_ANCHOR_CHILD_VERTICAL |
                 Pt_CANVAS_INVALID | Pt_ENABLE_CUA |
                 Pt_ENABLE_CUA_ARROWS;

ctnr->title_font = strdup("TextFont09");

PtSetParentWidget( widget );

Метод Инициализации

Регистрируется с его родителем для служб прикрепления.

Метод Размерности

Находит блок ограничения дочерних виджетов виджета и применяет его политику изменения размера. Размерности рассчитываются, и если в результате холст различен, все зарегистрированные дочерние контейнеры прикрепляются. Если размерности или холст различны, список обратных вызовов изменения размера виджета вызываются. Смотрите PtSuperClassExtent() для типового метода Размерности контейнера.

Метод Подключения

Нет.

Метод Реализации

Нет.

Метод Рисования

Наследуется от PtBasic.

Метод Дереализации

Вычеркивает виджет из его родителя. Уничтожает current_balloon и устанавливает его в NULL (если он еще не NULL).

Метод Разрушения

Вычеркивает виджет из его родителя.

Метод Получения Фокуса

Наследуется от PtBasic.

Метод Потери Фокуса

Наследуется от PtBasic.

Метод Расчета Непрозрачного Прямоугольника

Наследуется от PtBasic.

Метод Создания Дочернего Виджета

Нет.

Метод Реализации/Дереализации Дочерних Виджетов

static void container_child_realized_unrealized( 
    PtWidget_t *widget, PtWidget_t *child )
{
    PtContainerWidget_t *ctnr = 
       (PtContainerWidget_t *)widget;
    if( child->flags & Pt_PROCREATED )
    // || !PtResizePolicy( widget ) )
        return;

    if ( ( widget->flags & Pt_REALIZED ) &&
         ( ctnr->flags & Pt_AUTO_EXTENT ) )
    {
        ctnr->flags |= Pt_IGNORE_CONSTRAINTS;
        PtMoveResizeWidget( widget, 0 );
        ctnr->flags &= ~Pt_IGNORE_CONSTRAINTS;
    }
}

Метод Перемещения/Изменения Размера Дочерних Виджетов

Вызывает метод Реализации/Дереализации Дочерних Виджетов с правильными параметрами:

static void container_child_moved_resized(
     PtWidget_t *widget, PtWidget_t *child,
     PhArea_t *area, PhRect_t *rect,
     PhArea_t *oarea, PhRect_t *orect )
{
    container_child_realized_unrealized( widget, child );
}

Метод Разрушения Дочерних Виджетов

Нет.

Метод Установки Ресурсов Дочерних Виджетов

Нет.

Метод Получения Ресурсов Дочерних Виджетов

Нет.

Метод Получения Фокуса Дочерними Виджетами

Нет.

Метод Потери Фокуса Дочерними Виджетами

Нет.

Действия виджета

Нет.

Определения ресурса

static const PtRawCallback_t callback = 
{
    Pt_EV_REDIRECTED,   container_callback, NULL
};

static const PtResourceRec_t resources[] = 
{
    { Pt_ARG_AREA, container_modify_area, NULL,
      Pt_ARG_IS_STRUCT( PtWidget_t, area ) },
    { Pt_ARG_DIM, container_modify_area, NULL,
      Pt_ARG_IS_STRUCT( PtWidget_t, area.size ) },
    { Pt_ARG_POS, container_modify_area, NULL,
      Pt_ARG_IS_STRUCT( PtWidget_t, area.pos ) },
    { Pt_ARG_RESIZE_FLAGS, container_modify_area, NULL,
      Pt_ARG_IS_FLAGS( PtWidget_t, resize_flags ) },
    { Pt_ARG_ANCHOR_OFFSETS, container_modify_area, NULL,
      Pt_ARG_IS_STRUCT( PtContainerWidget_t, anchor_offset) },
    { Pt_ARG_ANCHOR_FLAGS, container_modify_area, NULL,
      Pt_ARG_IS_FLAGS( PtContainerWidget_t, anchor_flags ) },
    { Pt_ARG_FOCUS, container_modify, NULL,
      Pt_ARG_IS_POINTER( PtContainerWidget_t, focus ) },
    { Pt_CB_RESIZE, Pt_CHANGE_INVISIBLE, NULL,
      Pt_ARG_IS_CALLBACK_LIST( PtContainerWidget_t, resize ) },
    { Pt_CB_BALLOONS, container_set_balloons, NULL,
      Pt_ARG_IS_LINK( PtContainerWidget_t, balloons ) },
    { Pt_ARG_CONTAINER_FLAGS, container_modify_flags, NULL,
      Pt_ARG_IS_FLAGS( PtContainerWidget_t, flags ) },
    { Pt_ARG_TITLE, container_set_title, NULL,
      Pt_ARG_IS_STRING( PtContainerWidget_t, title ) },
    { Pt_ARG_TITLE_FONT, container_set_title, NULL,
      Pt_ARG_IS_STRING( PtContainerWidget_t, title_font ) },
    { Pt_CB_CHILD_ADDED_REMOVED,Pt_CHANGE_INVISIBLE,NULL,
      Pt_ARG_IS_LINK(PtContainerWidget_t,child_added_removed ) },
};

Функции

container_modify_area()
Если area, pos или dim изменены, якоря контейнера аннулированы и разблокированы:
container->flags |= Pt_ANCHORS_INVALID;
container->flags &= ~Pt_ANCHORS_LOCKED; 

Бит Pt_ANCHORS_INVALID указывает, что виджет не может быть прикреплен, используя значения в члене смещений якоря, пока эти значения не будут повторно рассчитаны.

Бит Pt_ANCHORS_LOCKED указывает, что смещения якоря для контейнера имеют силу и не должны быть повторно рассчитаны из-за изменения, что толькочто произошло. Этот бит устанавливается, когда Pt_ARG_ANCHOR_OFFSETS установлен. Если Pt_ARG_ANCHOR_OFFSETS установлен, якоря утверждены и блокированы. Если Pt_ARG_RESIZE_FLAGS изменяется, якоря аннулированы, и виджет помечен для изменения размера:

widget->flags |= Pt_WIDGET_RESIZE;
container_modify()
static void container_modify( PtWidget_t *widget, 
                              PtArg_t *arg )
{
   PtContainerWidget_t *container =
       (PtContainerWidget_t *)widget;
   PhEvent_t event;

   memset( &event, 0, sizeof( event ) );
   switch( arg->type )
   {
      case Pt_ARG_FOCUS:
         // Если виджет уже имеет фокус или не является посредственным 
         // дочерним виджетом этого контейнера, не делаем ничего.

         if (( container->focus == 
               (PtWidget_t *)arg->value )
             || ( !arg->value )
             || (((PtWidget_t *)arg->value)->parent != 
                  widget))
               return;

         // иначе, даем фокус целевому виджету.
         PtContainerGiveFocus( (PtWidget_t *)arg->value, 
                               &event );
        if( container->focus && container->focus->flags & Pt_REALIZED )
            PtDamageWidget( container->focus );
   }
}
container_set_balloons()
Регистрирует/вычеркивает всплывающие подсказки с контейнером и инкрементирует/декрементирует bal контейнера

[Предыдущая] [Содержание] [Индекс] [Следующая]


Все мессаги сюда:yanich@inbox.ru
Hosted by uCoz