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)