package GCSplash;
###################################################
#
# Copyright 2005-2010 Christian Jodar
#
# This file is part of GCstar.
#
# GCstar is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# GCstar is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with GCstar; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
#
###################################################
use strict;
use Gtk2;
{
package GCSplashWindow;
use GCUtils;
use base "Gtk2::Window";
sub new
{
my $proto = shift;
my $class = ref($proto) || $proto;
my $self = $class->SUPER::new();
bless ($self, $class);
$self->{parent} = shift;
$self->{version} = shift;
$self->{splashImage} = $self->{parent}->{logosDir}.'splash.png';
$self->set_decorated(0);
$self->set_resizable(0);
$self->set_transient_for($self->{parent});
$self->set_destroy_with_parent(1);
$self->set_modal(1);
$self->set_skip_taskbar_hint(1);
#$self->set_position('center-always');
$self->set_keep_above(1);
$self->{title} = new Gtk2::Label;
$self->{title}->set_markup('GCstar');
$self->{label} = new Gtk2::Label('test');
$self->{vbox} = new Gtk2::VBox(0,0);
$self->{progress} = new Gtk2::ProgressBar;
$self->{progress}->set_size_request(240,-1);
my $color_fg = Gtk2::Gdk::Color->parse('#1c86ee');
my $color_progress_bg = Gtk2::Gdk::Color->parse('#ffffff');
my $color_progress_fg = Gtk2::Gdk::Color->parse('#1c86ee');
my $color_progress_text = Gtk2::Gdk::Color->parse('#cdad00');
$self->{label}->modify_fg('normal', $color_fg);
$self->{progress}->modify_bg('normal', $color_progress_bg);
$self->{progress}->modify_bg('active', $color_progress_fg);
$self->{progress}->modify_bg('prelight', $color_progress_fg);
my $eventbox = Gtk2::EventBox->new();
my $img = Gtk2::Image->new_from_pixmap (undef, undef);
my $inbox = new Gtk2::Fixed;
$eventbox->add($inbox);
$inbox->put($img,0,0);
$inbox->put($self->{title},0,110);
$inbox->put($self->{label},0,145);
$inbox->put($self->{progress},30,170);
$self->{vbox}->pack_start($eventbox,0,0,0);
$self->add($self->{vbox});
my $drawing_area = Gtk2::DrawingArea->new;
$self->{vbox}->pack_start($drawing_area,0,0,0);
$drawing_area->realize;
my ($pango_w, $pango_h) = (300,200);
my $pixmap = Gtk2::Gdk::Pixmap->new ($drawing_area->window,
$pango_w,
$pango_h,
-1);
my $pixbuf = Gtk2::Gdk::Pixbuf->new_from_file($self->{splashImage});
my ($pm, $m) = $pixbuf->render_pixmap_and_mask(255);
$img->set_from_pixmap($pm, $m);
$self->shape_combine_mask ($m, 0, 0) if $m;
$self->set_position('center');
$self->{vbox}->show_all;
$self->show;
$self->{title}->set_size_request(300,-1);
$self->{label}->set_size_request(300,-1);
return $self;
}
sub init
{
my $self = shift;
if ($self->{phase} == 0)
{
$self->setLabel($self->{parent}->{lang}->{SplashInit});
$self->{phase} = 1;
}
elsif ($self->{phase} == 1)
{
$self->setProgress(0.0);
$self->{parent}->init($self);
$self->setProgress(0.1);
$self->{phase} = 2;
$self->setLabel($self->{parent}->{lang}->{SplashLoad});
}
elsif ($self->{phase} == 2)
{
$self->{parent}->loadPrevious($self);
$self->setProgress(0.7);
# $self->{parent}->setSensitive(1);
$self->{phase} = 3;
$self->setLabel($self->{parent}->{lang}->{SplashSort});
}
elsif ($self->{phase} == 3)
{
$self->{parent}->initEnd;
$self->setProgress(1.0);
$self->{parent}->setSensitive(1);
$self->{phase} = 4;
$self->setLabel($self->{parent}->{lang}->{SplashDone});
}
else
{
$self->hide;
$self->{parent}->{initializing} = 0;
Glib::Timeout->add(700 ,\&destroyMe, $self);
return 0;
}
Glib::Timeout->add(100 ,\&init, $self);
return 0;
}
sub setLabel
{
my ($self, $text) = @_;
#$text =~ s|^(.)|$1|;
$self->{label}->set_markup(''.$text.'');
}
sub setItemsTotal
{
my ($self, $total) = @_;
$self->{step} = GCUtils::round($total / 7);
$self->{step} = 1 if $self->{step} < 1;
$self->{total} = $total;
}
sub setProgressForItemsLoad
{
my ($self, $current) = @_;
if (! $self->{total})
{
$self->{progress}->set_fraction(0.2);
}
else
{
return if ($current % $self->{step});
$self->setLabel($self->{parent}->{lang}->{SplashLoad}." ($current/".$self->{total}.')');
$self->{progress}->set_fraction(0.1 + (($current / $self->{total}) * 0.3));
}
GCUtils::updateUI;
}
sub setProgressForItemsDisplay
{
my ($self, $current) = @_;
if (! $self->{total})
{
$self->{progress}->set_fraction(0.6);
}
else
{
return if ($current % $self->{step});
$self->setLabel($self->{parent}->{lang}->{SplashDisplay}." ($current/".$self->{total}.')');
$self->{progress}->set_fraction(0.4 + (($current / $self->{total}) * 0.3));
}
GCUtils::updateUI;
}
sub setProgressForItemsSort
{
my ($self, $current) = @_;
if (! $self->{total})
{
$self->{progress}->set_fraction(0.8);
}
else
{
return if ($current % $self->{step});
$self->setLabel($self->{parent}->{lang}->{SplashSort}." ($current/".$self->{total}.')');
$self->{progress}->set_fraction(0.7 + (($current / $self->{total}) * 0.2));
}
GCUtils::updateUI;
}
sub setProgress
{
my ($self, $current) = @_;
$self->{progress}->set_fraction($current);
GCUtils::updateUI;
}
sub destroyMe
{
my $self = shift;
$self->destroy;
return 0;
}
sub show
{
my $self = shift;
$self->SUPER::show_all;
$self->{phase} = 0;
Glib::Timeout->add(10 ,\&init, $self);
}
}
1;