/usr/local/CPAN/PPresenter/PPresenter/Viewport/SlideButtonBar.pm


# Copyright (C) 2000-2002, Free Software Foundation FSF.

package PPresenter::Viewport::SlideButtonBar;

use strict;
use Tk;
use Tk::Balloon;

sub getBar() { $_[0]->{control} }

sub new($$$)
{   my ($class, $show, $viewport) = @_;

    my $control = $viewport->screen->Frame
        ( -height     => 12
        , -background => 'black'
        , -foreground => 'yellow'
        , -borderwidth=> 3
        );

    my $self = bless
    { control    => $control
    , off_color  => $viewport->{-progressBackground}
    , on_color   => $viewport->{-slideButtonBackground}
    , show       => $show
    }, $class;

    my $totaltime = $show->{-totaltime};

    my $when  = 0;
    my $count = 0;

    foreach my $slide ($show->slides)
    {   my $info   = "Undefined";
        my $button = $self->make_button($control
            , [ \&select_slide, $self, $count++ ]
            , \$info
            );
        push @{$self->{buttons}}, [ $slide, $button, \$info, 0 ];
    }

    $self;
}

sub reconstruct()
{   my $self = shift;

    my $control = $self->{control};

    # Remove all buttons, displayed so far.
    my @buttons = $control->placeSlaves();
    @buttons && map {$_->placeForget()} @buttons;

    my $when            = 0;
    my $buttonheight    = $control->cget(-height)-4;

    my $sumtime = 0;
    foreach (@{$self->{buttons}})
    {   my $slide = $_->[0];
        $sumtime += $slide->requiredTime if $slide->isActive;
    }

    foreach (@{$self->{buttons}})
    {   my ($slide, $button, $info, $old_when) = @$_;

        my $reqtime = $slide->requiredTime;
        $_->[3] = ($when+$reqtime)/$sumtime;
        next unless $slide->isActive;

        $button->place
           ( -relx    => $when/$sumtime
           , -relwidth=> $reqtime/$sumtime
           , '-y'     => 0
           , -height  => $buttonheight
           );

        $$info  = $self->make_info($slide, $when);
        $when  += $reqtime;
    }

    $self;
}

sub endOfSlide()
{   my $self = shift;
    return 0 unless defined $self->{displayed};
    my ($slide,$button,$info,$when) = @{$self->{buttons}[$self->{displayed}]};
    $when;
}

sub select_slide($)
{   my ($self, $slide) = @_;
    $self->{show}->showSlide($slide);
}

sub update($)
{   my ($self, $next) = @_;

    $self->{buttons}[$self->{displayed}][1]->configure
        (-background => $self->{off_color})
            if defined $self->{displayed};

    my $number = $next->{number};

    $self->{buttons}[$number][1]->configure
        (-background => $self->{on_color});

    $self->{displayed} = $number;
    $self;
}

#
# Button for one slide.
#

sub make_button($$$;)
{   my ($self, $w, $command, $info) = @_;

    my $button = $w->Button
        ( -text       => ''
        , -relief     => 'sunken'
        , -background => $self->{off_color}
        , -command    => $command
        , -height     => 4
        );

    $button->Balloon(-balloonposition => 'mouse')
           ->attach($button, -msg => $info);

    return $button;
}

sub make_info($;)
{   my ($self, $slide, $when) = @_;

    my ($title, $time) = ($slide->title, $slide->requiredTime);
    return <<INFO;
slide\t$title ($slide->{number})
time\t$time
start\t$when
INFO
}

1;