Skip to content

Commit 5813508

Browse files
committed
Remove manim.gui and move configure_pygui into Scene as a method
1 parent 9c43ad0 commit 5813508

File tree

4 files changed

+75
-101
lines changed

4 files changed

+75
-101
lines changed

manim/gui/__init__.py

Whitespace-only changes.

manim/gui/gui.py

Lines changed: 0 additions & 93 deletions
This file was deleted.

manim/scene/scene.py

Lines changed: 75 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import random
1616
import threading
1717
import time
18+
from pathlib import Path
1819
from queue import Queue
1920

2021
import srt
@@ -25,6 +26,8 @@
2526
import dearpygui.dearpygui as dpg
2627

2728
dearpygui_imported = True
29+
dpg.create_context()
30+
window = dpg.generate_uuid()
2831
except ImportError:
2932
dearpygui_imported = False
3033
from typing import TYPE_CHECKING
@@ -34,14 +37,14 @@
3437
from watchdog.events import DirModifiedEvent, FileModifiedEvent, FileSystemEventHandler
3538
from watchdog.observers import Observer
3639

40+
from manim import __version__
3741
from manim.mobject.mobject import Mobject
3842
from manim.mobject.opengl.opengl_mobject import OpenGLPoint
3943

4044
from .. import config, logger
4145
from ..animation.animation import Animation, Wait, prepare_animation
4246
from ..camera.camera import Camera
4347
from ..constants import *
44-
from ..gui.gui import configure_pygui
4548
from ..renderer.cairo_renderer import CairoRenderer
4649
from ..renderer.opengl_renderer import OpenGLCamera, OpenGLMobject, OpenGLRenderer
4750
from ..renderer.shader import Object3D
@@ -51,6 +54,7 @@
5154
from ..utils.family_ops import restructure_list_to_exclude_certain_family_members
5255
from ..utils.file_ops import open_media_file
5356
from ..utils.iterables import list_difference_update, list_update
57+
from ..utils.module_ops import scene_classes_from_file
5458

5559
if TYPE_CHECKING:
5660
from collections.abc import Iterable, Sequence
@@ -144,7 +148,7 @@ def __init__(
144148
self.skip_animation_preview = False
145149
self.meshes: list[Object3D] = []
146150
self.camera_target = ORIGIN
147-
self.widgets: list[Any] = []
151+
self.widgets: list[dict[str, Any]] = []
148152
self.dearpygui_imported = dearpygui_imported
149153
self.updaters: list[Callable[[float], None]] = []
150154
self.key_to_function_map: dict[str, Callable[[], None]] = {}
@@ -1406,13 +1410,12 @@ def embedded_method(*args: Any, **kwargs: Any) -> None:
14061410
if self.dearpygui_imported and config["enable_gui"]:
14071411
if not dpg.is_dearpygui_running():
14081412
gui_thread = threading.Thread(
1409-
target=configure_pygui,
1410-
args=(self.renderer, self.widgets),
1413+
target=self._configure_pygui,
14111414
kwargs={"update": False},
14121415
)
14131416
gui_thread.start()
14141417
else:
1415-
configure_pygui(self.renderer, self.widgets, update=True)
1418+
self._configure_pygui(update=True)
14161419

14171420
self.camera.model_matrix = self.camera.default_model_matrix
14181421

@@ -1543,6 +1546,73 @@ def embed(self) -> None:
15431546
# End scene when exiting an embed.
15441547
raise Exception("Exiting scene.")
15451548

1549+
def _configure_pygui(self, update: bool = True) -> None:
1550+
if not self.dearpygui_imported:
1551+
raise RuntimeError("Attempted to use DearPyGUI when it isn't imported.")
1552+
if update:
1553+
dpg.delete_item(window)
1554+
else:
1555+
dpg.create_viewport()
1556+
dpg.setup_dearpygui()
1557+
dpg.show_viewport()
1558+
1559+
dpg.set_viewport_title(title=f"Manim Community v{__version__}")
1560+
dpg.set_viewport_width(1015)
1561+
dpg.set_viewport_height(540)
1562+
1563+
def rerun_callback(sender: Any, data: Any) -> None:
1564+
self.queue.put(("rerun_gui", [], {}))
1565+
1566+
def continue_callback(sender: Any, data: Any) -> None:
1567+
self.queue.put(("exit_gui", [], {}))
1568+
1569+
def scene_selection_callback(sender: Any, data: Any) -> None:
1570+
config["scene_names"] = (dpg.get_value(sender),)
1571+
self.queue.put(("rerun_gui", [], {}))
1572+
1573+
scene_classes = scene_classes_from_file(
1574+
Path(config["input_file"]), full_list=True
1575+
) # type: ignore[call-overload]
1576+
scene_names = [scene_class.__name__ for scene_class in scene_classes]
1577+
1578+
with dpg.window(
1579+
id=window,
1580+
label="Manim GUI",
1581+
pos=[config["gui_location"][0], config["gui_location"][1]],
1582+
width=1000,
1583+
height=500,
1584+
):
1585+
dpg.set_global_font_scale(2)
1586+
dpg.add_button(label="Rerun", callback=rerun_callback)
1587+
dpg.add_button(label="Continue", callback=continue_callback)
1588+
dpg.add_combo(
1589+
label="Selected scene",
1590+
items=scene_names,
1591+
callback=scene_selection_callback,
1592+
default_value=config["scene_names"][0],
1593+
)
1594+
dpg.add_separator()
1595+
if len(self.widgets) != 0:
1596+
with dpg.collapsing_header(
1597+
label=f"{config['scene_names'][0]} widgets",
1598+
default_open=True,
1599+
):
1600+
for widget_config in self.widgets:
1601+
widget_config_copy = widget_config.copy()
1602+
name = widget_config_copy["name"]
1603+
widget = widget_config_copy["widget"]
1604+
if widget != "separator":
1605+
del widget_config_copy["name"]
1606+
del widget_config_copy["widget"]
1607+
getattr(dpg, f"add_{widget}")(
1608+
label=name, **widget_config_copy
1609+
)
1610+
else:
1611+
dpg.add_separator()
1612+
1613+
if not update:
1614+
dpg.start_dearpygui()
1615+
15461616
def update_to_time(self, t: float) -> None:
15471617
dt = t - self.last_t
15481618
self.last_t = t

mypy.ini

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -99,9 +99,6 @@ ignore_errors = True
9999
[mypy-manim.camera.three_d_camera]
100100
ignore_errors = True
101101

102-
[mypy-manim.gui.gui]
103-
ignore_errors = True
104-
105102
[mypy-manim.mobject.graphing.coordinate_systems]
106103
ignore_errors = True
107104

0 commit comments

Comments
 (0)