The Perl Toolchain Summit 2025 Needs You: You can help 🙏 Learn more

# POD after __END__
# $Id: FireButton.pm,v 1.5 2003/10/22 21:33:11 eserte Exp $
use Tk 402.002 (); # for DefineBitmap
use strict;
use vars qw(@ISA $VERSION);
@ISA = qw(Tk::Derived Tk::Button);
$VERSION = sprintf("%d.%02d", q$Revision: 1.5 $ =~ /(\d+)\.(\d+)/);
Construct Tk::Widget 'FireButton';
use vars qw($DECBITMAP $INCBITMAP $HORIZDECBITMAP $HORIZINCBITMAP);
$INCBITMAP = __PACKAGE__ . "::inc";
$DECBITMAP = __PACKAGE__ . "::dec";
$HORIZINCBITMAP = __PACKAGE__ . "::horizinc";
$HORIZDECBITMAP = __PACKAGE__ . "::horizdec";
my $def_bitmaps = 0;
sub ClassInit {
my($class,$mw) = @_;
unless($def_bitmaps) {
my $bits = pack("b8"x5, "........",
"...11...",
"..1111..",
".111111.",
"........");
$mw->DefineBitmap($INCBITMAP => 8,5, $bits);
# And of course, decrement is the reverse of increment :-)
$mw->DefineBitmap($DECBITMAP => 8,5, scalar reverse $bits);
my @rot_bits = (".....",
".1...",
".11..",
".111.",
".111.",
".11..",
".1...",
".....");
my $rot_bits = pack("b5"x8, @rot_bits);
my $mirrored_rot_bits = pack("b5"x8, map { scalar reverse } @rot_bits);
$mw->DefineBitmap($HORIZINCBITMAP => 5,8, $rot_bits);
$mw->DefineBitmap($HORIZDECBITMAP => 5,8, $mirrored_rot_bits);
$def_bitmaps = 1;
}
$class->SUPER::ClassInit($mw);
}
sub butDown {
my $b = shift;
my $fire = shift || 'initial';
if ($fire eq 'initial') {
# XXX why isn't relief saving done the Tk::Button as
#soon as callback is invoked?
$b->{tk_firebutton_save_relief} = $b->cget('-relief');
$b->RepeatId($b->after( $b->cget('-repeatdelay'),
[\&butDown, $b, 'again'])
);
} else {
$b->invoke;
$b->RepeatId($b->after( $b->cget('-repeatinterval'),
[\&butDown, $b, 'again'])
);
}
$b->SUPER::butDown;
}
sub butUp {
my $b = shift;
$b->CancelRepeat;
$b->SUPER::butUp;
$b->configure(-relief=>$b->{tk_firebutton_save_relief})
if $b->{tk_firebutton_save_relief};
}
sub Populate {
my($b,$args) = @_;
$b->SUPER::Populate($args);
$b->ConfigSpecs(
# Override button fallbacks
-padx => [qw(SELF padX Pad 0)],
-pady => [qw(SELF padY Pad 0)],
# new options
-repeatdelay => [qw(PASSIVE repeatDelay RepeatDelay 300)],
-repeatinterval => [qw(PASSIVE repeatInterval RepeatInterval 100)],
);
$b;
}
sub INCBITMAP { $INCBITMAP }
sub HORIZINCBITMAP { $HORIZINCBITMAP }
sub DECBITMAP { $DECBITMAP }
sub HORIZDECBITMAP { $HORIZDECBITMAP }
1;
__END__
=head1 NAME
Tk::FireButton - Button that keeps invoking callback when pressed
=head1 SYNOPSIS
use Tk::FireButton;
$fire = $parent->FireButton( ... );
# May/should change:
$w->Whatever(... -bitmap => $Tk::FireButton::INCBITMAP, ...);
$w->Whatever(... -bitmap => $Tk::FireButton::DECBITMAP, ...);
$w->Whatever(... -bitmap => $Tk::FireButton::HORIZINCBITMAP, ...);
$w->Whatever(... -bitmap => $Tk::FireButton::HORIZDECBITMAP, ...);
=head1 DESCRIPTION
B<FireButton> is-a B<Button> widget (see L<Tk::Button>) that
keeps invoking the callback bound to it as long as the <FireButton>
is pressed.
Four suitable bitmaps are predefined in this package: $INCBITMAP and
$DECBITMAP for vertical increment and decrement buttons, and
$HORIZINCBITMAP and $HORIZDECBITMAP for horizontal increment and
decrement buttons. See below for methods accessing these bitmaps.
=head1 SUPER-CLASS
The B<FireButton> widget-class is derived from the B<Button>
widget-class and inherits all the methods and options its
super-class (see L<Tk::Button>).
=head1 STANDARD OPTIONS
B<FireButton> supports all the standard options of a B<Button> widget.
See L<Tk::options> for details on the standard options.
=head1 WIDGET-SPECIFIC OPTIONS
=over 4
=item Name: B<repeatDelay>
=item Class: B<RepeatDelay>
=item Switch: B<-repeatdelay>
=item Fallback: B<300> (milliseconds)
Specifies the amount of time before the callback is first invoked after
the Button-1 is pressed over the widget.
=item Name: B<repeatInterval>
=item Class: B<RepeatInterval>
=item Switch: B<-repeatinterval>
=item Fallback: B<100> (milliseconds)
Specifies the amount of time between invokations of the
callback bound to the widget with the C<command> option.
=back
=head1 CHANDED OPTION FALLBACK VALUES
The fallback values of the following options as different
from the B<Button> widget:
-padx => 0,
-pady => 0,
=head1 METHODS
Same as for L<Button|Tk::Button> widget.
Additionally, there are four methods returning the names of the
standard increment and decrement bitmaps: INCBITMAP, HORIZINCBITMAP,
DECBITMAP, and HORIZDECBITMAP.
Subclasses of FireButton may override these methods to supply
different increment and decrement bitmaps.
=head1 ADVERTISED WIDGETS
None.
=head1 HISTORY
The code was extracted from Tk::NumEntry and slightly modified
by Achim Bohnet E<gt>ach@mpe.mpg.deE<gt>. Tk::NumEntry's author
is Graham Barr E<gt>gbarr@pobox.comE<gt>. The current maintainer is
Slaven Rezic E<gt>slaven@rezic.deE<gt>.
=cut