components_Clock.bs

import "pkg:/source/utils/misc.bs"

' @fileoverview Clock component to display current time formatted based on user's chosen 12 or 24 hour setting

' Possible clock formats
enum ClockFormat
    h12 = "12h"
    h24 = "24h"
end enum

sub init()

    ' If hideclick setting is enabled, exit without setting any variables
    if m.global.session.user.settings["ui.design.hideclock"]
        return
    end if

    m.clockTime = m.top.findNode("clockTime")

    m.currentTimeTimer = m.top.findNode("currentTimeTimer")
    m.dateTimeObject = CreateObject("roDateTime")

    m.currentTimeTimer.observeField("fire", "onCurrentTimeTimerFire")
    m.currentTimeTimer.control = "start"

    ' Default to 12 hour clock
    m.format = ClockFormat.h12

    ' If user has selected a 24 hour clock, update date display format
    if LCase(m.global.device.clockFormat) = ClockFormat.h24
        m.format = ClockFormat.h24
    end if
end sub


' onCurrentTimeTimerFire: Code that runs every time the currentTimeTimer fires
'
sub onCurrentTimeTimerFire()
    ' Refresh time variable
    m.dateTimeObject.Mark()

    ' Convert to local time zone
    m.dateTimeObject.ToLocalTime()

    ' Format time for display - based on 12h/24h setting
    formattedTime = formatTimeAsString()

    ' Display time
    m.clockTime.text = formattedTime
end sub

' formatTimeAsString: Returns a string with the current time formatted for either a 12 or 24 hour clock
'
' @return {string} current time formatted for either a 12 hour or 24 hour clock
function formatTimeAsString() as string
    return m.format = ClockFormat.h12 ? format12HourTime() : format24HourTime()
end function

' format12HourTime: Returns a string with the current time formatted for a 12 hour clock
'
' @return {string} current time formatted for a 12 hour clock
function format12HourTime() as string
    currentHour = m.dateTimeObject.GetHours()
    currentMinute = m.dateTimeObject.GetMinutes()

    displayedHour = StrI(currentHour).trim()
    displayedMinute = StrI(currentMinute).trim()
    meridian = currentHour < 12 ? "am" : "pm"

    if currentHour = 0
        displayedHour = "12"
    end if

    if currentHour > 12
        correctedHour = currentHour - 12
        displayedHour = StrI(correctedHour).trim()
    end if

    if currentMinute < 10
        displayedMinute = `0${displayedMinute}`
    end if

    return `${displayedHour}:${displayedMinute} ${meridian}`
end function

' format24HourTime: Returns a string with the current time formatted for a 24 hour clock
'
' @return {string} current time formatted for a 24 hour clock
function format24HourTime() as string
    currentHour = m.dateTimeObject.GetHours()
    currentMinute = m.dateTimeObject.GetMinutes()

    displayedHour = StrI(currentHour).trim()
    displayedMinute = StrI(currentMinute).trim()

    if currentHour < 10
        displayedHour = `0${displayedHour}`
    end if

    if currentMinute < 10
        displayedMinute = `0${displayedMinute}`
    end if

    return `${displayedHour}:${displayedMinute}`
end function