From e1516a57c5414313824557b5d9c441c5783830a9 Mon Sep 17 00:00:00 2001 From: Jonathan Loriette <john@nexedi.com> Date: Wed, 29 Jun 2005 12:54:19 +0000 Subject: [PATCH] add color seeting and correct problems of positions git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@3365 20353a03-c40f-0410-a6d1-a30d3c3de9de --- product/ERP5Form/PlanningBox.py | 233 ++++++++++++++++++-------------- 1 file changed, 133 insertions(+), 100 deletions(-) diff --git a/product/ERP5Form/PlanningBox.py b/product/ERP5Form/PlanningBox.py index 104ca7ff1d..02f4bf2c6d 100755 --- a/product/ERP5Form/PlanningBox.py +++ b/product/ERP5Form/PlanningBox.py @@ -54,7 +54,7 @@ class PlanningBoxValidator(Validator.StringBaseValidator): space_line=field.get_value('space_line') selection_name = field.get_value('selection_name') sort = field.get_value('sort') - + color_script=getattr(here,field.get_value('color'),None) height_header = field.get_value('height_header') height_global_div = field.get_value('height_global_div') height_axis_x=field.get_value('height_axis_x') @@ -189,7 +189,7 @@ class PlanningBoxValidator(Validator.StringBaseValidator): info_backleft=info_backleft,info_backright=info_backright, list_error=list_error,old_delta=['None','None'],REQUEST=REQUEST, blocks_object=blocks_object,width_line=width_line, - script_height_block=block_height,y_max=y_max) + script_height_block=block_height,y_max=y_max,color_script=color_script) break indic_line+=1 @@ -500,13 +500,13 @@ def createLineObject(meta_types,selection,selection_name,field,REQUEST,list_meth current_top=list_object[len(list_object)-1].createLineChild(report_sections,field, current_top,y_axis_width,width_line,space_line,height_global_div, height_header,height_axis_x,nbr_line,index,url) - else : # in this case wee add a soon to a soon + else : # in this case wee add a son to a son depth=0 - current_soon=list_object[len(list_object)-1] + current_son=list_object[len(list_object)-1] while depth != (line_report.getDepth()-1): - current_soon=list_object[len(list_object)-1].soon[len(list_object[len(list_object)-1].soon)-1] + current_son=list_object[len(list_object)-1].son[len(list_object[len(list_object)-1].son)-1] depth+=1 - current_top=current_soon.createLineChild(report_sections,field,current_top,y_axis_width, + current_top=current_son.createLineChild(report_sections,field,current_top,y_axis_width, width_line,space_line,height_global_div,height_header ,height_axis_x,nbr_line,index,url) index += 1 @@ -532,8 +532,8 @@ class PlanningBoxWidget(Widget.Widget): 'list_method','report_root_list','selection_name','portal_types', 'meta_types','sort','title_line','y_unity','y_axis_width','y_range','x_range', 'x_axis_script_id','x_start_bloc','x_stop_bloc','y_axis_method','max_y', - 'constraint_method','info_center','info_topleft','info_topright','info_backleft', - 'info_backright','security_index'] + 'constraint_method','color_script','info_center','info_topleft','info_topright', + 'info_backleft','info_backright','security_index'] default = fields.TextAreaField('default', title='Default', @@ -615,7 +615,7 @@ class PlanningBoxWidget(Widget.Widget): title='List Method', description=('The method to use to list' 'objects'), - default='', + default='searchFolder', required=0) title_line = fields.StringField('title_line', @@ -647,7 +647,7 @@ class PlanningBoxWidget(Widget.Widget): x_range = fields.StringField('x_range', title='range of X-Axis:', description=('Nature of the subdivisions of X-Axes, not Required'), - default='Day', + default='day', required=0) x_axis_script_id = fields.StringField('x_axis_script_id', @@ -696,6 +696,15 @@ class PlanningBoxWidget(Widget.Widget): default='SET_DHTML', required=1) + + color_script = fields.StringField('color_script', + title='name of script which allow to colorize blocks', + description=('script for block colors' + 'objects'), + default='', + required=0) + + info_center = fields.StringField('info_center', title='specific method of data called for inserting info in block center', description=('Method for displaying info in the center of a block' @@ -762,6 +771,7 @@ class PlanningBoxWidget(Widget.Widget): script=getattr(here,field.get_value('x_axis_script_id'),None) block_height= getattr(here,field.get_value('y_axis_method'),None) constraint_method = field.get_value('constraint_method') + color_script = getattr(here,field.get_value('color_script'),None) #info inside a block info_center = field.get_value('info_center') @@ -892,7 +902,7 @@ class PlanningBoxWidget(Widget.Widget): info_backleft=info_backleft,info_backright=info_backright, list_error=list_error,old_delta=old_delta,REQUEST=REQUEST, blocks_object=blocks_object,width_line=width_line, - script_height_block=block_height,y_max=y_max) + script_height_block=block_height,y_max=y_max,color_script=color_script) break indic_line+=1 # At this point line_list contains our tree of datas. Then we @@ -1129,27 +1139,28 @@ class Line: def render(self,portal_url,y_axis_width): """ creates "pure" html code of the line, its Block, its son """ html_render='<div id=\"'+self.name+'\"></div>\n' - for j in self.content: - if j.types=='activity' or j.types=='activity_error': + for block in self.content: + if block.types=='activity' or block.types=='activity_error': #checks if the block starts before the beginning of the line - if ((self.begin+j.begin*self.width) < self.begin): - html_render+='<div id=\"'+j.name+'\" ondblclick=\"showGrips()\" onclick=\"if (dd.elements.'\ - +j.name+'.moved==0){dd.elements.'+j.name+'.moveBy('+str(round(j.begin*self.width))\ - +',0);dd.elements.'+j.name+'.resizeTo('+str(round(j.width*self.width))+','\ - + str(j.height*(self.height-10))+');dd.elements.'+j.name+'.moved=1;} \">' + if ((self.begin+block.begin*self.width) < self.begin): + html_render+='<div id=\"'+block.name+'\" ondblclick=\"showGrips()\" onclick=\"if (dd.elements.'\ + +block.name+'.moved==0){dd.elements.'+block.name+'.moveBy('+\ + str(round(block.begin*self.width))+',0);dd.elements.'+block.name+'.resizeTo('+\ + str(round(block.width*self.width))+','+ str(block.height*(self.height-10))+\ + ');dd.elements.'+block.name+'.moved=1;} \">' # "done" is used because otherwise everytime we move the block it will execute moveby() #checks if the block is too large for the end of the line if it is the case, one cuts the block - elif ((j.width*self.width)+(self.begin+j.begin*self.width)>self.width+y_axis_width): - html_render+='<div id=\"'+j.name+'\" ondblclick=\"showGrips()\" onclick=\"dd.elements.'\ - +j.name+'.resizeTo('+str(round(j.width*self.width))+','\ - +str(j.height*(self.height-10))+') \">' + elif ((block.width*self.width)+(self.begin+block.begin*self.width)>self.width+y_axis_width): + html_render+='<div id=\"'+block.name+'\" ondblclick=\"showGrips()\" onclick=\"dd.elements.'\ + +block.name+'.resizeTo('+str(round(block.width*self.width))+','\ + +str(block.height*(self.height-10))+') \">' else: - html_render+='<div id=\"'+j.name+'\" ondblclick=\"showGrips()\">' + html_render+='<div id=\"'+block.name+'\" ondblclick=\"showGrips()\">' # we add info Block inside the div thanks to the render method of the Block class - html_render+=j.render(self.width,self.height,portal_url,self.begin,y_axis_width,self) + html_render+=block.render(self.width,self.height,portal_url,self.begin,y_axis_width,self) html_render+='</div>\n' - elif j.types!='info': - html_render+='<div id=\"'+j.name+'\">'+str(j.text)+'</div>\n' + elif block.types!='info': + html_render+='<div id=\"'+block.name+'\">'+str(block.text)+'</div>\n' if self.son!=[]: for i in self.son: html_render+=i.render(portal_url,y_axis_width) @@ -1173,85 +1184,85 @@ class Line: elif self.y_type=='son2': css_render+='border-top-width:0px;' css_render+='width:'+str(self.width)+'px;\n}' - for j in self.content: #we generate block's css - if j.types=='activity' or j.types=='activity_error': - if j.types=='activity': - css_render+='#'+j.name+'{position:absolute;\nbackground:#bdd2e7;\nborder-style:solid;\ + for block in self.content: #we generate block's css + if block.types=='activity' or block.types=='activity_error': + if block.types=='activity': + css_render+='#'+block.name+'{position:absolute;\nbackground:'+block.color+';\nborder-style:solid;\ \nborder-color:#53676e;\nborder-width:1px;\n' - if j.types=='activity_error': - css_render+='#'+j.name+'{position:absolute;\nbackground:#bdd2e7;\nborder-style:solid;\ + if block.types=='activity_error': + css_render+='#'+block.name+'{position:absolute;\nbackground:'+block.color+';\nborder-style:solid;\ \nborder-color:#ff0000;\nborder-width:1px;\n' - css_render+='height:'+str((j.height*(self.height-10))-security_index)+'px;\n' + css_render+='height:'+str((block.height*(self.height-10))-security_index)+'px;\n' #-10 because wee don't want a block sticked to border-top of the line - if ((self.begin+j.begin*self.width) < self.begin) and j.types!='activity_error': + if ((self.begin+block.begin*self.width) < self.begin) and block.types!='activity_error': #checks if the block starts before the beginning of the line css_render+='margin-left:'+str(self.begin)+'px;\n' - css_render+='width:'+str((j.width*self.width+j.begin*self.width))+'px;\n' + css_render+='width:'+str((block.width*self.width+block.begin*self.width))+'px;\n' #checks if the block is too large for the end of the line. if it is the case, one cuts the block - elif ((j.width*self.width)+(self.begin+j.begin*self.width)>self.width+y_axis_width) and \ - j.types!='activity_error': - css_render+='width:'+str(round(j.width*self.width)-((self.begin+j.begin*self.width+ - j.width*self.width)-(self.width+y_axis_width)))+'px;\n' - css_render+='margin-left:'+str(round(self.begin+j.begin*self.width))+'px;\n' + elif ((block.width*self.width)+(self.begin+block.begin*self.width)>self.width+y_axis_width) and \ + block.types!='activity_error': + css_render+='width:'+str(round(block.width*self.width)-((self.begin+block.begin*self.width+ + block.width*self.width)-(self.width+y_axis_width)))+'px;\n' + css_render+='margin-left:'+str(round(self.begin+block.begin*self.width))+'px;\n' else: - css_render+='width:'+str(round(j.width*self.width))+'px;\n' - css_render+='margin-left:'+str(round(self.begin+j.begin*self.width))+'px;\n' - css_render+='margin-top:'+str(self.top+10+j.marge_top*(self.height-10))+'px;}\n' + css_render+='width:'+str(round(block.width*self.width))+'px;\n' + css_render+='margin-left:'+str(round(self.begin+block.begin*self.width))+'px;\n' + css_render+='margin-top:'+str(self.top+10+block.marge_top*(self.height-10))+'px;}\n' # we add info Block inside the div - css_render+=j.render_css(self.width,self.height,self,y_axis_width) + css_render+=block.render_css(self.width,self.height,self,y_axis_width) - elif j.types=='text_x' : + elif block.types=='text_x' : data={'border-style:':'solid;','border-color:':'#53676e;','border-width:':'1px;', - 'margin-left:':str(j.begin)+'px;', + 'margin-left:':str(block.begin)+'px;', 'margin-top:':str(round(1+self.top+self.height/2))+'px;'} - elif j.types=='text_y': + elif block.types=='text_y': data={'border-style:':'solid;','border-color:':'#53676e;','border-width:':'0px;', 'margin-left:':str(self.width/4)+'px;', 'margin-top:':str(round(1+self.top+self.height/2))+'px;'} - elif j.types=='vertical_dotted': + elif block.types=='vertical_dotted': data={'border-style:':'dotted;','border-color':'#53676e;', - 'margin-left:':str(j.begin)+'px;','margin-top:':str(1+round(self.top))+'px;', + 'margin-left:':str(block.begin)+'px;','margin-top:':str(1+round(self.top))+'px;', 'height:':str(self.height)+'px;', 'border-left-width:':'1px;','border-right-width:':'0px;','border-top-width:':'0px;', 'border-bottom-width:':'0px;'} - elif j.types=='horizontal_dotted': + elif block.types=='horizontal_dotted': data={'border-style:':'dotted;','border-color:':'#53676e;', - 'margin-left:':str(self.begin)+'px;','margin-top:':str(self.top+j.marge_top)+'px;', + 'margin-left:':str(self.begin)+'px;','margin-top:':str(self.top+block.marge_top)+'px;', 'border-left-width:':'0px;','border-right-width:':'0px;', 'border-top-width:':'1px;','border-bottom-width:':'0px;', 'width:':str(self.width)+'px;'} - elif j.types=='y_coord': + elif block.types=='y_coord': data={'border-style:':'solid;','border-color:':'#53676e;','border-width:':'0px;', - 'margin-left:':str(self.width-(len(j.text)*5))+'px;', - 'margin-top:':str(self.top+j.marge_top)+'px;', + 'margin-left:':str(self.width-(len(block.text)*5))+'px;', + 'margin-top:':str(self.top+block.marge_top)+'px;', 'height:':'','border-left-width:':'1px;','border-right-width:':'0px;', 'border-top-width:':'0px;','border-bottom-width':'0px;','font-size:':'9px;'} - elif j.types=='vertical': + elif block.types=='vertical': data={'border-style:':'solid;','border-color:':'#53676e;', - 'margin-left:':str((self.width/4)+j.begin)+'px;', + 'margin-left:':str((self.width/4)+block.begin)+'px;', 'margin-top:':str(round(self.top)-self.height/2+13)+'px;', - 'height:':str(j.height)+'px;','border-left-width:':'1px;', + 'height:':str(block.height)+'px;','border-left-width:':'1px;', 'border-right-width:':'0px;','border-top-width:':'0px;', 'border-bottom-width:':'0px;'} - elif j.types=='horizontal': + elif block.types=='horizontal': data={'border-style:':'solid;','border-color:':'#53676e;', - 'margin-left:':str((self.width/4)+j.begin)+'px;', + 'margin-left:':str((self.width/4)+block.begin)+'px;', 'margin-top:':str(round(1+self.top+self.height/2))+'px;', 'height:':'1px;','border-left-width:':'0px;','border-right-width:':'0px;', 'border-top-width:':'1px;','border-bottom-width:':'0px;','width:':'16px;','height:':'1px;', } - if j.types!='activity': - if j.types!='activity_error': - if j.types!='info': - css_render+='#'+j.name+'{position:absolute;\n' + if block.types!='activity': + if block.types!='activity_error': + if block.types!='info': + css_render+='#'+block.name+'{position:absolute;\n' for key in data: css_render+=key + data[key] + '\n' css_render+='}\n' @@ -1269,7 +1280,7 @@ class Line: else: type_block='activity_error' self.content.append(Block(type_block,name=name,begin=block[0],width=block[1],height=block[2],text='', - content=block[3],marge_top=block[4],url=block[5])) + content=block[3],marge_top=block[4],url=block[5],color=block[6])) def addBlockInfo(self,name): @@ -1578,7 +1589,7 @@ class Line: def insertActivityBlock(self,line_content=None,object_start_method_id=None,object_stop_method_id=None, x_axe=[],field='',info_center='',info_topright='',info_topleft='', info_backleft='',info_backright='',list_error='',old_delta='',REQUEST=None, - blocks_object={},width_line=0,script_height_block=None,y_max = 1): + blocks_object={},width_line=0,script_height_block=None,y_max = 1,color_script=None): """allows to create the mobile block objects""" #first we check if the block has information center= getattr(line_content,info_center,None) @@ -1598,6 +1609,7 @@ class Line: wrong_left=0 wrong_right=0 list_block=[] + current_color='' if method_start==None and blocks_object!={}: for Ablock in blocks_object: #object_content is the current object used for building a block. @@ -1619,12 +1631,12 @@ class Line: if isinstance(block_begin,DateTime): if round(block_begin-DateTime(x_axe[0][0]))>0: block_left=float(round(block_begin-DateTime(x_axe[0][0])))/round( - DateTime(x_axe[0][-1])-DateTime(x_axe[0][0])) + (DateTime(x_axe[0][-1])+1)-DateTime(x_axe[0][0])) elif round(block_begin-DateTime(x_axe[0][0]))==0: block_left=0 else: block_left=float(round(block_begin-DateTime(x_axe[0][0])))/round( - DateTime(x_axe[0][-1])-DateTime(x_axe[0][0])) + (DateTime(x_axe[0][-1])+1)-DateTime(x_axe[0][0])) if block_stop-DateTime(x_axe[0][0])<=0: wrong_left = 1 #means that the block is outside of x-axis range @@ -1633,7 +1645,7 @@ class Line: wrong_right = 1 #the same block_right=float(round(block_stop-DateTime(x_axe[0][0])))/round( - DateTime(x_axe[0][-1])-DateTime(x_axe[0][0])) + (DateTime(x_axe[0][-1])+1)-DateTime(x_axe[0][0])) center= getattr(object_content,info_center,None) topright = getattr(object_content,info_topright,None) @@ -1655,8 +1667,12 @@ class Line: height = 0.75 else: height = float(script_height_block(object_content))/y_max + + if color_script != None: + current_color = color_script(object_content) + if wrong_left!=1 and wrong_right!=1: # if outside we do not display - list_block.append([block_left,block_right-block_left,height,info,1-height,url]) + list_block.append([block_left,block_right-block_left,height,info,1-height,url,current_color]) else: if block_begin !=None: for i in x_axe[0]: @@ -1677,8 +1693,10 @@ class Line: height = 0.75 else: height = float(script_height_block(object_content))/y_max + if color_script != None: + current_color = color_script(object_content) list_block.append([marge,(block_stop-block_begin)/(float(len(x_axe[0]))),height,info, - 1-height,url]) + 1-height,url,current_color]) # 0.75(height) need to be defined marge+=1/float(len(x_axe[0])) else: @@ -1694,29 +1712,36 @@ class Line: # if datas are DateTime type we need to do special process. if isinstance(block_begin,DateTime): if round(block_begin-DateTime(x_axe[0][0]))>0: - block_left=float(round(block_begin-DateTime(x_axe[0][0])))/round( - DateTime(x_axe[0][-1])-DateTime(x_axe[0][0])) + block_left=float(round(block_begin-DateTime(x_axe[0][0])))/float( + (DateTime(x_axe[0][-1])+1)-DateTime(x_axe[0][0])) elif round(block_begin-DateTime(x_axe[0][0]))==0: block_left=0 else: block_left=float(round(block_begin-DateTime(x_axe[0][0])))/round( - DateTime(x_axe[0][-1])-DateTime(x_axe[0][0])) + (DateTime(x_axe[0][-1]+1))-DateTime(x_axe[0][0])) - if block_stop-DateTime(x_axe[0][0])<=0: - wrong_left = 1 #means that the block is outside of x-axis range + if block_stop!=None: + if block_stop-DateTime(x_axe[0][0])<=0: + wrong_left = 1 #means that the block is outside of x-axis range if block_begin-DateTime(x_axe[0][-1])>=0: wrong_right = 1 #the same - - block_right=float(round(block_stop-DateTime(x_axe[0][0])))/round( - DateTime(x_axe[0][-1])-DateTime(x_axe[0][0])) + if block_stop!=None: + block_right=float(round(block_stop-DateTime(x_axe[0][0])))/round( + (DateTime(x_axe[0][-1])+1)-DateTime(x_axe[0][0])) if wrong_left!=1 and wrong_right!=1: # if outside we do not display if script_height_block == None or y_max==1: height = 0.75 else: - height = float(script_height_block(line_content.getObject()))/y_max - list_block.append([block_left,block_right-block_left,height,info,1-height,'']) + height = float(script_height_block(line_content.getObject()))/y_max + if color_script != None: + current_color = color_script(line_content) + if block_stop != None: + list_block.append([block_left,block_right-block_left,height,info,1-height,'',current_color]) + else: + list_block.append([block_left,1/(float(len(x_axe[0]))),height,info,1-height,'',current_color]) + else: if block_begin !=None: if block_stop !=None: @@ -1726,7 +1751,9 @@ class Line: height = 0.75 else: height = float(script_height_block(line_content.getObject()))/y_max - list_block.append([marge,1/(float(len(x_axe[0]))),height,info,1-height,'']) + if color_script != None: + current_color = color_script(object_content) + list_block.append([marge,1/(float(len(x_axe[0]))),height,info,1-height,'',current_color]) # 0.75(height) need to be defined marge+=1/float(len(x_axe[0])) else: @@ -1738,7 +1765,9 @@ class Line: height = 0.75 else: height = float(script_height_block(line_content.getObject()))/y_max - list_block.append([marge,1/(float(len(x_axe[0]))),height,info,1-height,'']) + if color_script != None: + current_color = color_script(object_content) + list_block.append([marge,1/(float(len(x_axe[0]))),height,info,1-height,'',current_color]) marge+=1/float(len(x_axe[0])) if list_block!=[]: self.appendActivityBlock(list_block,list_error,old_delta,REQUEST) @@ -1758,13 +1787,14 @@ class Line: info_backleft=info_backleft,info_backright=info_backright, list_error=list_error,old_delta=old_delta,REQUEST=REQUEST, width_line=width_line, - script_height_block=script_height_block) + script_height_block=script_height_block, + color_script=color_script) indic+=1 # class block class Block: - def __init__(self,types,name,begin,width=0,height=0,text='',content={},marge_top=0,id='',url=''): + def __init__(self,types,name,begin,width=0,height=0,text='',content={},marge_top=0,id='',url='',color=''): """creates a block object""" self.types=types self.name=name @@ -1774,7 +1804,10 @@ class Block: self.text=text self.content=content #stores info block in a dictionnary self.marge_top=marge_top - # self.color=color should be cool to be implemented in the future... + if color=='': + self.color='#bdd2e7' + else: + self.color=color self.id = name self.url = url @@ -1969,38 +2002,38 @@ class Block: margin_left=0 margin_top=0 - for i in self.content: - matrix_data = matrix[(i,list_info_length)] + for block in self.content: + matrix_data = matrix[(block,list_info_length)] left = matrix_data['left'] top= matrix_data['top'] if left == 0: margin_left=0 else: - margin_left = round(((block_width*line_width)/left)-(font_width*len(self.content[i]))/left) + margin_left = round(((block_width*line_width)/left)-(font_width*len(self.content[block]))/left) if top==0: margin_top=0 else: margin_top = round(((self.height*(line_height-10))/top)-(font_height)) if list_info_length==5: test_height= font_height<=((self.height*(line_height))/3) - test_width= ((len(self.content[i])*font_width)<=((block_width*line_width)/3)) + test_width= ((len(self.content[block])*font_width)<=((block_width*line_width)/3)) if list_info_length==4 or list_info_length==3: test_height= font_height<=((self.height*(line_height))/2) - test_width= ((len(self.content[i])*font_width)<=((block_width*line_width)/2)) + test_width= ((len(self.content[block])*font_width)<=((block_width*line_width)/2)) if list_info_length==2: test_height=font_height<=(self.height*(line_height)) - test_width= (len(self.content[i]*font_width)<=((block_width*line_width)/2)) + test_width= (len(self.content[block]*font_width)<=((block_width*line_width)/2)) if list_info_length==1: test_height= font_height<=(self.height*(line_height)) - test_width= (len(self.content[i]*font_width)<=(block_width*line_width)) + test_width= (len(self.content[block]*font_width)<=(block_width*line_width)) if test_height & test_width: - string+='#'+self.name+i+'{position:absolute;\nmargin-left:'+\ + string+='#'+self.name+block+'{position:absolute;\nmargin-left:'+\ str(margin_left)+'px;\nmargin-top:'+str(margin_top)+'px;\n}\n' - line.addBlockInfo(self.name+i) + line.addBlockInfo(self.name+block) else: # we add question.png because the size of the block is not enough if ((self.width*line_width>=15) & (self.height*line_height>=15)): - matrix_data= matrix_picture[(i,list_info_length)] + matrix_data= matrix_picture[(block,list_info_length)] left = matrix_data['left'] top = matrix_data['top'] if left == 0: @@ -2011,15 +2044,15 @@ class Block: margin_top=0 else: margin_top=round(((self.height*(line_height-10))/top)-(15/top)) - if i=='center' and list_info_length==3: + if block=='center' and list_info_length==3: margin_left=round(((block_width*line_width)/left)-(15/left)) margin_top=round(((self.height*(line_height-10))/top)-(font_height)) - if i=='center' and list_info_length==2: + if block=='center' and list_info_length==2: margin_top=round(((self.height*(line_height-10))/top)-(font_height/top)) - if already==0 or i=='center': - string+='#'+self.name+i+'{position:absolute;\nmargin-left:'+str(margin_left)+\ + if already==0 or block=='center': + string+='#'+self.name+block+'{position:absolute;\nmargin-left:'+str(margin_left)+\ 'px;\nmargin-top:'+str(margin_top)+'0px;\n}' - block_disp=self.name+i + block_disp=self.name+block already=1 return string -- 2.30.9