Convert to using POE for the event management.
[picture-display.git] / lib / Display / Plugins / FSpot.pm
1 package Display::Plugins::FSpot;
2
3 use Clutter;
4 use base ('Display::Plugin');
5
6 my $f_spot_db = "/home/andrew/.gnome2/f-spot/photos.db";
7
8 sub new {
9   my $proto = shift;
10   my $class = ref($proto) || $proto;
11
12   my $self = $class->SUPER::new(@_);
13
14   $self->{'last_file'} = '';
15
16   bless ($self, $class);
17   $self->init();
18   return $self;
19 }
20
21 sub display {
22   my $self = shift;
23   my $file;
24
25   # Keep on looking until we find a file that exists.
26   do {
27     $file = $self->find_photo();
28   } until (-f $file && $file ne $self->{'last_file'});
29   
30   $self->{'new'}->set_from_file($file);
31
32   if ($self->{'last_file'} eq '') {
33     fade_in($self->{'new'});
34 #  } else {
35 #warn "Fade out old\n";
36 #    my $old_effect = Clutter::EffectTemplate->new_for_duration(1000, 'main::smoothstep_dec' );
37 #    my $old = Clutter::Effect->fade($old_effect, $self->{'old'}, 0, $self->can('fade_in'), $self->{'new'});
38 #    $old->start();
39   }
40
41 #  my $temp = $self->{'old'};
42 #  $self->{'old'} = $self->{'new'};
43 #  $self->{'new'} = $temp;
44   $self->{'last_file'} = $file;
45
46   $self->{'kernel'}->delay_set(fspot_display => 30);
47   return 1;
48 }
49
50 sub fade_in {
51   my $new_pic = shift;
52
53   my $new_effect = Clutter::EffectTemplate->new_for_duration(1000, 'main::smoothstep_inc');
54   my $new = Clutter::Effect->fade($new_effect, $new_pic, 255);
55   $new->start();
56 }
57
58 sub find_photo {
59   my $self = shift;
60   
61   my $uri;
62   $self->{'sth'}->bind_columns(\$uri);
63   my $rc = $self->{'sth'}->execute()
64     || die "Failed to execute statement: $DBI::errstr\n";
65
66   $self->{'sth'}->fetch;
67
68   $self->{'sth'}->finish()
69     || die "Failed to finish statement: $DBI::errstr\n";;
70
71   $uri =~ s|^file://||;
72
73   return $uri;
74 }
75
76 sub init {
77   my $self = shift;
78
79   $self->{'kernel'}->state('fspot_display', $self, 'display');
80
81   $self->{'dbh'} = DBI->connect("dbi:SQLite:dbname=$f_spot_db","","")
82     || die "Failed to connect to $f_spot_db: $DBI::errstr\n";
83
84   my $sql = "
85 SELECT uri
86 FROM photos, photo_tags, tags
87   WHERE photos.id = photo_tags.photo_id
88   AND photo_tags.tag_id = tags.id
89   AND tags.name = 'Brooke'
90 ORDER BY random()
91 LIMIT 1
92 ";
93
94   $self->{'sth'} = $self->{'dbh'}->prepare($sql)
95     || die "Failed to prepare statement: $DBI::errstr\n";
96
97   for my $age ('new', 'old') {
98     $self->{$age} = Clutter::Texture->new();
99     $self->{$age}->set_size($self->{'stage'}->get_size());
100     $self->{$age}->set('keep-aspect-ratio' => 1);
101     $self->{$age}->set('sync-size' => 1);
102     $self->{$age}->set_opacity(0);
103   }
104
105   $self->display();
106
107   for my $age ('new', 'old') {
108     $self->{'stage'}->add($self->{$age});
109   }
110
111   $self->{'kernel'}->delay_set(fspot_display => 30);
112 }
113
114 1;