diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index fff3aa9..97fe64d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -40,7 +40,7 @@ jobs: source actions-ci/install.sh - name: Pip install pylint, black, & Sphinx run: | - pip install --force-reinstall pylint==1.9.2 black==19.10b0 Sphinx sphinx-rtd-theme + pip install pylint black==19.10b0 Sphinx sphinx-rtd-theme - name: Library version run: git describe --dirty --always --tags - name: PyLint diff --git a/adafruit_display_text/label.py b/adafruit_display_text/label.py index b188459..24ef7b4 100644 --- a/adafruit_display_text/label.py +++ b/adafruit_display_text/label.py @@ -44,6 +44,7 @@ __version__ = "0.0.0-auto.0" __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Display_Text.git" + class Label(displayio.Group): """A label displaying a string of text. The origin point set by ``x`` and ``y`` properties will be the left edge of the bounding box, and in the center of a M @@ -56,8 +57,20 @@ class Label(displayio.Group): :param int max_glyphs: The largest quantity of glyphs we will display :param int color: Color of all text in RGB hex :param double line_spacing: Line spacing of text to display""" - def __init__(self, font, *, x=0, y=0, text=None, max_glyphs=None, color=0xffffff, - background_color=None, line_spacing=1.25, **kwargs): + + def __init__( + self, + font, + *, + x=0, + y=0, + text=None, + max_glyphs=None, + color=0xFFFFFF, + background_color=None, + line_spacing=1.25, + **kwargs + ): if not max_glyphs and not text: raise RuntimeError("Please provide a max size, or initial text") if not max_glyphs: @@ -89,41 +102,58 @@ def __init__(self, font, *, x=0, y=0, text=None, max_glyphs=None, color=0xffffff if text is not None: self._update_text(str(text)) - - def _update_text(self, new_text): # pylint: disable=too-many-locals + def _update_text(self, new_text): # pylint: disable=too-many-locals x = 0 y = 0 i = 0 old_c = 0 - y_offset = int((self.font.get_glyph(ord('M')).height - - new_text.count('\n') * self.height * self.line_spacing) / 2) - #print("y offset from baseline", y_offset) + y_offset = int( + ( + self.font.get_glyph(ord("M")).height + - new_text.count("\n") * self.height * self.line_spacing + ) + / 2 + ) + # print("y offset from baseline", y_offset) left = right = top = bottom = 0 for character in new_text: - if character == '\n': + if character == "\n": y += int(self.height * self._line_spacing) x = 0 continue glyph = self.font.get_glyph(ord(character)) if not glyph: continue - right = max(right, x+glyph.width) - if y == 0: # first line, find the Ascender height - top = min(top, -glyph.height+y_offset) - bottom = max(bottom, y-glyph.dy+y_offset) + right = max(right, x + glyph.width) + if y == 0: # first line, find the Ascender height + top = min(top, -glyph.height + y_offset) + bottom = max(bottom, y - glyph.dy + y_offset) position_y = y - glyph.height - glyph.dy + y_offset position_x = x + glyph.dx - if not self._text or old_c >= len(self._text) or character != self._text[old_c]: + if ( + not self._text + or old_c >= len(self._text) + or character != self._text[old_c] + ): try: - face = displayio.TileGrid(glyph.bitmap, pixel_shader=self.palette, - default_tile=glyph.tile_index, - tile_width=glyph.width, tile_height=glyph.height, - position=(position_x, position_y)) + face = displayio.TileGrid( + glyph.bitmap, + pixel_shader=self.palette, + default_tile=glyph.tile_index, + tile_width=glyph.width, + tile_height=glyph.height, + position=(position_x, position_y), + ) except TypeError: - face = displayio.TileGrid(glyph.bitmap, pixel_shader=self.palette, - default_tile=glyph.tile_index, - tile_width=glyph.width, tile_height=glyph.height, - x=position_x, y=position_y) + face = displayio.TileGrid( + glyph.bitmap, + pixel_shader=self.palette, + default_tile=glyph.tile_index, + tile_width=glyph.width, + tile_height=glyph.height, + x=position_x, + y=position_y, + ) if i < len(self): self[i] = face else: @@ -141,14 +171,20 @@ def _update_text(self, new_text): # pylint: disable=too-many-locals i += 1 old_c += 1 # skip all non-prinables in the old string - while (self._text and old_c < len(self._text) and - (self._text[old_c] == '\n' or not self.font.get_glyph(ord(self._text[old_c])))): + while ( + self._text + and old_c < len(self._text) + and ( + self._text[old_c] == "\n" + or not self.font.get_glyph(ord(self._text[old_c])) + ) + ): old_c += 1 # Remove the rest while len(self) > i: self.pop() self._text = new_text - self._boundingbox = (left, top, left+right, bottom-top) + self._boundingbox = (left, top, left + right, bottom - top) @property def bounding_box(self): @@ -217,10 +253,12 @@ def anchor_point(self, new_anchor_point): def anchored_position(self): """Position relative to the anchor_point. Tuple containing x,y pixel coordinates.""" - return (self.x-self._boundingbox[2]*self._anchor_point[0], - self.y-self._boundingbox[3]*self._anchor_point[1]) + return ( + self.x - self._boundingbox[2] * self._anchor_point[0], + self.y - self._boundingbox[3] * self._anchor_point[1], + ) @anchored_position.setter def anchored_position(self, new_position): - self.x = int(new_position[0]-(self._boundingbox[2]*self._anchor_point[0])) - self.y = int(new_position[1]-(self._boundingbox[3]*self._anchor_point[1])) + self.x = int(new_position[0] - (self._boundingbox[2] * self._anchor_point[0])) + self.y = int(new_position[1] - (self._boundingbox[3] * self._anchor_point[1])) diff --git a/docs/conf.py b/docs/conf.py index 62eeb8b..0f9b47a 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -2,7 +2,8 @@ import os import sys -sys.path.insert(0, os.path.abspath('..')) + +sys.path.insert(0, os.path.abspath("..")) # -- General configuration ------------------------------------------------ @@ -10,10 +11,10 @@ # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = [ - 'sphinx.ext.autodoc', - 'sphinx.ext.intersphinx', - 'sphinx.ext.napoleon', - 'sphinx.ext.todo', + "sphinx.ext.autodoc", + "sphinx.ext.intersphinx", + "sphinx.ext.napoleon", + "sphinx.ext.todo", ] # TODO: Please Read! @@ -23,29 +24,32 @@ autodoc_mock_imports = ["displayio"] -intersphinx_mapping = {'python': ('https://docs.python.org/3.4', None),'CircuitPython': ('https://circuitpython.readthedocs.io/en/latest/', None)} +intersphinx_mapping = { + "python": ("https://docs.python.org/3.4", None), + "CircuitPython": ("https://circuitpython.readthedocs.io/en/latest/", None), +} # Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] +templates_path = ["_templates"] -source_suffix = '.rst' +source_suffix = ".rst" # The master toctree document. -master_doc = 'index' +master_doc = "index" # General information about the project. -project = u'Adafruit Display_Text Library' -copyright = u'2019 Scott Shawcroft' -author = u'Scott Shawcroft' +project = u"Adafruit Display_Text Library" +copyright = u"2019 Scott Shawcroft" +author = u"Scott Shawcroft" # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. # # The short X.Y version. -version = u'1.0' +version = u"1.0" # The full version, including alpha/beta/rc tags. -release = u'1.0' +release = u"1.0" # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. @@ -57,7 +61,7 @@ # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. # This patterns also effect to html_static_path and html_extra_path -exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store', '.env', 'CODE_OF_CONDUCT.md'] +exclude_patterns = ["_build", "Thumbs.db", ".DS_Store", ".env", "CODE_OF_CONDUCT.md"] # The reST default role (used for this markup: `text`) to use for all # documents. @@ -69,7 +73,7 @@ add_function_parentheses = True # The name of the Pygments (syntax highlighting) style to use. -pygments_style = 'sphinx' +pygments_style = "sphinx" # If true, `todo` and `todoList` produce output, else they produce nothing. todo_include_todos = False @@ -84,59 +88,62 @@ # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. # -on_rtd = os.environ.get('READTHEDOCS', None) == 'True' +on_rtd = os.environ.get("READTHEDOCS", None) == "True" if not on_rtd: # only import and set the theme if we're building docs locally try: import sphinx_rtd_theme - html_theme = 'sphinx_rtd_theme' - html_theme_path = [sphinx_rtd_theme.get_html_theme_path(), '.'] + + html_theme = "sphinx_rtd_theme" + html_theme_path = [sphinx_rtd_theme.get_html_theme_path(), "."] except: - html_theme = 'default' - html_theme_path = ['.'] + html_theme = "default" + html_theme_path = ["."] else: - html_theme_path = ['.'] + html_theme_path = ["."] # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ['_static'] +html_static_path = ["_static"] # The name of an image file (relative to this directory) to use as a favicon of # the docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. # -html_favicon = '_static/favicon.ico' +html_favicon = "_static/favicon.ico" # Output file base name for HTML help builder. -htmlhelp_basename = 'AdafruitDisplay_textLibrarydoc' +htmlhelp_basename = "AdafruitDisplay_textLibrarydoc" # -- Options for LaTeX output --------------------------------------------- latex_elements = { - # The paper size ('letterpaper' or 'a4paper'). - # - # 'papersize': 'letterpaper', - - # The font size ('10pt', '11pt' or '12pt'). - # - # 'pointsize': '10pt', - - # Additional stuff for the LaTeX preamble. - # - # 'preamble': '', - - # Latex figure (float) alignment - # - # 'figure_align': 'htbp', + # The paper size ('letterpaper' or 'a4paper'). + # + # 'papersize': 'letterpaper', + # The font size ('10pt', '11pt' or '12pt'). + # + # 'pointsize': '10pt', + # Additional stuff for the LaTeX preamble. + # + # 'preamble': '', + # Latex figure (float) alignment + # + # 'figure_align': 'htbp', } # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, # author, documentclass [howto, manual, or own class]). latex_documents = [ - (master_doc, 'AdafruitDisplay_TextLibrary.tex', u'AdafruitDisplay_Text Library Documentation', - author, 'manual'), + ( + master_doc, + "AdafruitDisplay_TextLibrary.tex", + u"AdafruitDisplay_Text Library Documentation", + author, + "manual", + ), ] # -- Options for manual page output --------------------------------------- @@ -144,8 +151,13 @@ # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ - (master_doc, 'AdafruitDisplay_Textlibrary', u'Adafruit Display_Text Library Documentation', - [author], 1) + ( + master_doc, + "AdafruitDisplay_Textlibrary", + u"Adafruit Display_Text Library Documentation", + [author], + 1, + ) ] # -- Options for Texinfo output ------------------------------------------- @@ -154,7 +166,13 @@ # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ - (master_doc, 'AdafruitDisplay_TextLibrary', u'Adafruit Display_Text Library Documentation', - author, 'AdafruitDisplay_TextLibrary', 'One line description of project.', - 'Miscellaneous'), + ( + master_doc, + "AdafruitDisplay_TextLibrary", + u"Adafruit Display_Text Library Documentation", + author, + "AdafruitDisplay_TextLibrary", + "One line description of project.", + "Miscellaneous", + ), ] diff --git a/examples/display_text_anchored_position.py b/examples/display_text_anchored_position.py index 963270e..b0728fe 100644 --- a/examples/display_text_anchored_position.py +++ b/examples/display_text_anchored_position.py @@ -16,23 +16,23 @@ text_area_top_middle = label.Label(terminalio.FONT, text=TEXT) text_area_top_middle.anchor_point = (0.5, 0.0) -text_area_top_middle.anchored_position = (DISPLAY_WIDTH/2, 10) +text_area_top_middle.anchored_position = (DISPLAY_WIDTH / 2, 10) text_area_top_right = label.Label(terminalio.FONT, text=TEXT) text_area_top_right.anchor_point = (1.0, 0.0) -text_area_top_right.anchored_position = (DISPLAY_WIDTH-10, 10) +text_area_top_right.anchored_position = (DISPLAY_WIDTH - 10, 10) text_area_middle_left = label.Label(terminalio.FONT, text=TEXT) text_area_middle_left.anchor_point = (0.0, 0.5) -text_area_middle_left.anchored_position = (10, DISPLAY_HEIGHT/2) +text_area_middle_left.anchored_position = (10, DISPLAY_HEIGHT / 2) text_area_middle_middle = label.Label(terminalio.FONT, text=TEXT) text_area_middle_middle.anchor_point = (0.5, 0.5) -text_area_middle_middle.anchored_position = (DISPLAY_WIDTH/2, DISPLAY_HEIGHT/2) +text_area_middle_middle.anchored_position = (DISPLAY_WIDTH / 2, DISPLAY_HEIGHT / 2) text_area_middle_right = label.Label(terminalio.FONT, text=TEXT) text_area_middle_right.anchor_point = (1.0, 0.5) -text_area_middle_right.anchored_position = (DISPLAY_WIDTH-10, DISPLAY_HEIGHT/2) +text_area_middle_right.anchored_position = (DISPLAY_WIDTH - 10, DISPLAY_HEIGHT / 2) text_area_bottom_left = label.Label(terminalio.FONT, text=TEXT) text_area_bottom_left.anchor_point = (0.0, 1.0) @@ -40,11 +40,11 @@ text_area_bottom_middle = label.Label(terminalio.FONT, text=TEXT) text_area_bottom_middle.anchor_point = (0.5, 1.0) -text_area_bottom_middle.anchored_position = (DISPLAY_WIDTH/2, DISPLAY_HEIGHT) +text_area_bottom_middle.anchored_position = (DISPLAY_WIDTH / 2, DISPLAY_HEIGHT) text_area_bottom_right = label.Label(terminalio.FONT, text=TEXT) text_area_bottom_right.anchor_point = (1.0, 1.0) -text_area_bottom_right.anchored_position = (DISPLAY_WIDTH-10, DISPLAY_HEIGHT) +text_area_bottom_right.anchored_position = (DISPLAY_WIDTH - 10, DISPLAY_HEIGHT) text_group = displayio.Group(max_size=9) text_group.append(text_area_top_middle) diff --git a/examples/display_text_background_color.py b/examples/display_text_background_color.py index 3f48b70..c7064f5 100644 --- a/examples/display_text_background_color.py +++ b/examples/display_text_background_color.py @@ -7,7 +7,9 @@ from adafruit_display_text import label text = " Color Background Hello world" -text_area = label.Label(terminalio.FONT, text=text, color=0x0000FF, background_color=0xFFAA00) +text_area = label.Label( + terminalio.FONT, text=text, color=0x0000FF, background_color=0xFFAA00 +) text_area.x = 10 text_area.y = 10 diff --git a/examples/display_text_pyportal.py b/examples/display_text_pyportal.py index 9f40a52..784c97d 100644 --- a/examples/display_text_pyportal.py +++ b/examples/display_text_pyportal.py @@ -11,7 +11,9 @@ from adafruit_bitmap_font import bitmap_font from adafruit_display_text.label import Label -fonts = list(filter(lambda x: x.endswith("bdf") and not x.startswith("."), os.listdir("/"))) +fonts = list( + filter(lambda x: x.endswith("bdf") and not x.startswith("."), os.listdir("/")) +) fonts = [bitmap_font.load_font(x) for x in fonts] print("fade up") diff --git a/examples/display_text_textarea_boundingbox.py b/examples/display_text_textarea_boundingbox.py index ce6e1fd..7978abb 100644 --- a/examples/display_text_textarea_boundingbox.py +++ b/examples/display_text_textarea_boundingbox.py @@ -5,11 +5,14 @@ from adafruit_bitmap_font import bitmap_font # the current working directory (where this file is) -cwd = ("/"+__file__).rsplit('/', 1)[0] -fonts = [file for file in os.listdir(cwd+"/fonts/") - if (file.endswith(".bdf") and not file.startswith("._"))] +cwd = ("/" + __file__).rsplit("/", 1)[0] +fonts = [ + file + for file in os.listdir(cwd + "/fonts/") + if (file.endswith(".bdf") and not file.startswith("._")) +] for i, filename in enumerate(fonts): - fonts[i] = cwd+"/fonts/"+filename + fonts[i] = cwd + "/fonts/" + filename print(fonts) ########################################################################## @@ -26,14 +29,12 @@ color_bitmap = displayio.Bitmap(320, 240, 1) color_palette = displayio.Palette(1) color_palette[0] = 0xFFFFFF -bg_sprite = displayio.TileGrid(color_bitmap, - pixel_shader=color_palette, - x=0, y=0) +bg_sprite = displayio.TileGrid(color_bitmap, pixel_shader=color_palette, x=0, y=0) splash.append(bg_sprite) # Load the font font = bitmap_font.load_font(THE_FONT) -font.load_glyphs(DISPLAY_STRING.encode('utf-8')) +font.load_glyphs(DISPLAY_STRING.encode("utf-8")) print(DISPLAY_STRING) @@ -48,9 +49,9 @@ textbg_bitmap = displayio.Bitmap(dims[2], dims[3], 1) textbg_palette = displayio.Palette(1) textbg_palette[0] = 0xFF0000 -textbg_sprite = displayio.TileGrid(textbg_bitmap, - pixel_shader=textbg_palette, - x=text.x+dims[0], y=text.y+dims[1]) +textbg_sprite = displayio.TileGrid( + textbg_bitmap, pixel_shader=textbg_palette, x=text.x + dims[0], y=text.y + dims[1] +) splash.append(textbg_sprite) splash.append(text) try: