2 * app_main - zavai main status display
4 * Copyright (C) 2009 Enrico Zini <enrico@enricozini.org>
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.
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.
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
28 public class StatusBar : Gtk.HBox
36 public class Clock : Gtk.VBox
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;
50 last_time_type = zavai.clock.SourceType.SYSTEM;
52 last_deadline_label = "";
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);
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());
73 zavai.clock.clock.request("ui.main.clock");
76 private void on_date_clicked(Gtk.Button b)
78 zavai.app.push_applet(zavai.ui.calendar.calendar);
81 private void on_schedule_changed(zavai.clock.Alarm? next)
86 last_deadline_label = "";
88 last_deadline = next.ev.deadline;
89 last_deadline_label = next.label;
91 on_minute_changed((long)last_time, last_time_type);
94 private void on_minute_changed(long ts, zavai.clock.SourceType type)
96 last_time = (time_t)ts;
97 last_time_type = type;
99 string typetag = "unknown";
102 case zavai.clock.SourceType.GPS:
105 case zavai.clock.SourceType.SYSTEM:
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));
114 if (last_deadline == 0)
115 l_deadline.set_text("");
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");
124 l_deadline.set_text("%s\nin %02dh %02dm".printf(last_deadline_label, hours, minutes));
129 public class Status : Applet
131 public Gtk.HBox status_icons;
133 public Gtk.Label gsm_status;
134 public Gtk.Label gsm_info;
135 public AppletPushLink menu;
137 public Status(string label)
140 status_icons = new Gtk.HBox(false, 0);
142 gsm_status = new Gtk.Label("");
143 gsm_info = new Gtk.Label("");
144 menu = new AppletPushLink(zavai.menu_main);
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);
153 zavai.gsm.gsm.status_changed += (msg) => { gsm_status.set_text(msg); };
154 zavai.gsm.gsm.info_changed += () => {
155 if (zavai.gsm.gsm.info_signal_strength != -1)
156 gsm_info.set_text("%s %d%%".printf(zavai.gsm.gsm.info_provider, zavai.gsm.gsm.info_signal_strength));
158 gsm_info.set_text(zavai.gsm.gsm.info_provider);
163 public class IncDec : Gtk.HBox
165 protected Gtk.Button b_decmore;
166 protected Gtk.Button b_dec;
167 protected Gtk.Button b_inc;
168 protected Gtk.Button b_incmore;
169 static const int BH = 50;
170 static const int BW = 50;
172 public signal void tweaked(IncDec id, int amount);
177 b_decmore = new Gtk.Button.with_label("«");
178 b_decmore.set_size_request(BW, BH);
179 b_dec = new Gtk.Button.with_label("<");
180 b_dec.set_size_request(BW, BH);
181 b_inc = new Gtk.Button.with_label(">");
182 b_inc.set_size_request(BW, BH);
183 b_incmore = new Gtk.Button.with_label("»");
184 b_incmore.set_size_request(BW, BH);
185 pack_start(b_decmore, false, true, 0);
186 pack_start(b_dec, false, true, 0);
187 pack_start(b_inc, false, true, 0);
188 pack_start(b_incmore, false, true, 0);
189 b_decmore.clicked += on_clicked;
190 b_dec.clicked += on_clicked;
191 b_inc.clicked += on_clicked;
192 b_incmore.clicked += on_clicked;
195 protected void on_clicked(Gtk.Button b)
203 else if (b == b_incmore)
208 public abstract class AddDeadline : Applet
210 protected Gtk.ComboBoxEntry dl_label;
211 protected Gtk.Button dl_submit;
215 dl_label = new Gtk.ComboBoxEntry.text();
216 dl_label.append_text("Pasta");
217 dl_label.append_text("Talk");
218 dl_label.append_text("Leave");
219 dl_label.changed += on_label_changed;
221 var hbox = new Gtk.HBox(false, 0);
222 hbox.pack_start(new Gtk.Label("Label: "), false, false, 0);
223 hbox.pack_start(dl_label, true, true, 0);
224 pack_start(hbox, false, false, 0);
226 dl_submit = new Gtk.Button.with_label("Activate");
227 dl_submit.set_sensitive(false);
228 dl_submit.clicked += on_submit;
229 button_box.pack_start(dl_submit, true, true, 0);
232 public override void start()
234 ((Gtk.Entry)dl_label.get_child()).set_text("");
238 protected virtual void update()
240 dl_submit.set_sensitive(((Gtk.Entry)dl_label.get_child()).get_text() == "" ? false : true);
243 protected abstract time_t get_deadline();
245 protected void on_label_changed(Gtk.ComboBox e)
250 protected void on_submit(Gtk.Button b)
252 string label = ((Gtk.Entry)dl_label.get_child()).get_text();
253 time_t deadlinets = get_deadline();
254 Time deadline = Time.local(deadlinets);
255 string timespec = deadline.format("%H:%M %m/%d/%Y");
256 zavai.log.info("Scheduling deadline " + label + " at " + timespec);
257 zavai.clock.clock.schedule(timespec, label);
262 public class AddAbsoluteDeadline : AddDeadline
264 protected Gtk.Label dl_day;
265 protected IncDec dl_day_tweak;
266 protected Gtk.Label dl_hour;
267 protected IncDec dl_hour_tweak;
268 protected Gtk.Label dl_min;
269 protected IncDec dl_min_tweak;
270 protected time_t dl_time;
272 public AddAbsoluteDeadline()
274 _label = "Add absolute deadline";
277 dl_day = new Gtk.Label("");
278 dl_day.set_justify(Gtk.Justification.RIGHT);
279 dl_day_tweak = new IncDec();
280 dl_day_tweak.tweaked += on_tweak;
281 var hbox = new Gtk.HBox(false, 0);
282 hbox.pack_start(new Gtk.Label("Day: "), false, false, 0);
283 hbox.pack_start(dl_day, true, true, 0);
284 hbox.pack_start(dl_day_tweak, false, false, 0);
285 pack_start(hbox, false, false, 0);
287 dl_hour = new Gtk.Label("");
288 dl_hour.set_justify(Gtk.Justification.RIGHT);
289 dl_hour_tweak = new IncDec();
290 dl_hour_tweak.tweaked += on_tweak;
291 hbox = new Gtk.HBox(false, 0);
292 hbox.pack_start(new Gtk.Label("Hour: "), false, false, 0);
293 hbox.pack_start(dl_hour, true, true, 0);
294 hbox.pack_start(dl_hour_tweak, false, false, 0);
295 pack_start(hbox, false, false, 0);
297 dl_min = new Gtk.Label("");
298 dl_min.set_justify(Gtk.Justification.RIGHT);
299 dl_min_tweak = new IncDec();
300 dl_min_tweak.tweaked += on_tweak;
301 hbox = new Gtk.HBox(false, 0);
302 hbox.pack_start(new Gtk.Label("Minute: "), false, false, 0);
303 hbox.pack_start(dl_min, true, true, 0);
304 hbox.pack_start(dl_min_tweak, false, false, 0);
305 pack_start(hbox, false, false, 0);
308 public override void start()
314 protected override void update()
316 Time t = Time.local(dl_time);
317 dl_day.set_text(t.format("%a %d %b"));
318 dl_hour.set_text(t.format("%H"));
319 dl_min.set_text(t.format("%M"));
323 protected override time_t get_deadline()
328 protected void on_tweak(IncDec id, int amount)
330 time_t old = dl_time;
331 if (id == dl_day_tweak)
332 dl_time += amount * 3600 * 24;
333 else if (id == dl_hour_tweak)
334 dl_time += amount * 3600;
335 else if (id == dl_min_tweak)
336 dl_time += amount * 60;
337 time_t now = time_t();
344 public class AddRelativeDeadline : AddDeadline
346 protected Gtk.Label dl_hour;
347 protected IncDec dl_hour_tweak;
348 protected Gtk.Label dl_min;
349 protected IncDec dl_min_tweak;
350 protected int dl_time;
352 public AddRelativeDeadline()
354 _label = "Add relative deadline";
357 dl_hour = new Gtk.Label("");
358 dl_hour.set_justify(Gtk.Justification.RIGHT);
359 dl_hour_tweak = new IncDec();
360 dl_hour_tweak.tweaked += on_tweak;
361 var hbox = new Gtk.HBox(false, 0);
362 hbox.pack_start(new Gtk.Label("Hour: "), false, false, 0);
363 hbox.pack_start(dl_hour, true, true, 0);
364 hbox.pack_start(dl_hour_tweak, false, false, 0);
365 pack_start(hbox, false, false, 0);
367 dl_min = new Gtk.Label("");
368 dl_min.set_justify(Gtk.Justification.RIGHT);
369 dl_min_tweak = new IncDec();
370 dl_min_tweak.tweaked += on_tweak;
371 hbox = new Gtk.HBox(false, 0);
372 hbox.pack_start(new Gtk.Label("Minute: "), false, false, 0);
373 hbox.pack_start(dl_min, true, true, 0);
374 hbox.pack_start(dl_min_tweak, false, false, 0);
375 pack_start(hbox, false, false, 0);
378 public override void start()
384 protected override void update()
386 dl_hour.set_text("%2d".printf(dl_time/60));
387 dl_min.set_text("%2d".printf(dl_time%60));
391 protected void on_tweak(IncDec id, int amount)
394 if (id == dl_hour_tweak)
395 dl_time += amount * 60;
396 else if (id == dl_min_tweak)
403 protected override time_t get_deadline()
405 return time_t() + dl_time * 60;
410 public class AddDailyDeadline : Applet
412 public AddDailyDeadline()
414 _label = "Add daily deadline";
419 public Status status;
420 public AddAbsoluteDeadline aad;
421 public AddRelativeDeadline ard;
422 //AddDailyDeadline add;
426 status = new Status("Zavai");
427 aad = new AddAbsoluteDeadline();
428 ard = new AddRelativeDeadline();
430 add = new AddDailyDeadline();
431 zavai.registry.register_applet("clock.adddaily", add);
434 zavai.menu_misc.add_applet(aad);
435 zavai.menu_misc.add_applet(ard);
436 //menu_misc.add_applet("clock.adddaily");