Center photos on the screen.
[picture-display.git] / lib / Display / Plugins / Directory.pm
1 package Display::Plugins::Directory;
2
3 use base ('Display::Plugin');
4 use Clutter;
5 use POE;
6 use FindBin qw/$Bin/;
7
8 my $directory = "$Bin/test_images";
9
10 sub new {
11   my $proto = shift;
12   my $class = ref($proto) || $proto;
13
14   my $self = $class->SUPER::new(@_);
15
16   $self->{'last_file'} = '';
17
18   bless ($self, $class);
19   $self->init();
20   return $self;
21 }
22
23 sub display {
24   my ($self, $kernel) = @_[OBJECT, KERNEL];
25   my $file;
26
27   # Keep on looking until we find a file that exists.
28   do {
29     $file = $self->find_photo();
30
31     return
32       unless defined $file;
33   } until -f $file && $file ne $self->{'last_file'};
34   
35   $self->{'new'}->set_from_file($file);
36
37   if ($self->{'last_file'} eq '') {
38     fade_in($self->{'new'});
39 #  } else {
40 #warn "Fade out old\n";
41 #    my $old_effect = Clutter::EffectTemplate->new_for_duration(1000, 'main::smoothstep_dec' );
42 #    my $old = Clutter::Effect->fade($old_effect, $self->{'old'}, 0, $self->can('fade_in'), $self->{'new'});
43 #    $old->start();
44   }
45
46 #  my $temp = $self->{'old'};
47 #  $self->{'old'} = $self->{'new'};
48 #  $self->{'new'} = $temp;
49   $self->{'last_file'} = $file;
50
51   $self->{'kernel'}->delay(directory_display, 30);
52 }
53
54 sub fade_in {
55   my $new_pic = shift;
56
57   my $new_effect = Clutter::EffectTemplate->new_for_duration(1000, 'main::smoothstep_inc');
58   my $new = Clutter::Effect->fade($new_effect, $new_pic, 255);
59   $new->start();
60 }
61
62 sub find_photo {
63   my $self = shift;
64
65   if (opendir(DIR, $directory)) {
66     my @files = readdir(DIR);
67     closedir DIR;
68
69     return join("/", $directory, $files[rand @files]);
70   } else {
71     warn "Failed to open $directory for reading: $!\n";
72   }
73 }
74
75 sub init {
76   my $self = shift;
77
78   $self->{'kernel'}->state('directory_display', $self, 'display');
79
80   for my $age ('new', 'old') {
81     $self->{$age} = Clutter::Texture->new();
82     $self->{$age}->set_size($self->{'stage'}->get_size());
83     $self->{$age}->set('keep-aspect-ratio' => 1);
84     $self->{$age}->set('sync-size' => 1);
85     $self->{$age}->set_opacity(0);
86
87     $self->{'stage'}->add($self->{$age});
88   }
89
90   $self->{'kernel'}->yield('directory_display');
91 }
92
93 1;