Chromium界面分析小结(六)工具菜单结构


Chromium的菜单实现考虑到跨平台的要求,使用了一层抽象模型(SimpleMenuModel),所有菜单模型都继承自这个类,各平台实现时需要根据提供的模型构造对应的菜单。这个工具菜单模型是WrenchMenuModel类,也继承自SimpleMenuModelChromiumLinux平台使用了GTK+来创建界面,也就由MenuGtk类负责菜单模型的解释和构造。所有的菜单都要经过**MenuModelGtkMenuItem的过程,如果要添加或删除菜单项可以直接修改对应的MenuModel,再由MenuGtk类自动生成相应菜单。

       Chromium在菜单上添加了按钮,而GTK没有提供相应的控件,所以Chromium自己编写了一个自定义菜单项类,继承自GTK+的菜单项类。缩放菜单项的结构如下:



其中的全屏按钮是最复杂的一个按钮,因为其他所有按钮上只有一个label,而这个全屏按钮上添加了一个图标,而且这个图标还会根据不同的状态改变样式,难怪它这么复杂。这个按钮在构建模型时很正常,和其他按钮一样,只是多了个icon_idr,这是用来表示图标资源ID的,其他按钮都是默认的-1,而它是IDR_FULLSChromiumEEN_MENU_BUTTON。在MenuGtk类根据模型构建菜单时,才真正开始:

      MenuGtk::BuildSubmenuFromModel中构建菜单时,处理TYPE_BUTTON_ITEM类型的菜单项时调用了BuildButtonMenuItem函数,在BuildButtonMenuItem中如果从菜单项模型中获取到了有效的图片ID(现在就是IDR_FULLSChromiumEEN_MENU_BUTTON)就会调用SetupImageIcon函数为菜单项设置图标,而SetupImageIcon函数中只是给该菜单项连接了”show”信号由OnSubmenuShowButtonImage函数处理,也就是说当该菜单项需要显示时便会调用这个函数,在这个函数中才真正地调用GetIconSetForId获取图标资源,然后设置给了该菜单项。没完呢,在GetIconSetForId中有这么一条语句:”if (id == IDR_FULLSChromiumEEN_MENU_BUTTON)  return fullsChromiumeen_icon_set_; returnNULL;”这是巧合么!这个被返回的fullsChromiumeen_icon_set在函数GtkThemeService::RebuildMenuIconSets中被初始化,当然这个函数也只处理了这个一图标,Chromium这么麻烦的目的只有一个:让全屏按钮的行为看起来更像系统控件。因为带有标签的按钮在激活时背景高亮且文字反色,但是系统不会处理带有图像的按钮,Chromium就自己搞了。如果想在菜单中添加更多的图标按钮,可以跳过Chromium这么麻烦的处理过程直接添加图像到按钮上,这样就不会有那么像系统的行为了,也可以在GtkThemeService类中添加更多的GtkIconSet来达到Chromium这样的效果。

你可能感兴趣的:(Chromium界面分析小结(六)工具菜单结构)