Sideband/sbapp/ui/layouts.py

2646 lines
109 KiB
Python
Raw Normal View History

2022-04-07 13:03:53 -06:00
root_layout = """
#: import NoTransition kivy.uix.screenmanager.NoTransition
#: import SlideTransition kivy.uix.screenmanager.SlideTransition
#:import images_path kivymd.images_path
2022-04-07 13:03:53 -06:00
MDNavigationLayout:
2022-10-02 16:47:27 -06:00
md_bg_color: app.theme_cls.bg_darkest
2022-04-07 13:03:53 -06:00
ScreenManager:
id: screen_manager
2022-09-17 09:12:25 -06:00
transition: SlideTransition()
# transition: NoTransition()
MDScreen:
name: "starting_screen"
AnchorLayout:
2022-10-13 12:09:03 -06:00
padding: [dp(0), dp(72), dp(0), dp(0)]
anchor_x: "center"
anchor_y: "center"
BoxLayout:
spacing: dp(36)
orientation: 'vertical'
size_hint_y: None
MDLabel:
id: connecting_info
halign: "center"
text: "Please Wait"
font_size: "32dp"
MDIconButton:
pos_hint: {"center_x": .5, "center_y": .5}
icon: "transit-connection-variant"
2022-10-13 12:44:29 -06:00
icon_size: "92dp"
MDLabel:
2022-10-11 09:49:31 -06:00
id: connecting_status
halign: "center"
text: "Substantiating Reticulum"
font_size: "32dp"
MDScreen:
name: "exit_screen"
AnchorLayout:
2022-10-13 12:09:03 -06:00
padding: [dp(0), dp(72), dp(0), dp(0)]
anchor_x: "center"
anchor_y: "center"
BoxLayout:
spacing: dp(36)
orientation: 'vertical'
size_hint_y: None
MDLabel:
2022-10-11 09:49:31 -06:00
id: exiting_info
halign: "center"
text: "Please Wait"
font_size: "32dp"
MDIconButton:
pos_hint: {"center_x": .5, "center_y": .5}
icon: "waves"
2022-10-13 12:44:29 -06:00
icon_size: "92dp"
MDLabel:
2022-10-11 09:49:31 -06:00
id: exiting_status
halign: "center"
text: "Dissolving Reticulum"
font_size: "32dp"
2022-04-07 13:03:53 -06:00
MDScreen:
name: "conversations_screen"
BoxLayout:
orientation: "vertical"
MDTopAppBar:
2022-04-07 13:03:53 -06:00
title: "Conversations"
2022-10-02 14:00:15 -06:00
anchor_title: "left"
2023-07-10 12:06:17 -06:00
elevation: 0
2022-04-07 13:03:53 -06:00
left_action_items:
[
['menu', lambda x: nav_drawer.set_state("open")],
]
2022-04-07 13:03:53 -06:00
right_action_items:
[
['access-point', lambda x: root.ids.screen_manager.app.announce_now_action(self)],
2022-12-20 04:35:07 -07:00
['webhook', lambda x: root.ids.screen_manager.app.connectivity_status(self)],
2022-11-23 00:32:15 -07:00
['qrcode', lambda x: root.ids.screen_manager.app.ingest_lxm_action(self)],
2022-04-07 13:03:53 -06:00
['email-sync', lambda x: root.ids.screen_manager.app.lxmf_sync_action(self)],
['account-plus', lambda x: root.ids.screen_manager.app.new_conversation_action(self)],
]
ScrollView:
id: conversations_scrollview
2022-11-22 06:25:56 -07:00
2022-04-07 13:03:53 -06:00
MDScreen:
name: "messages_screen"
BoxLayout:
orientation: "vertical"
MDTopAppBar:
2022-04-07 13:03:53 -06:00
id: messages_toolbar
2022-10-02 14:00:15 -06:00
anchor_title: "left"
2022-04-07 13:03:53 -06:00
title: "Messages"
2023-07-10 12:06:17 -06:00
elevation: 0
2022-04-07 13:03:53 -06:00
left_action_items:
[['menu', lambda x: nav_drawer.set_state("open")]]
right_action_items:
[
['lan-connect', lambda x: root.ids.screen_manager.app.message_propagation_action(self)],
['close', lambda x: root.ids.screen_manager.app.close_messages_action(self)],
]
ScrollView:
id: messages_scrollview
do_scroll_x: False
do_scroll_y: True
BoxLayout:
id: no_keys_part
2022-10-02 09:17:55 -06:00
orientation: "vertical"
padding: [dp(16), dp(0), dp(16), dp(16)]
2022-04-07 13:03:53 -06:00
spacing: dp(24)
size_hint_y: None
height: self.minimum_height + dp(64)
MDLabel:
id: nokeys_text
text: ""
MDRectangleFlatIconButton:
icon: "key-wireless"
text: "Query Network For Keys"
on_release: root.ids.screen_manager.app.key_query_action(self)
BoxLayout:
id: message_input_part
2022-10-02 09:17:55 -06:00
padding: [dp(16), dp(0), dp(16), dp(16)]
2022-04-07 13:03:53 -06:00
spacing: dp(24)
size_hint_y: None
height: self.minimum_height
MDTextField:
id: message_text
2023-08-15 05:36:44 -06:00
input_type: "text"
keyboard_suggestions: True
2022-04-07 13:03:53 -06:00
multiline: True
hint_text: "Write message"
mode: "rectangle"
max_height: dp(100)
MDRectangleFlatIconButton:
id: message_send_button
2022-04-07 13:03:53 -06:00
icon: "transfer-up"
text: "Send"
2022-10-02 14:28:09 -06:00
padding: [dp(10), dp(13), dp(10), dp(14)]
icon_size: dp(24)
font_size: dp(16)
2022-04-07 13:03:53 -06:00
on_release: root.ids.screen_manager.app.message_send_action(self)
MDScreen:
name: "broadcasts_screen"
BoxLayout:
orientation: "vertical"
MDTopAppBar:
2022-04-07 13:03:53 -06:00
title: "Local Broadcasts"
2022-10-02 14:00:15 -06:00
anchor_title: "left"
2023-07-10 12:06:17 -06:00
elevation: 0
2022-04-07 13:03:53 -06:00
left_action_items:
[['menu', lambda x: nav_drawer.set_state("open")]]
right_action_items:
[
['close', lambda x: root.ids.screen_manager.app.close_any_action(self)],
]
2022-04-07 13:03:53 -06:00
ScrollView:
id: broadcasts_scrollview
MDBoxLayout:
orientation: "vertical"
spacing: "24dp"
size_hint_y: None
height: self.minimum_height
2022-10-02 09:17:55 -06:00
padding: [dp(35), dp(35), dp(35), dp(35)]
2022-04-07 13:03:53 -06:00
MDLabel:
id: broadcasts_info
markup: True
text: ""
size_hint_y: None
text_size: self.width, None
height: self.texture_size[1]
MDScreen:
name: "connectivity_screen"
BoxLayout:
orientation: "vertical"
MDTopAppBar:
2022-04-07 13:03:53 -06:00
title: "Connectivity"
2022-10-02 14:00:15 -06:00
anchor_title: "left"
2023-07-10 12:06:17 -06:00
elevation: 0
2022-04-07 13:03:53 -06:00
left_action_items:
[['menu', lambda x: nav_drawer.set_state("open")]]
2022-07-06 04:19:05 -06:00
right_action_items:
[
['close', lambda x: root.ids.screen_manager.app.close_connectivity_action(self)],
]
2022-04-07 13:03:53 -06:00
ScrollView:
2022-07-06 04:19:05 -06:00
id: connectivity_scrollview
2022-04-07 13:03:53 -06:00
MDBoxLayout:
orientation: "vertical"
spacing: "10dp"
2022-04-07 13:03:53 -06:00
size_hint_y: None
height: self.minimum_height
2022-10-02 12:43:56 -06:00
padding: [dp(28), dp(48), dp(28), dp(16)]
2022-07-06 04:19:05 -06:00
MDLabel:
2022-10-02 12:43:56 -06:00
text: "Configuring Connectivity\\n"
2022-07-06 04:19:05 -06:00
font_style: "H6"
2022-04-07 13:03:53 -06:00
MDLabel:
id: connectivity_info
markup: True
text: ""
size_hint_y: None
text_size: self.width, None
height: self.texture_size[1]
2022-07-06 04:19:05 -06:00
MDBoxLayout:
orientation: "horizontal"
2022-10-02 12:43:56 -06:00
padding: [0,0,dp(24),0]
2022-07-06 04:19:05 -06:00
size_hint_y: None
2022-10-02 12:43:56 -06:00
height: dp(24)
2022-07-06 04:19:05 -06:00
MDLabel:
id: connectivity_local_label
2022-07-06 04:19:05 -06:00
text: "Connect via local WiFi/Ethernet"
font_style: "H6"
MDSwitch:
id: connectivity_use_local
2022-10-02 12:43:56 -06:00
pos_hint: {"center_y": 0.3}
2022-07-06 04:19:05 -06:00
active: False
2022-10-02 12:43:56 -06:00
MDBoxLayout:
id: connectivity_local_fields
orientation: "vertical"
size_hint_y: None
height: self.minimum_height
padding: [0, 0, 0, dp(32)]
2022-07-06 04:19:05 -06:00
2022-10-02 12:43:56 -06:00
MDTextField:
id: connectivity_local_groupid
hint_text: "Optional WiFi/Ethernet Group ID"
text: ""
max_text_length: 128
font_size: dp(24)
2022-07-06 04:19:05 -06:00
2022-10-02 12:43:56 -06:00
MDTextField:
id: connectivity_local_ifac_netname
hint_text: "Optional IFAC network name"
text: ""
font_size: dp(24)
2022-07-06 04:19:05 -06:00
2022-10-02 12:43:56 -06:00
MDTextField:
id: connectivity_local_ifac_passphrase
hint_text: "Optional IFAC passphrase"
text: ""
font_size: dp(24)
2022-07-06 04:19:05 -06:00
MDBoxLayout:
orientation: "horizontal"
2022-10-02 12:43:56 -06:00
padding: [0,0,dp(24),0]
2022-07-06 04:19:05 -06:00
size_hint_y: None
2022-10-02 12:43:56 -06:00
height: dp(24)
2022-07-06 04:19:05 -06:00
MDLabel:
id: connectivity_tcp_label
2022-07-06 04:19:05 -06:00
text: "Connect via TCP"
font_style: "H6"
MDSwitch:
id: connectivity_use_tcp
2022-10-02 12:43:56 -06:00
pos_hint: {"center_y": 0.3}
2022-07-06 04:19:05 -06:00
active: False
2022-10-02 12:43:56 -06:00
MDBoxLayout:
id: connectivity_tcp_fields
orientation: "vertical"
size_hint_y: None
height: self.minimum_height
padding: [0, 0, 0, dp(32)]
MDTextField:
id: connectivity_tcp_host
hint_text: "TCP Host"
text: ""
font_size: dp(24)
MDTextField:
id: connectivity_tcp_port
hint_text: "TCP Port"
text: ""
font_size: dp(24)
MDTextField:
id: connectivity_tcp_ifac_netname
hint_text: "Optional IFAC network name"
text: ""
font_size: dp(24)
MDTextField:
id: connectivity_tcp_ifac_passphrase
hint_text: "Optional IFAC passphrase"
text: ""
font_size: dp(24)
2022-07-06 04:19:05 -06:00
MDBoxLayout:
orientation: "horizontal"
2022-10-02 12:43:56 -06:00
padding: [0,0,dp(24),0]
2022-07-06 04:19:05 -06:00
size_hint_y: None
2022-10-02 12:43:56 -06:00
height: dp(24)
2022-07-06 04:19:05 -06:00
MDLabel:
id: connectivity_i2p_label
2022-07-06 04:19:05 -06:00
text: "Connect via I2P"
font_style: "H6"
MDSwitch:
id: connectivity_use_i2p
2022-10-02 12:43:56 -06:00
pos_hint: {"center_y": 0.3}
2022-07-06 04:19:05 -06:00
active: False
2022-10-02 12:43:56 -06:00
MDBoxLayout:
id: connectivity_i2p_fields
orientation: "vertical"
size_hint_y: None
height: self.minimum_height
padding: [0, 0, 0, dp(32)]
2022-07-06 04:19:05 -06:00
2022-10-02 12:43:56 -06:00
MDTextField:
id: connectivity_i2p_b32
hint_text: "I2P B32"
text: ""
font_size: dp(24)
2022-07-06 04:19:05 -06:00
2022-10-02 12:43:56 -06:00
MDTextField:
id: connectivity_i2p_ifac_netname
hint_text: "Optional IFAC network name"
text: ""
font_size: dp(24)
2022-07-06 04:19:05 -06:00
2022-10-02 12:43:56 -06:00
MDTextField:
id: connectivity_i2p_ifac_passphrase
hint_text: "Optional IFAC passphrase"
text: ""
font_size: dp(24)
2022-07-06 04:19:05 -06:00
MDBoxLayout:
orientation: "horizontal"
2022-10-02 12:43:56 -06:00
padding: [0,0,dp(24),0]
2022-07-06 04:19:05 -06:00
size_hint_y: None
2022-10-02 12:43:56 -06:00
height: dp(24)
2022-07-06 04:19:05 -06:00
MDLabel:
id: connectivity_rnode_label
2022-07-06 04:19:05 -06:00
text: "Connect via RNode"
font_style: "H6"
2022-10-11 06:16:21 -06:00
disabled: False
2022-07-06 04:19:05 -06:00
MDSwitch:
id: connectivity_use_rnode
active: False
2022-10-02 12:43:56 -06:00
pos_hint: {"center_y": 0.3}
2022-10-11 06:16:21 -06:00
disabled: False
2022-07-06 04:19:05 -06:00
2022-10-02 12:43:56 -06:00
MDBoxLayout:
id: connectivity_rnode_fields
orientation: "vertical"
2022-07-06 11:42:41 -06:00
size_hint_y: None
2022-10-02 12:43:56 -06:00
height: self.minimum_height
padding: [0, 0, 0, dp(32)]
2022-07-06 11:42:41 -06:00
2022-10-11 06:16:21 -06:00
MDTextField:
id: connectivity_rnode_ifac_netname
hint_text: "Optional IFAC network name"
text: ""
font_size: dp(24)
MDTextField:
id: connectivity_rnode_ifac_passphrase
hint_text: "Optional IFAC passphrase"
text: ""
font_size: dp(24)
2022-10-02 12:43:56 -06:00
MDBoxLayout:
orientation: "horizontal"
padding: [0,0,dp(24),0]
size_hint_y: None
height: dp(24)
MDLabel:
id: connectivity_modem_label
text: "Connect via Radio Modem"
2022-10-02 12:43:56 -06:00
font_style: "H6"
disabled: False
2022-10-02 12:43:56 -06:00
MDSwitch:
id: connectivity_use_modem
2022-10-02 12:43:56 -06:00
active: False
pos_hint: {"center_y": 0.3}
disabled: False
2022-10-02 12:43:56 -06:00
MDBoxLayout:
id: connectivity_modem_fields
2022-10-02 12:43:56 -06:00
orientation: "vertical"
size_hint_y: None
height: self.minimum_height
padding: [0, 0, 0, dp(32)]
MDTextField:
2022-10-15 02:06:42 -06:00
id: connectivity_modem_ifac_netname
hint_text: "Optional IFAC network name"
text: ""
font_size: dp(24)
MDTextField:
id: connectivity_modem_ifac_passphrase
hint_text: "Optional IFAC passphrase"
2022-10-02 12:43:56 -06:00
text: ""
font_size: dp(24)
MDBoxLayout:
orientation: "horizontal"
padding: [0,0,dp(24),0]
size_hint_y: None
height: dp(24)
MDLabel:
id: connectivity_serial_label
text: "Connect via Serial Port"
2022-10-02 12:43:56 -06:00
font_style: "H6"
disabled: False
2022-10-02 12:43:56 -06:00
MDSwitch:
id: connectivity_use_serial
2022-10-02 12:43:56 -06:00
active: False
pos_hint: {"center_y": 0.3}
disabled: False
2022-10-02 12:43:56 -06:00
MDBoxLayout:
id: connectivity_serial_fields
2022-10-02 12:43:56 -06:00
orientation: "vertical"
size_hint_y: None
height: self.minimum_height
padding: [0, 0, 0, dp(32)]
MDTextField:
2022-10-15 02:06:42 -06:00
id: connectivity_serial_ifac_netname
hint_text: "Optional IFAC network name"
text: ""
font_size: dp(24)
MDTextField:
id: connectivity_serial_ifac_passphrase
hint_text: "Optional IFAC passphrase"
text: ""
font_size: dp(24)
# MDBoxLayout:
# orientation: "horizontal"
# padding: [0,0,dp(24),0]
# size_hint_y: None
# height: dp(24)
# MDLabel:
# id: connectivity_bluetooth_label
# text: "Connect via Bluetooth"
# font_style: "H6"
# disabled: True
# MDSwitch:
# id: connectivity_use_bluetooth
# active: False
# pos_hint: {"center_y": 0.3}
# disabled: True
# MDBoxLayout:
# id: connectivity_bluetooth_fields
# orientation: "vertical"
# size_hint_y: None
# height: self.minimum_height
# padding: [0, 0, 0, dp(32)]
# MDTextField:
# id: connectivity_bluetooth_cid
# hint_text: "Bluetooth Pairing ID"
# text: ""
# font_size: dp(24)
# # disabled: True
2022-10-02 12:43:56 -06:00
MDLabel:
text: "Shared Instance Access\\n"
2023-10-07 09:36:12 -06:00
id: connectivity_shared_access_label
font_style: "H6"
MDLabel:
id: connectivity_shared_access
markup: True
2023-10-07 09:12:31 -06:00
text: "The Reticulum instance launched by Sideband will be available for other programs on this system. By default, this grants connectivity to other local Reticulum-based programs, but no access to management, interface status and path information.\\n\\nIf you want to allow full functionality and ability to manage the running instance, you will need to configure other programs to use the correct RPC key for this instance.\\n\\nThis can be very useful for using other tools related to Reticulum, for example via command-line programs running in Termux. To do this, use the button below to copy the RPC key configuration line, and paste it into the Reticulum configuration file within the Termux environment, or other program.\\n\\nPlease note! [b]It is not necessary[/b] to enable Reticulum Transport for this to work!\\n\\n"
size_hint_y: None
text_size: self.width, None
height: self.texture_size[1]
MDBoxLayout:
2023-10-07 09:36:12 -06:00
id: connectivity_shared_access_fields
orientation: "vertical"
size_hint_y: None
height: self.minimum_height
padding: [0, 0, 0, dp(32)]
MDRectangleFlatIconButton:
id: rpc_keys_copy
icon: "file-key"
text: "Copy RPC Config To Clipboard"
padding: [dp(0), dp(14), dp(0), dp(14)]
icon_size: dp(24)
font_size: dp(16)
size_hint: [1.0, None]
on_release: root.ids.screen_manager.app.rpc_copy_action(self)
2022-10-02 12:43:56 -06:00
MDBoxLayout:
orientation: "horizontal"
padding: [0,0,dp(24),0]
size_hint_y: None
height: dp(24)
MDLabel:
id: connectivity_transport_label
text: "Enable Reticulum Transport"
font_style: "H6"
# disabled: True
2022-10-02 12:43:56 -06:00
MDSwitch:
id: connectivity_enable_transport
active: False
pos_hint: {"center_y": 0.3}
# disabled: True
2022-07-06 04:19:05 -06:00
MDLabel:
id: connectivity_transport_info
markup: True
text: "Enabling Reticulum Transport will allow this device to route traffic between all enabled interfaces.\\n\\nFor general usage, this option should not be enabled, but it can be useful in situations where you want to share connectivity from one device to many others. An example of this could be sharing connectivity from a radio interface to other people on your local WiFi network.\\n\\nWhen enabled, you will be able to configure the interface mode for all interfaces configured on this device. For more information on this topic, refer to the Reticulum Manual."
size_hint_y: None
text_size: self.width, None
height: self.texture_size[1]
MDBoxLayout:
id: connectivity_transport_fields
orientation: "vertical"
size_hint_y: None
height: self.minimum_height
padding: [0, 0, 0, dp(32)]
# MDLabel:
# id: connectivity_modes_info
# markup: True
# text: "With Transport enabled, you can configure the interface modes for any enabled interfaces. Changing interface modes affects how Reticulum processes traffic and announces. For more information, refer to the Reticulum Manual."
# size_hint_y: None
# text_size: self.width, None
# height: self.texture_size[1]
MDBoxLayout:
orientation: "horizontal"
spacing: "24dp"
size_hint_y: None
height: self.minimum_height
padding: [dp(0), dp(12), dp(0), dp(12)]
MDTextField:
id: connectivity_local_ifmode
hint_text: "Local Interface Mode"
text: ""
font_size: dp(24)
MDTextField:
id: connectivity_tcp_ifmode
hint_text: "TCP Interface Mode"
text: ""
font_size: dp(24)
MDBoxLayout:
orientation: "horizontal"
spacing: "24dp"
size_hint_y: None
height: self.minimum_height
padding: [dp(0), dp(12), dp(0), dp(12)]
MDTextField:
id: connectivity_i2p_ifmode
hint_text: "I2P Mode"
text: ""
font_size: dp(24)
MDTextField:
id: connectivity_rnode_ifmode
hint_text: "RNode Mode"
text: ""
font_size: dp(24)
MDBoxLayout:
orientation: "horizontal"
spacing: "24dp"
size_hint_y: None
height: self.minimum_height
padding: [dp(0), dp(12), dp(0), dp(12)]
MDTextField:
id: connectivity_modem_ifmode
hint_text: "Modem Mode"
text: ""
font_size: dp(24)
MDTextField:
id: connectivity_serial_ifmode
hint_text: "Serial Mode"
text: ""
font_size: dp(24)
# MDTextField:
# id: connectivity_bluetooth_ifmode
# hint_text: "Bluetooth Mode"
# text: ""
# font_size: dp(24)
2022-04-07 13:03:53 -06:00
MDScreen:
name: "guide_screen"
BoxLayout:
orientation: "vertical"
MDTopAppBar:
2022-04-07 13:03:53 -06:00
title: "Guide"
2022-10-02 14:00:15 -06:00
anchor_title: "left"
2023-07-10 12:06:17 -06:00
elevation: 0
2022-04-07 13:03:53 -06:00
left_action_items:
[['menu', lambda x: nav_drawer.set_state("open")]]
2022-09-17 14:55:27 -06:00
right_action_items:
[
['close', lambda x: root.ids.screen_manager.app.close_guide_action(self)],
]
2022-04-07 13:03:53 -06:00
ScrollView:
id:guide_scrollview
MDBoxLayout:
orientation: "vertical"
size_hint_y: None
height: self.minimum_height
2022-09-17 14:55:27 -06:00
padding: [dp(35), dp(16), dp(35), dp(16)]
MDLabel:
id: guide_info1
markup: True
text: ""
size_hint_y: None
text_size: self.width, None
height: self.texture_size[1]
MDLabel:
id: guide_info2
markup: True
text: ""
size_hint_y: None
text_size: self.width, None
height: self.texture_size[1]
MDLabel:
id: guide_info3
markup: True
text: ""
size_hint_y: None
text_size: self.width, None
height: self.texture_size[1]
MDLabel:
id: guide_info4
markup: True
text: ""
size_hint_y: None
text_size: self.width, None
height: self.texture_size[1]
MDLabel:
id: guide_info5
markup: True
text: ""
size_hint_y: None
text_size: self.width, None
height: self.texture_size[1]
MDLabel:
id: guide_info6
markup: True
text: ""
size_hint_y: None
text_size: self.width, None
height: self.texture_size[1]
MDLabel:
id: guide_info7
markup: True
text: ""
size_hint_y: None
text_size: self.width, None
height: self.texture_size[1]
MDLabel:
id: guide_info8
markup: True
text: ""
size_hint_y: None
text_size: self.width, None
height: self.texture_size[1]
2022-04-07 13:03:53 -06:00
MDLabel:
id: guide_info9
2022-04-07 13:03:53 -06:00
markup: True
text: ""
size_hint_y: None
text_size: self.width, None
height: self.texture_size[1]
MDScreen:
name: "information_screen"
BoxLayout:
orientation: "vertical"
MDTopAppBar:
2022-04-07 13:03:53 -06:00
title: "App & Version Information"
2022-10-02 14:00:15 -06:00
anchor_title: "left"
2023-07-10 12:06:17 -06:00
elevation: 0
2022-04-07 13:03:53 -06:00
left_action_items:
[['menu', lambda x: nav_drawer.set_state("open")]]
2022-09-17 14:55:27 -06:00
right_action_items:
[
['close', lambda x: root.ids.screen_manager.app.close_information_action(self)],
]
2022-04-07 13:03:53 -06:00
ScrollView:
id:information_scrollview
MDBoxLayout:
orientation: "vertical"
size_hint_y: None
height: self.minimum_height
2022-10-19 11:56:39 -06:00
spacing: dp(35)
2022-09-17 14:55:27 -06:00
padding: [dp(35), dp(32), dp(35), dp(16)]
2022-04-07 13:03:53 -06:00
MDLabel:
id: information_info
markup: True
text: ""
size_hint_y: None
text_size: self.width, None
height: self.texture_size[1]
2022-10-19 11:56:39 -06:00
2022-10-19 14:25:20 -06:00
MDBoxLayout:
orientation: "vertical"
size_hint_y: None
size_hint_x: None
height: dp(256)
width: dp(256)
spacing: dp(0)
padding: [dp(0), dp(0), dp(0), dp(0)]
2022-10-19 11:56:39 -06:00
pos_hint: {"center_x": .5, "center_y": .5}
2022-10-19 14:25:20 -06:00
MDIcon:
pos_hint: {"center_x": .5, "center_y": .5}
id: information_logo
font_size: "256dp"
width: dp(256)
height: dp(256)
2022-04-07 13:03:53 -06:00
MDScreen:
name: "map_screen"
BoxLayout:
orientation: "vertical"
MDTopAppBar:
title: "Situation Map"
anchor_title: "left"
elevation: 0
left_action_items:
[['menu', lambda x: nav_drawer.set_state("open")]]
right_action_items:
[
['close', lambda x: root.ids.screen_manager.app.close_any_action(self)],
]
MDBoxLayout:
id: map_layout
MDScreen:
name: "telemetry_screen"
BoxLayout:
orientation: "vertical"
MDTopAppBar:
title: "Telemetry"
2022-10-02 14:00:15 -06:00
anchor_title: "left"
2023-07-10 12:06:17 -06:00
elevation: 0
2022-04-07 13:03:53 -06:00
left_action_items:
[['menu', lambda x: nav_drawer.set_state("open")]]
right_action_items:
[
['close', lambda x: root.ids.screen_manager.app.close_any_action(self)],
]
2022-04-07 13:03:53 -06:00
ScrollView:
id: telemetry_scrollview
2022-04-07 13:03:53 -06:00
MDBoxLayout:
orientation: "vertical"
size_hint_y: None
height: self.minimum_height
padding: [dp(28), dp(48), dp(28), dp(16)]
2022-10-02 09:17:55 -06:00
MDLabel:
text: "Telemetry Over LXMF"
font_style: "H6"
2022-04-07 13:03:53 -06:00
MDLabel:
id: telemetry_info
2022-04-07 13:03:53 -06:00
markup: True
text: ""
size_hint_y: None
text_size: self.width, None
height: self.texture_size[1]
2023-10-20 05:00:54 -06:00
MDLabel:
markup: True
text: "\\n\\n"
size_hint_y: None
text_size: self.width, None
height: self.texture_size[1]
MDBoxLayout:
orientation: "vertical"
spacing: dp(24)
size_hint_y: None
padding: [dp(0),dp(24),dp(0),dp(0)]
height: dp(74)
MDRectangleFlatIconButton:
id: telemetry_icons_button
icon: "update"
text: "Send Telemetry Update Now"
padding: [dp(0), dp(14), dp(0), dp(14)]
icon_size: dp(24)
font_size: dp(16)
size_hint: [1.0, None]
on_release: root.ids.screen_manager.app.telemetry_update(self)
disabled: False
MDRectangleFlatIconButton:
id: telemetry_icons_button
icon: "content-copy"
text: "Copy Telemetry Data To Clipboard"
padding: [dp(0), dp(14), dp(0), dp(14)]
icon_size: dp(24)
font_size: dp(16)
size_hint: [1.0, None]
on_release: root.ids.screen_manager.app.telemetry_copy(self)
disabled: False
MDBoxLayout:
id: telemetry_enabled_fields
orientation: "vertical"
size_hint_y: None
height: self.minimum_height
2023-10-20 05:00:54 -06:00
padding: [0, dp(16), 0, dp(0)]
MDTextField:
id: telemetry_collector
max_text_length: 32
hint_text: "Telemetry Collector Address"
text: ""
font_size: dp(24)
MDBoxLayout:
orientation: "horizontal"
padding: [0,0,dp(24),0]
size_hint_y: None
height: dp(48)
MDLabel:
id: telemetry_enabled_label
text: "Enable Telemetry"
font_style: "H6"
MDSwitch:
id: telemetry_enabled
pos_hint: {"center_y": 0.3}
active: False
MDBoxLayout:
orientation: "horizontal"
size_hint_y: None
padding: [0,0,dp(24),dp(0)]
height: dp(48)
MDLabel:
text: "Automatically send to collector"
font_style: "H6"
MDSwitch:
id: telemetry_send_to_collector
pos_hint: {"center_y": 0.3}
active: False
MDBoxLayout:
orientation: "horizontal"
size_hint_y: None
padding: [0,0,dp(24),dp(0)]
height: dp(48)
MDLabel:
text: "Send to all trusted peers"
font_style: "H6"
MDSwitch:
id: telemetry_send_to_trusted
pos_hint: {"center_y": 0.3}
active: False
MDLabel:
markup: True
text: "\\n\\n"
size_hint_y: None
text_size: self.width, None
height: self.texture_size[1]
MDLabel:
text: "Display Options"
font_style: "H6"
MDLabel:
id: telemetry_info4
markup: True
2023-10-20 05:00:54 -06:00
text: "\\nYou can customise the display style of your telemetry data when viewed by others, by setting an icon and color options. This is usually used by clients to display your telemetry entry on a map or in lists and overviews. If left unset, the receiver will decide how to display the data.\\n"
size_hint_y: None
text_size: self.width, None
height: self.texture_size[1]
MDBoxLayout:
orientation: "vertical"
size_hint_y: None
2023-10-20 05:00:54 -06:00
height: dp(112)
padding: [dp(0), dp(24), dp(0), dp(24)]
pos_hint: {"center_x": .5}
MDIconButton:
2023-10-20 05:00:54 -06:00
pos_hint: {"center_x": .5}
id: telemetry_icon_preview
icon: "alpha-p-circle-outline"
type: "large"
theme_icon_color: "Custom"
icon_color: [0, 0, 0, 1]
md_bg_color: [1, 1, 1, 1]
icon_size: dp(64)
2023-10-20 05:00:54 -06:00
size_hint_y: None
# width: dp(64)
2023-10-20 05:00:54 -06:00
height: dp(80)
MDRectangleFlatIconButton:
id: telemetry_icons_button
icon: "list-box-outline"
text: "Select From Available Icons"
padding: [dp(0), dp(14), dp(0), dp(14)]
icon_size: dp(24)
font_size: dp(16)
size_hint: [1.0, None]
on_release: root.ids.screen_manager.app.icons_action(self)
disabled: False
MDBoxLayout:
orientation: "vertical"
size_hint_y: None
padding: [dp(0),dp(24),dp(0),dp(0)]
height: dp(74)
MDBoxLayout:
orientation: "horizontal"
#size_hint_y: None
spacing: dp(24)
# padding: [0,0,dp(24),dp(0)]
# height: dp(48)
MDRectangleFlatIconButton:
id: telemetry_icons_button
icon: "list-box-outline"
text: "Set Foreground Color"
padding: [dp(0), dp(14), dp(0), dp(14)]
icon_size: dp(24)
font_size: dp(16)
size_hint: [1.0, None]
on_release: root.ids.screen_manager.app.telemetry_fg_color(self)
disabled: False
MDRectangleFlatIconButton:
id: telemetry_icons_button
icon: "list-box-outline"
text: "Set Background Color"
padding: [dp(0), dp(14), dp(0), dp(14)]
icon_size: dp(24)
font_size: dp(16)
size_hint: [1.0, None]
on_release: root.ids.screen_manager.app.telemetry_bg_color(self)
disabled: False
MDLabel:
markup: True
text: "\\n\\n\\n"
size_hint_y: None
text_size: self.width, None
height: self.texture_size[1]
MDLabel:
text: "Sensor Types"
font_style: "H6"
MDLabel:
id: telemetry_info3
markup: True
text: ""
size_hint_y: None
text_size: self.width, None
height: self.texture_size[1]
MDBoxLayout:
orientation: "horizontal"
size_hint_y: None
padding: [0,0,dp(24),dp(0)]
height: dp(48)
MDLabel:
text: "Location"
font_style: "H6"
MDSwitch:
id: telemetry_s_location
pos_hint: {"center_y": 0.3}
active: False
MDBoxLayout:
orientation: "horizontal"
size_hint_y: None
padding: [0,0,dp(24),dp(0)]
height: dp(48)
MDLabel:
text: "Orientation"
font_style: "H6"
MDSwitch:
id: telemetry_s_orientation
pos_hint: {"center_y": 0.3}
active: False
MDBoxLayout:
orientation: "horizontal"
size_hint_y: None
padding: [0,0,dp(24),dp(0)]
height: dp(48)
MDLabel:
text: "Battery State"
font_style: "H6"
MDSwitch:
id: telemetry_s_battery
pos_hint: {"center_y": 0.3}
active: False
MDBoxLayout:
orientation: "horizontal"
size_hint_y: None
padding: [0,0,dp(24),dp(0)]
height: dp(48)
MDLabel:
text: "Barometer"
font_style: "H6"
MDSwitch:
id: telemetry_s_barometer
pos_hint: {"center_y": 0.3}
active: False
MDBoxLayout:
orientation: "horizontal"
size_hint_y: None
padding: [0,0,dp(24),dp(0)]
height: dp(48)
MDLabel:
text: "Temperature"
font_style: "H6"
MDSwitch:
id: telemetry_s_temperature
pos_hint: {"center_y": 0.3}
active: False
MDBoxLayout:
orientation: "horizontal"
size_hint_y: None
padding: [0,0,dp(24),dp(0)]
height: dp(48)
MDLabel:
text: "Humidity"
font_style: "H6"
MDSwitch:
id: telemetry_s_humidity
pos_hint: {"center_y": 0.3}
active: False
MDBoxLayout:
orientation: "horizontal"
size_hint_y: None
padding: [0,0,dp(24),dp(0)]
height: dp(48)
MDLabel:
text: "Compass"
font_style: "H6"
MDSwitch:
id: telemetry_s_compass
pos_hint: {"center_y": 0.3}
active: False
MDBoxLayout:
orientation: "horizontal"
size_hint_y: None
padding: [0,0,dp(24),dp(0)]
height: dp(48)
MDLabel:
text: "Ambient Light"
font_style: "H6"
MDSwitch:
id: telemetry_s_light
pos_hint: {"center_y": 0.3}
active: False
MDBoxLayout:
orientation: "horizontal"
size_hint_y: None
padding: [0,0,dp(24),dp(0)]
height: dp(48)
MDLabel:
text: "Gravity"
font_style: "H6"
MDSwitch:
id: telemetry_s_gravity
pos_hint: {"center_y": 0.3}
active: False
MDBoxLayout:
orientation: "horizontal"
size_hint_y: None
padding: [0,0,dp(24),dp(0)]
height: dp(48)
MDLabel:
text: "Gyroscope"
font_style: "H6"
MDSwitch:
id: telemetry_s_gyroscope
pos_hint: {"center_y": 0.3}
active: False
MDBoxLayout:
orientation: "horizontal"
size_hint_y: None
padding: [0,0,dp(24),dp(0)]
height: dp(48)
MDLabel:
text: "Accelerometer"
font_style: "H6"
MDSwitch:
id: telemetry_s_accelerometer
pos_hint: {"center_y": 0.3}
active: False
MDBoxLayout:
orientation: "horizontal"
size_hint_y: None
padding: [0,0,dp(24),dp(0)]
height: dp(48)
MDLabel:
text: "Proximity"
font_style: "H6"
MDSwitch:
id: telemetry_s_proximity
pos_hint: {"center_y": 0.3}
active: False
MDLabel:
markup: True
text: "\\n"
size_hint_y: None
text_size: self.width, None
height: self.texture_size[1]
MDScreen:
name: "icons_screen"
BoxLayout:
orientation: "vertical"
MDTopAppBar:
title: "Available Icons"
anchor_title: "left"
elevation: 0
left_action_items:
[['menu', lambda x: nav_drawer.set_state("open")]]
right_action_items:
[
['close', lambda x: root.ids.screen_manager.app.close_sub_telemetry_action(self)],
]
MDBoxLayout:
orientation: 'vertical'
spacing: dp(10)
padding: dp(20)
MDBoxLayout:
adaptive_height: True
MDIconButton:
icon: 'magnify'
MDTextField:
id: icons_search_field
hint_text: 'Search icon'
on_text: root.ids.screen_manager.app.icons_filter(self.text, True)
RecycleView:
id: icons_rv
key_viewclass: 'viewclass'
key_size: 'height'
RecycleBoxLayout:
padding: dp(10)
default_size: None, dp(48)
default_size_hint: 1, None
size_hint_y: None
height: self.minimum_height
orientation: 'vertical'
2022-04-07 13:03:53 -06:00
MDScreen:
name: "keys_screen"
BoxLayout:
orientation: "vertical"
MDTopAppBar:
2022-04-07 13:03:53 -06:00
title: "Encryption Keys"
2022-10-02 14:00:15 -06:00
anchor_title: "left"
2023-07-10 12:06:17 -06:00
elevation: 0
2022-04-07 13:03:53 -06:00
left_action_items:
[['menu', lambda x: nav_drawer.set_state("open")]]
2022-09-17 14:55:27 -06:00
right_action_items:
[
['close', lambda x: root.ids.screen_manager.app.close_keys_action(self)],
]
2022-04-07 13:03:53 -06:00
ScrollView:
id:keys_scrollview
MDBoxLayout:
orientation: "vertical"
spacing: "24dp"
size_hint_y: None
height: self.minimum_height
2022-10-02 09:17:55 -06:00
padding: [dp(35), dp(35), dp(35), dp(35)]
2022-04-07 13:03:53 -06:00
MDLabel:
id: keys_info
markup: True
text: ""
size_hint_y: None
text_size: self.width, None
height: self.texture_size[1]
2022-09-17 14:55:27 -06:00
MDRectangleFlatIconButton:
id: keys_display
icon: "eye"
text: "Display Identity Key"
2022-10-02 14:28:09 -06:00
padding: [dp(0), dp(14), dp(0), dp(14)]
icon_size: dp(24)
font_size: dp(16)
2022-09-17 14:55:27 -06:00
size_hint: [1.0, None]
on_release: root.ids.screen_manager.app.identity_display_action(self)
MDRectangleFlatIconButton:
id: keys_copy
icon: "file-key"
text: "Copy Key To Clipboard"
2022-10-02 14:28:09 -06:00
padding: [dp(0), dp(14), dp(0), dp(14)]
icon_size: dp(24)
font_size: dp(16)
2022-09-17 14:55:27 -06:00
size_hint: [1.0, None]
on_release: root.ids.screen_manager.app.identity_copy_action(self)
MDRectangleFlatIconButton:
id: keys_share
icon: "upload-lock"
text: "Send Key To Other App"
2022-10-02 14:28:09 -06:00
padding: [dp(0), dp(14), dp(0), dp(14)]
icon_size: dp(24)
font_size: dp(16)
2022-09-17 14:55:27 -06:00
size_hint: [1.0, None]
on_release: root.ids.screen_manager.app.identity_share_action(self)
MDBoxLayout:
orientation: "vertical"
# spacing: "24dp"
size_hint_y: None
height: self.minimum_height
2022-10-02 09:17:55 -06:00
padding: [dp(0), dp(12), dp(0), dp(0)]
2022-09-17 14:55:27 -06:00
MDTextField:
id: key_restore_text
hint_text: "Enter base32 key for import"
mode: "rectangle"
# size_hint: [1.0, None]
pos_hint: {"center_x": .5}
MDRectangleFlatIconButton:
id: keys_restore
icon: "download-lock"
text: "Restore Identity From Key"
2022-10-02 14:28:09 -06:00
padding: [dp(0), dp(14), dp(0), dp(14)]
icon_size: dp(24)
font_size: dp(16)
2022-09-17 14:55:27 -06:00
size_hint: [1.0, None]
on_release: root.ids.screen_manager.app.identity_restore_action(self)
2022-04-07 13:03:53 -06:00
MDScreen:
name: "announces_screen"
BoxLayout:
orientation: "vertical"
MDTopAppBar:
2022-04-07 13:03:53 -06:00
title: "Announce Stream"
2022-10-02 14:00:15 -06:00
anchor_title: "left"
2023-07-10 12:06:17 -06:00
elevation: 0
2022-04-07 13:03:53 -06:00
left_action_items:
[['menu', lambda x: nav_drawer.set_state("open")]]
right_action_items:
[
['close', lambda x: root.ids.screen_manager.app.close_settings_action(self)],
]
# [['eye-off', lambda x: root.ids.screen_manager.app.announce_filter_action(self)]]
ScrollView:
id: announces_scrollview
MDBoxLayout:
orientation: "vertical"
spacing: "24dp"
size_hint_y: None
height: self.minimum_height
padding: dp(64)
MDLabel:
id: announces_info
markup: True
text: ""
size_hint_y: None
text_size: self.width, None
height: self.texture_size[1]
MDScreen:
name: "settings_screen"
BoxLayout:
orientation: "vertical"
MDTopAppBar:
title: "Preferences"
2022-10-02 14:00:15 -06:00
anchor_title: "left"
2023-07-10 12:06:17 -06:00
elevation: 0
2022-04-07 13:03:53 -06:00
left_action_items:
[['menu', lambda x: nav_drawer.set_state("open")]]
right_action_items:
[
['close', lambda x: root.ids.screen_manager.app.close_settings_action(self)],
]
ScrollView:
id: settings_scrollview
MDBoxLayout:
orientation: "vertical"
spacing: 0
2022-04-07 13:03:53 -06:00
size_hint_y: None
height: self.minimum_height
padding: [0, 0, 0, 0]
2022-04-07 13:03:53 -06:00
MDBoxLayout:
orientation: "vertical"
spacing: "16dp"
2022-04-07 13:03:53 -06:00
size_hint_y: None
height: self.minimum_height
padding: [dp(28), dp(16), dp(28), dp(16)]
2022-04-07 13:03:53 -06:00
2022-10-02 06:03:56 -06:00
MDLabel:
text: ""
2022-10-02 06:03:56 -06:00
font_style: "H6"
2022-04-07 13:03:53 -06:00
MDLabel:
text: "User Options"
2022-04-07 13:03:53 -06:00
font_style: "H6"
MDTextField:
id: settings_display_name
hint_text: "Display Name"
text: ""
max_text_length: 128
font_size: dp(24)
2022-04-07 13:03:53 -06:00
MDTextField:
id: settings_propagation_node_address
hint_text: "LXMF Propagation Node"
disabled: False
text: ""
max_text_length: 32
font_size: dp(24)
2022-04-07 13:03:53 -06:00
2022-11-22 06:25:56 -07:00
MDTextField:
id: settings_print_command
hint_text: "Print Command"
disabled: False
text: ""
font_size: dp(24)
MDLabel:
text: ""
font_style: "H6"
MDLabel:
text: "Address & Identity"
font_style: "H6"
MDTextField:
id: settings_lxmf_address
hint_text: "Your LXMF Address"
text: ""
disabled: False
max_text_length: 32
font_size: dp(24)
MDTextField:
id: settings_identity_hash
hint_text: "Your Identity Hash"
text: ""
disabled: False
max_text_length: 32
font_size: dp(24)
2022-04-07 13:03:53 -06:00
MDBoxLayout:
orientation: "vertical"
# spacing: "24dp"
2022-04-07 13:03:53 -06:00
size_hint_y: None
height: self.minimum_height
padding: [dp(28), dp(16), dp(28), dp(16)]
2022-04-07 13:03:53 -06:00
2022-10-08 16:30:58 -06:00
MDBoxLayout:
orientation: "horizontal"
size_hint_y: None
padding: [0,0,dp(24),dp(0)]
height: dp(48)
MDLabel:
text: "Notifications"
font_style: "H6"
MDSwitch:
id: settings_notifications_on
pos_hint: {"center_y": 0.3}
active: True
MDBoxLayout:
orientation: "horizontal"
size_hint_y: None
padding: [0,0,dp(24),dp(0)]
height: dp(48)
MDLabel:
2023-10-07 08:54:38 -06:00
text: "Dark Mode"
font_style: "H6"
MDSwitch:
id: settings_dark_ui
pos_hint: {"center_y": 0.3}
active: False
2023-10-07 08:54:38 -06:00
MDBoxLayout:
orientation: "horizontal"
size_hint_y: None
padding: [0,0,dp(24),dp(0)]
height: dp(48)
MDLabel:
text: "E-Ink Mode"
font_style: "H6"
MDSwitch:
id: settings_eink_mode
pos_hint: {"center_y": 0.3}
active: False
MDBoxLayout:
orientation: "horizontal"
size_hint_y: None
padding: [0,0,dp(24),dp(0)]
height: dp(48)
MDLabel:
2022-12-18 18:06:41 -07:00
text: "Announce Automatically"
font_style: "H6"
MDSwitch:
id: settings_start_announce
pos_hint: {"center_y": 0.3}
active: False
MDBoxLayout:
orientation: "horizontal"
size_hint_y: None
padding: [0,0,dp(24),dp(0)]
height: dp(48)
MDLabel:
text: "Send via Propagation Node by default"
font_style: "H6"
MDSwitch:
id: settings_lxmf_delivery_by_default
pos_hint: {"center_y": 0.3}
disabled: False
active: False
MDBoxLayout:
orientation: "horizontal"
size_hint_y: None
padding: [0,0,dp(24),dp(0)]
height: dp(48)
MDLabel:
text: "Ignore unknown senders"
font_style: "H6"
MDSwitch:
id: settings_lxmf_ignore_unknown
pos_hint: {"center_y": 0.3}
disabled: False
active: False
MDBoxLayout:
orientation: "horizontal"
size_hint_y: None
padding: [0,0,dp(24),dp(0)]
height: dp(48)
MDLabel:
text: "Limit each sync to 3 messages"
font_style: "H6"
MDSwitch:
id: settings_lxmf_sync_limit
pos_hint: {"center_y": 0.3}
disabled: False
active: False
MDBoxLayout:
orientation: "horizontal"
size_hint_y: None
padding: [0,0,dp(24),dp(0)]
height: dp(48)
MDLabel:
id: settings_lxmf_sync_periodic
text: "Sync with Propagation Node periodically"
font_style: "H6"
MDSwitch:
id: settings_lxmf_periodic_sync
pos_hint: {"center_y": 0.3}
disabled: False
active: False
MDBoxLayout:
id: lxmf_syncslider_container
orientation: "vertical"
size_hint_y: None
padding: [0,0,dp(0),0]
height: dp(68)
MDSlider
min: 300
max: 172800
value: 43200
id: settings_lxmf_sync_interval
sensitivity: "all"
hint: False
MDBoxLayout:
orientation: "horizontal"
size_hint_y: None
padding: [0,0,dp(24),dp(0)]
height: dp(48)
MDLabel:
text: "Use Home Node as Broadcast Repeater"
font_style: "H6"
MDSwitch:
id: settings_home_node_as_broadcast_repeater
pos_hint: {"center_y": 0.3}
active: False
disabled: True
2022-12-18 18:06:41 -07:00
MDBoxLayout:
orientation: "horizontal"
size_hint_y: None
padding: [0,0,dp(24),dp(0)]
height: dp(48)
MDLabel:
text: "Debug Logging"
font_style: "H6"
MDSwitch:
id: settings_debug
pos_hint: {"center_y": 0.3}
disabled: False
active: False
MDScreen:
name: "repository_screen"
BoxLayout:
orientation: "vertical"
MDTopAppBar:
title: "Share Software & Guides"
anchor_title: "left"
elevation: 0
left_action_items:
[['menu', lambda x: nav_drawer.set_state("open")]]
right_action_items:
[
['close', lambda x: root.ids.screen_manager.app.close_repository_action(self)],
]
ScrollView:
id: repository_scrollview
MDBoxLayout:
orientation: "vertical"
spacing: "8dp"
size_hint_y: None
height: self.minimum_height
padding: [dp(28), dp(48), dp(28), dp(16)]
MDLabel:
text: "Repository Server\\n"
font_style: "H6"
MDLabel:
id: repository_info
markup: True
text: ""
size_hint_y: None
text_size: self.width, None
height: self.texture_size[1]
MDBoxLayout:
orientation: "vertical"
spacing: "24dp"
size_hint_y: None
height: self.minimum_height
padding: [dp(0), dp(35), dp(0), dp(35)]
MDRectangleFlatIconButton:
id: repository_enable_button
icon: "wifi"
text: "Start Repository Server"
padding: [dp(0), dp(14), dp(0), dp(14)]
icon_size: dp(24)
font_size: dp(16)
size_hint: [1.0, None]
on_release: root.ids.screen_manager.app.repository_start_action(self)
MDRectangleFlatIconButton:
id: repository_disable_button
icon: "wifi-off"
text: "Stop Repository Server"
padding: [dp(0), dp(14), dp(0), dp(14)]
icon_size: dp(24)
font_size: dp(16)
size_hint: [1.0, None]
on_release: root.ids.screen_manager.app.repository_stop_action(self)
disabled: True
MDRectangleFlatIconButton:
id: repository_download_button
icon: "download-multiple"
text: "Update Contents"
padding: [dp(0), dp(14), dp(0), dp(14)]
icon_size: dp(24)
font_size: dp(16)
size_hint: [1.0, None]
on_release: root.ids.screen_manager.app.repository_download_action(self)
disabled: False
MDLabel:
id: repository_update
markup: True
text: ""
size_hint_y: None
text_size: self.width, None
height: self.texture_size[1]
MDScreen:
name: "hardware_screen"
BoxLayout:
orientation: "vertical"
MDTopAppBar:
title: "Hardware"
anchor_title: "left"
2023-07-10 12:06:17 -06:00
elevation: 0
left_action_items:
[['menu', lambda x: nav_drawer.set_state("open")]]
right_action_items:
[
['close', lambda x: root.ids.screen_manager.app.close_hardware_action(self)],
]
ScrollView:
id: hardware_scrollview
MDBoxLayout:
orientation: "vertical"
spacing: "8dp"
size_hint_y: None
height: self.minimum_height
padding: [dp(28), dp(48), dp(28), dp(16)]
MDLabel:
text: "Configure Hardware Parameters\\n"
font_style: "H6"
MDLabel:
id: hardware_info
markup: True
text: ""
size_hint_y: None
text_size: self.width, None
height: self.texture_size[1]
MDBoxLayout:
orientation: "vertical"
spacing: "24dp"
size_hint_y: None
height: self.minimum_height
padding: [dp(0), dp(35), dp(0), dp(35)]
MDRectangleFlatIconButton:
id: hardware_rnode_button
icon: "radio-handheld"
text: "RNode"
padding: [dp(0), dp(14), dp(0), dp(14)]
icon_size: dp(24)
font_size: dp(16)
size_hint: [1.0, None]
on_release: root.ids.screen_manager.app.hardware_rnode_action(self)
MDRectangleFlatIconButton:
id: hardware_modem_button
icon: "router-wireless"
2022-10-13 15:04:30 -06:00
text: "Radio Modem"
padding: [dp(0), dp(14), dp(0), dp(14)]
icon_size: dp(24)
font_size: dp(16)
size_hint: [1.0, None]
on_release: root.ids.screen_manager.app.hardware_modem_action(self)
disabled: False
MDRectangleFlatIconButton:
id: hardware_serial_button
icon: "cable-data"
text: "Serial Port"
padding: [dp(0), dp(14), dp(0), dp(14)]
icon_size: dp(24)
font_size: dp(16)
size_hint: [1.0, None]
on_release: root.ids.screen_manager.app.hardware_serial_action(self)
2022-10-15 02:35:40 -06:00
disabled: False
MDScreen:
name: "hardware_rnode_screen"
BoxLayout:
orientation: "vertical"
MDTopAppBar:
title: "RNode"
anchor_title: "left"
2023-07-10 12:06:17 -06:00
elevation: 0
left_action_items:
[['menu', lambda x: nav_drawer.set_state("open")]]
right_action_items:
[
['close', lambda x: root.ids.screen_manager.app.close_sub_hardware_action(self)],
]
ScrollView:
id: hardware_rnode_scrollview
MDBoxLayout:
orientation: "vertical"
spacing: "8dp"
size_hint_y: None
height: self.minimum_height
padding: [dp(28), dp(48), dp(28), dp(16)]
MDLabel:
text: "RNode Hardware Parameters\\n"
font_style: "H6"
MDLabel:
id: hardware_rnode_info
markup: True
2022-10-15 08:55:15 -06:00
text: "To communicate using an RNode, you will need to specify the following parameters. For two or more RNodes to be able to communicate, all parameters must match, except for the [i]Coding Rate[/i] and [i]TX Power[/i] parameter, which can vary between devices.\\n"
size_hint_y: None
text_size: self.width, None
height: self.texture_size[1]
MDBoxLayout:
orientation: "horizontal"
spacing: "24dp"
size_hint_y: None
height: self.minimum_height
padding: [dp(0), dp(0), dp(0), dp(35)]
MDRectangleFlatIconButton:
id: rnode_mote_export
icon: "upload"
text: "Export"
padding: [dp(0), dp(14), dp(0), dp(14)]
icon_size: dp(24)
font_size: dp(16)
size_hint: [1.0, None]
on_release: root.ids.screen_manager.app.hardware_rnode_export(self)
MDRectangleFlatIconButton:
id: rnode_mote_import
icon: "download"
text: "Import"
padding: [dp(0), dp(14), dp(0), dp(14)]
icon_size: dp(24)
font_size: dp(16)
size_hint: [1.0, None]
on_release: root.ids.screen_manager.app.hardware_rnode_import(self)
MDLabel:
text: "Radio Options"
font_style: "H6"
# MDTextField:
# id: hardware_rnode_modulation
# hint_text: "Modulation"
# text: "LoRa"
# disabled: True
# font_size: dp(24)
MDBoxLayout:
orientation: "horizontal"
spacing: "24dp"
size_hint_y: None
height: self.minimum_height
# padding: [dp(0), dp(0), dp(0), dp(35)]
MDTextField:
id: hardware_rnode_frequency
hint_text: "Frequency (MHz)"
text: ""
font_size: dp(24)
MDTextField:
id: hardware_rnode_bandwidth
hint_text: "Bandwidth (KHz)"
text: ""
font_size: dp(24)
MDTextField:
id: hardware_rnode_txpower
hint_text: "TX Power (dBm)"
text: ""
font_size: dp(24)
MDBoxLayout:
orientation: "horizontal"
spacing: "24dp"
size_hint_y: None
height: self.minimum_height
padding: [dp(0), dp(0), dp(0), dp(24)]
MDTextField:
id: hardware_rnode_spreadingfactor
hint_text: "Spreading Factor"
text: ""
font_size: dp(24)
MDTextField:
id: hardware_rnode_codingrate
hint_text: "Coding Rate"
text: ""
font_size: dp(24)
MDLabel:
text: "Optional Settings"
font_style: "H6"
MDBoxLayout:
orientation: "horizontal"
spacing: "24dp"
size_hint_y: None
height: self.minimum_height
# padding: [dp(0), dp(0), dp(0), dp(35)]
MDTextField:
id: hardware_rnode_beaconinterval
hint_text: "Beacon Interval (seconds)"
text: ""
font_size: dp(24)
MDTextField:
id: hardware_rnode_beacondata
hint_text: "Beacon Data"
text: ""
font_size: dp(24)
2022-11-02 15:28:01 -06:00
MDBoxLayout:
orientation: "horizontal"
2023-09-13 13:14:30 -06:00
spacing: "24dp"
size_hint_y: None
height: self.minimum_height
# padding: [dp(0), dp(0), dp(0), dp(35)]
MDTextField:
id: hardware_rnode_atl_short
hint_text: "Airime Limit % (15s)"
text: ""
font_size: dp(24)
MDTextField:
id: hardware_rnode_atl_long
hint_text: "Airime Limit % (1h)"
text: ""
font_size: dp(24)
MDBoxLayout:
orientation: "horizontal"
size_hint_y: None
padding: [0,0,dp(24),dp(0)]
height: dp(48)
MDLabel:
text: "Control RNode Display"
font_style: "H6"
MDSwitch:
id: hardware_rnode_framebuffer
pos_hint: {"center_y": 0.3}
active: False
MDBoxLayout:
orientation: "horizontal"
2022-11-02 15:28:01 -06:00
size_hint_y: None
padding: [0,0,dp(24),dp(0)]
height: dp(48)
MDLabel:
text: "Connect using Bluetooth"
font_style: "H6"
MDSwitch:
id: hardware_rnode_bluetooth
pos_hint: {"center_y": 0.3}
active: False
MDLabel:
id: hardware_rnode_info
markup: True
2022-11-23 13:48:32 -07:00
text: "If you enable connection via Bluetooth, Sideband will attempt to connect to any available and paired RNodes over Bluetooth.\\n\\nYou must first pair the RNode with your device for this to work. If your RNode does not have a physical pairing button, you can enable Bluetooth and put it into pairing mode by first connecting it via a USB cable, and using the buttons below. When plugging in the RNode over USB, you must grant Sideband permission to the USB device for this to work.\\n\\nYou can also change Bluetooth settings using the \\"rnodeconf\\" utility from a computer.\\n\\nBy default, Sideband will connect to the first available RNode that is paired. If you want to always use a specific RNode, you can enter its name in the Preferred RNode Device Name field below, for example \\"RNode A8EB\\".\\n"
2022-11-02 15:28:01 -06:00
size_hint_y: None
text_size: self.width, None
height: self.texture_size[1]
MDBoxLayout:
orientation: "vertical"
spacing: "24dp"
size_hint_y: None
height: self.minimum_height
# padding: [dp(0), dp(0), dp(0), dp(35)]
MDRectangleFlatIconButton:
id: hardware_rnode_bt_on_button
icon: "bluetooth"
text: "Enable Bluetooth"
padding: [dp(0), dp(14), dp(0), dp(14)]
icon_size: dp(24)
font_size: dp(16)
size_hint: [1.0, None]
on_release: root.ids.screen_manager.app.hardware_rnode_bt_on_action(self)
MDRectangleFlatIconButton:
id: hardware_rnode_bt_off_button
icon: "bluetooth-off"
text: "Disable Bluetooth"
padding: [dp(0), dp(14), dp(0), dp(14)]
icon_size: dp(24)
font_size: dp(16)
size_hint: [1.0, None]
on_release: root.ids.screen_manager.app.hardware_rnode_bt_off_action(self)
disabled: False
MDRectangleFlatIconButton:
id: hardware_rnode_bt_pair_button
icon: "link-variant"
text: "Start Pairing Mode"
padding: [dp(0), dp(14), dp(0), dp(14)]
icon_size: dp(24)
font_size: dp(16)
size_hint: [1.0, None]
on_release: root.ids.screen_manager.app.hardware_rnode_bt_pair_action(self)
disabled: False
MDTextField:
id: hardware_rnode_bt_device
hint_text: "Preferred RNode Device Name"
text: ""
font_size: dp(24)
MDScreen:
name: "hardware_modem_screen"
BoxLayout:
orientation: "vertical"
MDTopAppBar:
title: "Radio Modem"
anchor_title: "left"
2023-07-10 12:06:17 -06:00
elevation: 0
left_action_items:
[['menu', lambda x: nav_drawer.set_state("open")]]
right_action_items:
[
['close', lambda x: root.ids.screen_manager.app.close_sub_hardware_action(self)],
]
ScrollView:
id: hardware_modem_scrollview
MDBoxLayout:
orientation: "vertical"
spacing: "8dp"
size_hint_y: None
height: self.minimum_height
padding: [dp(28), dp(48), dp(28), dp(16)]
MDLabel:
text: "Modem Hardware Parameters\\n"
font_style: "H6"
MDLabel:
id: hardware_modem_info
markup: True
text: "To communicate using a Radio Modem, you will need to specify the following parameters. Serial port parameters must be set to match those of the modem. CSMA parameters can be left at their default values in most cases.\\n"
size_hint_y: None
text_size: self.width, None
height: self.texture_size[1]
MDLabel:
text: "Port Options"
font_style: "H6"
MDBoxLayout:
orientation: "horizontal"
spacing: "24dp"
size_hint_y: None
height: self.minimum_height
# padding: [dp(0), dp(0), dp(0), dp(35)]
MDTextField:
id: hardware_modem_baudrate
hint_text: "Baud Rate"
text: ""
font_size: dp(24)
MDBoxLayout:
orientation: "horizontal"
spacing: "24dp"
size_hint_y: None
height: self.minimum_height
padding: [dp(0), dp(0), dp(0), dp(24)]
MDTextField:
id: hardware_modem_databits
hint_text: "Data Bits"
text: ""
font_size: dp(24)
MDTextField:
id: hardware_modem_parity
hint_text: "Parity"
text: ""
font_size: dp(24)
MDTextField:
id: hardware_modem_stopbits
hint_text: "Stop Bits"
text: ""
font_size: dp(24)
MDLabel:
text: "CSMA Parameters"
font_style: "H6"
MDBoxLayout:
orientation: "horizontal"
spacing: "24dp"
size_hint_y: None
height: self.minimum_height
padding: [dp(0), dp(0), dp(0), dp(0)]
MDTextField:
id: hardware_modem_preamble
hint_text: "Preamble (ms)"
text: ""
font_size: dp(24)
MDTextField:
id: hardware_modem_tail
hint_text: "TX Tail (ms)"
text: ""
font_size: dp(24)
MDBoxLayout:
orientation: "horizontal"
spacing: "24dp"
size_hint_y: None
height: self.minimum_height
padding: [dp(0), dp(0), dp(0), dp(24)]
MDTextField:
id: hardware_modem_persistence
hint_text: "Persistence (1-255)"
text: ""
font_size: dp(24)
MDTextField:
id: hardware_modem_slottime
hint_text: "Slot Time (ms)"
text: ""
font_size: dp(24)
MDLabel:
text: "Optional Settings"
font_style: "H6"
MDBoxLayout:
orientation: "horizontal"
spacing: "24dp"
size_hint_y: None
height: self.minimum_height
# padding: [dp(0), dp(0), dp(0), dp(35)]
MDTextField:
id: hardware_modem_beaconinterval
hint_text: "Beacon Interval (seconds)"
text: ""
font_size: dp(24)
MDTextField:
id: hardware_modem_beacondata
hint_text: "Beacon Data"
text: ""
font_size: dp(24)
2022-10-15 02:35:40 -06:00
MDScreen:
name: "hardware_serial_screen"
BoxLayout:
orientation: "vertical"
MDTopAppBar:
title: "Serial Port"
anchor_title: "left"
2023-07-10 12:06:17 -06:00
elevation: 0
2022-10-15 02:35:40 -06:00
left_action_items:
[['menu', lambda x: nav_drawer.set_state("open")]]
right_action_items:
[
['close', lambda x: root.ids.screen_manager.app.close_sub_hardware_action(self)],
]
ScrollView:
id: hardware_serial_scrollview
MDBoxLayout:
orientation: "vertical"
spacing: "8dp"
size_hint_y: None
height: self.minimum_height
padding: [dp(28), dp(48), dp(28), dp(16)]
MDLabel:
text: "Serial Hardware Parameters\\n"
font_style: "H6"
MDLabel:
id: hardware_serial_info
markup: True
2022-10-15 08:55:15 -06:00
text: "To communicate using a serial port, you will need to specify the following parameters. If communicating directly to another Reticulum instance over serial, the parameters must match the other device.\\n\\nIf you are using a serial-connected device to pass on data to other Reticulum instances, it should be configured to pass data transparently to the desired endpoints.\\n"
2022-10-15 02:35:40 -06:00
size_hint_y: None
text_size: self.width, None
height: self.texture_size[1]
# MDBoxLayout:
# orientation: "horizontal"
# spacing: "24dp"
# size_hint_y: None
# height: self.minimum_height
# padding: [dp(0), dp(0), dp(0), dp(35)]
# MDRectangleFlatIconButton:
# id: serial_mote_export
# icon: "upload"
# text: "Export"
# padding: [dp(0), dp(14), dp(0), dp(14)]
# icon_size: dp(24)
# font_size: dp(16)
# size_hint: [1.0, None]
# on_release: root.ids.screen_manager.app.hardware_serial_export(self)
# MDRectangleFlatIconButton:
# id: serial_mote_import
# icon: "download"
# text: "Import"
# padding: [dp(0), dp(14), dp(0), dp(14)]
# icon_size: dp(24)
# font_size: dp(16)
# size_hint: [1.0, None]
# on_release: root.ids.screen_manager.app.hardware_serial_import(self)
MDLabel:
text: "Port Options"
font_style: "H6"
MDBoxLayout:
orientation: "horizontal"
spacing: "24dp"
size_hint_y: None
height: self.minimum_height
# padding: [dp(0), dp(0), dp(0), dp(35)]
MDTextField:
id: hardware_serial_baudrate
hint_text: "Baud Rate"
text: ""
font_size: dp(24)
MDBoxLayout:
orientation: "horizontal"
spacing: "24dp"
size_hint_y: None
height: self.minimum_height
padding: [dp(0), dp(0), dp(0), dp(24)]
MDTextField:
id: hardware_serial_databits
hint_text: "Data Bits"
text: ""
font_size: dp(24)
MDTextField:
id: hardware_serial_parity
hint_text: "Parity"
text: ""
font_size: dp(24)
MDTextField:
id: hardware_serial_stopbits
hint_text: "Stop Bits"
text: ""
font_size: dp(24)
2022-04-07 13:03:53 -06:00
MDNavigationDrawer:
id: nav_drawer
2022-10-02 09:17:55 -06:00
radius: (0, dp(8), dp(8), 0)
2022-04-07 13:03:53 -06:00
ContentNavigationDrawer:
ScrollView:
id: nav_scrollview
2022-04-07 13:03:53 -06:00
DrawerList:
id: md_list
MDList:
OneLineIconListItem:
text: "Conversations"
on_release: root.ids.screen_manager.app.conversations_action(self)
2022-11-23 14:00:12 -07:00
# _no_ripple_effect: True
2022-04-07 13:03:53 -06:00
IconLeftWidget:
icon: "email"
on_release: root.ids.screen_manager.app.conversations_action(self)
OneLineIconListItem:
text: "Announce Stream"
on_release: root.ids.screen_manager.app.announces_action(self)
IconLeftWidget:
icon: "account-voice"
on_release: root.ids.screen_manager.app.announces_action(self)
OneLineIconListItem:
text: "Local Broadcasts"
on_release: root.ids.screen_manager.app.broadcasts_action(self)
IconLeftWidget:
icon: "radio-tower"
on_release: root.ids.screen_manager.app.broadcasts_action(self)
OneLineIconListItem:
text: "Situation Map"
2022-04-07 13:03:53 -06:00
on_release: root.ids.screen_manager.app.map_action(self)
IconLeftWidget:
icon: "map"
on_release: root.ids.screen_manager.app.map_action(self)
OneLineIconListItem:
text: "Telemetry"
on_release: root.ids.screen_manager.app.telemetry_action(self)
IconLeftWidget:
2023-10-20 05:00:54 -06:00
icon: "map-marker-path"
on_release: root.ids.screen_manager.app.telemetry_action(self)
OneLineIconListItem:
text: "Preferences"
on_release: root.ids.screen_manager.app.settings_action(self)
IconLeftWidget:
icon: "cog"
on_release: root.ids.screen_manager.app.settings_action(self)
2022-04-07 13:03:53 -06:00
OneLineIconListItem:
text: "Connectivity"
on_release: root.ids.screen_manager.app.connectivity_action(self)
IconLeftWidget:
icon: "wifi"
on_release: root.ids.screen_manager.app.connectivity_action(self)
OneLineIconListItem:
text: "Hardware"
on_release: root.ids.screen_manager.app.hardware_action(self)
2022-04-07 13:03:53 -06:00
IconLeftWidget:
icon: "router-wireless"
on_release: root.ids.screen_manager.app.hardware_action(self)
2022-04-07 13:03:53 -06:00
OneLineIconListItem:
text: "Encryption Keys"
on_release: root.ids.screen_manager.app.keys_action(self)
IconLeftWidget:
icon: "key-chain"
on_release: root.ids.screen_manager.app.keys_action(self)
OneLineIconListItem:
text: "Guide"
on_release: root.ids.screen_manager.app.guide_action(self)
IconLeftWidget:
icon: "book-open"
on_release: root.ids.screen_manager.app.guide_action(self)
OneLineIconListItem:
text: "Repository"
on_release: root.ids.screen_manager.app.repository_action(self)
IconLeftWidget:
icon: "book-multiple"
on_release: root.ids.screen_manager.app.guide_action(self)
2022-04-07 13:03:53 -06:00
OneLineIconListItem:
id: app_version_info
text: ""
on_release: root.ids.screen_manager.app.information_action(self)
IconLeftWidget:
icon: "information"
on_release: root.ids.screen_manager.app.information_action(self)
OneLineIconListItem:
text: "Shutdown"
on_release: root.ids.screen_manager.app.quit_action(self)
IconLeftWidget:
icon: "power"
on_release: root.ids.screen_manager.app.quit_action(self)
<ListLXMessageCard>:
2022-10-08 10:01:33 -06:00
style: "outlined"
2022-10-02 09:17:55 -06:00
elevation: 2
2022-04-07 13:03:53 -06:00
padding: dp(8)
2022-10-02 09:17:55 -06:00
radius: [dp(4), dp(4), dp(4), dp(4)]
2022-04-07 13:03:53 -06:00
size_hint: 1.0, None
height: content_text.height + heading_text.height + dp(32)
pos_hint: {"center_x": .5, "center_y": .5}
MDRelativeLayout:
size_hint: 1.0, None
2022-10-02 06:51:01 -06:00
theme_text_color: "ContrastParentBackground"
2022-04-07 13:03:53 -06:00
MDIconButton:
id: msg_submenu
icon: "dots-vertical"
2022-10-02 17:36:21 -06:00
# theme_text_color: 'Custom'
# text_color: rgba(255,255,255,216)
2022-04-07 13:03:53 -06:00
pos:
root.width - (self.width + root.padding[0] + dp(4)), root.height - (self.height + root.padding[0] + dp(4))
MDLabel:
id: heading_text
markup: True
text: root.heading
adaptive_size: True
2022-10-02 17:36:21 -06:00
# theme_text_color: 'Custom'
# text_color: rgba(255,255,255,100)
2022-04-07 13:03:53 -06:00
pos: 0, root.height - (self.height + root.padding[0] + dp(8))
MDLabel:
id: content_text
text: root.text
# adaptive_size: True
size_hint_y: None
text_size: self.width, None
2022-10-02 17:36:21 -06:00
# theme_text_color: 'Custom'
# text_color: rgba(255,255,255,216)
2022-04-07 13:03:53 -06:00
height: self.texture_size[1]
<MsgSync>
orientation: "vertical"
spacing: "24dp"
size_hint_y: None
padding: [0, 0, 0, dp(16)]
2022-04-07 13:03:53 -06:00
height: self.minimum_height+dp(24)
MDProgressBar:
id: sync_progress
value: 0
2022-04-07 13:03:53 -06:00
MDLabel:
id: sync_status
hint_text: "Name"
text: "Initiating sync..."
<ConvSettings>
orientation: "vertical"
spacing: "16dp"
2022-04-07 13:03:53 -06:00
size_hint_y: None
padding: [0, 0, 0, dp(8)]
height: self.minimum_height
MDTextField:
id: dest_field
hint_text: "Address"
text: root.context_dest
# disabled: True
font_size: dp(18)
2022-04-07 13:03:53 -06:00
MDTextField:
id: name_field
hint_text: "Name"
text: root.disp_name
font_size: dp(18)
2022-04-07 13:03:53 -06:00
MDBoxLayout:
orientation: "horizontal"
# spacing: "24dp"
size_hint_y: None
padding: [0,0,dp(8),0]
2022-04-07 13:03:53 -06:00
height: dp(48)
MDLabel:
id: trusted_switch_label
text: "Trusted"
font_style: "H6"
MDSwitch:
id: trusted_switch
pos_hint: {"center_y": 0.43}
2022-04-07 13:03:53 -06:00
active: root.trusted
MDBoxLayout:
orientation: "horizontal"
# spacing: "24dp"
size_hint_y: None
padding: [0,0,dp(8),0]
height: dp(48)
MDLabel:
id: telemetry_switch_label
text: "Include Telemetry"
font_style: "H6"
MDSwitch:
id: telemetry_switch
pos_hint: {"center_y": 0.43}
active: root.telemetry
2022-04-07 13:03:53 -06:00
<NewConv>
orientation: "vertical"
spacing: "24dp"
size_hint_y: None
height: dp(250)
MDTextField:
id: n_address_field
2022-07-03 02:38:39 -06:00
max_text_length: 32
2022-04-07 13:03:53 -06:00
hint_text: "Address"
helper_text: "Error, check your input"
helper_text_mode: "on_error"
text: ""
font_size: dp(24)
MDTextField:
id: n_name_field
hint_text: "Name"
text: ""
font_size: dp(24)
MDBoxLayout:
orientation: "horizontal"
size_hint_y: None
2022-10-18 11:17:55 -06:00
padding: [0,0,dp(8),dp(24)]
2022-04-07 13:03:53 -06:00
height: dp(48)
MDLabel:
id: "trusted_switch_label"
text: "Trusted"
font_style: "H6"
MDSwitch:
id: n_trusted
2022-10-02 14:00:15 -06:00
pos_hint: {"center_y": 0.3}
2022-04-07 13:03:53 -06:00
active: False
<CustomOneLineIconListItem>
IconLeftWidget:
icon: root.icon
2022-04-07 13:03:53 -06:00
"""