"""Module containing the generic Checkbox class, a generic checkbox widget."""

from bui.widget.base import Widget, CachedProperty

class Checkbox(Widget):

"""
The generic checkbox widget.

A checkbox is meant to be contained inside a
[window](../layout/tag/window.md) tag. It can have a label and can
be checked or not checked.

This is a generic widget which will be converted into a specific widget,
depending on the used GUI toolkit.

"""

widget = "checkbox"
class_name = "Checkbox"
default_controls = {
"check": "This checkbox is being checked or unchecked.",
"init": "This checkbox is ready to be displayed.",
"press": "The user presses on a key while the checkbox is focused.",
"release": "The user releases a key while the checkbox is focused",
"type": "The user types a character while the checkbox is focused",
}
implicit_control = "click"

def __init__(self, leaf):
super().__init__(leaf)
self.x = leaf.x
self.y = leaf.y
self.width = leaf.width
self.height = leaf.height
self.id = leaf.id
self.name = self.cached_name = leaf.name
self.cached_checked = leaf.checked
self._enabled = True

def __bool__(self):
return self.checked

@CachedProperty
def id(self):
return self.leaf.id

@CachedProperty
def name(self):
return self.specific.name

@name.setter
def name(self, name):
self.specific.name = name

@CachedProperty
def checked(self):
return self.specific.checked

@checked.setter
def checked(self, checked):
self.specific.checked = checked

@property
def enabled(self):
"""Return whether the checkbox is enabled or not."""
return self._enabled

@property
def disabled(self):
"""Return whether the checkbox is disabled or not."""
return not self._enabled

def check(self):
"""Force check this checkbox."""
self.checked = True

def uncheck(self):
"""Force uncheck this checkbox."""
self.checked = False

def enable(self):
"""Force-enable the checkbox."""
self.specific.enable()

def disable(self):
"""Disable the checkbox."""
self.specific.disable()

def handle_check(self, control):
"""Do nothing if a checkbox is clicked."""
pass

def handle_init(self, control):
"""Do nothing if a checkbox is pressed."""
pass

def handle_press(self, control):
"""Do nothing if a checkbox is pressed."""
pass