128 lines
3.0 KiB
Python
128 lines
3.0 KiB
Python
from kivy.core.text import Label as CoreLabel
|
|
from kivy.graphics import *
|
|
from kivy.properties import BooleanProperty, StringProperty, NumericProperty
|
|
from kivy.uix.boxlayout import BoxLayout
|
|
import re
|
|
|
|
from kivy.uix.button import Button
|
|
from kivy.uix.checkbox import CheckBox
|
|
from kivy.uix.label import Label
|
|
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 DarkLabel(Label):
|
|
pass
|
|
|
|
|
|
class BaseCircleWithText(DarkLabel):
|
|
radius = NumericProperty(0.48)
|
|
|
|
|
|
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
|
|
|
|
|
|
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))
|