9
9
from ..math .Plane_autogen import Plane
10
10
from ..renderers .webgl .WebGLShadowMap_autogen import WebGLShadowMap
11
11
12
+ import base64
13
+ try :
14
+ from io import BytesIO as StringIO
15
+ except :
16
+ from cStringIO import StringIO
17
+ import PIL .Image
18
+
12
19
13
20
class RenderableWidget (DOMWidget ):
14
21
_view_module = Unicode (npm_pkg_name ).tag (sync = True )
@@ -42,6 +49,23 @@ class RenderableWidget(DOMWidget):
42
49
clearColor = Unicode ('#000000' ).tag (sync = True )
43
50
clearOpacity = CFloat (1.0 ).tag (sync = True )
44
51
52
+ def __init__ (self , ** kwargs ):
53
+ super (RenderableWidget , self ).__init__ (** kwargs )
54
+ self .on_msg (self ._on_potential_ret_val )
55
+ self .screenshot_data = None
56
+ self .screenshot_ready = False
57
+
58
+ def _on_potential_ret_val (self , widget , content , buffers ):
59
+ """Message callback used internally"""
60
+ if content ['type' ] == "screenshot" :
61
+ self ._handle_screenshot (content ['ret_val' ])
62
+
63
+ def _handle_screenshot (self , data ):
64
+ data = data [data .find (',' )+ 1 :]
65
+ data = base64 .b64decode (data )
66
+ self .screenshot_data = PIL .Image .open (StringIO (data ))
67
+ self .screenshot_ready = True
68
+
45
69
def send_msg (self , message_type , payload = None ):
46
70
if payload is None :
47
71
payload = {}
@@ -64,6 +88,13 @@ def freeze(self):
64
88
}
65
89
self .send (content )
66
90
91
+ def screenshot (self ):
92
+ self .screenshot_ready = False
93
+ content = {
94
+ "type" : "screenshot"
95
+ }
96
+ self .send (content )
97
+
67
98
68
99
class Preview (RenderableWidget ):
69
100
# renderer properties
0 commit comments