def _update(self, *largs): '''(internal) Check if a data is loaded, and pass to the client''' # want to start it ? if self._start_wanted: if not self._running: self.start() self._start_wanted = False while True: try: filename, data = self._q_done.pop() except: return # create the image image = data#ProxyImage(data) Cache.append('pymt.loader', filename, image) # update client for c_filename, client in self._client[:]: if filename != c_filename: continue # got one client to update client.image = image client.loaded = True client.dispatch_event('on_load') self._client.remove((c_filename, client))
def image(self, filename, load_callback=None, post_callback=None): '''Load a image using loader. A Proxy image is returned with a loading image :: img = Loader.image(filename) # img will be a ProxyImage. # You'll use it the same as an Image class. # Later, when the image is really loaded, # the loader will change the img.image property # to the new loaded image ''' data = Cache.get('pymt.loader', filename) if data not in (None, False): # found image return ProxyImage(data, loading_image=self.loading_image, loaded=True) client = ProxyImage(self.loading_image, loading_image=self.loading_image) self._client.append((filename, client)) if data is None: # if data is None, this is really the first time self._q_load.append((filename, load_callback, post_callback)) Cache.append('pymt.loader', filename, False) self._start_wanted = True else: # already queued for loading pass return client
def _update(self, *largs): '''(internal) Check if a data is loaded, and pass to the client''' # want to start it ? if self._start_wanted: if not self._running: self.start() self._start_wanted = False while True: try: filename, data = self._q_done.pop() except IndexError: return # create the image image = data#ProxyImage(data) Cache.append('pymt.loader', filename, image) # update client for c_filename, client in self._client[:]: if filename != c_filename: continue # got one client to update client.image = image client.loaded = True client.dispatch_event('on_load') self._client.remove((c_filename, client))
def __init__(self, filename, **kwargs): self.filename = filename self.svg_data = Cache.get('_pymt_core_svg_cache', filename) if not self.svg_data: new_svg = self.load(filename) Cache.append('_pymt_core_svg_cache', filename, new_svg) self.svg_data = new_svg
def __init__(self, filename, **kwargs): self.filename = filename self.svg_data = Cache.get('pymt.svg', filename) if not self.svg_data: new_svg = self.load(filename) Cache.append('pymt.svg', filename, new_svg) self.svg_data = new_svg
def __init__(self, filename, **kwargs): self.filename = filename self.svg_data = Cache.get("pymt.svg", filename) if not self.svg_data: new_svg = self.load(filename) Cache.append("pymt.svg", filename, new_svg) self.svg_data = new_svg
def create_line_label(self, text): '''Create a label from a text, using line options ''' ntext = text.replace('\n', '').replace('\t', ' ' * self.tab_width) kw = self.get_line_options() cid = '%s\0%s' % (ntext, str(kw)) label = Cache.get('textarea.label', cid) if not label: label = Label(ntext, **kw) Cache.append('textarea.label', cid, label) return label
def getLabel(label, **kwargs): '''Get a cached label object :Parameters: `label`: str Text to be draw `font_size`: int, default to 12 Font size of label `center`: bool, default to True Indicate if pos is center or left-right of label getLabel() support all parameters from the Core label. Check `LabelBase` class to known all availables parameters. Used by drawLabel() ''' kwargs.setdefault('markup', False) kwargs.setdefault('font_size', 12) kwargs.setdefault('center', True) if kwargs.get('center'): kwargs.setdefault('anchor_x', 'center') kwargs.setdefault('anchor_y', 'center') else: kwargs.setdefault('anchor_x', 'left') kwargs.setdefault('anchor_y', 'bottom') del kwargs['center'] # create an uniq id for this label id = '%s##%s' % (label, str(kwargs)) # get or store obj = Cache.get('pymt.label', id) if not obj: if kwargs.get('markup'): obj = pymt.MarkupLabel(label, **kwargs) else: obj = pymt.Label(label, **kwargs) if 'nocache' not in kwargs: Cache.append('pymt.label', id, obj) return obj
def getLabel(label, **kwargs): '''Get a cached label object :Parameters: `label` : str Text to be draw `font_size` : int, default to 12 Font size of label `center` : bool, default to True Indicate if pos is center or left-right of label getLabel() support all parameters from the Core label. Check `LabelBase` class to known all availables parameters. Used by drawLabel() ''' kwargs.setdefault('markup', False) kwargs.setdefault('font_size', 12) kwargs.setdefault('center', True) if kwargs.get('center'): kwargs.setdefault('anchor_x', 'center') kwargs.setdefault('anchor_y', 'center') else: kwargs.setdefault('anchor_x', 'left') kwargs.setdefault('anchor_y', 'bottom') del kwargs['center'] # create an uniq id for this label id = '%s##%s' % (label, str(kwargs)) # get or store obj = Cache.get('pymt.label', id) if not obj: if kwargs.get('markup'): obj = pymt.MarkupLabel(label, **kwargs) else: obj = pymt.Label(label, **kwargs) if 'nocache' not in kwargs: Cache.append('pymt.label', id, obj) return obj
def css_get_style(widget): '''Return a dict() with all the style for the widget. :Parameters: `widget`: class Widget to search CSS ''' global pymt_sheet ref = weakref.ref(widget) if not ref in _css_widgets: _css_widgets.add(ref) idwidget = css_get_widget_id(widget) styles = Cache.get('pymt.css', idwidget) if styles is not None: return styles styles = pymt_sheet.get_style(widget) Cache.append('pymt.css', idwidget, styles) return styles
def drawCSSRectangle(pos=(0,0), size=(100,100), style={}, prefix=None, state=None): '''Draw a rectangle with CSS :Parameters: `state`: if a certain state string is passed, we will use styles with this postifx instead. for example: style[bg-color] and style[bg-color-down] are both set. if state == "down", we wil use bg-color-down instead of bg-color :Styles: * alpha-background (color) * border-radius (float) * border-radius-precision (float) * border-width (float) * draw-alpha-background (bool) * draw-background (bool) * draw-border (bool) ''' bg_image = style.get('bg-image-'+str(state)) if not bg_image: bg_image = style.get('bg-image') # Check if we have a cached version cache_id = '%s:%s:%s:%s:%s' % (pos, size, style, prefix, state) cache = Cache.get('css_rect', cache_id) if cache: cache.draw() if bg_image: bg_image.size = size bg_image.pos = pos bg_image.draw() return # lets use the ones for given state, # and ignore the regular ones if the state ones are there if state: state = "-" + state newstyle = {} overwrites = [] for s in style: if state in s: overwrite = s.replace(state, '') newstyle[overwrite] = style[s] overwrites.append(overwrite) if s not in overwrites: newstyle[s] = style[s] style = newstyle # hack to remove prefix in style if prefix is not None: prefix += '-' newstyle = {} for k in style: newstyle[k] = style[k] for k in style: if prefix in k: newstyle[k.replace(prefix, '')] = style[k] style = newstyle style.setdefault('border-width', 1.5) style.setdefault('border-radius', 0) style.setdefault('border-radius-precision', .1) style.setdefault('draw-border', 0) style.setdefault('draw-background', 1) style.setdefault('draw-alpha-background', 0) style.setdefault('alpha-background', (1, 1, .5, .5)) k = { 'pos': pos, 'size': size } new_cache = GlDisplayList() with new_cache: if state: set_color(*style['bg-color']) #hack becasue old widgets set this themselves linewidth = style.get('border-width') bordercolor = None if 'border-color' in style: bordercolor = style['border-color'] if style['border-radius'] > 0: k.update({ 'radius': style['border-radius'], 'precision': style['border-radius-precision'] }) if style['draw-background']: drawRoundedRectangle(**k) if style['draw-border']: if linewidth: glPushAttrib(GL_LINE_BIT) glLineWidth(linewidth) if bordercolor: with gx_color(*bordercolor): drawRoundedRectangle(style=GL_LINE_LOOP, **k) else: drawRoundedRectangle(style=GL_LINE_LOOP, **k) if linewidth: glPopAttrib() if style['draw-alpha-background']: drawRoundedRectangleAlpha(alpha=style['alpha-background'], **k) else: if style['draw-background']: drawRectangle(**k) if style['draw-border']: if linewidth: glPushAttrib(GL_LINE_BIT) glLineWidth(linewidth) if bordercolor: with gx_color(*bordercolor): drawRectangle(style=GL_LINE_LOOP, **k) else: drawRectangle(style=GL_LINE_LOOP, **k) if linewidth: glPopAttrib() if style['draw-alpha-background']: drawRectangleAlpha(alpha=style['alpha-background'], **k) # if the drawCSSRectangle is already inside a display list # compilation will not happen, but drawing yes. # so, store only if a cache is created ! if new_cache.is_compiled(): Cache.append('css_rect', cache_id, new_cache) new_cache.draw() if bg_image: bg_image.size = size bg_image.pos = pos bg_image.draw()
def drawCSSRectangle(pos=(0,0), size=(100,100), style={}, prefix=None): '''Draw a rectangle with CSS :Styles: * alpha-background (color) * border-radius (float) * border-radius-precision (float) * border-width (float) * draw-alpha-background (bool) * draw-background (bool) * draw-border (bool) ''' # Check if we have a cached version cache_id = '%s:%s:%s:%s' % (pos, size, style, prefix) cache = Cache.get('css_rect', cache_id) if cache: cache.draw() return # hack to remove prefix in style if prefix is not None: prefix += '-' newstyle = {} for k in style: if prefix in k: newstyle[k.replace(prefix, '')] = style[k] style = newstyle style.setdefault('border-width', 1.5) style.setdefault('border-radius', 0) style.setdefault('border-radius-precision', .1) style.setdefault('draw-border', 0) style.setdefault('draw-background', 1) style.setdefault('draw-alpha-background', 0) style.setdefault('alpha-background', (1, 1, .5, .5)) k = { 'pos': pos, 'size': size } new_cache = GlDisplayList() with new_cache: linewidth = None old_linewidth = glGetIntegerv(GL_ALIASED_LINE_WIDTH_RANGE)[1] if style.get('border-width') != old_linewidth: linewidth = style.get('border-width') del style['border-width'] bordercolor = None if 'border-color' in style: bordercolor = style['border-color'] if style['border-radius'] > 0: k.update({ 'radius': style['border-radius'], 'precision': style['border-radius-precision'] }) if style['draw-background']: drawRoundedRectangle(**k) if style['draw-border']: if linewidth: glLineWidth(linewidth) if bordercolor: with gx_color(*bordercolor): drawRoundedRectangle(style=GL_LINE_LOOP, **k) else: drawRoundedRectangle(style=GL_LINE_LOOP, **k) if linewidth: glLineWidth(old_linewidth) if style['draw-alpha-background']: drawRoundedRectangleAlpha(alpha=style['alpha-background'], **k) else: if style['draw-background']: drawRectangle(**k) if style['draw-border']: if linewidth: glLineWidth(linewidth) if bordercolor: with gx_color(*bordercolor): drawRectangle(style=GL_LINE_LOOP, **k) else: drawRectangle(style=GL_LINE_LOOP, **k) if linewidth: glLineWidth(old_linewidth) if style['draw-alpha-background']: drawRectangleAlpha(alpha=style['alpha-background'], **k) # if the drawCSSRectangle is already inside a display list # compilation will not happen, but drawing yes. # so, store only if a cache is created ! if new_cache.is_compiled(): Cache.append('css_rect', cache_id, new_cache) new_cache.draw()
def drawCSSRectangle(pos=(0, 0), size=(100, 100), style=dict(), prefix=None, state=None): '''Draw a rectangle with CSS :Parameters: `state`: if a certain state string is passed, we will use styles with this postifx instead. for example: style[bg-color] and style[bg-color-down] are both set. if state == "down", we wil use bg-color-down instead of bg-color :Styles: * alpha-background (color) * border-radius (float) * border-radius-precision (float) * border-width (float) * draw-alpha-background (bool) * draw-background (bool) * draw-border (bool) ''' bg_image = style.get('bg-image-'+str(state)) if not bg_image: bg_image = style.get('bg-image') # Check if we have a cached version cache_id = '%s:%s:%s:%s:%s' % (pos, size, style, prefix, state) cache = Cache.get('pymt.cssrect', cache_id) if cache: cache.draw() if bg_image: bg_image.size = size bg_image.pos = pos bg_image.draw() return # lets use the ones for given state, # and ignore the regular ones if the state ones are there if state: state = "-" + state newstyle = {} overwrites = [] for s in style: if state in s: overwrite = s.replace(state, '') newstyle[overwrite] = style[s] overwrites.append(overwrite) if s not in overwrites: newstyle[s] = style[s] style = newstyle # hack to remove prefix in style if prefix is not None: prefix += '-' newstyle = {} for k in style: newstyle[k] = style[k] for k in style: if prefix in k: newstyle[k.replace(prefix, '')] = style[k] style = newstyle style.setdefault('border-width', 1.5) style.setdefault('border-radius', 0) style.setdefault('border-radius-precision', .1) style.setdefault('draw-border', 0) style.setdefault('draw-background', 1) style.setdefault('draw-alpha-background', 0) style.setdefault('alpha-background', (1, 1, .5, .5)) k = { 'pos': pos, 'size': size } new_cache = GlDisplayList() with new_cache: if state: set_color(*style['bg-color']) #hack becasue old widgets set this themselves linewidth = style.get('border-width') bordercolor = None if 'border-color' in style: bordercolor = style['border-color'] if style['border-radius'] > 0: k.update({ 'radius': style['border-radius'], 'precision': style['border-radius-precision'] }) if style['draw-background']: drawRoundedRectangle(**k) if style['draw-border']: if linewidth: glPushAttrib(GL_LINE_BIT) glLineWidth(linewidth) if bordercolor: with gx_color(*bordercolor): drawRoundedRectangle(style=GL_LINE_LOOP, **k) else: drawRoundedRectangle(style=GL_LINE_LOOP, **k) if linewidth: glPopAttrib() if style['draw-alpha-background']: drawRoundedRectangleAlpha(alpha=style['alpha-background'], **k) else: if style['draw-background']: drawRectangle(**k) if style['draw-border']: if linewidth: glPushAttrib(GL_LINE_BIT) glLineWidth(linewidth) if bordercolor: with gx_color(*bordercolor): drawRectangle(style=GL_LINE_LOOP, **k) else: drawRectangle(style=GL_LINE_LOOP, **k) if linewidth: glPopAttrib() if style['draw-alpha-background']: drawRectangleAlpha(alpha=style['alpha-background'], **k) # if the drawCSSRectangle is already inside a display list # compilation will not happen, but drawing yes. # so, store only if a cache is created ! if new_cache.is_compiled(): Cache.append('pymt.cssrect', cache_id, new_cache) new_cache.draw() if bg_image: bg_image.size = size bg_image.pos = pos bg_image.draw()