From ab2906b1a6d894ac5c2136a04a13d3372c913d9a Mon Sep 17 00:00:00 2001 From: admar Date: Sun, 8 Jan 2023 22:11:18 +0100 Subject: [PATCH] Add option to select wake up sound --- clock.py | 122 +++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 110 insertions(+), 12 deletions(-) diff --git a/clock.py b/clock.py index 4994927..a1568e8 100644 --- a/clock.py +++ b/clock.py @@ -9,6 +9,7 @@ from kivy.app import App from kivy.uix.floatlayout import FloatLayout from kivy.uix.label import Label from kivy.uix.slider import Slider +from kivy.uix.button import Button from kivy.clock import Clock from kivy.lang import Builder from kivy.graphics import Color, Line, Rectangle @@ -89,11 +90,10 @@ Builder.load_string(''' halign: "left" valign: "middle" text_size: self.size - Label: - text:"wake up sound" - halign: "left" - valign: "middle" - text_size: self.size + Button: + id: settings_menu_wake_up_sound_select_button + on_press: root.settings_menu_wake_up_sound_select_button_cb() + text: str(app.alarm_settings.sound_selected) Label: text:"Wake up brightness" halign: "left" @@ -163,6 +163,47 @@ Builder.load_string(''' halign: "left" valign: "middle" text_size: self.size + FloatLayout + id: settings_menu_wake_up_sound + size_hint: None, None + pos_hint: {"center_x":0.5, "center_y":0.5} + size: 0.7*min(root.size), 0.7*min(root.size) + canvas: + Color: + rgb: 0.1, 0.1, 0.1 + Rectangle: + size: self.size + pos: self.pos + BoxLayout: + orientation: "vertical" + pos_hint: {"center_x":0.5, "center_y":0.5} + Label: + text: "Select wake up sound" + GridLayout: + cols: 2 + CheckBox: + group: "settings_menu_wake_up_sound" + on_active: root.settings_menu_wake_up_sound_cb(self, self.active, "Birds") + id: settings_menu_wake_up_sound_Birds + Label: + text: "Birds" + halign: "left" + valign: "middle" + text_size: self.size + active: True + CheckBox: + group: "settings_menu_wake_up_sound" + on_active: root.settings_menu_wake_up_sound_cb(self, self.active, "NPO Radio 1") + id: settings_menu_wake_up_sound_NpoRadio1 + Label: + text: "NPO Radio 1" + halign: "left" + valign: "middle" + text_size: self.size + Button: + id: settings_menu_wake_up_sound_Ok_button + on_press: root.settings_menu_wake_up_sound_Ok_button_cb() + text: "Ok" ''') Position = collections.namedtuple('Position', 'x y') @@ -181,7 +222,9 @@ class AlarmSettings(): alarm_modified = False led_color = [0, 0, 0] + # sound_selected = "NPO Radio 1" # sound_source = "https://icecast.omroep.nl/radio1-bb-mp3" + sound_selected = "Birds" sound_source = "Woodpecker Chirps - QuickSounds.com.mp3" seconds_to_sunrise = 30 * 60 @@ -200,9 +243,17 @@ class MyClockWidget(FloatLayout): seconds_to_next_alarm = 0 led_color = [0, 0, 0] - # view can be "clock" "set_alarm" "settings" or "calendar" + # view can be one of the following strings: + # - "clock" + # - "set_alarm" + # - "settings_menu" + # - "settings_menu_wake_up_sound" + # - "calendar" view = "clock" + # we need a dirty hack to sensure that radio button is always in sync with selected setting + settings_menu_wake_up_sound_select_button_cb_hack = False + def hide_widget(self, widget, hide=True): if hasattr(widget, 'saved_attrs'): if not hide: @@ -298,7 +349,7 @@ class MyClockWidget(FloatLayout): app = App.get_running_app() alarm_settings = app.alarm_settings - if (self.view == "settings"): + if (self.view.startswith("settings_menu")): source = 'settings_visible.png' rgb = [0.9, 0.0, 0.0] else: @@ -342,6 +393,9 @@ class MyClockWidget(FloatLayout): if alarm_settings.alarm_activated == False: return + if alarm_settings.sound_source == "": + return + if self.seconds_to_next_alarm < 0.1 and sound_process is None: sound_process = Process(target=play_sound, args=(alarm_settings.sound_source,)) sound_process.start() @@ -414,7 +468,10 @@ class MyClockWidget(FloatLayout): Line(points=[hands.center_x, hands.center_y, seconds_hand.x, seconds_hand.y], width=1, cap="round") def update_settings(self): - self.hide_widget(self.ids["settings_menu"], False) + if self.view == "settings_menu": + self.hide_widget(self.ids["settings_menu"], False) + elif self.view == "settings_menu_wake_up_sound": + self.hide_widget(self.ids["settings_menu_wake_up_sound"], False) def update_display(self, *args): self.check_alarm() @@ -423,14 +480,55 @@ class MyClockWidget(FloatLayout): self.hide_widget(self.ids["face"], True) self.hide_widget(self.ids["hands"], True) self.hide_widget(self.ids["settings_menu"], True) + self.hide_widget(self.ids["settings_menu_wake_up_sound"], True) self.update_set_alarm_button() self.update_settings_button() if self.view == "clock" or self.view == "set_alarm": self.update_clock() - elif self.view == "settings": + elif self.view.startswith("settings_menu"): self.update_settings() + def settings_menu_wake_up_sound_select_button_cb(self): + self.settings_menu_wake_up_sound_select_button_cb_hack = True + alarm_settings = App.get_running_app().alarm_settings + self.ids["settings_menu_wake_up_sound_Birds"].active = False + self.ids["settings_menu_wake_up_sound_NpoRadio1"].active = False + print("sound selected: " + alarm_settings.sound_selected) + if alarm_settings.sound_selected == "Birds": + self.ids["settings_menu_wake_up_sound_Birds"].active = True + elif alarm_settings.sound_selected == "NPO Radio 1": + self.ids["settings_menu_wake_up_sound_NpoRadio1"].active = True + + self.view = "settings_menu_wake_up_sound" + + def settings_menu_wake_up_sound_Ok_button_cb(self): + alarm_settings = App.get_running_app().alarm_settings + self.ids["settings_menu_wake_up_sound_select_button"].text = alarm_settings.sound_selected + self.view = "settings_menu" + + def settings_menu_wake_up_sound_cb(self, instance, value, sound): + alarm_settings = App.get_running_app().alarm_settings + + if self.settings_menu_wake_up_sound_select_button_cb_hack: + self.settings_menu_wake_up_sound_select_button_cb_hack = False + if not (alarm_settings.sound_selected == "" and sound != ""): + return + + if value == True: + print("You selected " + sound) + else: + print("You deselected " + sound) + + alarm_settings.sound_source = "" + alarm_settings.sound_selected = "" + if self.ids["settings_menu_wake_up_sound_Birds"].active: + alarm_settings.sound_selected = sound + alarm_settings.sound_source = "Woodpecker Chirps - QuickSounds.com.mp3" + elif self.ids["settings_menu_wake_up_sound_NpoRadio1"].active: + alarm_settings.sound_selected = sound + alarm_settings.sound_source = "https://icecast.omroep.nl/radio1-bb-mp3" + def volume_slider_value(self, *args): alarm_settings = App.get_running_app().alarm_settings alarm_settings.volume = int(args[1]) @@ -475,8 +573,8 @@ class MyClockWidget(FloatLayout): def on_settings_button_pressed(self): print("settings button pressed from view " + self.view) - if self.view != "settings": - self.view = "settings" + if self.view != "settings_menu": + self.view = "settings_menu" else: self.view = "clock" print("view updated to " + self.view) @@ -574,7 +672,7 @@ class MyClockWidget(FloatLayout): elif (hours_hand.x - 0.1 * self.size[0] <= touch.pos[0] <= hours_hand.x + 0.1 * self.size[0]) and \ (hours_hand.y - 0.1 * self.size[1] <= touch.pos[1] <= hours_hand.y + 0.1 * self.size[1]): self.grabbed = "hour" - elif self.view == "settings": + elif self.view == "settings_menu": pass elif self.view == "clock": if sound_process is not None: