Changeset d476ee6


Ignore:
Timestamp:
02/08/11 01:57:47 (4 years ago)
Author:
xkolman2 <xkolman2@…>
Branches:
master
Children:
13f7cb8
Parents:
e423f6e
git-author:
xkolman2 <xkolman2@…> (02/08/11 01:57:47)
git-committer:
xkolman2 <xkolman2@…> (02/08/11 01:57:47)
Message:

add support for multipage item menus
add support for multilayer buton icons
add initial support for theming special buttons (less and more, for now) + update the default theme conf
remove some debugging output

git-svn-id: https://nlp.fi.muni.cz/svn/gps_navigace/trunk@287 0858a4d0-ffff-46e5-938e-62b5ecb34222

Files:
2 added
8 edited

Legend:

Unmodified
Added
Removed
  • modrana.py

    re78b435 rd476ee6  
    356356      self.chain(event) 
    357357      cr = self.window.cairo_create() 
    358       print "ASDASDASDASD" 
    359       print self.window 
    360       print cr.get_target() 
    361358      return self._expose_cairo(event, cr) 
    362359 
  • modules/mod_icons.py

    r6edab0a rd476ee6  
    102102            print "%s" % e 
    103103          # get the background icon 
    104           compositeIcon = self.roundedRectangle(w, h, self.buttonFillColor, self.buttonOutlineColor) 
     104#          compositeIcon = self.roundedRectangle(w, h, self.buttonFillColor, self.buttonOutlineColor) 
     105          compositeIcon = cairo.ImageSurface(cairo.FORMAT_ARGB32,w,h) 
    105106          ct = cairo.Context(compositeIcon) 
    106107          ct2 = gtk.gdk.CairoContext(ct) 
    107108          ct2.set_source_pixbuf(pixbuf,targetX,targetY) 
    108109          ct2.paint() 
    109           return compositeIcon 
     110          return (compositeIcon,True) # this signalizes that a background might be needed 
    110111 
    111112      if result == None: 
     
    119120      print "icons: %s not found" % name 
    120121      # we use the default button background if the tile is missing 
    121       return(self.roundedRectangle(w, h, self.buttonFillColor, self.buttonOutlineColor)) 
     122      return(self.roundedRectangle(w, h, self.buttonFillColor, self.buttonOutlineColor),False) 
    122123 
    123124    if(not image): # loading the image probably failed 
     
    125126    w = float(image.get_width()) 
    126127    h = float(image.get_height()) 
    127     return (image) 
     128    return (image,False) 
    128129 
    129130  def getImageSurface(self,path, w, h): 
     
    148149      print "** exception: %s" % e 
    149150    return image 
     151 
     152  def getCustomIcon(self,parameterList,w,h): 
     153    """ 
     154    there are five positional parameters: 
     155    fill collor,fill opacity, outline color, outline opacity, 
     156    outline width (default 8) and corner radius (default 22) 
     157    to use default value, just don't fill in the positional parameter 
     158    ( len(parameter) == 0 ) 
     159    """ 
     160    # check if the list has proper length 
     161    if len(parameterList) != 6: 
     162      return None 
     163    semicolonSepList = parameterList 
     164    # process the positional parameters 
     165    if len(semicolonSepList[0]): 
     166      fillColorString = semicolonSepList[0] 
     167    else: 
     168      fillColorString = None 
     169 
     170    if len(semicolonSepList[1]): 
     171      fillAlpha = float(semicolonSepList[1]) 
     172    else: 
     173      fillAlpha = 1.0 
     174 
     175    if len(semicolonSepList[2]): 
     176      outlineColorString = semicolonSepList[2] 
     177    else: 
     178      outlineColorString = None 
     179 
     180    if len(semicolonSepList[3]): 
     181      outlineAlpha = float(semicolonSepList[3]) 
     182    else: 
     183      outlineAlpha = 1.0 
     184 
     185    if len(semicolonSepList[4]): 
     186      outlineWidth = int(semicolonSepList[4]) 
     187    else: 
     188      outlineWidth = 8 
     189 
     190    if len(semicolonSepList[5]): 
     191      cornerRadius = int(semicolonSepList[5]) 
     192    else: 
     193      cornerRadius = 22 
     194 
     195    # parse the colors (if defined) 
     196 
     197    if fillColorString: 
     198      fillColor = self.color("fill", (fillColorString,fillAlpha)) 
     199      fillColorRGBATupple = fillColor.getCairoColor() 
     200    else: 
     201      fillColorRGBATupple = self.buttonFillColor 
     202 
     203 
     204    if outlineColorString: 
     205      outlineColor = self.color("outline", (outlineColorString,outlineAlpha)) 
     206      outlineColorRGBATupple = outlineColor.getCairoColor() 
     207    else: 
     208      outlineColorRGBATupple = self.buttonOutlineColor 
     209 
     210    # apply the alfa values 
     211    try: 
     212      (r,g,b,a) = fillColorRGBATupple 
     213      fillColorRGBATupple = (r,g,b,fillAlpha) 
     214    except Exception, e: 
     215      print "** wrong fill color code or name: %s" % fillColorString 
     216      print "** exception: %s" % e 
     217      fillColorRGBATupple = self.buttonFillColor 
     218 
     219    try: 
     220      (r,g,b,a) = outlineColorRGBATupple 
     221      outlineColorRGBATupple = (r,g,b,outlineAlpha) 
     222    except Exception, e: 
     223      print "** wrong outline color code or name: %s" % fillColorString 
     224      print "** exception: %s" % e 
     225      outlineColorRGBATupple = self.buttonOutlineColor 
     226 
     227    # create the icon 
     228    icon = self.roundedRectangle(w, h, fillColorRGBATupple, outlineColorRGBATupple, outlineWidth=outlineWidth, radius=cornerRadius) 
     229    return icon 
     230 
    150231 
    151232  def findUsableIcon(self, name, themePathList): 
     
    222303 
    223304    # is it in the cant load list ? 
    224     elif name in self.cantLoad: 
    225       """the cant load list stores names of icons which errored out during 
    226          loading from file -> like this we wont load corrupted or 
    227          nonexisting icons over and over again""" 
    228       return 
    229  
    230     # is it an icon that gets rendered at runtime ? 
    231     elif name.split(':')[0] == 'generic': 
    232       icon = None 
    233       if len(name.split(':',1)) == 1: 
    234         # just the default cairo drawn icon 
    235         icon = self.roundedRectangle(w, h, self.buttonFillColor, self.buttonOutlineColor) 
    236       else: 
    237         # the icon name contains custom positional parameters 
    238         semicolonSepList = name.split(':',1)[1].split(';') 
    239         """ 
    240         there are five positional parameters: 
    241         fill collor,fill opacity, outline color, outline opacity,  
    242         outline width (default 8) and corner radius (default 22) 
    243         to use default value, just dont fill in the positional parameter 
    244         ( len(parameter) == 0 
    245         """ 
    246         if len(semicolonSepList) == 6: 
    247           # process the positional parameters 
    248  
    249           if len(semicolonSepList[0]): 
    250             fillColorString = semicolonSepList[0] 
     305#    elif name in self.cantLoad: 
     306#      """the cant load list stores names of icons which errored out during 
     307#         loading from file -> like this we wont load corrupted or 
     308#         nonexisting icons over and over again""" 
     309#      return 
     310 
     311    else: 
     312      # run through possible "layers", which are separated by > 
     313      compositedIcon = None 
     314      needBackground = False 
     315      """icon secifications are separated by >, 
     316      which should be seen as a pointing arrow in this context 
     317      we composite from top -> down, 
     318      for example: "icon1>icon2" 
     319      icon1 will be drawn over icon2 
     320      """ 
     321      for currentName in reversed(name.split('>')): # we draw top down 
     322        if currentName.split(':')[0] == 'generic': 
     323          if len(currentName.split(':',1)) == 1: 
     324            # just the default cairo drawn icon 
     325            needBackground = False 
     326            genericIcon = self.roundedRectangle(w, h, self.buttonFillColor, self.buttonOutlineColor) 
     327            compositedIcon = self.combineTwoIcons(compositedIcon, genericIcon) 
    251328          else: 
    252             fillColorString = None 
    253  
    254           if len(semicolonSepList[1]): 
    255             fillAlpha = float(semicolonSepList[1]) 
     329            # the icon name contains custom positional parameters 
     330            semicolonSepList = currentName.split(':',1)[1].split(';') 
     331            """ 
     332            there are five positional parameters: 
     333            fill collor,fill opacity, outline color, outline opacity, 
     334            outline width (default 8) and corner radius (default 22) 
     335            to use default value, just dont fill in the positional parameter 
     336            ( len(parameter) == 0 
     337            """ 
     338            needBackground = False 
     339            parametricIcon = self.getCustomIcon(semicolonSepList,w,h) 
     340            compositedIcon = self.combineTwoIcons(compositedIcon, parametricIcon) 
     341        else: # not a generic or parametric icon, try to load from file 
     342          loadingResult = self.loadFromFile(currentName, w, h) 
     343          if (loadingResult == False): 
     344            self.cantLoad.append(currentName) 
    256345          else: 
    257             fillAlpha = 1.0 
    258  
    259           if len(semicolonSepList[2]): 
    260             outlineColorString = semicolonSepList[0] 
    261           else: 
    262             outlineColorString = None 
    263  
    264           if len(semicolonSepList[3]): 
    265             outlineAlpha = float(semicolonSepList[3]) 
    266           else: 
    267             outlineAlpha = 1.0 
    268  
    269           if len(semicolonSepList[4]): 
    270             outlineWidth = int(semicolonSepList[4]) 
    271           else: 
    272             outlineWidth = 8 
    273  
    274           if len(semicolonSepList[5]): 
    275             cornerRadius = int(semicolonSepList[5]) 
    276           else: 
    277             cornerRadius = 22 
    278  
    279           # parse the colors (if defined) 
    280  
    281           if fillColorString: 
    282             fillColor = self.color("fill", fillColorString) 
    283             fillColorRGBATupple = fillColor.getCairoColor() 
    284           else: 
    285             fillColorRGBATupple = self.buttonFillColor 
    286  
    287           if outlineColorString: 
    288             outlineColor = self.color("outline", outlineColorString) 
    289             outlineColorRGBATupple = outlineColor.getCairoColor() 
    290           else: 
    291             outlineColorRGBATupple = self.buttonOutlineColor 
    292  
    293           # apply the alfa values 
    294  
    295           (r,g,b,a) = fillColorRGBATupple 
    296           fillColorRGBATupple = (r,g,b,fillAlpha) 
    297  
    298           (r,g,b,a) = outlineColorRGBATupple 
    299           outlineColorRGBATupple = (r,g,b,outlineAlpha) 
    300  
    301           # create the icon 
    302           icon = self.roundedRectangle(w, h, fillColorRGBATupple, outlineColorRGBATupple, outlineWidth=outlineWidth, radius=cornerRadius) 
    303            
    304       if icon: 
    305         cachedIcon = self.storeInCache(cacheName, icon, w, h) 
    306         self.drawIcon(cr, cachedIcon, x, y, w, h) 
    307       return 
    308  
    309     # try to load it from file 
    310     else: 
    311       # false means that loading the icon from file failed 
    312       # this can be caused by missing or corrupted image file 
    313       loadingResult = self.loadFromFile(name, w, h) 
    314       if (loadingResult == False): 
    315         self.cantLoad.append(name) 
    316       else: 
    317         cachedIcon = self.storeInCache(cacheName, loadingResult, w, h) 
     346            (loadingResult,needBackground) = loadingResult 
     347            compositedIcon = self.combineTwoIcons(compositedIcon, loadingResult) 
     348 
     349      # cache and draw the finished icon 
     350      if compositedIcon: 
     351        if needBackground: 
     352          # add a generic icon as a background 
     353          genericIcon = self.roundedRectangle(w, h, self.buttonFillColor, self.buttonOutlineColor) 
     354          compositedIcon = self.combineTwoIcons(genericIcon, compositedIcon) 
     355        cachedIcon = self.storeInCache(cacheName, compositedIcon, w, h) 
    318356        self.drawIcon(cr, cachedIcon, x, y, w, h) 
    319357         
     
    325363    cr.paint() 
    326364    cr.restore() 
     365 
     366  def combineTwoIcons(self, backIcon,overIcon): 
     367    """ composite two same-size icons """ 
     368    if backIcon and overIcon: 
     369      ct = cairo.Context(backIcon) 
     370      ct2 = gtk.gdk.CairoContext(ct) 
     371      ct2.set_source_surface(overIcon,0,0) 
     372      ct2.paint() 
     373      return backIcon 
     374    elif not backIcon and not overIcon: 
     375      return None 
     376    elif backIcon: 
     377      return backIcon 
     378    else: 
     379      return overIcon 
    327380 
    328381  def storeInCache(self, name, image, w, h): 
     
    357410    x = 0 
    358411    y = 0 
    359     image = cairo.ImageSurface(0,width,height) 
     412    image = cairo.ImageSurface(0,int(width),int(height)) 
    360413    cr = cairo.Context(image) 
    361414    pi = 3.1415926535897931 
     
    510563        self.valid = True 
    511564      except Exception, e: 
    512         print "wrong color string: %s" % colorString 
    513         print e 
     565        print "** color string parsing failed **" 
     566        print "** input that coused this: %s" % colorStringAlphaTupple 
     567        print "** exception: %s" % e 
    514568 
    515569 
     
    521575 
    522576    def getAlpha(self): 
    523       return alpha 
     577      return self.alpha 
    524578 
    525579    def getGtkColor(self): 
     
    531585    def getColorStringAlphaTupple(self): 
    532586      return self.colorStringAlphaTupple 
     587 
     588    def getColorString(self): 
     589      return self.gtkColor.to_string() 
  • modules/mod_mapView.py

    r3b8350c rd476ee6  
    8787          self.set('centreOnce', False) 
    8888        self.lastPos = pos 
    89  
    90  
    9189         
    92  
    9390#    request = self.get("centreOn", None) 
    9491#    if(request): 
     
    133130        (lat, lon) = proj.xy2ll(x, y) 
    134131 
    135  
    136       print (sx,sy,sw,sh) 
    137132      proj.recentre(lat,lon,z) 
    138133      self.set("needRedraw", True) 
  • modules/mod_menu.py

    re423f6e rd476ee6  
    5050    self.mainTextColor = (0,0,0.3,1) 
    5151    self.centerButtonCircleColor = (0,0,1,0.45) 
     52    self.spButtonFillTup = ("#ffec8b",1.0) 
     53    self.spButtonOutlineTup = ("#8b814c",1.0) 
     54 
    5255 
    5356  def update(self): 
     
    376379    itemSlots = cols*rows 
    377380    itemCount = menu['metadata']['itemCount'] 
    378     if itemCount > itemSlots: 
     381    if itemCount > itemSlots: # does this menu have more items than available slots 
     382      # get current page 
    379383      pageNumber = menu['metadata']['currentPage'] 
     384      # get colors for the more and less buttons 
     385      (spbFillColor,spbFillAlpha) = self.spButtonFillTup 
     386      (spbOutlineColor,spbOutlineAlpha) = self.spButtonOutlineTup 
     387      bgIconDescription = "generic:%s;%f;%s;%f;;" % (spbFillColor, spbFillAlpha, spbOutlineColor, spbOutlineAlpha) 
    380388      if pageNumber == 0: 
    381389        # just draw the "more" button 
    382390        (x,y) = self.itemMenuGrid[1][-1] 
    383         self.drawButton(cr, x, y, dx, dy, "more", "more", "ml:menu:setIMPage:%s;%d|set:needRedraw:True" % (menuName, pageNumber+1)) 
     391        self.drawButton(cr, x, y, dx, dy, "more", "more>%s" % bgIconDescription, "ml:menu:setIMPage:%s;%d|set:needRedraw:True" % (menuName, pageNumber+1)) 
    384392        itemGrid = self.itemMenuGrid[1][0:-1] 
    385393      else: 
     
    389397          # draw only the "less" button 
    390398          (x,y) = self.itemMenuGrid[1][0] 
    391           self.drawButton(cr, x, y, dx, dy, "less", "less", "ml:menu:setIMPage:%s;%d|set:needRedraw:True" % (menuName, pageNumber-1)) 
     399          self.drawButton(cr, x, y, dx, dy, "less", "less>%s" % bgIconDescription, "ml:menu:setIMPage:%s;%d|set:needRedraw:True" % (menuName, pageNumber-1)) 
    392400          itemGrid = self.itemMenuGrid[1][1:(itemCount-id-1)] 
    393401        else: 
     
    395403          # draw the "less" and "more" buttons 
    396404          (x,y) = self.itemMenuGrid[1][0] 
    397           self.drawButton(cr, x, y, dx, dy, "less", "less", "ml:menu:setIMPage:%s;%d|set:needRedraw:True" % (menuName, pageNumber-1)) 
     405          self.drawButton(cr, x, y, dx, dy, "less", "less>%s" % bgIconDescription, "ml:menu:setIMPage:%s;%d|set:needRedraw:True" % (menuName, pageNumber-1)) 
    398406          (x,y) = self.itemMenuGrid[1][-1] 
    399           self.drawButton(cr, x, y, dx, dy, "more", "more", "ml:menu:setIMPage:%s;%d|set:needRedraw:True" % (menuName, pageNumber+1)) 
     407          self.drawButton(cr, x, y, dx, dy, "more", "more>%s" % bgIconDescription, "ml:menu:setIMPage:%s;%d|set:needRedraw:True" % (menuName, pageNumber+1)) 
    400408          itemGrid = self.itemMenuGrid[1][1:-1] 
    401409          # the first page only has one slot less, du to having only the "more" button 
    402  
    403410    else: 
    404411      # there are less items than slots 
     
    10821089    self.mainTextColor = colors['main_text'].getCairoColor() 
    10831090    self.centerButtonCircleColor = colors['center_button_circle'].getCairoColor() 
     1091    sbFill = colors['special_button__fill'] 
     1092    self.spButtonFillTup = (sbFill.getColorString(),sbFill.getAlpha()) 
     1093    sbOutline = colors['special_button__outline'] 
     1094    self.spButtonOutlineTup = (sbOutline.getColorString(),sbOutline.getAlpha()) 
    10841095 
    10851096  def firstTime(self): 
  • themes/default/theme.conf

    r2420996 rd476ee6  
    1313## color names as specified in the X11 rgb.txt can be also used 
    1414## the float value after the color string is the alpha/tranpsarency value of the color 
     15## 
     16## Description: 
     17## main - used for default buttons 
     18## special_button - used for special buttons, like up and down arrows, escape, etc. 
    1519 
    1620[colors] 
     
    1822main_outline="#3c60fa",1.0 
    1923main_text="#00004d",1.0 
     24special_button__fill="#ffec8b",1.0 
     25special_button__outline="#8b814c",1.0 
    2026widget_background="#0000ff",0.45 
    2127widget_text="#ffffff",0.95 
Note: See TracChangeset for help on using the changeset viewer.