diff --git a/src/techui_builder/builder.py b/src/techui_builder/builder.py index 35da856..6593f28 100644 --- a/src/techui_builder/builder.py +++ b/src/techui_builder/builder.py @@ -270,7 +270,7 @@ def _generate_json_map(self, screen_path: Path, dest_path: Path) -> JsonMap: for w in root.findall(".//widget") if w.get("type", default=None) # in ["symbol", "embedded", "action_button"] - in ["symbol", "action_button"] + in ["symbol", "action_button", "embedded"] ] for widget_elem in widgets: @@ -289,9 +289,12 @@ def _generate_json_map(self, screen_path: Path, dest_path: Path) -> JsonMap: name_elem = widget_elem.name.text macro_dict = self._get_macros(open_display) - # case "embedded": - # file_elem = widget_elem.file - # macro_dict = _get_macros(widget_elem) + case "embedded": + file_elem = self._extract_action_button_file_from_embedded( + widget_elem.file, dest_path + ) + name_elem = widget_elem.name.text + macro_dict = self._get_macros(widget_elem) case _: continue @@ -331,6 +334,29 @@ def _generate_json_map(self, screen_path: Path, dest_path: Path) -> JsonMap: return current_node + def _extract_action_button_file_from_embedded( + self, file_elem: ObjectifiedElement, dest_path: Path + ) -> ObjectifiedElement: + file_path = Path(file_elem.text.strip() if file_elem.text else "") + file_path = dest_path.joinpath(file_path) + tree = objectify.parse(file_path.absolute()) + root: ObjectifiedElement = tree.getroot() + + # Find all elements + widgets = [ + w + for w in root.findall(".//widget") + if w.get("type", default=None) == "action_button" + ] + + for widget_elem in widgets: + open_display = _get_action_group(widget_elem) + if open_display is None: + continue + file_elem = open_display.file + return file_elem + return file_elem + def _get_macros(self, element: ObjectifiedElement): if hasattr(element, "macros"): macros = element.macros.getchildren() diff --git a/tests/test_builder.py b/tests/test_builder.py index 4ac5cbf..d0cd973 100644 --- a/tests/test_builder.py +++ b/tests/test_builder.py @@ -302,16 +302,18 @@ def test_generate_json_map(builder_with_test_files, example_json_map, test_files # TODO: write this test -# def test_generate_json_map_embedded_screen(builder, example_json_map): -# screen_path = Path("tests/test_files/test_bob.bob") -# dest_path = Path("tests/test_files/") +def test_generate_json_map_embedded_screen(builder_with_test_files, example_json_map): + screen_path = Path("tests/test_files/test_bob_embedded.bob").absolute() + dest_path = Path("tests/test_files/") -# # Set widget type to embedded -# ... - -# test_json_map = builder._generate_json_map(screen_path, dest_path) - -# assert test_json_map == example_json_map + test_json_map = builder_with_test_files._generate_json_map(screen_path, dest_path) + example_json_map.file = "test_bob_embedded.bob" + example_json_map.children.append( + JsonMap( + "$(IOC)/pmacAxis.pvi.bob", display_name="Embedded Display", exists=False + ) + ) + assert test_json_map == example_json_map def test_parse_display_name_with_name(builder): diff --git a/tests/test_files/test_bob_embedded.bob b/tests/test_files/test_bob_embedded.bob new file mode 100644 index 0000000..f734932 --- /dev/null +++ b/tests/test_files/test_bob_embedded.bob @@ -0,0 +1,31 @@ + + + + Display + + Detector + test_device + 60 + 150 + 50 + 50 + + + Open Display + test_child_bob.bob + replace + + + $(pv_name) +$(pv_value) +$(actions) + + + Embedded Display + motor_embed.bob + 150 + 120 + 160 + 80 + +