2021-04-08 14:57:31 -04:00
import RNS
import importlib
2021-04-09 16:07:38 -04:00
import time
2021-05-04 14:53:03 -04:00
import nomadnet
2021-05-04 05:08:31 -04:00
from nomadnet . ui . textui import *
2021-05-04 14:53:03 -04:00
from nomadnet import NomadNetworkApp
COLORMODE_MONO = 1
COLORMODE_16 = 16
COLORMODE_88 = 88
COLORMODE_256 = 256
COLORMODE_TRUE = 2 * * 24
THEME_DARK = 0x01
THEME_LIGHT = 0x02
THEMES = {
2021-07-04 19:15:02 -04:00
THEME_DARK : {
" urwid_theme " : [
# Style name # 16-color style # Monochrome style # 88, 256 and true-color style
( ' heading ' , ' light gray,underline ' , ' default ' , ' underline ' , ' g93,underline ' , ' default ' ) ,
( ' menubar ' , ' black ' , ' light gray ' , ' standout ' , ' #111 ' , ' #bbb ' ) ,
2021-07-06 03:23:37 -04:00
( ' scrollbar ' , ' black ' , ' light gray ' , ' standout ' , ' #444 ' , ' default ' ) ,
2021-07-04 19:15:02 -04:00
( ' shortcutbar ' , ' black ' , ' light gray ' , ' standout ' , ' #111 ' , ' #bbb ' ) ,
( ' body_text ' , ' white ' , ' default ' , ' default ' , ' #ddd ' , ' default ' ) ,
( ' error_text ' , ' dark red ' , ' default ' , ' default ' , ' dark red ' , ' default ' ) ,
( ' warning_text ' , ' yellow ' , ' default ' , ' default ' , ' #ba4 ' , ' default ' ) ,
( ' inactive_text ' , ' dark gray ' , ' default ' , ' default ' , ' dark gray ' , ' default ' ) ,
( ' buttons ' , ' light green,bold ' , ' default ' , ' default ' , ' #00a533 ' , ' default ' ) ,
( ' msg_editor ' , ' black ' , ' light cyan ' , ' standout ' , ' #111 ' , ' #0bb ' ) ,
( " msg_header_ok " , ' black ' , ' light green ' , ' standout ' , ' #111 ' , ' #6b2 ' ) ,
( " msg_header_caution " , ' black ' , ' yellow ' , ' standout ' , ' #111 ' , ' #fd3 ' ) ,
( " msg_header_sent " , ' black ' , ' light gray ' , ' standout ' , ' #111 ' , ' #ddd ' ) ,
( " msg_header_delivered " , ' black ' , ' light blue ' , ' standout ' , ' #111 ' , ' #28b ' ) ,
( " msg_header_failed " , ' black ' , ' dark gray ' , ' standout ' , ' black ' , ' dark gray ' ) ,
( " msg_warning_untrusted " , ' black ' , ' dark red ' , ' standout ' , ' #111 ' , ' dark red ' ) ,
( " list_focus " , " black " , " light gray " , " standout " , " #111 " , " #bbb " ) ,
( " list_off_focus " , " black " , " dark gray " , " standout " , " #111 " , " dark gray " ) ,
( " list_trusted " , " light green " , " default " , " default " , " #6b2 " , " default " ) ,
( " list_focus_trusted " , " black " , " light gray " , " standout " , " #180 " , " #bbb " ) ,
( " list_unknown " , " dark gray " , " default " , " default " , " light gray " , " default " ) ,
( " list_normal " , " dark gray " , " default " , " default " , " light gray " , " default " ) ,
( " list_untrusted " , " dark red " , " default " , " default " , " dark red " , " default " ) ,
( " list_focus_untrusted " , " black " , " light gray " , " standout " , " #810 " , " #bbb " ) ,
] ,
}
2021-05-04 14:53:03 -04:00
}
2021-04-08 14:57:31 -04:00
2021-07-02 07:35:10 -04:00
GLYPHSETS = {
" plain " : 1 ,
" unicode " : 2 ,
" nerdfont " : 3
}
GLYPHS = {
# Glyph name # Plain # Unicode # Nerd Font
( " check " , " = " , " \u2713 " , " \u2713 " ) ,
( " cross " , " X " , " \u2715 " , " \u2715 " ) ,
( " unknown " , " ? " , " ? " , " ? " ) ,
( " lock " , " E " , " \U0001f512 " , " \uf023 " ) ,
( " unlock " , " ! " , " \U0001f513 " , " \uf09c " ) ,
( " arrow_r " , " -> " , " \u2192 " , " \u2192 " ) ,
( " arrow_l " , " <- " , " \u2190 " , " \u2190 " ) ,
( " arrow_u " , " / \\ " , " \u2191 " , " \u2191 " ) ,
( " arrow_d " , " \\ / " , " \u2193 " , " \u2193 " ) ,
( " warning " , " ! " , " \u26a0 " , " \uf12a " ) ,
( " info " , " i " , " \u2139 " , " \ufb4d " ) ,
( " divider1 " , " - " , " \u2504 " , " \u2504 " ) ,
2021-08-26 10:17:01 -04:00
( " peer " , " P " , " \U0001F464 " , " \uf415 " ) ,
( " node " , " N " , " \U0001F5A5 " , " \uf502 " ) ,
2021-07-02 07:35:10 -04:00
( " decoration_menu " , " " , " " , " \uf93a " ) ,
}
2021-04-08 14:57:31 -04:00
class TextUI :
def __init__ ( self ) :
self . app = NomadNetworkApp . get_shared_instance ( )
2021-05-12 08:02:44 -04:00
self . app . ui = self
2021-04-08 14:57:31 -04:00
self . loop = None
if importlib . util . find_spec ( " urwid " ) != None :
import urwid
else :
RNS . log ( " The text-mode user interface requires Urwid to be installed on your system. " , RNS . LOG_ERROR )
RNS . log ( " You can install it with the command: pip3 install urwid " , RNS . LOG_ERROR )
nomadnet . panic ( )
2021-04-09 16:07:38 -04:00
urwid . set_encoding ( " UTF-8 " )
2021-07-04 19:15:02 -04:00
intro_timeout = self . app . config [ " textui " ] [ " intro_time " ]
colormode = self . app . config [ " textui " ] [ " colormode " ]
theme = self . app . config [ " textui " ] [ " theme " ]
mouse_enabled = self . app . config [ " textui " ] [ " mouse_enabled " ]
2021-04-09 16:07:38 -04:00
2021-07-04 19:15:02 -04:00
self . palette = THEMES [ theme ] [ " urwid_theme " ]
2021-07-02 07:35:10 -04:00
if self . app . config [ " textui " ] [ " glyphs " ] == " plain " :
glyphset = " plain "
elif self . app . config [ " textui " ] [ " glyphs " ] == " unicoode " :
glyphset = " unicode "
elif self . app . config [ " textui " ] [ " glyphs " ] == " nerdfont " :
glyphset = " nerdfont "
else :
glyphset = " unicode "
self . glyphs = { }
for glyph in GLYPHS :
self . glyphs [ glyph [ 0 ] ] = glyph [ GLYPHSETS [ glyphset ] ]
2021-04-09 16:07:38 -04:00
self . screen = urwid . raw_display . Screen ( )
2021-07-04 19:15:02 -04:00
self . screen . register_palette ( self . palette )
2021-04-09 16:07:38 -04:00
2021-05-04 14:53:03 -04:00
self . main_display = Main . MainDisplay ( self , self . app )
2021-04-09 16:07:38 -04:00
if intro_timeout > 0 :
2021-05-04 14:53:03 -04:00
self . intro_display = Extras . IntroDisplay ( self . app )
2021-04-09 16:07:38 -04:00
initial_widget = self . intro_display . widget
else :
initial_widget = self . main_display . widget
2021-06-30 17:29:37 -04:00
self . loop = urwid . MainLoop ( initial_widget , screen = self . screen , handle_mouse = mouse_enabled )
2021-04-09 16:07:38 -04:00
if intro_timeout > 0 :
self . loop . set_alarm_in ( intro_timeout , self . display_main )
2021-05-27 04:50:23 -04:00
# TODO: Probably remove this at some point when better terminal
# color capability detection has been implemented
2021-06-30 17:34:51 -04:00
if colormode > 16 :
2021-07-07 07:09:03 -04:00
RNS . log ( " Starting Text UI in " + str ( colormode ) + " color mode. If no UI appears, try adjusting your color settings in " + str ( self . app . configdir ) + " /config " , RNS . LOG_INFO , _override_destination = True )
2021-04-09 16:07:38 -04:00
self . set_colormode ( colormode )
self . loop . run ( )
def set_colormode ( self , colormode ) :
self . screen . set_terminal_properties ( colormode )
self . screen . reset_default_terminal_palette ( )
def display_main ( self , loop , user_data ) :
self . loop . widget = self . main_display . widget