Start adding code to fade images in and out. Don't redisplay the same image.
[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
47 sub fade_in {
48   my $new_pic = shift;
49
50   my $new_effect = Clutter::EffectTemplate->new_for_duration(1000, 'smoothstep_inc');
51   my $new = Clutter::Effect->fade($new_effect, $new_pic, 255);
52   $new->start();
53 }
54
55 sub find_photo {
56   my $self = shift;
57   
58   my $uri;
59   $self->{'sth'}->bind_columns(\$uri);
60   my $rc = $self->{'sth'}->execute()
61     || die "Failed to execute statement: $DBI::errstr\n";
62
63   $self->{'sth'}->fetch;
64
65   $self->{'sth'}->finish()
66     || die "Failed to finish statement: $DBI::errstr\n";;
67
68   $uri =~ s|^file://||;
69
70   return $uri;
71 }
72
73 sub init {
74   my $self = shift;
75
76   $self->{'dbh'} = DBI->connect("dbi:SQLite:dbname=$f_spot_db","","")
77     || die "Failed to connect to $f_spot_db: $DBI::errstr\n";
78
79   my $sql = "
80 SELECT uri
81 FROM photos, photo_tags, tags
82   WHERE photos.id = photo_tags.photo_id
83   AND photo_tags.tag_id = tags.id
84   AND tags.name = 'Brooke'
85 ORDER BY random()
86 LIMIT 1
87 ";
88
89   $self->{'sth'} = $self->{'dbh'}->prepare($sql)
90     || die "Failed to prepare statement: $DBI::errstr\n";
91
92   for my $age ('new', 'old') {
93     $self->{$age} = Clutter::Texture->new();
94     $self->{$age}->set_size($self->{'stage'}->get_size());
95     $self->{$age}->set('keep-aspect-ratio' => 1);
96     $self->{$age}->set('sync-size' => 1);
97     $self->{$age}->set_opacity(0);
98   }
99
100   $self->display();
101
102   for my $age ('new', 'old') {
103     $self->{'stage'}->add($self->{$age});
104   }
105
106   Glib::Timeout->add_seconds(30, $self->can('display'), $self);
107 }
108
109 1;