markqvist___Sideband/sbapp/ui/layouts.py
2025-12-25 22:20:34 +01:00

1980 lines
71 KiB
Python

root_layout = """
#: import NoTransition kivy.uix.screenmanager.NoTransition
#: import SlideTransition kivy.uix.screenmanager.SlideTransition
#:import images_path kivymd.images_path
MDNavigationLayout:
md_bg_color: app.theme_cls.bg_darkest
ScreenManager:
id: screen_manager
transition: SlideTransition()
MDScreen:
name: "starting_screen"
AnchorLayout:
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"
icon_size: "92dp"
MDLabel:
id: connecting_status
halign: "center"
text: "Substantiating Reticulum"
font_size: "32dp"
MDNavigationDrawer:
id: nav_drawer
radius: (0, dp(8), dp(8), 0)
ContentNavigationDrawer:
ScrollView:
id: nav_scrollview
DrawerList:
id: md_list
MDList:
OneLineIconListItem:
text: "Conversations"
on_release: root.ids.screen_manager.app.conversations_action(self)
# _no_ripple_effect: True
IconLeftWidget:
icon: "comment-text-multiple"
on_release: root.ids.screen_manager.app.conversations_action(self)
OneLineIconListItem:
text: "Objects & Devices"
on_release: root.ids.screen_manager.app.objects_action(self)
# _no_ripple_effect: True
IconLeftWidget:
icon: "devices"
on_release: root.ids.screen_manager.app.objects_action(self)
OneLineIconListItem:
text: "Situation Map"
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: "Overview"
# on_release: root.ids.screen_manager.app.overview_action(self)
# IconLeftWidget:
# icon: "view-dashboard-outline"
# on_release: root.ids.screen_manager.app.overview_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: "Voice"
on_release: root.ids.screen_manager.app.voice_action(self)
# _no_ripple_effect: True
IconLeftWidget:
icon: "phone-in-talk"
on_release: root.ids.screen_manager.app.voice_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: "Telemetry"
on_release: root.ids.screen_manager.app.telemetry_action(self)
IconLeftWidget:
icon: "map-marker-path"
on_release: root.ids.screen_manager.app.telemetry_action(self)
OneLineIconListItem:
text: "Utilities"
on_release: root.ids.screen_manager.app.utilities_action(self)
IconLeftWidget:
icon: "tools"
on_release: root.ids.screen_manager.app.utilities_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)
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)
IconLeftWidget:
icon: "router-wireless"
on_release: root.ids.screen_manager.app.hardware_action(self)
OneLineIconListItem:
text: "Backup & 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: "Plugins"
on_release: root.ids.screen_manager.app.plugins_action(self)
IconLeftWidget:
icon: "google-circles-extended"
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)
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)
"""
layout_broadcasts_screen = """
MDScreen:
name: "broadcasts_screen"
BoxLayout:
orientation: "vertical"
MDTopAppBar:
title: "Local Broadcasts"
anchor_title: "left"
elevation: 0
left_action_items:
[['menu', lambda x: root.app.nav_drawer.set_state("open")]]
right_action_items:
[
['close', lambda x: root.app.close_any_action(self)],
]
ScrollView:
id: broadcasts_scrollview
MDBoxLayout:
orientation: "vertical"
spacing: "24dp"
size_hint_y: None
height: self.minimum_height
padding: [dp(35), dp(35), dp(35), dp(35)]
MDLabel:
id: broadcasts_info
markup: True
text: ""
size_hint_y: None
text_size: self.width, None
height: self.texture_size[1]
"""
layout_exit_screen = """
MDScreen:
name: "exit_screen"
AnchorLayout:
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: exiting_info
halign: "center"
text: "Please Wait"
font_size: "32dp"
MDIconButton:
pos_hint: {"center_x": .5, "center_y": .5}
icon: "waves"
icon_size: "92dp"
MDLabel:
id: exiting_status
halign: "center"
text: "Dissolving Reticulum"
font_size: "32dp"
"""
layout_loader_screen = """
MDScreen:
name: "loader_screen"
BoxLayout:
orientation: "vertical"
MDTopAppBar:
title: ""
anchor_title: "left"
elevation: 0
left_action_items:
[['menu', None ]]
right_action_items:
[
]
AnchorLayout:
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
MDIconButton:
pos_hint: {"center_x": .5, "center_y": .5}
icon: "dots-horizontal"
icon_size: "64dp"
"""
layout_connectivity_screen = """
MDScreen:
name: "connectivity_screen"
BoxLayout:
orientation: "vertical"
MDTopAppBar:
title: "Connectivity"
anchor_title: "left"
elevation: 0
left_action_items:
[['menu', lambda x: root.app.nav_drawer.set_state("open")]]
right_action_items:
[
['close', lambda x: root.app.close_connectivity_action(self)],
]
ScrollView:
id: connectivity_scrollview
MDBoxLayout:
orientation: "vertical"
spacing: "10dp"
size_hint_y: None
height: self.minimum_height
padding: [dp(28), dp(48), dp(28), dp(16)]
MDLabel:
text: "Configuring Connectivity\\n"
font_style: "H6"
MDLabel:
id: connectivity_info
markup: True
text: ""
size_hint_y: None
text_size: self.width, None
height: self.texture_size[1]
MDBoxLayout:
id: connectivity_service_restart_fields
orientation: "vertical"
size_hint_y: None
height: self.minimum_height
padding: [0, 0, 0, dp(32)]
MDRectangleFlatIconButton:
id: button_service_restart
icon: "restart"
text: "Restart RNS Service"
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.app.restart_service_action(self)
MDBoxLayout:
orientation: "horizontal"
padding: [0,0,dp(24),0]
size_hint_y: None
height: dp(24)
MDLabel:
id: connectivity_local_label
text: "Connect via local WiFi/Ethernet"
font_style: "H6"
MDSwitch:
id: connectivity_use_local
pos_hint: {"center_y": 0.3}
active: False
MDBoxLayout:
id: connectivity_local_fields
orientation: "vertical"
size_hint_y: None
height: self.minimum_height
padding: [0, 0, 0, dp(32)]
MDTextField:
id: connectivity_local_groupid
hint_text: "Optional WiFi/Ethernet Group ID"
text: ""
max_text_length: 128
font_size: dp(24)
MDTextField:
id: connectivity_local_ifac_netname
hint_text: "Optional IFAC network name"
text: ""
font_size: dp(24)
MDTextField:
id: connectivity_local_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_tcp_label
text: "Connect via TCP"
font_style: "H6"
MDSwitch:
id: connectivity_use_tcp
pos_hint: {"center_y": 0.3}
active: False
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)
MDBoxLayout:
orientation: "horizontal"
padding: [0,0,dp(24),0]
size_hint_y: None
height: dp(24)
MDLabel:
id: connectivity_i2p_label
text: "Connect via I2P"
font_style: "H6"
MDSwitch:
id: connectivity_use_i2p
pos_hint: {"center_y": 0.3}
active: False
MDBoxLayout:
id: connectivity_i2p_fields
orientation: "vertical"
size_hint_y: None
height: self.minimum_height
padding: [0, 0, 0, dp(32)]
MDTextField:
id: connectivity_i2p_b32
hint_text: "I2P B32"
text: ""
font_size: dp(24)
MDTextField:
id: connectivity_i2p_ifac_netname
hint_text: "Optional IFAC network name"
text: ""
font_size: dp(24)
MDTextField:
id: connectivity_i2p_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_rnode_label
text: "Connect via RNode"
font_style: "H6"
disabled: False
MDSwitch:
id: connectivity_use_rnode
active: False
pos_hint: {"center_y": 0.3}
disabled: False
MDBoxLayout:
id: connectivity_rnode_fields
orientation: "vertical"
size_hint_y: None
height: self.minimum_height
padding: [0, 0, 0, dp(32)]
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)
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"
font_style: "H6"
disabled: False
MDSwitch:
id: connectivity_use_modem
active: False
pos_hint: {"center_y": 0.3}
disabled: False
MDBoxLayout:
id: connectivity_modem_fields
orientation: "vertical"
size_hint_y: None
height: self.minimum_height
padding: [0, 0, 0, dp(32)]
MDTextField:
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"
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"
font_style: "H6"
disabled: False
MDSwitch:
id: connectivity_use_serial
active: False
pos_hint: {"center_y": 0.3}
disabled: False
MDBoxLayout:
id: connectivity_serial_fields
orientation: "vertical"
size_hint_y: None
height: self.minimum_height
padding: [0, 0, 0, dp(32)]
MDTextField:
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_weave_label
text: "Connect via Weave"
font_style: "H6"
disabled: False
MDSwitch:
id: connectivity_use_weave
active: False
pos_hint: {"center_y": 0.3}
disabled: False
MDBoxLayout:
id: connectivity_weave_fields
orientation: "vertical"
size_hint_y: None
height: self.minimum_height
padding: [0, 0, 0, dp(32)]
MDTextField:
id: connectivity_weave_ifac_netname
hint_text: "Optional IFAC network name"
text: ""
font_size: dp(24)
MDTextField:
id: connectivity_weave_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
# MDLabel:
# text: "Shared Instance Access\\n"
# id: connectivity_shared_access_label
# font_style: "H5"
MDBoxLayout:
orientation: "horizontal"
padding: [0,0,dp(24),0]
size_hint_y: None
height: dp(24)
MDLabel:
id: connectivity_shared_access_label
text: "Share Reticulum Instance"
font_style: "H6"
# disabled: True
MDSwitch:
id: connectivity_share_instance
active: False
pos_hint: {"center_y": 0.3}
# disabled: True
MDLabel:
id: connectivity_shared_access
markup: True
text: "You can make the Reticulum instance launched by Sideband 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:
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.app.rpc_copy_action(self)
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
MDSwitch:
id: connectivity_enable_transport
active: False
pos_hint: {"center_y": 0.3}
# disabled: True
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)
"""
layout_information_screen = """
MDScreen:
name: "information_screen"
BoxLayout:
orientation: "vertical"
MDTopAppBar:
title: "App & Version Information"
anchor_title: "left"
elevation: 0
left_action_items:
[['menu', lambda x: root.app.nav_drawer.set_state("open")]]
right_action_items:
[
['close', lambda x: root.app.close_information_action(self)],
]
ScrollView:
id:information_scrollview
MDBoxLayout:
orientation: "vertical"
size_hint_y: None
height: self.minimum_height
spacing: dp(35)
padding: [dp(35), dp(32), dp(35), dp(16)]
MDLabel:
id: information_info
markup: True
text: ""
size_hint_y: None
text_size: self.width, None
height: self.texture_size[1]
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)]
pos_hint: {"center_x": .5, "center_y": .5}
MDIcon:
pos_hint: {"center_x": .5, "center_y": .5}
id: information_logo
font_size: "256dp"
width: dp(256)
height: dp(256)
"""
layout_map_settings_screen = """
MDScreen:
name: "map_settings_screen"
BoxLayout:
orientation: "vertical"
MDTopAppBar:
title: "Map Configuration"
anchor_title: "left"
elevation: 0
left_action_items:
[['menu', lambda x: root.app.nav_drawer.set_state("open")]]
right_action_items:
[
['close', lambda x: root.app.close_sub_map_action(self)],
]
ScrollView:
id: map_settings_scrollview
MDBoxLayout:
orientation: "vertical"
size_hint_y: None
height: self.minimum_height
padding: [dp(28), dp(48), dp(28), dp(16)]
MDLabel:
text: "Configure Map"
font_style: "H6"
MDLabel:
id: map_config_info
markup: True
text: ""
size_hint_y: None
text_size: self.width, None
height: self.texture_size[1]
MDLabel:
markup: True
text: "\\n"
size_hint_y: None
text_size: self.width, None
height: self.texture_size[1]
MDBoxLayout:
orientation: "horizontal"
padding: [0,0,dp(24),0]
size_hint_y: None
height: dp(48)
MDLabel:
text: "Use online map sources"
font_style: "H6"
MDSwitch:
id: map_use_online
pos_hint: {"center_y": 0.3}
active: False
MDBoxLayout:
orientation: "horizontal"
padding: [0,0,dp(24),0]
size_hint_y: None
height: dp(48)
MDLabel:
text: "Use offline map source"
font_style: "H6"
MDSwitch:
id: map_use_offline
pos_hint: {"center_y": 0.3}
active: False
MDBoxLayout:
orientation: "horizontal"
padding: [0,0,dp(24),0]
size_hint_y: None
height: dp(48)
MDLabel:
id: map_storage_external_label
text: "Use external storage path"
font_style: "H6"
MDSwitch:
id: map_storage_external
pos_hint: {"center_y": 0.3}
active: False
MDBoxLayout:
orientation: "vertical"
size_hint_y: None
spacing: dp(24)
height: self.minimum_height
padding: [0, dp(24), 0, 0]
MDRectangleFlatIconButton:
id: map_select_button
icon: "list-box-outline"
text: "Select MBTiles Map"
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.app.map_select_file_action(self)
disabled: False
MDRectangleFlatIconButton:
id: map_cache_button
icon: "map-clock-outline"
text: "Clear map cache"
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.app.map_clear_cache(self)
disabled: False
"""
layout_map_screen = """
MDScreen:
name: "map_screen"
BoxLayout:
orientation: "vertical"
MDTopAppBar:
title: "Map"
anchor_title: "left"
elevation: 0
left_action_items:
[['menu', lambda x: root.app.nav_drawer.set_state("open")]]
right_action_items:
[
#['format-list-bulleted-type', lambda x: root.app.map_object_list(self)], # Object List
['arrow-down-bold-hexagon-outline', lambda x: root.app.telemetry_request_action(self)], # Download telemetry
['upload-lock', lambda x: root.app.telemetry_send_update(self)], # Send telemetry update
['layers', lambda x: root.app.map_layers_action(self)],
['wrench-cog', lambda x: root.app.map_settings_action(self)],
['crosshairs-gps', lambda x: root.app.map_own_location_action(self)],
['close', lambda x: root.app.close_any_action(self)],
]
MDBoxLayout:
id: map_layout
"""
layout_plugins_screen = """
MDScreen:
name: "plugins_screen"
BoxLayout:
orientation: "vertical"
MDTopAppBar:
title: "Plugins & Services"
anchor_title: "left"
elevation: 0
left_action_items:
[['menu', lambda x: root.app.nav_drawer.set_state("open")]]
right_action_items:
[
['close', lambda x: root.app.close_plugins_action(self)],
]
ScrollView:
id:plugins_scrollview
MDBoxLayout:
orientation: "vertical"
spacing: "24dp"
size_hint_y: None
height: self.minimum_height
padding: [dp(35), dp(35), dp(35), dp(35)]
MDLabel:
padding: [0,dp(0),dp(0),dp(0)]
text: "Plugin Settings"
id: plugins_active_heading
font_style: "H5"
size_hint_y: None
height: self.texture_size[1]
MDLabel:
id: plugins_info1
markup: True
text: ""
size_hint_y: None
height: self.texture_size[1]
MDBoxLayout:
orientation: "horizontal"
size_hint_y: None
padding: [0,0,dp(26),dp(0)]
height: dp(24)
MDLabel:
text: "Enable Plugins"
font_style: "H6"
MDSwitch:
id: settings_service_plugins_enabled
pos_hint: {"center_y": 0.3}
active: False
MDBoxLayout:
orientation: "horizontal"
size_hint_y: None
padding: [0,0,dp(26),dp(0)]
height: dp(24)
MDLabel:
text: "Enable Command Plugins"
font_style: "H6"
MDSwitch:
id: settings_command_plugins_enabled
pos_hint: {"center_y": 0.3}
active: False
MDRectangleFlatIconButton:
id: plugins_display
icon: "folder-cog-outline"
text: "Select Plugins Directory"
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.app.plugins_select_directory_action(self)
MDLabel:
id: plugins_info2
markup: True
text: ""
size_hint_y: None
text_size: self.width, None
height: self.texture_size[1]
MDLabel:
padding: [0,dp(14),dp(0),dp(0)]
text: "Active Plugins"
id: plugins_active_heading
font_style: "H6"
size_hint_y: None
height: self.texture_size[1]
MDLabel:
id: plugins_loaded
markup: True
text: ""
size_hint_y: None
height: self.texture_size[1]
"""
layout_settings_screen = """
<UIScaling>
orientation: "vertical"
spacing: "24dp"
size_hint_y: None
height: self.minimum_height+dp(0)
MDLabel:
id: scaling_info
markup: True
text: "You can scale the entire Sideband UI by specifying a scaling factor in the field below. After setting it, restart sideband for the scaling to take effect.\\n\\nSet to 0.0 to disable scaling adjustments.\\n\\n[b]Please note![/b] On some devices, the default scaling factor will be higher than 1.0, and setting a smaller value will result in miniscule UI elements."
size_hint_y: None
text_size: self.width, None
height: self.texture_size[1]
MDTextField:
id: scaling_factor
hint_text: "Scaling Factor"
helper_text: "From 0.3 to 5.0"
helper_text_mode: "on_focus"
text: ""
font_size: dp(24)
MDScreen:
name: "settings_screen"
BoxLayout:
orientation: "vertical"
MDTopAppBar:
id: settings_top_bar
title: "Preferences"
anchor_title: "left"
elevation: 0
left_action_items:
[['menu', lambda x: root.app.nav_drawer.set_state("open")]]
right_action_items:
[
['close', lambda x: root.app.close_settings_action(self)],
]
MDScrollView:
id: settings_scrollview
size_hint_x: 1
size_hint_y: None
size: [root.width, root.height-root.ids.settings_top_bar.height]
do_scroll_x: False
do_scroll_y: True
MDGridLayout:
cols: 1
padding: [dp(28), dp(28), dp(28), dp(28)]
size_hint_y: None
height: self.minimum_height
MDLabel:
text: "User Options"
font_style: "H5"
size_hint_y: None
height: self.texture_size[1]
MDLabel:
id: settings_info1
markup: True
text: ""
size_hint_y: None
height: self.texture_size[1]
MDBoxLayout:
orientation: "vertical"
size_hint_y: None
height: self.minimum_height
padding: [0, dp(24), 0, dp(24)]
MDTextField:
id: settings_display_name
hint_text: "Display Name"
text: ""
max_text_length: 128
font_size: dp(24)
MDTextField:
id: settings_propagation_node_address
hint_text: "LXMF Propagation Node"
text: ""
max_text_length: 32
font_size: dp(24)
height: dp(64)
MDTextField:
id: settings_print_command
hint_text: "Print Command"
text: ""
font_size: dp(24)
height: dp(64)
MDLabel:
text: ""
font_style: "H6"
text_size: self.size
halign: "center"
size_hint_y: None
height: self.texture_size[1]
padding: [0, dp(2), 0, dp(22)]
MDLabel:
text: "Address & Identity"
font_style: "H5"
size_hint_y: None
height: self.texture_size[1]
MDLabel:
id: settings_info2
markup: True
text: "\\nYour address and identity hashes are derived from your primary identity keys, and are therefore not editable, but these fields can be used to view and copy the hashes. If you want a new LXMF address, create or import a new primary identity.\\n"
size_hint_y: None
height: self.texture_size[1]
MDBoxLayout:
orientation: "vertical"
size_hint_y: None
height: self.minimum_height
padding: [0, dp(0), 0, dp(24)]
MDTextField:
id: settings_lxmf_address
hint_text: "Your LXMF Address"
text: ""
max_text_length: 32
font_size: dp(24)
height: dp(64)
MDTextField:
id: settings_identity_hash
hint_text: "Your Identity Hash"
text: ""
max_text_length: 32
font_size: dp(24)
height: dp(64)
MDLabel:
text: ""
font_style: "H6"
text_size: self.size
halign: "center"
size_hint_y: None
height: self.texture_size[1]
padding: [0, dp(2), 0, dp(22)]
MDLabel:
text: "Appearance"
font_style: "H5"
size_hint_y: None
height: self.texture_size[1]
MDLabel:
id: settings_info3
markup: True
text: "\\nThis section lets you configure the appearance of the application to suit your preferences, such as themes and what levels of information to display. When user icons are enabled, the contact list will display icons other users have configured in their [b]Telemetry[/b] settings.\\n"
size_hint_y: None
height: self.texture_size[1]
MDRectangleFlatIconButton:
id: appearance_ui_scaling
icon: "relative-scale"
text: "Configure UI Scaling"
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.app.configure_ui_scaling_action(self)
MDBoxLayout:
orientation: "horizontal"
size_hint_y: None
padding: [0,dp(14),dp(24),dp(0)]
height: dp(62)
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:
text: "Dark Mode"
font_style: "H6"
MDSwitch:
id: settings_dark_ui
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: "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:
text: "Classic message colors"
font_style: "H6"
MDSwitch:
id: settings_classic_message_colors
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: "Show user icons in conversation list"
font_style: "H6"
MDSwitch:
id: display_style_in_contact_list
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: "Only show user icons from trusted"
font_style: "H6"
MDSwitch:
id: display_style_from_trusted_only
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: "Advanced Metrics"
font_style: "H6"
MDSwitch:
id: settings_advanced_statistics
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: "Start at boot"
font_style: "H6"
MDSwitch:
id: settings_start_at_boot
pos_hint: {"center_y": 0.3}
active: False
MDLabel:
text: ""
font_style: "H6"
text_size: self.size
halign: "center"
size_hint_y: None
height: self.texture_size[1]
padding: [0, dp(22), 0, dp(2)]
MDLabel:
text: "\\nBehaviour"
font_style: "H5"
size_hint_y: None
height: self.texture_size[1]
MDLabel:
id: settings_info3
markup: True
text: "\\nThis section configures various automated actions and default behaviours. Sync intervals can be configured, and you can control what kind of peers can send you messages.\\n"
size_hint_y: 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: "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: "Try propagation automatically"
font_style: "H6"
MDSwitch:
id: settings_lxmf_try_propagation_on_fail
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: "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: "Only render markup from trusted"
font_style: "H6"
MDSwitch:
id: settings_trusted_markup_only
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: "Compose messages in markdown"
font_style: "H6"
MDSwitch:
id: settings_compose_in_markdown
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 incoming messages to 1MB"
font_style: "H6"
MDSwitch:
id: settings_lxm_limit_1mb
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: 1
max: 214
value: 150
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:
id: settings_lxmf_require_stamps_label
text: "Require stamps for incoming"
font_style: "H6"
MDSwitch:
id: settings_lxmf_require_stamps
pos_hint: {"center_y": 0.3}
disabled: False
active: False
MDBoxLayout:
id: lxmf_costslider_container
orientation: "vertical"
size_hint_y: None
padding: [0,0,dp(0),0]
height: dp(68)
MDSlider
min: 1
max: 32
value: 8
id: settings_lxmf_require_stamps_cost
sensitivity: "all"
hint: False
MDBoxLayout:
orientation: "horizontal"
size_hint_y: None
padding: [0,0,dp(24),dp(0)]
height: dp(48)
MDLabel:
text: "Ignore messages with invalid stamps"
font_style: "H6"
MDSwitch:
id: settings_ignore_invalid_stamps
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: "High-quality codec for LXMF PTT"
font_style: "H6"
MDSwitch:
id: settings_hq_ptt
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: "Enable voice calls"
font_style: "H6"
MDSwitch:
id: settings_voice_enabled
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: "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
MDBoxLayout:
orientation: "horizontal"
size_hint_y: None
padding: [0,0,dp(24),dp(24)]
height: dp(48+24)
MDLabel:
text: "Debug Logging"
font_style: "H6"
MDSwitch:
id: settings_debug
pos_hint: {"center_y": 0.3}
disabled: False
active: False
MDLabel:
text: ""
font_style: "H6"
text_size: self.size
halign: "center"
size_hint_y: None
height: self.texture_size[1]
padding: [0, dp(0), 0, dp(30)]
MDLabel:
text: "Input Options & Localisation"
font_style: "H5"
size_hint_y: None
height: self.texture_size[1]
MDLabel:
id: settings_info_lang
markup: True
text: ""
size_hint_y: 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: "Latin, Greek, Cyrillic"
font_style: "H6"
MDSwitch:
id: settings_lang_default
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: "Chinese"
font_style: "H6"
MDSwitch:
id: settings_lang_chinese
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: "Japanese"
font_style: "H6"
MDSwitch:
id: settings_lang_japanese
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: "Korean"
font_style: "H6"
MDSwitch:
id: settings_lang_korean
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: "Devanagari"
font_style: "H6"
MDSwitch:
id: settings_lang_devangari
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: "Hebrew (incomplete)"
font_style: "H6"
MDSwitch:
id: settings_lang_hebrew
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: "Block Predictive Text"
font_style: "H6"
MDSwitch:
id: settings_block_predictive_text
pos_hint: {"center_y": 0.3}
active: False
# MDBoxLayout:
# orientation: "vertical"
# size_hint_y: None
# height: self.minimum_height
# padding: [0, dp(24), 0, dp(24)]
# MDRectangleFlatIconButton:
# id: input_language_button
# icon: "translate"
# text: "Input Languages"
# 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.app.input_languages_action(self)
"""
layout_repository_screen = """
MDScreen:
name: "repository_screen"
BoxLayout:
orientation: "vertical"
MDTopAppBar:
title: "Share Software & Guides"
anchor_title: "left"
elevation: 0
left_action_items:
[['menu', lambda x: root.app.nav_drawer.set_state("open")]]
right_action_items:
[
['close', lambda x: root.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.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.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.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]
"""