использование itemfactoryпосле рассмотрения сложного пути создания меню, рассмотрим как это же можно сделать при помощи вызова функции gtk_item_factory. itemfactory создаёт меню из массива записей itemfactory. это означает, что вы можете определить ваше меню в его самой простой форме и затем создать виджеты (меню/строки) меню с минимумом запросов функции. itemfactory записив ядре itemfactory находится itemfactoryentry. эта структура определяет один пункт меню и когда массив этих записей определен, целое меню сформировано. структура записей itemfactory выглядит так:
каждая строка определяет часть пункта меню. *path - определяет путь и название пункта меню, например: "/file/open" было бы именем пункта меню который подходит для записи itemfactory с путём "/file". однако пункт "/file/open" был бы показан в меню file как "open", потому что первые "/" используются для определения пути и не могут присутствовать в имени пункта. символ, которому предшествует символ подчеркивания, указывает акселератор (сокращенная клавиша) в открытом меню. *accelerator является строкой, которая указывает ключевую комбинацию клавиш и используется как ярлык к пункту меню. строка может состоять из единичного символа или комбинации модификаторов и символов. модификаторами клавиш могут быть:
callback - функция вызываемая при создании пунктом меню сигнала "activate". форма обратного вызова описана в разделе callback description. значение callback_action помещается в функцию обратного вызова. прототип функции смотрите в разделе callback description. item_type - является строкой, которая определяет тип виджета упакованного в контейнер пунктов меню. возможные значения: отметьте, что <lastbranch> полезен только для одного подменю строки меню. описание обратного вызова (callback description)обратный вызов для itemfactory entry может иметь две формы. если callback_action равен 0 (zero), он имеет следующую форму:
другая форма:
callback_data - является указателем на произвольную часть данных и установлен вызовом gtk_item_factory_create_items(). callback_action - некоторое значение callback_action в itemfactory записях. *widget - указатель на виджет пункта меню (подробности в manual menu creation). itemfactory entry examplesсоздаём простой пункт меню:
здесь создаётся простой пункт меню "/file/open" (отображается как "open"), внутри строки меню "/file". он имеет акселератор (shortcut) control+'o' при нажатии которого вызывается функция print_hello(). print_hello() имеет форму void print_hello(void) так как callback_action имеет значение zero. если 'o' в "open" подчеркнута, то при открытом меню и нажатой клавише 'o' пункт будет активизирован. заметьте, что "file/_open" может быть использован как путь вместо "/_file/_open". создание входа с более сложным обратным вызовом (callback):
это определяет новый пункт меню отображаемый как "display fps" в вышестоящем пункте меню "view". при нажатии вызывается функция print_state(). так как callback_action не равно zero print_state() имеет форму:
с callback_action равным 7. создаём установку кнопки выбора:
entry1 определяет одиночную кнопку выбора которая переключает вызов функции change_resolution() с параметром callback_action равным 1. change_resolution() имеет форму:
entry2 определяет кнопку выбора которая принадлежит группе в которой находится entry1. она вызывает туже самую функцию при переключении, но параметр callback_action равен 2. обратите внимание на отсутствие акселераторов. если бы потребовалась ещё одна кнопка выбора для переключения, то её можно было бы создать таким же образом в этой же группе с item_type равным "/view/low resolution". itemfactoryentry массивымассив записей для определения меню. ниже приведен пример объявления массива:
создание itemfactoryмассив gtkitemfactoryentry пунктов определяет меню. функция выглядит так:
container_type может иметь следующие значения:
container_type определяет тип нужного вам меню, например - всплывающее меню, панель меню или меню опций (как поле со списком но с выпавшим меню). path определяет путь к основному меню. в основном уникальное имя основного меню должно быть заключено в треугольные скобки "<>". это важно для обозначения акселераторов. оно должно быть уникальным и для каждого меню и для каждой программмы. например программма с именем 'foo', может иметь главное меню "<foomain>", а всплывающее меню "<fooimagepopup>", или нечто похожее. главное чтобы они были уникальны. accel_group указатель на gtk_accel_group. таблицы акселераторов устанавливаются в то время как генерируется меню. новая группа акселераторов создаётся функцией gtk_accel_group_new(). но это - только первый шаг. чтобы преобразовывать массив информации gtkitemfactoryentry в виджеты, используется следующая функция :
*ifactory - указатель на вышеупомянутое созданное производство пунктов. n_entries - является числом входов в массив gtkitemfactoryentry.. *entries - указатель на массив gtkitemfactoryentry. callback_data - является тем, что передают во все функции обратного вызова для всех входов с callback_action != 0. группа акселераторов создана, теперь нужно прикрепить меню к окну:
использование меню и его пунктовследующая функция извлекает виджеты из itemfactory:
например, если itemfactory имеет две записи "/file", и "/file/new", используя дорожку "/file" извлечётся виджет menu из itemfactory. используя путь "/file/new" извлечётся виджет menu item. это позволяет установить начальное состояние пунктов меню. например для установки по умолчанию кнопки выбора в путь "/shape/oval", код будет выглядеть так:
для извлечения основного меню используется функция gtk_item_factory_get_item() с путем "<main>" (в независимости от использованного пути в gtk_item_factory_new()). в случае itemfactory, создаваемого с типом gtk_type_menu_bar, возвращается виджет панели меню. если тип gtk_type_menu возвращается виджет меню. если тип gtk_type_option_menu возвращается виджет меню опций. помните: вход определенный путем "/_file" фактически путь "/file". теперь вы имеете строку меню или меню и можете манипулировать ими как обсуждалось в разделе manual menu creation.
|