Adafruit_CircuitPython_Disp.../adafruit_button.py
2019-03-05 13:31:50 -05:00

145 lines
5.6 KiB
Python

# The MIT License (MIT)
#
# Copyright (c) 2019 Limor Fried for Adafruit Industries
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
"""
`adafruit_display_button`
================================================================================
UI Buttons for displayio
* Author(s): Limor Fried
Implementation Notes
--------------------
**Software and Dependencies:**
* Adafruit CircuitPython firmware for the supported boards:
https://github.com/adafruit/circuitpython/releases
"""
import displayio
from adafruit_display_text.text_area import TextArea
from adafruit_bitmap_font import bitmap_font
from adafruit_display_shapes.rect import Rect
from adafruit_display_shapes.roundrect import RoundRect
__version__ = "0.0.0-auto.0"
__repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Display_Button.git"
class Button():
RECT = const(0)
ROUNDRECT = const(1)
SHADOWRECT = const(2)
SHADOWROUNDRECT = const(3)
def __init__(self, *, x, y, width, height, name=None, style=RECT,
fill_color=0xFFFFFF, outline_color=0x0,
label=None, label_font=None, label_color=0x0,
selected_fill=None, selected_outline=None,
selected_label=None):
self.x = x
self.y = y
self.width = width
self.height = height
self._font = label_font
self._selected = False
self.group = displayio.Group()
self.name = name
self.fill_color = fill_color
self.outline_color = outline_color
self.label_color = label_color
# Selecting inverts the button colors!
self.selected_fill = selected_fill
self.selected_outline = selected_outline
self.selected_label = selected_label
if self.selected_fill is None and fill_color is not None:
self.selected_fill = (~fill_color) & 0xFFFFFF
if self.selected_outline is None and outline_color is not None:
self.selected_outline = (~outline_color) & 0xFFFFFF
if outline_color or fill_color:
self.body = self.shadow = None
if style == RECT:
self.body = Rect(x, y, width, height,
fill=fill_color, outline=outline_color)
elif style == ROUNDRECT:
self.body = RoundRect(x, y, width, height, r=10,
fill=fill_color, outline=outline_color)
elif style == SHADOWRECT:
self.shadow = Rect(x+2, y+2, width-2, height-2,
fill=outline_color)
self.body = Rect(x, y, width-2, height-2,
fill=fill_color, outline=outline_color)
elif style == SHADOWROUNDRECT:
self.shadow = RoundRect(x+2, y+2, width-2, height-2, r=10,
fill=outline_color)
self.body = RoundRect(x, y, width-2, height-2, r=10,
fill=fill_color, outline=outline_color)
if self.shadow:
self.group.append(self.shadow)
self.group.append(self.body)
if label and (label_color is not None): # button with text label
if not label_font:
raise RuntimeError("Please provide label font")
dims = label_font.text_bounding_box(label)
if dims[2] >= width or dims[3] >= height:
raise RuntimeError("Button not large enough for label")
self.label = TextArea(label_font, text=label)
self.label.x = x + (width - dims[2])//2
self.label.y = y + (height - dims[3])
self.label.color = label_color
self.group.append(self.label)
if self.selected_label is None and label_color is not None:
self.selected_label = (~label_color) & 0xFFFFFF
#print(dims)
"""
#else: # ok just a bounding box
#self.bodyshape = displayio.Shape(width, height)
#self.group.append(self.bodyshape)
"""
@property
def selected(self):
return self._selected
@selected.setter
def selected(self, value):
if value != self._selected:
self._selected = value
if self._selected:
self.body.fill = self.selected_fill
self.body.outline = self.selected_outline
self.label.color = self.selected_label
else:
self.body.fill = self.fill_color
self.body.outline = self.outline_color
self.label.color = self.label_color
def contains(self, point):
return (self.x <= point[0] <= self.x+self.width) and (self.y <= point[1] <= self.y+self.height)