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

Reply via email to