Source code for pyparadigm.dialogs
"""This module contains dialogues, which will query user input"""
from functools import lru_cache
import contextlib
with contextlib.redirect_stdout(None):
import pygame
from . import surface_composition as psc
from . import eventlistener as pel
from . import misc
def _center_renderer(elem):
misc.display(psc.compose(pygame.display.get_surface())(
psc.Padding.from_scale(0.5)(elem)))
def _base_dialog(caption, input, fill_color=0xFFFFFF):
return psc.Border(width=10)(
psc.Fill(fill_color)(
psc.Padding(0.05, 0.05, 0.1, 0.1)(
psc.LinLayout("v")(
caption,
psc.LinLayout("v")(
psc.Surface(psc.Margin(0, 1, 1, 0))(input),
psc.LLItem(0.01)(psc.Line("h")))))))
@lru_cache()
def _text_converter(s):
return psc.Text(s, psc.Font(size=50), antialias=True)
[docs]def string_dialog(caption: str, renderer: callable = _center_renderer,
el: pel.EventListener = None, text_renderer=_text_converter):
"""Will display a dialog which gets a string as input from the user.
By default the dialog will be rendered to the screen directly, to control
the target pass a callable as renderer which takes a single argument, which
is an element tree. This will be called by string_dialog to display itself.
You can pass an eventlistener instance, which will then be used in case you
got some important permanent handlers that must be run. You can pass a
function that converts a string to something that can be used within
compose() with the text_renderer to control the optic of the text"""
el = el or pel.EventListener()
buffer = ""
while True:
renderer(_base_dialog(text_renderer(caption), text_renderer(buffer)))
key = el.wait_for_unicode_char()
if key == "\x1b": # Str representation of ESC
return None
elif key == "\x0D": # Return
return buffer
else:
buffer = misc.process_char(buffer, key)