tilemap-editor 4.1.0__tar.gz → 4.2.0__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 (217) hide show
  1. {tilemap_editor-4.1.0/src/tilemap_editor.egg-info → tilemap_editor-4.2.0}/PKG-INFO +1 -1
  2. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/pyproject.toml +1 -1
  3. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/layers.py +30 -13
  4. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap.py +32 -6
  5. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0/src/tilemap_editor.egg-info}/PKG-INFO +1 -1
  6. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor.egg-info/SOURCES.txt +2 -0
  7. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/ttypes/tilemap.py +6 -0
  8. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/tile_grid.py +9 -0
  9. tilemap_editor-4.2.0/tests/test_gid_collision.py +43 -0
  10. tilemap_editor-4.2.0/tests/test_layers_autotile.py +821 -0
  11. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/LICENSE +0 -0
  12. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/MANIFEST.in +0 -0
  13. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/README.md +0 -0
  14. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/fonts/jetbrain-fonts/JetBrainsMono-Bold.ttf +0 -0
  15. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/fonts/jetbrain-fonts/JetBrainsMono-BoldItalic.ttf +0 -0
  16. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/fonts/jetbrain-fonts/JetBrainsMono-Italic.ttf +0 -0
  17. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/fonts/jetbrain-fonts/JetBrainsMono-Regular.ttf +0 -0
  18. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/fonts/noto/NotoSans-Bold.ttf +0 -0
  19. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/fonts/noto/NotoSans-BoldItalic.ttf +0 -0
  20. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/fonts/noto/NotoSans-Italic.ttf +0 -0
  21. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/fonts/noto/NotoSans-Regular.ttf +0 -0
  22. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/icons/arrow-down.svg +0 -0
  23. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/icons/check.svg +0 -0
  24. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/icons/checked.svg +0 -0
  25. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/icons/close.svg +0 -0
  26. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/icons/duplicate.svg +0 -0
  27. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/icons/error.svg +0 -0
  28. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/icons/file.svg +0 -0
  29. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/icons/filedead.svg +0 -0
  30. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/icons/fit.svg +0 -0
  31. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/icons/folder.svg +0 -0
  32. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/icons/grid.svg +0 -0
  33. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/icons/image.svg +0 -0
  34. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/icons/info.svg +0 -0
  35. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/icons/load.svg +0 -0
  36. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/icons/loop.svg +0 -0
  37. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/icons/onion.svg +0 -0
  38. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/icons/pan.svg +0 -0
  39. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/icons/pause.svg +0 -0
  40. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/icons/pencil.svg +0 -0
  41. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/icons/play.svg +0 -0
  42. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/icons/plus.svg +0 -0
  43. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/icons/radio.svg +0 -0
  44. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/icons/reset.svg +0 -0
  45. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/icons/save.svg +0 -0
  46. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/icons/skip-back.svg +0 -0
  47. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/icons/skip-forward.svg +0 -0
  48. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/icons/stop.svg +0 -0
  49. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/icons/tilemap.svg +0 -0
  50. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/icons/tileset.svg +0 -0
  51. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/icons/unchecked.svg +0 -0
  52. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/icons/warning.svg +0 -0
  53. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/icons/zoomin.svg +0 -0
  54. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/icons/zoomout.svg +0 -0
  55. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/setup.cfg +0 -0
  56. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/configs/themes.py +0 -0
  57. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/constants.py +0 -0
  58. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/editor.py +0 -0
  59. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/event_map.py +0 -0
  60. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/main.py +0 -0
  61. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/node_manager.py +0 -0
  62. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/nodes.py +0 -0
  63. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/plugins/__init__.py +0 -0
  64. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/plugins/character_collision/__init__.py +0 -0
  65. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/plugins/character_collision/editor.py +0 -0
  66. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/plugins/character_collision/models.py +0 -0
  67. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/plugins/character_collision/protocols.py +0 -0
  68. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/plugins/character_collision/shape_editor.py +0 -0
  69. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/plugins/character_collision/standalone.py +0 -0
  70. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/plugins/object_tileset_collision/__init__.py +0 -0
  71. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/plugins/object_tileset_collision/editor.py +0 -0
  72. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/plugins/object_tileset_collision/models.py +0 -0
  73. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/plugins/object_tileset_collision/protocols.py +0 -0
  74. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/plugins/object_tileset_collision/standalone.py +0 -0
  75. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/plugins/sprite_animation/__init__.py +0 -0
  76. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/plugins/sprite_animation/__main__.py +0 -0
  77. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/plugins/sprite_animation/clipboard_util.py +0 -0
  78. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/plugins/sprite_animation/editor.py +0 -0
  79. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/plugins/sprite_animation/frame_picker.py +0 -0
  80. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/plugins/sprite_animation/models.py +0 -0
  81. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/plugins/sprite_animation/preview.py +0 -0
  82. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/plugins/sprite_animation/protocols.py +0 -0
  83. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/plugins/sprite_animation/runtime_load.py +0 -0
  84. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/plugins/sprite_animation/standalone.py +0 -0
  85. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/plugins/sprite_animation/timeline.py +0 -0
  86. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/plugins/sprite_animation/validation.py +0 -0
  87. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/plugins/sprite_editor/__init__.py +0 -0
  88. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/plugins/sprite_editor/editor.py +0 -0
  89. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/plugins/sprite_editor/standalone.py +0 -0
  90. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/plugins/tileset_collision/__init__.py +0 -0
  91. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/plugins/tileset_collision/collision_painter.py +0 -0
  92. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/plugins/tileset_collision/editor.py +0 -0
  93. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/plugins/tileset_collision/models.py +0 -0
  94. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/plugins/tileset_collision/protocols.py +0 -0
  95. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/plugins/tileset_collision/standalone.py +0 -0
  96. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/standalone_automap.py +0 -0
  97. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/standalone_error_console.py +0 -0
  98. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/standalone_filemanager.py +0 -0
  99. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/standalone_image_viewer.py +0 -0
  100. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/__init__.py +0 -0
  101. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/__main__.py +0 -0
  102. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/__init__.py +0 -0
  103. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/fonts/jetbrain-fonts/JetBrainsMono-Bold.ttf +0 -0
  104. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/fonts/jetbrain-fonts/JetBrainsMono-BoldItalic.ttf +0 -0
  105. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/fonts/jetbrain-fonts/JetBrainsMono-Italic.ttf +0 -0
  106. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/fonts/jetbrain-fonts/JetBrainsMono-Regular.ttf +0 -0
  107. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/fonts/noto/NotoSans-Bold.ttf +0 -0
  108. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/fonts/noto/NotoSans-BoldItalic.ttf +0 -0
  109. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/fonts/noto/NotoSans-Italic.ttf +0 -0
  110. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/fonts/noto/NotoSans-Regular.ttf +0 -0
  111. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/icons/ToolMove.svg +0 -0
  112. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/icons/arrow-down.svg +0 -0
  113. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/icons/check.svg +0 -0
  114. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/icons/checked.svg +0 -0
  115. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/icons/close.svg +0 -0
  116. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/icons/duplicate.svg +0 -0
  117. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/icons/error.svg +0 -0
  118. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/icons/file.svg +0 -0
  119. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/icons/filedead.svg +0 -0
  120. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/icons/fit.svg +0 -0
  121. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/icons/folder.svg +0 -0
  122. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/icons/grid.svg +0 -0
  123. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/icons/image.svg +0 -0
  124. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/icons/info.svg +0 -0
  125. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/icons/load.svg +0 -0
  126. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/icons/loop.svg +0 -0
  127. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/icons/onion.svg +0 -0
  128. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/icons/pan.svg +0 -0
  129. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/icons/pause.svg +0 -0
  130. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/icons/pencil.svg +0 -0
  131. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/icons/play.svg +0 -0
  132. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/icons/plus.svg +0 -0
  133. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/icons/radio.svg +0 -0
  134. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/icons/reset.svg +0 -0
  135. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/icons/save.svg +0 -0
  136. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/icons/skip-back.svg +0 -0
  137. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/icons/skip-forward.svg +0 -0
  138. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/icons/stop.svg +0 -0
  139. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/icons/tilemap.svg +0 -0
  140. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/icons/tileset.svg +0 -0
  141. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/icons/unchecked.svg +0 -0
  142. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/icons/warning.svg +0 -0
  143. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/icons/zoomin.svg +0 -0
  144. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/icons/zoomout.svg +0 -0
  145. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/cli.py +0 -0
  146. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/main.py +0 -0
  147. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/settings.py +0 -0
  148. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor.egg-info/dependency_links.txt +0 -0
  149. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor.egg-info/entry_points.txt +0 -0
  150. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor.egg-info/requires.txt +0 -0
  151. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor.egg-info/top_level.txt +0 -0
  152. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/ttypes/__init__.py +0 -0
  153. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/utils/__init__.py +0 -0
  154. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/utils/editor_preference.py +0 -0
  155. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/utils/error_handler.py +0 -0
  156. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/utils/font_manager.py +0 -0
  157. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/utils/history.py +0 -0
  158. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/utils/icon_manager.py +0 -0
  159. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/utils/icons_cache.py +0 -0
  160. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/utils/log_capture.py +0 -0
  161. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/utils/project_paths.py +0 -0
  162. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/utils/serialization.py +0 -0
  163. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/utils/standalone.py +0 -0
  164. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/utils/validation.py +0 -0
  165. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/__init__.py +0 -0
  166. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/automap_models.py +0 -0
  167. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/autotile_template.py +0 -0
  168. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/autotiler.py +0 -0
  169. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/filemanager.py +0 -0
  170. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/input.py +0 -0
  171. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/layer_selector.py +0 -0
  172. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/map_properties.py +0 -0
  173. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/mapsetup.py +0 -0
  174. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/particle_presets.py +0 -0
  175. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/particle_system.py +0 -0
  176. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/regex_automap_designer.py +0 -0
  177. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/spritesheet_grid.py +0 -0
  178. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/tile_selector.py +0 -0
  179. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/ui/button.py +0 -0
  180. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/ui/checkbox.py +0 -0
  181. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/ui/collision_layer_mask.py +0 -0
  182. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/ui/collision_layer_sidebar.py +0 -0
  183. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/ui/confirm_dialog.py +0 -0
  184. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/ui/dialog_base.py +0 -0
  185. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/ui/draw_utils.py +0 -0
  186. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/ui/fileinput.py +0 -0
  187. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/ui/label.py +0 -0
  188. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/ui/layer_type_dialog.py +0 -0
  189. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/ui/menubar.py +0 -0
  190. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/ui/mode_indicator.py +0 -0
  191. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/ui/node_editor.py +0 -0
  192. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/ui/node_selector.py +0 -0
  193. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/ui/notification.py +0 -0
  194. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/ui/particle_config_dialog.py +0 -0
  195. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/ui/property_editor.py +0 -0
  196. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/ui/region_selector.py +0 -0
  197. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/ui/scrollbar.py +0 -0
  198. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/ui/sidebar_container.py +0 -0
  199. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/ui/status_bar.py +0 -0
  200. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/ui/theme.py +0 -0
  201. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/ui/tileset_type_dialog.py +0 -0
  202. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/ui/toolbar.py +0 -0
  203. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/ui/tooltip.py +0 -0
  204. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/widget_base.py +0 -0
  205. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/tests/test_animation_library_grid_offset.py +0 -0
  206. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/tests/test_collision_layer_mask.py +0 -0
  207. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/tests/test_collision_layer_sidebar.py +0 -0
  208. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/tests/test_editor_pan_mode.py +0 -0
  209. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/tests/test_project_paths.py +0 -0
  210. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/tests/test_render_scale.py +0 -0
  211. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/tests/test_serialization_regression.py +0 -0
  212. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/tests/test_sprite_animation_editor_grid.py +0 -0
  213. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/tests/test_tile_grid_selection.py +0 -0
  214. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/tests/test_tile_selector_pick.py +0 -0
  215. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/tests/test_tilemap_save.py +0 -0
  216. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/tests/test_timeline_invalidate_cache.py +0 -0
  217. {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/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.1.0
3
+ Version: 4.2.0
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 = "4.1.0"
7
+ version = "4.2.0"
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"
@@ -4,7 +4,7 @@ Supports multiple layers with independent tile and object data.
4
4
  """
5
5
 
6
6
  import random
7
- from typing import TYPE_CHECKING, Dict, List, Optional, Tuple, Any
7
+ from typing import TYPE_CHECKING, Dict, List, Optional, Set, Tuple, Any
8
8
  from ttypes.tilemap import TypeTile, TypeObject
9
9
 
10
10
  if TYPE_CHECKING:
@@ -83,6 +83,13 @@ class Layer:
83
83
  ) -> int:
84
84
  """
85
85
  Internal helper to update specific tiles according to autotile rules.
86
+
87
+ Group membership is determined by:
88
+ 1. The tile's ``autotile_group`` field (if present)
89
+ 2. Legacy fallback: (tileset_index, variant_id) lookup in variant_to_group
90
+
91
+ When a rule matches, the tile's variant is re-rolled from the rule's
92
+ variant_ids (removing the early-out that prevented re-autotile).
86
93
  """
87
94
  if self.locked or self.layer_type != "tile":
88
95
  return 0
@@ -98,9 +105,9 @@ class Layer:
98
105
  )
99
106
 
100
107
  if self._autotile_cache["rules_hash"] != rules_hash:
101
- variant_to_group = {}
108
+ variant_to_group: Dict[Tuple[int, int], str] = {}
102
109
  rules_by_group: Dict[str, List["AutotileRule"]] = {}
103
- significant_offsets = set()
110
+ significant_offsets: Set[Tuple[int, int]] = set()
104
111
 
105
112
  for rule in rules:
106
113
  gid = rule.group_id
@@ -132,6 +139,13 @@ class Layer:
132
139
 
133
140
  changes_count = 0
134
141
 
142
+ def _get_group(t: dict) -> Optional[str]:
143
+ """Get group_id for a tile: autotile_group field > legacy variant lookup."""
144
+ ag = t.get("autotile_group")
145
+ if ag is not None:
146
+ return ag
147
+ return variant_to_group.get((t["ttype"], t["variant"]))
148
+
135
149
  for pos in positions:
136
150
  if pos not in self.tiles:
137
151
  continue
@@ -140,10 +154,14 @@ class Layer:
140
154
  ttype = tile["ttype"]
141
155
  current_variant = tile["variant"]
142
156
 
143
- target_group_id = variant_to_group.get((ttype, current_variant))
157
+ target_group_id = _get_group(tile)
144
158
  if not target_group_id:
145
159
  continue
146
160
 
161
+ group_rules = rules_by_group.get(target_group_id)
162
+ if not group_rules:
163
+ continue
164
+
147
165
  actual_neighbors = []
148
166
  for dx, dy in [
149
167
  (-1, -1),
@@ -158,8 +176,7 @@ class Layer:
158
176
  npos = (pos[0] + dx, pos[1] + dy)
159
177
  if npos in self.tiles:
160
178
  n_tile = self.tiles[npos]
161
- n_group = variant_to_group.get((n_tile["ttype"], n_tile["variant"]))
162
-
179
+ n_group = _get_group(n_tile)
163
180
  if n_group == target_group_id:
164
181
  actual_neighbors.append((dx, dy))
165
182
 
@@ -168,8 +185,6 @@ class Layer:
168
185
  }
169
186
 
170
187
  matched_rule: Optional["AutotileRule"] = None
171
- group_rules = rules_by_group.get(target_group_id, [])
172
-
173
188
  for rule in group_rules:
174
189
  if (
175
190
  rule.neighbors == neighbor_offsets_set
@@ -179,12 +194,14 @@ class Layer:
179
194
  break
180
195
 
181
196
  if matched_rule and matched_rule.variant_ids:
182
- if current_variant in matched_rule.variant_ids:
183
- continue
184
-
185
197
  new_variant = random.choice(matched_rule.variant_ids)
186
- tile["variant"] = new_variant
187
- changes_count += 1
198
+
199
+ if new_variant != current_variant:
200
+ tile["variant"] = new_variant
201
+ changes_count += 1
202
+
203
+ if "autotile_group" not in tile:
204
+ tile["autotile_group"] = matched_rule.group_id
188
205
 
189
206
  return changes_count
190
207
 
@@ -1,7 +1,7 @@
1
1
  from json import dump as JSONDump
2
2
  from json import load as JSONLoad
3
3
  from pathlib import Path
4
- from typing import TYPE_CHECKING, Any, Dict, Optional, Tuple, Union
4
+ from typing import TYPE_CHECKING, Any, Dict, List, Optional, Tuple, Union
5
5
 
6
6
  from pygame import Rect
7
7
 
@@ -271,11 +271,22 @@ class Tilemap:
271
271
  },
272
272
  }
273
273
 
274
+ ttype_to_firstgid: List[int] = []
274
275
  if hasattr(self.editor, "tileset_widget") and self.editor.tileset_widget:
276
+ firstgid = 0
277
+ tile_w, tile_h = self.tile_size
275
278
  for ts in self.editor.tileset_widget.tilesets:
276
279
  path_str = to_project_path(ts.path, map_dir)
277
280
 
278
- ts_data: Dict[str, Any] = {"path": path_str, "type": ts.tileset_type}
281
+ ts_surf = ts.surface
282
+ tile_count = (ts_surf.get_width() // tile_w) * (ts_surf.get_height() // tile_h)
283
+
284
+ ttype_to_firstgid.append(firstgid)
285
+
286
+ ts_data: Dict[str, Any] = {
287
+ "path": path_str, "type": ts.tileset_type,
288
+ "tile_count": tile_count, "firstgid": firstgid,
289
+ }
279
290
  if ts.properties:
280
291
  ts_data["properties"] = ts.properties
281
292
  if ts.tile_properties:
@@ -284,6 +295,7 @@ class Tilemap:
284
295
  ts_data["animation"] = ts.animation
285
296
 
286
297
  save_data["resources"]["tilesets"].append(ts_data)
298
+ firstgid += tile_count
287
299
 
288
300
  if hasattr(self.editor, "autotiler") and self.editor.autotiler:
289
301
  if "groups" not in save_data["project_state"]:
@@ -324,11 +336,17 @@ class Tilemap:
324
336
 
325
337
  for loc, tile in layer.tiles.items():
326
338
  key = serialize_point(loc)
339
+ ttype = tile["ttype"]
340
+ variant = tile["variant"]
327
341
  tile_data: Dict[str, Any] = {
328
342
  "pos": serialize_point(tile["pos"]),
329
- "ttype": tile["ttype"],
330
- "variant": tile["variant"],
343
+ "ttype": ttype,
344
+ "variant": variant,
331
345
  }
346
+ if "autotile_group" in tile:
347
+ tile_data["autotile_group"] = tile["autotile_group"]
348
+ if ttype_to_firstgid:
349
+ tile_data["gid"] = ttype_to_firstgid[ttype] + variant
332
350
  if "properties" in tile:
333
351
  tile_data["properties"] = tile["properties"]
334
352
  layer_data["tiles"][key] = tile_data
@@ -355,11 +373,17 @@ class Tilemap:
355
373
  if first_layer:
356
374
  for loc, tile in first_layer.tiles.items():
357
375
  key = serialize_point(loc)
376
+ ttype = tile["ttype"]
377
+ variant = tile["variant"]
358
378
  tile_data: Dict[str, Any] = {
359
379
  "pos": serialize_point(tile["pos"]),
360
- "ttype": tile["ttype"],
361
- "variant": tile["variant"],
380
+ "ttype": ttype,
381
+ "variant": variant,
362
382
  }
383
+ if "autotile_group" in tile:
384
+ tile_data["autotile_group"] = tile["autotile_group"]
385
+ if ttype_to_firstgid:
386
+ tile_data["gid"] = ttype_to_firstgid[ttype] + variant
363
387
  save_data["data"]["ongrid"][key] = tile_data
364
388
 
365
389
  with open(target_path, "w") as f:
@@ -659,6 +683,8 @@ class Tilemap:
659
683
  tile_copy["pos"] = pos
660
684
  if "properties" in tile_data:
661
685
  tile_copy["properties"] = tile_data["properties"]
686
+ if "autotile_group" in tile_data:
687
+ tile_copy["autotile_group"] = tile_data["autotile_group"]
662
688
  self._normalize_ttype(tile_copy)
663
689
  layer.tiles[pos] = tile_copy
664
690
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tilemap-editor
3
- Version: 4.1.0
3
+ Version: 4.2.0
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
@@ -202,6 +202,8 @@ tests/test_animation_library_grid_offset.py
202
202
  tests/test_collision_layer_mask.py
203
203
  tests/test_collision_layer_sidebar.py
204
204
  tests/test_editor_pan_mode.py
205
+ tests/test_gid_collision.py
206
+ tests/test_layers_autotile.py
205
207
  tests/test_project_paths.py
206
208
  tests/test_render_scale.py
207
209
  tests/test_serialization_regression.py
@@ -5,6 +5,8 @@ class TypeTile(TypedDict, total=True):
5
5
  pos: Tuple[int, int]
6
6
  ttype: int
7
7
  variant: int
8
+ autotile_group: NotRequired[str]
9
+ gid: NotRequired[int]
8
10
  properties: NotRequired[Dict[str, Any]]
9
11
 
10
12
 
@@ -35,6 +37,8 @@ class TypeTileSerealized(TypedDict, total=True):
35
37
  pos: str
36
38
  ttype: str
37
39
  variant: int
40
+ autotile_group: NotRequired[str]
41
+ gid: NotRequired[int]
38
42
  properties: NotRequired[Dict[str, Any]]
39
43
 
40
44
 
@@ -62,6 +66,8 @@ class TypeLayerSerialized(TypedDict, total=True):
62
66
  class TypeTilesetSerialized(TypedDict, total=True):
63
67
  path: str
64
68
  type: str
69
+ tile_count: NotRequired[int]
70
+ firstgid: NotRequired[int]
65
71
  properties: NotRequired[Dict[str, Any]]
66
72
  tile_properties: NotRequired[Dict[str, Dict[str, Any]]]
67
73
  animation: NotRequired[dict]
@@ -659,6 +659,15 @@ class TileGrid:
659
659
  variant_id
660
660
  ].copy()
661
661
 
662
+ if self.editor.autotile_mode and getattr(
663
+ self.editor, "autotiler", None
664
+ ):
665
+ autotiler = self.editor.autotiler
666
+ if autotiler.groups:
667
+ gidx = autotiler.selected_group_idx
668
+ if 0 <= gidx < len(autotiler.groups):
669
+ tile_data["autotile_group"] = autotiler.groups[gidx].name
670
+
662
671
  active_layer.set_tile(target_pos, tile_data)
663
672
 
664
673
  if self.editor.autotile_mode and getattr(
@@ -0,0 +1,43 @@
1
+ """Tests for GID-based collision resolution (no firstgid in collision library)."""
2
+
3
+ from plugins.tileset_collision.models import (
4
+ TilesetCollisionLibrary,
5
+ TileCollisionData,
6
+ CollisionPolygon,
7
+ )
8
+
9
+
10
+ class TestTilesetCollisionLibraryNoFirstgid:
11
+ def test_to_dict_no_firstgid(self):
12
+ lib = TilesetCollisionLibrary(
13
+ tileset_name="test", tile_size=(32, 32),
14
+ tiles={5: TileCollisionData(tile_id=5, shapes=[
15
+ CollisionPolygon(vertices=[(0, 0), (32, 0), (32, 32), (0, 32)]),
16
+ ])},
17
+ )
18
+ d = lib.to_dict()
19
+ assert "firstgid" not in d
20
+ assert d["tileset_name"] == "test"
21
+ assert "5" in d["tiles"]
22
+
23
+ def test_roundtrip_ignores_firstgid(self):
24
+ d = {
25
+ "tileset_name": "test",
26
+ "tile_size": [16, 16],
27
+ "firstgid": 100,
28
+ "tiles": {"0": {"tile_id": 0, "shapes": []}},
29
+ }
30
+ lib = TilesetCollisionLibrary.from_dict(d)
31
+ assert not hasattr(lib, "firstgid")
32
+ assert 0 in lib.tiles
33
+
34
+ def test_keeps_existing_fields(self):
35
+ lib = TilesetCollisionLibrary(
36
+ tileset_name="test", tile_size=(32, 32),
37
+ tiles={0: TileCollisionData(tile_id=0)},
38
+ )
39
+ d = lib.to_dict()
40
+ restored = TilesetCollisionLibrary.from_dict(d)
41
+ assert restored.tileset_name == "test"
42
+ assert restored.tile_size == (32, 32)
43
+ assert 0 in restored.tiles