OmniSVG-3B / deepsvg /gui /layout /aligned_textinput.py
OmniSVG's picture
Upload 80 files
c1ce505 verified
from kivy.uix.textinput import TextInput
from kivy.properties import StringProperty
DEFAULT_PADDING = 6
class AlignedTextInput(TextInput):
halign = StringProperty('left')
valign = StringProperty('top')
def __init__(self, **kwargs):
self.halign = kwargs.get("halign", "left")
self.valign = kwargs.get("valign", "top")
self.bind(on_text=self.on_text)
super().__init__(**kwargs)
def on_text(self, instance, value):
self.redraw()
def on_size(self, instance, value):
self.redraw()
def redraw(self):
"""
Note: This methods depends on internal variables of its TextInput
base class (_lines_rects and _refresh_text())
"""
self._refresh_text(self.text)
max_size = max(self._lines_rects, key=lambda r: r.size[0]).size
num_lines = len(self._lines_rects)
px = [DEFAULT_PADDING, DEFAULT_PADDING]
py = [DEFAULT_PADDING, DEFAULT_PADDING]
if self.halign == 'center':
d = (self.width - max_size[0]) / 2.0 - DEFAULT_PADDING
px = [d, d]
elif self.halign == 'right':
px[0] = self.width - max_size[0] - DEFAULT_PADDING
if self.valign == 'middle':
d = (self.height - max_size[1] * num_lines) / 2.0 - DEFAULT_PADDING
py = [d + 5, d - 5]
elif self.valign == 'bottom':
py[0] = self.height - max_size[1] * num_lines - DEFAULT_PADDING
self.padding_x = px
self.padding_y = py