X-Git-Url: https://git.toastfreeware.priv.at/gregoa/zavai.git/blobdiff_plain/b7d2ea557115576117f0907353f063845274db94..80776da1373617525043b0c3c5978dbd90a4b303:/src/app_alarm.vala diff --git a/src/app_alarm.vala b/src/app_alarm.vala index c3bfd7c..2d2699b 100644 --- a/src/app_alarm.vala +++ b/src/app_alarm.vala @@ -32,114 +32,123 @@ static long timediff(Posix.timeval* a, Posix.timeval* b) } */ -public class AlarmNotifier : zavai.Resource, Gtk.Window +protected class AlarmNotifierDialog : ui.notify.Notifier { - protected Gtk.VBox vbox; - protected bool shown; protected Gtk.Label message; - protected Gtk.Button ack; - protected uint cancel_timeout; - protected weak clock.AlarmTriggerInfo current = null; + protected Gtk.Button message_button; - public AlarmNotifier() + public AlarmNotifierDialog(string title, string text) { Object( - type: Gtk.WindowType.TOPLEVEL, - title: "Alarm" + notifier_name: "alarm", + title: title ); - shown = false; - destroy_with_parent = true; - set_transient_for(zavai.app); - set_modal(true); - set_position(Gtk.WindowPosition.CENTER_ON_PARENT); - set_size_request(300, 500); - - vbox = new Gtk.VBox(false, 0); - add(vbox); - cancel_timeout = 0; - - //destroy += Gtk.main_quit; - //set_events(get_events() | Gdk.EventMask.VISIBILITY_NOTIFY_MASK); - //visibility_notify_event += on_visibility; - set_skip_pager_hint(true); - set_skip_taskbar_hint(true); - set_type_hint(Gdk.WindowTypeHint.POPUP_MENU); + set_size_request(300, 500); - message = new Gtk.Label("no message"); - vbox.pack_start(message, false, true, 0); + add_button(Gtk.STOCK_OK, Gtk.ResponseType.OK); + add_button(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL); + set_default_response(Gtk.ResponseType.OK); - ack = new Gtk.Button.with_label("Ack"); - ack.clicked += on_iface_ack; - vbox.pack_start(ack, true, true, 0); + weak Gtk.VBox vbox = (Gtk.VBox)get_content_area(); - //vbox.show_all(); - zavai.registry.register(this); + message = new Gtk.Label(text); + message_button = new Gtk.Button(); + message_button.set_image(message); + message_button.clicked += (b) => { response(Gtk.ResponseType.OK); }; + vbox.pack_start(message_button, true, true, 0); + message_button.show(); + } - clock.alarm_trigger_queue.triggered += on_trigger; - clock.alarm_trigger_queue.acked += on_done; - clock.alarm_trigger_queue.canceled += on_done; + protected override bool push_aux_state() + { + var state = new zavai.led.LedState(notifier_name); + state.set_blink(255); + zavai.led.aux.push_state(state); + return true; } - protected void abort_timeout() + protected override bool push_vibrator_state() { - if (cancel_timeout != 0) - { - Source.remove(cancel_timeout); - cancel_timeout = 0; - } + var state = new zavai.led.LedState(notifier_name); + state.set_blink(255); + zavai.led.vibrator.push_state(state); + return true; } - protected void on_iface_ack() + protected override bool push_ringtone_state() { - if (current == null) return; - clock.alarm_trigger_queue.ack(current); + var state = new zavai.audio.PlayerState(notifier_name, config.ringtone_alarm, true); + zavai.audio.soundplayer.push_state(state); + return true; } +} - protected bool on_iface_timeout() +public class AlarmNotifier : zavai.Resource, ui.notify.Notifier +{ + protected weak clock.AlarmTriggerInfo current = null; + protected AlarmNotifierDialog dialog = null; + + public AlarmNotifier() { - if (current == null) return false; - clock.alarm_trigger_queue.cancel(current); - return false; + zavai.registry.register(this); + + clock.alarm_trigger_queue.triggered += on_trigger; + clock.alarm_trigger_queue.acked += on_done; + clock.alarm_trigger_queue.canceled += on_done; } public void on_trigger(clock.AlarmTriggerInfo info) { current = info; - message.set_text(info.label); + dialog = new AlarmNotifierDialog("Alarm", info.label); - ui.power.backlight.request("alarmnotifier"); + if (zavai.led.auxbutton != null) + zavai.led.auxbutton.event += on_auxbutton; - if (!shown) + uint cancel_timeout = 0; + cancel_timeout = Timeout.add(30 * 1000, () => { + dialog.response(Gtk.ResponseType.CANCEL); + cancel_timeout = 0; + return false; + }); + int res = dialog.run(); + if (cancel_timeout != 0) Source.remove(cancel_timeout); + switch (res) { - show_all(); - show(); - visible = true; - present(); - shown = true; - } else { - // TODO: do more in case it is visible but has no visibility (is covered by others) - visible = !visible; - if (visible) - present(); + case Gtk.ResponseType.OK: + clock.alarm_trigger_queue.ack(current); + break; + case Gtk.ResponseType.CANCEL: + clock.alarm_trigger_queue.cancel(current); + break; } - abort_timeout(); - cancel_timeout = Timeout.add(30 * 1000, on_iface_timeout); + if (zavai.led.auxbutton != null) + zavai.led.auxbutton.event -= on_auxbutton; + + dialog.destroy(); + dialog = null; + current = null; + } + + protected bool on_auxbutton(ulong time, bool pressed) + { + if (dialog == null) return false; + dialog.response(Gtk.ResponseType.OK); + return true; } public void on_done(clock.AlarmTriggerInfo info) { - if (current == null || current != info) return; - visible = false; - abort_timeout(); - current = null; - ui.power.backlight.release("alarmnotifier"); + if (current == null || dialog == null || current != info) return; + dialog.response(Gtk.ResponseType.NONE); } public void shutdown() { - abort_timeout(); + if (dialog == null) return; + dialog.response(Gtk.ResponseType.CANCEL); } }