from kivy.core.text import Label as CoreLabel from kivy.graphics import * from kivy.properties import BooleanProperty, StringProperty from kivy.uix.boxlayout import BoxLayout import re from kivy.uix.button import Button from kivy.uix.checkbox import CheckBox from kivy.uix.spinner import Spinner from kivy.uix.textinput import TextInput class StyledButton(Button): pass class CheckBoxHint(BoxLayout): __events__ = ("on_active",) @property def active(self): return self.checkbox.active def on_active(self, *args): pass class LabelledTextInput(TextInput): input_property = StringProperty("") @property def input_value(self): return self.text class LabelledCheckBox(CheckBox): input_property = StringProperty("") def __init__(self, text=None, **kwargs): if text is not None: kwargs["active"] = bool(text) super().__init__(**kwargs) @property def input_value(self): return bool(self.active) class LabelledSpinner(Spinner): input_property = StringProperty("") @property def input_value(self): return self.text class LabelledFloatInput(LabelledTextInput): signed = BooleanProperty(True) pat = re.compile("[^0-9-]") def insert_text(self, substring, from_undo=False): pat = self.pat if "." in self.text: s = re.sub(pat, "", substring) else: s = ".".join([re.sub(pat, "", s) for s in substring.split(".", 1)]) r = super().insert_text(s, from_undo=from_undo) if not self.signed and "-" in self.text: self.text = self.text.replace("-", "") elif self.text and "-" in self.text[1:]: self.text = self.text[0] + self.text[1:].replace("-", "") return r @property def input_value(self): return float(self.text) class LabelledIntInput(LabelledTextInput): pat = re.compile("[^0-9]") def insert_text(self, substring, from_undo=False): return super().insert_text(re.sub(self.pat, "", substring), from_undo=from_undo) @property def input_value(self): return int(self.text) class BWCheckBoxHint(BoxLayout): __events__ = ("on_active",) @property def active_map(self): return {"B": self.black.active, "W": self.white.active} def active(self, player): return self.active_map[player] def on_active(self, *args): pass class CensorableLabel(BoxLayout): @property def text(self): return self.value.text class CensorableScoreLabel(BoxLayout): @property def text(self): return self.value.text def set_prisoners(self, bw): self.black.text = str(bw[1]) self.white.text = str(bw[0]) def draw_text(pos, text, **kw): label = CoreLabel(text=text, bold=True, **kw) label.refresh() Rectangle(texture=label.texture, pos=(pos[0] - label.texture.size[0] / 2, pos[1] - label.texture.size[1] / 2), size=label.texture.size) def draw_circle(pos, r, col): Color(*col) Ellipse(pos=(pos[0] - r, pos[1] - r), size=(2 * r, 2 * r))