50357e87a353f71e5d4878732c44e0c0207a9ac9
[picture-display.git] / lib / Display / Plugins / FSpot.pm
1 package Display::Plugins::FSpot;
2
3 use DBI;
4 use Clutter;
5
6 my $f_spot_db = "/home/andrew/.gnome2/f-spot/photos.db";
7
8 sub new {
9   my ($class,$stage) = @_;
10
11   my $self = {
12     'stage' => $stage,
13     'last_file' => '',
14   };
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, '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   return 1;
47 }
48
49 sub fade_in {
50   my $new_pic = shift;
51
52   my $new_effect = Clutter::EffectTemplate->new_for_duration(1000, 'smoothstep_inc');
53   my $new = Clutter::Effect->fade($new_effect, $new_pic, 255);
54   $new->start();
55 }
56
57 sub find_photo {
58   my $self = shift;
59   
60   my $uri;
61   $self->{'sth'}->bind_columns(\$uri);
62   my $rc = $self->{'sth'}->execute()
63     || die "Failed to execute statement: $DBI::errstr\n";
64
65   $self->{'sth'}->fetch;
66
67   $self->{'sth'}->finish()
68     || die "Failed to finish statement: $DBI::errstr\n";;
69
70   $uri =~ s|^file://||;
71
72   return $uri;
73 }
74
75 sub init {
76   my $self = shift;
77
78   $self->{'dbh'} = DBI->connect("dbi:SQLite:dbname=$f_spot_db","","")
79     || die "Failed to connect to $f_spot_db: $DBI::errstr\n";
80
81   my $sql = "
82 SELECT uri
83 FROM photos, photo_tags, tags
84   WHERE photos.id = photo_tags.photo_id
85   AND photo_tags.tag_id = tags.id
86   AND tags.name = 'Brooke'
87 ORDER BY random()
88 LIMIT 1
89 ";
90
91   $self->{'sth'} = $self->{'dbh'}->prepare($sql)
92     || die "Failed to prepare statement: $DBI::errstr\n";
93
94   for my $age ('new', 'old') {
95     $self->{$age} = Clutter::Texture->new();
96     $self->{$age}->set_size($self->{'stage'}->get_size());
97     $self->{$age}->set('keep-aspect-ratio' => 1);
98     $self->{$age}->set('sync-size' => 1);
99     $self->{$age}->set_opacity(0);
100   }
101
102   $self->display();
103
104   for my $age ('new', 'old') {
105     $self->{'stage'}->add($self->{$age});
106   }
107
108   Glib::Timeout->add_seconds(30, $self->can('display'), $self);
109 }
110
111 1;