90 lines
3.8 KiB
Python
90 lines
3.8 KiB
Python
from colors import *
|
|
from sysfont import sysfont
|
|
|
|
class Widget:
|
|
def __init__(self, pos, callback=None, bg_color=RED):
|
|
self.has_focus = False
|
|
self.pos = pos
|
|
self.size = (0,0)
|
|
self.orig_pos = pos
|
|
self.callback = callback
|
|
self.back_color = bg_color
|
|
|
|
|
|
def draw(self, display):
|
|
if self.has_focus:
|
|
display.line(self.orig_pos, (self.orig_pos[0]+10, self.orig_pos[1]+8), RED)
|
|
display.line(self.orig_pos, (self.orig_pos[0], self.orig_pos[1]+16), RED)
|
|
display.line((self.orig_pos[0], self.orig_pos[1]+16), (self.orig_pos[0]+10, self.orig_pos[1]+8), RED)
|
|
display.fillrect(self.pos, (100, 100), NAVY)
|
|
if self.back_color is not None:
|
|
display.fillrect(self.pos, self.size, self.back_color)
|
|
|
|
def has_focus(self):
|
|
return self.has_focus
|
|
|
|
def set_focus(self, focus):
|
|
self.has_focus = focus
|
|
if self.has_focus:
|
|
self.pos = (self.orig_pos[0] + 12, self.orig_pos[1])
|
|
else:
|
|
self.pos = self.orig_pos
|
|
|
|
|
|
class Label(Widget):
|
|
|
|
def __init__(self, text, pos: tuple[int, int], text_offset:tuple[int, int]=None, f_color=BLACK, back_color=0, f_size=2, nowrap=True):
|
|
super().__init__(pos, bg_color=back_color)
|
|
self.ch_w = 5
|
|
self.ch_h = 8
|
|
self.text = text
|
|
self.text_offset = (0, 0)
|
|
if text_offset is not None:
|
|
self.text_offset = text_offset
|
|
self.f_color = f_color
|
|
self.f_size = f_size
|
|
self.nowrap = nowrap
|
|
self.size = (len(self.text)*(self.f_size*self.ch_w)+self.text_offset[0]+self.ch_w*self.f_size, self.f_size*self.ch_h+self.text_offset[1])
|
|
|
|
def draw(self, display):
|
|
super().draw(display)
|
|
display.text((self.pos[0] + self.text_offset[0], self.pos[1] + self.text_offset[1]), self.text, self.f_color, sysfont, self.f_size, nowrap=self.nowrap)
|
|
|
|
class Checkbox(Label):
|
|
|
|
def __init__(self, text, pos: tuple[int, int], checked=False, f_color=BLACK, back_color=0, f_size=2, nowrap=True):
|
|
self.ch_w = 5
|
|
self.ch_h = 8
|
|
self.b_pos = pos
|
|
self.box_size = (self.ch_w * f_size, self.ch_h * f_size)
|
|
self.checked = checked
|
|
super().__init__(text, pos, (self.box_size[0]+self.ch_w, 0), f_color, back_color, f_size, nowrap)
|
|
|
|
def draw(self, display):
|
|
super().draw(display)
|
|
display.rect(self.b_pos, self.box_size, self.f_color)
|
|
if self.checked:
|
|
display.line(self.b_pos, (self.b_pos[0]+self.box_size[0]//2, self.b_pos[1]+self.box_size[1]), self.f_color)
|
|
display.line((self.b_pos[0]+self.box_size[0]//2, self.b_pos[1]+self.box_size[1]),\
|
|
(self.b_pos[0]+self.box_size[0]+self.ch_w//2, self.b_pos[1]-self.ch_h//2), self.f_color)
|
|
|
|
|
|
class RadioButton(Label):
|
|
|
|
def __init__(self, text, pos: tuple[int, int], checked=False, f_color=BLACK, back_color=0, f_size=2, nowrap=True):
|
|
self.ch_w = 5
|
|
self.ch_h = 8
|
|
self.b_pos = pos
|
|
self.box_size = (self.ch_w * f_size, self.ch_h * f_size)
|
|
self.checked = checked
|
|
super().__init__(text, pos, (self.box_size[0]+self.ch_w, 0), f_color, back_color, f_size, nowrap)
|
|
|
|
def draw(self, display):
|
|
super().draw(display)
|
|
display.circle((self.b_pos[0]+self.ch_w*self.f_size//2, self.b_pos[1]+self.ch_w*self.f_size//2),
|
|
self.box_size[0]*0.75, self.f_color)
|
|
if self.checked:
|
|
display.circle((self.b_pos[0] + self.ch_w * self.f_size // 2, self.b_pos[1] + self.ch_w * self.f_size // 2),
|
|
self.box_size[0]*0.75, self.f_color)
|
|
display.fillcircle((self.b_pos[0] + self.ch_w * self.f_size // 2, self.b_pos[1] + self.ch_w * self.f_size // 2),
|
|
self.box_size[0]//2, self.f_color) |