2019-10-12 20:21:34 +00:00
|
|
|
function isNodeEvent(msg, field as string) as boolean
|
2019-03-10 05:28:28 +00:00
|
|
|
return type(msg) = "roSGNodeEvent" and msg.getField() = field
|
|
|
|
end function
|
2019-03-09 22:09:21 +00:00
|
|
|
|
2019-10-15 02:01:20 +00:00
|
|
|
|
2019-10-15 02:43:44 +00:00
|
|
|
function getMsgPicker(msg, subnode = "" as string) as object
|
2019-03-07 03:14:52 +00:00
|
|
|
node = msg.getRoSGNode()
|
2019-04-15 00:16:47 +00:00
|
|
|
' Subnode allows for handling alias messages
|
|
|
|
if subnode <> ""
|
2019-04-14 23:34:50 +00:00
|
|
|
node = node.findNode(subnode)
|
|
|
|
end if
|
2019-03-07 03:14:52 +00:00
|
|
|
coords = node.rowItemSelected
|
|
|
|
target = node.content.getChild(coords[0]).getChild(coords[1])
|
|
|
|
return target
|
2019-03-10 05:28:28 +00:00
|
|
|
end function
|
|
|
|
|
2019-10-15 02:43:44 +00:00
|
|
|
function getButton(msg, subnode = "buttons" as string) as object
|
2019-10-12 21:00:07 +00:00
|
|
|
buttons = msg.getRoSGNode().findNode(subnode)
|
2021-04-14 07:03:15 +00:00
|
|
|
if buttons = invalid return invalid
|
2019-10-12 21:00:07 +00:00
|
|
|
active_button = buttons.focusedChild
|
|
|
|
return active_button
|
|
|
|
end function
|
2019-03-19 18:27:30 +00:00
|
|
|
|
2019-03-14 03:01:05 +00:00
|
|
|
function leftPad(base as string, fill as string, length as integer) as string
|
|
|
|
while len(base) < length
|
|
|
|
base = fill + base
|
|
|
|
end while
|
|
|
|
return base
|
|
|
|
end function
|
2019-03-17 17:38:21 +00:00
|
|
|
|
2020-02-22 00:50:20 +00:00
|
|
|
function ticksToHuman(ticks as longinteger) as string
|
|
|
|
totalSeconds = int(ticks / 10000000)
|
|
|
|
hours = stri(int(totalSeconds / 3600)).trim()
|
|
|
|
minutes = stri(int((totalSeconds - (val(hours)*3600))/60)).trim()
|
|
|
|
seconds = stri(totalSeconds - (val(hours)*3600) - (val(minutes)*60)).trim()
|
|
|
|
if val(hours) > 0 and val(minutes) < 10 then minutes = "0" + minutes
|
|
|
|
if val(seconds) < 10 then seconds = "0" + seconds
|
|
|
|
r=""
|
2020-02-22 02:00:08 +00:00
|
|
|
if val(hours) > 0 then r = hours + ":"
|
2020-02-22 00:50:20 +00:00
|
|
|
r = r + minutes + ":" + seconds
|
|
|
|
return r
|
|
|
|
end function
|
|
|
|
|
2020-04-10 08:04:48 +00:00
|
|
|
' Format time as 12 or 24 hour format based on system clock setting
|
|
|
|
function formatTime(time) as string
|
|
|
|
hours = time.getHours()
|
|
|
|
minHourDigits = 1
|
|
|
|
di = CreateObject("roDeviceInfo")
|
|
|
|
if di.GetClockFormat() = "12h" then
|
|
|
|
meridian = "AM"
|
|
|
|
if hours = 0
|
|
|
|
hours = 12
|
|
|
|
meridian = "AM"
|
|
|
|
else if hours = 12
|
|
|
|
hours = 12
|
|
|
|
meridian = "PM"
|
|
|
|
else if hours > 12
|
|
|
|
hours = hours - 12
|
|
|
|
meridian = "PM"
|
|
|
|
end if
|
|
|
|
else
|
|
|
|
' For 24hr Clock, no meridian and pad hours to 2 digits
|
|
|
|
minHourDigits = 2
|
|
|
|
meridian = ""
|
|
|
|
end if
|
|
|
|
|
|
|
|
return Substitute("{0}:{1} {2}", leftPad(stri(hours).trim(), "0", minHourDigits), leftPad(stri(time.getMinutes()).trim(), "0", 2), meridian)
|
|
|
|
|
|
|
|
end function
|
|
|
|
|
2019-10-17 02:40:50 +00:00
|
|
|
function div_ceiling(a as integer, b as integer) as integer
|
|
|
|
if a < b then return 1
|
|
|
|
if int(a/b) = a/b then
|
|
|
|
return a/b
|
|
|
|
end if
|
|
|
|
return a/b + 1
|
|
|
|
end function
|
2019-10-15 02:01:20 +00:00
|
|
|
|
2020-03-04 02:46:26 +00:00
|
|
|
'Returns the item selected or -1 on backpress or other unhandled closure of dialog.
|
|
|
|
function get_dialog_result(dialog, port)
|
|
|
|
while dialog <> invalid
|
|
|
|
msg = wait(0, port)
|
|
|
|
if isNodeEvent(msg, "backPressed") then
|
|
|
|
return -1
|
2021-05-01 01:09:33 +00:00
|
|
|
else if isNodeEvent(msg, "itemSelected")
|
2020-03-04 02:46:26 +00:00
|
|
|
return dialog.findNode("optionList").itemSelected
|
|
|
|
end if
|
|
|
|
end while
|
|
|
|
'Dialog has closed outside of this loop, return -1 for failure
|
|
|
|
return -1
|
|
|
|
end function
|
|
|
|
|
|
|
|
function lastFocusedChild(obj as object) as object
|
|
|
|
child = obj
|
2020-03-07 19:58:48 +00:00
|
|
|
for i = 0 to obj.getChildCount()
|
|
|
|
if obj.focusedChild <> invalid then
|
2020-12-06 16:32:41 +00:00
|
|
|
child = child.focusedChild
|
2020-03-07 19:58:48 +00:00
|
|
|
end if
|
2020-03-04 02:46:26 +00:00
|
|
|
end for
|
|
|
|
return child
|
|
|
|
end function
|
|
|
|
|
2020-03-28 20:04:57 +00:00
|
|
|
function show_dialog(message as string, options = [], defaultSelection = 0) as integer
|
2020-12-06 22:57:45 +00:00
|
|
|
lastFocus = lastFocusedChild(m.scene)
|
2020-03-04 02:46:26 +00:00
|
|
|
'We want to handle backPressed instead of the main loop
|
|
|
|
m.scene.unobserveField("backPressed")
|
|
|
|
|
2019-10-13 19:33:14 +00:00
|
|
|
dialog = createObject("roSGNode", "JFMessageDialog")
|
2020-03-04 02:46:26 +00:00
|
|
|
if options.count() then dialog.options = options
|
|
|
|
if message.len() > 0 then
|
|
|
|
reg = CreateObject("roFontRegistry")
|
|
|
|
font = reg.GetDefaultFont()
|
|
|
|
dialog.fontHeight = font.GetOneLineHeight()
|
|
|
|
dialog.fontWidth = font.GetOneLineWidth(message, 999999999)
|
|
|
|
dialog.message = message
|
|
|
|
end if
|
2019-03-17 17:38:21 +00:00
|
|
|
|
2020-04-01 00:13:54 +00:00
|
|
|
if defaultSelection > 0 then
|
2020-04-01 00:06:31 +00:00
|
|
|
dialog.findNode("optionList").jumpToItem = defaultSelection
|
|
|
|
end if
|
|
|
|
|
2020-03-04 02:46:26 +00:00
|
|
|
dialog.visible = true
|
|
|
|
m.scene.appendChild(dialog)
|
2020-04-04 17:21:43 +00:00
|
|
|
dialog.setFocus(true)
|
2020-03-28 20:04:57 +00:00
|
|
|
|
2020-03-04 02:46:26 +00:00
|
|
|
port = CreateObject("roMessagePort")
|
|
|
|
dialog.observeField("backPressed", port)
|
|
|
|
dialog.findNode("optionList").observeField("itemSelected", port)
|
|
|
|
|
|
|
|
result = get_dialog_result(dialog, port)
|
|
|
|
|
|
|
|
m.scene.removeChildIndex(m.scene.getChildCount() - 1)
|
|
|
|
lastFocus.setFocus(true)
|
|
|
|
m.scene.observeField("backPressed", m.port)
|
|
|
|
|
|
|
|
return result
|
2019-03-17 17:38:21 +00:00
|
|
|
end function
|
2020-02-22 00:50:20 +00:00
|
|
|
|
2020-03-04 02:46:26 +00:00
|
|
|
function message_dialog(message = "" as string)
|
|
|
|
return show_dialog(message,["OK"])
|
|
|
|
end function
|
|
|
|
|
2020-03-28 20:04:57 +00:00
|
|
|
function option_dialog(options, message = "", defaultSelection = 0) as integer
|
|
|
|
return show_dialog(message, options, defaultSelection)
|
2020-02-22 00:50:20 +00:00
|
|
|
end function
|