mirror of https://github.com/kivy/kivy.git
core text: fix size / width / height
This commit is contained in:
parent
f80de20050
commit
7a27aab7d7
|
@ -51,7 +51,7 @@ class LabelBase(object):
|
|||
|
||||
_cache_glyphs = {}
|
||||
|
||||
def __init__(self, label, **kwargs):
|
||||
def __init__(self, **kwargs):
|
||||
kwargs.setdefault('font_size', 12)
|
||||
kwargs.setdefault('font_name', DEFAULT_FONT)
|
||||
kwargs.setdefault('bold', False)
|
||||
|
@ -86,9 +86,9 @@ class LabelBase(object):
|
|||
if uw != None:
|
||||
kwargs['size'] = uw - kwargs['padding_x'] * 2, uh
|
||||
|
||||
super(LabelBase, self).__init__(**kwargs)
|
||||
super(LabelBase, self).__init__()
|
||||
|
||||
self._label = None
|
||||
self._text = None
|
||||
|
||||
self.color = kwargs.get('color')
|
||||
self.usersize = kwargs.get('size')
|
||||
|
@ -110,7 +110,7 @@ class LabelBase(object):
|
|||
else:
|
||||
label_font_cache[fontname] = None
|
||||
|
||||
self.label = label
|
||||
self.text = kwargs.get('text', '')
|
||||
|
||||
def get_extents(self, text):
|
||||
'''Return a tuple with (width, height) for a text.'''
|
||||
|
@ -143,7 +143,7 @@ class LabelBase(object):
|
|||
|
||||
# no width specified, faster method
|
||||
if uw is None:
|
||||
for line in self.label.split('\n'):
|
||||
for line in self.text.split('\n'):
|
||||
lw, lh = self.get_extents(line)
|
||||
if real:
|
||||
x = 0
|
||||
|
@ -166,7 +166,7 @@ class LabelBase(object):
|
|||
|
||||
if not real:
|
||||
# verify that each glyph have size
|
||||
glyphs = list(set(self.label))
|
||||
glyphs = list(set(self.text))
|
||||
for glyph in glyphs:
|
||||
if not glyph in cache:
|
||||
cache[glyph] = self.get_extents(glyph)
|
||||
|
@ -175,7 +175,7 @@ class LabelBase(object):
|
|||
glyphs = []
|
||||
lines = []
|
||||
lw = lh = 0
|
||||
for word in re.split(r'( |\n)', self.label):
|
||||
for word in re.split(r'( |\n)', self.text):
|
||||
|
||||
# calculate the word width
|
||||
ww, wh = 0, 0
|
||||
|
@ -262,7 +262,7 @@ class LabelBase(object):
|
|||
|
||||
|
||||
def refresh(self):
|
||||
'''Force re-rendering of the label'''
|
||||
'''Force re-rendering of the text'''
|
||||
# first pass, calculating width/height
|
||||
sz = self.render()
|
||||
self._size = sz
|
||||
|
@ -271,22 +271,34 @@ class LabelBase(object):
|
|||
self._size = sz[0] + self.options['padding_x'] * 2, \
|
||||
sz[1] + self.options['padding_y'] * 2
|
||||
|
||||
def _get_label(self):
|
||||
return self._label
|
||||
def _set_label(self, label):
|
||||
if label == self._label:
|
||||
def _get_text(self):
|
||||
return self._text
|
||||
def _set_text(self, text):
|
||||
if text == self._text:
|
||||
return
|
||||
# try to automaticly decode unicode
|
||||
try:
|
||||
self._label = label.decode('utf8')
|
||||
self._text = text.decode('utf8')
|
||||
except:
|
||||
try:
|
||||
self._label = str(label)
|
||||
self._text = str(text)
|
||||
except:
|
||||
self._label = label
|
||||
self._text = text
|
||||
self.refresh()
|
||||
label = property(_get_label, _set_label, doc='Get/Set the label text')
|
||||
text = property(_get_label, _set_label, doc='Get/Set the label text')
|
||||
text = property(_get_text, _set_text, doc='Get/Set the text')
|
||||
label = property(_get_text, _set_text, doc='Get/Set the text')
|
||||
|
||||
@property
|
||||
def size(self):
|
||||
return self._size
|
||||
|
||||
@property
|
||||
def width(self):
|
||||
return self._size[0]
|
||||
|
||||
@property
|
||||
def height(self):
|
||||
return self._size[1]
|
||||
|
||||
@property
|
||||
def content_width(self):
|
||||
|
|
|
@ -4,8 +4,8 @@ Text Cairo: Draw text with cairo
|
|||
|
||||
__all__ = ('LabelCairo', )
|
||||
|
||||
import kivy
|
||||
from . import LabelBase
|
||||
from kivy.core.image import ImageData
|
||||
|
||||
try:
|
||||
import cairo
|
||||
|
@ -61,7 +61,7 @@ class LabelCairo(LabelBase):
|
|||
def _render_begin(self):
|
||||
# create a surface, context, font...
|
||||
self._cairo_surface = cairo.ImageSurface(
|
||||
cairo.FORMAT_ARGB32, *self.size)
|
||||
cairo.FORMAT_ARGB32, *self._size)
|
||||
self._cairo_context = cairo.Context(self._cairo_surface)
|
||||
|
||||
self._select_font(self._cairo_context)
|
||||
|
@ -74,7 +74,7 @@ class LabelCairo(LabelBase):
|
|||
self._cairo_context.show_text(text)
|
||||
|
||||
def _render_end(self):
|
||||
data = kivy.ImageData(self.width, self.height,
|
||||
data = ImageData(self._size[0], self._size[1],
|
||||
'RGBA', buffer(self._cairo_surface.get_data())[:])
|
||||
|
||||
del self._cairo_surface
|
||||
|
|
|
@ -9,9 +9,10 @@ try:
|
|||
except:
|
||||
raise
|
||||
|
||||
import kivy
|
||||
import os
|
||||
from . import LabelBase
|
||||
from kivy import kivy_data_dir
|
||||
from kivy.core.image import ImageData
|
||||
|
||||
# used for fetching extends before creature image surface
|
||||
default_font = ImageFont.load_default()
|
||||
|
@ -23,7 +24,7 @@ class LabelPIL(LabelBase):
|
|||
fontname = self.options['font_name'].split(',')[0]
|
||||
id = '%s.%s' % (unicode(fontname), unicode(fontsize))
|
||||
if not id in self._cache:
|
||||
filename = os.path.join(kivy.kivy_data_dir, 'DejaVuSans.ttf')
|
||||
filename = os.path.join(kivy_data_dir, 'DejaVuSans.ttf')
|
||||
font = ImageFont.truetype(filename, fontsize)
|
||||
self._cache[id] = font
|
||||
|
||||
|
@ -36,7 +37,7 @@ class LabelPIL(LabelBase):
|
|||
|
||||
def _render_begin(self):
|
||||
# create a surface, context, font...
|
||||
self._pil_im = Image.new('RGBA', self.size)
|
||||
self._pil_im = Image.new('RGBA', self._size)
|
||||
self._pil_draw = ImageDraw.Draw(self._pil_im)
|
||||
|
||||
def _render_text(self, text, x, y):
|
||||
|
@ -44,7 +45,7 @@ class LabelPIL(LabelBase):
|
|||
self._pil_draw.text((int(x), int(y)), text, font=self._select_font(), fill=color)
|
||||
|
||||
def _render_end(self):
|
||||
data = kivy.ImageData(self.width, self.height,
|
||||
data = ImageData(self._size[0], self._size[1],
|
||||
self._pil_im.mode, self._pil_im.tostring())
|
||||
|
||||
del self._pil_im
|
||||
|
|
|
@ -4,8 +4,8 @@ Text Pygame: Draw text with pygame
|
|||
|
||||
__all__ = ('LabelPygame', )
|
||||
|
||||
import kivy
|
||||
from . import LabelBase
|
||||
from kivy.core.image import ImageData
|
||||
|
||||
try:
|
||||
import pygame
|
||||
|
@ -55,7 +55,7 @@ class LabelPygame(LabelBase):
|
|||
return w, h
|
||||
|
||||
def _render_begin(self):
|
||||
self._pygame_surface = pygame.Surface(self.size, pygame.SRCALPHA, 32)
|
||||
self._pygame_surface = pygame.Surface(self._size, pygame.SRCALPHA, 32)
|
||||
self._pygame_surface.fill((0, 0, 0, 0))
|
||||
|
||||
def _render_text(self, text, x, y):
|
||||
|
@ -66,7 +66,7 @@ class LabelPygame(LabelBase):
|
|||
self._pygame_surface.blit(text, (x, y), None, pygame.BLEND_RGBA_ADD)
|
||||
|
||||
def _render_end(self):
|
||||
data = kivy.ImageData(self.width, self.height,
|
||||
data = ImageData(self._size[0], self._size[1],
|
||||
'RGBA', buffer(self._pygame_surface.get_buffer())[:])
|
||||
|
||||
del self._pygame_surface
|
||||
|
|
Loading…
Reference in New Issue