1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
|
import sys
from trame_server import Server
from trame.app import dev, get_server
from trame.ui.vuetify import SinglePageLayout
from trame.widgets import vtk, vuetify
# -----------------------------------------------------------------------------
# Trame setup
# -----------------------------------------------------------------------------
server = get_server(client_type="vue2")
state, ctrl = server.state, server.controller
def reset_resolution():
state.resolution = 6
# Mode A ----------------------------------------------------------------------
def full_reload(server: Server):
print("=> Reload mode A")
dev.remove_change_listeners(server, "resolution")
dev.reload(sys.modules.get("__main__"))
# Mode B ----------------------------------------------------------------------
def reload_app(server: Server):
print("=> Reload mode B")
# dev.clear_triggers(app) # Not needed here
dev.clear_change_listeners(server)
dev.reload(sys.modules.get("__main__"))
# Reload mode selector --------------------------------------------------------
ctrl.on_server_reload = ctrl.on_server_reload.clear # Will happen first
if True:
ctrl.on_server_reload.add(reload_app)
else:
ctrl.on_server_reload.add(full_reload)
@state.change("resolution")
def update_resolution(resolution, **kwargs):
print("Update resolution", resolution)
# -----------------------------------------------------------------------------
# UI setup
# -----------------------------------------------------------------------------
layout = SinglePageLayout(server)
with layout:
layout.title.set_text("Dynamic reload")
layout.toolbar.dense = True
# Toolbar
with layout.toolbar as toolbar:
vuetify.VSpacer()
vuetify.VSlider(
# label="hello", # comment/uncomment between reload
hide_details=True,
v_model=("resolution", 6),
max=60,
min=3,
step=1,
style="max-width: 300px;",
)
vuetify.VSwitch(
hide_details=True,
v_model=("$vuetify.theme.dark",),
)
with vuetify.VBtn(icon=True, click=reset_resolution):
vuetify.VIcon("mdi-undo")
with layout.content:
with vuetify.VContainer(fluid=True, classes="pa-0 fill-height"):
with vtk.VtkView() as view:
ctrl.reset_camera = view.reset_camera
with vtk.VtkGeometryRepresentation():
vtk.VtkAlgorithm(
vtk_class="vtkConeSource", state=("{ resolution }",)
)
# -----------------------------------------------------------------------------
# start server
# -----------------------------------------------------------------------------
if __name__ == "__main__" and not server.running:
server.start()
|