5
5
from traitlets import (Bool , Dict , Integer ,
6
6
Unicode , observe )
7
7
from ._frontend import __frontend_version__
8
+ from .widget_base import WidgetBase
8
9
9
10
from .remote_thread import RemoteCallThread
10
11
11
12
12
13
@widgets .register
13
- class MolstarView (widgets . DOMWidget ):
14
+ class MolstarView (WidgetBase ):
14
15
# Name of the widget view class in front-end
15
16
_view_name = Unicode ('MolstarView' ).tag (sync = True )
16
17
@@ -35,44 +36,31 @@ class MolstarView(widgets.DOMWidget):
35
36
def __init__ (self ):
36
37
super ().__init__ ()
37
38
self ._molstar_component_ids = []
38
- self ._trajlist = []
39
- self ._callbacks_before_loaded = []
40
- self ._event = threading .Event ()
41
- self ._remote_call_thread = RemoteCallThread (
42
- self ,
43
- registered_funcs = [])
44
- self ._remote_call_thread .daemon = True
45
- self ._remote_call_thread .start ()
46
- self ._handle_msg_thread = threading .Thread (
47
- target = self .on_msg , args = (self ._molstar_handle_message , ))
48
- # register to get data from JS side
49
- self ._handle_msg_thread .daemon = True
50
- self ._handle_msg_thread .start ()
51
39
self ._state = None
52
40
53
- def render_image (self ):
54
- image = widgets .Image ()
55
- self ._js (f"this.exportImage('{ image .model_id } ')" )
56
- # image.value will be updated in _molstar_handle_message
57
- return image
58
-
59
- def handle_resize (self ):
60
- self ._js ("this.plugin.handleResize()" )
41
+ def _molstar_handle_message (self , widget , msg , buffers ):
42
+ msg_type = msg .get ("type" )
43
+ data = msg .get ("data" )
44
+ if msg_type == "exportImage" :
45
+ image = widgets .Widget .widgets [msg .get ("model_id" )]
46
+ image .value = base64 .b64decode (data )
47
+ elif msg_type == "state" :
48
+ self ._state = data
49
+ elif msg_type == 'request_loaded' :
50
+ if not self .loaded :
51
+ # FIXME: doublecheck this
52
+ # trick to trigger observe loaded
53
+ # so two viewers can have the same representations
54
+ self .loaded = False
55
+ self .loaded = msg .get ('data' )
56
+ elif msg_type == 'getCamera' :
57
+ self ._molcamera = data
61
58
62
59
@observe ('loaded' )
63
60
def on_loaded (self , change ):
64
61
if change ['new' ]:
65
62
self ._fire_callbacks (self ._callbacks_before_loaded )
66
63
67
- def _thread_run (self , func , * args ):
68
- thread = threading .Thread (
69
- target = func ,
70
- args = args ,
71
- )
72
- thread .daemon = True
73
- thread .start ()
74
- return thread
75
-
76
64
def _fire_callbacks (self , callbacks ):
77
65
def _call (event ):
78
66
for callback in callbacks :
@@ -88,78 +76,6 @@ def _load_structure_data(self, data: str, format: str = 'pdb', preset="default")
88
76
target = "Widget" ,
89
77
args = [data , format , preset ])
90
78
91
- def _molstar_handle_message (self , widget , msg , buffers ):
92
- msg_type = msg .get ("type" )
93
- data = msg .get ("data" )
94
- if msg_type == "exportImage" :
95
- image = widgets .Widget .widgets [msg .get ("model_id" )]
96
- image .value = base64 .b64decode (data )
97
- elif msg_type == "state" :
98
- self ._state = data
99
- elif msg_type == 'request_loaded' :
100
- if not self .loaded :
101
- # FIXME: doublecheck this
102
- # trick to trigger observe loaded
103
- # so two viewers can have the same representations
104
- self .loaded = False
105
- self .loaded = msg .get ('data' )
106
- elif msg_type == 'getCamera' :
107
- self ._molcamera = data
108
-
109
- def render_image (self ):
110
- image = widgets .Image ()
111
- self ._js (f"this.exportImage('{ image .model_id } ')" )
112
- # image.value will be updated in _molview_handle_message
113
- return image
114
-
115
- def _js (self , code , ** kwargs ):
116
- # nglview code
117
- self ._remote_call ('executeCode' ,
118
- target = 'Widget' ,
119
- args = [code ],
120
- ** kwargs )
121
-
122
- def _remote_call (self ,
123
- method_name ,
124
- target = 'Widget' ,
125
- args = None ,
126
- kwargs = None ,
127
- ** other_kwargs ):
128
-
129
- # adapted from nglview
130
- msg = self ._get_remote_call_msg (method_name ,
131
- target = target ,
132
- args = args ,
133
- kwargs = kwargs ,
134
- ** other_kwargs )
135
- def callback (widget , msg = msg ):
136
- widget .send (msg )
137
-
138
- callback ._method_name = method_name
139
- callback ._msg = msg
140
-
141
- if self .loaded :
142
- self ._remote_call_thread .q .append (callback )
143
- else :
144
- # send later
145
- # all callbacks will be called right after widget is loaded
146
- self ._callbacks_before_loaded .append (callback )
147
-
148
- def _get_remote_call_msg (self ,
149
- method_name ,
150
- target = 'Widget' ,
151
- args = None ,
152
- kwargs = None ,
153
- ** other_kwargs ):
154
- # adapted from nglview
155
- msg = {}
156
- msg ['target' ] = target
157
- msg ['type' ] = 'call_method'
158
- msg ['methodName' ] = method_name
159
- msg ['args' ] = args
160
- msg ['kwargs' ] = kwargs
161
- return msg
162
-
163
79
def add_trajectory (self , trajectory ):
164
80
self ._load_structure_data (trajectory .get_structure_string (),
165
81
'pdb' ) # FIXME
0 commit comments