Update of /cvsroot/freevo/freevo/WIP/Barbieri In directory sc8-pr-cvs1:/tmp/cvs-serv28710/WIP/Barbieri
Modified Files: info_area.py Log Message: Rewrote to speed up Index: info_area.py =================================================================== RCS file: /cvsroot/freevo/freevo/WIP/Barbieri/info_area.py,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** info_area.py 22 Jun 2003 22:43:46 -0000 1.8 --- info_area.py 27 Jun 2003 14:50:02 -0000 1.9 *************** *** 10,15 **** # ----------------------------------------------------------------------- # $Log$ ! # Revision 1.8 2003/06/22 22:43:46 gsbarbieri ! # Some fixes # # Revision 1.7 2003/06/22 20:52:23 dischi --- 10,15 ---- # ----------------------------------------------------------------------- # $Log$ ! # Revision 1.9 2003/06/27 14:50:02 gsbarbieri ! # Rewrote to speed up # # Revision 1.7 2003/06/22 20:52:23 dischi *************** *** 59,63 **** from skin_utils import * import xml_skin ! import re from area import Geometry --- 59,63 ---- from skin_utils import * import xml_skin ! import copy from area import Geometry *************** *** 73,202 **** """ ! def __init__(self, parent, screen): Skin_Area.__init__(self, 'info', screen) ! self.last_item = None ! ! def update_content_needed(self): """ check if the content needs an update """ ! return self.last_item != list ! def get_expression( self, expression ): ! """ create the python expression """ ! exp = '' ! for b in expression.split( ' ' ): ! if b in ( 'and', 'or', 'not' ): ! # valid operator ! exp += ' %s' % ( b ) ! ! elif b[ :4 ] == 'len(' and b.find( ')' ) > 0 and \ ! len(b) - b.find(')') < 5: ! # lenght of something ! exp += ' item.getattr("%s") %s' % (b[:b.find(')')+1], ! b[b.find(')')+1:]) ! else: ! # an attribute ! exp += ' item.getattr("%s")' % b ! ! return exp.strip() ! def update_content(self): """ update the info area """ - content = self.calc_geometry( self.layout.content, copy_object=TRUE ) - item = self.infoitem ! if hasattr(item, 'info_type') and content.types.has_key(item.info_type): ! val = content.types[item.info_type] ! elif hasattr( item, 'type' ) and content.types.has_key( item.type ): ! val = content.types[item.type] ! else: ! val = content.types['default'] ! if not hasattr( val, 'fcontent' ): return ! list = self.return_formatedtext( val.fcontent )[0] - x0 = content.x - y0 = content.y for i in list: ! if i.y + i.height > content.height: break self.write_text( i.text, ! i.font, content, ! ( x0 + i.x), ( y0 + i.y ), i.width , i.height, align_v = i.valign, align_h = i.align, mode = i.mode ) ! self.last_item = list ! def return_formatedtext( self, list, x=0, y=0 ): """ ! Elimintate the 'If', 'Goto_Pos' and 'Newline', ! returning only the formated Text """ ! content = self.calc_geometry( self.layout.content, copy_object=TRUE ) ! width = content.width ! height = content.height ! x0 = content.x ! y0 = content.y ! item = self.infoitem - content = [ ] - last_newline = 0 # index of the last line - for i in list: - newline = 0 - # - # Tag: <if> - # - if isinstance( i, xml_skin.XML_FormatIf ): - # recurse ! exp = self.get_expression( i.expression ) # Evaluate the expression: try: if exp and eval( exp ): # It's true, we should recurse into children ! my_content, x, y = self.return_formatedtext( i.content, x, y ) ! # add the children contents to content list ! content += my_content except: print "ERROR: Could not evaluate 'if' condition in info_area" print "expression was: 'if %s:', Item was: %s" % ( exp, item.type ) traceback.print_exc() # # Tag: <goto_pos> # ! elif isinstance( i, xml_skin.XML_FormatGotopos ): # move to pos ! if i.mode == 'absolute': ! if i.x != None: ! x = i.x ! if i.y != None: ! y = i.y else: # relative ! if i.x != None: ! x += i.x ! if i.y != None: ! y = "%s+%s" % ( y, i.y ) # # Tag: <newline> # ! elif isinstance( i, xml_skin.XML_FormatNewline ): ! # new line ! if content: ! y = "%s+newline_height" % ( content[ -1 ].y ) ! newline = 1 x = 0 --- 73,309 ---- """ ! def __init__( self, parent, screen ): Skin_Area.__init__(self, 'info', screen) ! self.last_item = None ! self.content = None ! self.layout_content = None ! self.list = None ! self.updated = 0 ! self.sellist = None ! ! def update_content_needed( self ): """ check if the content needs an update """ ! update = 0 ! update += self.set_content() # set self.content ! update += self.set_list() # set self.list ! ! list = self.eval_expressions( self.list ) ! if self.sellist != list: ! self.sellist = list ! update += 1 ! ! self.updated = 1 + return update + ! def update_content( self ): """ update the info area """ ! if not self.updated: # entered a menu for the first time ! self.set_content() ! self.set_list() ! self.sellist = self.eval_expressions( self.list ) ! if not self.list: # nothing to draw return ! # get items to be draw ! list = self.return_formatedtext( self.sellist ) for i in list: ! if i.y + i.height > self.content.height: break self.write_text( i.text, ! i.font, self.content, ! ( self.content.x + i.x), ( self.content.y + i.y ), i.width , i.height, align_v = i.valign, align_h = i.align, mode = i.mode ) ! self.last_item = self.infoitem ! self.updated = 0 ! def set_content( self ): """ ! set self.content and self.layout_content if they need to be set (return 1) ! or does nothing (return 0) ! """ ! if self.layout_content is not self.layout.content: ! types = self.layout.content.types ! self.content = self.calc_geometry( self.layout.content, copy_object=TRUE ) ! self.content.types = types # backup types, which have the previously calculated fcontent ! self.layout_content = self.layout.content ! return 1 ! return 0 ! ! ! def set_list( self ): """ ! set self.list if need (return 1) or does nothing (return 0) ! """ ! if self.infoitem != self.last_item: ! if hasattr( self.infoitem, 'info_type') and \ ! self.content.types.has_key( self.infoitem.info_type ): ! val = self.content.types[ self.infoitem.info_type ] ! ! elif hasattr( self.infoitem, 'type' ) and \ ! self.content.types.has_key( self.infoitem.type ): ! val = self.content.types[ self.infoitem.type ] ! ! else: ! val = self.content.types[ 'default' ] ! ! if not hasattr( val, 'fcontent' ): ! return 1 ! ! self.list = val.fcontent ! return 1 ! return 0 ! def get_expression( self, expression ): ! """ ! create the python expression ! """ ! exp = '' ! for b in expression.split( ' ' ): ! if b in ( 'and', 'or', 'not' ): ! # valid operator ! exp += ' %s' % ( b ) ! ! elif b[ :4 ] == 'len(' and b.find( ')' ) > 0 and \ ! len(b) - b.find(')') < 5: ! # lenght of something ! exp += ' item.getattr("%s") %s' % ( b[ : ( b.find(')') + 1 ) ], ! b[ ( b.find(')') + 1 ) : ]) ! else: ! # an attribute ! exp += ' item.getattr("%s")' % b ! ! return exp.strip() ! ! ! ! ! def eval_expressions( self, list, index = [ ] ): ! """ ! travesse the list evaluating the expressions, ! return a flat list with valid elements indexes only ! (false 'if' expressions eliminated). Also, text elements ! are in the list too in a tuple: ! ( index, 'text value' ) ! so you can check if it changed just comparing two lists ! (useful in music player, to update 'elapsed') ! """ ! item = self.infoitem ! ret_list = [ ] ! rg = range( len( list ) ) ! for i in rg: ! if isinstance( list[ i ], xml_skin.XML_FormatIf ): ! if list[ i ].expression_analized == 0: ! list[ i ].expression_analized = 1 ! exp = self.get_expression( list[ i ].expression ) ! list[ i ].expression = exp ! else: ! exp = list[ i ].expression ! # Evaluate the expression: try: if exp and eval( exp ): # It's true, we should recurse into children ! ret_list += self.eval_expressions( list[ i ].content, index + [ i ] ) except: print "ERROR: Could not evaluate 'if' condition in info_area" print "expression was: 'if %s:', Item was: %s" % ( exp, item.type ) traceback.print_exc() + + continue + + elif isinstance( list[ i ], xml_skin.XML_FormatText ): + exp = None + if list[ i ].expression: + if list[ i ].expression_analized == 0: + list[ i ].expression_analized = 1 + exp = self.get_expression( list[ i ].expression ) + list[ i ].expression = exp + else: + exp = list[ i ].expression + try: + # evaluate the expression: + if exp: + exp = eval( exp ) + if exp: + list[ i ].text = exp + except: + print "ERROR: Parsing XML in info_area:" + print "could not evaluate: '%s'" % ( exp ) + traceback.print_exc() + # I add a tuple here to be able to compare lists and know if we need to + # update, this is useful in the mp3 player + ret_list += [ index + [ ( i, list[ i ].text ) ] ] + else: + ret_list += [ index + [ i ] ] + + return ret_list + + + + def return_formatedtext( self, sel_list ): + """ + receives a list of indexex of elements to be used and + returns a array with XML_FormatText ready to print (with its elements + x, y, width and height already calculated) + """ + x, y = 0, 0 + + item = self.infoitem + + list = self.list + ret_list = [ ] + last_newline = 0 # index of the last line + for i in sel_list: + newline = 0 + + # find the element + element = self.list + for j in range( len( i ) - 1 ): + element = element[ i[ j ] ].content + if isinstance( i[ -1 ], tuple ): + element = element[ i[ -1 ][ 0 ] ] + else: + element = element[ i[ -1 ] ] + # # Tag: <goto_pos> # ! if isinstance( element, xml_skin.XML_FormatGotopos ): # move to pos ! if element.mode == 'absolute': ! if element.x != None: ! x = element.x ! if element.y != None: ! y = element.y else: # relative ! if element.x != None: ! x += element.x ! if element.y != None: ! y = y + element.y # # Tag: <newline> # ! elif isinstance( element, xml_skin.XML_FormatNewline ): ! newline = 1 # newline height will be added later x = 0 *************** *** 204,286 **** # Tag: <text> # ! elif isinstance( i, xml_skin.XML_FormatText ): # text position is the current position: ! i.x = x ! i.y = y ! text = i.text ! ! # The content should be the result of the expression? ! if i.expression: ! # Yes, evaluate the expression ! exp= self.get_expression( i.expression ) ! try: ! # evaluate the expression: ! if exp: ! text = "%s" % eval( exp ) ! except: ! print "ERROR: Parsing XML in info_area:" ! print "could not evaluate: '%s'" % ( exp ) ! ! if text: ! # The item's text should be the one evaluated before ! i.text = text ! i.expression = None ! else: ! # The expression evaluates to nothing, get the content instead ! text = i.text ! # There's a need to calculate the line height/width? ! if text and i.width <= 0 or i.height <= 0 or i.height == 'line_height': ! font = i.font ! size = osd.stringsize( text, font.name, font.size ) ! if i.width <=0: ! i.width = size[ 0 ] ! if i.height <=0 or i.height == 'line_height': ! i.height = size[ 1 ] ! elif not text: continue # Calculate the geometry ! r = Geometry( x, y, i.width, i.height) ! r = self.get_item_rectangle( r, width - x, height - y )[ 2 ] ! font = i.font ! size = osd.drawstringframed( text, 0, 0, r.width, r.height, None, None, font.name, font.size, ! i.align, i.valign, ! i.mode, layer=osd.null_layer )[ 1 ] m_width = size[ 2 ] - size[ 0 ] m_height = size[ 3 ] - size[ 1 ] if m_width > 0: r.width = min( r.width , m_width ) if m_height > 0: r.height = min( r.height, m_height ) - i.x, i.y, i.width, i.height = r.x, r.y, r.width, r.height - - x += r.width ! content += [ i ] # We should shrink the width and go next line (overflow) ! if x > width: x = 0 - y = "%s+%s" % ( y, 'newline_height' ) newline = 1 ! if content: ! content[ -1 ].width = width - content[ -1 ].x # Need to recalculate line height? ! if newline and content: newline_height = 0 # find the tallest string ! for idx in range( last_newline, len( content ) ): ! font = content[ idx ].font ! if content[ idx ].text and content[ idx ].height > newline_height: ! newline_height = content[ idx ].height ! y = eval( y ) ! ! y = eval( '%s' % y ) - return content, x, y --- 311,380 ---- # Tag: <text> # ! elif isinstance( element, xml_skin.XML_FormatText ): ! element = copy.deepcopy( element ) # text position is the current position: ! element.x = x ! element.y = y ! # There's a need to calculate the line height/width? ! if element.text and element.width <= 0 or element.height <= 0 or element.height == 'line_height': ! font = element.font ! size = osd.stringsize( element.text, font.name, font.size ) ! if element.width <=0: ! element.width = size[ 0 ] ! if element.height <=0 or element.height == 'line_height': ! element.height = size[ 1 ] ! elif not element.text: continue + # Calculate the geometry ! r = Geometry( x, y, element.width, element.height) ! r = self.get_item_rectangle( r, ! self.content.width - x, ! self.content.height - y )[ 2 ] ! # Element.text fits in r.width, r.height ? ! font = element.font ! size = osd.drawstringframed( element.text, 0, 0, r.width, r.height, None, None, font.name, font.size, ! element.align, element.valign, ! element.mode, layer=osd.null_layer )[ 1 ] m_width = size[ 2 ] - size[ 0 ] m_height = size[ 3 ] - size[ 1 ] if m_width > 0: r.width = min( r.width , m_width ) if m_height > 0: r.height = min( r.height, m_height ) ! element.x, element.y, element.width, element.height = r.x, r.y, r.width, r.height ! ! x += element.width ! ! ret_list += [ element ] # We should shrink the width and go next line (overflow) ! if x > self.content.width: x = 0 newline = 1 ! element.width = self.content.width - element.x ! # Need to recalculate line height? ! if newline and ret_list: newline_height = 0 # find the tallest string ! new_last_newline = len( ret_list ) ! last_line = ret_list[ last_newline : new_last_newline ] ! for j in last_line: ! font = j.font ! if j.text and j.height > newline_height: ! newline_height = j.height ! y = y + newline_height ! last_newline = new_last_newline ! ! return ret_list ! ------------------------------------------------------- This SF.Net email is sponsored by: INetU Attention Web Developers & Consultants: Become An INetU Hosting Partner. Refer Dedicated Servers. We Manage Them. You Get 10% Monthly Commission! INetU Dedicated Managed Hosting http://www.inetu.net/partner/index.php _______________________________________________ Freevo-cvslog mailing list [EMAIL PROTECTED] https://lists.sourceforge.net/lists/listinfo/freevo-cvslog