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