sub
menbut {
my
(
$demo
) =
@_
;
$TOP
=
$MW
->WidgetDemo(
-name
=>
$demo
,
-text
=>
''
,
-title
=>
'Menubutton Demo'
,
-iconname
=>
'Menubutton'
,
);
my
@menubuttons
;
foreach
(
qw/below right left above/
) {
my
$pos
=
ucfirst
;
my
$menubutton
=
$TOP
->Menubutton(
qw/-underline 0 -relief raised/
,
-text
=>
$pos
,
-direction
=>
$_
);
push
@menubuttons
,
$menubutton
;
my
$menu
=
$menubutton
->menu(
qw/-tearoff 0/
);
$menubutton
->configure(
-menu
=>
$menu
);
$menubutton
->command(
-label
=>
"$pos menu: first item"
,
-command
=>
sub
{
print
"You selected the first item from the $pos menu.\n"
});
$menubutton
->command(
-label
=>
"$pos menu: second item"
,
-command
=>
sub
{
print
"You selected the second item from the $pos menu.\n"
});
}
$menubuttons
[0]->grid(
qw/-row 0 -column 1 -sticky n/
);
$menubuttons
[3]->grid(
qw/-row 2 -column 1 -sticky n/
);
$menubuttons
[1]->grid(
qw/-row 1 -column 0 -sticky w/
);
$menubuttons
[2]->grid(
qw/-row 1 -column 2 -sticky e/
);
my
$body
=
$TOP
->Frame;
$body
->grid(
qw/-row 1 -column 1 -sticky news/
);
$body
->Label(
qw/-wraplength 300 -justify left/
,
-font
=>
'Helvetica 14'
,
-text
=>
'This is a demonstration of menubuttons. The "Below" menubutton pops its menu below the button; the "Right" button pops to the right, etc. There are two option menus directly below this text; one is just a standard menu and the other is a 16-color palette.'
)->
pack
(
qw/-side top -padx 25
-pady 25/
);
$bbutt
=
$body
->Frame->
pack
(
qw/-padx 25 -pady 25/
);
$bbutt
->Optionmenu(
-options
=> [
qw/one two three/
])->
pack
(
qw/-side left
-padx 25 -pady 25/
);
my
$palette
;
my
(
@colors
) =
qw/Black red4 DarkGreen NavyBlue gray75 Red Green Blue
gray50 Yellow Cyan Magenta White Brown DarkSeaGreen DarkViolet/
;
my
$colors
= native_optionmenu(
$bbutt
,
\
$palette
,
[
sub
{
print
"args=@_.\n"
},
'First'
],
@colors
,
);
$colors
->
pack
(
qw/-side left -padx 25 -pady 25/
);
my
$menu
=
$colors
->cget(-menu);
my
$topborder
=
'gray50'
;
my
$bottomborder
=
'gray75'
;
foreach
my
$i
(0 ..
$#colors
) {
my
$color
=
$menu
->entrycget(
$i
, -label);
my
$p
=
$TOP
->Photo(
qw/-width 16 -height 16/
);
$p
->put(
$topborder
,
qw/-to 0 0 16 1/
);
$p
->put(
$topborder
,
qw/-to 0 1 1 16/
);
$p
->put(
$bottomborder
,
qw/-to 1 15 16 16/
);
$p
->put(
$bottomborder
,
qw/-to 15 1 16 15/
);
$p
->put(
$color
,
qw/-to 1 1 15 15/
);
my
$r
=
$TOP
->Photo(
qw/-width 16 -height 16/
);
$r
->put(
qw/black -to 0 0 16 2/
);
$r
->put(
qw/black -to 0 2 2 16/
);
$r
->put(
qw/black -to 2 14 16 16/
);
$r
->put(
qw/black -to 14 2 16 14/
);
$r
->put(
$color
,
qw/-to 2 2 14 14/
);
$menu
->entryconfigure(
$i
,
-columnbreak
=> 1)
unless
$i
% 4;
$menu
->entryconfigure(
$i
,
-image
=>
$p
,
-hidemargin
=> 1,
-selectimage
=>
$r
,
);
}
$menu
->configure(
-tearoff
=> 1);
}
sub
native_optionmenu {
my
(
$parent
,
$varref
,
$command
,
@optionvals
) =
@_
;
$$varref
=
$optionvals
[0];
my
$mb
=
$parent
->Menubutton(
-textvariable
=>
$varref
,
-indicatoron
=> 1,
-relief
=>
'raised'
,
-borderwidth
=> 2,
-highlightthickness
=> 2,
-anchor
=>
'c'
,
-direction
=>
'flush'
,
);
my
$menu
=
$mb
->Menu(
-tearoff
=> 0);
$mb
->configure(
-menu
=>
$menu
);
my
$callback
=
ref
(
$command
) =~ /CODE/ ? [
$command
] :
$command
;
foreach
(
@optionvals
) {
$menu
->radiobutton(
-label
=>
$_
,
-variable
=>
$varref
,
-command
=> [
@$callback
,
$_
],
);
}
$mb
;
}
1;