imgui_node_editor_ctx.py 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. """
  2. imgui_node_editor_ctx provide context managers to simplify the use of functions pairs like
  3. `ed.begin()` and `ed.end()`
  4. can be replaced by: `with imgui_node_editor.begin()
  5. etc.
  6. Note:
  7. begin_create(), begin_delete(), being_group_hint(), and begin_shortcut ()
  8. return a context manager that contains a boolean, which indicates whether the
  9. context was opened or not.
  10. Usage example:
  11. ```python
  12. with imgui_node_editor_ctx.begin_create() as shall_create:
  13. if shall_create:
  14. # do something with the pin
  15. ...
  16. ```
  17. """
  18. from imgui_bundle import ImVec2, ImVec4
  19. from imgui_bundle import imgui_node_editor as ed
  20. from types import TracebackType
  21. from typing import Optional, Callable, Any, Type
  22. OptExceptType = Optional[Type[BaseException]]
  23. OptBaseException = Optional[BaseException]
  24. OptTraceback = Optional[TracebackType]
  25. _EnterCallback = Callable[[], Any]
  26. IM_VEC2_ZERO = ImVec2(0.0, 0.0)
  27. IM_VEC4_ONE = ImVec4(1.0, 1.0, 1.0, 1.0)
  28. class _Begin:
  29. # _enter_callback will be called in __enter__. Captures all __init__ arguments.
  30. _enter_callback: _EnterCallback
  31. def __init__(self, editor_id: str, size: ImVec2 = IM_VEC2_ZERO) -> None:
  32. self._enter_callback = lambda: ed.begin(editor_id, size)
  33. def __enter__(self) -> "_Begin":
  34. self._enter_callback()
  35. return self
  36. def __exit__(self, _exc_type: OptExceptType, _exc_val: OptBaseException, _exc_tb: OptTraceback) -> None:
  37. ed.end()
  38. def __repr__(self) -> str:
  39. return self.__class__.__name__
  40. def begin(editor_id: str, size: ImVec2 = IM_VEC2_ZERO) -> _Begin:
  41. return _Begin(editor_id, size)
  42. class _BeginNode:
  43. # _enter_callback will be called in __enter__. Captures all __init__ arguments.
  44. _enter_callback: _EnterCallback
  45. def __init__(self, node_id: ed.NodeId) -> None:
  46. self._enter_callback = lambda: ed.begin_node(node_id)
  47. def __enter__(self) -> "_BeginNode":
  48. self._enter_callback()
  49. return self
  50. def __exit__(self, _exc_type: OptExceptType, _exc_val: OptBaseException, _exc_tb: OptTraceback) -> None:
  51. ed.end_node()
  52. def __repr__(self) -> str:
  53. return self.__class__.__name__
  54. def begin_node(node_id: ed.NodeId) -> _BeginNode:
  55. return _BeginNode(node_id)
  56. class _BeginPin:
  57. # _enter_callback will be called in __enter__. Captures all __init__ arguments.
  58. _enter_callback: _EnterCallback
  59. def __init__(self, pin_id: ed.PinId, kind: ed.PinKind) -> None:
  60. self._enter_callback = lambda: ed.begin_pin(pin_id, kind)
  61. def __enter__(self) -> "_BeginPin":
  62. self._enter_callback()
  63. return self
  64. def __exit__(self, _exc_type: OptExceptType, _exc_val: OptBaseException, _exc_tb: OptTraceback) -> None:
  65. ed.end_pin()
  66. def __repr__(self) -> str:
  67. return self.__class__.__name__
  68. def begin_pin(pin_id: ed.PinId, kind: ed.PinKind) -> _BeginPin:
  69. return _BeginPin(pin_id, kind)
  70. class _BeginCreate:
  71. # _enter_callback will be called in __enter__. Captures all __init__ arguments.
  72. _enter_callback: _EnterCallback
  73. opened: bool
  74. def __init__(self, color: ImVec4 = IM_VEC4_ONE, thickness: float = 1.0) -> None:
  75. self._enter_callback = lambda: ed.begin_create(color, thickness)
  76. def __enter__(self) -> "_BeginCreate":
  77. self.opened = self._enter_callback()
  78. return self
  79. def __exit__(self, _exc_type: OptExceptType, _exc_val: OptBaseException, _exc_tb: OptTraceback) -> None:
  80. if self.opened:
  81. ed.end_create()
  82. def __bool__(self) -> bool:
  83. return self.opened
  84. def __repr__(self) -> str:
  85. return self.__class__.__name__
  86. def begin_create(color: ImVec4 = IM_VEC4_ONE, thickness: float = 1.0) -> _BeginCreate:
  87. return _BeginCreate(color, thickness)
  88. class _BeginDelete:
  89. # _enter_callback will be called in __enter__. Captures all __init__ arguments.
  90. _enter_callback: _EnterCallback
  91. opened: bool
  92. def __init__(self) -> None:
  93. self._enter_callback = lambda: ed.begin_delete()
  94. def __enter__(self) -> "_BeginDelete":
  95. self.opened = self._enter_callback()
  96. return self
  97. def __exit__(self, _exc_type: OptExceptType, _exc_val: OptBaseException, _exc_tb: OptTraceback) -> None:
  98. if self.opened:
  99. ed.end_delete()
  100. def __bool__(self) -> bool:
  101. return self.opened
  102. def __repr__(self) -> str:
  103. return self.__class__.__name__
  104. def begin_delete() -> _BeginDelete:
  105. return _BeginDelete()
  106. class _BeginGroupHint:
  107. # _enter_callback will be called in __enter__. Captures all __init__ arguments.
  108. _enter_callback: _EnterCallback
  109. opened: bool
  110. def __init__(self, node_id: ed.NodeId) -> None:
  111. self._enter_callback = lambda: ed.begin_group_hint(node_id)
  112. def __enter__(self) -> "_BeginGroupHint":
  113. self.opened = self._enter_callback()
  114. return self
  115. def __exit__(self, _exc_type: OptExceptType, _exc_val: OptBaseException, _exc_tb: OptTraceback) -> None:
  116. if self.opened:
  117. ed.end_group_hint()
  118. def __bool__(self) -> bool:
  119. return self.opened
  120. def __repr__(self) -> str:
  121. return self.__class__.__name__
  122. def begin_group_hint(node_id: ed.NodeId) -> _BeginGroupHint:
  123. return _BeginGroupHint(node_id)
  124. class _BeginShortcut:
  125. # _enter_callback will be called in __enter__. Captures all __init__ arguments.
  126. _enter_callback: _EnterCallback
  127. opened: bool
  128. def __init__(self) -> None:
  129. self._enter_callback = lambda: ed.begin_shortcut()
  130. def __enter__(self) -> "_BeginShortcut":
  131. self.opened = self._enter_callback()
  132. return self
  133. def __exit__(self, _exc_type: OptExceptType, _exc_val: OptBaseException, _exc_tb: OptTraceback) -> None:
  134. if self.opened:
  135. ed.end_shortcut()
  136. def __bool__(self) -> bool:
  137. return self.opened
  138. def __repr__(self) -> str:
  139. return self.__class__.__name__
  140. def begin_shortcut() -> _BeginShortcut:
  141. return _BeginShortcut()