micropython-micro-gui/gui/widgets/label.py

64 wiersze
2.4 KiB
Python

# label.py Extension to micro-gui providing the Label class
# Released under the MIT License (MIT). See LICENSE.
# Copyright (c) 2021 Peter Hinch
from gui.core.ugui import Widget, display
from gui.core.writer import Writer
from gui.core.colors import *
# text: str display string int save width
class Label(Widget):
LEFT = 0
CENTRE = 1
RIGHT = 2
def __init__(self, writer, row, col, text, invert=False, fgcolor=None, bgcolor=BLACK, bdcolor=False, justify=0):
self.writer = writer
self.justify = justify
# Determine width of object
if isinstance(text, int):
width = text
text = None
else:
width = writer.stringlen(text)
height = writer.height
self.invert = invert
super().__init__(writer, row, col, height, width, fgcolor, bgcolor, bdcolor)
self.tcol = col
if text is not None:
self.value(text, invert)
def value(self, text=None, invert=False, fgcolor=None, bgcolor=None, bdcolor=None, justify=None):
sl = self.writer.stringlen(text)
if justify is None:
justify = self.justify
self.tcol = self.col # Default is left justify
if sl > self.width: # Clip
font = self.writer.font
pos = 0
n = 0
for ch in text:
pos += font.get_ch(ch)[2] # width of current char
if pos > self.width:
break
n += 1
text = text[: n]
elif justify == 1: # Centre
self.tcol = self.col + (self.width - sl) // 2
elif justify == 2: # Right
self.tcol = self.col + self.width - sl
txt = super().value(text)
self.draw = True # Redraw unconditionally: colors may have changed.
self.invert = invert
self.fgcolor = self.def_fgcolor if fgcolor is None else fgcolor
self.bgcolor = self.def_bgcolor if bgcolor is None else bgcolor
if bdcolor is False:
self.def_bdcolor = False
self.bdcolor = self.def_bdcolor if bdcolor is None else bdcolor
return txt
def show(self):
if super().show(): # Draw or erase border
if isinstance(txt := super().value(), str):
display.print_left(self.writer, self.tcol, self.row, txt, self.fgcolor, self.bgcolor, self.invert)