f77b0e0fa888844a54d6651ef7eae4ffeaa41f8a
[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 $f_spot_db = "/home/andrew/.gnome2/f-spot/photos.db";
9
10 sub new {
11   my $proto = shift;
12   my $class = ref($proto) || $proto;
13
14   my $self = $class->SUPER::new(@_);
15
16   $self->{'last_file'} = '';
17
18   bless ($self, $class);
19   $self->init();
20   return $self;
21 }
22
23 sub display_photo {
24   my ($self, $kernel, $args) = @_[OBJECT, KERNEL, ARG0];
25   my $file = $args->{'result'};
26   $file =~ s|^file://||;
27
28   # Keep on looking until we find a file that exists.
29   if (! -f $file || $file eq $self->{'last_file'}) {
30     $kernel->post('fspot_display');
31     return;
32   } 
33   
34   $self->{'new'}->set_from_file($file);
35
36   if ($self->{'last_file'} eq '') {
37     fade_in($self->{'new'});
38 #  } else {
39 #warn "Fade out old\n";
40 #    my $old_effect = Clutter::EffectTemplate->new_for_duration(1000, 'main::smoothstep_dec' );
41 #    my $old = Clutter::Effect->fade($old_effect, $self->{'old'}, 0, $self->can('fade_in'), $self->{'new'});
42 #    $old->start();
43   }
44
45 #  my $temp = $self->{'old'};
46 #  $self->{'old'} = $self->{'new'};
47 #  $self->{'new'} = $temp;
48   $self->{'last_file'} = $file;
49
50   $self->{'kernel'}->delay(fspot_display, 30);
51 }
52
53 sub fade_in {
54   my $new_pic = shift;
55
56   my $new_effect = Clutter::EffectTemplate->new_for_duration(1000, 'main::smoothstep_inc');
57   my $new = Clutter::Effect->fade($new_effect, $new_pic, 255);
58   $new->start();
59 }
60
61 sub display {
62   my $self = shift;
63
64   $self->{'kernel'}->post('FSpotDB',
65     single => { sql => $self->{'sql'}, event => fspot_display_photo }
66   );
67 }
68
69 sub init {
70   my $self = shift;
71
72   $self->{'kernel'}->state('fspot_display', $self, 'display');
73   $self->{'kernel'}->state('fspot_display_photo', $self, 'display_photo');
74
75   POE::Component::EasyDBI->spawn(
76     alias => 'FSpotDB',
77     dsn   => "dbi:SQLite:dbname=$f_spot_db",
78     username => '',
79     password => '',
80   );
81
82   $self->{'sql'} = "
83 SELECT uri
84 FROM photos, photo_tags, tags
85   WHERE photos.id = photo_tags.photo_id
86   AND photo_tags.tag_id = tags.id
87   AND tags.name = 'Brooke'
88 ORDER BY random()
89 LIMIT 1
90 ";
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     $self->{'stage'}->add($self->{$age});
100   }
101
102   $self->display();
103 }
104
105 1;