First cut at adding an object for displaying notifications.
[picture-display.git] / lib / Display / Notifications.pm
1 package Display::Notifications;
2
3 use Clutter;
4 use Set::Object;
5
6 my $delay = 15;
7
8 sub new {
9   my $proto = shift;
10   my $class = ref($proto) || $proto;
11
12   my $self = {};
13
14   $self->{'blocks'} = Set::Object->new();
15
16   bless ($self, $class);
17   return $self;
18 }
19
20 sub add {
21   my ($self, $notification) = @_;
22
23   my $block = Clutter::Group->new();
24
25   my $bg = Clutter::Rectangle->new(Clutter::Color->parse('Black'));
26   $bg->set_width($self->{'stage'}->get_width() - 40);
27   $bg->set_opacity(100);
28
29   $block->add($bg);
30   $block->add($notification);
31
32   $bg->set_height($notification->get_height() + 10);
33   $bg->set_anchor_point(1, $bg->get_height());
34   $bg->set_position(10, $self->{'stage'}->get_height() - 10);
35
36   $notification->set_anchor_point(1, $notification->get_height());
37   $notification->set_position(20, $self->{'stage'}->get_height() - 20);
38
39   my $expire = time() + $delay;
40
41   $self->{'blocks'}->add( {
42     'expire' => $expire, 
43     'block'  => $block
44   });
45
46   $self->{'stage'}->add($block);
47   my $effect = Clutter::EffectTemplate->new_for_duration(1000, 'main::smoothstep_inc');
48   my $timeline = Clutter::Effect->fade($effect, $block, 255);
49   $timeline->start();
50       
51   $self->{'stage'}->delay_add(notification_expire, $expire, $self);
52 }
53
54 sub expire {
55   my $self = shift;
56
57   for my $block ($self->{'blocks'}->members()) {
58     if ($block->expire <= time()) {
59       $self->{'stage'}->remove($block->{'block'});
60       $self->{'blocks'}->remove($block);
61     }
62   }
63 }
64
65 1;