Use strict everywhere and fix one error that it revealed.
[picture-display.git] / lib / Display / Plugins / FSpot.pm
1 package Display::Plugins::FSpot;
2
3 use base ('Display::Plugin');
4 use Clutter;
5 use POE;
6 use POE::Component::EasyDBI;
7 use strict;
8
9 my $default_f_spot_db = "$ENV{HOME}/.gnome2/f-spot/photos.db";
10 my $delay = 10;
11
12 sub new {
13   my $proto = shift;
14   my $class = ref($proto) || $proto;
15
16   my $self = $class->SUPER::new(@_);
17
18   $self->{'last_file'} = '';
19
20   bless ($self, $class);
21   $self->init_delay($delay, 'fspot_display');
22   $self->init();
23   return $self;
24 }
25
26 sub display_photo {
27   my ($self, $kernel, $args) = @_[OBJECT, KERNEL, ARG0];
28   my $file = $args->{'result'};
29   $file =~ s|^file://||;
30
31   # Keep on looking until we find a file that exists.
32   if (! -f $file || $file eq $self->{'last_file'}) {
33     $kernel->yield('fspot_display');
34     return;
35   } 
36   
37   #warn "Loading $file\n";
38   $self->{'new'}->set_opacity(0);
39   $self->{'new'}->set_from_file($file);
40   #$self->{'stage'}->add($self->{'new'});
41
42   if ($self->{'last_file'} eq '') {
43     fade_in(undef, $self);
44   } else {
45 warn "Fade out old\n";
46     my $old_effect = Clutter::EffectTemplate->new_for_duration(2000, 'main::smoothstep_dec' );
47     my $old = Clutter::Effect->fade($old_effect, $self->{'new'}, 0, $self->can('fade_in'), $self);
48     $old->start();
49
50     sleep 10;
51   }
52
53   $self->{'last_file'} = $file;
54   $self->delay();
55 }
56
57 sub fade_in {
58   my ($actor, $self) = @_;
59
60 warn "Fade in new\n";
61   my $new_effect = Clutter::EffectTemplate->new_for_duration(2000, 'main::smoothstep_inc');
62   my $new = Clutter::Effect->fade($new_effect, $self->{'new'}, 255);
63   $new->start();
64
65   my $temp = $self->{'old'};
66   $self->{'old'} = $self->{'new'};
67   $self->{'new'} = $temp;
68 }
69
70 sub display {
71   my $self = shift;
72
73   $self->{'kernel'}->post('FSpotDB',
74     single => { sql => $self->{'sql'}, event => fspot_display_photo }
75   );
76 }
77
78 sub init {
79   my $self = shift;
80
81   $self->{'kernel'}->state('fspot_display', $self, 'display');
82   $self->{'kernel'}->state('fspot_display_photo', $self, 'display_photo');
83
84   POE::Component::EasyDBI->spawn(
85     alias => 'FSpotDB',
86     dsn   => "dbi:SQLite:dbname=" . ($self->{'config'}{'_config'}{'plugings'}{'DB'} || $default_f_spot_db),
87     username => '',
88     password => '',
89   );
90
91   $self->{'sql'} = "
92 SELECT uri
93 FROM photos, photo_tags, tags
94   WHERE photos.id = photo_tags.photo_id
95   AND photo_tags.tag_id = tags.id
96   AND tags.name = 'Brooke'
97 ORDER BY random()
98 LIMIT 1
99 ";
100
101   for my $age ('new', 'old') {
102     $self->{$age} = Clutter::Texture->new();
103     $self->{$age}->set_size($self->{'stage'}->get_size());
104     $self->{$age}->set('keep-aspect-ratio' => 1);
105     $self->{$age}->set('sync-size' => 1);
106     $self->{$age}->set_opacity(0);
107
108     $self->{'stage'}->add($self->{$age});
109   }
110
111   $self->{'kernel'}->yield('fspot_display');
112 }
113
114 1;