#
# Albow - Themes
#
import resource
debug_theme = False
[docs]class ThemeProperty(object):
def __init__(self, name):
self.name = name
self.cache_name = intern("_" + name)
def __get__(self, obj, owner):
if debug_theme:
print "%s(%r).__get__(%r)" % (self.__class__.__name__, self.name, obj)
try: ###
cache_name = self.cache_name
try:
return getattr(obj, cache_name)
except AttributeError, e:
if debug_theme:
print e
value = self.get_from_theme(obj.__class__, self.name)
obj.__dict__[cache_name] = value
return value
except: ###
if debug_theme:
import traceback
traceback.print_exc()
print "-------------------------------------------------------"
raise ###
def __set__(self, obj, value):
if debug_theme:
print "Setting %r.%s = %r" % (obj, self.cache_name, value) ###
obj.__dict__[self.cache_name] = value
[docs] def get_from_theme(self, cls, name):
return root.get(cls, name)
[docs]class FontProperty(ThemeProperty):
[docs] def get_from_theme(self, cls, name):
return root.get_font(cls, name)
[docs]class ThemeError(Exception):
pass
[docs]class Theme(object):
# name string Name of theme, for debugging
# base Theme or None Theme on which this theme is based
def __init__(self, name, base=None):
self.name = name
self.base = base
[docs] def get(self, cls, name):
try:
return self.lookup(cls, name)
except ThemeError:
raise AttributeError("No value found in theme %s for '%s' of %s.%s" %
(self.name, name, cls.__module__, cls.__name__))
[docs] def lookup(self, cls, name):
if debug_theme:
print "Theme(%r).lookup(%r, %r)" % (self.name, cls, name)
for base_class in cls.__mro__:
class_theme = getattr(self, base_class.__name__, None)
if class_theme:
try:
return class_theme.lookup(cls, name)
except ThemeError:
pass
else:
try:
return getattr(self, name)
except AttributeError:
base_theme = self.base
if base_theme:
return base_theme.lookup(cls, name)
else:
raise ThemeError
[docs] def get_font(self, cls, name):
if debug_theme:
print "Theme.get_font(%r, %r)" % (cls, name)
spec = self.get(cls, name)
if spec:
if debug_theme:
print "font spec =", spec
return resource.get_font(*spec)
root = Theme('root')
root.margin = 3
root.font = (15, "DejaVuSans-Regular.ttf")
root.fg_color = (255, 255, 255)
root.bg_color = None
root.bg_image = None
root.scale_bg = False
root.border_width = 0
root.border_color = (0, 0, 0)
root.tab_bg_color = None
root.sel_color = (112, 112, 112)
root.highlight_color = None
root.hover_color = None
root.disabled_color = None
root.highlight_bg_color = None
root.hover_bg_color = None
root.enabled_bg_color = None
root.disabled_bg_color = None
root.RootWidget = Theme('RootWidget')
root.RootWidget.bg_color = (0, 0, 0)
root.Button = Theme('Button')
root.Button.font = (17, "DejaVuSans-Bold.ttf")
root.Button.fg_color = (255, 255, 0)
root.Button.highlight_color = (16, 255, 16)
root.Button.disabled_color = (64, 64, 64)
root.Button.hover_color = (255, 255, 225)
root.Button.default_choice_color = (144, 133, 255)
root.Button.default_choice_bg_color = None
root.Button.highlight_bg_color = None
root.Button.enabled_bg_color = (48, 48, 48)
root.Button.disabled_bg_color = None
root.Button.margin = 7
root.Button.border_width = 1
root.Button.border_color = (64, 64, 64)
root.ValueButton = Theme('ValueButton', base=root.Button)
root.Label = Theme('Label')
root.Label.margin = 4
#-#
root.Label.disabled_color = (64, 64, 64)
#-#
root.SmallLabel = Theme('SmallLabel')
root.SmallLabel.font = (10, 'DejaVuSans-Regular.ttf')
root.ValueDisplay = Theme('ValueDisplay')
root.ValueDisplay.margin = 4
root.SmallValueDisplay = Theme('SmallValueDisplay')
root.SmallValueDisplay.font = (10, 'DejaVuSans-Regular.ttf')
root.ValueDisplay.margin = 2
root.ImageButton = Theme('ImageButton')
root.ImageButton.highlight_color = (0, 128, 255)
framed = Theme('framed')
framed.border_width = 1
framed.margin = 3
root.Field = Theme('Field', base=framed)
root.Field.border_color = (128, 128, 128)
root.CheckWidget = Theme('CheckWidget')
root.CheckWidget.smooth = False
root.CheckWidget.border_color = root.Field.border_color
root.Dialog = Theme('Dialog')
root.Dialog.bg_color = (40, 40, 40)
root.Dialog.border_width = 1
root.Dialog.margin = 15
root.DirPathView = Theme('DirPathView', base=framed)
root.FileListView = Theme('FileListView', base=framed)
root.FileListView.scroll_button_color = (255, 255, 0)
root.FileDialog = Theme("FileDialog")
root.FileDialog.up_button_text = "<-"
root.PaletteView = Theme('PaletteView')
root.PaletteView.sel_width = 2
root.PaletteView.scroll_button_size = 16
root.PaletteView.scroll_button_color = (0, 128, 255)
root.PaletteView.highlight_style = 'frame'
root.PaletteView.zebra_color = (48, 48, 48)
root.TextScreen = Theme('TextScreen')
root.TextScreen.heading_font = (24, "DejaVuSans-Bold.ttf")
root.TextScreen.button_font = (18, "DejaVuSans-Bold.ttf")
root.TextScreen.margin = 20
root.TabPanel = Theme('TabPanel')
root.TabPanel.tab_font = (18, "DejaVuSans-Regular.ttf")
root.TabPanel.tab_height = 24
root.TabPanel.tab_border_width = 0
root.TabPanel.tab_spacing = 4
root.TabPanel.tab_margin = 0
root.TabPanel.tab_fg_color = root.fg_color
root.TabPanel.default_tab_bg_color = (128, 128, 128)
root.TabPanel.tab_area_bg_color = None
root.TabPanel.tab_dimming = 0.75
#root.TabPanel.use_page_bg_color_for_tabs = True
menu = Theme('menu')
menu.bg_color = (64, 64, 64)
menu.fg_color = (255, 255, 255)
menu.disabled_color = (0, 0, 0)
menu.margin = 8
menu.border_color = (192, 192, 192)
menu.scroll_button_size = 16
menu.scroll_button_color = (255, 255, 0)
root.MenuBar = Theme('MenuBar', base=menu)
root.MenuBar.border_width = 0
root.Menu = Theme('Menu', base=menu)
root.Menu.border_width = 1
root.MusicVolumeControl = Theme('MusicVolumeControl', base=framed)
root.MusicVolumeControl.fg_color = (0x40, 0x40, 0x40)
root.Tree = Theme('Tree')
root.Tree.bullet_size = 16
root.Tree.bullet_color_active = (0, 128, 255)
root.Tree.bullet_color_inactive = (128, 128, 128)