Deleted done items
[gregoa/zavai.git] / src / app_alarm.vala
1 /*
2  * app_alarm - zavai alarm system
3  *
4  * Copyright (C) 2010  Enrico Zini <enrico@enricozini.org>
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  */
20
21 using GLib;
22
23 namespace zavai {
24 namespace ui {
25 namespace alarm {
26
27 /*
28 // Compute a-b in microseconds
29 static long timediff(Posix.timeval* a, Posix.timeval* b)
30 {
31     return (a->tv_sec - b->tv_sec) * 1000000 + (a->tv_usec - b->tv_usec);
32 }
33 */
34
35 protected class AlarmNotifierDialog : ui.notify.Notifier
36 {
37     protected Gtk.Label message;
38     protected Gtk.Button message_button;
39
40     public AlarmNotifierDialog(string title, string text)
41     {
42         Object(
43             notifier_name: "alarm",
44             title: title
45         );
46
47         set_size_request(300, 500);
48
49         add_button(Gtk.STOCK_OK, Gtk.ResponseType.OK);
50         add_button(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL);
51         set_default_response(Gtk.ResponseType.OK);
52
53         weak Gtk.VBox vbox = (Gtk.VBox)get_content_area();
54
55         message = new Gtk.Label(text);
56         message_button = new Gtk.Button();
57         message_button.set_image(message);
58         message_button.clicked += (b) => { response(Gtk.ResponseType.OK); };
59         vbox.pack_start(message_button, true, true, 0);
60         message_button.show();
61     }
62
63     protected override bool push_aux_state()
64     {
65         var state = new zavai.led.LedState(notifier_name);
66         state.set_blink(255);
67         zavai.led.aux.push_state(state);
68         return true;
69     }
70
71     protected override bool push_vibrator_state()
72     {
73         var state = new zavai.led.LedState(notifier_name);
74         state.set_blink(255);
75         zavai.led.vibrator.push_state(state);
76         return true;
77     }
78
79     protected override bool push_ringtone_state()
80     {
81         var state = new zavai.audio.PlayerState(notifier_name, config.ringtone_alarm, true);
82         zavai.audio.soundplayer.push_state(state);
83         return true;
84     }
85 }
86
87 public class AlarmNotifier : zavai.Resource, ui.notify.Notifier
88 {
89     protected weak clock.AlarmTriggerInfo current = null;
90     protected AlarmNotifierDialog dialog = null;
91
92     public AlarmNotifier()
93     {
94         zavai.registry.register(this);
95
96         clock.alarm_trigger_queue.triggered += on_trigger;
97         clock.alarm_trigger_queue.acked += on_done;
98         clock.alarm_trigger_queue.canceled += on_done;
99     }
100
101     public void on_trigger(clock.AlarmTriggerInfo info)
102     {
103         current = info;
104         dialog = new AlarmNotifierDialog("Alarm", info.label);
105
106         if (zavai.led.auxbutton != null)
107             zavai.led.auxbutton.event += on_auxbutton;
108
109         uint cancel_timeout = 0;
110         cancel_timeout = Timeout.add(30 * 1000, () => {
111             dialog.response(Gtk.ResponseType.CANCEL);
112             cancel_timeout = 0;
113             return false;
114         });
115         int res = dialog.run();
116         if (cancel_timeout != 0) Source.remove(cancel_timeout);
117         switch (res)
118         {
119             case Gtk.ResponseType.OK:
120                 clock.alarm_trigger_queue.ack(current);
121                 break;
122             case Gtk.ResponseType.CANCEL:
123                 clock.alarm_trigger_queue.cancel(current);
124                 break;
125         }
126
127         if (zavai.led.auxbutton != null)
128             zavai.led.auxbutton.event -= on_auxbutton;
129
130         dialog.destroy();
131         dialog = null;
132         current = null;
133     }
134
135     protected bool on_auxbutton(ulong time, bool pressed)
136     {
137         if (dialog == null) return false;
138         dialog.response(Gtk.ResponseType.OK);
139         return true;
140     }
141
142     public void on_done(clock.AlarmTriggerInfo info)
143     {
144         if (current == null || dialog == null || current != info) return;
145         dialog.response(Gtk.ResponseType.NONE);
146     }
147
148     public void shutdown()
149     {
150         if (dialog == null) return;
151         dialog.response(Gtk.ResponseType.CANCEL);
152     }
153 }
154
155 public AlarmNotifier notifier = null;
156
157 public void init()
158 {
159     if (clock.alarm_trigger_queue != null)
160         notifier = new AlarmNotifier();
161 }
162
163 }
164 }
165 }