tilemap-editor 4.3.5__tar.gz → 4.3.6__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 (229) hide show
  1. {tilemap_editor-4.3.5/src/tilemap_editor.egg-info → tilemap_editor-4.3.6}/PKG-INFO +1 -1
  2. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/pyproject.toml +1 -1
  3. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/editor.py +2 -0
  4. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/tilemap.py +2 -0
  5. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6/src/tilemap_editor.egg-info}/PKG-INFO +1 -1
  6. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/tilemap_editor.egg-info/SOURCES.txt +1 -0
  7. tilemap_editor-4.3.6/src/utils/property_suggestions.py +70 -0
  8. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/widgets/layer_selector.py +1 -0
  9. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/widgets/tile_selector.py +5 -0
  10. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/widgets/ui/node_editor.py +2 -0
  11. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/widgets/ui/property_editor.py +118 -18
  12. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/LICENSE +0 -0
  13. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/MANIFEST.in +0 -0
  14. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/README.md +0 -0
  15. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/assets/fonts/jetbrain-fonts/JetBrainsMono-Bold.ttf +0 -0
  16. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/assets/fonts/jetbrain-fonts/JetBrainsMono-BoldItalic.ttf +0 -0
  17. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/assets/fonts/jetbrain-fonts/JetBrainsMono-Italic.ttf +0 -0
  18. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/assets/fonts/jetbrain-fonts/JetBrainsMono-Regular.ttf +0 -0
  19. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/assets/fonts/noto/NotoSans-Bold.ttf +0 -0
  20. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/assets/fonts/noto/NotoSans-BoldItalic.ttf +0 -0
  21. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/assets/fonts/noto/NotoSans-Italic.ttf +0 -0
  22. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/assets/fonts/noto/NotoSans-Regular.ttf +0 -0
  23. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/assets/icons/arrow-down.svg +0 -0
  24. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/assets/icons/check.svg +0 -0
  25. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/assets/icons/checked.svg +0 -0
  26. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/assets/icons/close.svg +0 -0
  27. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/assets/icons/duplicate.svg +0 -0
  28. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/assets/icons/error.svg +0 -0
  29. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/assets/icons/file.svg +0 -0
  30. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/assets/icons/filedead.svg +0 -0
  31. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/assets/icons/fit.svg +0 -0
  32. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/assets/icons/folder.svg +0 -0
  33. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/assets/icons/grid.svg +0 -0
  34. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/assets/icons/image.svg +0 -0
  35. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/assets/icons/info.svg +0 -0
  36. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/assets/icons/load.svg +0 -0
  37. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/assets/icons/loop.svg +0 -0
  38. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/assets/icons/onion.svg +0 -0
  39. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/assets/icons/pan.svg +0 -0
  40. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/assets/icons/pause.svg +0 -0
  41. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/assets/icons/pencil.svg +0 -0
  42. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/assets/icons/play.svg +0 -0
  43. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/assets/icons/plus.svg +0 -0
  44. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/assets/icons/radio.svg +0 -0
  45. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/assets/icons/reset.svg +0 -0
  46. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/assets/icons/save.svg +0 -0
  47. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/assets/icons/skip-back.svg +0 -0
  48. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/assets/icons/skip-forward.svg +0 -0
  49. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/assets/icons/stop.svg +0 -0
  50. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/assets/icons/tilemap.svg +0 -0
  51. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/assets/icons/tileset.svg +0 -0
  52. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/assets/icons/unchecked.svg +0 -0
  53. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/assets/icons/warning.svg +0 -0
  54. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/assets/icons/zoomin.svg +0 -0
  55. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/assets/icons/zoomout.svg +0 -0
  56. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/setup.cfg +0 -0
  57. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/constants.py +0 -0
  58. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/event_map.py +0 -0
  59. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/layers.py +0 -0
  60. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/main.py +0 -0
  61. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/node_manager.py +0 -0
  62. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/nodes.py +0 -0
  63. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/plugins/__init__.py +0 -0
  64. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/plugins/character_collision/__init__.py +0 -0
  65. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/plugins/character_collision/editor.py +0 -0
  66. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/plugins/character_collision/models.py +0 -0
  67. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/plugins/character_collision/protocols.py +0 -0
  68. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/plugins/character_collision/shape_editor.py +0 -0
  69. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/plugins/character_collision/standalone.py +0 -0
  70. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/plugins/object_tileset_collision/__init__.py +0 -0
  71. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/plugins/object_tileset_collision/editor.py +0 -0
  72. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/plugins/object_tileset_collision/models.py +0 -0
  73. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/plugins/object_tileset_collision/protocols.py +0 -0
  74. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/plugins/object_tileset_collision/standalone.py +0 -0
  75. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/plugins/sprite_animation/__init__.py +0 -0
  76. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/plugins/sprite_animation/__main__.py +0 -0
  77. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/plugins/sprite_animation/clipboard_util.py +0 -0
  78. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/plugins/sprite_animation/editor.py +0 -0
  79. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/plugins/sprite_animation/frame_picker.py +0 -0
  80. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/plugins/sprite_animation/models.py +0 -0
  81. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/plugins/sprite_animation/preview.py +0 -0
  82. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/plugins/sprite_animation/protocols.py +0 -0
  83. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/plugins/sprite_animation/runtime_load.py +0 -0
  84. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/plugins/sprite_animation/standalone.py +0 -0
  85. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/plugins/sprite_animation/timeline.py +0 -0
  86. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/plugins/sprite_animation/validation.py +0 -0
  87. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/plugins/sprite_editor/__init__.py +0 -0
  88. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/plugins/sprite_editor/dialogs.py +0 -0
  89. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/plugins/sprite_editor/editor.py +0 -0
  90. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/plugins/sprite_editor/region_export.py +0 -0
  91. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/plugins/sprite_editor/standalone.py +0 -0
  92. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/plugins/tileset_collision/__init__.py +0 -0
  93. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/plugins/tileset_collision/collision_painter.py +0 -0
  94. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/plugins/tileset_collision/editor.py +0 -0
  95. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/plugins/tileset_collision/models.py +0 -0
  96. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/plugins/tileset_collision/protocols.py +0 -0
  97. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/plugins/tileset_collision/standalone.py +0 -0
  98. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/standalone_automap.py +0 -0
  99. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/standalone_error_console.py +0 -0
  100. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/standalone_filemanager.py +0 -0
  101. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/standalone_image_viewer.py +0 -0
  102. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/tilemap_editor/__init__.py +0 -0
  103. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/tilemap_editor/__main__.py +0 -0
  104. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/tilemap_editor/assets/__init__.py +0 -0
  105. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/tilemap_editor/assets/fonts/jetbrain-fonts/JetBrainsMono-Bold.ttf +0 -0
  106. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/tilemap_editor/assets/fonts/jetbrain-fonts/JetBrainsMono-BoldItalic.ttf +0 -0
  107. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/tilemap_editor/assets/fonts/jetbrain-fonts/JetBrainsMono-Italic.ttf +0 -0
  108. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/tilemap_editor/assets/fonts/jetbrain-fonts/JetBrainsMono-Regular.ttf +0 -0
  109. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/tilemap_editor/assets/fonts/noto/NotoSans-Bold.ttf +0 -0
  110. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/tilemap_editor/assets/fonts/noto/NotoSans-BoldItalic.ttf +0 -0
  111. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/tilemap_editor/assets/fonts/noto/NotoSans-Italic.ttf +0 -0
  112. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/tilemap_editor/assets/fonts/noto/NotoSans-Regular.ttf +0 -0
  113. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/tilemap_editor/assets/icons/ToolMove.svg +0 -0
  114. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/tilemap_editor/assets/icons/arrow-down.svg +0 -0
  115. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/tilemap_editor/assets/icons/check.svg +0 -0
  116. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/tilemap_editor/assets/icons/checked.svg +0 -0
  117. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/tilemap_editor/assets/icons/close.svg +0 -0
  118. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/tilemap_editor/assets/icons/duplicate.svg +0 -0
  119. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/tilemap_editor/assets/icons/error.svg +0 -0
  120. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/tilemap_editor/assets/icons/file.svg +0 -0
  121. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/tilemap_editor/assets/icons/filedead.svg +0 -0
  122. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/tilemap_editor/assets/icons/fit.svg +0 -0
  123. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/tilemap_editor/assets/icons/fold_down_arrow.svg +0 -0
  124. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/tilemap_editor/assets/icons/folder.svg +0 -0
  125. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/tilemap_editor/assets/icons/gear.svg +0 -0
  126. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/tilemap_editor/assets/icons/grid.svg +0 -0
  127. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/tilemap_editor/assets/icons/image.svg +0 -0
  128. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/tilemap_editor/assets/icons/info.svg +0 -0
  129. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/tilemap_editor/assets/icons/load.svg +0 -0
  130. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/tilemap_editor/assets/icons/loop.svg +0 -0
  131. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/tilemap_editor/assets/icons/miniobj.svg +0 -0
  132. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/tilemap_editor/assets/icons/onion.svg +0 -0
  133. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/tilemap_editor/assets/icons/pan.svg +0 -0
  134. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/tilemap_editor/assets/icons/pause.svg +0 -0
  135. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/tilemap_editor/assets/icons/pencil.svg +0 -0
  136. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/tilemap_editor/assets/icons/play.svg +0 -0
  137. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/tilemap_editor/assets/icons/plus.svg +0 -0
  138. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/tilemap_editor/assets/icons/radio.svg +0 -0
  139. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/tilemap_editor/assets/icons/reset.svg +0 -0
  140. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/tilemap_editor/assets/icons/save.svg +0 -0
  141. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/tilemap_editor/assets/icons/skip-back.svg +0 -0
  142. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/tilemap_editor/assets/icons/skip-forward.svg +0 -0
  143. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/tilemap_editor/assets/icons/stop.svg +0 -0
  144. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/tilemap_editor/assets/icons/tilemap.svg +0 -0
  145. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/tilemap_editor/assets/icons/tileset.svg +0 -0
  146. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/tilemap_editor/assets/icons/unchecked.svg +0 -0
  147. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/tilemap_editor/assets/icons/unfold_right_arrow.svg +0 -0
  148. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/tilemap_editor/assets/icons/warning.svg +0 -0
  149. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/tilemap_editor/assets/icons/zoomin.svg +0 -0
  150. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/tilemap_editor/assets/icons/zoomout.svg +0 -0
  151. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/tilemap_editor/cli.py +0 -0
  152. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/tilemap_editor/main.py +0 -0
  153. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/tilemap_editor/settings.py +0 -0
  154. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/tilemap_editor.egg-info/dependency_links.txt +0 -0
  155. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/tilemap_editor.egg-info/entry_points.txt +0 -0
  156. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/tilemap_editor.egg-info/requires.txt +0 -0
  157. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/tilemap_editor.egg-info/top_level.txt +0 -0
  158. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/ttypes/__init__.py +0 -0
  159. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/ttypes/tilemap.py +0 -0
  160. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/utils/__init__.py +0 -0
  161. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/utils/editor_preference.py +0 -0
  162. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/utils/error_handler.py +0 -0
  163. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/utils/font_manager.py +0 -0
  164. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/utils/history.py +0 -0
  165. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/utils/icon_manager.py +0 -0
  166. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/utils/icons_cache.py +0 -0
  167. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/utils/log_capture.py +0 -0
  168. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/utils/project_paths.py +0 -0
  169. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/utils/serialization.py +0 -0
  170. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/utils/standalone.py +0 -0
  171. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/utils/validation.py +0 -0
  172. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/widgets/__init__.py +0 -0
  173. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/widgets/automap_models.py +0 -0
  174. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/widgets/autotile_template.py +0 -0
  175. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/widgets/autotiler.py +0 -0
  176. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/widgets/filemanager.py +0 -0
  177. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/widgets/input.py +0 -0
  178. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/widgets/map_properties.py +0 -0
  179. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/widgets/mapsetup.py +0 -0
  180. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/widgets/particle_presets.py +0 -0
  181. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/widgets/particle_system.py +0 -0
  182. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/widgets/regex_automap_designer.py +0 -0
  183. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/widgets/spritesheet_grid.py +0 -0
  184. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/widgets/tile_grid.py +0 -0
  185. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/widgets/ui/button.py +0 -0
  186. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/widgets/ui/checkbox.py +0 -0
  187. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/widgets/ui/collision_layer_mask.py +0 -0
  188. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/widgets/ui/collision_layer_sidebar.py +0 -0
  189. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/widgets/ui/confirm_dialog.py +0 -0
  190. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/widgets/ui/dialog_base.py +0 -0
  191. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/widgets/ui/drag_tracker.py +0 -0
  192. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/widgets/ui/draw_utils.py +0 -0
  193. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/widgets/ui/fileinput.py +0 -0
  194. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/widgets/ui/label.py +0 -0
  195. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/widgets/ui/layer_type_dialog.py +0 -0
  196. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/widgets/ui/menubar.py +0 -0
  197. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/widgets/ui/mode_indicator.py +0 -0
  198. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/widgets/ui/node_selector.py +0 -0
  199. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/widgets/ui/notification.py +0 -0
  200. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/widgets/ui/particle_config_dialog.py +0 -0
  201. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/widgets/ui/region_selector.py +0 -0
  202. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/widgets/ui/scrollbar.py +0 -0
  203. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/widgets/ui/sidebar_container.py +0 -0
  204. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/widgets/ui/splitter.py +0 -0
  205. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/widgets/ui/status_bar.py +0 -0
  206. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/widgets/ui/theme.py +0 -0
  207. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/widgets/ui/tileset_type_dialog.py +0 -0
  208. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/widgets/ui/toast.py +0 -0
  209. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/widgets/ui/tool_manager.py +0 -0
  210. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/widgets/ui/toolbar.py +0 -0
  211. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/widgets/ui/tooltip.py +0 -0
  212. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/widgets/ui/tree_widget.py +0 -0
  213. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/src/widgets/widget_base.py +0 -0
  214. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/tests/test_animation_library_grid_offset.py +0 -0
  215. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/tests/test_collision_layer_mask.py +0 -0
  216. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/tests/test_collision_layer_sidebar.py +0 -0
  217. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/tests/test_drag_tracker.py +0 -0
  218. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/tests/test_editor_pan_mode.py +0 -0
  219. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/tests/test_gid_collision.py +0 -0
  220. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/tests/test_layers_autotile.py +0 -0
  221. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/tests/test_project_paths.py +0 -0
  222. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/tests/test_render_scale.py +0 -0
  223. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/tests/test_serialization_regression.py +0 -0
  224. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/tests/test_sprite_animation_editor_grid.py +0 -0
  225. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/tests/test_tile_grid_selection.py +0 -0
  226. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/tests/test_tile_selector_pick.py +0 -0
  227. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/tests/test_tilemap_save.py +0 -0
  228. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/tests/test_timeline_invalidate_cache.py +0 -0
  229. {tilemap_editor-4.3.5 → tilemap_editor-4.3.6}/tests/test_toolbar_tools.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tilemap-editor
3
- Version: 4.3.5
3
+ Version: 4.3.6
4
4
  Summary: Pygame tilemap editor with collision, animation, sprite & particle tools
5
5
  Author: tilemap editor contributors
6
6
  License: Proprietary
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "tilemap-editor"
7
- version = "4.3.5"
7
+ version = "4.3.6"
8
8
  description = "Pygame tilemap editor with collision, animation, sprite & particle tools"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -21,6 +21,7 @@ from constants import BASE_PATH
21
21
  from node_manager import NodeManager
22
22
  from tilemap import Tilemap
23
23
  from utils import error_context, error_handler
24
+ from utils.property_suggestions import PropertySuggestionRegistry
24
25
  from utils.standalone import launch_standalone
25
26
  from widgets.autotiler import AutotileRuleDesigner
26
27
  from widgets.layer_selector import LayerSelector
@@ -212,6 +213,7 @@ class Editor:
212
213
  self.regex_automap_designer = RegexAutomapDesigner(self, 150, 100)
213
214
  self.notifications = NotificationManager(self)
214
215
  self.tooltip = TooltipManager()
216
+ self.suggestion_registry = PropertySuggestionRegistry()
215
217
  self.error_console_process: subprocess.Popen | None = None
216
218
  self.property_editor: PropertyEditor | None = None
217
219
  self.particle_config_dialog: ParticleConfigDialog | None = None
@@ -623,6 +623,8 @@ class Tilemap:
623
623
  if hasattr(self.editor, "node_selector"):
624
624
  self.editor.node_selector._rebuild_filter()
625
625
 
626
+ if hasattr(self.editor, "suggestion_registry"):
627
+ self.editor.suggestion_registry.refresh(self.editor)
626
628
  self.initialized = True
627
629
 
628
630
  if self.editor.tile_grid_widget:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tilemap-editor
3
- Version: 4.3.5
3
+ Version: 4.3.6
4
4
  Summary: Pygame tilemap editor with collision, animation, sprite & particle tools
5
5
  Author: tilemap editor contributors
6
6
  License: Proprietary
@@ -159,6 +159,7 @@ src/utils/icon_manager.py
159
159
  src/utils/icons_cache.py
160
160
  src/utils/log_capture.py
161
161
  src/utils/project_paths.py
162
+ src/utils/property_suggestions.py
162
163
  src/utils/serialization.py
163
164
  src/utils/standalone.py
164
165
  src/utils/validation.py
@@ -0,0 +1,70 @@
1
+ from typing import TYPE_CHECKING
2
+
3
+ if TYPE_CHECKING:
4
+ from editor import Editor
5
+
6
+
7
+ class PropertySuggestionRegistry:
8
+ def __init__(self):
9
+ self._data: dict[str, list[str]] = {}
10
+
11
+ def refresh(self, editor: "Editor"):
12
+ values: dict[str, set[str]] = {}
13
+
14
+ if editor.tileset_widget:
15
+ for ts in editor.tileset_widget.tilesets:
16
+ for k, v in ts.properties.items():
17
+ values.setdefault(k, set()).add(str(v))
18
+ for tile_props in ts.tile_properties.values():
19
+ for k, v in tile_props.items():
20
+ values.setdefault(k, set()).add(str(v))
21
+
22
+ if editor.tilemap:
23
+ for layer in editor.tilemap.layer_manager.layers:
24
+ for k, v in layer.properties.items():
25
+ values.setdefault(k, set()).add(str(v))
26
+ for tile in layer.tiles.values():
27
+ if "properties" in tile:
28
+ for k, v in tile["properties"].items():
29
+ values.setdefault(k, set()).add(str(v))
30
+ if layer.layer_type == "object":
31
+ for obj in layer.objects.values():
32
+ if "properties" in obj:
33
+ for k, v in obj["properties"].items():
34
+ values.setdefault(k, set()).add(str(v))
35
+
36
+ if editor.node_manager:
37
+ for node in editor.node_manager.nodes.values():
38
+ for k, v in node.properties.items():
39
+ values.setdefault(k, set()).add(str(v))
40
+
41
+ self._data = {k: sorted(v) for k, v in values.items()}
42
+
43
+ @property
44
+ def known_keys(self) -> list[str]:
45
+ return sorted(self._data.keys())
46
+
47
+ def ghost_text(self, key: str, input_text: str) -> str:
48
+ if key not in self._data:
49
+ return ""
50
+ prefix = input_text.lower()
51
+ matches = [
52
+ v
53
+ for v in self._data[key]
54
+ if v.lower().startswith(prefix) and v != input_text
55
+ ]
56
+ if matches:
57
+ return matches[0][len(input_text):]
58
+ return ""
59
+
60
+ def key_ghost(self, input_text: str) -> str:
61
+ if not input_text:
62
+ return ""
63
+ prefix = input_text.lower()
64
+ matches = [
65
+ k for k in self._data
66
+ if k.lower().startswith(prefix) and k != input_text
67
+ ]
68
+ if matches:
69
+ return sorted(matches)[0][len(input_text):]
70
+ return ""
@@ -408,6 +408,7 @@ class LayerSelector:
408
408
 
409
409
  def _save_layer_properties(self, layer: Layer, props: dict):
410
410
  layer.properties = props
411
+ self.editor.suggestion_registry.refresh(self.editor)
411
412
  print(f"Saved properties for layer: {layer.name}")
412
413
 
413
414
  def draw(self, screen: Surface) -> None:
@@ -416,6 +416,7 @@ class TileSelector(WidgetBase):
416
416
  self._tree.selected_ids = {tileset_data.uid}
417
417
  if tileset_type == "object":
418
418
  self.selected_tile = (0, 0, surf.get_width(), surf.get_height())
419
+ self.editor.suggestion_registry.refresh(self.editor)
419
420
  except Exception as e:
420
421
  error_handler.capture(e, context="load_tileset_surface")
421
422
 
@@ -479,6 +480,7 @@ class TileSelector(WidgetBase):
479
480
  self._sync_tree()
480
481
  self._tree.selected_ids = {tileset_data.uid}
481
482
 
483
+ self.editor.suggestion_registry.refresh(self.editor)
482
484
  delattr(self, "_pending_tileset_path")
483
485
  delattr(self, "_pending_tileset_surf")
484
486
  if self._pending_tileset_queue:
@@ -561,6 +563,7 @@ class TileSelector(WidgetBase):
561
563
  if not self.tilesets:
562
564
  self.active_idx = -1
563
565
  self._sync_tree()
566
+ self.editor.suggestion_registry.refresh(self.editor)
564
567
 
565
568
  def open_collision_editor(self):
566
569
  if self.active_idx == -1 or self.active_idx >= len(self.tilesets):
@@ -573,6 +576,7 @@ class TileSelector(WidgetBase):
573
576
 
574
577
  def _save_tileset_properties(self, ts: TilesetData, props: dict):
575
578
  ts.properties = props
579
+ self.editor.suggestion_registry.refresh(self.editor)
576
580
  print(f"Saved properties for tileset: {ts.name}")
577
581
 
578
582
  def _save_tile_properties(self, ts: TilesetData, variant_id: int, props: dict):
@@ -582,6 +586,7 @@ class TileSelector(WidgetBase):
582
586
  def _save_tile_properties_multi(self, ts: TilesetData, variant_ids: list[int], props: dict):
583
587
  for vid in variant_ids:
584
588
  ts.tile_properties[vid] = props.copy()
589
+ self.editor.suggestion_registry.refresh(self.editor)
585
590
  if len(variant_ids) == 1:
586
591
  print(f"Saved properties for tile {variant_ids[0]} in tileset: {ts.name}")
587
592
  else:
@@ -356,12 +356,14 @@ class NodeEditor:
356
356
  node = self.editor.node_manager.get_active_node()
357
357
  if node:
358
358
  node.properties = props
359
+ self.editor.suggestion_registry.refresh(self.editor)
359
360
 
360
361
  def _save_particle_config(self, cfg: dict):
361
362
  node = self.editor.node_manager.get_active_node()
362
363
  if node:
363
364
  node.properties.clear()
364
365
  node.properties.update(cfg)
366
+ self.editor.suggestion_registry.refresh(self.editor)
365
367
  self.editor.tile_grid_widget.reset_particle_preview(node.node_id, cfg)
366
368
 
367
369
  def draw(self, screen: pygame.Surface):
@@ -52,6 +52,8 @@ class PropertyEditor:
52
52
  self.is_entering_new_key = False
53
53
 
54
54
  self._hovered_truncated: str | None = None
55
+ self._ghost_text: str = ""
56
+ self.editor.suggestion_registry.refresh(self.editor)
55
57
 
56
58
  btn_h = 30
57
59
  btn_w = 100
@@ -78,6 +80,7 @@ class PropertyEditor:
78
80
  def _on_save_click(self):
79
81
  self.on_save(self.properties)
80
82
  self.active = False
83
+ self._ghost_text = ""
81
84
  self.on_close()
82
85
 
83
86
  def _on_cancel_click(self):
@@ -89,6 +92,7 @@ class PropertyEditor:
89
92
  self.new_key_input = ""
90
93
  self.selected_key = None
91
94
  self.editing_value = False
95
+ self._ghost_text = self.editor.suggestion_registry.key_ghost("")
92
96
 
93
97
  def _update_hovered_tooltip(self, mouse_pos):
94
98
  self._hovered_truncated = None
@@ -132,10 +136,14 @@ class PropertyEditor:
132
136
  self.selected_key = keys[idx]
133
137
  self.editing_value = True
134
138
  self.input_text = str(self.properties[self.selected_key])
139
+ self._ghost_text = self.editor.suggestion_registry.ghost_text(
140
+ self.selected_key, self.input_text
141
+ )
135
142
  self.is_entering_new_key = False
136
143
  return True
137
144
  self.selected_key = None
138
145
  self.editing_value = False
146
+ self._ghost_text = ""
139
147
  self.is_entering_new_key = False
140
148
 
141
149
  elif event.button == 4:
@@ -184,12 +192,36 @@ class PropertyEditor:
184
192
  self.selected_key = self.new_key_input
185
193
  self.editing_value = True
186
194
  self.input_text = ""
195
+ self._ghost_text = self.editor.suggestion_registry.ghost_text(
196
+ self.selected_key, self.input_text
197
+ )
187
198
  self.is_entering_new_key = False
188
199
  return True
200
+ if event.key == pygame.K_TAB:
201
+ if self._ghost_text:
202
+ self.new_key_input = self.new_key_input + self._ghost_text
203
+ self._ghost_text = self.editor.suggestion_registry.key_ghost(
204
+ self.new_key_input
205
+ )
206
+ return True
189
207
  if event.key == pygame.K_BACKSPACE:
190
208
  self.new_key_input = self.new_key_input[:-1]
209
+ self._ghost_text = self.editor.suggestion_registry.key_ghost(
210
+ self.new_key_input
211
+ )
191
212
  else:
192
213
  self.new_key_input += event.unicode
214
+ if self._ghost_text and event.unicode:
215
+ if self._ghost_text[0].lower() == event.unicode.lower():
216
+ self._ghost_text = self._ghost_text[1:]
217
+ else:
218
+ self._ghost_text = self.editor.suggestion_registry.key_ghost(
219
+ self.new_key_input
220
+ )
221
+ else:
222
+ self._ghost_text = self.editor.suggestion_registry.key_ghost(
223
+ self.new_key_input
224
+ )
193
225
  return True
194
226
 
195
227
  if self.editing_value and self.selected_key:
@@ -206,15 +238,35 @@ class PropertyEditor:
206
238
  pass
207
239
  self.properties[self.selected_key] = val
208
240
  self.editing_value = False
241
+ self._ghost_text = ""
242
+ elif event.key == pygame.K_TAB:
243
+ if self._ghost_text:
244
+ self.input_text = self.input_text + self._ghost_text
245
+ self._ghost_text = ""
209
246
  elif event.key == pygame.K_BACKSPACE:
210
247
  self.input_text = self.input_text[:-1]
248
+ self._ghost_text = self.editor.suggestion_registry.ghost_text(
249
+ self.selected_key, self.input_text
250
+ )
211
251
  elif event.key == pygame.K_DELETE:
212
252
  if self.selected_key in self.properties:
213
253
  del self.properties[self.selected_key]
214
254
  self.selected_key = None
215
255
  self.editing_value = False
256
+ self._ghost_text = ""
216
257
  else:
217
258
  self.input_text += event.unicode
259
+ if self._ghost_text and event.unicode:
260
+ if self._ghost_text[0].lower() == event.unicode.lower():
261
+ self._ghost_text = self._ghost_text[1:]
262
+ else:
263
+ self._ghost_text = self.editor.suggestion_registry.ghost_text(
264
+ self.selected_key, self.input_text
265
+ )
266
+ else:
267
+ self._ghost_text = self.editor.suggestion_registry.ghost_text(
268
+ self.selected_key, self.input_text
269
+ )
218
270
  return True
219
271
 
220
272
  return True
@@ -262,23 +314,47 @@ class PropertyEditor:
262
314
  key_surf = self.font_label.render(f"{key}:", True, COLORS.text)
263
315
  screen.blit(key_surf, (row_rect.x + 10, row_rect.y + 10))
264
316
 
317
+ value_x = row_rect.x + 120
318
+ max_width = row_rect.right - value_x - 10
319
+
265
320
  if is_selected and self.editing_value:
266
- val_text = self.input_text + "|"
267
- val_col = COLORS.text
321
+ if self._ghost_text:
322
+ display_input, was_truncated = truncate_text(self.input_text, self.font_label, max_width)
323
+ user_surf = self.font_label.render(display_input, True, COLORS.text)
324
+ screen.blit(user_surf, (value_x, row_rect.y + 10))
325
+ cursor_x = value_x + user_surf.get_width()
326
+ if not was_truncated:
327
+ ghost_surf = self.font_label.render(self._ghost_text, True, COLORS.text_dim)
328
+ ghost_w = ghost_surf.get_width()
329
+ if cursor_x + ghost_w <= row_rect.right - 10:
330
+ screen.blit(ghost_surf, (cursor_x, row_rect.y + 10))
331
+ if pygame.time.get_ticks() // 500 % 2 == 0:
332
+ pygame.draw.line(
333
+ screen, COLORS.text,
334
+ (cursor_x, row_rect.y + 8),
335
+ (cursor_x, row_rect.y + 28), 2,
336
+ )
337
+ else:
338
+ val_text = self.input_text + ("|" if pygame.time.get_ticks() // 500 % 2 == 0 else " ")
339
+ display_val, _ = truncate_text(val_text, self.font_label, max_width)
340
+ val_surf = self.font_label.render(display_val, True, COLORS.text)
341
+ screen.blit(val_surf, (value_x, row_rect.y + 10))
268
342
  else:
269
- val_text = str(self.properties[key])
270
- if isinstance(self.properties[key], bool):
271
- val_col = COLORS.warning
272
- elif isinstance(self.properties[key], (int, float)):
273
- val_col = COLORS.success
343
+ raw_val = str(self.properties[key])
344
+ if raw_val == "":
345
+ val_text = "(empty)"
346
+ val_col = COLORS.text_dim
274
347
  else:
275
- val_col = COLORS.text
276
-
277
- value_x = row_rect.x + 120
278
- max_width = row_rect.right - value_x - 10
279
- display_val, _ = truncate_text(val_text, self.font_label, max_width)
280
- val_surf = self.font_label.render(display_val, True, val_col)
281
- screen.blit(val_surf, (value_x, row_rect.y + 10))
348
+ val_text = raw_val
349
+ if isinstance(self.properties[key], bool):
350
+ val_col = COLORS.warning
351
+ elif isinstance(self.properties[key], (int, float)):
352
+ val_col = COLORS.success
353
+ else:
354
+ val_col = COLORS.text
355
+ display_val, _ = truncate_text(val_text, self.font_label, max_width)
356
+ val_surf = self.font_label.render(display_val, True, val_col)
357
+ screen.blit(val_surf, (value_x, row_rect.y + 10))
282
358
 
283
359
  if self.is_entering_new_key:
284
360
  y = self.rect.y + 40 + len(keys) * self.item_height - self.scroll_y
@@ -286,10 +362,34 @@ class PropertyEditor:
286
362
  self.rect.x + 5, y + 2, self.width - 10, self.item_height - 4
287
363
  )
288
364
  pygame.draw.rect(screen, COLORS.selected, row_rect, border_radius=4)
289
- key_surf = self.font_label.render(
290
- "New Key: " + self.new_key_input + "|", True, COLORS.text
291
- )
292
- screen.blit(key_surf, (row_rect.x + 10, row_rect.y + 10))
365
+ label_w = self.font_label.size("New Key: ")[0]
366
+ lbl_surf = self.font_label.render("New Key: ", True, COLORS.text)
367
+ screen.blit(lbl_surf, (row_rect.x + 10, row_rect.y + 10))
368
+ input_x = row_rect.x + 10 + label_w
369
+ key_input = self.new_key_input
370
+ max_kw = row_rect.right - input_x - 10
371
+ display_key, _ = truncate_text(key_input, self.font_label, max_kw)
372
+ input_surf = self.font_label.render(display_key, True, COLORS.text)
373
+ screen.blit(input_surf, (input_x, row_rect.y + 10))
374
+ cursor_x = input_x + input_surf.get_width()
375
+ if self._ghost_text:
376
+ ghost_surf = self.font_label.render(self._ghost_text, True, COLORS.text_dim)
377
+ max_gw = row_rect.right - cursor_x - 10
378
+ if ghost_surf.get_width() <= max_gw:
379
+ screen.blit(ghost_surf, (cursor_x, row_rect.y + 10))
380
+ if pygame.time.get_ticks() // 500 % 2 == 0:
381
+ pygame.draw.line(
382
+ screen, COLORS.text,
383
+ (cursor_x, row_rect.y + 8),
384
+ (cursor_x, row_rect.y + 28), 2,
385
+ )
386
+ else:
387
+ if pygame.time.get_ticks() // 500 % 2 == 0:
388
+ cursor_char = "|"
389
+ else:
390
+ cursor_char = " "
391
+ cur_surf = self.font_label.render(cursor_char, True, COLORS.text)
392
+ screen.blit(cur_surf, (cursor_x, row_rect.y + 10))
293
393
 
294
394
  screen.set_clip(clip)
295
395
 
File without changes
File without changes
File without changes