Parse back the log entries
[gregoa/zavai.git] / src / app_main.vala
1 /*
2  * app_main - zavai main status display
3  *
4  * Copyright (C) 2009  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 main {
26
27 /*
28 public class StatusBar : Gtk.HBox
29 {
30     void StatusBar()
31     {
32     }
33 }
34 */
35
36 public class Clock : Gtk.VBox
37 {
38     protected Gtk.Label l_date;
39     protected Gtk.Button l_date_button;
40     protected Gtk.Label l_time;
41     protected Gtk.Label l_deadline;
42     protected time_t last_time;
43     protected zavai.clock.SourceType last_time_type;
44     protected time_t last_deadline;
45     protected string last_deadline_label;
46
47     construct
48     {
49         last_time = time_t();
50         last_time_type = zavai.clock.SourceType.SYSTEM;
51         last_deadline = 0;
52         last_deadline_label = "";
53
54         l_date = new Gtk.Label("--");
55         l_date.modify_font(Pango.FontDescription.from_string("Sans 40"));
56         l_date_button = new Gtk.Button();
57         l_date_button.set_image(l_date);
58         l_date_button.relief = Gtk.ReliefStyle.NONE;
59         l_date_button.clicked += on_date_clicked;
60         pack_start(l_date_button, false, false, 0);
61         l_time = new Gtk.Label("--:--");
62         l_time.modify_font(Pango.FontDescription.from_string("Sans 60"));
63         pack_start(l_time, false, false, 0);
64         l_deadline = new Gtk.Label("");
65         l_deadline.modify_font(Pango.FontDescription.from_string("Sans 30"));
66         l_deadline.set_justify(Gtk.Justification.CENTER);
67         pack_start(l_deadline, false, false, 0);
68
69         zavai.clock.clock.minute_changed += on_minute_changed;
70         zavai.clock.clock.schedule_changed += on_schedule_changed;
71         on_schedule_changed(zavai.clock.clock.next_alarm());
72
73         zavai.clock.clock.request("ui.main.clock");
74     }
75
76     private void on_date_clicked(Gtk.Button b)
77     {
78         zavai.app.push_applet(zavai.ui.calendar.calendar);
79     }
80
81     private void on_schedule_changed(zavai.clock.Alarm? next)
82     {
83         if (next == null)
84         {
85             last_deadline = 0;
86             last_deadline_label = "";
87         } else {
88             last_deadline = next.ev.deadline;
89             last_deadline_label = next.label;
90         }
91         on_minute_changed((long)last_time, last_time_type);
92     }
93
94     private void on_minute_changed(long ts, zavai.clock.SourceType type)
95     {
96         last_time = (time_t)ts;
97         last_time_type = type;
98
99         string typetag = "unknown";
100         switch (type)
101         {
102             case zavai.clock.SourceType.GPS:
103                 typetag = "gps";
104                 break;
105             case zavai.clock.SourceType.SYSTEM:
106                 typetag = "sys";
107                 break;
108         }
109
110         var t = Time.local((time_t)ts);
111         l_date.set_text(t.format("%a %d %b"));
112         l_time.set_text("%2d:%02d (%s)".printf(t.hour, t.minute, typetag));
113
114         if (last_deadline == 0)
115             l_deadline.set_text("");
116         else
117         {
118             int remaining = (int)(last_deadline - last_time);
119             int hours = remaining / 3600;
120             int minutes = (remaining % 3600) / 60;
121             if (hours == 0 && minutes == 0)
122                 l_deadline.set_text(last_deadline_label + "\nanytime now");
123             else
124                 l_deadline.set_text("%s\nin %02dh %02dm".printf(last_deadline_label, hours, minutes));
125         }
126     }
127 }
128
129 public class Status : Applet
130 {
131     public Gtk.HBox status_icons;
132     public Clock clock;
133     public Gtk.Label gsm_status;
134     public Gtk.Label gsm_info;
135     public AppletPushLink menu;
136
137     public Status(string label)
138     {
139         _label = label;
140         status_icons = new Gtk.HBox(false, 0);
141         clock = new Clock();
142         gsm_status = new Gtk.Label("");
143         gsm_info = new Gtk.Label("");
144         menu = new AppletPushLink(zavai.menu_main);
145
146         pack_start(status_icons, false, false, 0);
147         pack_start(clock, false, false, 0);
148         pack_start(gsm_status, false, false, 0);
149         pack_start(gsm_info, false, false, 0);
150         // pack_start(music.player, false, false, 0);
151         pack_end(menu, false, false, 0);
152
153         zavai.gsm.gsm.status_changed += (msg) => { gsm_status.set_text(msg); };
154         zavai.gsm.gsm.info_changed += () => {
155 stderr.printf("NEW INFO %s %s %d\n", zavai.gsm.gsm.info_provider, zavai.gsm.gsm.info_registration, zavai.gsm.gsm.info_signal_strength);
156             string text = "%s (%s)".printf(zavai.gsm.gsm.info_provider, zavai.gsm.gsm.info_registration);
157             if (zavai.gsm.gsm.info_signal_strength != -1)
158                 text = "%s %d%%".printf(text, zavai.gsm.gsm.info_signal_strength);
159             gsm_info.set_text(text);
160         };
161     }
162 }
163
164 public class IncDec : Gtk.HBox
165 {
166     protected Gtk.Button b_decmore;
167     protected Gtk.Button b_dec;
168     protected Gtk.Button b_inc;
169     protected Gtk.Button b_incmore;
170     static const int BH = 50;
171     static const int BW = 50;
172
173     public signal void tweaked(IncDec id, int amount);
174
175     public IncDec()
176     {
177         homogeneous = true;
178         b_decmore = new Gtk.Button.with_label("«");
179         b_decmore.set_size_request(BW, BH);
180         b_dec = new Gtk.Button.with_label("<");
181         b_dec.set_size_request(BW, BH);
182         b_inc = new Gtk.Button.with_label(">");
183         b_inc.set_size_request(BW, BH);
184         b_incmore = new Gtk.Button.with_label("»");
185         b_incmore.set_size_request(BW, BH);
186         pack_start(b_decmore, false, true, 0);
187         pack_start(b_dec, false, true, 0);
188         pack_start(b_inc, false, true, 0);
189         pack_start(b_incmore, false, true, 0);
190         b_decmore.clicked += on_clicked;
191         b_dec.clicked += on_clicked;
192         b_inc.clicked += on_clicked;
193         b_incmore.clicked += on_clicked;
194     }
195
196     protected void on_clicked(Gtk.Button b)
197     {
198         if (b == b_decmore)
199             tweaked(this, -10);
200         else if (b == b_dec)
201             tweaked(this, -1);
202         else if (b == b_inc)
203             tweaked(this, 1);
204         else if (b == b_incmore)
205             tweaked(this, 10);
206     }
207 }
208
209 public abstract class AddDeadline : Applet
210 {
211     protected Gtk.ComboBoxEntry dl_label;
212     protected Gtk.Button dl_submit;
213
214     public AddDeadline()
215     {
216         dl_label = new Gtk.ComboBoxEntry.text();
217         dl_label.append_text("Pasta");
218         dl_label.append_text("Talk");
219         dl_label.append_text("Leave");
220         dl_label.changed += on_label_changed;
221
222         var hbox = new Gtk.HBox(false, 0);
223         hbox.pack_start(new Gtk.Label("Label: "), false, false, 0);
224         hbox.pack_start(dl_label, true, true, 0);
225         pack_start(hbox, false, false, 0);
226
227         dl_submit = new Gtk.Button.with_label("Activate");
228         dl_submit.set_sensitive(false);
229         dl_submit.clicked += on_submit;
230         button_box.pack_start(dl_submit, true, true, 0);
231     }
232
233     public override void start()
234     {
235         ((Gtk.Entry)dl_label.get_child()).set_text("");
236         update();
237     }
238
239     protected virtual void update()
240     {
241         dl_submit.set_sensitive(((Gtk.Entry)dl_label.get_child()).get_text() == "" ? false : true);
242     }
243
244     protected abstract time_t get_deadline();
245
246     protected void on_label_changed(Gtk.ComboBox e)
247     {
248         update();
249     }
250
251     protected void on_submit(Gtk.Button b)
252     {
253         string label = ((Gtk.Entry)dl_label.get_child()).get_text();
254         time_t deadlinets = get_deadline();
255         Time deadline = Time.local(deadlinets);
256         string timespec = deadline.format("%H:%M %m/%d/%Y");
257         zavai.log.info("Scheduling deadline " + label + " at " + timespec);
258         zavai.clock.clock.schedule(timespec, label);
259         back();
260     }
261 }
262
263 public class AddAbsoluteDeadline : AddDeadline
264 {
265     protected Gtk.Label dl_day;
266     protected IncDec dl_day_tweak;
267     protected Gtk.Label dl_hour;
268     protected IncDec dl_hour_tweak;
269     protected Gtk.Label dl_min;
270     protected IncDec dl_min_tweak;
271     protected time_t dl_time;
272
273     public AddAbsoluteDeadline()
274     {
275         _label = "Add absolute deadline";
276         dl_time = 0;
277
278         dl_day = new Gtk.Label("");
279         dl_day.set_justify(Gtk.Justification.RIGHT);
280         dl_day_tweak = new IncDec();
281         dl_day_tweak.tweaked += on_tweak;
282         var hbox = new Gtk.HBox(false, 0);
283         hbox.pack_start(new Gtk.Label("Day: "), false, false, 0);
284         hbox.pack_start(dl_day, true, true, 0);
285         hbox.pack_start(dl_day_tweak, false, false, 0);
286         pack_start(hbox, false, false, 0);
287
288         dl_hour = new Gtk.Label("");
289         dl_hour.set_justify(Gtk.Justification.RIGHT);
290         dl_hour_tweak = new IncDec();
291         dl_hour_tweak.tweaked += on_tweak;
292         hbox = new Gtk.HBox(false, 0);
293         hbox.pack_start(new Gtk.Label("Hour: "), false, false, 0);
294         hbox.pack_start(dl_hour, true, true, 0);
295         hbox.pack_start(dl_hour_tweak, false, false, 0);
296         pack_start(hbox, false, false, 0);
297
298         dl_min = new Gtk.Label("");
299         dl_min.set_justify(Gtk.Justification.RIGHT);
300         dl_min_tweak = new IncDec();
301         dl_min_tweak.tweaked += on_tweak;
302         hbox = new Gtk.HBox(false, 0);
303         hbox.pack_start(new Gtk.Label("Minute: "), false, false, 0);
304         hbox.pack_start(dl_min, true, true, 0);
305         hbox.pack_start(dl_min_tweak, false, false, 0);
306         pack_start(hbox, false, false, 0);
307     }
308
309     public override void start()
310     {
311         dl_time = time_t();
312         base.start();
313     }
314
315     protected override void update()
316     {
317         Time t = Time.local(dl_time);
318         dl_day.set_text(t.format("%a %d %b"));
319         dl_hour.set_text(t.format("%H"));
320         dl_min.set_text(t.format("%M"));
321         base.update();
322     }
323
324     protected override time_t get_deadline()
325     {
326         return dl_time;
327     }
328
329     protected void on_tweak(IncDec id, int amount)
330     {
331         time_t old = dl_time;
332         if (id == dl_day_tweak)
333             dl_time += amount * 3600 * 24;
334         else if (id == dl_hour_tweak)
335             dl_time += amount * 3600;
336         else if (id == dl_min_tweak)
337             dl_time += amount * 60;
338         time_t now = time_t();
339         if (dl_time < now)
340             dl_time = old;
341         update();
342     }
343 }
344
345 public class AddRelativeDeadline : AddDeadline
346 {
347     protected Gtk.Label dl_hour;
348     protected IncDec dl_hour_tweak;
349     protected Gtk.Label dl_min;
350     protected IncDec dl_min_tweak;
351     protected int dl_time;
352
353     public AddRelativeDeadline()
354     {
355         _label = "Add relative deadline";
356         dl_time = 0;
357
358         dl_hour = new Gtk.Label("");
359         dl_hour.set_justify(Gtk.Justification.RIGHT);
360         dl_hour_tweak = new IncDec();
361         dl_hour_tweak.tweaked += on_tweak;
362         var hbox = new Gtk.HBox(false, 0);
363         hbox.pack_start(new Gtk.Label("Hour: "), false, false, 0);
364         hbox.pack_start(dl_hour, true, true, 0);
365         hbox.pack_start(dl_hour_tweak, false, false, 0);
366         pack_start(hbox, false, false, 0);
367
368         dl_min = new Gtk.Label("");
369         dl_min.set_justify(Gtk.Justification.RIGHT);
370         dl_min_tweak = new IncDec();
371         dl_min_tweak.tweaked += on_tweak;
372         hbox = new Gtk.HBox(false, 0);
373         hbox.pack_start(new Gtk.Label("Minute: "), false, false, 0);
374         hbox.pack_start(dl_min, true, true, 0);
375         hbox.pack_start(dl_min_tweak, false, false, 0);
376         pack_start(hbox, false, false, 0);
377     }
378
379     public override void start()
380     {
381         dl_time = 0;
382         base.start();
383     }
384
385     protected override void update()
386     {
387         dl_hour.set_text("%2d".printf(dl_time/60));
388         dl_min.set_text("%2d".printf(dl_time%60));
389         base.update();
390     }
391
392     protected void on_tweak(IncDec id, int amount)
393     {
394         int old = dl_time;
395         if (id == dl_hour_tweak)
396             dl_time += amount * 60;
397         else if (id == dl_min_tweak)
398             dl_time += amount;
399         if (dl_time < 0)
400             dl_time = old;
401         update();
402     }
403
404     protected override time_t get_deadline()
405     {
406         return time_t() + dl_time * 60;
407     }
408 }
409
410 /*
411 public class AddDailyDeadline : Applet
412 {
413     public AddDailyDeadline()
414     {
415         _label = "Add daily deadline";
416     }
417 }
418 */
419
420 public Status status;
421 public AddAbsoluteDeadline aad;
422 public AddRelativeDeadline ard;
423 //AddDailyDeadline add;
424
425 public void init()
426 {
427     status = new Status("Zavai");
428     aad = new AddAbsoluteDeadline();
429     ard = new AddRelativeDeadline();
430     /*
431     add = new AddDailyDeadline();
432     zavai.registry.register_applet("clock.adddaily", add);
433     */
434
435     zavai.menu_misc.add_applet(aad);
436     zavai.menu_misc.add_applet(ard);
437     //menu_misc.add_applet("clock.adddaily");
438 }
439
440 }
441 }
442 }