Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 30 additions & 4 deletions src/techui_builder/builder.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand All @@ -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
Expand Down Expand Up @@ -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 <widget> 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()
Expand Down
20 changes: 11 additions & 9 deletions tests/test_builder.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down
31 changes: 31 additions & 0 deletions tests/test_files/test_bob_embedded.bob
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--Saved on 2026-01-12 10:15:49 by uns32131-->
<display version="2.0.0">
<name>Display</name>
<widget type="symbol" version="2.0.0">
<name>Detector</name>
<pv_name>test_device</pv_name>
<x>60</x>
<y>150</y>
<width>50</width>
<height>50</height>
<actions>
<action type="open_display">
<description>Open Display</description>
<file>test_child_bob.bob</file>
<target>replace</target>
</action>
</actions>
<tooltip>$(pv_name)
$(pv_value)
$(actions)</tooltip>
</widget>
<widget type="embedded" version="2.0.0">
<name>Embedded Display</name>
<file>motor_embed.bob</file>
<x>150</x>
<y>120</y>
<width>160</width>
<height>80</height>
</widget>
</display>