diff options
Diffstat (limited to 'Master/tlpkg/TeXLive/Splashscreen.pm')
-rw-r--r-- | Master/tlpkg/TeXLive/Splashscreen.pm | 188 |
1 files changed, 188 insertions, 0 deletions
diff --git a/Master/tlpkg/TeXLive/Splashscreen.pm b/Master/tlpkg/TeXLive/Splashscreen.pm new file mode 100644 index 00000000000..b04802d772e --- /dev/null +++ b/Master/tlpkg/TeXLive/Splashscreen.pm @@ -0,0 +1,188 @@ +$TeXLive::Splashscreen::VERSION = '1.0'; + +package TeXLive::Splashscreen; + +use Tk qw/Ev/; +use Tk qw/:eventtypes/; +use TeXLive::waitVariableX; +use Tk::widgets qw/Toplevel/; +use base qw/Tk::Toplevel/; + +Construct Tk::Widget 'Splashscreen'; + +sub Populate { + my ($self, $args) = @_; + + $self->withdraw; + $self->overrideredirect(1); + + $self->SUPER::Populate($args); + + $self->{ofx} = 0; # X offset from top-left corner to cursor + $self->{ofy} = 0; # Y offset from top-left corner to cursor + $self->{tm0} = 0; # microseconds time widget was Shown + + $self->ConfigSpecs( + -milliseconds => [qw/PASSIVE milliseconds Milliseconds 0/], + ); + + $self->bind('<ButtonPress-3>' => [$self => 'b3prs', Ev('x'), Ev('y')]); + $self->bind('<ButtonRelease-3>' => [$self => 'b3rls', Ev('X'), Ev('Y')]); + +} # end Populate + +# Object methods. + +sub Destroy { + + + my ($self, $millis) = @_; + + $millis = $self->cget(-milliseconds) unless defined $millis; + my $t = Tk::timeofday; + $millis = $millis - ( ($t - $self->{tm0}) * 1000 ); + $millis = 0 if $millis < 0; + + my $destroy_splashscreen = sub { + $self->update; + $self->after(100); # ensure 100% of PB seen + $self->destroy; + }; + + do { &$destroy_splashscreen; return } if $millis == 0; + + while ( $self->DoOneEvent (DONT_WAIT | TIMER_EVENTS)) {} + + $self->waitVariableX( [$millis, $destroy_splashscreen] ); + +} # end Destroy + +sub Splash { + + my ($self, $millis) = @_; + + $millis = $self->cget(-milliseconds) unless defined $millis; + $self->{tm0} = Tk::timeofday; + $self->configure(-milliseconds => $millis); + $self->Popup; + +} # end_splash + +# Private methods. + +sub b3prs { + my ($self, $x, $y) = @_; + $self->{ofx} = $x; + $self->{ofy} = $y; +} # end b3prs + +sub b3rls { + my($self, $X, $Y) = @_; + $X -= $self->{ofx}; + $Y -= $self->{ofy}; + $self->geometry("+${X}+${Y}"); +} # end b3rls + +1; +__END__ + +=head1 NAME + +TeXLive::Splashscreen - display a Splashscreen during program initialization. + +=head1 SYNOPSIS + + $splash = $parent->Splashscreen(-opt => val, ... ); + +=head1 DESCRIPTION + +For programs that require large load times, it's a common practice to +display a Splashscreen that occupies the user's attention. This +Toplevel mega widget provides all the display, destroy and timing +events. All you do it create the Splashscreen mega widget, populate +it as you see fit, then invoke Splash() to display it and Destroy() to +tear it down. + +Important note: be sure to sprinkle update() calls throughout your +initialization code so that any Splashscreen events are handled. +Remember, the screen may be animated, or the user may be simply moving +the Splashscreen about. + +=head1 OPTIONS + +The following option/value pairs are supported: + +=over 4 + +=item B<-milliseconds> + +The minimum number of milliseconds the Splashscreen should remain on +the screen. Default is 0, which means that the Splashscreen is +destroyed as soon as Destroy() is called. Otherwise, Destroy() waits +for the specified time interval to elapse before destroying the +Splashscreen. + +=back + +=head1 METHODS + +=head2 $splash->Splash([B<milliseconds>]); + +If B<milliseconds> is specified, it's the minimum number of +milliseconds the Splashscreen should remain on the screen. +This value takes precedence over that specified on the +Splashscreen constructor call. + +=head2 $splash->Destroy([B<milliseconds>]); + +If B<milliseconds> is specified, it's the minimum number of +milliseconds the Splashscreen should remain on the screen. +This value takes precedence over that specified on the +Splash() call, which takes precedence over that specified +during Splashscreen construction. + +=head1 BINDINGS + +=head2 <ButtonPress-3> + +Notifies the Splashscreen to set a mark for an impending move. + +=head2 <ButtonRelease-3> + +Moves the Splashscreen from the mark to the cursor's current position. + +=head1 ADVERTISED WIDGETS + +Component subwidgets can be accessed via the B<Subwidget> method. +This mega widget has no advertised subwidgets. Instead, treat the +widget reference as a Toplevel and populate it as desired. + +=head1 EXAMPLE + + $splash = $mw->Splashscreen; + + ... populate the Splashscreen toplevel as desired ... + + $splash->Splash(4000); + + ... program initialization ... + + $splash->Destroy; + +=head1 AUTHOR + +Stephen.O.Lidie@Lehigh.EDU + +Copyright (C) 2001 - 2002, Steve Lidie. All rights reserved. + +This program is free software; you can redistribute it and/or +modify it under the same terms as Perl itself. + +This package is a literal copy of the Splashscreen.pm code only changing +the package name. + +=head1 KEYWORDS + +Splashscreen, Toplevel + +=cut |