1from gi.repository import GObject, GooCanvas 2import rsvg 3#import cairo 4import os.path 5 6 7## SvgItem class 8class SvgItem(GooCanvas.ItemSimple): 9 ## @var x 10 # x 11 ## @var y 12 # y 13 ## @var sx 14 # x step 15 ## @var sy 16 # y step 17 ## @var handle 18 # handle 19 ## @var width 20 # width 21 ## @var height 22 # height 23 ## @var custom_width 24 # custom width 25 ## @var custom_height 26 # custom height 27 ## @var bounds_x1 28 # minimum x 29 ## @var bounds_y1 30 # minimum y 31 ## @var bounds_x2 32 # maximum x 33 ## @var bounds_y2 34 # maximum y 35 ## @var __gproperties__ 36 # setup our custom properties 37 __gproperties__ = { 38 'x': (float, # property type 39 'X', # property nick name 40 'The x coordinate of a SVG image', # property description 41 -10e6, # property minimum value 42 10e6, # property maximum value 43 0, # property default value 44 GObject.PARAM_READWRITE), # property flags 45 46 'y': (float, 47 'Y', 48 'The y coordinate of a SVG image', 49 -10e6, 50 10e6, 51 0, 52 GObject.PARAM_READWRITE), 53 54 'width': (float, 55 'Width', 56 'The width of the SVG Image', 57 0, 58 10e6, 59 0, 60 GObject.PARAM_READWRITE), 61 62 'height': (float, 63 'Height', 64 'The width of the SVG Image', 65 0, 66 10e6, 67 0, 68 GObject.PARAM_READWRITE), 69 } 70 71 def __init__(self, x, y, rsvg_handle, **kwargs): 72 """ 73 Initializer 74 @param self this object 75 """ 76 super(SvgItem, self).__init__(**kwargs) 77 assert isinstance(rsvg_handle, rsvg.Handle) 78 self.x = x 79 self.y = y 80 self.sx = 1.0 81 self.sy = 1.0 82 self.handle = rsvg_handle 83 self.width = self.handle.props.width 84 self.height = self.handle.props.height 85 self.custom_width = None 86 self.custom_height = None 87 88 def do_set_property(self, pspec, value): 89 """! 90 Set Property 91 @param self this object 92 @param pspec property name 93 @param value property value 94 @return exception if unknown property 95 """ 96 if pspec.name == 'x': 97 self.x = value 98 99 # make sure we update the display 100 self.changed(True) 101 102 elif pspec.name == 'y': 103 self.y = value 104 105 # make sure we update the display 106 self.changed(True) 107 108 elif pspec.name == 'width': 109 self.custom_width = value 110 self._size_changed() 111 112 # make sure we update the display 113 self.changed(True) 114 115 elif pspec.name == 'height': 116 self.custom_height = value 117 self._size_changed() 118 119 # make sure we update the display 120 self.changed(True) 121 122 else: 123 raise AttributeError('unknown property %s' % pspec.name) 124 125 def _size_changed(self): 126 """! 127 Size Changed function 128 @param self this object 129 @return exception if unknown property 130 """ 131 if self.custom_width is None and self.custom_height is None: 132 self.width = self.handle.props.width 133 self.height = self.handle.props.height 134 self.sx = 1.0 135 self.sy = 1.0 136 elif self.custom_width is not None and self.custom_height is None: 137 self.width = self.custom_width 138 self.sx = self.custom_width / self.handle.props.width 139 self.sy = self.sx 140 self.height = self.handle.props.height*self.sy 141 elif self.custom_width is None and self.custom_height is not None: 142 self.height = self.custom_height 143 self.sy = self.custom_height / self.handle.props.height 144 self.sx = self.sy 145 self.width = self.handle.props.width*self.sx 146 else: 147 self.width = self.custom_width 148 self.height = self.custom_height 149 self.sx = self.custom_width / self.handle.props.width 150 self.sy = self.custom_height / self.handle.props.height 151 152 def do_get_property(self, pspec): 153 """! 154 Get Property 155 @param self this object 156 @param pspec property name 157 @return property value or exception if unknown property 158 """ 159 if pspec.name == 'x': 160 return self.x 161 162 elif pspec.name == 'y': 163 return self.y 164 165 elif pspec.name == 'width': 166 self.width = self.handle.props.width 167 self.height = self.handle.props.height 168 169 return self.width 170 171 elif pspec.name == 'height': 172 return self.height 173 174 else: 175 raise AttributeError('unknown property %s' % pspec.name) 176 177 def do_simple_paint(self, cr, bounds): 178 """! 179 Simple Paint function 180 @param self this object 181 @param cr rendered 182 @param bounds bounds 183 @return none 184 """ 185 cr.translate(self.x, self.y) 186 cr.scale(self.sx, self.sy) 187 self.handle.render_cairo(cr) 188 189 def do_simple_update(self, cr): 190 """! 191 Simple Update function 192 @param self this object 193 @param cr rendered 194 @return none 195 """ 196 self.bounds_x1 = float(self.x) 197 self.bounds_y1 = float(self.y) 198 self.bounds_x2 = float(self.x + self.width) 199 self.bounds_y2 = float(self.y + self.height) 200 201 def do_simple_is_item_at(self, x, y, cr, is_pointer_event): 202 """! 203 Simple Is Item At function 204 @param self this object 205 @param x the X position 206 @param y the Y position 207 @param cr rendered 208 @param is_pointer_event is the event a pointer event 209 @return true if at or false if not 210 """ 211 if ((x < self.x) or (x > self.x + self.width)) or ((y < self.y) or (y > self.y + self.height)): 212 return False 213 else: 214 return True 215 216 217_rsvg_cache = dict() 218 219def rsvg_handle_factory(base_file_name): 220 try: 221 return _rsvg_cache[base_file_name] 222 except KeyError: 223 full_path = os.path.join(os.path.dirname(__file__), 'resource', base_file_name) 224 rsvg_handle = rsvg.Handle(full_path) 225 _rsvg_cache[base_file_name] = rsvg_handle 226 return rsvg_handle 227 228