Switch the MPD plugin to using the new Notifications module.
[picture-display.git] / lib / Display / Notifications.pm
1 package Display::Notifications;
2
3 use Clutter;
4 use Set::Object;
5
6 my $delay = 5;
7
8 sub new {
9   my ($proto, $kernel, $session, $stage) = @_;
10   my $class = ref($proto) || $proto;
11
12   my $self = {
13     'kernel' => $kernel,
14     'session' => $session,
15     'stage' => $stage,
16   };
17
18   $self->{'blocks'} = Set::Object->new();
19
20   bless ($self, $class);
21   $self->init();
22   return $self;
23 }
24
25 sub add {
26   my ($self, $notification) = @_;
27
28   my $block = Clutter::Group->new();
29   $block->set_opacity(0);
30
31   my $bg = Clutter::Rectangle->new(Clutter::Color->parse('Black'));
32   $bg->set_width($self->{'stage'}->get_width() - 20);
33   $bg->set_opacity(100);
34
35   $block->add($bg);
36   $block->add($notification);
37
38   $bg->set_height($notification->get_height() + 10);
39   $bg->set_anchor_point(1, $bg->get_height());
40   $bg->set_position(10, $self->{'stage'}->get_height() - 10);
41
42   $notification->set_anchor_point(1, $notification->get_height());
43   $notification->set_position(20, $self->{'stage'}->get_height() - 20);
44   $notification->set_width($bg->get_width() - 20);
45
46   my $expire = time() + $delay;
47
48   $self->{'blocks'}->insert( {
49     'expire' => $expire, 
50     'block'  => $block
51   });
52
53   $self->{'stage'}->add($block);
54   my $effect = Clutter::EffectTemplate->new_for_duration(1000, 'main::smoothstep_inc');
55   my $timeline = Clutter::Effect->fade($effect, $block, 255);
56       
57   $self->{'kernel'}->delay_add('notifications_expire', $delay);
58
59   $timeline->start();
60 }
61
62 sub expire {
63   my ($self) = @_[OBJECT];
64
65   for my $block ($self->{'blocks'}->members()) {
66     if ($block->expire <= time()) {
67       $self->{'stage'}->remove($block->{'block'});
68       $self->{'blocks'}->remove($block);
69     }
70   }
71 }
72
73 sub init {
74   my $self = shift;
75
76   $self->{'kernel'}->state('notifications_expire', $self, 'expire');
77 }
78
79 1;