adafruit-circuitpython-qualia 2.1.2__tar.gz → 2.2.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. {adafruit_circuitpython_qualia-2.1.2 → adafruit_circuitpython_qualia-2.2.0}/PKG-INFO +1 -1
  2. {adafruit_circuitpython_qualia-2.1.2 → adafruit_circuitpython_qualia-2.2.0}/adafruit_circuitpython_qualia.egg-info/PKG-INFO +1 -1
  3. {adafruit_circuitpython_qualia-2.1.2 → adafruit_circuitpython_qualia-2.2.0}/adafruit_circuitpython_qualia.egg-info/SOURCES.txt +1 -0
  4. {adafruit_circuitpython_qualia-2.1.2 → adafruit_circuitpython_qualia-2.2.0}/adafruit_qualia/__init__.py +1 -1
  5. {adafruit_circuitpython_qualia-2.1.2 → adafruit_circuitpython_qualia-2.2.0}/adafruit_qualia/displays/__init__.py +80 -3
  6. {adafruit_circuitpython_qualia-2.1.2 → adafruit_circuitpython_qualia-2.2.0}/adafruit_qualia/graphics.py +12 -2
  7. {adafruit_circuitpython_qualia-2.1.2 → adafruit_circuitpython_qualia-2.2.0}/adafruit_qualia/network.py +1 -1
  8. {adafruit_circuitpython_qualia-2.1.2 → adafruit_circuitpython_qualia-2.2.0}/adafruit_qualia/peripherals.py +1 -1
  9. adafruit_circuitpython_qualia-2.2.0/docs/_static/custom.css +8 -0
  10. {adafruit_circuitpython_qualia-2.1.2 → adafruit_circuitpython_qualia-2.2.0}/docs/conf.py +3 -0
  11. {adafruit_circuitpython_qualia-2.1.2 → adafruit_circuitpython_qualia-2.2.0}/pyproject.toml +1 -1
  12. {adafruit_circuitpython_qualia-2.1.2 → adafruit_circuitpython_qualia-2.2.0}/ruff.toml +0 -1
  13. {adafruit_circuitpython_qualia-2.1.2 → adafruit_circuitpython_qualia-2.2.0}/.gitattributes +0 -0
  14. {adafruit_circuitpython_qualia-2.1.2 → adafruit_circuitpython_qualia-2.2.0}/.github/PULL_REQUEST_TEMPLATE/adafruit_circuitpython_pr.md +0 -0
  15. {adafruit_circuitpython_qualia-2.1.2 → adafruit_circuitpython_qualia-2.2.0}/.github/workflows/build.yml +0 -0
  16. {adafruit_circuitpython_qualia-2.1.2 → adafruit_circuitpython_qualia-2.2.0}/.github/workflows/failure-help-text.yml +0 -0
  17. {adafruit_circuitpython_qualia-2.1.2 → adafruit_circuitpython_qualia-2.2.0}/.github/workflows/release_gh.yml +0 -0
  18. {adafruit_circuitpython_qualia-2.1.2 → adafruit_circuitpython_qualia-2.2.0}/.github/workflows/release_pypi.yml +0 -0
  19. {adafruit_circuitpython_qualia-2.1.2 → adafruit_circuitpython_qualia-2.2.0}/.gitignore +0 -0
  20. {adafruit_circuitpython_qualia-2.1.2 → adafruit_circuitpython_qualia-2.2.0}/.pre-commit-config.yaml +0 -0
  21. {adafruit_circuitpython_qualia-2.1.2 → adafruit_circuitpython_qualia-2.2.0}/.readthedocs.yaml +0 -0
  22. {adafruit_circuitpython_qualia-2.1.2 → adafruit_circuitpython_qualia-2.2.0}/CODE_OF_CONDUCT.md +0 -0
  23. {adafruit_circuitpython_qualia-2.1.2 → adafruit_circuitpython_qualia-2.2.0}/LICENSE +0 -0
  24. {adafruit_circuitpython_qualia-2.1.2 → adafruit_circuitpython_qualia-2.2.0}/LICENSES/CC-BY-4.0.txt +0 -0
  25. {adafruit_circuitpython_qualia-2.1.2 → adafruit_circuitpython_qualia-2.2.0}/LICENSES/MIT.txt +0 -0
  26. {adafruit_circuitpython_qualia-2.1.2 → adafruit_circuitpython_qualia-2.2.0}/LICENSES/Unlicense.txt +0 -0
  27. {adafruit_circuitpython_qualia-2.1.2 → adafruit_circuitpython_qualia-2.2.0}/README.rst +0 -0
  28. {adafruit_circuitpython_qualia-2.1.2 → adafruit_circuitpython_qualia-2.2.0}/README.rst.license +0 -0
  29. {adafruit_circuitpython_qualia-2.1.2 → adafruit_circuitpython_qualia-2.2.0}/adafruit_circuitpython_qualia.egg-info/dependency_links.txt +0 -0
  30. {adafruit_circuitpython_qualia-2.1.2 → adafruit_circuitpython_qualia-2.2.0}/adafruit_circuitpython_qualia.egg-info/requires.txt +0 -0
  31. {adafruit_circuitpython_qualia-2.1.2 → adafruit_circuitpython_qualia-2.2.0}/adafruit_circuitpython_qualia.egg-info/top_level.txt +0 -0
  32. {adafruit_circuitpython_qualia-2.1.2 → adafruit_circuitpython_qualia-2.2.0}/adafruit_qualia/displays/bar240x960.py +0 -0
  33. {adafruit_circuitpython_qualia-2.1.2 → adafruit_circuitpython_qualia-2.2.0}/adafruit_qualia/displays/bar320x820.py +0 -0
  34. {adafruit_circuitpython_qualia-2.1.2 → adafruit_circuitpython_qualia-2.2.0}/adafruit_qualia/displays/bar320x960.py +0 -0
  35. {adafruit_circuitpython_qualia-2.1.2 → adafruit_circuitpython_qualia-2.2.0}/adafruit_qualia/displays/round21.py +0 -0
  36. {adafruit_circuitpython_qualia-2.1.2 → adafruit_circuitpython_qualia-2.2.0}/adafruit_qualia/displays/round28.py +0 -0
  37. {adafruit_circuitpython_qualia-2.1.2 → adafruit_circuitpython_qualia-2.2.0}/adafruit_qualia/displays/round40.py +0 -0
  38. {adafruit_circuitpython_qualia-2.1.2 → adafruit_circuitpython_qualia-2.2.0}/adafruit_qualia/displays/square34.py +0 -0
  39. {adafruit_circuitpython_qualia-2.1.2 → adafruit_circuitpython_qualia-2.2.0}/adafruit_qualia/displays/square40.py +0 -0
  40. {adafruit_circuitpython_qualia-2.1.2 → adafruit_circuitpython_qualia-2.2.0}/adafruit_qualia/displays/square40_480x480.py +0 -0
  41. {adafruit_circuitpython_qualia-2.1.2 → adafruit_circuitpython_qualia-2.2.0}/docs/_static/favicon.ico +0 -0
  42. {adafruit_circuitpython_qualia-2.1.2 → adafruit_circuitpython_qualia-2.2.0}/docs/_static/favicon.ico.license +0 -0
  43. {adafruit_circuitpython_qualia-2.1.2 → adafruit_circuitpython_qualia-2.2.0}/docs/api.rst +0 -0
  44. {adafruit_circuitpython_qualia-2.1.2 → adafruit_circuitpython_qualia-2.2.0}/docs/api.rst.license +0 -0
  45. {adafruit_circuitpython_qualia-2.1.2 → adafruit_circuitpython_qualia-2.2.0}/docs/examples.rst +0 -0
  46. {adafruit_circuitpython_qualia-2.1.2 → adafruit_circuitpython_qualia-2.2.0}/docs/examples.rst.license +0 -0
  47. {adafruit_circuitpython_qualia-2.1.2 → adafruit_circuitpython_qualia-2.2.0}/docs/index.rst +0 -0
  48. {adafruit_circuitpython_qualia-2.1.2 → adafruit_circuitpython_qualia-2.2.0}/docs/index.rst.license +0 -0
  49. {adafruit_circuitpython_qualia-2.1.2 → adafruit_circuitpython_qualia-2.2.0}/docs/requirements.txt +0 -0
  50. {adafruit_circuitpython_qualia-2.1.2 → adafruit_circuitpython_qualia-2.2.0}/examples/qualia_paint.py +0 -0
  51. {adafruit_circuitpython_qualia-2.1.2 → adafruit_circuitpython_qualia-2.2.0}/examples/qualia_qrcode_generation.py +0 -0
  52. {adafruit_circuitpython_qualia-2.1.2 → adafruit_circuitpython_qualia-2.2.0}/examples/qualia_quotes.py +0 -0
  53. {adafruit_circuitpython_qualia-2.1.2 → adafruit_circuitpython_qualia-2.2.0}/examples/qualia_simpletest.py +0 -0
  54. {adafruit_circuitpython_qualia-2.1.2 → adafruit_circuitpython_qualia-2.2.0}/optional_requirements.txt +0 -0
  55. {adafruit_circuitpython_qualia-2.1.2 → adafruit_circuitpython_qualia-2.2.0}/requirements.txt +0 -0
  56. {adafruit_circuitpython_qualia-2.1.2 → adafruit_circuitpython_qualia-2.2.0}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: adafruit-circuitpython-qualia
3
- Version: 2.1.2
3
+ Version: 2.2.0
4
4
  Summary: Portal Style Library for the Adafruit Qualia ESP32-S3
5
5
  Author-email: Adafruit Industries <circuitpython@adafruit.com>
6
6
  License: MIT
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: adafruit-circuitpython-qualia
3
- Version: 2.1.2
3
+ Version: 2.2.0
4
4
  Summary: Portal Style Library for the Adafruit Qualia ESP32-S3
5
5
  Author-email: Adafruit Industries <circuitpython@adafruit.com>
6
6
  License: MIT
@@ -45,6 +45,7 @@ docs/examples.rst.license
45
45
  docs/index.rst
46
46
  docs/index.rst.license
47
47
  docs/requirements.txt
48
+ docs/_static/custom.css
48
49
  docs/_static/favicon.ico
49
50
  docs/_static/favicon.ico.license
50
51
  examples/qualia_paint.py
@@ -40,7 +40,7 @@ try:
40
40
  except ImportError:
41
41
  pass
42
42
 
43
- __version__ = "2.1.2"
43
+ __version__ = "2.2.0"
44
44
  __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Qualia.git"
45
45
 
46
46
 
@@ -31,6 +31,54 @@ TOUCH_CST826 = Adafruit_CST8XX
31
31
  TOUCH_INIT_DELAY = 0.1 # 100ms
32
32
 
33
33
 
34
+ class Touch:
35
+ """Simple passthrough touch class that allows rotation transformation"""
36
+
37
+ def __init__(self, touch_driver, display, rotation=0):
38
+ self._driver = touch_driver
39
+ self._width = display.width
40
+ self._height = display.height
41
+ self._rotation = rotation
42
+
43
+ def transform(self, x, y):
44
+ """Transform touch coordinates based on rotation"""
45
+ if self._rotation == 0:
46
+ return x, y
47
+ elif self._rotation == 90:
48
+ return y, self._height - x
49
+ elif self._rotation == 180:
50
+ return self._width - x, self._height - y
51
+ elif self._rotation == 270:
52
+ return self._width - y, x
53
+ else:
54
+ raise ValueError("Rotation must be 0, 90, 180, or 270")
55
+
56
+ @property
57
+ def rotation(self):
58
+ """Return the rotation"""
59
+ return self._rotation
60
+
61
+ @rotation.setter
62
+ def rotation(self, value):
63
+ """Set the rotation"""
64
+ if value not in {0, 90, 180, 270}:
65
+ raise ValueError("Rotation must be 0, 90, 180, or 270")
66
+ self._rotation = value
67
+
68
+ @property
69
+ def touches(self):
70
+ """Return the number of touches"""
71
+ touches = self._driver.touches
72
+ for touch in touches:
73
+ touch["x"], touch["y"] = self.transform(touch["x"], touch["y"])
74
+ return touches
75
+
76
+ @property
77
+ def touched(self):
78
+ """Return whether the screen is touched"""
79
+ return self._driver.touched
80
+
81
+
34
82
  class DotClockDisplay:
35
83
  """DotClock Display Base Class for the Adafruit Qualia ESP32-S3 Library"""
36
84
 
@@ -43,7 +91,7 @@ class DotClockDisplay:
43
91
  self._touch_driver = TOUCH_FOCALTOUCH
44
92
  self._touch_address = 0x38
45
93
  self.display = None
46
- self.touch = None
94
+ self._touch = None
47
95
  self._i2c = None
48
96
  self._round = False
49
97
 
@@ -73,9 +121,14 @@ class DotClockDisplay:
73
121
  self._i2c = busio.I2C(board.SCL, board.SDA)
74
122
  time.sleep(TOUCH_INIT_DELAY) # Wait for Focaltouch Chip to finish resetting
75
123
  try:
76
- self.touch = self._touch_driver(self._i2c, self._touch_address)
124
+ self._touch = Touch(self._touch_driver(self._i2c, self._touch_address), self.display)
125
+
77
126
  except (RuntimeError, ValueError):
78
- self.touch = None
127
+ self._touch = None
128
+
129
+ def _transform_touch(self, x, y):
130
+ """Transform touch coordinates if needed"""
131
+ return x, y
79
132
 
80
133
  @property
81
134
  def width(self):
@@ -102,3 +155,27 @@ class DotClockDisplay:
102
155
  def round(self):
103
156
  """Return whether the display is circular"""
104
157
  return self._round
158
+
159
+ @property
160
+ def rotation(self):
161
+ """Return the display touch rotation"""
162
+ display_rotation = self.display.rotation if self.display is not None else 0
163
+ touch_rotation = self._touch.rotation if self._touch is not None else 0
164
+ if display_rotation != touch_rotation:
165
+ raise ValueError("Display and touch rotation do not match")
166
+ return self._touch.rotation
167
+
168
+ @rotation.setter
169
+ def rotation(self, value: int):
170
+ """Set the display rotation"""
171
+ if value not in {0, 90, 180, 270}:
172
+ raise ValueError("Rotation must be 0, 90, 180, or 270")
173
+ self._touch.rotation = value
174
+ # Update the display rotation if already initialized
175
+ if self.display is not None:
176
+ self.display.rotation = value
177
+
178
+ @property
179
+ def touch(self):
180
+ """Return the touch driver"""
181
+ return self._touch
@@ -31,7 +31,7 @@ import os
31
31
 
32
32
  from adafruit_portalbase.graphics import GraphicsBase
33
33
 
34
- __version__ = "2.1.2"
34
+ __version__ = "2.2.0"
35
35
  __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Qualia.git"
36
36
 
37
37
 
@@ -90,7 +90,7 @@ class Graphics(GraphicsBase):
90
90
  scale=scale,
91
91
  debug=debug,
92
92
  )
93
- self.display.rotation = rotation
93
+ self._dotclock_display.rotation = rotation
94
94
 
95
95
  def init_display(self, display_type: str, *, auto_refresh: bool = True):
96
96
  """Load the Display Class, then initialize the display and touch driver"""
@@ -134,3 +134,13 @@ class Graphics(GraphicsBase):
134
134
  def dotclockdisplay(self):
135
135
  """Return the dotclock display object"""
136
136
  return self._dotclock_display
137
+
138
+ @property
139
+ def rotation(self):
140
+ """Return the rotation"""
141
+ return self._dotclock_display.rotation
142
+
143
+ @rotation.setter
144
+ def rotation(self, value):
145
+ """Set the rotation"""
146
+ self._dotclock_display.rotation = value
@@ -40,7 +40,7 @@ try:
40
40
  except ImportError:
41
41
  pass
42
42
 
43
- __version__ = "2.1.2"
43
+ __version__ = "2.2.0"
44
44
  __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Qualia.git"
45
45
 
46
46
  IO_MQTT_BROKER = "io.adafruit.com"
@@ -35,7 +35,7 @@ import board
35
35
  import busio
36
36
  from digitalio import Pull
37
37
 
38
- __version__ = "2.1.2"
38
+ __version__ = "2.2.0"
39
39
  __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_Qualia.git"
40
40
 
41
41
 
@@ -0,0 +1,8 @@
1
+ /* SPDX-FileCopyrightText: 2025 Sam Blenny
2
+ * SPDX-License-Identifier: MIT
3
+ */
4
+
5
+ /* Monkey patch the rtd theme to prevent horizontal stacking of short items
6
+ * see https://github.com/readthedocs/sphinx_rtd_theme/issues/1301
7
+ */
8
+ .py.property{display: block !important;}
@@ -125,6 +125,9 @@ html_theme = "sphinx_rtd_theme"
125
125
  # so a file named "default.css" will overwrite the builtin "default.css".
126
126
  html_static_path = ["_static"]
127
127
 
128
+ # Include extra css to work around rtd theme glitches
129
+ html_css_files = ["custom.css"]
130
+
128
131
  # The name of an image file (relative to this directory) to use as a favicon of
129
132
  # the docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
130
133
  # pixels large.
@@ -13,7 +13,7 @@ requires = [
13
13
  [project]
14
14
  name = "adafruit-circuitpython-qualia"
15
15
  description = "Portal Style Library for the Adafruit Qualia ESP32-S3"
16
- version = "2.1.2"
16
+ version = "2.2.0"
17
17
  readme = "README.rst"
18
18
  authors = [
19
19
  {name = "Adafruit Industries", email = "circuitpython@adafruit.com"}
@@ -17,7 +17,6 @@ extend-select = [
17
17
  "PLC2401", # non-ascii-name
18
18
  "PLC2801", # unnecessary-dunder-call
19
19
  "PLC3002", # unnecessary-direct-lambda-call
20
- "E999", # syntax-error
21
20
  "PLE0101", # return-in-init
22
21
  "F706", # return-outside-function
23
22
  "F704", # yield-outside-function