IS-Matrix-Forge 1.0.0.dev4__tar.gz → 1.0.0.dev6__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.dev4 → is_matrix_forge-1.0.0.dev6}/PKG-INFO +50 -52
  2. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/README.md +42 -52
  3. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/__init__.py +1 -1
  4. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/assets/__init__.py +1 -1
  5. is_matrix_forge-1.0.0.dev6/is_matrix_forge/common/decorators/__init__.py +12 -0
  6. is_matrix_forge-1.0.0.dev4/is_matrix_forge/common/decorators/__init__.py → is_matrix_forge-1.0.0.dev6/is_matrix_forge/common/decorators/freeze_setter.py +2 -12
  7. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/designer_gui/__init__.py +1 -1
  8. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/designer_gui/main_window/__init__.py +11 -3
  9. is_matrix_forge-1.0.0.dev4/is_matrix_forge/designer_gui/main_window/layout.py → is_matrix_forge-1.0.0.dev6/is_matrix_forge/designer_gui/main_window/layout/__init__.py +2 -6
  10. is_matrix_forge-1.0.0.dev6/is_matrix_forge/designer_gui/main_window/layout/button_grid/column.py +17 -0
  11. is_matrix_forge-1.0.0.dev6/is_matrix_forge/designer_gui/main_window/layout/button_grid/grid.py +15 -0
  12. is_matrix_forge-1.0.0.dev6/is_matrix_forge/designer_gui/main_window/streamlit_app.py +93 -0
  13. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/dev_tools/__init__.py +1 -1
  14. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/inputmodule/ledmatrix.py +0 -16
  15. is_matrix_forge-1.0.0.dev6/is_matrix_forge/led_matrix/Scripts/__init__.py +4 -0
  16. is_matrix_forge-1.0.0.dev6/is_matrix_forge/led_matrix/Scripts/identify_matrices.py +228 -0
  17. is_matrix_forge-1.0.0.dev6/is_matrix_forge/led_matrix/__init__.py +58 -0
  18. {is_matrix_forge-1.0.0.dev4/is_matrix_forge/led_matrix/helpers/core → is_matrix_forge-1.0.0.dev6/is_matrix_forge/led_matrix/commands}/__init__.py +3 -1
  19. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/led_matrix/controller/__init__.py +2 -0
  20. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/led_matrix/controller/controller.py +123 -29
  21. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/led_matrix/display/animations/__init__.py +10 -1
  22. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/led_matrix/display/animations/animation.py +1 -1
  23. is_matrix_forge-1.0.0.dev6/is_matrix_forge/led_matrix/display/animations/audio_visualizer.py +124 -0
  24. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/led_matrix/display/animations/effects/__init__.py +1 -1
  25. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/led_matrix/display/animations/font/__init__.py +1 -1
  26. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/led_matrix/display/effects/__init__.py +1 -1
  27. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/led_matrix/display/effects/breather.py +13 -29
  28. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/led_matrix/display/grid/grid.py +43 -8
  29. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/led_matrix/display/grid/presets/__init__.py +1 -1
  30. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/led_matrix/display/helpers/__init__.py +8 -27
  31. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/led_matrix/display/media.py +1 -2
  32. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/led_matrix/display/patterns/built_in/commands.py +1 -1
  33. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/led_matrix/display/patterns/built_in/stencils/res.py +1 -1
  34. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/led_matrix/display/text/__init__.py +1 -1
  35. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/led_matrix/display/text/scroller.py +22 -0
  36. is_matrix_forge-1.0.0.dev6/is_matrix_forge/led_matrix/hardware.py +271 -0
  37. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/led_matrix/helpers/__init__.py +3 -0
  38. is_matrix_forge-1.0.0.dev6/is_matrix_forge/led_matrix/helpers/core/__init__.py +17 -0
  39. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/led_matrix/helpers/device.py +1 -0
  40. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/led_matrix/tools/__init__.py +1 -1
  41. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/led_matrix/utils/__init__.py +1 -1
  42. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/monitor/gui/layout/__init__.py +1 -1
  43. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/monitor/gui/windows/main/__init__.py +1 -1
  44. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/monitor/monitor.py +3 -3
  45. is_matrix_forge-1.0.0.dev6/is_matrix_forge/notify/__init__.py +0 -0
  46. is_matrix_forge-1.0.0.dev6/is_matrix_forge/scripts/__init__.py +1 -0
  47. is_matrix_forge-1.0.0.dev6/is_matrix_forge/scripts/preset_installer.py +184 -0
  48. is_matrix_forge-1.0.0.dev6/is_matrix_forge/serial_com/__init__.py +1 -0
  49. is_matrix_forge-1.0.0.dev6/is_matrix_forge/serial_com/base/__init__.py +18 -0
  50. is_matrix_forge-1.0.0.dev6/is_matrix_forge/serial_com/base/answer.py +12 -0
  51. is_matrix_forge-1.0.0.dev6/is_matrix_forge/serial_com/base/message.py +13 -0
  52. is_matrix_forge-1.0.0.dev6/is_matrix_forge/serial_com/base/request.py +8 -0
  53. is_matrix_forge-1.0.0.dev6/is_matrix_forge/serial_com/exchange.py +47 -0
  54. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/pyproject.toml +21 -18
  55. is_matrix_forge-1.0.0.dev4/is_matrix_forge/led_matrix/Scripts/__init__.py +0 -4
  56. is_matrix_forge-1.0.0.dev4/is_matrix_forge/led_matrix/__init__.py +0 -7
  57. is_matrix_forge-1.0.0.dev4/is_matrix_forge/led_matrix/commands/__init__.py +0 -84
  58. is_matrix_forge-1.0.0.dev4/is_matrix_forge/led_matrix/display/patterns/utils.py +0 -2
  59. is_matrix_forge-1.0.0.dev4/is_matrix_forge/led_matrix/hardware.py +0 -134
  60. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/LICENSE.md +0 -0
  61. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/assets/audio/__init__.py +0 -0
  62. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/assets/audio/files/__init__.py +0 -0
  63. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/assets/audio/files/plugged.wav +0 -0
  64. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/assets/audio/files/unplugged.wav +0 -0
  65. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/assets/char_map.json +0 -0
  66. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/assets/font_map.py +0 -0
  67. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/common/__init__.py +0 -0
  68. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/common/dirs.py +0 -0
  69. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/common/helpers/__init__.py +0 -0
  70. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/common/helpers/github_api.py +0 -0
  71. {is_matrix_forge-1.0.0.dev4/is_matrix_forge/monitor/gui → is_matrix_forge-1.0.0.dev6/is_matrix_forge/designer_gui/main_window/layout/button_grid}/__init__.py +0 -0
  72. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/dev_tools/debug.py +0 -0
  73. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/dev_tools/presets.py +0 -0
  74. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/inputmodule/__init__.py +0 -0
  75. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/inputmodule/b1display.py +0 -0
  76. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/inputmodule/c1minimal.py +0 -0
  77. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/inputmodule/font.py +0 -0
  78. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/inputmodule/helpers/__init__.py +0 -0
  79. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/led_matrix/Scripts/battery_monitor.py +0 -0
  80. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/led_matrix/Scripts/install_presets/__init__.py +0 -0
  81. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/led_matrix/Scripts/install_presets/arguments.py +0 -0
  82. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/led_matrix/Scripts/install_presets/main.py +0 -0
  83. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/led_matrix/commands/map.py +0 -0
  84. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/led_matrix/constants.py +0 -0
  85. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/led_matrix/controller/helpers/__init__.py +0 -0
  86. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/led_matrix/controller/helpers/threading.py +0 -0
  87. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/led_matrix/controller/multiton.py +0 -0
  88. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/led_matrix/controller/threaded.py +0 -0
  89. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/led_matrix/display/__init__.py +0 -0
  90. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/led_matrix/display/animations/errors.py +0 -0
  91. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/led_matrix/display/animations/font/font.py +0 -0
  92. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/led_matrix/display/animations/font/map_builder.py +0 -0
  93. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/led_matrix/display/animations/frame/__init__.py +0 -0
  94. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/led_matrix/display/animations/frame/base.py +0 -0
  95. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/led_matrix/display/animations/frame/helpers.py +0 -0
  96. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/led_matrix/display/animations/keep_awake.py +0 -0
  97. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/led_matrix/display/animations/plugged.py +0 -0
  98. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/led_matrix/display/animations/text_scroller.py +0 -0
  99. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/led_matrix/display/effects/fade.py +0 -0
  100. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/led_matrix/display/effects/scroller/__init__.py +0 -0
  101. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/led_matrix/display/effects/scroller/base.py +0 -0
  102. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/led_matrix/display/effects/scroller/helpers.py +0 -0
  103. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/led_matrix/display/grid/__init__.py +0 -0
  104. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/led_matrix/display/grid/helpers.py +0 -0
  105. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/led_matrix/display/grid/presets/manifest.py +0 -0
  106. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/led_matrix/display/helpers/columns.py +0 -0
  107. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/led_matrix/display/patterns/built_in/__init__.py +0 -0
  108. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/led_matrix/display/patterns/built_in/constants.py +0 -0
  109. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/led_matrix/display/patterns/built_in/stencils/__init__.py +0 -0
  110. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/led_matrix/errors/__init__.py +0 -0
  111. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/led_matrix/errors/base.py +0 -0
  112. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/led_matrix/errors/grid.py +0 -0
  113. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/led_matrix/errors/matrix.py +0 -0
  114. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/led_matrix/errors/misc.py +0 -0
  115. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/led_matrix/fonts.py +0 -0
  116. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/led_matrix/helpers/core/lazy_mod_load.py +0 -0
  117. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/led_matrix/helpers/status_handler.py +0 -0
  118. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/led_matrix/helpers/stream/__init__.py +0 -0
  119. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/led_matrix/helpers/stream/errors.py +0 -0
  120. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/led_matrix/led_matrix.py +0 -0
  121. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/led_matrix/status.py +0 -0
  122. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/led_matrix/tools/identify.py +0 -0
  123. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/log_engine.py +0 -0
  124. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/monitor/__init__.py +0 -0
  125. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/monitor/errors.py +0 -0
  126. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/monitor/events.py +0 -0
  127. {is_matrix_forge-1.0.0.dev4/is_matrix_forge/monitor/gui/windows → is_matrix_forge-1.0.0.dev6/is_matrix_forge/monitor/gui}/__init__.py +0 -0
  128. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/monitor/gui/errors.py +0 -0
  129. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/monitor/gui/event/__init__.py +0 -0
  130. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/monitor/gui/event/collection.py +0 -0
  131. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/monitor/gui/event/errors.py +0 -0
  132. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/monitor/gui/event/event.py +0 -0
  133. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/monitor/gui/layout/base.py +0 -0
  134. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/monitor/gui/metaclasses/__init__.py +0 -0
  135. {is_matrix_forge-1.0.0.dev4/is_matrix_forge/notify → is_matrix_forge-1.0.0.dev6/is_matrix_forge/monitor/gui/windows}/__init__.py +0 -0
  136. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/monitor/gui/windows/base.py +0 -0
  137. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/monitor/gui/windows/main/layout.py +0 -0
  138. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/monitor/helpers.py +0 -0
  139. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/notify/sounds/__init__.py +0 -0
  140. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/notify/sounds/base.py +0 -0
  141. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/is_matrix_forge/progress.py +0 -0
  142. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/presets/blank.json +0 -0
  143. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/presets/manifest.json +0 -0
  144. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/presets/shock_face.json +0 -0
  145. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/presets/test1.json +0 -0
  146. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/presets/test2.json +0 -0
  147. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/presets/test3.json +0 -0
  148. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/presets/test4.json +0 -0
  149. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/presets/test5.json +0 -0
  150. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/presets/test6.json +0 -0
  151. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/presets/test7.json +0 -0
  152. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/presets/x_animation II.json +0 -0
  153. {is_matrix_forge-1.0.0.dev4 → is_matrix_forge-1.0.0.dev6}/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.dev4
3
+ Version: 1.0.0.dev6
4
4
  Summary:
5
5
  License: MIT
6
6
  Keywords: led,matrix,framework,hardware
@@ -12,34 +12,47 @@ Classifier: Programming Language :: Python :: 3
12
12
  Classifier: Programming Language :: Python :: 3.12
13
13
  Classifier: Programming Language :: Python :: 3.13
14
14
  Provides-Extra: clipboard-support
15
+ Requires-Dist: aliaser (>=1.0.0.dev4,<2.0.0)
15
16
  Requires-Dist: chime (>=0.7.0,<0.8.0)
16
17
  Requires-Dist: clipboard (>=0.0.4,<0.0.5) ; extra == "clipboard-support"
17
18
  Requires-Dist: easy-exit-calls (>=1.0.0.dev1,<2.0.0)
19
+ Requires-Dist: imapclient (==3.0.1)
18
20
  Requires-Dist: inspy-logger (>=3.2.3,<4.0.0)
19
21
  Requires-Dist: inspyre-toolbox (>=1.6.0.dev23)
20
22
  Requires-Dist: opencv-python (>=4.11.0.86,<5.0.0.0)
21
23
  Requires-Dist: pillow (>=11.2.1,<12.0.0)
22
24
  Requires-Dist: pyserial (>=3.5,<4.0)
25
+ Requires-Dist: pysimplegui-4-foss (==4.60.4.1)
26
+ Requires-Dist: pysimpleguiweb (==0.39.0)
27
+ Requires-Dist: requests (>=2.32.4,<3.0.0)
28
+ Project-URL: Homepage, https://github.com/Inspyre-Softworks/IS-Matrix-Forge
29
+ Project-URL: Repository, https://github.com/Inspyre-Softworks/IS-Matrix-Forge
23
30
  Description-Content-Type: text/markdown
24
31
 
25
32
  [![PyPI version](https://img.shields.io/pypi/v/IS-Matrix-Forge)](https://pypi.org/project/IS-Matrix-Forge)
26
33
  ![PyPI - Python Version](https://img.shields.io/pypi/pyversions/IS-Matrix-Forge)
27
34
 
28
35
 
29
- # LED Matrix Battery Monitor
36
+ # IS Matrix Forge
30
37
 
31
- 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.
38
+ **IS Matrix Forge** is a Python framework for creating applications that drive
39
+ 9×34 LED matrix displays. It provides high level helpers for talking to the
40
+ hardware, tools for building animations, and utilities such as progress bars and
41
+ a battery monitor.
32
42
 
33
- ## Project Description and Purpose
43
+ ## Project Overview
34
44
 
35
- 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.
45
+ Matrix Forge grew out of the LED Matrix Battery Monitor project. The goal is to
46
+ make it easy to create rich LED matrix experiences from Python. In addition to
47
+ monitoring the battery, you can design custom frames, display scrolling text,
48
+ run animations, and integrate the LED matrix with your own applications.
36
49
 
37
- Key features:
38
- - Real-time battery level display on an LED matrix
39
- - Visual animations when power is plugged in
40
- - Audio notifications when power state changes (plugged/unplugged)
41
- - Configurable checking intervals
42
- - Support for multiple LED matrices
50
+ Highlighted features include:
51
+ - Device discovery and control via `pyserial`
52
+ - Drawing grids and patterns with the `Grid` class
53
+ - Built-in and custom animations
54
+ - Progress bars that render on the matrix
55
+ - A battery monitor example using these building blocks
43
56
 
44
57
  ## Hardware Requirements
45
58
 
@@ -71,8 +84,8 @@ This project requires Python 3.12 or newer and the following dependencies:
71
84
 
72
85
  1. Clone the repository:
73
86
  ```
74
- git clone https://github.com/Inspyre-Softworks/led-matrix-battery.git
75
- cd led-matrix-battery
87
+ git clone https://github.com/Inspyre-Softworks/IS-Matrix-Forge.git
88
+ cd IS-Matrix-Forge
76
89
  ```
77
90
 
78
91
  2. Install dependencies using Poetry:
@@ -89,8 +102,8 @@ This project requires Python 3.12 or newer and the following dependencies:
89
102
 
90
103
  1. Clone the repository:
91
104
  ```
92
- git clone https://github.com/Inspyre-Softworks/led-matrix-battery.git
93
- cd led-matrix-battery
105
+ git clone https://github.com/Inspyre-Softworks/IS-Matrix-Forge.git
106
+ cd IS-Matrix-Forge
94
107
  ```
95
108
 
96
109
  2. Install the package:
@@ -100,60 +113,43 @@ This project requires Python 3.12 or newer and the following dependencies:
100
113
 
101
114
  ## Usage Examples
102
115
 
103
- ### Basic Usage
104
-
105
- To start monitoring your battery with default settings:
116
+ ### Identify Connected Devices
106
117
 
107
118
  ```python
108
- from is_matrix_forge.monitor import run_power_monitor
109
119
  from is_matrix_forge.led_matrix.helpers.device import DEVICES
110
120
 
111
- # Get the first available LED matrix device
112
- device = DEVICES[0]
113
-
114
- # Start monitoring with default settings
115
- run_power_monitor(device)
121
+ for dev in DEVICES:
122
+ print(dev)
116
123
  ```
117
124
 
118
- ### Custom Configuration
119
-
120
- To customize the monitoring behavior:
125
+ ### Display Text on the Matrix
121
126
 
122
127
  ```python
123
- from is_matrix_forge.monitor import run_power_monitor
128
+ from is_matrix_forge.led_matrix.controller.controller import LEDMatrixController
124
129
  from is_matrix_forge.led_matrix.helpers.device import DEVICES
125
- from pathlib import Path
126
-
127
- # Get the first available LED matrix device
128
- device = DEVICES[0]
129
130
 
130
- # Custom sound files
131
- plugged_sound = Path("path/to/custom_plugged_sound.wav")
132
- unplugged_sound = Path("path/to/custom_unplugged_sound.wav")
133
-
134
- # Start monitoring with custom settings
135
- run_power_monitor(
136
- device,
137
- battery_check_interval=10, # Check every 10 seconds
138
- plugged_alert=plugged_sound,
139
- unplugged_alert=unplugged_sound
140
- )
131
+ ctrl = LEDMatrixController(DEVICES[0])
132
+ ctrl.scroll_text("Hello World!", loop=False)
141
133
  ```
142
134
 
143
- ### Running in a Thread
135
+ ### Progress Bars
144
136
 
145
- To run the monitor in a background thread:
137
+ ```python
138
+ import time
139
+ from is_matrix_forge.progress import tqdm
140
+
141
+ for _ in tqdm(range(100)):
142
+ time.sleep(0.05)
143
+ ```
144
+
145
+ ### Battery Monitor Example
146
146
 
147
147
  ```python
148
- from is_matrix_forge.monitor import run_power_monitor_threaded
148
+ from is_matrix_forge.monitor import run_power_monitor
149
149
  from is_matrix_forge.led_matrix.helpers.device import DEVICES
150
150
 
151
- # Get the first available LED matrix device
152
151
  device = DEVICES[0]
153
-
154
- # Start monitoring in a background thread
155
- monitor = run_power_monitor_threaded(device)
156
- # ``monitor`` is a :class:`threading.Thread` instance
152
+ run_power_monitor(device)
157
153
  ```
158
154
 
159
155
  ## Troubleshooting
@@ -185,8 +181,10 @@ monitor = run_power_monitor_threaded(device)
185
181
 
186
182
  ## Contributing
187
183
 
188
- Contributions to the LED Matrix Battery Monitor are welcome! Please feel free to submit a Pull Request.
184
+ Contributions are welcome! If you have ideas or improvements for Matrix Forge,
185
+ feel free to open an issue or submit a pull request.
189
186
 
190
187
  ## License
191
188
 
192
189
  This project is licensed under the MIT License - see the LICENSE.md file for details.
190
+
@@ -2,20 +2,26 @@
2
2
  ![PyPI - Python Version](https://img.shields.io/pypi/pyversions/IS-Matrix-Forge)
3
3
 
4
4
 
5
- # LED Matrix Battery Monitor
5
+ # IS Matrix Forge
6
6
 
7
- 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.
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
- ## Project Description and Purpose
12
+ ## Project Overview
10
13
 
11
- 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.
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.
12
18
 
13
- Key features:
14
- - Real-time battery level display on an LED matrix
15
- - Visual animations when power is plugged in
16
- - Audio notifications when power state changes (plugged/unplugged)
17
- - Configurable checking intervals
18
- - Support for multiple LED matrices
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
19
25
 
20
26
  ## Hardware Requirements
21
27
 
@@ -47,8 +53,8 @@ This project requires Python 3.12 or newer and the following dependencies:
47
53
 
48
54
  1. Clone the repository:
49
55
  ```
50
- git clone https://github.com/Inspyre-Softworks/led-matrix-battery.git
51
- cd led-matrix-battery
56
+ git clone https://github.com/Inspyre-Softworks/IS-Matrix-Forge.git
57
+ cd IS-Matrix-Forge
52
58
  ```
53
59
 
54
60
  2. Install dependencies using Poetry:
@@ -65,8 +71,8 @@ This project requires Python 3.12 or newer and the following dependencies:
65
71
 
66
72
  1. Clone the repository:
67
73
  ```
68
- git clone https://github.com/Inspyre-Softworks/led-matrix-battery.git
69
- cd led-matrix-battery
74
+ git clone https://github.com/Inspyre-Softworks/IS-Matrix-Forge.git
75
+ cd IS-Matrix-Forge
70
76
  ```
71
77
 
72
78
  2. Install the package:
@@ -76,60 +82,43 @@ This project requires Python 3.12 or newer and the following dependencies:
76
82
 
77
83
  ## Usage Examples
78
84
 
79
- ### Basic Usage
80
-
81
- To start monitoring your battery with default settings:
85
+ ### Identify Connected Devices
82
86
 
83
87
  ```python
84
- from is_matrix_forge.monitor import run_power_monitor
85
88
  from is_matrix_forge.led_matrix.helpers.device import DEVICES
86
89
 
87
- # Get the first available LED matrix device
88
- device = DEVICES[0]
89
-
90
- # Start monitoring with default settings
91
- run_power_monitor(device)
90
+ for dev in DEVICES:
91
+ print(dev)
92
92
  ```
93
93
 
94
- ### Custom Configuration
95
-
96
- To customize the monitoring behavior:
94
+ ### Display Text on the Matrix
97
95
 
98
96
  ```python
99
- from is_matrix_forge.monitor import run_power_monitor
97
+ from is_matrix_forge.led_matrix.controller.controller import LEDMatrixController
100
98
  from is_matrix_forge.led_matrix.helpers.device import DEVICES
101
- from pathlib import Path
102
-
103
- # Get the first available LED matrix device
104
- device = DEVICES[0]
105
99
 
106
- # Custom sound files
107
- plugged_sound = Path("path/to/custom_plugged_sound.wav")
108
- unplugged_sound = Path("path/to/custom_unplugged_sound.wav")
109
-
110
- # Start monitoring with custom settings
111
- run_power_monitor(
112
- device,
113
- battery_check_interval=10, # Check every 10 seconds
114
- plugged_alert=plugged_sound,
115
- unplugged_alert=unplugged_sound
116
- )
100
+ ctrl = LEDMatrixController(DEVICES[0])
101
+ ctrl.scroll_text("Hello World!", loop=False)
117
102
  ```
118
103
 
119
- ### Running in a Thread
104
+ ### Progress Bars
105
+
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
+ ```
120
113
 
121
- To run the monitor in a background thread:
114
+ ### Battery Monitor Example
122
115
 
123
116
  ```python
124
- from is_matrix_forge.monitor import run_power_monitor_threaded
117
+ from is_matrix_forge.monitor import run_power_monitor
125
118
  from is_matrix_forge.led_matrix.helpers.device import DEVICES
126
119
 
127
- # Get the first available LED matrix device
128
120
  device = DEVICES[0]
129
-
130
- # Start monitoring in a background thread
131
- monitor = run_power_monitor_threaded(device)
132
- # ``monitor`` is a :class:`threading.Thread` instance
121
+ run_power_monitor(device)
133
122
  ```
134
123
 
135
124
  ## Troubleshooting
@@ -161,8 +150,9 @@ monitor = run_power_monitor_threaded(device)
161
150
 
162
151
  ## Contributing
163
152
 
164
- 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.
165
155
 
166
156
  ## License
167
157
 
168
- 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
  """
@@ -0,0 +1,12 @@
1
+ from inspyre_toolbox.syntactic_sweets.classes.decorators import validate_type
2
+ from is_matrix_forge.common.decorators.freeze_setter import freeze_setter
3
+ from is_matrix_forge.led_matrix.errors.misc import ImplicitNameDerivationError
4
+ from aliaser import Aliases
5
+
6
+
7
+ __all__ = [
8
+ 'Aliases',
9
+ 'ImplicitNameDerivationError',
10
+ 'freeze_setter',
11
+ 'validate_type',
12
+ ]
@@ -1,11 +1,6 @@
1
1
  import functools
2
2
  from typing import Optional, Type, Callable, Any
3
3
 
4
- import functools
5
- from typing import Optional, Type, Callable, Any
6
- from inspyre_toolbox.syntactic_sweets.classes.decorators import validate_type
7
- from is_matrix_forge.led_matrix.errors.misc import ImplicitNameDerivationError
8
-
9
4
 
10
5
  def freeze_setter(
11
6
  attr_name: Optional[str] = None,
@@ -94,6 +89,8 @@ def freeze_setter(
94
89
  - `ImplicitNameDerivationError`: Raised for configuration issues with underscore-prefixed setters.
95
90
  - `AttributeError`: Default exception for reassigning a frozen attribute.
96
91
  """
92
+ from is_matrix_forge.led_matrix.errors.misc import ImplicitNameDerivationError
93
+
97
94
  def decorator(setter: Callable) -> Callable:
98
95
  setter_name = setter.__name__
99
96
 
@@ -143,10 +140,3 @@ def freeze_setter(
143
140
  return wrapper
144
141
 
145
142
  return decorator
146
-
147
-
148
- __all__ = [
149
- 'ImplicitNameDerivationError',
150
- 'freeze_setter',
151
- 'validate_type',
152
- ]
@@ -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
+