def build_form_widgets(self):
        """Build widgets to hold the data for edition."""
        ### create list to hold widgets
        widgets = self.widgets = List2D()

        ### define an initial topleft
        topleft = (0, 0)

        ### instantiate a caption for the form

        caption_label = Object2D.from_surface(
            surface=(
                render_text(
                    text=FORM_CAPTION,
                    border_thickness=2,
                    border_color=(TEXT_SETTINGS["foreground_color"]),
                    **TEXT_SETTINGS,
                )
            ),
            coordinates_name="topleft",
            coordinates_value=topleft,
        )

        widgets.append(caption_label)

        ### update the topleft to a value a bit below
        ### the bottomleft corner of the widgets already
        ### in the versatile list
        topleft = widgets.rect.move(0, 20).bottomleft

        ### instantiate widgets to pick known node packs

        ## known node packs label

        known_node_packs_label = Object2D.from_surface(
            surface=(
                render_text(
                    text="Pick known node packs:",
                    **TEXT_SETTINGS,
                )
            ),
            coordinates_name="topleft",
            coordinates_value=topleft,
        )

        widgets.append(known_node_packs_label)

        ## known node packs option menu

        midleft = known_node_packs_label.rect.move(5, 0).midright

        self.node_packs_option_menu = OptionMenu(
            loop_holder=self,
            value=OPTION_MENU_DEFAULT_STRING,
            options=[OPTION_MENU_DEFAULT_STRING] + get_known_node_packs(),
            max_width=700,
            command=self.pick_chosen_node_pack,
            draw_on_window_resize=self.draw,
            coordinates_name="midleft",
            coordinates_value=midleft,
        )

        widgets.append(self.node_packs_option_menu)

        ### update the topleft to a value a bit below
        ### the bottomleft corner of the widgets already
        ### in the versatile list
        topleft = widgets.rect.move(0, 15).bottomleft

        ### instantiate widgets to add new local node packs

        ## add local node packs label

        add_local_node_packs_label = Object2D.from_surface(
            surface=(
                render_text(
                    text="Add local node pack(s):",
                    **TEXT_SETTINGS,
                )
            ),
            coordinates_name="topleft",
            coordinates_value=topleft,
        )

        widgets.append(add_local_node_packs_label)

        ## add local node packs button

        midleft = add_local_node_packs_label.rect.move(5, 0).midright

        add_local_node_packs_button = Object2D.from_surface(
            surface=(
                render_layered_icon(
                    chars=[chr(ordinal) for ordinal in (33, 34)],
                    dimension_name="height",
                    dimension_value=20,
                    colors=[BLACK, (30, 130, 70)],
                    background_width=27,
                    background_height=27,
                    background_color=(40, 40, 50),
                    depth_finish_thickness=1,
                )
            ),
            on_mouse_release=(get_oblivious_callable(self.add_local_node_packs)),
            coordinates_name="midleft",
            coordinates_value=midleft,
        )

        widgets.append(add_local_node_packs_button)

        ### update the topleft to a value a bit below
        ### the bottomleft corner of the widgets already
        ### in the versatile list
        topleft = widgets.rect.move(0, 15).bottomleft

        ### instantiate widgets to add new installed node packs

        ## add installed node packs label

        add_installed_node_packs_label = Object2D.from_surface(
            surface=(
                render_text(
                    text="Add installed node pack(s):",
                    **TEXT_SETTINGS,
                )
            ),
            coordinates_name="topleft",
            coordinates_value=topleft,
        )

        widgets.append(add_installed_node_packs_label)

        ## add installed node packs entry

        midleft = add_installed_node_packs_label.rect.move(5, 0).midright

        self.add_installed_node_packs_entry = StringEntry(
            loop_holder=self,
            value="",
            width=500,
            draw_on_window_resize=self.draw,
            coordinates_name="midleft",
            coordinates_value=midleft,
        )

        widgets.append(self.add_installed_node_packs_entry)

        ## add installed node packs button

        midleft = self.add_installed_node_packs_entry.rect.move(5, 0).midright

        add_installed_node_packs_button = Object2D.from_surface(
            surface=(
                render_layered_icon(
                    chars=[chr(78)],
                    dimension_name="height",
                    dimension_value=20,
                    colors=[(30, 210, 70)],
                    background_width=27,
                    background_height=27,
                    background_color=(40, 40, 50),
                    depth_finish_thickness=1,
                )
            ),
            on_mouse_release=(
                get_oblivious_callable(self.add_installed_node_packs_from_entry)
            ),
            coordinates_name="midleft",
            coordinates_value=midleft,
        )

        widgets.append(add_installed_node_packs_button)

        ### obtain a topleft from the widgets' bottomleft
        topleft = widgets.rect.move(0, 20).bottomleft

        ### instantiate panel to indicate pack list below it

        self.pack_list_panel = Object2D.from_surface(
            surface=render_rect(960, 240, (40, 40, 40)),
            on_mouse_release=self.click_remove_buttons,
            coordinates_name="topleft",
            coordinates_value=topleft,
        )

        self.panel_bg = self.pack_list_panel.image.copy()

        widgets.append(self.pack_list_panel)

        ### create and store behaviour for cancelling form
        ### edition (equivalent to setting the form data to
        ### None and setting the 'running' flag to False)

        self.cancel = CallList(
            (
                partial(setattr, self, "form_data", None),
                partial(setattr, self, "running", False),
            )
        )

        ### create, position and store form related buttons

        ## apply changes button

        apply_changes_button = Button.from_text(
            text="Apply changes",
            command=self.apply_changes,
            **BUTTON_SETTINGS,
        )

        draw_depth_finish(apply_changes_button.image)

        apply_changes_button.rect.topright = widgets.rect.move(
            0, 20
        ).bottomright

        ## cancel button

        cancel_button = Button.from_text(
            text=(t.editing.change_node_packs_form.cancel),
            command=self.cancel,
            **BUTTON_SETTINGS,
        )

        draw_depth_finish(cancel_button.image)

        cancel_button.rect.midright = apply_changes_button.rect.move(
            -5, 0
        ).midleft

        ## store buttons
        widgets.extend((cancel_button, apply_changes_button))

        ### instantiate help button to display manual chapter about how
        ### to load nodes

        help_icon = (
            render_layered_icon(
                chars=[chr(ordinal) for ordinal in (167, 92, 93, 168)],
                dimension_name="height",
                dimension_value=21,
                colors=[BLACK, BLACK, WHITE, (30, 130, 70)],
                background_width=21,
                background_height=21,
            )
        )

        text_surf = (
            render_text(
                text="How to load nodes",
                font_height= ENC_SANS_BOLD_FONT_HEIGHT,
                font_path= ENC_SANS_BOLD_FONT_PATH,
                foreground_color= BUTTON_FG,
                background_color= BUTTON_BG,
            )
        )

        button_surf = (
            combine_surfaces(
                surfaces=[help_icon, text_surf],
                retrieve_pos_from="midright",
                assign_pos_to="midleft",
                offset_pos_by=(5, 0),
                padding=4,
                background_color=BUTTON_BG,
            )
        )

        draw_depth_finish(button_surf)

        show_loading_nodes_page = partial(
            open_htsl_link,
            "nodezator://manual.nodezator.pysite/ch-loading-nodes.htsl",
        )

        help_button = Button(button_surf, command=show_loading_nodes_page)

        help_button.rect.bottomleft = widgets.rect.bottomleft

        widgets.append(help_button)
Build widgets to hold the data for edition.
nodezator/editing/nodepacksforms/selection.py