# Copyright (c) 2003-2005 Ruby-GNOME2 Project Team # This program is licenced under the same licence as Ruby-GNOME2. # # $Id: menus.rb,v 1.4 2005/02/12 23:02:43 kzys Exp $ =begin = Menus There are several widgets involved in displaying menus. The Gtk::MenuBar widget is a horizontal menu bar, which normally appears at the top of an application. The Gtk::Menu widget is the actual menu that pops up. Both Gtk::MenuBar and Gtk::Menu are subclasses of Gtk::MenuShell; a Gtk::MenuShell contains menu items (Gtk::MenuItem). Each menu item contains text and/or images and can be selected by the user. There are several kinds of menu item, including plain Gtk::MenuItem, Gtk::CheckMenuItem which can be checked/unchecked, Gtk::RadioMenuItem which is a check menu item that's in a mutually exclusive group, Gtk::SeparatorMenuItem which is a separator bar, Gtk::TearoffMenuItem which allows a Gtk::Menu to be torn off, and Gtk::ImageMenuItem which can place a Gtk::Image or other widget next to the menu text. A Gtk::MenuItem can have a submenu, which is simply a Gtk::Menu to pop up when the menu item is selected. Typically, all menu items in a menu bar have submenus. The Gtk::OptionMenu widget is a button that pops up a Gtk::Menu when clicked. It's used inside dialogs and such. Gtk::ItemFactory provides a higher-level interface for creating menu bars and menus; while you can construct menus manually, most people don't do that. There's a separate demo for Gtk::ItemFactory. =end require 'common' module Demo class Menus < BasicWindow def initialize super('menus') self.border_width = 0 accel_group = Gtk::AccelGroup.new add_accel_group(accel_group) box1 = Gtk::VBox.new(false, 0) add(box1) menubar = Gtk::MenuBar.new box1.pack_start(menubar, :expand => false, :fill => true, :padding => 0) menu = create_menu(2, true) menuitem = Gtk::MenuItem.new("test\nline2") menuitem.submenu = menu menubar.append(menuitem) menuitem.show menuitem = Gtk::MenuItem.new('foo') menuitem.submenu = create_menu(3, true) menubar.append(menuitem) menuitem.show menuitem = Gtk::MenuItem.new('bar') menuitem.submenu = create_menu(4, true) menuitem.right_justified = true menubar.append(menuitem) menuitem.show box2 = Gtk::VBox.new(false, 10) box2.border_width = 10 box1.pack_start(box2, :expand => true, :fill => true, :padding => 0) box2.show menu = create_menu(1, false) # menu.accel_group = accel_group menuitem = Gtk::SeparatorMenuItem.new menu.append(menuitem) menuitem.show menuitem = Gtk::CheckMenuItem.new('Accelerate Me') menu.append(menuitem) menuitem.show menuitem.add_accelerator('activate', accel_group, Gdk::Keyval::GDK_F1, 0, Gtk::ACCEL_VISIBLE) menuitem = Gtk::CheckMenuItem.new('Accelerator Locked') menu.append(menuitem) menuitem.show menuitem.add_accelerator('activate', accel_group, Gdk::Keyval::GDK_F2, 0, Gtk::ACCEL_VISIBLE | Gtk::ACCEL_LOCKED) menuitem = Gtk::CheckMenuItem.new('Accelerators Frozen') menu.append(menuitem) menuitem.show menuitem.add_accelerator('activate', accel_group, Gdk::Keyval::GDK_F2, 0, Gtk::ACCEL_VISIBLE) menuitem.add_accelerator('activate', accel_group, Gdk::Keyval::GDK_F3, 0, Gtk::ACCEL_VISIBLE) optionmenu = Gtk::OptionMenu.new optionmenu.menu = menu optionmenu.history = 3 box2.pack_start(optionmenu, :expand => true, :fill => true, :padding => 0) optionmenu.show separator = Gtk::HSeparator.new box1.pack_start(separator, :expand => false, :fill => true, :padding => 0) separator.show box2 = Gtk::VBox.new(false, 10) box2.border_width = 10 box1.pack_start(box2, :expand => false, :fill => true, :padding => 0) box2.show button = Gtk::Button.new('close') button.signal_connect('clicked') do quit end box2.pack_start(button, :expand => true, :fill => true, :padding => 0) button.flags = Gtk::Widget::CAN_DEFAULT button.grab_default button.show end def create_menu (depth, tearoff) if depth < 1 return nil end menu = Gtk::Menu.new group = nil if tearoff menuitem = Gtk::TearoffMenuItem.new menu.append(menuitem) menuitem.show end 5.times do |i| buf = sprintf('item %2d - %d', depth, i + 1) menuitem = Gtk::RadioMenuItem.new(buf) group = menuitem.group menu.append(menuitem) menuitem.show if i == 3 menuitem.sensitive = false end if submenu = create_menu(depth - 1, true) menuitem.submenu = submenu end end menu.show return menu end end end