class application:
    def __init__(self):
        # load the config file
        self.config = config()
        self.ui = gui.Gui(self.config.setting["resolution"],
                          self.config.setting["fg_color"],
                          self.config.setting["bg_color"],
                          self.config.setting["show_mouse_cursor"],
                          quit_function=self.cleanup)
        locale.setlocale(locale.LC_ALL,
                         self.config.setting["locale"] + ".utf8")

        self.musicplayer = MusicPlayer(self.config.setting["mopidy_host"],
                                       shuffle=self.config.setting["shuffle"])
        self.alarm = Alarm(self.config.setting["alarmtime"],
                           self.config.setting["snooze"], self.musicplayer)
        self.alarm.alarm_active = False
        if self.config.setting["enabled"] == "1":
            self.alarm.enableAlarm()
        else:
            self.alarm.disableAlarm()
        self.player_primed = False

        self.is_idle = False
        self.time_last_idle = time.time()
        self.check_idle_thread = threading.Thread(target=self.check_idle)
        self.check_idle_thread.daemon = True
        self.check_idle_thread.start()
        self.old_time = 0

        self.current_screen = self.idlescreen
        self.switch_to_defaultscreen()

        self.loop()

    def check_idle(self):
        while True:
            if time.time() - self.time_last_idle > 30:
                self.time_last_idle = time.time()
                self.is_idle = True
            time.sleep(1)

    def cleanup(self):
        print("bye")

    def cache_idlescreen(self):
        self.idlescreen_cache = {}
        time_string = datetime.now().strftime(
            self.config.setting["timeformat"])
        timefont_size = self.ui.calculate_font_size(30)
        fontcolor = pygame.color.Color(50, 50, 50, 255)
        self.idlescreen_cache["time_text"] = gui.Text(
            time_string,
            timefont_size,
            color=fontcolor,
            font=self.ui.basefont_file,
            shadowoffset=(0.5, 0.5))
        self.idlescreen_cache[
            "time_text"].Position = self.ui.calculate_position(
                (0, 0), self.idlescreen_cache["time_text"].Surface, "center",
                "center")

        empty_image = pygame.Surface(self.ui.display_size)

        def reset_idle():
            self.is_idle = False

        self.idlescreen_cache["button"] = gui.Button(empty_image,
                                                     self.ui.display_size,
                                                     reset_idle)
        self.idlescreen_cache["button"].Position = (0, 0)

    def idlescreen(self):
        if not hasattr(self, 'idlescreen_cache'):
            self.cache_idlescreen()
        new_time = int(time.time())
        if new_time != self.old_time:
            self.old_time = new_time
            self.cache_idlescreen()
        self.ui.elements.append(self.idlescreen_cache["button"])
        self.ui.elements.append(self.idlescreen_cache["time_text"])

    def cache_clockscreen(self):
        self.clockscreen_cache = {}

        time_string = datetime.now().strftime(
            self.config.setting["timeformat"])
        timefont_size = self.ui.calculate_font_size(30)

        self.clockscreen_cache["time_text"] = gui.Text(
            time_string,
            timefont_size,
            font=self.ui.basefont_file,
            shadowoffset=(0.5, 0.5))
        self.clockscreen_cache[
            "time_text"].Position = self.ui.calculate_position(
                (0, 0), self.clockscreen_cache["time_text"].Surface, "center",
                "center")

    def clockscreen(self):
        if not hasattr(self, 'clockscreen_cache'):
            self.cache_clockscreen()

        new_time = int(datetime.now().minute)
        if new_time != self.old_time:
            self.old_time = new_time
            self.cache_clockscreen()

        self.ui.elements.append(self.clockscreen_cache["time_text"])

        self.player_widget("play")
        self.datewidget()
        self.alarm_widget()

    def cache_alarmscreen(self):

        self.alarmscreen_cache = {}
        icon_size = (self.ui.display_size[0] * .3,
                     self.ui.display_size[1] * .3)
        icon_size_awake = (self.ui.display_size[0] * .2,
                           self.ui.display_size[1] * .2)
        icon_size_enable = (self.ui.display_size[0] * .1,
                            self.ui.display_size[1] * .1)

        epoch = int(time.time())
        if (epoch % 2) == 0:
            fgcolor = self.ui.bg_color
            bgcolor = self.ui.fg_color
            shadow = False
        else:
            fgcolor = self.ui.fg_color
            bgcolor = pygame.Color(0, 0, 0, 0)
            shadow = True

        self.alarmscreen_cache["background"] = gui.GuiObject()
        self.alarmscreen_cache["background"].Surface = pygame.Surface(
            self.ui.display_size, flags=pygame.SRCALPHA)
        self.alarmscreen_cache["background"].Position = (0, 0)
        self.alarmscreen_cache["background"].Surface.fill(bgcolor)

        current_time_text = str(datetime.now().strftime(
            self.config.setting["timeformat"]))

        self.alarmscreen_cache["alarm_button"] = gui.Button(
            self.ui.image_cache["alarm-snooze.png"], icon_size,
            self.snooze_alarm)
        self.alarmscreen_cache[
            "alarm_button"].Position = self.ui.calculate_position(
                (0, -55), self.alarmscreen_cache["alarm_button"].Surface,
                "center", "center")

        self.alarmscreen_cache["alarm_disabled_button"] = gui.Button(
            self.ui.image_cache["alarm-disabled-symbolic.png"], icon_size,
            self.stop_alarm)
        self.alarmscreen_cache[
            "alarm_disabled_button"].Position = self.ui.calculate_position(
                (0, -55),
                self.alarmscreen_cache["alarm_disabled_button"].Surface,
                "center", "center")

        self.alarmscreen_cache["alarm_edit_enabled_button"] = gui.Button(
            self.ui.image_cache["alarm-edit-enabled.png"], icon_size_enable,
            self.disable_alarm)
        self.alarmscreen_cache[
            "alarm_edit_enabled_button"].Position = self.ui.calculate_position(
                (1, 4),
                self.alarmscreen_cache["alarm_edit_enabled_button"].Surface,
                "top", "left")

        self.alarmscreen_cache["alarm_edit_disabled_button"] = gui.Button(
            self.ui.image_cache["alarm-edit-disabled.png"], icon_size_enable,
            self.enable_alarm)
        self.alarmscreen_cache[
            "alarm_edit_disabled_button"].Position = self.ui.calculate_position(
                (1, 4),
                self.alarmscreen_cache["alarm_edit_disabled_button"].Surface,
                "top", "left")

        self.alarmscreen_cache["awake_button"] = gui.Button(
            self.ui.image_cache["awake-symbolic.png"], icon_size_awake,
            self.awake)
        self.alarmscreen_cache[
            "awake_button"].Position = self.ui.calculate_position(
                (1, -4), self.alarmscreen_cache["awake_button"].Surface, "top",
                "right")

        timefont_size = self.ui.calculate_font_size(25)

        time_text = gui.Text(current_time_text,
                             timefont_size,
                             font=self.ui.boldfont_file,
                             color=fgcolor,
                             shadow=shadow)

        self.alarmscreen_cache["time_text_button"] = gui.Button(
            time_text.Surface, time_text.Surface.get_size(), self.stop_alarm)
        self.alarmscreen_cache[
            "time_text_button"].Position = self.ui.calculate_position(
                (0, -30), self.alarmscreen_cache["alarm_button"].Surface,
                "center", "center")
        self.alarmscreen_cache["time_text_button"].Position = (
            self.alarmscreen_cache["alarm_button"].Position[0] +
            icon_size[1] * 1.2,
            self.alarmscreen_cache["alarm_button"].Position[1])

    def alarmscreen(self):
        self.enable_alarm()

        if not hasattr(self, 'alarmscreen_cache'):
            self.cache_alarmscreen()

        if not self.musicplayer.playing and not self.player_primed:
            self.player_primed = True
            self.musicplayer.setAlarmPlaylist()
            self.musicplayer.play()

        new_time = int(time.time())
        if new_time != self.old_time:
            self.old_time = new_time
            self.cache_alarmscreen()

        self.ui.elements.append(self.alarmscreen_cache["background"])
        self.ui.elements.append(self.alarmscreen_cache["time_text_button"])
        self.ui.elements.append(self.alarmscreen_cache["awake_button"])
        if self.alarm.enabled:
            self.ui.elements.append(self.alarmscreen_cache["alarm_button"])
            self.ui.elements.append(
                self.alarmscreen_cache["alarm_edit_enabled_button"])
        else:
            self.ui.elements.append(
                self.alarmscreen_cache["alarm_disabled_button"])
            self.ui.elements.append(
                self.alarmscreen_cache["alarm_edit_disabled_button"])

    def cache_musicscreen(self):
        self.musicscreen_cache = {}
        self.musicplayer.trackdata_changed = False

        if self.musicplayer.image != None:
            albumart_image_size = (self.ui.display_size[0] * .25,
                                   self.ui.display_size[1] * .5)
            self.musicscreen_cache["albumart_image"] = gui.Image(
                self.musicplayer.image, albumart_image_size)
        else:
            self.musicscreen_cache["albumart_image"] = gui.Image(
                pygame.Surface((1, 1), flags=pygame.SRCALPHA))

        self.musicscreen_cache[
            "albumart_image"].Position = self.ui.calculate_position(
                (0, 4), self.musicscreen_cache["albumart_image"].Surface,
                "center", "left")

        track = self.musicplayer.title
        trackfont_size = self.ui.calculate_font_size(4)

        self.musicscreen_cache["track_text"] = gui.Text(
            track, trackfont_size, font=self.ui.boldfont_file, wrapwidth=16)
        self.musicscreen_cache[
            "track_text"].Position = self.ui.calculate_position(
                (0, 0), self.musicscreen_cache["track_text"].Surface, "center",
                "left")

        self.musicscreen_cache["track_text"].Position = (
            self.musicscreen_cache["albumart_image"].Position[0] +
            self.musicscreen_cache["albumart_image"].Surface.get_size()[0] *
            1.05, self.musicscreen_cache["track_text"].Position[1])

        artistfont_size = self.ui.calculate_font_size(3)
        self.musicscreen_cache["artist_text"] = gui.Text(
            self.musicplayer.artist,
            artistfont_size,
            font=self.ui.basefont_file)

        artist_text_y = self.musicscreen_cache["track_text"].Position[1] - (
            self.ui.display_size[1] * 0.08)
        self.musicscreen_cache["artist_text"].Position = (
            self.musicscreen_cache["track_text"].Position[0], artist_text_y)

        self.musicscreen_cache["album_text"] = gui.Text(
            self.musicplayer.album,
            artistfont_size,
            font=self.ui.basefont_file)
        album_text_y = ((self.ui.display_size[1] * 0.03) +
                        self.musicscreen_cache["track_text"].Rect.bottom)
        self.musicscreen_cache["album_text"].Position = (
            self.musicscreen_cache["track_text"].Position[0], album_text_y)

    def musicscreen(self):
        if not hasattr(
                self,
                'musicscreen_cache') or self.musicplayer.trackdata_changed:
            self.cache_musicscreen()

        self.player_widget()
        self.datewidget(True)
        self.alarm_widget()
        self.ui.elements.append(self.musicscreen_cache["albumart_image"])
        self.ui.elements.append(self.musicscreen_cache["artist_text"])
        self.ui.elements.append(self.musicscreen_cache["track_text"])
        self.ui.elements.append(self.musicscreen_cache["album_text"])

    def cache_player_widget(self):
        self.player_widget_cache = {}
        icon_size = (self.ui.display_size[0] * .15,
                     self.ui.display_size[1] * .15)
        panel_size = (self.ui.display_size[0], self.ui.display_size[1] * .15)
        self.player_widget_cache["panel"] = gui.GuiObject()
        self.player_widget_cache["panel"].Surface = pygame.Surface(
            panel_size, flags=pygame.SRCALPHA)
        self.player_widget_cache[
            "panel"].Position = self.ui.calculate_position(
                (0, 0), self.player_widget_cache["panel"].Surface, "bottom",
                "left")
        gui.fill_gradient(self.player_widget_cache["panel"].Surface,
                          pygame.Color(0, 0, 0, 0),
                          pygame.Color(0, 0, 0, 255),
                          vertical=True)

        self.player_widget_cache["play_button"] = gui.Button(
            self.ui.image_cache["play.png"], icon_size,
            self.musicplayer.togglePlay)
        self.player_widget_cache["pause_button"] = gui.Button(
            self.ui.image_cache["pause.png"], icon_size,
            self.musicplayer.togglePlay)
        self.player_widget_cache[
            "play_button"].Position = self.player_widget_cache[
                "pause_button"].Position = self.ui.calculate_position(
                    (0, -18), self.player_widget_cache["play_button"].Surface,
                    "bottom", "right")

        self.player_widget_cache["sf_button"] = gui.Button(
            self.ui.image_cache["sf.png"], icon_size, self.musicplayer.skip)
        self.player_widget_cache["sf_button"].Position = (
            self.player_widget_cache["play_button"].Position[0] + icon_size[1],
            self.player_widget_cache["play_button"].Position[1])

        self.player_widget_cache["sb_button"] = gui.Button(
            self.ui.image_cache["sb.png"], icon_size, self.musicplayer.back)
        self.player_widget_cache["sb_button"].Position = (
            self.player_widget_cache["play_button"].Position[0] - icon_size[1],
            self.player_widget_cache["play_button"].Position[1])

        self.player_widget_cache["volup_button"] = gui.Button(
            self.ui.image_cache["volup.png"], icon_size,
            self.musicplayer.volup)
        self.player_widget_cache[
            "volup_button"].Position = self.ui.calculate_position(
                (0, 32), self.player_widget_cache["play_button"].Surface,
                "bottom", "left")

        self.player_widget_cache["volmute"] = gui.Button(
            self.ui.image_cache["volmute.png"], icon_size,
            self.musicplayer.toggleMute)
        self.player_widget_cache["vollow"] = gui.Button(
            self.ui.image_cache["vollow.png"], icon_size,
            self.musicplayer.toggleMute)
        self.player_widget_cache["volmed"] = gui.Button(
            self.ui.image_cache["volmed.png"], icon_size,
            self.musicplayer.toggleMute)
        self.player_widget_cache["volhigh"] = gui.Button(
            self.ui.image_cache["volhigh.png"], icon_size,
            self.musicplayer.toggleMute)

        self.player_widget_cache["volmute"].Position = self.player_widget_cache[
            "volhigh"].Position = self.player_widget_cache[
                "volmed"].Position = self.player_widget_cache[
                    "vollow"].Position = (
                        self.player_widget_cache["volup_button"].Position[0] -
                        icon_size[1],
                        self.player_widget_cache["volup_button"].Position[1])

        self.player_widget_cache["voldown_button"] = gui.Button(
            self.ui.image_cache["voldown.png"], icon_size,
            self.musicplayer.voldown)
        self.player_widget_cache["voldown_button"].Position = (
            self.player_widget_cache["volmute"].Position[0] - icon_size[1],
            self.player_widget_cache["volmute"].Position[1])

    def player_widget(self, style=""):
        if not hasattr(self, 'player_widget_cache'):
            self.cache_player_widget()

        if self.musicplayer.playing:
            icon = "pause_button"
        else:
            icon = "play_button"

        self.ui.elements.append(self.player_widget_cache["panel"])
        self.ui.elements.append(self.player_widget_cache[icon])

        if style != "play":

            if self.musicplayer.muted:
                volume_icon = "volmute"
            elif self.musicplayer.volume < 34:
                volume_icon = "vollow"
            elif self.musicplayer.volume < 66:
                volume_icon = "volmed"
            else:
                volume_icon = "volhigh"

            self.ui.elements.append(self.player_widget_cache["sf_button"])
            self.ui.elements.append(self.player_widget_cache["sb_button"])

            self.ui.elements.append(self.player_widget_cache["volup_button"])
            self.ui.elements.append(self.player_widget_cache["voldown_button"])
            self.ui.elements.append(self.player_widget_cache[volume_icon])

    def switch_to_defaultscreen(self, reset=False):
        if self.alarm.alarm_active:
            self.is_idle = False
            self.current_screen = self.alarmscreen
            return

        if self.is_idle and self.current_screen != self.musicscreen and self.current_screen != self.alarmscreen:
            self.ui.redraw = True
            self.current_screen = self.idlescreen
            return

        if self.current_screen != self.alarmset_screen or reset:
            if self.alarm.alarm_active:
                self.ui.redraw = True
                self.current_screen = self.alarmscreen
            elif self.musicplayer.playing:
                self.ui.redraw = True
                self.current_screen = self.musicscreen
            else:
                self.ui.redraw = True
                self.current_screen = self.clockscreen

    def cache_datewidget(self):
        self.datewidget_cache = {}
        datefont_size = self.ui.calculate_font_size(4)

        datetime_text = (
            datetime.now().strftime(self.config.setting["dateformat"]) + "  " +
            datetime.now().strftime(
                self.config.setting["timeformat"])).upper()
        self.datetime_text = datetime_text

        date_text = datetime.now().strftime(
            self.config.setting["dateformat"]).upper()

        self.datewidget_cache["datetime_text"] = gui.Text(
            datetime_text, datefont_size, self.ui.boldfont_file)

        self.datewidget_cache["date_text"] = gui.Text(date_text, datefont_size,
                                                      self.ui.boldfont_file)

        self.datewidget_cache[
            "datetime_text"].Position = self.ui.calculate_position(
                (1, -3), self.datewidget_cache["datetime_text"].Surface, "top",
                "right")
        self.datewidget_cache[
            "date_text"].Position = self.ui.calculate_position(
                (1, -3), self.datewidget_cache["date_text"].Surface, "top",
                "right")

    def datewidget(self, time=False):
        datetime_text = (
            datetime.now().strftime(self.config.setting["dateformat"]) + "  " +
            datetime.now().strftime(
                self.config.setting["timeformat"])).upper()
        if not hasattr(
                self,
                'datewidget_cache') or self.datetime_text != datetime_text:
            self.cache_datewidget()

        if time:
            self.ui.elements.append(self.datewidget_cache["datetime_text"])
        else:
            self.ui.elements.append(self.datewidget_cache["date_text"])

    def switch_to_alarmset_screen(self):
        self.current_screen = self.alarmset_screen
        self.ui.redraw = True

    def cache_alarm_widget(self, updatetime=False):
        icon_size = (self.ui.display_size[0] * .05,
                     self.ui.display_size[1] * .05)
        icon_size_enable = (self.ui.display_size[0] * .1,
                            self.ui.display_size[1] * .1)
        if not updatetime:
            self.alarm_widget_cache = {}
            self.alarm_widget_cache["alarm_image_button"] = gui.Button(
                self.ui.image_cache["alarm-symbolic.png"], icon_size,
                self.switch_to_alarmset_screen)
            self.alarm_widget_cache[
                "alarm_image_button"].Position = self.ui.calculate_position(
                    (1, 4),
                    self.alarm_widget_cache["alarm_image_button"].Surface,
                    "top", "left")

            self.alarm_widget_cache[
                "alarm_image_disabled_button"] = gui.Button(
                    self.ui.image_cache["alarm-disabled-symbolic.png"],
                    icon_size, self.switch_to_alarmset_screen)
            self.alarm_widget_cache[
                "alarm_image_disabled_button"].Position = self.ui.calculate_position(
                    (1, 4), self.
                    alarm_widget_cache["alarm_image_disabled_button"].Surface,
                    "top", "left")

            self.alarm_widget_cache["alarm_snooze_button"] = gui.Button(
                self.ui.image_cache["alarm-snooze.png"], icon_size,
                self.alarm.turnOffSnooze)
            self.alarm_widget_cache[
                "alarm_snooze_button"].Position = self.ui.calculate_position(
                    (1, 4),
                    self.alarm_widget_cache["alarm_snooze_button"].Surface,
                    "top", "left")

        self.alarm_widget_cache["time"] = str(
            self.alarm.alarmtime.strftime(
                self.config.setting["timeformat"])).upper()
        alarmfont_size = self.ui.calculate_font_size(4.5)
        alarm_text = gui.Text(self.alarm_widget_cache["time"], alarmfont_size,
                              self.ui.boldfont_file)
        self.alarm_widget_cache["alarm_text_button"] = gui.Button(
            alarm_text.Surface, alarm_text.Surface.get_size(),
            self.switch_to_alarmset_screen)
        self.alarm_widget_cache["alarm_text_button"].Position = (
            self.alarm_widget_cache["alarm_image_button"].Position[0] +
            (icon_size[1] * 1.1) + 20,
            self.alarm_widget_cache["alarm_image_button"].Position[1] * 1.2)

        self.alarm_widget_cache["alarm_edit_enabled_button"] = gui.Button(
            self.ui.image_cache["alarm-edit-enabled.png"], icon_size_enable,
            self.disable_alarm)
        self.alarm_widget_cache[
            "alarm_edit_enabled_button"].Position = self.ui.calculate_position(
                (0, 0),
                self.alarm_widget_cache["alarm_edit_enabled_button"].Surface,
                "top", "center")

        self.alarm_widget_cache["alarm_edit_disabled_button"] = gui.Button(
            self.ui.image_cache["alarm-edit-disabled.png"], icon_size_enable,
            self.enable_alarm)
        self.alarm_widget_cache[
            "alarm_edit_disabled_button"].Position = self.ui.calculate_position(
                (0, 0),
                self.alarm_widget_cache["alarm_edit_disabled_button"].Surface,
                "top", "center")

    def alarm_widget(self):
        if not hasattr(self, 'alarm_widget_cache'):
            self.cache_alarm_widget()

        current_time_text = str(
            self.alarm.alarmtime.strftime(
                self.config.setting["timeformat"])).upper()

        if self.alarm_widget_cache["time"] != current_time_text:
            self.cache_alarm_widget(updatetime=True)

        self.ui.elements.append(self.alarm_widget_cache["alarm_text_button"])
        if self.alarm.snooze and not self.alarm.alarm_active:
            self.ui.elements.append(
                self.alarm_widget_cache["alarm_snooze_button"])
            self.ui.elements.append(
                self.alarm_widget_cache["alarm_edit_enabled_button"])
        elif self.alarm.enabled:
            self.ui.elements.append(
                self.alarm_widget_cache["alarm_image_button"])
            self.ui.elements.append(
                self.alarm_widget_cache["alarm_edit_enabled_button"])
        else:
            self.ui.elements.append(
                self.alarm_widget_cache["alarm_image_disabled_button"])
            self.ui.elements.append(
                self.alarm_widget_cache["alarm_edit_disabled_button"])

    def cache_alarmset_screen(self):
        self.alarmset_screen_cache = {}

        def changeAlarmTime(m):
            delattr(self, 'alarmset_screen_cache')
            self.alarm.changeAlarm(m)

        alarmtime_text = self.alarm.time.strftime(
            self.config.setting["timeformat"])
        alarmtime_size = self.ui.calculate_font_size(22)
        self.alarmset_screen_cache["alarmtime"] = gui.Text(
            alarmtime_text,
            alarmtime_size,
            self.ui.boldfont_file,
            shadowoffset=(0.5, 0.5))
        self.alarmset_screen_cache[
            "alarmtime"].Position = self.ui.calculate_position(
                (0, -14), self.alarmset_screen_cache["alarmtime"].Surface,
                "center", "right")

        icon_size = (self.ui.display_size[0] * .25,
                     self.ui.display_size[1] * .25)

        big_icon_size = (self.ui.display_size[0] * .33,
                         self.ui.display_size[1] * .33)

        self.alarmset_screen_cache["addminute_button"] = gui.Button(
            self.ui.image_cache["add.png"], icon_size,
            lambda: changeAlarmTime(1), lambda: changeAlarmTime(5))
        self.alarmset_screen_cache[
            "addminute_button"].Position = self.ui.calculate_position(
                (-15, -20),
                self.alarmset_screen_cache["addminute_button"].Surface,
                "center", "right")

        self.alarmset_screen_cache["subminute_button"] = gui.Button(
            self.ui.image_cache["sub.png"], icon_size,
            lambda: changeAlarmTime(-1), lambda: changeAlarmTime(-5))
        self.alarmset_screen_cache[
            "subminute_button"].Position = self.ui.calculate_position(
                (15, -20),
                self.alarmset_screen_cache["subminute_button"].Surface,
                "center", "right")

        self.alarmset_screen_cache["addhour_button"] = gui.Button(
            self.ui.image_cache["add.png"], icon_size,
            lambda: changeAlarmTime(60))
        self.alarmset_screen_cache[
            "addhour_button"].Position = self.ui.calculate_position(
                (-15, -65),
                self.alarmset_screen_cache["addhour_button"].Surface, "center",
                "right")

        self.alarmset_screen_cache["subhour_button"] = gui.Button(
            self.ui.image_cache["sub.png"], icon_size,
            lambda: changeAlarmTime(-60))
        self.alarmset_screen_cache[
            "subhour_button"].Position = self.ui.calculate_position(
                (15, -65),
                self.alarmset_screen_cache["subhour_button"].Surface, "center",
                "right")

        self.alarmset_screen_cache["cancel_button"] = gui.Button(
            self.ui.image_cache["cancel.png"], big_icon_size, self.reset_alarm)
        self.alarmset_screen_cache[
            "cancel_button"].Position = self.ui.calculate_position(
                (-15, 25), self.alarmset_screen_cache["cancel_button"].Surface,
                "center", "left")

        self.alarmset_screen_cache["ok_button"] = gui.Button(
            self.ui.image_cache["ok.png"], big_icon_size, self.set_alarm)
        self.alarmset_screen_cache[
            "ok_button"].Position = self.ui.calculate_position(
                (15, 25), self.alarmset_screen_cache["ok_button"].Surface,
                "center", "left")

    def alarmset_screen(self):
        if not hasattr(self, 'alarmset_screen_cache'):
            self.cache_alarmset_screen()
        self.ui.redraw = True

        self.ui.elements.append(self.alarmset_screen_cache["alarmtime"])

        self.ui.elements.append(self.alarmset_screen_cache["addminute_button"])
        self.ui.elements.append(self.alarmset_screen_cache["subminute_button"])
        self.ui.elements.append(self.alarmset_screen_cache["addhour_button"])
        self.ui.elements.append(self.alarmset_screen_cache["subhour_button"])

        self.ui.elements.append(self.alarmset_screen_cache["ok_button"])
        self.ui.elements.append(self.alarmset_screen_cache["cancel_button"])

    def set_alarm(self):
        self.alarm.setAlarm()
        self.config.setting["alarmtime"] = self.alarm.alarmtime.strftime(
            "%H:%M")
        self.config.save()
        self.switch_to_defaultscreen(True)

    def reset_alarm(self):
        self.alarm.resetAlarm()
        self.switch_to_defaultscreen(True)

    def stop_alarm(self):
        self.alarm.alarm_active = False
        self.player_primed = False
        self.current_screen = self.clockscreen
        self.ui.redraw = True

    def snooze_alarm(self):
        self.alarm.alarm_active = False
        self.player_primed = False
        self.current_screen = self.clockscreen
        self.alarm.turnOnSnooze()
        self.ui.redraw = True

    def awake(self):
        self.alarm.alarm_active = False
        self.player_primed = False
        self.current_screen = self.clockscreen()
        self.ui.redraw = True

    def disable_alarm(self):
        self.alarm.disableAlarm()
        self.alarm.alarm_active = False
        self.player_primed = False
        self.current_screen = self.clockscreen
        self.alarm.turnOffSnooze()
        self.config.setting["enabled"] = "0"
        self.config.save()
        self.ui.redraw = True

    def enable_alarm(self):
        self.alarm.enableAlarm()
        self.current_screen = self.clockscreen
        self.config.setting["enabled"] = "1"
        self.config.save()
        self.ui.redraw = True

    def alarm_triggered(self):
        self.current_screen == self.alarmscreen
        self.alarm.alarm_active = True
        self.ui.redraw = True
        self.musicplayer.setAlarmPlaylist()
        if not self.musicplayer.playing:
            self.musicplayer.play()

    # the main loop
    def loop(self):
        while True:
            self.ui.elements.clear()
            self.switch_to_defaultscreen()
            if self.current_screen != None:
                self.current_screen()

            self.ui.update()