[elbe-devel] [PATCH 07/14] Debianize - Form widget
Bastian Germann
bage at linutronix.de
Thu Aug 1 15:31:22 CEST 2019
> From: Olivier Dion <dion at linutronix.de>
>
> A form is a smart grid. It attachs name to its children and generate
It attaches a name ... generates ...
> 2 buttons.
>
> The confirm button when pressed will first call the sanitize_inputs
> callback. It should return a dictionary where the keys are the name
> of the bad field and the value a string that describe why the field is
> not good. If all fields passed the sanitization test, then the
> on_submit callback is call.
is called.
>
> If the abort button is pressent, by default a QUIT signal is emit and
... present a QUIT signal is emitted by default ...
> the TUI is closed.
>
> Signed-off-by: Olivier Dion <dion at linutronix.de>
> ---
> elbepack/debianize/widgets/form.py | 72 ++++++++++++++++++++++++++++++++++++++
> 1 file changed, 72 insertions(+)
> create mode 100644 elbepack/debianize/widgets/form.py
>
> diff --git a/elbepack/debianize/widgets/form.py b/elbepack/debianize/widgets/form.py
> new file mode 100644
> index 00000000..6b66b312
> --- /dev/null
> +++ b/elbepack/debianize/widgets/form.py
> @@ -0,0 +1,72 @@
> +# ELBE - Debian Based Embedded Rootfilesystem Builder
> +# Copyright (c) 2019 Olivier Dion <dion at linutronix.de>
> +#
> +# SPDX-License-Identifier: GPL-3.0-or-later
> +
> +
> +from collections import Callable
> +
> +from urwid import (
> + Edit,
> + Filler,
> + IntEdit,
> + WidgetDecoration,
> + emit_signal
> +)
> +
> +from elbepack.debianize.base.signal import SignalType
> +from elbepack.debianize.base.tui import TUI
> +from elbepack.debianize.widgets.button import Button
> +from elbepack.debianize.widgets.grid import Grid
> +
> +
> +WidgetDecoration.get_data = lambda wrapped_widget: wrapped_widget.base_widget.get_data()
> +Edit.get_data = Edit.get_edit_text
> +IntEdit.get_data = IntEdit.value
> +
> +
> +class Form(Grid):
> +
> + signals = [SignalType.QUIT]
> +
> + def __init__(self, named_grid_elements: list):
> + self.named_widgets = {}
> + unnamed_grid_elements = []
> + for row in named_grid_elements:
> + self.named_widgets.update(row)
> + unnamed_grid_elements.append(list(row.values()))
> +
> + confirm = Button("Confirm", "confirm_button", self.confirm)
> + abort = Button("Abort", "abort_button", self.abort)
> + unnamed_grid_elements.append([confirm, abort])
> +
> + super().__init__(unnamed_grid_elements)
> + self.root = Filler(self, valign="top")
> +
> + self.keybind["f5"] = self.confirm
> + self.keybind["f10"] = self.abort
> +
> + def confirm(self):
> + data = self.get_form_data()
> + sanitize = self.sanitize_inputs(data)
> + if sanitize:
> + # TODO - Better sanitization handling
> + buf = []
> + for key, value in sanitize.items():
> + buf.append("{}: {}".format(key, value))
> + TUI.printf('\n'.join(buf))
> + else:
> + self.on_submit(data)
> +
> + def abort(self):
> + emit_signal(self, SignalType.QUIT)
> + TUI.quit()
> +
> + def get_form_data(self):
> + return {name: widget.get_data() for name, widget in self.named_widgets.items()}
> +
> + def on_submit(self, data):
> + raise Exception("Form can not submit")
> +
> + def sanitize_inputs(self, data):
> + return False
>
More information about the elbe-devel
mailing list