Package libxyz :: Package core :: Module skin
[hide private]
[frames] | no frames]

Source Code for Module libxyz.core.skin

  1  #-*- coding: utf8 -* 
  2  # 
  3  # Max E. Kuznecov ~syhpoon <syhpoon@syhpoon.name> 2008 
  4  # 
  5  # This file is part of XYZCommander. 
  6  # XYZCommander is free software: you can redistribute it and/or modify 
  7  # it under the terms of the GNU Lesser Public License as published by 
  8  # the Free Software Foundation, either version 3 of the License, or 
  9  # (at your option) any later version. 
 10  # XYZCommander is distributed in the hope that it will be useful, 
 11  # but WITHOUT ANY WARRANTY; without even the implied warranty of 
 12  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
 13  # GNU Lesser Public License for more details. 
 14  # You should have received a copy of the GNU Lesser Public License 
 15  # along with XYZCommander. If not, see <http://www.gnu.org/licenses/>. 
 16   
 17  from libxyz.exceptions import SkinError 
 18  from fsrule import FSRule 
 19  from odict import ODict 
 20  from utils import ustring 
 21   
 22  from libxyz import const 
 23   
 24  from libxyz.ui.colors import Palette, Foreground, Background 
 25   
26 -class SkinManager(object):
27 """ 28 Store and manage defined skins 29 """ 30
31 - def __init__(self):
32 self._skins = {}
33 34 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 35
36 - def add(self, skin):
37 """ 38 Add new sking to storage 39 """ 40 41 if not isinstance(skin, Skin): 42 raise SkinError(_(u"Invalid skin argument: %s. "\ 43 u"libxyz.core.Skin instance expected!" 44 % type(skin))) 45 else: 46 self._skins[skin.name] = skin
47 48 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 49
50 - def get(self, name):
51 """ 52 Get stored skin instance 53 54 @return: Either Skin isntance or None if was not stored 55 """ 56 57 return self._skins.get(name, None)
58 59 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 60
61 - def clear(self):
62 """ 63 Clear storage 64 """ 65 66 self._skins = {}
67 68 #++++++++++++++++++++++++++++++++++++++++++++++++ 69
70 -class Skin(object):
71 """ 72 Skin object. Provides simple interface to defined skin rulesets. 73 """ 74
75 - def __init__(self, name=None, author=None, version=None, 76 description=None, colors=None, rules=None):
77 78 self.name = name 79 self.author = author 80 self.version = version 81 self.description = description 82 self.rules = self._make_rules(rules) 83 self.colors = colors 84 self.screen = None 85 86 # Default fallback palette 87 self._default = Palette("default", 88 Foreground("DEFAULT"), 89 Background("DEFAULT"))
90 91 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 92
93 - def __str__(self):
94 return u"<Skin object: %s>" % ustring(self.name)
95 96 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 97
98 - def __repr__(self):
99 return self.__str__()
100 101 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 102
103 - def __getitem__(self, key):
104 return self.rules[key]
105 106 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 107
108 - def set_screen(self, screen):
109 self.screen = screen
110 111 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 112
113 - def _make_rules(self, raw_rules):
114 """ 115 Internalize rules 116 """ 117 118 rules = {} 119 120 for block, rsets in raw_rules.iteritems(): 121 if block not in rules: 122 rules[block] = ODict() 123 124 for (resource, palette) in rsets: 125 if isinstance(resource, FSRule): 126 var = resource.raw_rule 127 else: 128 var = resource 129 130 palette.name = self._make_name(block, var) 131 132 rules[block][resource] = palette 133 134 return rules
135 136 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 137
138 - def _make_name(self, block, resource):
139 return "%s@%s" % (resource, block)
140 141 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 142
144 """ 145 Return list of defined palettes. 146 It is usually passed to register_palette() function 147 """ 148 149 _list = [self._default.get_palette(display)] 150 151 for _name, _block in self.rules.iteritems(): 152 for _var, _val in _block.iteritems(): 153 if isinstance(_val, Palette): 154 _list.append(_val.get_palette(display)) 155 156 return _list
157 158 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 159
160 - def attr(self, resolution, name, default=True):
161 """ 162 Search for first matching attribute <name> according to resolution 163 @param resolution: Sequence of ruleset names 164 @param name: Attribute name 165 @param default: If True, return default palette in case attr 166 is not found, otherwise return None 167 @return: Registered palette name 168 """ 169 170 return self.palette(resolution, name, default).name
171 172 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 173
174 - def palette(self, resolution, name, default=True):
175 """ 176 Search for first matching palette <name> according to resolution 177 """ 178 179 for _w in resolution: 180 # Normalize name 181 if not _w.startswith(u"ui."): 182 _w = u"ui.%s" % _w 183 184 try: 185 return self.rules[_w][name] 186 except KeyError: 187 pass 188 189 if default: 190 return self._default 191 else: 192 return None
193 194 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 195
196 - def get_palette(self, block, name):
197 try: 198 return self.rules[block][name].name 199 except KeyError: 200 return None
201