[elbe-devel] [PATCH v2 06/13] Debianize - Form widget
Bastian Germann
bage at linutronix.de
Fri Aug 2 09:42:40 CEST 2019
> From: Olivier Dion <dion at linutronix.de>
>
> A form is a smart grid. It attaches a name to its children and
> 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 called.
>
> If the abort button is pressed, a QUIT signal is emitted by default
> and the TUI is closed.
>
> Signed-off-by: Olivier Dion <dion at linutronix.de>
Reviewed-by: Bastian Germann <bage at linutronix.de>
> ---
> elbepack/debianize/widgets/form.py | 70 ++++++++++++++++++++++++++++++++++++++
> 1 file changed, 70 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..74cee445
> --- /dev/null
> +++ b/elbepack/debianize/widgets/form.py
> @@ -0,0 +1,70 @@
> +# ELBE - Debian Based Embedded Rootfilesystem Builder
> +# Copyright (c) 2019 Olivier Dion <dion at linutronix.de>
> +#
> +# SPDX-License-Identifier: GPL-3.0-or-later
> +
> +
> +from urwid import (
> + Edit,
> + Filler,
> + IntEdit,
> + WidgetDecoration,
> + emit_signal
> +)
> +
> +from elbepack.debianize.base.tui import TUISignal
> +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 = [TUISignal.QUIT]
> +
> + def __init__(self, named_grid_elements):
> + 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(Form, self).__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, TUISignal.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