IS-Matrix-Forge 1.0.0.dev2__tar.gz → 1.0.0.dev5__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 (153) hide show
  1. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/PKG-INFO +52 -52
  2. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/README.md +46 -52
  3. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/__init__.py +1 -1
  4. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/assets/__init__.py +1 -1
  5. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/common/helpers/__init__.py +32 -0
  6. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/designer_gui/__init__.py +1 -1
  7. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/designer_gui/main_window/__init__.py +11 -3
  8. is_matrix_forge-1.0.0.dev2/is_matrix_forge/designer_gui/main_window/layout.py → is_matrix_forge-1.0.0.dev5/is_matrix_forge/designer_gui/main_window/layout/__init__.py +2 -6
  9. is_matrix_forge-1.0.0.dev5/is_matrix_forge/designer_gui/main_window/layout/button_grid/column.py +17 -0
  10. is_matrix_forge-1.0.0.dev5/is_matrix_forge/designer_gui/main_window/layout/button_grid/grid.py +15 -0
  11. is_matrix_forge-1.0.0.dev5/is_matrix_forge/designer_gui/main_window/streamlit_app.py +93 -0
  12. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/dev_tools/__init__.py +1 -1
  13. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/inputmodule/ledmatrix.py +0 -16
  14. is_matrix_forge-1.0.0.dev5/is_matrix_forge/led_matrix/Scripts/__init__.py +4 -0
  15. is_matrix_forge-1.0.0.dev5/is_matrix_forge/led_matrix/Scripts/identify_matrices.py +228 -0
  16. is_matrix_forge-1.0.0.dev5/is_matrix_forge/led_matrix/__init__.py +58 -0
  17. {is_matrix_forge-1.0.0.dev2/is_matrix_forge/led_matrix/helpers/core → is_matrix_forge-1.0.0.dev5/is_matrix_forge/led_matrix/commands}/__init__.py +3 -1
  18. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/constants.py +1 -0
  19. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/controller/__init__.py +2 -0
  20. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/controller/controller.py +75 -17
  21. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/animations/__init__.py +0 -1
  22. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/animations/animation.py +14 -2
  23. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/animations/effects/__init__.py +1 -1
  24. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/animations/errors.py +10 -0
  25. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/animations/font/__init__.py +1 -1
  26. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/animations/frame/__init__.py +1 -1
  27. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/animations/frame/base.py +1 -1
  28. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/effects/__init__.py +1 -1
  29. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/effects/breather.py +27 -11
  30. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/grid/presets/__init__.py +1 -1
  31. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/helpers/__init__.py +7 -1
  32. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/helpers/columns.py +1 -1
  33. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/media.py +1 -2
  34. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/patterns/built_in/__init__.py +1 -1
  35. is_matrix_forge-1.0.0.dev5/is_matrix_forge/led_matrix/display/patterns/built_in/commands.py +3 -0
  36. is_matrix_forge-1.0.0.dev5/is_matrix_forge/led_matrix/display/patterns/built_in/constants.py +3 -0
  37. is_matrix_forge-1.0.0.dev2/is_matrix_forge/led_matrix/display/patterns/built_in/constants.py → is_matrix_forge-1.0.0.dev5/is_matrix_forge/led_matrix/display/patterns/built_in/stencils/res.py +39 -4
  38. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/text/__init__.py +1 -1
  39. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/text/scroller.py +22 -0
  40. is_matrix_forge-1.0.0.dev5/is_matrix_forge/led_matrix/hardware.py +271 -0
  41. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/helpers/__init__.py +5 -1
  42. is_matrix_forge-1.0.0.dev5/is_matrix_forge/led_matrix/helpers/core/__init__.py +17 -0
  43. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/tools/__init__.py +1 -1
  44. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/utils/__init__.py +1 -1
  45. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/monitor/gui/layout/__init__.py +1 -1
  46. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/monitor/monitor.py +3 -2
  47. is_matrix_forge-1.0.0.dev5/is_matrix_forge/notify/__init__.py +0 -0
  48. is_matrix_forge-1.0.0.dev5/is_matrix_forge/scripts/__init__.py +1 -0
  49. is_matrix_forge-1.0.0.dev5/is_matrix_forge/scripts/preset_installer.py +184 -0
  50. is_matrix_forge-1.0.0.dev5/is_matrix_forge/serial_com/__init__.py +1 -0
  51. is_matrix_forge-1.0.0.dev5/is_matrix_forge/serial_com/base/__init__.py +18 -0
  52. is_matrix_forge-1.0.0.dev5/is_matrix_forge/serial_com/base/answer.py +12 -0
  53. is_matrix_forge-1.0.0.dev5/is_matrix_forge/serial_com/base/message.py +13 -0
  54. is_matrix_forge-1.0.0.dev5/is_matrix_forge/serial_com/base/request.py +8 -0
  55. is_matrix_forge-1.0.0.dev5/is_matrix_forge/serial_com/exchange.py +47 -0
  56. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/pyproject.toml +17 -17
  57. is_matrix_forge-1.0.0.dev2/is_matrix_forge/led_matrix/Scripts/__init__.py +0 -4
  58. is_matrix_forge-1.0.0.dev2/is_matrix_forge/led_matrix/__init__.py +0 -7
  59. is_matrix_forge-1.0.0.dev2/is_matrix_forge/led_matrix/commands/__init__.py +0 -84
  60. is_matrix_forge-1.0.0.dev2/is_matrix_forge/led_matrix/display/patterns/__init__.py +0 -59
  61. is_matrix_forge-1.0.0.dev2/is_matrix_forge/led_matrix/display/patterns/built_in/commands.py +0 -3
  62. is_matrix_forge-1.0.0.dev2/is_matrix_forge/led_matrix/display/patterns/utils.py +0 -2
  63. is_matrix_forge-1.0.0.dev2/is_matrix_forge/led_matrix/hardware.py +0 -172
  64. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/LICENSE.md +0 -0
  65. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/assets/audio/__init__.py +0 -0
  66. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/assets/audio/files/__init__.py +0 -0
  67. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/assets/audio/files/plugged.wav +0 -0
  68. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/assets/audio/files/unplugged.wav +0 -0
  69. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/assets/char_map.json +0 -0
  70. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/assets/font_map.py +0 -0
  71. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/common/__init__.py +0 -0
  72. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/common/decorators/__init__.py +0 -0
  73. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/common/dirs.py +0 -0
  74. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/common/helpers/github_api.py +0 -0
  75. {is_matrix_forge-1.0.0.dev2/is_matrix_forge/monitor/gui → is_matrix_forge-1.0.0.dev5/is_matrix_forge/designer_gui/main_window/layout/button_grid}/__init__.py +0 -0
  76. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/dev_tools/debug.py +0 -0
  77. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/dev_tools/presets.py +0 -0
  78. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/inputmodule/__init__.py +0 -0
  79. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/inputmodule/b1display.py +0 -0
  80. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/inputmodule/c1minimal.py +0 -0
  81. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/inputmodule/font.py +0 -0
  82. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/inputmodule/helpers/__init__.py +0 -0
  83. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/Scripts/battery_monitor.py +0 -0
  84. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/Scripts/install_presets/__init__.py +0 -0
  85. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/Scripts/install_presets/arguments.py +0 -0
  86. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/Scripts/install_presets/main.py +0 -0
  87. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/commands/map.py +0 -0
  88. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/controller/helpers/__init__.py +0 -0
  89. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/controller/helpers/threading.py +0 -0
  90. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/controller/multiton.py +0 -0
  91. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/controller/threaded.py +0 -0
  92. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/__init__.py +0 -0
  93. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/animations/font/font.py +0 -0
  94. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/animations/font/map_builder.py +0 -0
  95. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/animations/frame/helpers.py +0 -0
  96. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/animations/keep_awake.py +0 -0
  97. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/animations/plugged.py +0 -0
  98. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/animations/text_scroller.py +0 -0
  99. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/effects/fade.py +0 -0
  100. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/effects/scroller/__init__.py +0 -0
  101. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/effects/scroller/base.py +0 -0
  102. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/effects/scroller/helpers.py +0 -0
  103. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/grid/__init__.py +0 -0
  104. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/grid/grid.py +0 -0
  105. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/grid/helpers.py +0 -0
  106. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/display/grid/presets/manifest.py +0 -0
  107. /is_matrix_forge-1.0.0.dev2/is_matrix_forge/led_matrix/display/patterns/built_in/stencils.py → /is_matrix_forge-1.0.0.dev5/is_matrix_forge/led_matrix/display/patterns/built_in/stencils/__init__.py +0 -0
  108. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/errors/__init__.py +0 -0
  109. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/errors/base.py +0 -0
  110. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/errors/grid.py +0 -0
  111. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/errors/matrix.py +0 -0
  112. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/errors/misc.py +0 -0
  113. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/fonts.py +0 -0
  114. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/helpers/core/lazy_mod_load.py +0 -0
  115. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/helpers/device.py +0 -0
  116. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/helpers/status_handler.py +0 -0
  117. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/helpers/stream/__init__.py +0 -0
  118. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/helpers/stream/errors.py +0 -0
  119. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/led_matrix.py +0 -0
  120. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/status.py +0 -0
  121. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/led_matrix/tools/identify.py +0 -0
  122. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/log_engine.py +0 -0
  123. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/monitor/__init__.py +0 -0
  124. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/monitor/errors.py +0 -0
  125. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/monitor/events.py +0 -0
  126. {is_matrix_forge-1.0.0.dev2/is_matrix_forge/monitor/gui/windows → is_matrix_forge-1.0.0.dev5/is_matrix_forge/monitor/gui}/__init__.py +0 -0
  127. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/monitor/gui/errors.py +0 -0
  128. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/monitor/gui/event/__init__.py +0 -0
  129. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/monitor/gui/event/collection.py +0 -0
  130. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/monitor/gui/event/errors.py +0 -0
  131. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/monitor/gui/event/event.py +0 -0
  132. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/monitor/gui/layout/base.py +0 -0
  133. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/monitor/gui/metaclasses/__init__.py +0 -0
  134. {is_matrix_forge-1.0.0.dev2/is_matrix_forge/notify → is_matrix_forge-1.0.0.dev5/is_matrix_forge/monitor/gui/windows}/__init__.py +0 -0
  135. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/monitor/gui/windows/base.py +0 -0
  136. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/monitor/gui/windows/main/__init__.py +0 -0
  137. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/monitor/gui/windows/main/layout.py +0 -0
  138. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/monitor/helpers.py +0 -0
  139. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/notify/sounds/__init__.py +0 -0
  140. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/notify/sounds/base.py +0 -0
  141. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/is_matrix_forge/progress.py +0 -0
  142. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/presets/blank.json +0 -0
  143. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/presets/manifest.json +0 -0
  144. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/presets/shock_face.json +0 -0
  145. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/presets/test1.json +0 -0
  146. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/presets/test2.json +0 -0
  147. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/presets/test3.json +0 -0
  148. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/presets/test4.json +0 -0
  149. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/presets/test5.json +0 -0
  150. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/presets/test6.json +0 -0
  151. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/presets/test7.json +0 -0
  152. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/presets/x_animation II.json +0 -0
  153. {is_matrix_forge-1.0.0.dev2 → is_matrix_forge-1.0.0.dev5}/presets/x_animation.json +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: IS-Matrix-Forge
3
- Version: 1.0.0.dev2
3
+ Version: 1.0.0.dev5
4
4
  Summary:
5
5
  License: MIT
6
6
  Keywords: led,matrix,framework,hardware
@@ -15,27 +15,42 @@ Provides-Extra: clipboard-support
15
15
  Requires-Dist: chime (>=0.7.0,<0.8.0)
16
16
  Requires-Dist: clipboard (>=0.0.4,<0.0.5) ; extra == "clipboard-support"
17
17
  Requires-Dist: easy-exit-calls (>=1.0.0.dev1,<2.0.0)
18
+ Requires-Dist: imapclient (==3.0.1)
18
19
  Requires-Dist: inspy-logger (>=3.2.3,<4.0.0)
19
20
  Requires-Dist: inspyre-toolbox (>=1.6.0.dev23)
20
21
  Requires-Dist: opencv-python (>=4.11.0.86,<5.0.0.0)
21
22
  Requires-Dist: pillow (>=11.2.1,<12.0.0)
22
23
  Requires-Dist: pyserial (>=3.5,<4.0)
24
+ Requires-Dist: pysimplegui-4-foss (==4.60.4.1)
25
+ Requires-Dist: pysimpleguiweb (==0.39.0)
26
+ Project-URL: Homepage, https://github.com/Inspyre-Softworks/IS-Matrix-Forge
27
+ Project-URL: Repository, https://github.com/Inspyre-Softworks/IS-Matrix-Forge
23
28
  Description-Content-Type: text/markdown
24
29
 
25
- # LED Matrix Battery Monitor
30
+ [![PyPI version](https://img.shields.io/pypi/v/IS-Matrix-Forge)](https://pypi.org/project/IS-Matrix-Forge)
31
+ ![PyPI - Python Version](https://img.shields.io/pypi/pyversions/IS-Matrix-Forge)
26
32
 
27
- A Python application that displays your computer's battery status on an LED matrix display. The application monitors battery level and power state, providing visual feedback on an LED matrix and audio notifications when power is plugged or unplugged.
28
33
 
29
- ## Project Description and Purpose
34
+ # IS Matrix Forge
30
35
 
31
- The LED Matrix Battery Monitor is designed to provide a visual representation of your computer's battery status on an external LED matrix display. It serves as a convenient way to monitor battery levels without having to check your computer's status bar, especially useful for setups where the status bar might not be visible or when you want a more noticeable indicator.
36
+ **IS Matrix Forge** is a Python framework for creating applications that drive
37
+ 9×34 LED matrix displays. It provides high level helpers for talking to the
38
+ hardware, tools for building animations, and utilities such as progress bars and
39
+ a battery monitor.
32
40
 
33
- Key features:
34
- - Real-time battery level display on an LED matrix
35
- - Visual animations when power is plugged in
36
- - Audio notifications when power state changes (plugged/unplugged)
37
- - Configurable checking intervals
38
- - Support for multiple LED matrices
41
+ ## Project Overview
42
+
43
+ Matrix Forge grew out of the LED Matrix Battery Monitor project. The goal is to
44
+ make it easy to create rich LED matrix experiences from Python. In addition to
45
+ monitoring the battery, you can design custom frames, display scrolling text,
46
+ run animations, and integrate the LED matrix with your own applications.
47
+
48
+ Highlighted features include:
49
+ - Device discovery and control via `pyserial`
50
+ - Drawing grids and patterns with the `Grid` class
51
+ - Built-in and custom animations
52
+ - Progress bars that render on the matrix
53
+ - A battery monitor example using these building blocks
39
54
 
40
55
  ## Hardware Requirements
41
56
 
@@ -67,8 +82,8 @@ This project requires Python 3.12 or newer and the following dependencies:
67
82
 
68
83
  1. Clone the repository:
69
84
  ```
70
- git clone https://github.com/Inspyre-Softworks/led-matrix-battery.git
71
- cd led-matrix-battery
85
+ git clone https://github.com/Inspyre-Softworks/IS-Matrix-Forge.git
86
+ cd IS-Matrix-Forge
72
87
  ```
73
88
 
74
89
  2. Install dependencies using Poetry:
@@ -85,8 +100,8 @@ This project requires Python 3.12 or newer and the following dependencies:
85
100
 
86
101
  1. Clone the repository:
87
102
  ```
88
- git clone https://github.com/Inspyre-Softworks/led-matrix-battery.git
89
- cd led-matrix-battery
103
+ git clone https://github.com/Inspyre-Softworks/IS-Matrix-Forge.git
104
+ cd IS-Matrix-Forge
90
105
  ```
91
106
 
92
107
  2. Install the package:
@@ -96,60 +111,43 @@ This project requires Python 3.12 or newer and the following dependencies:
96
111
 
97
112
  ## Usage Examples
98
113
 
99
- ### Basic Usage
100
-
101
- To start monitoring your battery with default settings:
114
+ ### Identify Connected Devices
102
115
 
103
116
  ```python
104
- from is_matrix_forge.monitor import run_power_monitor
105
117
  from is_matrix_forge.led_matrix.helpers.device import DEVICES
106
118
 
107
- # Get the first available LED matrix device
108
- device = DEVICES[0]
109
-
110
- # Start monitoring with default settings
111
- run_power_monitor(device)
119
+ for dev in DEVICES:
120
+ print(dev)
112
121
  ```
113
122
 
114
- ### Custom Configuration
115
-
116
- To customize the monitoring behavior:
123
+ ### Display Text on the Matrix
117
124
 
118
125
  ```python
119
- from is_matrix_forge.monitor import run_power_monitor
126
+ from is_matrix_forge.led_matrix.controller.controller import LEDMatrixController
120
127
  from is_matrix_forge.led_matrix.helpers.device import DEVICES
121
- from pathlib import Path
122
128
 
123
- # Get the first available LED matrix device
124
- device = DEVICES[0]
125
-
126
- # Custom sound files
127
- plugged_sound = Path("path/to/custom_plugged_sound.wav")
128
- unplugged_sound = Path("path/to/custom_unplugged_sound.wav")
129
-
130
- # Start monitoring with custom settings
131
- run_power_monitor(
132
- device,
133
- battery_check_interval=10, # Check every 10 seconds
134
- plugged_alert=plugged_sound,
135
- unplugged_alert=unplugged_sound
136
- )
129
+ ctrl = LEDMatrixController(DEVICES[0])
130
+ ctrl.scroll_text("Hello World!", loop=False)
137
131
  ```
138
132
 
139
- ### Running in a Thread
133
+ ### Progress Bars
134
+
135
+ ```python
136
+ import time
137
+ from is_matrix_forge.progress import tqdm
138
+
139
+ for _ in tqdm(range(100)):
140
+ time.sleep(0.05)
141
+ ```
140
142
 
141
- To run the monitor in a background thread:
143
+ ### Battery Monitor Example
142
144
 
143
145
  ```python
144
- from is_matrix_forge.monitor import run_power_monitor_threaded
146
+ from is_matrix_forge.monitor import run_power_monitor
145
147
  from is_matrix_forge.led_matrix.helpers.device import DEVICES
146
148
 
147
- # Get the first available LED matrix device
148
149
  device = DEVICES[0]
149
-
150
- # Start monitoring in a background thread
151
- monitor = run_power_monitor_threaded(device)
152
- # ``monitor`` is a :class:`threading.Thread` instance
150
+ run_power_monitor(device)
153
151
  ```
154
152
 
155
153
  ## Troubleshooting
@@ -181,8 +179,10 @@ monitor = run_power_monitor_threaded(device)
181
179
 
182
180
  ## Contributing
183
181
 
184
- Contributions to the LED Matrix Battery Monitor are welcome! Please feel free to submit a Pull Request.
182
+ Contributions are welcome! If you have ideas or improvements for Matrix Forge,
183
+ feel free to open an issue or submit a pull request.
185
184
 
186
185
  ## License
187
186
 
188
187
  This project is licensed under the MIT License - see the LICENSE.md file for details.
188
+
@@ -1,17 +1,27 @@
1
- # LED Matrix Battery Monitor
1
+ [![PyPI version](https://img.shields.io/pypi/v/IS-Matrix-Forge)](https://pypi.org/project/IS-Matrix-Forge)
2
+ ![PyPI - Python Version](https://img.shields.io/pypi/pyversions/IS-Matrix-Forge)
2
3
 
3
- A Python application that displays your computer's battery status on an LED matrix display. The application monitors battery level and power state, providing visual feedback on an LED matrix and audio notifications when power is plugged or unplugged.
4
4
 
5
- ## Project Description and Purpose
5
+ # IS Matrix Forge
6
6
 
7
- The LED Matrix Battery Monitor is designed to provide a visual representation of your computer's battery status on an external LED matrix display. It serves as a convenient way to monitor battery levels without having to check your computer's status bar, especially useful for setups where the status bar might not be visible or when you want a more noticeable indicator.
7
+ **IS Matrix Forge** is a Python framework for creating applications that drive
8
+ 9×34 LED matrix displays. It provides high level helpers for talking to the
9
+ hardware, tools for building animations, and utilities such as progress bars and
10
+ a battery monitor.
8
11
 
9
- Key features:
10
- - Real-time battery level display on an LED matrix
11
- - Visual animations when power is plugged in
12
- - Audio notifications when power state changes (plugged/unplugged)
13
- - Configurable checking intervals
14
- - Support for multiple LED matrices
12
+ ## Project Overview
13
+
14
+ Matrix Forge grew out of the LED Matrix Battery Monitor project. The goal is to
15
+ make it easy to create rich LED matrix experiences from Python. In addition to
16
+ monitoring the battery, you can design custom frames, display scrolling text,
17
+ run animations, and integrate the LED matrix with your own applications.
18
+
19
+ Highlighted features include:
20
+ - Device discovery and control via `pyserial`
21
+ - Drawing grids and patterns with the `Grid` class
22
+ - Built-in and custom animations
23
+ - Progress bars that render on the matrix
24
+ - A battery monitor example using these building blocks
15
25
 
16
26
  ## Hardware Requirements
17
27
 
@@ -43,8 +53,8 @@ This project requires Python 3.12 or newer and the following dependencies:
43
53
 
44
54
  1. Clone the repository:
45
55
  ```
46
- git clone https://github.com/Inspyre-Softworks/led-matrix-battery.git
47
- cd led-matrix-battery
56
+ git clone https://github.com/Inspyre-Softworks/IS-Matrix-Forge.git
57
+ cd IS-Matrix-Forge
48
58
  ```
49
59
 
50
60
  2. Install dependencies using Poetry:
@@ -61,8 +71,8 @@ This project requires Python 3.12 or newer and the following dependencies:
61
71
 
62
72
  1. Clone the repository:
63
73
  ```
64
- git clone https://github.com/Inspyre-Softworks/led-matrix-battery.git
65
- cd led-matrix-battery
74
+ git clone https://github.com/Inspyre-Softworks/IS-Matrix-Forge.git
75
+ cd IS-Matrix-Forge
66
76
  ```
67
77
 
68
78
  2. Install the package:
@@ -72,60 +82,43 @@ This project requires Python 3.12 or newer and the following dependencies:
72
82
 
73
83
  ## Usage Examples
74
84
 
75
- ### Basic Usage
76
-
77
- To start monitoring your battery with default settings:
85
+ ### Identify Connected Devices
78
86
 
79
87
  ```python
80
- from is_matrix_forge.monitor import run_power_monitor
81
88
  from is_matrix_forge.led_matrix.helpers.device import DEVICES
82
89
 
83
- # Get the first available LED matrix device
84
- device = DEVICES[0]
85
-
86
- # Start monitoring with default settings
87
- run_power_monitor(device)
90
+ for dev in DEVICES:
91
+ print(dev)
88
92
  ```
89
93
 
90
- ### Custom Configuration
91
-
92
- To customize the monitoring behavior:
94
+ ### Display Text on the Matrix
93
95
 
94
96
  ```python
95
- from is_matrix_forge.monitor import run_power_monitor
97
+ from is_matrix_forge.led_matrix.controller.controller import LEDMatrixController
96
98
  from is_matrix_forge.led_matrix.helpers.device import DEVICES
97
- from pathlib import Path
98
99
 
99
- # Get the first available LED matrix device
100
- device = DEVICES[0]
101
-
102
- # Custom sound files
103
- plugged_sound = Path("path/to/custom_plugged_sound.wav")
104
- unplugged_sound = Path("path/to/custom_unplugged_sound.wav")
105
-
106
- # Start monitoring with custom settings
107
- run_power_monitor(
108
- device,
109
- battery_check_interval=10, # Check every 10 seconds
110
- plugged_alert=plugged_sound,
111
- unplugged_alert=unplugged_sound
112
- )
100
+ ctrl = LEDMatrixController(DEVICES[0])
101
+ ctrl.scroll_text("Hello World!", loop=False)
113
102
  ```
114
103
 
115
- ### Running in a Thread
104
+ ### Progress Bars
116
105
 
117
- To run the monitor in a background thread:
106
+ ```python
107
+ import time
108
+ from is_matrix_forge.progress import tqdm
109
+
110
+ for _ in tqdm(range(100)):
111
+ time.sleep(0.05)
112
+ ```
113
+
114
+ ### Battery Monitor Example
118
115
 
119
116
  ```python
120
- from is_matrix_forge.monitor import run_power_monitor_threaded
117
+ from is_matrix_forge.monitor import run_power_monitor
121
118
  from is_matrix_forge.led_matrix.helpers.device import DEVICES
122
119
 
123
- # Get the first available LED matrix device
124
120
  device = DEVICES[0]
125
-
126
- # Start monitoring in a background thread
127
- monitor = run_power_monitor_threaded(device)
128
- # ``monitor`` is a :class:`threading.Thread` instance
121
+ run_power_monitor(device)
129
122
  ```
130
123
 
131
124
  ## Troubleshooting
@@ -157,8 +150,9 @@ monitor = run_power_monitor_threaded(device)
157
150
 
158
151
  ## Contributing
159
152
 
160
- Contributions to the LED Matrix Battery Monitor are welcome! Please feel free to submit a Pull Request.
153
+ Contributions are welcome! If you have ideas or improvements for Matrix Forge,
154
+ feel free to open an issue or submit a pull request.
161
155
 
162
156
  ## License
163
157
 
164
- This project is licensed under the MIT License - see the LICENSE.md file for details.
158
+ This project is licensed under the MIT License - see the LICENSE.md file for details.
@@ -3,6 +3,6 @@ Author: Taylor B. tayjaybabee@gmail.com
3
3
  Date: 2025-04-15 09:15:25
4
4
  LastEditors: Taylor B. tayjaybabee@gmail.com
5
5
  LastEditTime: 2025-04-15 09:24:40
6
- FilePath: is_matrix_forge/__init__.py
6
+ FilePath: is_matrix_forge/grid.py
7
7
  Description: 这是默认设置,可以在设置》工具》File Description中进行配置
8
8
  """
@@ -3,6 +3,6 @@ Author: Taylor B. tayjaybabee@gmail.com
3
3
  Date: 2025-04-15 09:15:37
4
4
  LastEditors: Taylor B. tayjaybabee@gmail.com
5
5
  LastEditTime: 2025-04-15 09:24:40
6
- FilePath: is_matrix_forge/assets/__init__.py
6
+ FilePath: is_matrix_forge/assets/grid.py
7
7
  Description: 这是默认设置,可以在设置》工具》File Description中进行配置
8
8
  """
@@ -3,6 +3,10 @@ from pathlib import Path
3
3
  from typing import Optional
4
4
  import requests
5
5
  from inspyre_toolbox.path_man import provision_path
6
+ from is_matrix_forge.log_engine import ROOT_LOGGER
7
+
8
+
9
+ MOD_LOGGER = ROOT_LOGGER.get_child(__name__)
6
10
 
7
11
 
8
12
  def download_presets():
@@ -24,9 +28,13 @@ def calculate_checksum(file_path):
24
28
  str:
25
29
  The SHA-256 checksum of the file.
26
30
  """
31
+ log = MOD_LOGGER.get_child('calculate_checksum')
32
+
27
33
  if not isinstance(file_path, Path):
28
34
  file_path = provision_path(file_path)
29
35
 
36
+ log.debug(f'Calculating checksum for file: {file_path}')
37
+
30
38
  sha256 = hashlib.sha256()
31
39
 
32
40
  with open(file_path, 'rb') as f:
@@ -78,6 +86,30 @@ def percentage_to_value(percent, max_value=255):
78
86
  return int(round(percent * max_value / 100))
79
87
 
80
88
 
89
+ def value_to_percentage(value, max_value=255):
90
+ """
91
+ Convert a value to its percentage representation relative to `max_value`.
92
+
93
+ Parameters:
94
+ value (int or float):
95
+ The value to convert.
96
+
97
+ max_value (int, optional):
98
+ The maximum possible value. Defaults to 255.
99
+
100
+ Returns:
101
+ float:
102
+ The percentage value between 0 and 100.
103
+ """
104
+ if not isinstance(value, (int, float)):
105
+ raise TypeError(f'value must be of type int or float, not {type(value)}')
106
+
107
+ if value < 0 or value > max_value:
108
+ raise ValueError(f'value must be between 0 and {max_value}, not {value}')
109
+
110
+ return (value / max_value) * 100
111
+
112
+
81
113
  def verify_checksum(remote_checksum, local_file_path):
82
114
  """
83
115
  Verify the checksum of a local file against a remote checksum.
@@ -3,6 +3,6 @@ Author: Taylor B. tayjaybabee@gmail.com
3
3
  Date: 2025-04-30 16:01:10
4
4
  LastEditors: Taylor B. tayjaybabee@gmail.com
5
5
  LastEditTime: 2025-04-30 16:01:49
6
- FilePath: is_matrix_forge/designer_gui/__init__.py
6
+ FilePath: is_matrix_forge/designer_gui/grid.py
7
7
  Description: 这是默认设置,可以在设置》工具》File Description中进行配置
8
8
  """
@@ -4,12 +4,15 @@ import PySimpleGUI as sg
4
4
  import copy
5
5
  import os
6
6
 
7
- from ...led_matrix.helpers.device import DEVICES
7
+ from is_matrix_forge.led_matrix.helpers.device import DEVICES
8
8
  from is_matrix_forge.led_matrix.display.animations.frame.base import Frame
9
9
  from is_matrix_forge.led_matrix.display.grid.helpers import is_valid_grid
10
10
  from is_matrix_forge.led_matrix.display.animations.frame.helpers import is_valid_frames
11
- from .layout import PixelGridLayout
12
- from is_matrix_forge.led_matrix import render_matrix
11
+ from is_matrix_forge.designer_gui.main_window.layout import PixelGridLayout
12
+ from is_matrix_forge.led_matrix.display.helpers import render_matrix
13
+
14
+
15
+ sg.theme('DarkTeal2')
13
16
 
14
17
 
15
18
  def _normalize(key: Any) -> str:
@@ -139,6 +142,7 @@ class PixelGrid:
139
142
  def _toggle_pixel(self, key: Tuple[int, int]) -> None:
140
143
  col, row = key
141
144
  new = 1 - self.grid[col][row]
145
+ print(f'Pixel {col},{row} toggled from {self.grid[col][row]} to {new}')
142
146
  self.grid = [[new if (c==col and r==row) else self.grid[c][r]
143
147
  for r in range(self.height)]
144
148
  for c in range(self.width)]
@@ -250,3 +254,7 @@ class PixelGrid:
250
254
 
251
255
  def _validate(self, grid: Any) -> bool:
252
256
  return is_valid_grid(grid, self.width, self.height)
257
+
258
+
259
+ if __name__ == '__main__':
260
+ PixelGrid().run()
@@ -1,5 +1,6 @@
1
1
  import PySimpleGUI as sg
2
2
  from typing import List, Tuple, Any
3
+ from is_matrix_forge.designer_gui.main_window.layout.button_grid.column import build_grid_frame
3
4
 
4
5
 
5
6
  class PixelGridLayout:
@@ -93,12 +94,7 @@ class PixelGridLayout:
93
94
  self.__button_list = value
94
95
 
95
96
  def build(self) -> List[List[Any]]:
96
- grid = [
97
- [sg.Button(' ', size=self.button_size, key=(col, row), pad=self.pad)
98
- for col in range(self.width)]
99
- for row in range(self.height)
100
- ]
101
- grid_column = sg.Column(grid)
97
+ grid_column = build_grid_frame(self.width, self.height, button_size=self.button_size, pad=self.pad)
102
98
 
103
99
  controls = [[sg.Button(btn)] for btn in self.button_list]
104
100
  control_column = sg.Column(controls, vertical_alignment='top')
@@ -0,0 +1,17 @@
1
+ import PySimpleGUI as sg
2
+
3
+
4
+ def build_grid_frame(num_cols=9, num_rows=34, button_size=(2,1), pad=(1,1)):
5
+ """Return a layout of 9 vertical columns (of 34 buttons each), side by side."""
6
+ return [
7
+ [
8
+ sg.Column(
9
+ [
10
+ [sg.Button(' ', key=(col, row), size=button_size, pad=pad)]
11
+ for row in range(num_rows)
12
+ ],
13
+ pad=(0,0)
14
+ )
15
+ for col in range(num_cols)
16
+ ]
17
+ ]
@@ -0,0 +1,15 @@
1
+ import PySimpleGUI as sg
2
+
3
+
4
+ def build_button_grid(num_cols, num_rows, button_size=(1, 1), pad=(1, 1)):
5
+ """
6
+ Returns a list of `num_cols` lists, each containing `num_rows` buttons.
7
+ So: 9 columns of 34 rows each.
8
+ """
9
+ return [
10
+ [sg.Button(' ', key=(col, row), size=button_size, pad=pad)]
11
+ for row in range(num_rows)
12
+ ],
13
+ for col in range(num_cols)
14
+ ]
15
+
@@ -0,0 +1,93 @@
1
+ import streamlit as st
2
+ import json
3
+ import copy
4
+
5
+ class Frame:
6
+ def __init__(self, grid, duration=1.0):
7
+ self.grid = grid
8
+ self.duration = duration
9
+
10
+ class PixelGridWeb:
11
+ def __init__(self, width=9, height=34):
12
+ self.width = width
13
+ self.height = height
14
+ if "frames" not in st.session_state:
15
+ st.session_state.frames = [Frame(self._new_grid())]
16
+ if "current_frame" not in st.session_state:
17
+ st.session_state.current_frame = 0
18
+
19
+ def _new_grid(self):
20
+ return [[0 for _ in range(self.height)] for _ in range(self.width)]
21
+
22
+ @property
23
+ def frames(self):
24
+ return st.session_state.frames
25
+
26
+ @frames.setter
27
+ def frames(self, value):
28
+ st.session_state.frames = value
29
+
30
+ @property
31
+ def current_frame(self):
32
+ return st.session_state.current_frame
33
+
34
+ @current_frame.setter
35
+ def current_frame(self, value):
36
+ st.session_state.current_frame = value
37
+
38
+ @property
39
+ def grid(self):
40
+ return self.frames[self.current_frame].grid
41
+
42
+ def draw(self):
43
+ st.title("PixelGrid Animator")
44
+ st.write(f"Frame {self.current_frame+1}/{len(self.frames)}")
45
+ # Render grid
46
+ grid = self.grid
47
+ for row in range(self.height):
48
+ cols = st.columns(self.width)
49
+ for col in range(self.width):
50
+ key = f"pix_{col}_{row}_{self.current_frame}"
51
+ is_on = grid[col][row]
52
+ label = "🟩" if is_on else "⬛"
53
+ if cols[col].button(label, key=key, use_container_width=True):
54
+ grid[col][row] ^= 1 # Toggle
55
+
56
+ # Frame controls
57
+ c1, c2, c3, c4 = st.columns(4)
58
+ if c1.button("Prev", disabled=self.current_frame == 0):
59
+ self.current_frame -= 1
60
+ if c2.button("Next", disabled=self.current_frame == len(self.frames)-1):
61
+ self.current_frame += 1
62
+ if c3.button("Add Frame"):
63
+ self.frames.append(Frame(copy.deepcopy(self.grid)))
64
+ self.current_frame = len(self.frames) - 1
65
+ if c4.button("Delete Frame", disabled=len(self.frames) == 1):
66
+ self.frames.pop(self.current_frame)
67
+ self.current_frame = max(0, self.current_frame-1)
68
+ # Export/import
69
+ st.markdown("---")
70
+ exp1, exp2, exp3 = st.columns(3)
71
+ if exp1.button("Export JSON"):
72
+ st.download_button(
73
+ "Download JSON",
74
+ data=json.dumps([f.grid for f in self.frames]),
75
+ file_name="frames.json",
76
+ mime="application/json"
77
+ )
78
+ uploaded = exp2.file_uploader("Load JSON", type="json")
79
+ if uploaded:
80
+ data = json.load(uploaded)
81
+ if isinstance(data, list) and all(isinstance(frame, list) for frame in data):
82
+ self.frames = [Frame(copy.deepcopy(g)) for g in data]
83
+ self.current_frame = 0
84
+ # Placeholder for "Send to Matrix"
85
+ if exp3.button("Send to Matrix"):
86
+ st.info("This would send to your matrix (not implemented here)!")
87
+
88
+ def main():
89
+ pg = PixelGridWeb()
90
+ pg.draw()
91
+
92
+ if __name__ == "__main__":
93
+ main()
@@ -3,6 +3,6 @@ Author: Taylor B. tayjaybabee@gmail.com
3
3
  Date: 2025-05-05 15:02:58
4
4
  LastEditors: Taylor B. tayjaybabee@gmail.com
5
5
  LastEditTime: 2025-05-05 15:24:08
6
- FilePath: is_matrix_forge/dev_tools/__init__.py
6
+ FilePath: is_matrix_forge/dev_tools/grid.py
7
7
  Description: 这是默认设置,可以在设置》工具》File Description中进行配置
8
8
  """
@@ -40,22 +40,6 @@ PWM_FREQUENCIES = [
40
40
  ]
41
41
 
42
42
 
43
- def get_pwm_freq(dev):
44
- """Adjust the brightness scaling of the entire screen."""
45
- res = send_command(dev, CommandVals.PwmFreq, with_response=True)
46
- freq = int(res[0])
47
- if freq == 0:
48
- return 29000
49
- elif freq == 1:
50
- return 3600
51
- elif freq == 2:
52
- return 1800
53
- elif freq == 3:
54
- return 900
55
- else:
56
- return None
57
-
58
-
59
43
  def percentage(dev, p):
60
44
  """Fill a percentage of the screen. Bottom to top"""
61
45
  send_command(dev, CommandVals.Pattern, [PatternVals.Percentage, p])
@@ -0,0 +1,4 @@
1
+ """
2
+ Fake `grid.py` to make the Scripts directory a sub-package.
3
+ """
4
+