tilemap-editor 3.2.8__tar.gz → 3.2.10__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 (199) hide show
  1. {tilemap_editor-3.2.8/src/tilemap_editor.egg-info → tilemap_editor-3.2.10}/PKG-INFO +1 -1
  2. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/pyproject.toml +1 -1
  3. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/tilemap.py +3 -0
  4. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10/src/tilemap_editor.egg-info}/PKG-INFO +1 -1
  5. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/ttypes/tilemap.py +1 -0
  6. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/widgets/tile_grid.py +9 -0
  7. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/widgets/tile_selector.py +75 -8
  8. tilemap_editor-3.2.10/src/widgets/ui/tileset_type_dialog.py +451 -0
  9. tilemap_editor-3.2.8/src/widgets/ui/tileset_type_dialog.py +0 -214
  10. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/LICENSE +0 -0
  11. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/MANIFEST.in +0 -0
  12. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/README.md +0 -0
  13. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/assets/fonts/jetbrain-fonts/JetBrainsMono-Bold.ttf +0 -0
  14. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/assets/fonts/jetbrain-fonts/JetBrainsMono-BoldItalic.ttf +0 -0
  15. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/assets/fonts/jetbrain-fonts/JetBrainsMono-Italic.ttf +0 -0
  16. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/assets/fonts/jetbrain-fonts/JetBrainsMono-Regular.ttf +0 -0
  17. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/assets/fonts/noto/NotoSans-Bold.ttf +0 -0
  18. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/assets/fonts/noto/NotoSans-BoldItalic.ttf +0 -0
  19. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/assets/fonts/noto/NotoSans-Italic.ttf +0 -0
  20. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/assets/fonts/noto/NotoSans-Regular.ttf +0 -0
  21. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/assets/icons/arrow-down.svg +0 -0
  22. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/assets/icons/check.svg +0 -0
  23. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/assets/icons/checked.svg +0 -0
  24. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/assets/icons/close.svg +0 -0
  25. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/assets/icons/duplicate.svg +0 -0
  26. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/assets/icons/error.svg +0 -0
  27. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/assets/icons/file.svg +0 -0
  28. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/assets/icons/filedead.svg +0 -0
  29. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/assets/icons/fit.svg +0 -0
  30. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/assets/icons/folder.svg +0 -0
  31. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/assets/icons/grid.svg +0 -0
  32. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/assets/icons/image.svg +0 -0
  33. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/assets/icons/info.svg +0 -0
  34. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/assets/icons/load.svg +0 -0
  35. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/assets/icons/loop.svg +0 -0
  36. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/assets/icons/pan.svg +0 -0
  37. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/assets/icons/pause.svg +0 -0
  38. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/assets/icons/pencil.svg +0 -0
  39. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/assets/icons/play.svg +0 -0
  40. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/assets/icons/plus.svg +0 -0
  41. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/assets/icons/radio.svg +0 -0
  42. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/assets/icons/reset.svg +0 -0
  43. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/assets/icons/save.svg +0 -0
  44. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/assets/icons/stop.svg +0 -0
  45. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/assets/icons/tilemap.svg +0 -0
  46. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/assets/icons/tileset.svg +0 -0
  47. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/assets/icons/unchecked.svg +0 -0
  48. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/assets/icons/warning.svg +0 -0
  49. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/assets/icons/zoomin.svg +0 -0
  50. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/assets/icons/zoomout.svg +0 -0
  51. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/setup.cfg +0 -0
  52. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/configs/themes.py +0 -0
  53. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/constants.py +0 -0
  54. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/editor.py +0 -0
  55. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/event_map.py +0 -0
  56. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/layers.py +0 -0
  57. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/main.py +0 -0
  58. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/node_manager.py +0 -0
  59. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/nodes.py +0 -0
  60. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/plugins/__init__.py +0 -0
  61. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/plugins/character_collision/__init__.py +0 -0
  62. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/plugins/character_collision/editor.py +0 -0
  63. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/plugins/character_collision/models.py +0 -0
  64. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/plugins/character_collision/protocols.py +0 -0
  65. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/plugins/character_collision/shape_editor.py +0 -0
  66. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/plugins/character_collision/standalone.py +0 -0
  67. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/plugins/object_tileset_collision/__init__.py +0 -0
  68. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/plugins/object_tileset_collision/editor.py +0 -0
  69. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/plugins/object_tileset_collision/models.py +0 -0
  70. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/plugins/object_tileset_collision/protocols.py +0 -0
  71. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/plugins/object_tileset_collision/standalone.py +0 -0
  72. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/plugins/sprite_animation/__init__.py +0 -0
  73. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/plugins/sprite_animation/__main__.py +0 -0
  74. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/plugins/sprite_animation/clipboard_util.py +0 -0
  75. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/plugins/sprite_animation/editor.py +0 -0
  76. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/plugins/sprite_animation/frame_picker.py +0 -0
  77. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/plugins/sprite_animation/models.py +0 -0
  78. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/plugins/sprite_animation/preview.py +0 -0
  79. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/plugins/sprite_animation/protocols.py +0 -0
  80. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/plugins/sprite_animation/runtime_load.py +0 -0
  81. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/plugins/sprite_animation/standalone.py +0 -0
  82. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/plugins/sprite_animation/timeline.py +0 -0
  83. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/plugins/sprite_animation/validation.py +0 -0
  84. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/plugins/sprite_editor/__init__.py +0 -0
  85. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/plugins/sprite_editor/editor.py +0 -0
  86. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/plugins/sprite_editor/standalone.py +0 -0
  87. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/plugins/tileset_collision/__init__.py +0 -0
  88. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/plugins/tileset_collision/collision_painter.py +0 -0
  89. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/plugins/tileset_collision/editor.py +0 -0
  90. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/plugins/tileset_collision/models.py +0 -0
  91. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/plugins/tileset_collision/protocols.py +0 -0
  92. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/plugins/tileset_collision/standalone.py +0 -0
  93. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/standalone_automap.py +0 -0
  94. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/standalone_error_console.py +0 -0
  95. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/standalone_filemanager.py +0 -0
  96. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/standalone_image_viewer.py +0 -0
  97. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/tilemap_editor/__init__.py +0 -0
  98. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/tilemap_editor/__main__.py +0 -0
  99. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/tilemap_editor/assets/__init__.py +0 -0
  100. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/tilemap_editor/assets/fonts/jetbrain-fonts/JetBrainsMono-Bold.ttf +0 -0
  101. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/tilemap_editor/assets/fonts/jetbrain-fonts/JetBrainsMono-BoldItalic.ttf +0 -0
  102. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/tilemap_editor/assets/fonts/jetbrain-fonts/JetBrainsMono-Italic.ttf +0 -0
  103. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/tilemap_editor/assets/fonts/jetbrain-fonts/JetBrainsMono-Regular.ttf +0 -0
  104. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/tilemap_editor/assets/fonts/noto/NotoSans-Bold.ttf +0 -0
  105. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/tilemap_editor/assets/fonts/noto/NotoSans-BoldItalic.ttf +0 -0
  106. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/tilemap_editor/assets/fonts/noto/NotoSans-Italic.ttf +0 -0
  107. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/tilemap_editor/assets/fonts/noto/NotoSans-Regular.ttf +0 -0
  108. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/tilemap_editor/assets/icons/ToolMove.svg +0 -0
  109. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/tilemap_editor/assets/icons/arrow-down.svg +0 -0
  110. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/tilemap_editor/assets/icons/check.svg +0 -0
  111. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/tilemap_editor/assets/icons/checked.svg +0 -0
  112. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/tilemap_editor/assets/icons/close.svg +0 -0
  113. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/tilemap_editor/assets/icons/duplicate.svg +0 -0
  114. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/tilemap_editor/assets/icons/error.svg +0 -0
  115. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/tilemap_editor/assets/icons/file.svg +0 -0
  116. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/tilemap_editor/assets/icons/filedead.svg +0 -0
  117. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/tilemap_editor/assets/icons/fit.svg +0 -0
  118. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/tilemap_editor/assets/icons/folder.svg +0 -0
  119. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/tilemap_editor/assets/icons/grid.svg +0 -0
  120. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/tilemap_editor/assets/icons/image.svg +0 -0
  121. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/tilemap_editor/assets/icons/info.svg +0 -0
  122. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/tilemap_editor/assets/icons/load.svg +0 -0
  123. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/tilemap_editor/assets/icons/loop.svg +0 -0
  124. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/tilemap_editor/assets/icons/pan.svg +0 -0
  125. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/tilemap_editor/assets/icons/pause.svg +0 -0
  126. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/tilemap_editor/assets/icons/pencil.svg +0 -0
  127. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/tilemap_editor/assets/icons/play.svg +0 -0
  128. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/tilemap_editor/assets/icons/plus.svg +0 -0
  129. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/tilemap_editor/assets/icons/radio.svg +0 -0
  130. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/tilemap_editor/assets/icons/reset.svg +0 -0
  131. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/tilemap_editor/assets/icons/save.svg +0 -0
  132. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/tilemap_editor/assets/icons/stop.svg +0 -0
  133. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/tilemap_editor/assets/icons/tilemap.svg +0 -0
  134. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/tilemap_editor/assets/icons/tileset.svg +0 -0
  135. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/tilemap_editor/assets/icons/unchecked.svg +0 -0
  136. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/tilemap_editor/assets/icons/warning.svg +0 -0
  137. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/tilemap_editor/assets/icons/zoomin.svg +0 -0
  138. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/tilemap_editor/assets/icons/zoomout.svg +0 -0
  139. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/tilemap_editor/cli.py +0 -0
  140. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/tilemap_editor/main.py +0 -0
  141. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/tilemap_editor/settings.py +0 -0
  142. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/tilemap_editor.egg-info/SOURCES.txt +0 -0
  143. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/tilemap_editor.egg-info/dependency_links.txt +0 -0
  144. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/tilemap_editor.egg-info/entry_points.txt +0 -0
  145. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/tilemap_editor.egg-info/requires.txt +0 -0
  146. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/tilemap_editor.egg-info/top_level.txt +0 -0
  147. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/ttypes/__init__.py +0 -0
  148. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/utils/__init__.py +0 -0
  149. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/utils/editor_preference.py +0 -0
  150. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/utils/error_handler.py +0 -0
  151. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/utils/font_manager.py +0 -0
  152. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/utils/history.py +0 -0
  153. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/utils/icon_manager.py +0 -0
  154. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/utils/icons_cache.py +0 -0
  155. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/utils/log_capture.py +0 -0
  156. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/utils/project_paths.py +0 -0
  157. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/utils/serialization.py +0 -0
  158. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/utils/standalone.py +0 -0
  159. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/utils/validation.py +0 -0
  160. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/widgets/__init__.py +0 -0
  161. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/widgets/automap_models.py +0 -0
  162. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/widgets/autotile_template.py +0 -0
  163. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/widgets/autotiler.py +0 -0
  164. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/widgets/filemanager.py +0 -0
  165. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/widgets/input.py +0 -0
  166. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/widgets/layer_selector.py +0 -0
  167. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/widgets/map_properties.py +0 -0
  168. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/widgets/mapsetup.py +0 -0
  169. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/widgets/regex_automap_designer.py +0 -0
  170. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/widgets/spritesheet_grid.py +0 -0
  171. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/widgets/ui/collision_layer_mask.py +0 -0
  172. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/widgets/ui/collision_layer_sidebar.py +0 -0
  173. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/widgets/ui/confirm_dialog.py +0 -0
  174. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/widgets/ui/draw_utils.py +0 -0
  175. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/widgets/ui/fileinput.py +0 -0
  176. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/widgets/ui/layer_type_dialog.py +0 -0
  177. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/widgets/ui/menubar.py +0 -0
  178. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/widgets/ui/mode_indicator.py +0 -0
  179. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/widgets/ui/node_editor.py +0 -0
  180. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/widgets/ui/node_selector.py +0 -0
  181. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/widgets/ui/notification.py +0 -0
  182. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/widgets/ui/property_editor.py +0 -0
  183. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/widgets/ui/region_selector.py +0 -0
  184. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/widgets/ui/status_bar.py +0 -0
  185. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/widgets/ui/theme.py +0 -0
  186. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/widgets/ui/toolbar.py +0 -0
  187. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/src/widgets/ui/tooltip.py +0 -0
  188. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/tests/test_animation_library_grid_offset.py +0 -0
  189. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/tests/test_collision_layer_mask.py +0 -0
  190. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/tests/test_collision_layer_sidebar.py +0 -0
  191. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/tests/test_editor_pan_mode.py +0 -0
  192. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/tests/test_project_paths.py +0 -0
  193. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/tests/test_render_scale.py +0 -0
  194. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/tests/test_sprite_animation_editor_grid.py +0 -0
  195. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/tests/test_tile_grid_selection.py +0 -0
  196. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/tests/test_tile_selector_pick.py +0 -0
  197. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/tests/test_tilemap_save.py +0 -0
  198. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/tests/test_timeline_invalidate_cache.py +0 -0
  199. {tilemap_editor-3.2.8 → tilemap_editor-3.2.10}/tests/test_toolbar_tools.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tilemap-editor
3
- Version: 3.2.8
3
+ Version: 3.2.10
4
4
  Summary: Pygame tilemap editor with SVG icons, professional UI, and sprite animation 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 = "3.2.8"
7
+ version = "3.2.10"
8
8
  description = "Pygame tilemap editor with SVG icons, professional UI, and sprite animation tools"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -298,6 +298,8 @@ class Tilemap:
298
298
  ts_data["tile_properties"] = {
299
299
  str(k): v for k, v in ts.tile_properties.items()
300
300
  }
301
+ if ts.animation:
302
+ ts_data["animation"] = ts.animation
301
303
 
302
304
  save_data["resources"]["tilesets"].append(ts_data)
303
305
 
@@ -547,6 +549,7 @@ class Tilemap:
547
549
  tileset_type,
548
550
  properties=ts_entry.get("properties", {}),
549
551
  tile_properties=ts_entry.get("tile_properties", {}),
552
+ animation=ts_entry.get("animation"),
550
553
  )
551
554
  except Exception as e:
552
555
  error_msg = f"Error loading tileset {path_str}: {e}"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tilemap-editor
3
- Version: 3.2.8
3
+ Version: 3.2.10
4
4
  Summary: Pygame tilemap editor with SVG icons, professional UI, and sprite animation tools
5
5
  Author: tilemap editor contributors
6
6
  License: Proprietary
@@ -64,6 +64,7 @@ class TypeTilesetSerialized(TypedDict, total=True):
64
64
  type: str
65
65
  properties: NotRequired[Dict[str, Any]]
66
66
  tile_properties: NotRequired[Dict[str, Dict[str, Any]]] # variant_id string -> properties
67
+ animation: NotRequired[dict]
67
68
 
68
69
 
69
70
  TTile = Dict[Tuple[int, int], TypeTile]
@@ -1290,6 +1290,15 @@ class TileGrid:
1290
1290
  base_surf = tileset_data.surface
1291
1291
 
1292
1292
  variant_id = tile["variant"]
1293
+ if tileset_data.animation:
1294
+ anim = tileset_data.animation
1295
+ frame_ms = pygame.time.get_ticks()
1296
+ frame_idx = int(frame_ms / anim["frame_duration_ms"]) % anim["frame_count"]
1297
+ if anim.get("animation_mode") == "random_start_times":
1298
+ phase = hash((x, y, ttype)) % anim["frame_count"]
1299
+ frame_idx = (frame_idx + phase) % anim["frame_count"]
1300
+ variant_id += frame_idx * anim["frame_stride"]
1301
+
1293
1302
  sheet_w = base_surf.get_width()
1294
1303
 
1295
1304
  # Source rect always uses logical tile size
@@ -28,6 +28,7 @@ class TilesetData:
28
28
  self.tile_properties: Dict[int, Dict[str, Any]] = {}
29
29
  self.object_collision_path: Optional[Path] = None
30
30
  self.object_collision_data: Optional[Dict[str, Any]] = None
31
+ self.animation: Optional[dict] = None
31
32
 
32
33
 
33
34
  class TileSelector:
@@ -45,6 +46,10 @@ class TileSelector:
45
46
  x, y + self.top_bar_h, w, h - self.top_bar_h - self.btm_bar_h
46
47
  )
47
48
  self.tab_scroll_x = 0
49
+ arrow_h = self.top_bar_h - 4
50
+ arrow_y = y + (self.top_bar_h - arrow_h) // 2
51
+ self._tab_arrow_left = Rect(x + 2, arrow_y, 18, arrow_h)
52
+ self._tab_arrow_right = Rect(x + w - 20, arrow_y, 18, arrow_h)
48
53
  self.is_panning = False
49
54
  self.pan_start = (0, 0)
50
55
  self.pan_start_offset = (0, 0)
@@ -85,6 +90,10 @@ class TileSelector:
85
90
  self.btn_collision = Rect(x + w - 105, btn_y, 30, 30)
86
91
  self.btn_add = Rect(x + w - 70, btn_y, 30, 30)
87
92
  self.btn_rem = Rect(x + w - 35, btn_y, 30, 30)
93
+ arrow_h = self.top_bar_h - 4
94
+ arrow_y = y + (self.top_bar_h - arrow_h) // 2
95
+ self._tab_arrow_left = Rect(x + 2, arrow_y, 18, arrow_h)
96
+ self._tab_arrow_right = Rect(x + w - 20, arrow_y, 18, arrow_h)
88
97
 
89
98
  def set_rule_hints(self, hints: Set[int]):
90
99
  self.rule_hints = hints
@@ -178,6 +187,13 @@ class TileSelector:
178
187
  return True
179
188
 
180
189
  if self.rect.collidepoint(mouse_pos) and mouse_pos[1] < self.view_rect.top:
190
+ # Check arrow buttons first
191
+ if self._tab_arrow_left.collidepoint(mouse_pos):
192
+ self._scroll_tabs(100)
193
+ return True
194
+ if self._tab_arrow_right.collidepoint(mouse_pos):
195
+ self._scroll_tabs(-100)
196
+ return True
181
197
  self.check_tab_click(mouse_pos)
182
198
  return True
183
199
 
@@ -335,6 +351,10 @@ class TileSelector:
335
351
  self._pending_tileset_queue.pop(0)
336
352
  )
337
353
  print(f"DEBUG: Processing tileset: {self._pending_tileset_path}")
354
+ tw, th = self.editor.tilemap.tile_size
355
+ sheet_cols = self._pending_tileset_surf.get_width() // tw
356
+ sheet_rows = self._pending_tileset_surf.get_height() // th
357
+ self.editor.tileset_type_dialog.set_sheet_dimensions(sheet_cols, sheet_rows)
338
358
  self.editor.tileset_type_dialog.show(
339
359
  on_confirm=self._on_tileset_type_selected,
340
360
  on_cancel=self._on_tileset_type_cancel,
@@ -346,6 +366,7 @@ class TileSelector:
346
366
  tileset_type: str,
347
367
  properties: dict = {},
348
368
  tile_properties: dict = {},
369
+ animation: Optional[dict] = None,
349
370
  ):
350
371
  """Load tileset from path without showing dialog (used when loading maps).
351
372
 
@@ -354,6 +375,7 @@ class TileSelector:
354
375
  tileset_type: Type of tileset ("tile" or "object") - already known from saved map
355
376
  properties: Custom properties for the tileset
356
377
  tile_properties: Custom properties for individual tiles in the tileset (variant_id str -> dict)
378
+ animation: Animation config dict (frame_count, frame_duration_ms, frame_stride, loop, animation_mode)
357
379
  """
358
380
  if path.exists():
359
381
  try:
@@ -365,6 +387,7 @@ class TileSelector:
365
387
  tileset_data.tile_properties = {
366
388
  int(k): v for k, v in tile_properties.items()
367
389
  }
390
+ tileset_data.animation = animation
368
391
  self._load_collision_data_for_tileset(tileset_data)
369
392
 
370
393
  self.tilesets.append(tileset_data)
@@ -403,6 +426,19 @@ class TileSelector:
403
426
  surf = self._pending_tileset_surf
404
427
 
405
428
  tileset_data = TilesetData(path.name, path, surf, tileset_type=tileset_type)
429
+ animation = self.editor.tileset_type_dialog.get_animation_config()
430
+ if animation:
431
+ tw, th = self.editor.tilemap.tile_size
432
+ sheet_cols = surf.get_width() // tw
433
+ sheet_rows = surf.get_height() // th
434
+ frame_count = animation["frame_count"]
435
+ if sheet_cols % frame_count == 0:
436
+ animation["frame_stride"] = sheet_cols // frame_count
437
+ elif sheet_rows % frame_count == 0:
438
+ animation["frame_stride"] = (sheet_rows // frame_count) * sheet_cols
439
+ else:
440
+ animation["frame_stride"] = (sheet_cols * sheet_rows) // frame_count
441
+ tileset_data.animation = animation
406
442
  self._load_collision_data_for_tileset(tileset_data)
407
443
  self.tilesets.append(tileset_data)
408
444
  self.active_idx = len(self.tilesets) - 1
@@ -540,8 +576,8 @@ class TileSelector:
540
576
  def _get_tab_at_pos(self, pos) -> Optional[int]:
541
577
  if not self.tilesets:
542
578
  return None
543
- tab_w = min(100, self.rect.width // len(self.tilesets))
544
- idx = (pos[0] - self.rect.x) // tab_w
579
+ tab_w = 100
580
+ idx = (pos[0] - self.rect.x + self.tab_scroll_x) // tab_w
545
581
  if 0 <= idx < len(self.tilesets):
546
582
  return int(idx)
547
583
  return None
@@ -854,14 +890,19 @@ class TileSelector:
854
890
  clip = screen.get_clip()
855
891
  tab_area = Rect(self.rect.x, self.rect.y, self.rect.width, self.top_bar_h)
856
892
  screen.set_clip(tab_area)
893
+
894
+ pygame.draw.rect(screen, COLORS.header, tab_area)
895
+
857
896
  tab_w = 100
858
897
  total_w = tab_w * len(self.tilesets)
859
- if total_w > self.rect.width:
898
+ has_overflow = total_w > self.rect.width
899
+ if has_overflow:
860
900
  self.tab_scroll_x = max(
861
901
  0, min(self.tab_scroll_x, total_w - self.rect.width)
862
902
  )
863
903
  else:
864
904
  self.tab_scroll_x = 0
905
+
865
906
  for i, ts in enumerate(self.tilesets):
866
907
  r = Rect(
867
908
  self.rect.x + i * tab_w - self.tab_scroll_x,
@@ -874,13 +915,25 @@ class TileSelector:
874
915
  is_active = i == self.active_idx
875
916
  col = COLORS.selected if is_active else COLORS.header
876
917
  pygame.draw.rect(screen, col, r)
877
- pygame.draw.rect(screen, COLORS.border, r, 1)
918
+ if not is_active:
919
+ pygame.draw.line(screen, COLORS.border, r.bottomleft, r.bottomright, 1)
878
920
  t = ts.name[:8] + ".." if len(ts.name) > 10 else ts.name
879
921
  screen.blit(self.font.render(t, True, COLORS.text), (r.x + 5, r.y + 5))
880
- mx, my = pygame.mouse.get_pos()
881
- if r.collidepoint(mx, my):
882
- self.editor.tooltip.show(ts.name, (mx + 10, my + 10))
883
- if total_w > self.rect.width:
922
+
923
+ mx, my = pygame.mouse.get_pos()
924
+ show_arrows = has_overflow and tab_area.collidepoint(mx, my)
925
+
926
+ if show_arrows:
927
+ for arrow_rect, label in [
928
+ (self._tab_arrow_left, "<"),
929
+ (self._tab_arrow_right, ">"),
930
+ ]:
931
+ pygame.draw.rect(screen, COLORS.selected, arrow_rect)
932
+ pygame.draw.rect(screen, COLORS.border, arrow_rect, 1)
933
+ arrow_surf = self.font.render(label, True, COLORS.text)
934
+ arrow_rect_text = arrow_surf.get_rect(center=arrow_rect.center)
935
+ screen.blit(arrow_surf, arrow_rect_text)
936
+
884
937
  bar_w = max(30, int(self.rect.width * (self.rect.width / total_w)))
885
938
  bar_x = self.rect.x + int(
886
939
  (self.tab_scroll_x / (total_w - self.rect.width))
@@ -888,6 +941,20 @@ class TileSelector:
888
941
  )
889
942
  bar_rect = Rect(bar_x, self.rect.y + self.top_bar_h - 4, bar_w, 3)
890
943
  pygame.draw.rect(screen, COLORS.border_soft, bar_rect, border_radius=2)
944
+
945
+ # Tooltip for tab name
946
+ if tab_area.collidepoint(mx, my) and not (
947
+ show_arrows and (
948
+ self._tab_arrow_left.collidepoint(mx, my) or
949
+ self._tab_arrow_right.collidepoint(mx, my)
950
+ )
951
+ ):
952
+ idx = self._get_tab_at_pos((mx, my))
953
+ if idx is not None and 0 <= idx < len(self.tilesets):
954
+ self.editor.tooltip.show(
955
+ self.tilesets[idx].name, (mx + 10, my + 10)
956
+ )
957
+
891
958
  screen.set_clip(clip)
892
959
 
893
960
  def _scroll_tabs(self, delta: float):