NAME
Tk::MenuHash - Ties a Tk::Menubutton widget to a hash object thingy
SYNOPSIS
use Tk::MenuHash;
my $MB = new Tk::MenuHash ($Menubutton);
my $MB = new Tk::MenuHash (
$MW->Menubutton (
-relief => 'raised',
-text => 'Pick something',
-underline => 0,
)->pack (
-side => 'left',
)
);
$MB->{'Some list item label'} = [ \&CommandFunction, 'args' ];
$MB->{'Some other label'} = \&CommandFunction;
$MB->{'Some lable name'} = 'default';
delete $MB->{'Some other label'};
$MB->configure ( -text => 'Pick something else' );
my $menuText = $MB->{"Anything, it doesn't matter"};
##############################################################
## Or you can do it this way, but it needs two vars so I don't
## recommend it...
tie my %MB, 'Tk::MenuHash', $Menubutton;
## Or...
tie my %MB, 'Tk::MenuHash', $MW->Menubutton (
-relief => 'raised',
-text => 'Pick something',
-underline => 0,
)->pack (
-side => 'left',
);
$MB{'Some list item label'} = [ \&CommandFunction, 'args' ];
$MB{'Some other label'} = \&CommandFunction;
$MB{'Some lable name'} = 'default';
delete $MB{'Some other label'};
$Menubutton->configure ( -text => 'Pick something else' );
my $menuText = $MB{"Anything, it doesn't matter"};
DESCRIPTION
Creates a tied Tk::Menubutton widget hash reference object kinda thingy....
It's actually much simplier then it sounds, at least to use. It walks and talks half like an object, and half like a (tied) hash reference. This is because it's both in one (it's a blessed reference to a tied hash of the same class).
When you add a key (label) to the hash it added it to the menubutton. The value assigned must be either a valid Tk::Menubutton -command option, or the string 'default' (case is not important). The default is simply a function that configure()s the Menubuttons -text to that of the selected label. You can then retrieve the text by just reading a key (any key, even if it doesn't exist, it doesn't matter) from the hash.
The new() method passes back a reference to a tie()d MenuHash, but with all the properties (and methods) of the Menubutton you passed it. With this type you can set and delete fields as hash keys references:
$MenuHash->{'Some label'} = 'default';
But also call Tk::Menubutton (or sub-classes of it, if that's what you passed the constructor) methods:
$MenuHash->configure ( -text => 'Pick something' );
This involves black magic to do, but it works. See the AUTOLOAD method code if you have a morbid interest in this, however it's more that we are dealing with 3 objects in 2 classes.
I prefer this useage myself as it meens I only need to carry around one var that walks and talks almost exactly like a "real" Tk::Menubutton (that is, you can call any valid Tk::Menubutton method off it directly), but with the added (and much needed IMHO) feature of being able to easily add, delete, select, and read menu options as simple hash ref keys.
EXAMPLE
use Tk;
use Tk::MenuHash;
my $MW = new MainWindow;
my $menu = new Tk::MenuHash ($MW->Menubutton (
-relief => 'raised',
-text => 'Pick something',
-underline => 0,
)->pack (
-side => 'left',
));
$menu->{'Option one (default)'} = 'default';
$menu->{'Option two (print "two")'} = sub { print "two\n" };
$menu->{'Option three (exit)'} = sub { $MW->destroy };
$menu->{'Option four (print current text)'} = sub { print "$menu->{foobar}\n" };
MainLoop;
HISTORY
$Log: MenuHash.pm,v $
Revision 1.11 1998/05/05 16:20:04 byron
-Changed name to Tk::MenuHash
Revision 1.10 1998/04/16 02:08:46 byron
-Doc changes
Revision 1.4 1997/12/24 00:39:59 byron
-Made the 'default' string case independant
-Modified docs
Revision 1.3 1997/12/24 00:28:28 byron
-Fixed class name bug
-Fixed DESTROY autoload problem
Revision 1.2 1997/11/22 01:06:45 byron
-Added new() constuctor, and ability to call widget methods off the tied()
value reference.
AUTHOR
Zenin <zenin@best.com>
aka Byron Brummer <byron@omix.com>
COPYRIGHT
Copyright (c) 1998 OMIX, Inc.
Available for use under the same terms as perl.