[Skencil-commits] r742 - skencil/branches/skencil-0.6/src/Sketch/Base

scm-commit@wald.intevation.org scm-commit at wald.intevation.org
Fri Oct 8 16:10:41 CEST 2010


Author: igor_n
Date: 2010-10-08 16:10:41 +0200 (Fri, 08 Oct 2010)
New Revision: 742

Added:
   skencil/branches/skencil-0.6/src/Sketch/Base/gtkutils.py
Log:
utils for import colors and fonts values from Gtk engine

Added: skencil/branches/skencil-0.6/src/Sketch/Base/gtkutils.py
===================================================================
--- skencil/branches/skencil-0.6/src/Sketch/Base/gtkutils.py	2010-09-27 23:56:43 UTC (rev 741)
+++ skencil/branches/skencil-0.6/src/Sketch/Base/gtkutils.py	2010-10-08 14:10:41 UTC (rev 742)
@@ -0,0 +1,304 @@
+# -*- coding: utf-8 -*-
+
+# Routines for UI fonts & colors management
+
+# Copyright (c) 2010 by Igor E.Novikov
+#
+#This library is free software; you can redistribute it and/or
+#modify it under the terms of the GNU Library General Public
+#License as published by the Free Software Foundation; either
+#version 2 of the License, or (at your option) any later version.
+#
+#This library is distributed in the hope that it will be useful,
+#but WITHOUT ANY WARRANTY; without even the implied warranty of
+#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+#Library General Public License for more details.
+#
+#You should have received a copy of the GNU Library General Public
+#License along with this library; if not, write to the Free Software
+#Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+import os, string, copy
+from tempfile import NamedTemporaryFile
+
+
+##################################################
+# Font routines
+##################################################
+
+def get_gtk_fonts():
+    """
+    Returns list of four fonts, used in UI:
+    [small_font,normal_font,large_font,fixed_font]
+    Each font is a list like:
+    [font_family,font_style,font_size]
+    where:
+    font_family - string representation of font family
+    font_style - list of font styles like 'bold' and 'italic'
+    font_size - font size integer value
+    """
+    
+    tmpfile=NamedTemporaryFile()
+    command = "import gtk;w = gtk.Window();w.realize();style=w.get_style(); print style.font_desc.to_string();"
+    os.system('python -c "%s" >%s 2>/dev/null'%(command, tmpfile.name))
+    
+    font=tmpfile.readline().strip()
+    
+    normal_font=process_gtk_font_string(font)
+    small_font=copy.deepcopy(normal_font)
+    small_font[2]-=1
+    
+    large_font=copy.deepcopy(normal_font)
+    large_font[2]+=2
+    if not 'bold' in large_font[1]:
+        large_font[1].append('bold')
+        
+    fixed_font=copy.deepcopy(normal_font)
+    fixed_font[0]='monospace'
+    
+    return [small_font,normal_font,large_font,fixed_font]
+    
+    
+def process_gtk_font_string(font):
+    """
+    Converts Gtk font string to font description list
+    So Gtk string like: San Serif Bold Italic 10
+    will be: ['San\ Serif', ['bold','italic'], 10]
+    Such form is much better for constructing of 
+    Tk font description.
+    """
+    
+    font_style=[]
+    vals=font.split()
+    font_size=int(vals[-1])
+    vals.remove(vals[-1])
+    if 'Bold' in vals:
+        vals.remove('Bold')
+        font_style.append('bold')
+    if 'Italic' in vals:
+        vals.remove('Italic')
+        font_style.append('italic')
+    font_family=string.join(vals,'\ ')
+    return [font_family,font_style,font_size]
+
+def tkfont_from_list(font_list):
+    """
+    Constructs tk font string from font list.
+    """
+    return '%s %d '%(font_list[0],font_list[2]) + string.join(font_list[1])
+
+def set_ui_fonts(widget, font_list):
+    """
+    Applies font list to tk defaults.
+    """
+    widget.tk.call('option', 'add', '*font', tkfont_from_list(font_list[1]) )
+
+
+##################################################
+# Colors routines
+##################################################
+
+SYSTEM_SCHEME='System'
+BUILTIN_SCHEME='Built-in'
+
+            
+def gtk_to_tk_color(color):
+    """
+    Converts gtk color representation to tk.
+    For example: #0000ffff0000 will be converted to #00ff00
+    """
+    return color[0]+color[1]+color[2]+color[5]+color[6]+color[9]+color[10]
+
+def tkcolor_to_rgb(tkcolor):
+    """
+    Converts tk color string as tuple of integer values.
+    For example: #ff00ff => (255,0,255)
+    """
+    return (int(tkcolor[1:3], 0x10),int(tkcolor[3:5], 0x10),int(tkcolor[5:], 0x10))
+
+def saturated_color(color):
+    """
+    Returns saturated color value. 
+    """
+    r,g,b=tkcolor_to_rgb(color)
+    delta=255-max(r,g,b)
+    return '#%02X%02X%02X'%(r+delta,g+delta,b+delta)
+                
+def middle_color(dark, light, factor=0.5):
+    """
+    Calcs middle color value.
+    
+    dark, light - tk color strings
+    factor - resulted color shift 
+    """
+    dark=tkcolor_to_rgb(dark)
+    light=tkcolor_to_rgb(light)
+    r=dark[0]+(light[0]-dark[0])*factor
+    g=dark[1]+(light[1]-dark[1])*factor
+    b=dark[2]+(light[2]-dark[2])*factor
+    return '#%02X%02X%02X'%(r,g,b)
+
+def lighter_color(color, factor):
+    """
+    Calcs lighted color value according factor.
+    
+    color - tk color strings
+    factor - resulted color shift   
+    """
+    return middle_color(color, saturated_color(color), factor)
+    
+
+
+class ColorScheme:
+    """
+    The class represents UI color scheme.
+    Colors can be imported from system (SYSTEM_SCHEME)
+    or built-in values (BUILTIN_SCHEME).
+    """
+    
+    bg ='#d4d0c8'
+    foreground ='#000000'
+    highlightbackground ='#f3f2ef'
+    highlightcolor ='#b0ada5'
+    disabledforeground ='#b0ada6'
+    selectbackground ='#002468'
+    selectforeground ='#ffffff'
+    
+    menubackground='#dedad2'
+    menuforeground='#000000'
+    menuselectbackground='#002468'
+    menuselectforeground='#ffffff'
+    menudisabledforeground='#b0ada6'
+    menubordercolor='#7e7b77'
+    
+    editfieldbackground='#ffffff'
+    editfieldforeground='#000000'
+    treelinescolor='#000000'
+    
+    evencolor='#f0f0f0'
+    
+    name=BUILTIN_SCHEME
+    
+    def __init__(self, scheme=SYSTEM_SCHEME):
+        self.name=scheme
+        if scheme==BUILTIN_SCHEME:
+            return  
+        else:
+            self.name=SYSTEM_SCHEME
+            self.import_gtk_colors()
+            
+    def import_gtk_colors(self):
+        """
+        Imports system gtk color scheme using pygtk binding. 
+        """
+        colors={}
+        tmpfile=NamedTemporaryFile()
+        command="import gtk;w = gtk.Window();w.realize();style=w.get_style();"
+        command+="print style.base[gtk.STATE_NORMAL].to_string(),"+ \
+            " style.base[gtk.STATE_ACTIVE].to_string(),"+ \
+            " style.base[gtk.STATE_PRELIGHT].to_string(),"+ \
+            " style.base[gtk.STATE_SELECTED].to_string(),"+ \
+            " style.base[gtk.STATE_INSENSITIVE].to_string();"
+        command+="print style.text[gtk.STATE_NORMAL].to_string(),"+ \
+            " style.text[gtk.STATE_ACTIVE].to_string(),"+ \
+            " style.text[gtk.STATE_PRELIGHT].to_string(),"+ \
+            " style.text[gtk.STATE_SELECTED].to_string(),"+ \
+            " style.text[gtk.STATE_INSENSITIVE].to_string();"
+        command+="print style.fg[gtk.STATE_NORMAL].to_string(),"+ \
+            " style.fg[gtk.STATE_ACTIVE].to_string(),"+ \
+            " style.fg[gtk.STATE_PRELIGHT].to_string(),"+ \
+            " style.fg[gtk.STATE_SELECTED].to_string(),"+ \
+            " style.fg[gtk.STATE_INSENSITIVE].to_string();"
+        command+="print style.bg[gtk.STATE_NORMAL].to_string(),"+ \
+            " style.bg[gtk.STATE_ACTIVE].to_string(),"+ \
+            " style.bg[gtk.STATE_PRELIGHT].to_string(),"+ \
+            " style.bg[gtk.STATE_SELECTED].to_string(),"+ \
+            " style.bg[gtk.STATE_INSENSITIVE].to_string();"
+    
+        os.system('python -c "%s" >%s 2>/dev/null'%(command, tmpfile.name))    
+
+        for type in ["base","text","fg","bg"]:
+            line=tmpfile.readline().strip().split()
+            colors[type+' normal']=gtk_to_tk_color(line[0])
+            colors[type+' active']=gtk_to_tk_color(line[1])
+            colors[type+' prelight']=gtk_to_tk_color(line[2])
+            colors[type+' selected']=gtk_to_tk_color(line[3])
+            colors[type+' insensitive']=gtk_to_tk_color(line[4])
+        tmpfile.close()
+        
+        self.map_gtk_colors(colors)
+    
+    def map_gtk_colors(self,gtk_colors):
+        """
+        Maps gtk colors to ColorScheme fields.
+        """
+        
+        self.bg = gtk_colors['bg normal']
+        self.foreground = gtk_colors['text normal']
+        
+        self.highlightbackground = gtk_colors['bg active']
+        self.highlightcolor = gtk_colors['fg active']
+        self.disabledforeground = gtk_colors['fg insensitive']
+        self.selectbackground = gtk_colors['bg selected']
+        self.selectforeground = gtk_colors['text selected']
+        
+        self.menubackground = lighter_color(self.bg, .25)
+        self.menuforeground = gtk_colors['fg normal']
+        self.menuselectbackground = gtk_colors['bg selected']
+        self.menuselectforeground = gtk_colors['fg selected']
+        self.menudisabledforeground = gtk_colors['text insensitive']
+        self.menubordercolor = gtk_colors['fg insensitive']
+        
+        self.editfieldbackground = gtk_colors['base normal']
+        self.editfieldforeground = gtk_colors['text normal']
+        self.treelinescolor = gtk_colors['text normal']
+        
+        self.evencolor = middle_color(self.bg, self.editfieldbackground, 0.7)
+        
+def set_ui_colors(widget, color_scheme):
+    """
+    Applies ColorScheme object values to tk defaults.
+    """ 
+    widget.tk.call('tk_setPalette', color_scheme.bg)
+                
+    widget.tk.call('option', 'add', '*background', color_scheme.bg, 'interactive')
+    widget.tk.call('option', 'add', '*foreground', color_scheme.foreground, 'interactive')
+    widget.tk.call('option', 'add', '*selectForeground', color_scheme.selectforeground, 'interactive')
+    widget.tk.call('option', 'add', '*selectBackground', color_scheme.selectbackground, 'interactive')
+    widget.tk.call('option', 'add', '*highlightBackground', color_scheme.highlightbackground, 'interactive')
+    widget.tk.call('option', 'add', '*highlightColor', color_scheme.highlightcolor, 'interactive')
+    widget.tk.call('option', 'add', '*activeBackground', color_scheme.bg, 'interactive')
+    widget.tk.call('option', 'add', '*activeForeground', color_scheme.foreground, 'interactive')
+    widget.tk.call('option', 'add', '*Menu.activeBackground', color_scheme.selectbackground, 'interactive')
+    widget.tk.call('option', 'add', '*Menu.activeForeground', color_scheme.selectforeground, 'interactive')
+    
+    widget.tk.call('option', 'add', '*Listbox.background', color_scheme.editfieldbackground, 'interactive')
+    widget.tk.call('option', 'add', '*Listbox.foreground', color_scheme.editfieldforeground, 'interactive')
+    widget.tk.call('option', 'add', '*Entry.background', color_scheme.editfieldbackground, 'interactive')
+    widget.tk.call('option', 'add', '*Entry.foreground', color_scheme.editfieldforeground, 'interactive')
+    
+#    widget.tk.call('option', 'add', '*highlightThickness', '0', 'interactive')
+    
+    widget.tk.call('option', 'add', '*tooltips*background', '#F6F6B9', 'interactive')  
+    widget.tk.call('option', 'add', '*tooltips.background', '#C2C24E', 'interactive')
+    
+    widget.tk.call('option', 'add', '*Menu.background', color_scheme.menubordercolor, 'interactive')
+    widget.tk.call('option', 'add', '*Menu*background', color_scheme.menubackground, 'interactive')
+    widget.tk.call('option', 'add', '*Menu.highlightColor', color_scheme.menubordercolor, 'interactive')
+         
+#*Menu.highlightBackground: blue
+#*tooltips*background:    #F6F6B9
+#*tooltips.background:    black
+
+#module self testing
+if __name__ == '__main__':
+    
+    fonts=get_gtk_fonts()
+    for item in fonts:
+        print tkfont_from_list(item)
+    print tkfont_from_list(['San\ Serif', ['bold','italic'], 10])
+    scheme=ColorScheme()
+    print scheme.bg
+    print scheme.foreground
+    print scheme.selectbackground
+    print scheme.selectforeground
\ No newline at end of file



More information about the Skencil-commits mailing list