Skip to content

Commit 807392f

Browse files
committed
Add graph_widget widget
1 parent 8c31397 commit 807392f

File tree

1 file changed

+59
-0
lines changed

1 file changed

+59
-0
lines changed

src/graphviz_anywidget/__init__.py

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
import importlib.metadata
22
from pathlib import Path
3+
from typing import Any
34

45
import anywidget
6+
import ipywidgets
57
import traitlets
68

79
try:
@@ -33,3 +35,60 @@ class GraphvizWidget(anywidget.AnyWidget):
3335
selected_direction = traitlets.Unicode("bidirectional").tag(sync=True)
3436
search_type = traitlets.Unicode("included").tag(sync=True)
3537
case_sensitive = traitlets.Bool(False).tag(sync=True) # noqa: FBT003
38+
39+
40+
def graph_widget(
41+
dot_string: str = "digraph { a -> b; b -> c; c -> a; }",
42+
) -> ipywidgets.VBox:
43+
widget = GraphvizWidget(dot_source=dot_string)
44+
reset_button = ipywidgets.Button(description="Reset Zoom")
45+
direction_selector = ipywidgets.Dropdown(
46+
options=["bidirectional", "downstream", "upstream", "single"],
47+
value="bidirectional",
48+
description="Direction:",
49+
)
50+
search_input = ipywidgets.Text(
51+
placeholder="Search...",
52+
description="Search:",
53+
)
54+
search_type_selector = ipywidgets.Dropdown(
55+
options=["exact", "included", "regex"],
56+
value="exact",
57+
description="Search Type:",
58+
)
59+
case_toggle = ipywidgets.ToggleButton(
60+
value=False,
61+
description="Case Sensitive",
62+
icon="check",
63+
)
64+
65+
# Define button actions
66+
def reset_graph(_: Any) -> None:
67+
widget.send({"action": "reset_zoom"})
68+
69+
def update_direction(change: dict) -> None:
70+
widget.selected_direction = change["new"]
71+
72+
def perform_search(change: dict) -> None:
73+
widget.send({"action": "search", "query": change["new"]})
74+
75+
def update_search_type(change: dict) -> None:
76+
widget.search_type = change["new"]
77+
78+
def toggle_case_sensitive(change: dict) -> None:
79+
widget.case_sensitive = change["new"]
80+
81+
reset_button.on_click(reset_graph)
82+
direction_selector.observe(update_direction, names="value")
83+
search_input.observe(perform_search, names="value")
84+
search_type_selector.observe(update_search_type, names="value")
85+
case_toggle.observe(toggle_case_sensitive, names="value")
86+
87+
# Display ipywidgets
88+
return ipywidgets.VBox(
89+
[
90+
ipywidgets.HBox([reset_button, direction_selector]),
91+
ipywidgets.HBox([search_input, search_type_selector, case_toggle]),
92+
widget,
93+
],
94+
)

0 commit comments

Comments
 (0)