#!/usr/bin/perl -w # # Item Factory # # The GtkItemFactory object allows the easy creation of menus # from an array of descriptions of menu items. # package item_factory; use Glib qw(TRUE FALSE); use Gtk2; sub gtk_ifactory_cb { my ($data, $action, $widget) = @_; #use Data::Dumper; #print "gtk_ifactory_cb: ".Dumper(\@_); warn "ItemFactory: activated \"" . Gtk2::ItemFactory->path_from_widget ($widget) . "\"\n"; } my @menu_items = ( [ "/_File", undef, undef, 0, "<Branch>" ], [ "/File/tearoff1", undef, \>k_ifactory_cb, 0, "<Tearoff>" ], [ "/File/_New", "<control>N", \>k_ifactory_cb, 1 ], [ "/File/_Open", "<control>O", \>k_ifactory_cb, 2 ], [ "/File/_Save", "<control>S", \>k_ifactory_cb, 3 ], [ "/File/Save _As...", undef, \>k_ifactory_cb, 4 ], [ "/File/sep1", undef, \>k_ifactory_cb, 0, "<Separator>" ], [ "/File/_Quit", "<control>Q", \>k_ifactory_cb, 0 ], [ "/_Preferences", undef, undef, 0, "<Branch>" ], [ "/_Preferences/_Color", undef, undef, 0, "<Branch>" ], [ "/_Preferences/Color/_Red", undef, \>k_ifactory_cb, 0, "<RadioItem>" ], [ "/_Preferences/Color/_Green", undef, \>k_ifactory_cb, 0, "/Preferences/Color/Red" ], [ "/_Preferences/Color/_Blue", undef, \>k_ifactory_cb, 0, "/Preferences/Color/Red" ], [ "/_Preferences/_Shape", undef, undef, 0, "<Branch>" ], [ "/_Preferences/Shape/_Square", undef, \>k_ifactory_cb, 0, "<RadioItem>" ], [ "/_Preferences/Shape/_Rectangle", undef, \>k_ifactory_cb, 0, "/Preferences/Shape/Square" ], [ "/_Preferences/Shape/_Oval", undef, \>k_ifactory_cb, 0, "/Preferences/Shape/Rectangle" ], [ "/_Help", undef, undef, 0, "<LastBranch>" ], [ "/Help/_About", undef, \>k_ifactory_cb, 0 ], ); my $window = undef; sub do { if (!$window) { $window = Gtk2::Window->new; $window->signal_connect (destroy => sub { $window = undef; 1 }); $window->signal_connect (delete_event => sub { $window->destroy; 1 }); my $accel_group = Gtk2::AccelGroup->new; my $item_factory = Gtk2::ItemFactory->new ('Gtk2::MenuBar', '<main>', $accel_group); $window->{"<main>"} = $item_factory; $window->add_accel_group ($accel_group); $window->set_title ("Item Factory"); $window->set_border_width (0); ### $item_factory->create_items (nmenu_items, menu_items, NULL); $item_factory->create_items (undef, @menu_items); # preselect /Preferences/Shape/Oval over the other radios $item_factory->get_item ("/Preferences/Shape/Oval")->set_active (TRUE); my $box1 = Gtk2::VBox->new (FALSE, 0); $window->add ($box1); $box1->pack_start ($item_factory->get_widget ("<main>"), FALSE, FALSE, 0); my $label = Gtk2::Label->new ("Type\n<alt>\nto start"); $label->set_size_request (200, 200); $label->set_alignment (0.5, 0.5); $box1->pack_start ($label, TRUE, TRUE, 0); my $separator = Gtk2::HSeparator->new; $box1->pack_start ($separator, FALSE, TRUE, 0); my $box2 = Gtk2::VBox->new (FALSE, 10); $box2->set_border_width (10); $box1->pack_start ($box2, FALSE, TRUE, 0); my $button = Gtk2::Button->new ("close"); $button->signal_connect (clicked => sub {$window->destroy; 1}); $box2->pack_start ($button, TRUE, TRUE, 0); $button->set_flags ('can-default'); $button->grab_default; $window->show_all; } else { $window->destroy; $window = undef; } return $window; } 1; __END__ Copyright (C) 2003 by the gtk2-perl team (see the file AUTHORS for the full list) This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307 USA.