hspylib-clitt 0.9.118__py3-none-any.whl → 0.9.119__py3-none-any.whl

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.

Potentially problematic release.


This version of hspylib-clitt might be problematic. Click here for more details.

Files changed (344) hide show
  1. build/lib/build/lib/build/lib/build/lib/clitt/__classpath__.py +28 -0
  2. build/lib/build/lib/build/lib/build/lib/clitt/__init__.py +13 -0
  3. build/lib/build/lib/build/lib/build/lib/clitt/__main__.py +139 -0
  4. build/lib/build/lib/build/lib/build/lib/clitt/addons/__init__.py +12 -0
  5. build/lib/build/lib/build/lib/build/lib/clitt/addons/appman/__init__.py +13 -0
  6. build/lib/build/lib/build/lib/build/lib/clitt/addons/appman/appman.py +305 -0
  7. build/lib/build/lib/build/lib/build/lib/clitt/addons/appman/appman_enums.py +39 -0
  8. build/lib/build/lib/build/lib/build/lib/clitt/addons/appman/templates/__init__.py +11 -0
  9. build/lib/build/lib/build/lib/build/lib/clitt/addons/widman/__init__.py +14 -0
  10. build/lib/build/lib/build/lib/build/lib/clitt/addons/widman/widget.py +70 -0
  11. build/lib/build/lib/build/lib/build/lib/clitt/addons/widman/widget_entry.py +54 -0
  12. build/lib/build/lib/build/lib/build/lib/clitt/addons/widman/widgets/__init__.py +14 -0
  13. build/lib/build/lib/build/lib/build/lib/clitt/addons/widman/widgets/widget_free.py +110 -0
  14. build/lib/build/lib/build/lib/build/lib/clitt/addons/widman/widgets/widget_punch.py +246 -0
  15. build/lib/build/lib/build/lib/build/lib/clitt/addons/widman/widgets/widget_send_msg.py +272 -0
  16. build/lib/build/lib/build/lib/build/lib/clitt/addons/widman/widgets/widget_time_calc.py +146 -0
  17. build/lib/build/lib/build/lib/build/lib/clitt/addons/widman/widman.py +123 -0
  18. build/lib/build/lib/build/lib/build/lib/clitt/core/__init__.py +15 -0
  19. build/lib/build/lib/build/lib/build/lib/clitt/core/exception/__init__.py +11 -0
  20. build/lib/build/lib/build/lib/build/lib/clitt/core/exception/exceptions.py +19 -0
  21. build/lib/build/lib/build/lib/build/lib/clitt/core/icons/__init__.py +12 -0
  22. build/lib/build/lib/build/lib/build/lib/clitt/core/icons/emojis/__init__.py +12 -0
  23. build/lib/build/lib/build/lib/build/lib/clitt/core/icons/emojis/emojis.py +41 -0
  24. build/lib/build/lib/build/lib/build/lib/clitt/core/icons/emojis/face_smiling.py +40 -0
  25. build/lib/build/lib/build/lib/build/lib/clitt/core/icons/font_awesome/__init__.py +18 -0
  26. build/lib/build/lib/build/lib/build/lib/clitt/core/icons/font_awesome/app_icons.py +55 -0
  27. build/lib/build/lib/build/lib/build/lib/clitt/core/icons/font_awesome/awesome.py +76 -0
  28. build/lib/build/lib/build/lib/build/lib/clitt/core/icons/font_awesome/dashboard_icons.py +93 -0
  29. build/lib/build/lib/build/lib/build/lib/clitt/core/icons/font_awesome/form_icons.py +69 -0
  30. build/lib/build/lib/build/lib/build/lib/clitt/core/icons/font_awesome/game_icons.py +59 -0
  31. build/lib/build/lib/build/lib/build/lib/clitt/core/icons/font_awesome/nav_icons.py +42 -0
  32. build/lib/build/lib/build/lib/build/lib/clitt/core/icons/font_awesome/trickplay_icons.py +39 -0
  33. build/lib/build/lib/build/lib/build/lib/clitt/core/icons/font_awesome/widget_icons.py +37 -0
  34. build/lib/build/lib/build/lib/build/lib/clitt/core/preferences.py +87 -0
  35. build/lib/build/lib/build/lib/build/lib/clitt/core/term/__init__.py +14 -0
  36. build/lib/build/lib/build/lib/build/lib/clitt/core/term/commons.py +106 -0
  37. build/lib/build/lib/build/lib/build/lib/clitt/core/term/cursor.py +174 -0
  38. build/lib/build/lib/build/lib/build/lib/clitt/core/term/screen.py +106 -0
  39. build/lib/build/lib/build/lib/build/lib/clitt/core/term/terminal.py +202 -0
  40. build/lib/build/lib/build/lib/build/lib/clitt/core/tui/__init__.py +20 -0
  41. build/lib/build/lib/build/lib/build/lib/clitt/core/tui/line_input/__init__.py +12 -0
  42. build/lib/build/lib/build/lib/build/lib/clitt/core/tui/line_input/keyboard_input.py +229 -0
  43. build/lib/build/lib/build/lib/build/lib/clitt/core/tui/line_input/line_input.py +31 -0
  44. build/lib/build/lib/build/lib/build/lib/clitt/core/tui/mchoose/__init__.py +12 -0
  45. build/lib/build/lib/build/lib/build/lib/clitt/core/tui/mchoose/mchoose.py +43 -0
  46. build/lib/build/lib/build/lib/build/lib/clitt/core/tui/mchoose/menu_choose.py +192 -0
  47. build/lib/build/lib/build/lib/build/lib/clitt/core/tui/mdashboard/__init__.py +14 -0
  48. build/lib/build/lib/build/lib/build/lib/clitt/core/tui/mdashboard/dashboard_builder.py +54 -0
  49. build/lib/build/lib/build/lib/build/lib/clitt/core/tui/mdashboard/dashboard_item.py +31 -0
  50. build/lib/build/lib/build/lib/build/lib/clitt/core/tui/mdashboard/mdashboard.py +26 -0
  51. build/lib/build/lib/build/lib/build/lib/clitt/core/tui/mdashboard/menu_dashboard.py +148 -0
  52. build/lib/build/lib/build/lib/build/lib/clitt/core/tui/menu/__init__.py +16 -0
  53. build/lib/build/lib/build/lib/build/lib/clitt/core/tui/menu/tui_menu.py +111 -0
  54. build/lib/build/lib/build/lib/build/lib/clitt/core/tui/menu/tui_menu_action.py +47 -0
  55. build/lib/build/lib/build/lib/build/lib/clitt/core/tui/menu/tui_menu_factory.py +117 -0
  56. build/lib/build/lib/build/lib/build/lib/clitt/core/tui/menu/tui_menu_item.py +196 -0
  57. build/lib/build/lib/build/lib/build/lib/clitt/core/tui/menu/tui_menu_ui.py +98 -0
  58. build/lib/build/lib/build/lib/build/lib/clitt/core/tui/menu/tui_menu_view.py +57 -0
  59. build/lib/build/lib/build/lib/build/lib/clitt/core/tui/minput/__init__.py +19 -0
  60. build/lib/build/lib/build/lib/build/lib/clitt/core/tui/minput/access_type.py +26 -0
  61. build/lib/build/lib/build/lib/build/lib/clitt/core/tui/minput/field_builder.py +117 -0
  62. build/lib/build/lib/build/lib/build/lib/clitt/core/tui/minput/form_builder.py +72 -0
  63. build/lib/build/lib/build/lib/build/lib/clitt/core/tui/minput/form_field.py +180 -0
  64. build/lib/build/lib/build/lib/build/lib/clitt/core/tui/minput/input_type.py +30 -0
  65. build/lib/build/lib/build/lib/build/lib/clitt/core/tui/minput/input_validator.py +98 -0
  66. build/lib/build/lib/build/lib/build/lib/clitt/core/tui/minput/menu_input.py +292 -0
  67. build/lib/build/lib/build/lib/build/lib/clitt/core/tui/minput/minput.py +44 -0
  68. build/lib/build/lib/build/lib/build/lib/clitt/core/tui/minput/minput_utils.py +156 -0
  69. build/lib/build/lib/build/lib/build/lib/clitt/core/tui/mselect/__init__.py +12 -0
  70. build/lib/build/lib/build/lib/build/lib/clitt/core/tui/mselect/menu_select.py +170 -0
  71. build/lib/build/lib/build/lib/build/lib/clitt/core/tui/mselect/mselect.py +36 -0
  72. build/lib/build/lib/build/lib/build/lib/clitt/core/tui/table/__init__.py +12 -0
  73. build/lib/build/lib/build/lib/build/lib/clitt/core/tui/table/table_enums.py +47 -0
  74. build/lib/build/lib/build/lib/build/lib/clitt/core/tui/table/table_renderer.py +339 -0
  75. build/lib/build/lib/build/lib/build/lib/clitt/core/tui/tui_application.py +52 -0
  76. build/lib/build/lib/build/lib/build/lib/clitt/core/tui/tui_component.py +154 -0
  77. build/lib/build/lib/build/lib/build/lib/clitt/core/tui/tui_preferences.py +103 -0
  78. build/lib/build/lib/build/lib/build/lib/clitt/utils/__init__.py +11 -0
  79. build/lib/build/lib/build/lib/build/lib/clitt/utils/git_utils.py +66 -0
  80. build/lib/build/lib/build/lib/clitt/__classpath__.py +28 -0
  81. build/lib/build/lib/build/lib/clitt/__init__.py +13 -0
  82. build/lib/build/lib/build/lib/clitt/__main__.py +139 -0
  83. build/lib/build/lib/build/lib/clitt/addons/__init__.py +12 -0
  84. build/lib/build/lib/build/lib/clitt/addons/appman/__init__.py +13 -0
  85. build/lib/build/lib/build/lib/clitt/addons/appman/appman.py +305 -0
  86. build/lib/build/lib/build/lib/clitt/addons/appman/appman_enums.py +39 -0
  87. build/lib/build/lib/build/lib/clitt/addons/appman/templates/__init__.py +11 -0
  88. build/lib/build/lib/build/lib/clitt/addons/widman/__init__.py +14 -0
  89. build/lib/build/lib/build/lib/clitt/addons/widman/widget.py +70 -0
  90. build/lib/build/lib/build/lib/clitt/addons/widman/widget_entry.py +54 -0
  91. build/lib/build/lib/build/lib/clitt/addons/widman/widgets/__init__.py +14 -0
  92. build/lib/build/lib/build/lib/clitt/addons/widman/widgets/widget_free.py +110 -0
  93. build/lib/build/lib/build/lib/clitt/addons/widman/widgets/widget_punch.py +246 -0
  94. build/lib/build/lib/build/lib/clitt/addons/widman/widgets/widget_send_msg.py +272 -0
  95. build/lib/build/lib/build/lib/clitt/addons/widman/widgets/widget_time_calc.py +146 -0
  96. build/lib/build/lib/build/lib/clitt/addons/widman/widman.py +123 -0
  97. build/lib/build/lib/build/lib/clitt/core/__init__.py +15 -0
  98. build/lib/build/lib/build/lib/clitt/core/exception/__init__.py +11 -0
  99. build/lib/build/lib/build/lib/clitt/core/exception/exceptions.py +19 -0
  100. build/lib/build/lib/build/lib/clitt/core/icons/__init__.py +12 -0
  101. build/lib/build/lib/build/lib/clitt/core/icons/emojis/__init__.py +12 -0
  102. build/lib/build/lib/build/lib/clitt/core/icons/emojis/emojis.py +41 -0
  103. build/lib/build/lib/build/lib/clitt/core/icons/emojis/face_smiling.py +40 -0
  104. build/lib/build/lib/build/lib/clitt/core/icons/font_awesome/__init__.py +18 -0
  105. build/lib/build/lib/build/lib/clitt/core/icons/font_awesome/app_icons.py +55 -0
  106. build/lib/build/lib/build/lib/clitt/core/icons/font_awesome/awesome.py +76 -0
  107. build/lib/build/lib/build/lib/clitt/core/icons/font_awesome/dashboard_icons.py +93 -0
  108. build/lib/build/lib/build/lib/clitt/core/icons/font_awesome/form_icons.py +69 -0
  109. build/lib/build/lib/build/lib/clitt/core/icons/font_awesome/game_icons.py +59 -0
  110. build/lib/build/lib/build/lib/clitt/core/icons/font_awesome/nav_icons.py +42 -0
  111. build/lib/build/lib/build/lib/clitt/core/icons/font_awesome/trickplay_icons.py +39 -0
  112. build/lib/build/lib/build/lib/clitt/core/icons/font_awesome/widget_icons.py +37 -0
  113. build/lib/build/lib/build/lib/clitt/core/preferences.py +87 -0
  114. build/lib/build/lib/build/lib/clitt/core/term/__init__.py +14 -0
  115. build/lib/build/lib/build/lib/clitt/core/term/commons.py +106 -0
  116. build/lib/build/lib/build/lib/clitt/core/term/cursor.py +174 -0
  117. build/lib/build/lib/build/lib/clitt/core/term/screen.py +106 -0
  118. build/lib/build/lib/build/lib/clitt/core/term/terminal.py +202 -0
  119. build/lib/build/lib/build/lib/clitt/core/tui/__init__.py +20 -0
  120. build/lib/build/lib/build/lib/clitt/core/tui/line_input/__init__.py +12 -0
  121. build/lib/build/lib/build/lib/clitt/core/tui/line_input/keyboard_input.py +229 -0
  122. build/lib/build/lib/build/lib/clitt/core/tui/line_input/line_input.py +31 -0
  123. build/lib/build/lib/build/lib/clitt/core/tui/mchoose/__init__.py +12 -0
  124. build/lib/build/lib/build/lib/clitt/core/tui/mchoose/mchoose.py +43 -0
  125. build/lib/build/lib/build/lib/clitt/core/tui/mchoose/menu_choose.py +192 -0
  126. build/lib/build/lib/build/lib/clitt/core/tui/mdashboard/__init__.py +14 -0
  127. build/lib/build/lib/build/lib/clitt/core/tui/mdashboard/dashboard_builder.py +54 -0
  128. build/lib/build/lib/build/lib/clitt/core/tui/mdashboard/dashboard_item.py +31 -0
  129. build/lib/build/lib/build/lib/clitt/core/tui/mdashboard/mdashboard.py +26 -0
  130. build/lib/build/lib/build/lib/clitt/core/tui/mdashboard/menu_dashboard.py +148 -0
  131. build/lib/build/lib/build/lib/clitt/core/tui/menu/__init__.py +16 -0
  132. build/lib/build/lib/build/lib/clitt/core/tui/menu/tui_menu.py +111 -0
  133. build/lib/build/lib/build/lib/clitt/core/tui/menu/tui_menu_action.py +47 -0
  134. build/lib/build/lib/build/lib/clitt/core/tui/menu/tui_menu_factory.py +117 -0
  135. build/lib/build/lib/build/lib/clitt/core/tui/menu/tui_menu_item.py +196 -0
  136. build/lib/build/lib/build/lib/clitt/core/tui/menu/tui_menu_ui.py +98 -0
  137. build/lib/build/lib/build/lib/clitt/core/tui/menu/tui_menu_view.py +57 -0
  138. build/lib/build/lib/build/lib/clitt/core/tui/minput/__init__.py +19 -0
  139. build/lib/build/lib/build/lib/clitt/core/tui/minput/access_type.py +26 -0
  140. build/lib/build/lib/build/lib/clitt/core/tui/minput/field_builder.py +117 -0
  141. build/lib/build/lib/build/lib/clitt/core/tui/minput/form_builder.py +72 -0
  142. build/lib/build/lib/build/lib/clitt/core/tui/minput/form_field.py +180 -0
  143. build/lib/build/lib/build/lib/clitt/core/tui/minput/input_type.py +30 -0
  144. build/lib/build/lib/build/lib/clitt/core/tui/minput/input_validator.py +98 -0
  145. build/lib/build/lib/build/lib/clitt/core/tui/minput/menu_input.py +292 -0
  146. build/lib/build/lib/build/lib/clitt/core/tui/minput/minput.py +44 -0
  147. build/lib/build/lib/build/lib/clitt/core/tui/minput/minput_utils.py +156 -0
  148. build/lib/build/lib/build/lib/clitt/core/tui/mselect/__init__.py +12 -0
  149. build/lib/build/lib/build/lib/clitt/core/tui/mselect/menu_select.py +170 -0
  150. build/lib/build/lib/build/lib/clitt/core/tui/mselect/mselect.py +36 -0
  151. build/lib/build/lib/build/lib/clitt/core/tui/table/__init__.py +12 -0
  152. build/lib/build/lib/build/lib/clitt/core/tui/table/table_enums.py +47 -0
  153. build/lib/build/lib/build/lib/clitt/core/tui/table/table_renderer.py +339 -0
  154. build/lib/build/lib/build/lib/clitt/core/tui/tui_application.py +52 -0
  155. build/lib/build/lib/build/lib/clitt/core/tui/tui_component.py +154 -0
  156. build/lib/build/lib/build/lib/clitt/core/tui/tui_preferences.py +103 -0
  157. build/lib/build/lib/build/lib/clitt/utils/__init__.py +11 -0
  158. build/lib/build/lib/build/lib/clitt/utils/git_utils.py +66 -0
  159. build/lib/build/lib/clitt/__classpath__.py +28 -0
  160. build/lib/build/lib/clitt/__init__.py +13 -0
  161. build/lib/build/lib/clitt/__main__.py +139 -0
  162. build/lib/build/lib/clitt/addons/__init__.py +12 -0
  163. build/lib/build/lib/clitt/addons/appman/__init__.py +13 -0
  164. build/lib/build/lib/clitt/addons/appman/appman.py +305 -0
  165. build/lib/build/lib/clitt/addons/appman/appman_enums.py +39 -0
  166. build/lib/build/lib/clitt/addons/appman/templates/__init__.py +11 -0
  167. build/lib/build/lib/clitt/addons/widman/__init__.py +14 -0
  168. build/lib/build/lib/clitt/addons/widman/widget.py +70 -0
  169. build/lib/build/lib/clitt/addons/widman/widget_entry.py +54 -0
  170. build/lib/build/lib/clitt/addons/widman/widgets/__init__.py +14 -0
  171. build/lib/build/lib/clitt/addons/widman/widgets/widget_free.py +110 -0
  172. build/lib/build/lib/clitt/addons/widman/widgets/widget_punch.py +246 -0
  173. build/lib/build/lib/clitt/addons/widman/widgets/widget_send_msg.py +272 -0
  174. build/lib/build/lib/clitt/addons/widman/widgets/widget_time_calc.py +146 -0
  175. build/lib/build/lib/clitt/addons/widman/widman.py +123 -0
  176. build/lib/build/lib/clitt/core/__init__.py +15 -0
  177. build/lib/build/lib/clitt/core/exception/__init__.py +11 -0
  178. build/lib/build/lib/clitt/core/exception/exceptions.py +19 -0
  179. build/lib/build/lib/clitt/core/icons/__init__.py +12 -0
  180. build/lib/build/lib/clitt/core/icons/emojis/__init__.py +12 -0
  181. build/lib/build/lib/clitt/core/icons/emojis/emojis.py +41 -0
  182. build/lib/build/lib/clitt/core/icons/emojis/face_smiling.py +40 -0
  183. build/lib/build/lib/clitt/core/icons/font_awesome/__init__.py +18 -0
  184. build/lib/build/lib/clitt/core/icons/font_awesome/app_icons.py +55 -0
  185. build/lib/build/lib/clitt/core/icons/font_awesome/awesome.py +76 -0
  186. build/lib/build/lib/clitt/core/icons/font_awesome/dashboard_icons.py +93 -0
  187. build/lib/build/lib/clitt/core/icons/font_awesome/form_icons.py +69 -0
  188. build/lib/build/lib/clitt/core/icons/font_awesome/game_icons.py +59 -0
  189. build/lib/build/lib/clitt/core/icons/font_awesome/nav_icons.py +42 -0
  190. build/lib/build/lib/clitt/core/icons/font_awesome/trickplay_icons.py +39 -0
  191. build/lib/build/lib/clitt/core/icons/font_awesome/widget_icons.py +37 -0
  192. build/lib/build/lib/clitt/core/preferences.py +87 -0
  193. build/lib/build/lib/clitt/core/term/__init__.py +14 -0
  194. build/lib/build/lib/clitt/core/term/commons.py +106 -0
  195. build/lib/build/lib/clitt/core/term/cursor.py +174 -0
  196. build/lib/build/lib/clitt/core/term/screen.py +106 -0
  197. build/lib/build/lib/clitt/core/term/terminal.py +202 -0
  198. build/lib/build/lib/clitt/core/tui/__init__.py +20 -0
  199. build/lib/build/lib/clitt/core/tui/line_input/__init__.py +12 -0
  200. build/lib/build/lib/clitt/core/tui/line_input/keyboard_input.py +229 -0
  201. build/lib/build/lib/clitt/core/tui/line_input/line_input.py +31 -0
  202. build/lib/build/lib/clitt/core/tui/mchoose/__init__.py +12 -0
  203. build/lib/build/lib/clitt/core/tui/mchoose/mchoose.py +43 -0
  204. build/lib/build/lib/clitt/core/tui/mchoose/menu_choose.py +192 -0
  205. build/lib/build/lib/clitt/core/tui/mdashboard/__init__.py +14 -0
  206. build/lib/build/lib/clitt/core/tui/mdashboard/dashboard_builder.py +54 -0
  207. build/lib/build/lib/clitt/core/tui/mdashboard/dashboard_item.py +31 -0
  208. build/lib/build/lib/clitt/core/tui/mdashboard/mdashboard.py +26 -0
  209. build/lib/build/lib/clitt/core/tui/mdashboard/menu_dashboard.py +148 -0
  210. build/lib/build/lib/clitt/core/tui/menu/__init__.py +16 -0
  211. build/lib/build/lib/clitt/core/tui/menu/tui_menu.py +111 -0
  212. build/lib/build/lib/clitt/core/tui/menu/tui_menu_action.py +47 -0
  213. build/lib/build/lib/clitt/core/tui/menu/tui_menu_factory.py +117 -0
  214. build/lib/build/lib/clitt/core/tui/menu/tui_menu_item.py +196 -0
  215. build/lib/build/lib/clitt/core/tui/menu/tui_menu_ui.py +98 -0
  216. build/lib/build/lib/clitt/core/tui/menu/tui_menu_view.py +57 -0
  217. build/lib/build/lib/clitt/core/tui/minput/__init__.py +19 -0
  218. build/lib/build/lib/clitt/core/tui/minput/access_type.py +26 -0
  219. build/lib/build/lib/clitt/core/tui/minput/field_builder.py +117 -0
  220. build/lib/build/lib/clitt/core/tui/minput/form_builder.py +72 -0
  221. build/lib/build/lib/clitt/core/tui/minput/form_field.py +180 -0
  222. build/lib/build/lib/clitt/core/tui/minput/input_type.py +30 -0
  223. build/lib/build/lib/clitt/core/tui/minput/input_validator.py +98 -0
  224. build/lib/build/lib/clitt/core/tui/minput/menu_input.py +292 -0
  225. build/lib/build/lib/clitt/core/tui/minput/minput.py +44 -0
  226. build/lib/build/lib/clitt/core/tui/minput/minput_utils.py +156 -0
  227. build/lib/build/lib/clitt/core/tui/mselect/__init__.py +12 -0
  228. build/lib/build/lib/clitt/core/tui/mselect/menu_select.py +170 -0
  229. build/lib/build/lib/clitt/core/tui/mselect/mselect.py +36 -0
  230. build/lib/build/lib/clitt/core/tui/table/__init__.py +12 -0
  231. build/lib/build/lib/clitt/core/tui/table/table_enums.py +47 -0
  232. build/lib/build/lib/clitt/core/tui/table/table_renderer.py +339 -0
  233. build/lib/build/lib/clitt/core/tui/tui_application.py +52 -0
  234. build/lib/build/lib/clitt/core/tui/tui_component.py +154 -0
  235. build/lib/build/lib/clitt/core/tui/tui_preferences.py +103 -0
  236. build/lib/build/lib/clitt/utils/__init__.py +11 -0
  237. build/lib/build/lib/clitt/utils/git_utils.py +66 -0
  238. build/lib/clitt/__classpath__.py +28 -0
  239. build/lib/clitt/__init__.py +13 -0
  240. build/lib/clitt/__main__.py +139 -0
  241. build/lib/clitt/addons/__init__.py +12 -0
  242. build/lib/clitt/addons/appman/__init__.py +13 -0
  243. build/lib/clitt/addons/appman/appman.py +305 -0
  244. build/lib/clitt/addons/appman/appman_enums.py +39 -0
  245. build/lib/clitt/addons/appman/templates/__init__.py +11 -0
  246. build/lib/clitt/addons/widman/__init__.py +14 -0
  247. build/lib/clitt/addons/widman/widget.py +70 -0
  248. build/lib/clitt/addons/widman/widget_entry.py +54 -0
  249. build/lib/clitt/addons/widman/widgets/__init__.py +14 -0
  250. build/lib/clitt/addons/widman/widgets/widget_free.py +110 -0
  251. build/lib/clitt/addons/widman/widgets/widget_punch.py +246 -0
  252. build/lib/clitt/addons/widman/widgets/widget_send_msg.py +272 -0
  253. build/lib/clitt/addons/widman/widgets/widget_time_calc.py +146 -0
  254. build/lib/clitt/addons/widman/widman.py +123 -0
  255. build/lib/clitt/core/__init__.py +15 -0
  256. build/lib/clitt/core/exception/__init__.py +11 -0
  257. build/lib/clitt/core/exception/exceptions.py +19 -0
  258. build/lib/clitt/core/icons/__init__.py +12 -0
  259. build/lib/clitt/core/icons/emojis/__init__.py +12 -0
  260. build/lib/clitt/core/icons/emojis/emojis.py +41 -0
  261. build/lib/clitt/core/icons/emojis/face_smiling.py +40 -0
  262. build/lib/clitt/core/icons/font_awesome/__init__.py +18 -0
  263. build/lib/clitt/core/icons/font_awesome/app_icons.py +55 -0
  264. build/lib/clitt/core/icons/font_awesome/awesome.py +76 -0
  265. build/lib/clitt/core/icons/font_awesome/dashboard_icons.py +93 -0
  266. build/lib/clitt/core/icons/font_awesome/form_icons.py +69 -0
  267. build/lib/clitt/core/icons/font_awesome/game_icons.py +59 -0
  268. build/lib/clitt/core/icons/font_awesome/nav_icons.py +42 -0
  269. build/lib/clitt/core/icons/font_awesome/trickplay_icons.py +39 -0
  270. build/lib/clitt/core/icons/font_awesome/widget_icons.py +37 -0
  271. build/lib/clitt/core/preferences.py +87 -0
  272. build/lib/clitt/core/term/__init__.py +14 -0
  273. build/lib/clitt/core/term/commons.py +106 -0
  274. build/lib/clitt/core/term/cursor.py +174 -0
  275. build/lib/clitt/core/term/screen.py +106 -0
  276. build/lib/clitt/core/term/terminal.py +202 -0
  277. build/lib/clitt/core/tui/__init__.py +20 -0
  278. build/lib/clitt/core/tui/line_input/__init__.py +12 -0
  279. build/lib/clitt/core/tui/line_input/keyboard_input.py +229 -0
  280. build/lib/clitt/core/tui/line_input/line_input.py +31 -0
  281. build/lib/clitt/core/tui/mchoose/__init__.py +12 -0
  282. build/lib/clitt/core/tui/mchoose/mchoose.py +43 -0
  283. build/lib/clitt/core/tui/mchoose/menu_choose.py +192 -0
  284. build/lib/clitt/core/tui/mdashboard/__init__.py +14 -0
  285. build/lib/clitt/core/tui/mdashboard/dashboard_builder.py +54 -0
  286. build/lib/clitt/core/tui/mdashboard/dashboard_item.py +31 -0
  287. build/lib/clitt/core/tui/mdashboard/mdashboard.py +26 -0
  288. build/lib/clitt/core/tui/mdashboard/menu_dashboard.py +148 -0
  289. build/lib/clitt/core/tui/menu/__init__.py +16 -0
  290. build/lib/clitt/core/tui/menu/tui_menu.py +111 -0
  291. build/lib/clitt/core/tui/menu/tui_menu_action.py +47 -0
  292. build/lib/clitt/core/tui/menu/tui_menu_factory.py +117 -0
  293. build/lib/clitt/core/tui/menu/tui_menu_item.py +196 -0
  294. build/lib/clitt/core/tui/menu/tui_menu_ui.py +98 -0
  295. build/lib/clitt/core/tui/menu/tui_menu_view.py +57 -0
  296. build/lib/clitt/core/tui/minput/__init__.py +19 -0
  297. build/lib/clitt/core/tui/minput/access_type.py +26 -0
  298. build/lib/clitt/core/tui/minput/field_builder.py +117 -0
  299. build/lib/clitt/core/tui/minput/form_builder.py +72 -0
  300. build/lib/clitt/core/tui/minput/form_field.py +180 -0
  301. build/lib/clitt/core/tui/minput/input_type.py +30 -0
  302. build/lib/clitt/core/tui/minput/input_validator.py +98 -0
  303. build/lib/clitt/core/tui/minput/menu_input.py +292 -0
  304. build/lib/clitt/core/tui/minput/minput.py +44 -0
  305. build/lib/clitt/core/tui/minput/minput_utils.py +156 -0
  306. build/lib/clitt/core/tui/mselect/__init__.py +12 -0
  307. build/lib/clitt/core/tui/mselect/menu_select.py +170 -0
  308. build/lib/clitt/core/tui/mselect/mselect.py +36 -0
  309. build/lib/clitt/core/tui/table/__init__.py +12 -0
  310. build/lib/clitt/core/tui/table/table_enums.py +47 -0
  311. build/lib/clitt/core/tui/table/table_renderer.py +339 -0
  312. build/lib/clitt/core/tui/tui_application.py +52 -0
  313. build/lib/clitt/core/tui/tui_component.py +154 -0
  314. build/lib/clitt/core/tui/tui_preferences.py +103 -0
  315. build/lib/clitt/utils/__init__.py +11 -0
  316. build/lib/clitt/utils/git_utils.py +66 -0
  317. clitt/.version +1 -1
  318. clitt/__init__.py +3 -3
  319. clitt/addons/__init__.py +3 -3
  320. clitt/addons/appman/__init__.py +3 -3
  321. clitt/addons/appman/templates/__init__.py +3 -3
  322. clitt/addons/widman/__init__.py +3 -3
  323. clitt/addons/widman/widgets/__init__.py +3 -3
  324. clitt/core/__init__.py +3 -3
  325. clitt/core/exception/__init__.py +3 -3
  326. clitt/core/icons/__init__.py +3 -3
  327. clitt/core/icons/emojis/__init__.py +3 -3
  328. clitt/core/icons/font_awesome/__init__.py +3 -3
  329. clitt/core/term/__init__.py +3 -3
  330. clitt/core/term/commons.py +11 -12
  331. clitt/core/tui/__init__.py +3 -3
  332. clitt/core/tui/line_input/__init__.py +3 -3
  333. clitt/core/tui/mchoose/__init__.py +3 -3
  334. clitt/core/tui/mdashboard/__init__.py +3 -3
  335. clitt/core/tui/menu/__init__.py +3 -3
  336. clitt/core/tui/minput/__init__.py +3 -3
  337. clitt/core/tui/mselect/__init__.py +3 -3
  338. clitt/core/tui/table/__init__.py +3 -3
  339. clitt/utils/__init__.py +3 -3
  340. {hspylib_clitt-0.9.118.dist-info → hspylib_clitt-0.9.119.dist-info}/METADATA +2 -2
  341. hspylib_clitt-0.9.119.dist-info/RECORD +413 -0
  342. {hspylib_clitt-0.9.118.dist-info → hspylib_clitt-0.9.119.dist-info}/top_level.txt +1 -0
  343. hspylib_clitt-0.9.118.dist-info/RECORD +0 -97
  344. {hspylib_clitt-0.9.118.dist-info → hspylib_clitt-0.9.119.dist-info}/WHEEL +0 -0
@@ -0,0 +1,42 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+
4
+ """
5
+ @project: HsPyLib-Clitt
6
+ @package: clitt.core.icons.font_awesome
7
+ @file: nav_icons.py
8
+ @created: Tue, 4 May 2021
9
+ @author: <B>H</B>ugo <B>S</B>aporetti <B>J</B>unior"
10
+ @site: https://github.com/yorevs/hspylib
11
+ @license: MIT - Please refer to <https://opensource.org/licenses/MIT>
12
+
13
+ Copyright·(c)·2024,·HSPyLib
14
+ """
15
+ from clitt.core.icons.font_awesome.awesome import Awesome
16
+ from enum import auto
17
+
18
+
19
+ # @composable
20
+ class NavIcons(Awesome):
21
+ """
22
+ Navigation icons.
23
+ Codes can be found here:
24
+ - https://fontawesome.com/cheatsheet?from=io
25
+ """
26
+
27
+ # fmt: off
28
+ _CUSTOM = auto()
29
+ UP = '\u2191' # ↑
30
+ RIGHT = '\u2192' # →
31
+ DOWN = '\u2193' # ↓
32
+ LEFT = '\u2190' # ←
33
+ UP_DOWN = '\uF9E1' # 李
34
+ LEFT_RIGHT = '\uF9E0' # 易
35
+ ENTER = '\u21B5' # ↵
36
+ TAB = '\u21B9' # ↹
37
+ BACKSPACE = '\u232B' # ⌫
38
+ POINTER = '\uF432' # 
39
+ SELECTED = '\uF814' # 
40
+ UNSELECTED = '\uF815' # 
41
+ BREADCRUMB = '\uF44A' # 
42
+ # fmt: on
@@ -0,0 +1,39 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+
4
+ """
5
+ @project: HsPyLib-Clitt
6
+ @package: clitt.core.icons.font_awesome
7
+ @file: trickplay_icons.py
8
+ @created: Tue, 4 May 2021
9
+ @author: <B>H</B>ugo <B>S</B>aporetti <B>J</B>unior"
10
+ @site: https://github.com/yorevs/hspylib
11
+ @license: MIT - Please refer to <https://opensource.org/licenses/MIT>
12
+
13
+ Copyright·(c)·2024,·HSPyLib
14
+ """
15
+ from clitt.core.icons.font_awesome.awesome import Awesome
16
+ from enum import auto
17
+
18
+
19
+ # @composable
20
+ class TrickplayIcons(Awesome):
21
+ """
22
+ Navigation icons.
23
+ Codes can be found here:
24
+ - https://fontawesome.com/cheatsheet?from=io
25
+ """
26
+
27
+ # fmt: off
28
+ _CUSTOM = auto()
29
+ PREVIOUS = '\uF048' # 
30
+ REWIND = '\uF049' # 
31
+ BACKWARD = '\uF04A' # 
32
+ PLAY = '\uF04B' # 
33
+ PAUSE = '\uF04C' # 
34
+ STOP = '\uF04D' # 
35
+ NEXT = '\uF051' # 
36
+ ADVANCE = '\uF050' # 
37
+ FORWARD = '\uF04E' # 
38
+ EJECT = '\uF052' # 
39
+ # fmt: on
@@ -0,0 +1,37 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+
4
+ """
5
+ @project: HsPyLib-Clitt
6
+ @package: clitt.core.icons.font_awesome
7
+ @file: widget_icons.py
8
+ @created: Thu, 20 May 2021
9
+ @author: <B>H</B>ugo <B>S</B>aporetti <B>J</B>unior"
10
+ @site: https://github.com/yorevs/hspylib
11
+ @license: MIT - Please refer to <https://opensource.org/licenses/MIT>
12
+
13
+ Copyright·(c)·2024,·HSPyLib
14
+ """
15
+ from clitt.core.icons.font_awesome.awesome import Awesome
16
+ from enum import auto
17
+
18
+
19
+ class WidgetIcons(Awesome):
20
+ """
21
+ Dashboard UI icons.
22
+ Codes can be found here:
23
+ - https://fontawesome.com/cheatsheet?from=io
24
+ """
25
+
26
+ # fmt: off
27
+ _CUSTOM = auto()
28
+ CHART_2 = '\uF200' # 
29
+ CHART_1 = '\uF1FE' # 
30
+ CLOCK = '\uF651' # 
31
+ CHIP = '\uFB19' # ﬙
32
+ MUSIC = '\uF3B5' # 
33
+ NETWORK = '\uF819' # 
34
+ PUNCH = '\uF255' # 
35
+ SIGN = '\uF45D' # 
36
+ WIDGET = '\uF198' # 
37
+ # fmt: on
@@ -0,0 +1,87 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+
4
+ """
5
+ @project: HsPyLib-Clitt
6
+ @package: clitt.core
7
+ @file: preferences.py
8
+ @created: Fri, 7 Jul 2023
9
+ @author: <B>H</B>ugo <B>S</B>aporetti <B>J</B>unior"
10
+ @site: https://github.com/yorevs/hspylib
11
+ @license: MIT - Please refer to <https://opensource.org/licenses/MIT>
12
+
13
+ Copyright·(c)·2024,·HSPyLib
14
+ """
15
+ from enum import Enum
16
+ from hspylib.core.metaclass.singleton import AbstractSingleton
17
+ from hspylib.core.preconditions import check_argument, check_not_none
18
+ from hspylib.core.tools.dict_tools import get_or_default_by_key
19
+ from hspylib.core.tools.text_tools import ensure_startswith, environ_name
20
+ from typing import Any
21
+
22
+ import os
23
+
24
+
25
+ class Preferences(metaclass=AbstractSingleton):
26
+ """General purpose bas class to provide preference management."""
27
+
28
+ def __init__(self, prefix: str = ""):
29
+ self._prefix = prefix
30
+ self._overrides = {}
31
+
32
+ def __str__(self):
33
+ # fmt: off
34
+ return (
35
+ f"Terminal UI Preferences{os.linesep}"
36
+ f"{'-=' * 20}{os.linesep}"
37
+ + os.linesep.join([f"|-{p[1:]:<16}: {getattr(self, p)}" for p in vars(self)])
38
+ + f"{os.linesep}{'-=' * 20}{os.linesep}"
39
+ )
40
+ # fmt: on
41
+
42
+ def __repr__(self):
43
+ return str(self)
44
+
45
+ def __getitem__(self, name: str):
46
+ attr_name = name.replace(self._prefix + ".", "").replace(".", "_")
47
+ return getattr(self, attr_name)
48
+
49
+ def __setitem__(self, name: str, value: Any):
50
+ attr_name = name.replace(self._prefix + ".", "").replace(".", "_")
51
+ curr_val = getattr(self, attr_name)
52
+ t1, t2 = type(curr_val), type(value)
53
+ check_not_none(curr_val, f"Preference '{name}' does not exist")
54
+ check_argument(t1 == t2, f"Preference '{name}' value must be of type '{t1}', not '{t2}'")
55
+ self._overrides[self._get_name(name)] = value
56
+
57
+ def __iter__(self):
58
+ return self._overrides.__iter__()
59
+
60
+ def __len__(self):
61
+ return len(self._overrides)
62
+
63
+ def get_preference(self, name: str, default: Any = None) -> Any:
64
+ """Retrieve preference for the given specified name. If not found, return the default value.
65
+ :param name: the preference name.
66
+ :param default: the preference default value.
67
+ :return the preference value.
68
+ """
69
+ pref_name = self._get_name(name)
70
+ value = get_or_default_by_key(self._overrides, pref_name, default)
71
+ if str_value := os.environ.get(environ_name(pref_name)):
72
+ type_attr = type(value)
73
+ try:
74
+ if isinstance(value, Enum):
75
+ value = type_attr[str_value.upper()]
76
+ else:
77
+ value = type_attr(str_value)
78
+ except (KeyError, TypeError, ValueError):
79
+ pass
80
+ return value
81
+
82
+ def _get_name(self, name: str) -> str:
83
+ """Retrieve the preference name based. It uses the specified prefix to compose the actual name.
84
+ :param name: the preference name.
85
+ :return the prefixed preference name.
86
+ """
87
+ return ensure_startswith(name, self._prefix + ".")
@@ -0,0 +1,14 @@
1
+ # _*_ coding: utf-8 _*_
2
+ #
3
+ # hspylib-clitt v0.9.119
4
+ #
5
+ # Package: main.build.lib.build.lib.clitt.core.term
6
+ """Package initialization."""
7
+
8
+ __all__ = [
9
+ 'commons',
10
+ 'cursor',
11
+ 'screen',
12
+ 'terminal'
13
+ ]
14
+ __version__ = '0.9.119'
@@ -0,0 +1,106 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+
4
+ """
5
+ @project: hspylib-clitt
6
+ @package: hspylib-clitt.main.clitt.core.term
7
+ @file: commons.py
8
+ @created: Wed, 20 Mar 2024
9
+ @author: "<B>H</B>ugo <B>S</B>aporetti <B>J</B>unior")"
10
+ @site: "https://github.com/yorevs/hspylib")
11
+ @license: MIT - Please refer to <https://opensource.org/licenses/MIT>
12
+
13
+ Copyright 2024, HSPyLib team
14
+ """
15
+
16
+ import re
17
+ import sys
18
+ import termios
19
+ import tty
20
+ from shutil import get_terminal_size
21
+ from typing import Callable, Tuple, TypeAlias, Union
22
+
23
+ from hspylib.core.enums.enumeration import Enumeration
24
+ from hspylib.core.tools.commons import is_debugging
25
+ from hspylib.modules.cli.vt100.vt_100 import Vt100
26
+
27
+ # fmt: off
28
+ Dimension : TypeAlias = Tuple[int, int]
29
+ Position : TypeAlias = Tuple[int, int]
30
+ Resize_Cb : TypeAlias = Callable[[], None]
31
+ MoveDirection : TypeAlias = "Direction"
32
+ EraseDirection : TypeAlias = Union["Direction", "Portion"]
33
+ # fmt: on
34
+
35
+
36
+ def is_a_tty() -> bool:
37
+ """Checks whether we are under a tty environment."""
38
+ try:
39
+ return sys.stdout.isatty() and sys.stdin.isatty()
40
+ except ValueError:
41
+ return sys.stdout.isatty()
42
+
43
+
44
+ class Direction(Enumeration):
45
+ """Provide a base class for the cursor direction."""
46
+
47
+ # fmt: off
48
+ UP = '%ED1%', '%CUU({n})%' # Cursor up (line)
49
+ RIGHT = '%EL0%', '%CUF({n})%' # Cursor right (forward)
50
+ DOWN = '%ED0%', '%CUD({n})%' # Cursor down (line)
51
+ LEFT = '%EL1%', '%CUB({n})%' # Cursor left (backward)
52
+ # fmt: on
53
+
54
+
55
+ class Portion(Enumeration):
56
+ """Provide a base class for the portions of the screen."""
57
+
58
+ # fmt: off
59
+ SCREEN = '%ED2%', '' # Entire screen (screen)
60
+ LINE = '%EL2%', '' # Entire line (line)
61
+ # fmt: on
62
+
63
+
64
+ def get_dimensions(fallback: Tuple[int, int] = (24, 80)) -> Tuple[int, int]:
65
+ """Retrieve the size of the terminal.
66
+ :return lines, columns
67
+ """
68
+ if not is_a_tty():
69
+ return fallback
70
+ dim = get_terminal_size((fallback[1], fallback[0]))
71
+ return dim.lines, dim.columns
72
+
73
+
74
+ def get_cursor_position(fallback: Tuple[int, int] = (0, 0)) -> Tuple[int, int]:
75
+ """Get the terminal cursor position.
76
+ :return line, column
77
+ """
78
+ pos = fallback
79
+
80
+ if is_debugging():
81
+ return pos
82
+
83
+ if not is_a_tty():
84
+ return pos
85
+
86
+ buf, re_query_resp = "", r"^\x1b\[(\d*);(\d*)R"
87
+ stdin, attrs = None, None
88
+
89
+ try:
90
+ stdin = sys.stdin.fileno() # Get the stdin file descriptor.
91
+ attrs = termios.tcgetattr(stdin) # Save terminal attributes.
92
+ tty.setcbreak(stdin, termios.TCSANOW)
93
+ sys.stdout.write(Vt100.get_cursor_pos())
94
+ sys.stdout.flush()
95
+ while not buf or buf[-1] != "R":
96
+ buf += sys.stdin.read(1)
97
+ if matches := re.match(re_query_resp, buf): # If the response is 'Esc[r;cR'
98
+ groups = matches.groups()
99
+ pos = int(groups[0]), int(groups[1])
100
+ except termios.error:
101
+ pass
102
+ finally:
103
+ if stdin and attrs:
104
+ termios.tcsetattr(stdin, termios.TCSANOW, attrs) # Reset terminal attributes
105
+
106
+ return pos
@@ -0,0 +1,174 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+
4
+ """
5
+ @project: hspylib-clitt
6
+ @package: hspylib-clitt.main.clitt.core.term
7
+ @file: cursor.py
8
+ @created: Wed, 20 Mar 2024
9
+ @author: "<B>H</B>ugo <B>S</B>aporetti <B>J</B>unior")"
10
+ @site: "https://github.com/yorevs/hspylib")
11
+ @license: MIT - Please refer to <https://opensource.org/licenses/MIT>
12
+
13
+ Copyright 2024, HSPyLib team
14
+ """
15
+
16
+ from clitt.core.term.commons import Direction, EraseDirection, get_cursor_position, MoveDirection, Portion, Position
17
+ from hspylib.core.metaclass.singleton import Singleton
18
+ from hspylib.core.tools.commons import sysout
19
+ from hspylib.core.tools.text_tools import last_index_of
20
+ from hspylib.modules.cli.vt100.vt_100 import Vt100
21
+ from hspylib.modules.cli.vt100.vt_code import VtCode
22
+ from hspylib.modules.cli.vt100.vt_color import VtColor
23
+ from typing import Any
24
+
25
+ import os
26
+
27
+
28
+ class Cursor(metaclass=Singleton):
29
+ """Provide a base class for the screen cursor."""
30
+
31
+ INSTANCE = None
32
+
33
+ CURSOR_HOME = 1, 1
34
+
35
+ def __init__(self):
36
+ self._position: Position = get_cursor_position() or self.CURSOR_HOME
37
+ self._bottom: Position = self.CURSOR_HOME
38
+ self._saved_attrs = self._position, self._bottom
39
+
40
+ def __str__(self):
41
+ return f"({', '.join(list(map(str, self._position)))})"
42
+
43
+ def __repr__(self):
44
+ return str(self)
45
+
46
+ @property
47
+ def position(self) -> Position:
48
+ return self._position
49
+
50
+ @position.setter
51
+ def position(self, new_position: Position) -> None:
52
+ self._bottom = (new_position[0], new_position[1]) if new_position >= self._bottom else self._bottom
53
+ self._position = new_position
54
+
55
+ @property
56
+ def bottom(self) -> Position:
57
+ return self._bottom
58
+
59
+ def home(self) -> None:
60
+ """Move the cursor to home position.
61
+ :return None
62
+ """
63
+ self.move_to(self.CURSOR_HOME[0], self.CURSOR_HOME[1])
64
+
65
+ def end(self) -> None:
66
+ """Move the cursor to the bottom most position on the screen.
67
+ :return None
68
+ """
69
+ self.move_to(self.bottom[0], self.bottom[1])
70
+
71
+ def move_to(self, row: int = None, column: int = None) -> Position:
72
+ """Move the cursor to the specified position.
73
+ :param row the specified row to move.
74
+ :param column the specified column to move.
75
+ :return the cursor position after moving.
76
+ """
77
+ row_pos = max(self.CURSOR_HOME[0], row if row is not None else self.position[0])
78
+ col_pos = max(self.CURSOR_HOME[1], column if column is not None else self.position[1])
79
+ sysout(f"%CUP({row_pos};{col_pos})%", end="")
80
+ self.position = row_pos, col_pos
81
+ return self.position
82
+
83
+ def move(self, amount: int, direction: MoveDirection) -> Position:
84
+ """Move the cursor towards the specified direction.
85
+ :param amount the amount of columns to move.
86
+ :param direction the direction to move.
87
+ :return the cursor position after moving.
88
+ """
89
+ if amount > 0:
90
+ sysout(direction.value[1].format(n=amount), end="")
91
+ row_pos, col_pos = self.position
92
+ match direction:
93
+ case Direction.UP:
94
+ row_pos -= max(0, amount)
95
+ case Direction.DOWN:
96
+ row_pos += max(0, amount)
97
+ case Direction.LEFT:
98
+ col_pos -= max(0, amount)
99
+ case Direction.RIGHT:
100
+ col_pos += max(0, amount)
101
+ self.position = row_pos, col_pos
102
+ return self.position
103
+
104
+ def erase(self, direction: EraseDirection) -> Position:
105
+ """Erase the screen following the specified direction.
106
+ Note: It does not move the cursor along the way.
107
+ :param direction the direction to erase the screen.
108
+ :return the cursor position after erasing.
109
+ """
110
+ sysout(direction.value[0], end="")
111
+ return self.position
112
+
113
+ def erase_line(self) -> Position:
114
+ """Erase the previous line of the screen."""
115
+ row_pos, col_pos = self.position
116
+ self.move(1, Direction.UP)
117
+ self.erase(Portion.LINE)
118
+ self.move(col_pos, Direction.LEFT)
119
+ self.position = row_pos, 0
120
+ return self.position
121
+
122
+ def track(self) -> Position:
123
+ """Track the cursor position.
124
+ :return the tracked cursor position.
125
+ """
126
+ self.position = get_cursor_position() or self.position
127
+ return self.position
128
+
129
+ def write(self, obj: Any, end: str = "") -> Position:
130
+ """Write the string representation of the object to the screen.
131
+ :param obj the object to be written.
132
+ :param end string appended after the last value, default a newline.
133
+ :return the cursor position after writing.
134
+ """
135
+ sysout(obj, end=end)
136
+ text = (str(obj) + end).replace("%EOL%", os.linesep)
137
+ text = VtColor.strip_colors(VtCode.strip_codes(text))
138
+ text_offset = len(text[max(0, last_index_of(text, os.linesep)) :])
139
+ self.position = self.position[0] + text.count(os.linesep), text_offset + (
140
+ self.position[1] if text.count(os.linesep) == 0 else 0
141
+ )
142
+ return self.position
143
+
144
+ def writeln(self, obj: Any) -> Position:
145
+ """Write the string representation of the object to the screen, appending a new line.
146
+ :param obj the object to be written.
147
+ :return the cursor position after writing.
148
+ """
149
+ return self.write(obj, end=os.linesep)
150
+
151
+ def save(self) -> Position:
152
+ """Save the current cursor position and attributes.
153
+ :return the actual cursor position.
154
+ """
155
+ sysout(Vt100.save_cursor(), end="")
156
+ self._saved_attrs = self._position, self._bottom
157
+ return self.position
158
+
159
+ def restore(self) -> Position:
160
+ """Restore the saved cursor position and attributes.
161
+ :return the cursor position after restoration.
162
+ """
163
+ sysout(Vt100.restore_cursor(), end="")
164
+ self._position = self._saved_attrs[0]
165
+ self._bottom = self._saved_attrs[1]
166
+ return self.position
167
+
168
+ def reset_mode(self, end="") -> Position:
169
+ """Reset cursor modifiers."""
170
+ sysout(Vt100.mode(0), end=end)
171
+ return self.position
172
+
173
+
174
+ assert (cursor := Cursor().INSTANCE) is not None, "Failed to create Cursor instance"
@@ -0,0 +1,106 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+
4
+ """
5
+ @project: hspylib-clitt
6
+ @package: hspylib-clitt.main.clitt.core.term
7
+ @file: screen.py
8
+ @created: Wed, 20 Mar 2024
9
+ @author: "<B>H</B>ugo <B>S</B>aporetti <B>J</B>unior")"
10
+ @site: "https://github.com/yorevs/hspylib")
11
+ @license: MIT - Please refer to <https://opensource.org/licenses/MIT>
12
+
13
+ Copyright 2024, HSPyLib team
14
+ """
15
+
16
+ from clitt.core.term.commons import Dimension, get_dimensions, Portion, Resize_Cb
17
+ from clitt.core.term.cursor import Cursor
18
+ from clitt.core.tui.tui_preferences import TUIPreferences
19
+ from hspylib.core.metaclass.singleton import Singleton
20
+ from hspylib.core.tools.commons import sysout
21
+ from threading import Timer
22
+ from typing import List, Optional
23
+
24
+ import threading
25
+
26
+
27
+ class Screen(metaclass=Singleton):
28
+ """Provide a base class for terminal UI components."""
29
+
30
+ INSTANCE = None
31
+
32
+ RESIZE_WATCH_INTERVAL = 0.5
33
+
34
+ def __init__(self):
35
+ self._preferences: TUIPreferences = TUIPreferences.INSTANCE
36
+ self._dimension: Dimension = get_dimensions()
37
+ self._cursor: Cursor = Cursor.INSTANCE or Cursor()
38
+ self._resize_timer: Optional[Timer] = None
39
+ self._cb_watchers: List[Resize_Cb] = []
40
+ self._alternate: bool = False
41
+ self._resize_watcher()
42
+
43
+ def __str__(self):
44
+ return f"Terminal.Screen(rows={self.lines}, columns={self.columns}, cursor={self.cursor})"
45
+
46
+ def __repr__(self):
47
+ return str(self)
48
+
49
+ @property
50
+ def preferences(self) -> TUIPreferences:
51
+ return self._preferences
52
+
53
+ @property
54
+ def dimension(self) -> Dimension:
55
+ return self._dimension
56
+
57
+ @property
58
+ def lines(self) -> int:
59
+ return self._dimension[0]
60
+
61
+ @property
62
+ def columns(self) -> int:
63
+ return self._dimension[1]
64
+
65
+ @property
66
+ def cursor(self) -> Cursor:
67
+ return self._cursor
68
+
69
+ @property
70
+ def alternate(self) -> bool:
71
+ return self._alternate
72
+
73
+ @alternate.setter
74
+ def alternate(self, enable: bool) -> None:
75
+ """Switch to the alternate screen buffer.
76
+ :param enable: alternate enable on/off.
77
+ """
78
+ if enable != self._alternate:
79
+ self._alternate = enable
80
+ sysout(f"%SC{'A' if enable else 'M'}%", end="")
81
+ self.cursor.track()
82
+
83
+ def clear(self) -> None:
84
+ """Clear terminal and move the cursor to HOME position (0, 0)."""
85
+ self.cursor.home()
86
+ self.cursor.erase(Portion.SCREEN)
87
+
88
+ def add_watcher(self, watcher: Resize_Cb) -> None:
89
+ """Add a resize watcher."""
90
+ self._cb_watchers.append(watcher)
91
+ if not self._resize_timer:
92
+ self._resize_watcher()
93
+
94
+ def _resize_watcher(self) -> None:
95
+ """Add a watcher for screen resizes. If a resize is detected, the callback is called with the
96
+ new dimension."""
97
+ if self._cb_watchers and threading.main_thread().is_alive():
98
+ dimension: Dimension = get_dimensions()
99
+ self._resize_timer = Timer(self.RESIZE_WATCH_INTERVAL, self._resize_watcher)
100
+ if dimension != self._dimension:
101
+ list(map(lambda cb_w: cb_w(), self._cb_watchers))
102
+ self._dimension = dimension
103
+ self._resize_timer.start()
104
+
105
+
106
+ assert (screen := Screen().INSTANCE) is not None, "Failed to create Screen instance"