Add editing widgets for popups etc.
This commit is contained in:
parent
8336794342
commit
187a69fd5f
2 changed files with 84 additions and 0 deletions
|
|
@ -1,7 +1,9 @@
|
||||||
from typing import List
|
from typing import List
|
||||||
|
|
||||||
|
from .edit_widgets import *
|
||||||
from .euph_renderer import *
|
from .euph_renderer import *
|
||||||
|
|
||||||
__all__: List[str] = []
|
__all__: List[str] = []
|
||||||
|
|
||||||
|
__all__ += edit_widgets.__all__
|
||||||
__all__ += euph_renderer.__all__
|
__all__ += euph_renderer.__all__
|
||||||
|
|
|
||||||
82
cheuph/euphoria/edit_widgets.py
Normal file
82
cheuph/euphoria/edit_widgets.py
Normal file
|
|
@ -0,0 +1,82 @@
|
||||||
|
from typing import Optional, Tuple
|
||||||
|
|
||||||
|
import urwid
|
||||||
|
|
||||||
|
__all__ = ["EditWidget", "PasswordEditWidget"]
|
||||||
|
|
||||||
|
class EditWidget(urwid.WidgetWrap):
|
||||||
|
|
||||||
|
def __init__(self,
|
||||||
|
prompt: str,
|
||||||
|
caption: str = "",
|
||||||
|
style: Optional[str] = None,
|
||||||
|
) -> None:
|
||||||
|
|
||||||
|
self._prompt = urwid.Text(prompt, align=urwid.CENTER)
|
||||||
|
self._edit = urwid.Edit(caption=caption, align=urwid.CENTER)
|
||||||
|
|
||||||
|
if style is None:
|
||||||
|
self._edit_wrap = self._edit
|
||||||
|
else:
|
||||||
|
self._edit_wrap = urwid.AttrMap(self._edit, style)
|
||||||
|
|
||||||
|
self._pile = urwid.Pile([
|
||||||
|
(urwid.PACK, self._prompt),
|
||||||
|
(urwid.PACK, self._edit_wrap),
|
||||||
|
])
|
||||||
|
super().__init__(self._pile)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def width(self) -> int:
|
||||||
|
prompt_width, _ = self._prompt.pack(None)
|
||||||
|
edit_width, _ = self._edit.pack(None)
|
||||||
|
return max(prompt_width, edit_width)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def text(self) -> str:
|
||||||
|
return self._edit.edit_text
|
||||||
|
|
||||||
|
class PasswordEditWidget(urwid.WidgetWrap):
|
||||||
|
|
||||||
|
def __init__(self,
|
||||||
|
prompt: str,
|
||||||
|
mask_char: str = "*",
|
||||||
|
style: Optional[str] = None,
|
||||||
|
) -> None:
|
||||||
|
|
||||||
|
self._mask_char = mask_char
|
||||||
|
|
||||||
|
self._prompt = urwid.Text(prompt, align=urwid.CENTER)
|
||||||
|
self._edit = urwid.Edit(align=urwid.CENTER)
|
||||||
|
self._fake_edit = urwid.Edit(align=urwid.CENTER)
|
||||||
|
|
||||||
|
if style is None:
|
||||||
|
self._fake_edit_wrap = self._fake_edit
|
||||||
|
else:
|
||||||
|
self._fake_edit_wrap = urwid.AttrMap(self._fake_edit, style)
|
||||||
|
|
||||||
|
self._pile = urwid.Pile([
|
||||||
|
(urwid.PACK, self._prompt),
|
||||||
|
(urwid.PACK, self._fake_edit_wrap),
|
||||||
|
])
|
||||||
|
super().__init__(self._pile)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def width(self) -> int:
|
||||||
|
prompt_width, _ = self._prompt.pack(None)
|
||||||
|
edit_width, _ = self._edit.pack(None)
|
||||||
|
return max(prompt_width, edit_width)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def text(self) -> str:
|
||||||
|
return self._edit.edit_text
|
||||||
|
|
||||||
|
def update_fake_edit(self) -> None:
|
||||||
|
fake_text = self._mask_char * len(self._edit.edit_text)
|
||||||
|
self._fake_edit.edit_text = fake_text
|
||||||
|
self._fake_edit.edit_pos = self._edit.edit_pos
|
||||||
|
|
||||||
|
def keypress(self, size: Tuple[int], key: str) -> Optional[str]:
|
||||||
|
key = self._edit.keypress(size, key)
|
||||||
|
self.update_fake_edit()
|
||||||
|
return key
|
||||||
Loading…
Add table
Add a link
Reference in a new issue