@@ -235,111 +235,6 @@ def onchange(self):
235235 return ()
236236
237237
238- class HTML (Tag ):
239- def __init__ (self , ** kwargs ):
240- super (HTML , self ).__init__ (* args , ** kwargs , _type = 'html' )
241-
242- head = HEAD ()
243- body = BODY ()
244- self .add_child ('head' , head )
245- self .add_child ('body' , body )
246-
247-
248- class HEAD (Tag ):
249- def __init__ (self , title , js , css , html , ** kwargs ):
250- super (HEAD , self ).__init__ (* args , ** kwargs , _type = 'head' )
251- self .add_child ('meta' ,
252- """<meta content='text/html;charset=utf-8' http-equiv='Content-Type'>
253- <meta content='utf-8' http-equiv='encoding'>
254- <meta name="viewport" content="width=device-width, initial-scale=1.0">""" )
255-
256- self .set_css (css )
257- self .set_html (html )
258- self .set_javascript (js )
259- self .set_title (title )
260-
261- def set_javascript (self , js ):
262- self .add_child ("js" , js )
263-
264- def set_html (self , html ):
265- self .add_child ("html" , html )
266-
267- def set_css (self , css ):
268- self .add_child ("css" , css )
269-
270- def set_title (self , title ):
271- self .add_child ('title' , "<title>%s</title>" % title )
272-
273-
274- class BODY (Widget ):
275- EVENT_ONLOAD = 'onload'
276- EVENT_ONERROR = 'onerror'
277- EVENT_ONONLINE = 'ononline'
278- EVENT_ONPAGEHIDE = 'onpagehide'
279- EVENT_ONPAGESHOW = 'onpageshow'
280- EVENT_ONRESIZE = 'onresize'
281-
282- def __init__ (self , * args , ** kwargs ):
283- super (BODY , self ).__init__ (* args , ** kwargs , _type = 'body' )
284- loading_anim = Widget ()
285- loading_anim .set_identifier ("loading-animation" )
286- loading_widget = Widget (children = [loading_anim ])
287- loading_widget .set_identifier ("loading" )
288-
289- self .append (loading_widget )
290-
291- @decorate_set_on_listener ("(self, emitter)" )
292- @decorate_event_js ("""sendCallback('%(emitter_identifier)s','%(event_name)s');
293- event.stopPropagation();event.preventDefault();
294- return false;""" )
295- def onload (self ):
296- """Called when page gets loaded."""
297- return ()
298-
299- @decorate_set_on_listener ("(self, emitter)" )
300- @decorate_event_js ("""
301- function(message, source, lineno, colno, error){
302- var params={};params['message']=message;
303- params['source']=source;
304- params['lineno']=lineno;
305- params['colno']=colno;
306- sendCallbackParam('%(emitter_identifier)s','%(event_name)s',params);
307- return false;
308- }""" )
309- def onerror (self , message , source , lineno , colno ):
310- """Called when an error occurs."""
311- print ("DOCUMENT ERROR: " + message )
312- return (message , source , lineno , colno )
313-
314- @decorate_set_on_listener ("(self, emitter)" )
315- @decorate_event_js ("""sendCallback('%(emitter_identifier)s','%(event_name)s');
316- event.stopPropagation();event.preventDefault();
317- return false;""" )
318- def ononline (self ):
319- return ()
320-
321- @decorate_set_on_listener ("(self, emitter)" )
322- @decorate_event_js ("""sendCallback('%(emitter_identifier)s','%(event_name)s');
323- event.stopPropagation();event.preventDefault();
324- return false;""" )
325- def onpagehide (self ):
326- return ()
327-
328- @decorate_set_on_listener ("(self, emitter)" )
329- @decorate_event_js ("""sendCallback('%(emitter_identifier)s','%(event_name)s');
330- event.stopPropagation();event.preventDefault();
331- return false;""" )
332- def onpageshow (self ):
333- return ()
334-
335- @decorate_set_on_listener ("(self, emitter)" )
336- @decorate_event_js ("""sendCallback('%(emitter_identifier)s','%(event_name)s');
337- event.stopPropagation();event.preventDefault();
338- return false;""" )
339- def onresize (self ):
340- return ()
341-
342-
343238class Tag (object ):
344239 """
345240 Tag is the base class of the framework. It represents an element that can be added to the GUI,
@@ -1038,6 +933,153 @@ def set_on_key_down_listener(self, callback, *userdata):
1038933 self .onkeydown .connect (callback , * userdata )
1039934
1040935
936+ class HTML (Tag ):
937+ def __init__ (self , * args , ** kwargs ):
938+ super (HTML , self ).__init__ (* args , _type = 'html' , ** kwargs )
939+ self ._classes = []
940+
941+ def repr (self , changed_widgets = {}):
942+ """It is used to automatically represent the object to HTML format
943+ packs all the attributes, children and so on.
944+
945+ Args:
946+ changed_widgets (dict): A dictionary containing a collection of tags that have to be updated.
947+ The tag that have to be updated is the key, and the value is its textual repr.
948+ """
949+ local_changed_widgets = {}
950+ innerHTML = ''
951+ for k in self ._render_children_list :
952+ s = self .children [k ]
953+ if isinstance (s , Tag ):
954+ innerHTML = innerHTML + s .repr (local_changed_widgets )
955+ elif isinstance (s , type ('' )):
956+ innerHTML = innerHTML + s
957+ elif isinstance (s , type (u'' )):
958+ innerHTML = innerHTML + s .encode ('utf-8' )
959+ else :
960+ innerHTML = innerHTML + repr (s )
961+ innerHTML += '\n '
962+ return '' .join (('<' , self .type , '>\n ' , innerHTML , '\n </' , self .type , '>' ))
963+
964+
965+ class HEAD (Tag ):
966+ def __init__ (self , title , js , css , html , * args , ** kwargs ):
967+ super (HEAD , self ).__init__ (* args , _type = 'head' , ** kwargs )
968+ self .add_child ('meta' ,
969+ """<meta content='text/html;charset=utf-8' http-equiv='Content-Type'>
970+ <meta content='utf-8' http-equiv='encoding'>
971+ <meta name="viewport" content="width=device-width, initial-scale=1.0">""" )
972+ self ._classes = []
973+ self .set_css (css )
974+ self .set_html (html )
975+ self .set_javascript (js )
976+ self .set_title (title )
977+
978+ def set_javascript (self , js ):
979+ self .add_child ("js" , js )
980+
981+ def set_html (self , html ):
982+ self .add_child ("html" , html )
983+
984+ def set_css (self , css ):
985+ self .add_child ("css" , css )
986+
987+ def set_title (self , title ):
988+ self .add_child ('title' , "<title>%s</title>" % title )
989+
990+ def repr (self , changed_widgets = {}):
991+ """It is used to automatically represent the object to HTML format
992+ packs all the attributes, children and so on.
993+
994+ Args:
995+ changed_widgets (dict): A dictionary containing a collection of tags that have to be updated.
996+ The tag that have to be updated is the key, and the value is its textual repr.
997+ """
998+ local_changed_widgets = {}
999+ innerHTML = ''
1000+ for k in self ._render_children_list :
1001+ s = self .children [k ]
1002+ if isinstance (s , Tag ):
1003+ innerHTML = innerHTML + s .repr (local_changed_widgets )
1004+ elif isinstance (s , type ('' )):
1005+ innerHTML = innerHTML + s
1006+ elif isinstance (s , type (u'' )):
1007+ innerHTML = innerHTML + s .encode ('utf-8' )
1008+ else :
1009+ innerHTML = innerHTML + repr (s )
1010+ innerHTML += '\n '
1011+ return '' .join (('<' , self .type , '>\n ' , innerHTML , '\n </' , self .type , '>' ))
1012+
1013+
1014+ class BODY (Widget ):
1015+ EVENT_ONLOAD = 'onload'
1016+ EVENT_ONERROR = 'onerror'
1017+ EVENT_ONONLINE = 'ononline'
1018+ EVENT_ONPAGEHIDE = 'onpagehide'
1019+ EVENT_ONPAGESHOW = 'onpageshow'
1020+ EVENT_ONRESIZE = 'onresize'
1021+
1022+ def __init__ (self , * args , ** kwargs ):
1023+ super (BODY , self ).__init__ (* args , _type = 'body' , ** kwargs )
1024+ loading_anim = Widget ()
1025+ loading_anim .set_identifier ("loading-animation" )
1026+ loading_widget = Widget (children = [loading_anim ])
1027+ loading_widget .set_identifier ("loading" )
1028+
1029+ self .append (loading_widget )
1030+
1031+ @decorate_set_on_listener ("(self, emitter)" )
1032+ @decorate_event_js ("""sendCallback('%(emitter_identifier)s','%(event_name)s');
1033+ event.stopPropagation();event.preventDefault();
1034+ return false;""" )
1035+ def onload (self ):
1036+ """Called when page gets loaded."""
1037+ return ()
1038+
1039+ @decorate_set_on_listener ("(self, emitter)" )
1040+ @decorate_event_js ("""
1041+ function(message, source, lineno, colno, error){
1042+ var params={};params['message']=message;
1043+ params['source']=source;
1044+ params['lineno']=lineno;
1045+ params['colno']=colno;
1046+ sendCallbackParam('%(emitter_identifier)s','%(event_name)s',params);
1047+ return false;
1048+ }""" )
1049+ def onerror (self , message , source , lineno , colno ):
1050+ """Called when an error occurs."""
1051+ print ("DOCUMENT ERROR: " + message )
1052+ return (message , source , lineno , colno )
1053+
1054+ @decorate_set_on_listener ("(self, emitter)" )
1055+ @decorate_event_js ("""sendCallback('%(emitter_identifier)s','%(event_name)s');
1056+ event.stopPropagation();event.preventDefault();
1057+ return false;""" )
1058+ def ononline (self ):
1059+ return ()
1060+
1061+ @decorate_set_on_listener ("(self, emitter)" )
1062+ @decorate_event_js ("""sendCallback('%(emitter_identifier)s','%(event_name)s');
1063+ event.stopPropagation();event.preventDefault();
1064+ return false;""" )
1065+ def onpagehide (self ):
1066+ return ()
1067+
1068+ @decorate_set_on_listener ("(self, emitter)" )
1069+ @decorate_event_js ("""sendCallback('%(emitter_identifier)s','%(event_name)s');
1070+ event.stopPropagation();event.preventDefault();
1071+ return false;""" )
1072+ def onpageshow (self ):
1073+ return ()
1074+
1075+ @decorate_set_on_listener ("(self, emitter)" )
1076+ @decorate_event_js ("""sendCallback('%(emitter_identifier)s','%(event_name)s');
1077+ event.stopPropagation();event.preventDefault();
1078+ return false;""" )
1079+ def onresize (self ):
1080+ return ()
1081+
1082+
10411083class GridBox (Widget ):
10421084 """It contains widgets automatically aligning them to the grid.
10431085 Does not permit children absolute positioning.
0 commit comments