Work on text ui

This commit is contained in:
Mark Qvist 2021-04-09 22:07:38 +02:00
parent 450ed9c54b
commit 8737e3308a
5 changed files with 180 additions and 21 deletions

View File

@ -32,6 +32,7 @@ class NomadNetworkApp:
NomadNetworkApp._shared_instance = self
self.configpath = self.configdir+"/config"
self.logfilepath = self.configdir+"/logfile"
self.storagepath = self.configdir+"/storage"
self.identitypath = self.configdir+"/storage/identity"
self.cachepath = self.configdir+"/storage/cache"
@ -49,6 +50,12 @@ class NomadNetworkApp:
if os.path.isfile(self.configpath):
try:
self.config = ConfigObj(self.configpath)
try:
self.applyConfig()
except Exception as e:
RNS.log("The configuration file is invalid. The contained exception was: "+str(e), RNS.LOG_ERROR)
nomadnet.panic()
RNS.log("Configuration loaded from "+self.configpath)
except Exception as e:
RNS.log("Could not parse the configuration at "+self.configpath, RNS.LOG_ERROR)
@ -57,9 +64,7 @@ class NomadNetworkApp:
else:
RNS.log("Could not load config file, creating default configuration file...")
self.createDefaultConfig()
RNS.log("Default config file created. Make any necessary changes in "+self.configdir+"/config and start Nomad Network Client again.")
RNS.log("Exiting now!")
exit(1)
if os.path.isfile(self.identitypath):
try:
@ -82,9 +87,9 @@ class NomadNetworkApp:
except Exception as e:
RNS.log("Could not create and save a new Primary Identity", RNS.LOG_ERROR)
RNS.log("The contained exception was: %s" % (str(e)), RNS.LOG_ERROR)
RNS.panic()
nomadnet.panic()
self.applyConfig()
self.rns = RNS.Reticulum(configdir = rnsconfigdir)
atexit.register(self.exit_handler)
@ -111,6 +116,14 @@ class NomadNetworkApp:
RNS.loglevel = 0
if RNS.loglevel > 7:
RNS.loglevel = 7
if option == "destination":
if value.lower() == "file":
RNS.logdest = RNS.LOG_FILE
if "logfile" in self.config["logging"]:
self.logfilepath = self.config["logging"]["logfile"]
RNS.logfile = self.logfilepath
else:
RNS.logdest = RNS.LOG_STDOUT
if "client" in self.config:
for option in self.config["client"]:
@ -128,6 +141,39 @@ class NomadNetworkApp:
self.uimode = nomadnet.ui.UI_MENU
if value == "text":
self.uimode = nomadnet.ui.UI_TEXT
if "textui" in self.config:
if not "intro_time" in self.config["textui"]:
self.config["textui"]["intro_time"] = 1
else:
self.config["textui"]["intro_time"] = self.config["textui"].as_int("intro_time")
if not "colormode" in self.config["textui"]:
self.config["textui"]["colormode"] = nomadnet.ui.COLORMODE_16
else:
if self.config["textui"]["colormode"].lower() == "monochrome":
self.config["textui"]["colormode"] = nomadnet.ui.COLORMODE_MONO
elif self.config["textui"]["colormode"].lower() == "16":
self.config["textui"]["colormode"] = nomadnet.ui.COLORMODE_16
elif self.config["textui"]["colormode"].lower() == "88":
self.config["textui"]["colormode"] = nomadnet.ui.COLORMODE_88
elif self.config["textui"]["colormode"].lower() == "256":
self.config["textui"]["colormode"] = nomadnet.ui.COLORMODE_256
elif self.config["textui"]["colormode"].lower() == "24bit":
self.config["textui"]["colormode"] = nomadnet.ui.COLORMODE_TRUE
else:
raise ValueError("The selected Text UI color mode is invalid")
if not "theme" in self.config["textui"]:
self.config["textui"]["theme"] = nomadnet.ui.THEME_DARK
else:
if self.config["textui"]["theme"].lower() == "dark":
self.config["textui"]["theme"] = nomadnet.ui.THEME_DARK
elif self.config["textui"]["theme"].lower() == "light":
self.config["textui"]["theme"] = nomadnet.ui.THEME_LIGHT
else:
raise ValueError("The selected Text UI theme is invalid")
else:
raise KeyError("Text UI selected in configuration file, but no [textui] section found")
if value == "graphical":
self.uimode = nomadnet.ui.UI_GRAPHICAL
if value == "web":
@ -170,12 +216,31 @@ __default_nomadnet_config__ = '''# This is the default Nomad Network config file
# 7: Extreme logging
loglevel = 4
destination = file
[client]
enable_client = Yes
user_interface = text
[textui]
intro_time = 1
# Specify the number of colors to use
# valid colormodes are:
# monochrome, 16, 88, 256 and 24bit
#
# The default is a conservative 88 colors,
# but 256 colors can probably be used on
# most terminals. Some terminals
# colormode = monochrome
# colormode = 16
colormode = 88
# colormode = 256
# colormode = 24bit
[node]
enable_node = No

View File

@ -1,14 +1,15 @@
import RNS
from nomadnet import NomadNetworkApp
import importlib
import time
from nomadnet import NomadNetworkApp
from nomadnet.ui import *
class TextUI:
def __init__(self):
self.app = NomadNetworkApp.get_shared_instance()
self.loop = None
self.main_widget = None
if importlib.util.find_spec("urwid") != None:
import urwid
@ -17,23 +18,98 @@ class TextUI:
RNS.log("You can install it with the command: pip3 install urwid", RNS.LOG_ERROR)
nomadnet.panic()
loop = urwid.MainLoop(self.build_intro())
loop.run()
urwid.set_encoding("UTF-8")
def build_intro(self):
intro_timeout = self.app.config["textui"]["intro_time"]
colormode = self.app.config["textui"]["colormode"]
theme = self.app.config["textui"]["theme"]
palette = nomadnet.ui.THEMES[theme]
self.screen = urwid.raw_display.Screen()
self.screen.register_palette(palette)
self.main_display = DemoDisplay(self, self.app)
if intro_timeout > 0:
self.intro_display = IntroDisplay(self.app)
initial_widget = self.intro_display.widget
else:
initial_widget = self.main_display.widget
self.loop = urwid.MainLoop(initial_widget, screen=self.screen)
if intro_timeout > 0:
self.loop.set_alarm_in(intro_timeout, self.display_main)
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
class DemoDisplay():
def __init__(self, ui, app):
import urwid
def color_mono(btn):
ui.set_colormode(nomadnet.ui.COLORMODE_MONO)
def color_16(btn):
ui.set_colormode(nomadnet.ui.COLORMODE_16)
def color_88(btn):
ui.set_colormode(nomadnet.ui.COLORMODE_88)
def color_8bit(btn):
ui.set_colormode(nomadnet.ui.COLORMODE_256)
def color_true(btn):
ui.set_colormode(nomadnet.ui.COLORMODE_TRUE)
pile = urwid.Pile([
urwid.Text(("heading", "This is a heading")),
urwid.Text(("body_text", "Hello World \U0001F332")),
urwid.Button(("buttons", "Monochrome"), color_mono),
urwid.Button(("buttons", "16 color"), color_16),
urwid.Button(("buttons", "88 color"), color_88),
urwid.Button(("buttons", "256 color"), color_8bit),
urwid.Button(("buttons", "True color"), color_true),
])
self.widget = urwid.Filler(pile, 'top')
class MainDisplay():
def __init__(self, app):
import urwid
pile = urwid.Pile([
urwid.Text(("body_text", "Hello World \U0001F332")),
])
self.widget = urwid.Filler(pile, 'top')
class IntroDisplay():
def __init__(self, app):
import urwid
self.app = app
font = urwid.font.HalfBlock5x4Font()
big_text = "Nomad Network"
big_text = urwid.BigText(("intro_bigtext", big_text), font)
big_text = urwid.BigText(("intro_title", "Nomad Network"), font)
big_text = urwid.Padding(big_text, align="center", width="clip")
intro = urwid.Pile([
big_text,
urwid.Text(["Version %s" % (str(self.app.version))], align="center"),
urwid.Text(("Version %s" % (str(self.app.version))), align="center"),
urwid.Divider(),
urwid.Text(("intro_smalltext", "-= Starting =-"), align="center"),
urwid.Text(("-= Starting =- "), align="center"),
])
return urwid.Filler(intro)
self.widget = urwid.Filler(intro)

View File

@ -8,16 +8,33 @@ from .TextUI import TextUI
from .GraphicalUI import GraphicalUI
from .WebUI import WebUI
modules = glob.glob(os.path.dirname(__file__)+"/*.py")
__all__ = [ os.path.basename(f)[:-3] for f in modules if not f.endswith('__init__.py')]
UI_NONE = 0x00
UI_MENU = 0x01
UI_TEXT = 0x02
UI_GRAPHICAL = 0x03
UI_WEB = 0x04
UI_MODES = [UI_MENU, UI_TEXT, UI_GRAPHICAL, UI_WEB]
modules = glob.glob(os.path.dirname(__file__)+"/*.py")
__all__ = [ os.path.basename(f)[:-3] for f in modules if not f.endswith('__init__.py')]
COLORMODE_MONO = 1
COLORMODE_16 = 16
COLORMODE_88 = 88
COLORMODE_256 = 256
COLORMODE_TRUE = 2**24
THEME_DARK = 0x01
THEME_LIGHT = 0x02
THEMES = {
THEME_DARK: [
# Style name # 16-color style # Monochrome style # 88, 256 and true-color style
('heading', 'light gray,underline', 'default', 'underline', 'g93,underline', 'default'),
('body_text', 'white', 'default', 'default', '#0a0', 'default'),
('buttons', 'light green,bold', 'default', 'default', '#00a533', 'default')
]
}
def spawn(uimode):
if uimode in UI_MODES:

1
nomadnet/vendor/quotes.py vendored Normal file
View File

@ -0,0 +1 @@
quotes = [("I want the wisdom that wise men revere. I want more.", "Faithless")]

View File

@ -23,6 +23,6 @@ setuptools.setup(
entry_points= {
'console_scripts': ['nomadnet=nomadnet:main']
},
install_requires=['rns', 'lxmf'],
install_requires=['rns', 'lxmf', 'urwid@2.1.2'],
python_requires='>=3.5',
)