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 get_all(self):
62 """ 63 Get all stored skins 64 65 @return: [Skin()] 66 """ 67 68 return self._skins.values()
69 70 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 71
72 - def clear(self):
73 """ 74 Clear storage 75 """ 76 77 self._skins = {}
78 79 #++++++++++++++++++++++++++++++++++++++++++++++++ 80
81 -class Skin(object):
82 """ 83 Skin object. Provides simple interface to defined skin rulesets. 84 """ 85
86 - def __init__(self, name=None, author=None, version=None, 87 description=None, colors=None, rules=None):
88 89 self.name = name 90 self.author = author 91 self.version = version 92 self.description = description 93 self.rules = self._make_rules(rules) 94 self.colors = colors 95 self.screen = None 96 97 # Default fallback palette 98 self._default = Palette("default", 99 Foreground("DEFAULT"), 100 Background("DEFAULT"))
101 102 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 103
104 - def __str__(self):
105 return u"<Skin object: %s>" % ustring(self.name)
106 107 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 108
109 - def __repr__(self):
110 return self.__str__()
111 112 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 113
114 - def __cmp__(self, other):
115 return cmp(self.name, other.name)
116 117 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 118
119 - def __getitem__(self, key):
120 return self.rules[key]
121 122 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 123
124 - def set_screen(self, screen):
125 self.screen = screen
126 127 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 128
129 - def _make_rules(self, raw_rules):
130 """ 131 Internalize rules 132 """ 133 134 rules = {} 135 136 for block, rsets in raw_rules.iteritems(): 137 if block not in rules: 138 rules[block] = ODict() 139 140 for (resource, palette) in rsets: 141 if isinstance(resource, FSRule): 142 var = resource.raw_rule 143 else: 144 var = resource 145 146 palette.name = self._make_name(block, var) 147 148 rules[block][resource] = palette 149 150 return rules
151 152 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 153
154 - def _make_name(self, block, resource):
155 return "%s@%s" % (resource, block)
156 157 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 158
160 """ 161 Return list of defined palettes. 162 It is usually passed to register_palette() function 163 """ 164 165 _list = [self._default.get_palette(display)] 166 167 for _name, _block in self.rules.iteritems(): 168 for _var, _val in _block.iteritems(): 169 if isinstance(_val, Palette): 170 _list.append(_val.get_palette(display)) 171 172 return _list
173 174 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 175
176 - def attr(self, resolution, name, default=True):
177 """ 178 Search for first matching attribute <name> according to resolution 179 @param resolution: Sequence of ruleset names 180 @param name: Attribute name 181 @param default: If True, return default palette in case attr 182 is not found, otherwise return None 183 @return: Registered palette name 184 """ 185 186 return self.palette(resolution, name, default).name
187 188 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 189
190 - def palette(self, resolution, name, default=True):
191 """ 192 Search for first matching palette <name> according to resolution 193 """ 194 195 for _w in resolution: 196 # Normalize name 197 if not _w.startswith(u"ui."): 198 _w = u"ui.%s" % _w 199 200 try: 201 return self.rules[_w][name] 202 except KeyError: 203 pass 204 205 if default: 206 return self._default 207 else: 208 return None
209 210 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 211
212 - def get_palette(self, block, name):
213 try: 214 return self.rules[block][name].name 215 except KeyError: 216 return None
217