def __init__(self): self.focus_keymap = Keymap() self.focus_keymap.obs_activation.add_observer(self, '_keymap_') self.keymap = Keymap() self.keymap.set_next_keymap(self.focus_keymap) self._prev_frame_colors = [] self._anim_pos = MovingPos() self.selectable = ValueContainer(True)
class Widget(object): # frame_color is consulted first, and allowed to be None for no # frame. frame_color = None frame_width = 1 bg_color = None use_rounded_rect = True activated_frame_color = (40, 40, 255) activated_bg_color = (30, 30, 90) def __init__(self): self.focus_keymap = Keymap() self.focus_keymap.obs_activation.add_observer(self, '_keymap_') self.keymap = Keymap() self.keymap.set_next_keymap(self.focus_keymap) self._prev_frame_colors = [] self._anim_pos = MovingPos() self.selectable = ValueContainer(True) def _keymap_activated(self): self.got_focus() def _keymap_deactivated(self): self.lost_focus() def push_frame(self, frame_color=_dontchange, bg_color=_dontchange): self._prev_frame_colors.append((self.frame_color, self.bg_color)) if frame_color is not _dontchange: self.frame_color = frame_color if bg_color is not _dontchange: self.bg_color = bg_color def pop_frame(self): self.frame_color, self.bg_color = self._prev_frame_colors.pop() def got_focus(self): self.push_frame(frame_color=self.activated_frame_color, bg_color=self.activated_bg_color) def lost_focus(self): self.pop_frame() def draw(self, surface, pos): self._anim_pos.set_target(pos) self._anim_pos.update(0.6) pos = self._anim_pos.current_pos self.draw_background(surface, pos) self._draw(surface, pos) self.draw_frame(surface, pos) def draw_background(self, surface, pos): if self.bg_color is not None: r = pygame.Rect(pos, self.size) gui.draw.rect(surface, self.bg_color, r, 0) def draw_frame(self, surface, pos): if self.frame_color is not None: r = pygame.Rect(pos, self.size) r.inflate_ip(-self.frame_width, -self.frame_width) # Half of each side if self.use_rounded_rect: dr = partial(gui.draw.rounded.rounded_rect, corner_radius=5) else: dr = gui.draw.rect dr(surface, self.frame_color, r, self.frame_width) def _draw(self, surface, pos): raise NotImplementedError() def update(self): raise NotImplementedError()