类
GioMenuModel
自 2.32 版以来
描述 [src]
abstract class Gio.MenuModel : GObject.Object
{
priv: GMenuModelPrivate*
}
GMenuModel
表示菜单的内容——一个有顺序的菜单项列表。项目与动作相关联,可以通过它们激活动作。项目可以分组成节,并且可能具有与它们相关联的子菜单。项目和节通常都有一些表示数据,如标签或图标。关联动作的类型(即它是否为具有状态的,以及它具有什么类型的状态)可以影响项目的表示。
GMenuModel
中菜单的概念模型是层级的:节和子菜单再次由 GMenuModel
表示。菜单本身不定义自己的角色。相反,特定的 GMenuModel
的角色由引用它的项目定义(或者在“root”菜单的情况下,由它被使用的上下文定义)。
以此为例,考虑此菜管的可见部分:
一个示例菜单
尽管这种深层嵌套的菜单类型目前不再被认为是好的 UI 实践,但它很好地说明了 GMenuModel
中的概念。在屏幕截图中有8个“菜单”可见:一个菜单栏,两个子菜单和5个节
- 根级别的菜单栏(包含4个项目)
- 查看 子菜单(包含3个节)
- 查看 子菜单的第一个节(包含2个项目)
- 查看 子菜单的第二个节(包含1个项目)
- 查看 子菜单的最后一个节(包含1个项目)
- 突出显示模式 子菜单(包含2个节)
- 来源 节(包含2个项目)
- 标记 节(包含2个项目)
以下 示例 展示了这8个菜单之间的概念关联。图中的每个大块表示一个菜单,大块内部的小块表示该菜单中的项目。一些项目包含对其他菜单的引用。
菜单示例
注意,在 示例 中可见的分隔符在 菜单模型 中不存在。这是因为在菜单模型中没有显式表示分隔符。相反,在菜单的任何两个非空节之间插入一个分隔符。节项目可以像任何其他项目一样有标签。在这种情况下,显示系统可能显示节标题而不是分隔符。
这种应用控制抽象模型的动力在于现代用户界面倾向于将控制功能放在应用之外。例如,全局菜单、Jump lists、仪表板等。为了支持这些使用,需要“导出”关于动作及其在菜单中表现的信息,这正是动作组导出器和菜单模型导出器为GActionGroup
和GMenuModel
执行的操作。利用这些导出信息的客户端对应版本是GDBusActionGroup
和GDBusMenuModel
。
GMenuModel
的API非常通用,具有关于项目属性和链接的迭代器,请参阅g_menu_model_iterate_item_attributes()
和g_menu_model_iterate_item_links()
。‘标准’属性和链接类型有预定义名称:G_MENU_ATTRIBUTE_LABEL
、G_MENU_ATTRIBUTE_ACTION
、G_MENU_ATTRIBUTE_TARGET
、G_MENU_LINK_SECTION
和G_MENU_LINK_SUBMENU
。
GMenuModel
中的项目如果引用可以在被用户与菜单项交互时激活的动作,则表示活动控制。动作引用通过G_MENU_ATTRIBUTE_ACTION
属性中的字符串ID
进行编码。动作ID
唯一标识动作组中的动作。哪个动作组提供动作则取决于菜单模型使用的上下文。例如,当模型作为GtkApplication
的应用程序菜单导出时,动作可能是全局的或窗口特定的(从而来自两个不同的动作组)。按照惯例,全局动作的名称以app.
开头,而窗口特定动作的名称以win.
开头。
虽然可能有许多状态有效的动作,但以下是最希望所有使用导出菜单信息的用户支持的最低要求:- 无参数类型和无状态的动作- 无参数类型和布尔状态的动作- 字符串参数类型和字符串状态的动作
无状态动作
无状态动作通常对应于普通菜单项。
选择这样的菜单项将激活该动作(无参数)。
布尔状态
具有布尔状态的动作最常与“切换”或“开关”菜单项一起使用。状态可以直接设置,但激活动作(无参数)将导致状态切换。
选择切换菜单项将激活动作。当状态为真时,菜单项应呈现为“选中”。
字符串参数和状态
具有字符串参数和状态的动作用于表示一组单选菜单项中可用的枚举选项。使用字符串参数激活动作相当于将该参数设置为状态。
除了与动作关联之外,单选菜单项还将有一个目标值。选择该菜单项将激活动作,其参数为目标值。当动作的状态等于菜单项的目标值时,菜单项应呈现为“选中”。
自:2.32
实例方法
g_menu_model_iterate_item_attributes
在 model
中位置为 item_index
的项目的属性上创建一个 GMenuAttributeIter
以进行迭代。
自 2.32 版以来
信号
从 GObject 继承的信号(1)
GObject::notify
当对象的一个属性在其值通过 g_object_set_property(), g_object_set() 等 set 时发出。
类结构
struct GioMenuModelClass {
GObjectClass parent_class;
gboolean (* is_mutable) (
GMenuModel* model
);
gint (* get_n_items) (
GMenuModel* model
);
void (* get_item_attributes) (
GMenuModel* model,
gint item_index,
GHashTable** attributes
);
GMenuAttributeIter* (* iterate_item_attributes) (
GMenuModel* model,
gint item_index
);
GVariant* (* get_item_attribute_value) (
GMenuModel* model,
gint item_index,
const gchar* attribute,
const GVariantType* expected_type
);
void (* get_item_links) (
GMenuModel* model,
gint item_index,
GHashTable** links
);
GMenuLinkIter* (* iterate_item_links) (
GMenuModel* model,
gint item_index
);
GMenuModel* (* get_item_link) (
GMenuModel* model,
gint item_index,
const gchar* link
);
}
无可用描述。
类成员
parent_class: GObjectClass
无可用描述。
is_mutable: gboolean (* is_mutable) ( GMenuModel* model )
无可用描述。
get_n_items: gint (* get_n_items) ( GMenuModel* model )
无可用描述。
get_item_attributes: void (* get_item_attributes) ( GMenuModel* model, gint item_index, GHashTable** attributes )
无可用描述。
iterate_item_attributes: GMenuAttributeIter* (* iterate_item_attributes) ( GMenuModel* model, gint item_index )
无可用描述。
get_item_attribute_value: GVariant* (* get_item_attribute_value) ( GMenuModel* model, gint item_index, const gchar* attribute, const GVariantType* expected_type )
无可用描述。
get_item_links: void (* get_item_links) ( GMenuModel* model, gint item_index, GHashTable** links )
无可用描述。
iterate_item_links: GMenuLinkIter* (* iterate_item_links) ( GMenuModel* model, gint item_index )
无可用描述。
get_item_link: GMenuModel* (* get_item_link) ( GMenuModel* model, gint item_index, const gchar* link )
无可用描述。
虚函数
Gio.MenuModelClass.iterate_item_attributes
在 model
中位置为 item_index
的项目的属性上创建一个 GMenuAttributeIter
以进行迭代。
自 2.32 版以来
Gio.MenuModelClass.iterate_item_links
在 model
中位置为 item_index
的项目的链接上创建一个 GMenuLinkIter
以进行迭代。
自 2.32 版以来