tilemap-editor 3.2.0__tar.gz → 3.2.2__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 (186) hide show
  1. {tilemap_editor-3.2.0/src/tilemap_editor.egg-info → tilemap_editor-3.2.2}/PKG-INFO +1 -1
  2. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/pyproject.toml +1 -1
  3. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/editor.py +6 -1
  4. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/plugins/character_collision/editor.py +91 -15
  5. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2/src/tilemap_editor.egg-info}/PKG-INFO +1 -1
  6. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/widgets/spritesheet_grid.py +53 -15
  7. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/LICENSE +0 -0
  8. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/MANIFEST.in +0 -0
  9. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/README.md +0 -0
  10. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/assets/fonts/jetbrain-fonts/JetBrainsMono-Bold.ttf +0 -0
  11. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/assets/fonts/jetbrain-fonts/JetBrainsMono-BoldItalic.ttf +0 -0
  12. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/assets/fonts/jetbrain-fonts/JetBrainsMono-Italic.ttf +0 -0
  13. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/assets/fonts/jetbrain-fonts/JetBrainsMono-Regular.ttf +0 -0
  14. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/assets/fonts/noto/NotoSans-Bold.ttf +0 -0
  15. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/assets/fonts/noto/NotoSans-BoldItalic.ttf +0 -0
  16. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/assets/fonts/noto/NotoSans-Italic.ttf +0 -0
  17. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/assets/fonts/noto/NotoSans-Regular.ttf +0 -0
  18. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/assets/icons/arrow-down.svg +0 -0
  19. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/assets/icons/check.svg +0 -0
  20. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/assets/icons/checked.svg +0 -0
  21. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/assets/icons/close.svg +0 -0
  22. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/assets/icons/duplicate.svg +0 -0
  23. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/assets/icons/error.svg +0 -0
  24. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/assets/icons/file.svg +0 -0
  25. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/assets/icons/filedead.svg +0 -0
  26. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/assets/icons/fit.svg +0 -0
  27. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/assets/icons/folder.svg +0 -0
  28. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/assets/icons/grid.svg +0 -0
  29. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/assets/icons/image.svg +0 -0
  30. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/assets/icons/info.svg +0 -0
  31. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/assets/icons/load.svg +0 -0
  32. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/assets/icons/loop.svg +0 -0
  33. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/assets/icons/pan.svg +0 -0
  34. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/assets/icons/pause.svg +0 -0
  35. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/assets/icons/pencil.svg +0 -0
  36. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/assets/icons/play.svg +0 -0
  37. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/assets/icons/plus.svg +0 -0
  38. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/assets/icons/radio.svg +0 -0
  39. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/assets/icons/reset.svg +0 -0
  40. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/assets/icons/save.svg +0 -0
  41. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/assets/icons/stop.svg +0 -0
  42. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/assets/icons/tilemap.svg +0 -0
  43. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/assets/icons/tileset.svg +0 -0
  44. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/assets/icons/unchecked.svg +0 -0
  45. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/assets/icons/warning.svg +0 -0
  46. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/assets/icons/zoomin.svg +0 -0
  47. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/assets/icons/zoomout.svg +0 -0
  48. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/setup.cfg +0 -0
  49. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/configs/themes.py +0 -0
  50. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/constants.py +0 -0
  51. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/event_map.py +0 -0
  52. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/layers.py +0 -0
  53. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/main.py +0 -0
  54. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/plugins/__init__.py +0 -0
  55. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/plugins/character_collision/__init__.py +0 -0
  56. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/plugins/character_collision/models.py +0 -0
  57. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/plugins/character_collision/protocols.py +0 -0
  58. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/plugins/character_collision/shape_editor.py +0 -0
  59. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/plugins/character_collision/standalone.py +0 -0
  60. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/plugins/object_tileset_collision/__init__.py +0 -0
  61. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/plugins/object_tileset_collision/editor.py +0 -0
  62. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/plugins/object_tileset_collision/models.py +0 -0
  63. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/plugins/object_tileset_collision/protocols.py +0 -0
  64. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/plugins/object_tileset_collision/standalone.py +0 -0
  65. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/plugins/sprite_animation/__init__.py +0 -0
  66. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/plugins/sprite_animation/__main__.py +0 -0
  67. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/plugins/sprite_animation/clipboard_util.py +0 -0
  68. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/plugins/sprite_animation/editor.py +0 -0
  69. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/plugins/sprite_animation/frame_picker.py +0 -0
  70. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/plugins/sprite_animation/models.py +0 -0
  71. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/plugins/sprite_animation/preview.py +0 -0
  72. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/plugins/sprite_animation/protocols.py +0 -0
  73. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/plugins/sprite_animation/runtime_load.py +0 -0
  74. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/plugins/sprite_animation/standalone.py +0 -0
  75. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/plugins/sprite_animation/timeline.py +0 -0
  76. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/plugins/sprite_animation/validation.py +0 -0
  77. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/plugins/sprite_editor/__init__.py +0 -0
  78. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/plugins/sprite_editor/editor.py +0 -0
  79. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/plugins/sprite_editor/standalone.py +0 -0
  80. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/plugins/tileset_collision/__init__.py +0 -0
  81. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/plugins/tileset_collision/collision_painter.py +0 -0
  82. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/plugins/tileset_collision/editor.py +0 -0
  83. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/plugins/tileset_collision/models.py +0 -0
  84. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/plugins/tileset_collision/protocols.py +0 -0
  85. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/plugins/tileset_collision/standalone.py +0 -0
  86. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/standalone_automap.py +0 -0
  87. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/standalone_error_console.py +0 -0
  88. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/standalone_filemanager.py +0 -0
  89. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/standalone_image_viewer.py +0 -0
  90. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/tilemap.py +0 -0
  91. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/tilemap_editor/__init__.py +0 -0
  92. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/tilemap_editor/__main__.py +0 -0
  93. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/tilemap_editor/assets/__init__.py +0 -0
  94. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/tilemap_editor/assets/fonts/jetbrain-fonts/JetBrainsMono-Bold.ttf +0 -0
  95. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/tilemap_editor/assets/fonts/jetbrain-fonts/JetBrainsMono-BoldItalic.ttf +0 -0
  96. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/tilemap_editor/assets/fonts/jetbrain-fonts/JetBrainsMono-Italic.ttf +0 -0
  97. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/tilemap_editor/assets/fonts/jetbrain-fonts/JetBrainsMono-Regular.ttf +0 -0
  98. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/tilemap_editor/assets/fonts/noto/NotoSans-Bold.ttf +0 -0
  99. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/tilemap_editor/assets/fonts/noto/NotoSans-BoldItalic.ttf +0 -0
  100. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/tilemap_editor/assets/fonts/noto/NotoSans-Italic.ttf +0 -0
  101. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/tilemap_editor/assets/fonts/noto/NotoSans-Regular.ttf +0 -0
  102. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/tilemap_editor/assets/icons/ToolMove.svg +0 -0
  103. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/tilemap_editor/assets/icons/arrow-down.svg +0 -0
  104. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/tilemap_editor/assets/icons/check.svg +0 -0
  105. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/tilemap_editor/assets/icons/checked.svg +0 -0
  106. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/tilemap_editor/assets/icons/close.svg +0 -0
  107. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/tilemap_editor/assets/icons/duplicate.svg +0 -0
  108. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/tilemap_editor/assets/icons/error.svg +0 -0
  109. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/tilemap_editor/assets/icons/file.svg +0 -0
  110. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/tilemap_editor/assets/icons/filedead.svg +0 -0
  111. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/tilemap_editor/assets/icons/fit.svg +0 -0
  112. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/tilemap_editor/assets/icons/folder.svg +0 -0
  113. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/tilemap_editor/assets/icons/grid.svg +0 -0
  114. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/tilemap_editor/assets/icons/image.svg +0 -0
  115. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/tilemap_editor/assets/icons/info.svg +0 -0
  116. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/tilemap_editor/assets/icons/load.svg +0 -0
  117. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/tilemap_editor/assets/icons/loop.svg +0 -0
  118. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/tilemap_editor/assets/icons/pan.svg +0 -0
  119. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/tilemap_editor/assets/icons/pause.svg +0 -0
  120. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/tilemap_editor/assets/icons/pencil.svg +0 -0
  121. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/tilemap_editor/assets/icons/play.svg +0 -0
  122. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/tilemap_editor/assets/icons/plus.svg +0 -0
  123. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/tilemap_editor/assets/icons/radio.svg +0 -0
  124. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/tilemap_editor/assets/icons/reset.svg +0 -0
  125. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/tilemap_editor/assets/icons/save.svg +0 -0
  126. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/tilemap_editor/assets/icons/stop.svg +0 -0
  127. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/tilemap_editor/assets/icons/tilemap.svg +0 -0
  128. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/tilemap_editor/assets/icons/tileset.svg +0 -0
  129. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/tilemap_editor/assets/icons/unchecked.svg +0 -0
  130. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/tilemap_editor/assets/icons/warning.svg +0 -0
  131. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/tilemap_editor/assets/icons/zoomin.svg +0 -0
  132. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/tilemap_editor/assets/icons/zoomout.svg +0 -0
  133. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/tilemap_editor/cli.py +0 -0
  134. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/tilemap_editor/main.py +0 -0
  135. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/tilemap_editor/settings.py +0 -0
  136. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/tilemap_editor.egg-info/SOURCES.txt +0 -0
  137. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/tilemap_editor.egg-info/dependency_links.txt +0 -0
  138. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/tilemap_editor.egg-info/entry_points.txt +0 -0
  139. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/tilemap_editor.egg-info/requires.txt +0 -0
  140. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/tilemap_editor.egg-info/top_level.txt +0 -0
  141. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/ttypes/__init__.py +0 -0
  142. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/ttypes/tilemap.py +0 -0
  143. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/utils/__init__.py +0 -0
  144. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/utils/editor_preference.py +0 -0
  145. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/utils/error_handler.py +0 -0
  146. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/utils/font_manager.py +0 -0
  147. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/utils/history.py +0 -0
  148. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/utils/icon_manager.py +0 -0
  149. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/utils/icons_cache.py +0 -0
  150. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/utils/log_capture.py +0 -0
  151. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/utils/project_paths.py +0 -0
  152. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/utils/serialization.py +0 -0
  153. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/utils/standalone.py +0 -0
  154. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/utils/validation.py +0 -0
  155. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/widgets/__init__.py +0 -0
  156. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/widgets/automap_models.py +0 -0
  157. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/widgets/autotile_template.py +0 -0
  158. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/widgets/autotiler.py +0 -0
  159. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/widgets/filemanager.py +0 -0
  160. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/widgets/input.py +0 -0
  161. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/widgets/layer_selector.py +0 -0
  162. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/widgets/map_properties.py +0 -0
  163. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/widgets/mapsetup.py +0 -0
  164. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/widgets/regex_automap_designer.py +0 -0
  165. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/widgets/tile_grid.py +0 -0
  166. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/widgets/tile_selector.py +0 -0
  167. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/widgets/ui/collision_layer_mask.py +0 -0
  168. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/widgets/ui/collision_layer_sidebar.py +0 -0
  169. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/widgets/ui/draw_utils.py +0 -0
  170. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/widgets/ui/fileinput.py +0 -0
  171. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/widgets/ui/layer_type_dialog.py +0 -0
  172. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/widgets/ui/menubar.py +0 -0
  173. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/widgets/ui/mode_indicator.py +0 -0
  174. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/widgets/ui/notification.py +0 -0
  175. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/widgets/ui/property_editor.py +0 -0
  176. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/widgets/ui/region_selector.py +0 -0
  177. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/widgets/ui/status_bar.py +0 -0
  178. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/widgets/ui/theme.py +0 -0
  179. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/widgets/ui/tileset_type_dialog.py +0 -0
  180. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/widgets/ui/toolbar.py +0 -0
  181. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/src/widgets/ui/tooltip.py +0 -0
  182. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/tests/test_collision_layer_mask.py +0 -0
  183. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/tests/test_collision_layer_sidebar.py +0 -0
  184. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/tests/test_project_paths.py +0 -0
  185. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/tests/test_render_scale.py +0 -0
  186. {tilemap_editor-3.2.0 → tilemap_editor-3.2.2}/tests/test_tilemap_save.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tilemap-editor
3
- Version: 3.2.0
3
+ Version: 3.2.2
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.0"
7
+ version = "3.2.2"
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"
@@ -723,7 +723,12 @@ class Editor:
723
723
  def _launch_sprite_editor_with_image(self, path: Path):
724
724
  """Launch sprite editor subprocess with selected image."""
725
725
  try:
726
- args = [str(path), "--data-root", str(self.data_root)]
726
+ tile_size = "32x32"
727
+ if hasattr(self.tilemap, "tile_size") and self.tilemap.tile_size:
728
+ tw, th = self.tilemap.tile_size
729
+ tile_size = f"{tw}x{th}"
730
+
731
+ args = [str(path), "--tile-size", tile_size, "--data-root", str(self.data_root)]
727
732
  process = launch_standalone(
728
733
  "plugins.sprite_editor.standalone",
729
734
  args,
@@ -3,7 +3,7 @@ Character Collision Editor — Define collision shapes for character sprites.
3
3
 
4
4
  Layout:
5
5
  +----------------------------------------------------+
6
- | Toolbar: [Character Name] [Shape Type Buttons] |
6
+ | Toolbar: [Name: _______] [Shape Type Buttons] |
7
7
  +----------------------------------------------------+
8
8
  | |
9
9
  | Shape Editor |
@@ -16,6 +16,7 @@ Layout:
16
16
 
17
17
  from __future__ import annotations
18
18
 
19
+ import re
19
20
  from typing import Optional, Tuple, Dict, Any
20
21
  from pathlib import Path
21
22
 
@@ -30,6 +31,7 @@ from utils.error_handler import error_handler, error_context
30
31
  from widgets.ui.theme import COLORS, FONTS
31
32
  from widgets.ui.draw_utils import draw_panel, draw_button
32
33
  from widgets.ui.collision_layer_sidebar import CollisionLayerSidebar
34
+ from widgets.input import InlineTextInput
33
35
 
34
36
 
35
37
  class CharacterCollisionEditor:
@@ -73,6 +75,9 @@ class CharacterCollisionEditor:
73
75
  self._font = font_manager.get_font(FONTS.name, FONTS.size_md, FontWeight.REGULAR)
74
76
  self._font_sm = font_manager.get_font(FONTS.name, FONTS.size_sm, FontWeight.REGULAR)
75
77
 
78
+ # Editable name input
79
+ self._name_input = InlineTextInput("char_name", default_val=self.character_name)
80
+
76
81
  # Shape type buttons
77
82
  self.shape_buttons: Dict[ShapeType, Rect] = {}
78
83
  self._init_shape_buttons()
@@ -106,6 +111,18 @@ class CharacterCollisionEditor:
106
111
 
107
112
  self._init_shape_buttons()
108
113
 
114
+ def _get_save_name(self) -> str:
115
+ """Build filename from the name input.
116
+
117
+ Returns "<safe-name>-character.collision.json" if non-empty,
118
+ "character.collision.json" otherwise.
119
+ """
120
+ name = self._name_input.text.strip()
121
+ if name:
122
+ safe = re.sub(r'[^\w\-]+', '-', name).strip('-').lower()
123
+ return f"{safe}-character.collision.json"
124
+ return "character.collision.json"
125
+
109
126
  def get_collision_data(self) -> CharacterCollisionData:
110
127
  """Get the current collision data"""
111
128
  shape_data = self.shape_editor.get_shape_data()
@@ -145,7 +162,7 @@ class CharacterCollisionEditor:
145
162
  raise ValueError(f"Unknown shape type: {shape_type}")
146
163
 
147
164
  return CharacterCollisionData(
148
- name=self.character_name,
165
+ name=self._name_input.text.strip() or self.character_name,
149
166
  shape=shape,
150
167
  properties={
151
168
  "collision_layer": self.layer_sidebar.get_layer(),
@@ -156,12 +173,28 @@ class CharacterCollisionEditor:
156
173
  def load_collision_data(self, data: CharacterCollisionData) -> None:
157
174
  """Load collision data"""
158
175
  self.character_name = data.name
176
+ self._name_input.text = data.name
177
+ self._name_input.cursor_pos = len(data.name)
159
178
  self.shape_editor.load_shape_data(data.shape.to_dict())
160
179
  layer = data.properties.get("collision_layer", 1)
161
180
  mask = data.properties.get("collision_mask", 0xFFFF)
162
181
  self.layer_sidebar.set_layer(layer)
163
182
  self.layer_sidebar.set_mask(mask)
164
183
 
184
+ def _get_save_path(self) -> Path:
185
+ """Full path for saving/loading collision data."""
186
+ collision_dir = self._get_collision_dir()
187
+ return collision_dir / self._get_save_name()
188
+
189
+ def _get_load_path(self) -> Path:
190
+ """Path to load from — name-priority, fallback to default."""
191
+ collision_dir = self._get_collision_dir()
192
+ name_path = collision_dir / self._get_save_name()
193
+ if name_path.exists():
194
+ return name_path
195
+ # Fallback to default
196
+ return collision_dir / "character.collision.json"
197
+
165
198
  def _get_collision_dir(self) -> Path:
166
199
  """Get collision data directory (data_root/character_collision)"""
167
200
  if self._data_root is None:
@@ -189,11 +222,17 @@ class CharacterCollisionEditor:
189
222
  except Exception as e:
190
223
  error_handler.capture(e, context="load_character_collision")
191
224
 
225
+ def _name_input_rect(self) -> Rect:
226
+ """Screen rect for the editable name field in the toolbar."""
227
+ return Rect(self.rect.x + 62, self.rect.y + 10, 175, 28)
228
+
192
229
  def handle_event(self, event: pygame.event.Event) -> bool:
193
230
  """Handle input events"""
194
231
  if not self.visible:
195
232
  return False
196
233
 
234
+ mouse = pygame.mouse.get_pos()
235
+
197
236
  # Layer/mask sidebar handles events when open
198
237
  if self.layer_sidebar.handle_event(event):
199
238
  return True
@@ -202,19 +241,40 @@ class CharacterCollisionEditor:
202
241
  if self.layer_sidebar.handle_toggle_event(event):
203
242
  return True
204
243
 
205
- # Keyboard shortcut: L to toggle sidebar
206
- if event.type == pygame.KEYDOWN and event.key == pygame.K_l:
244
+ # Keyboard shortcut: L to toggle sidebar (skip when name input is focused)
245
+ if event.type == pygame.KEYDOWN and event.key == pygame.K_l and not self._name_input.is_focused:
207
246
  mods = pygame.key.get_mods()
208
247
  if not (mods & (pygame.KMOD_CTRL | pygame.KMOD_LMETA)):
209
248
  self.layer_sidebar.toggle()
210
249
  return True
211
250
 
251
+ # Name input handling
252
+ if self._name_input.is_focused:
253
+ if event.type == pygame.KEYDOWN:
254
+ if event.key == pygame.K_RETURN:
255
+ self._name_input.is_focused = False
256
+ return True
257
+ elif event.key == pygame.K_ESCAPE:
258
+ self._name_input.is_focused = False
259
+ return True
260
+ if self._name_input.handle_event(event, self._font):
261
+ return True
262
+ # Tab/click outside handled below
263
+
264
+ # Click-to-focus name input
265
+ if event.type == pygame.MOUSEBUTTONDOWN and event.button == 1:
266
+ if self._name_input_rect().collidepoint(mouse):
267
+ self._name_input.is_focused = True
268
+ self._name_input.cursor_pos = len(self._name_input.text)
269
+ self._name_input.selection_start = None
270
+ return True
271
+ elif self._name_input.is_focused:
272
+ self._name_input.is_focused = False
273
+
212
274
  # Let shape editor handle events next
213
275
  if self.shape_editor.handle_event(event):
214
276
  return True
215
277
 
216
- mouse = pygame.mouse.get_pos()
217
-
218
278
  # Shape type button clicks
219
279
  if event.type == pygame.MOUSEBUTTONDOWN and event.button == 1:
220
280
  for shape_type, button_rect in self.shape_buttons.items():
@@ -249,13 +309,30 @@ class CharacterCollisionEditor:
249
309
  toolbar_rect = Rect(self.rect.x, self.rect.y, self.rect.w, self.toolbar_height)
250
310
  draw_panel(screen, toolbar_rect, COLORS.header, COLORS.border)
251
311
 
252
- # Title
253
- title = self._font.render(
254
- f"Character Collision Editor {self.character_name}",
255
- True,
256
- COLORS.text
312
+ # "Name:" label
313
+ label = self._font_sm.render("Name:", True, COLORS.text)
314
+ screen.blit(label, (toolbar_rect.x + 10, toolbar_rect.y + 17))
315
+
316
+ # Editable name field
317
+ name_rect = self._name_input_rect()
318
+ bg_color = COLORS.panel if self._name_input.is_focused else COLORS.panel_alt
319
+ pygame.draw.rect(screen, bg_color, name_rect, border_radius=4)
320
+ pygame.draw.rect(
321
+ screen, COLORS.accent if self._name_input.is_focused else COLORS.border,
322
+ name_rect, 1, border_radius=4,
257
323
  )
258
- screen.blit(title, (toolbar_rect.x + 10, toolbar_rect.y + 15))
324
+
325
+ # Render input text
326
+ display_name = self._name_input.text or "character"
327
+ txt = self._font_sm.render(display_name, True, COLORS.text)
328
+ screen.blit(txt, (name_rect.x + 4, name_rect.y + 5))
329
+
330
+ # Cursor when focused
331
+ if self._name_input.is_focused and (pygame.time.get_ticks() // 400) % 2:
332
+ pre = self._font_sm.render(self._name_input.text[:self._name_input.cursor_pos], True, (0, 0, 0))
333
+ cx = name_rect.x + 4 + pre.get_width()
334
+ cy = name_rect.y + 5
335
+ pygame.draw.line(screen, COLORS.text, (cx, cy), (cx, cy + txt.get_height()), 1)
259
336
 
260
337
  # Shape type buttons
261
338
  for shape_type, button_rect in self.shape_buttons.items():
@@ -352,15 +429,14 @@ class CharacterCollisionEditor:
352
429
  # Ctrl+S / Cmd+S to save
353
430
  collision_dir = self._get_collision_dir()
354
431
  collision_dir.mkdir(parents=True, exist_ok=True)
355
- save_path = collision_dir / "character_collision.json"
432
+ save_path = self._get_save_path()
356
433
  self.save_to_file(save_path)
357
434
  print(f"Saved collision data to {save_path}")
358
435
  elif event.key == pygame.K_l and (
359
436
  pygame.key.get_mods() & (pygame.KMOD_LCTRL | pygame.KMOD_LMETA)
360
437
  ):
361
438
  # Ctrl+L / Cmd+L to load
362
- collision_dir = self._get_collision_dir()
363
- load_path = collision_dir / "character_collision.json"
439
+ load_path = self._get_load_path()
364
440
  if load_path.exists():
365
441
  self.load_from_file(load_path)
366
442
  print(f"Loaded collision data from {load_path}")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tilemap-editor
3
- Version: 3.2.0
3
+ Version: 3.2.2
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
@@ -318,27 +318,65 @@ class SpritesheetGrid:
318
318
  return result
319
319
 
320
320
  def paste_at(self, target_idx: int, tiles: Dict[int, Surface]) -> None:
321
- """Write previously copied tiles starting at target grid position.
322
-
323
- Tiles are written in sorted source-index order, filling left-to-right
324
- top-to-bottom from the target cell. Out-of-bounds writes are skipped.
321
+ """Write previously copied tiles preserving 2D layout.
322
+
323
+ Each source tile's row/col offset from the selection origin is
324
+ preserved at the target grid position. The canvas auto-expands
325
+ if pasted tiles exceed the current bounds.
325
326
  """
326
327
  if not tiles or target_idx < 0 or target_idx >= self.total_frames:
327
328
  return
329
+
330
+ src_origin_col = min(idx % self.cols for idx in tiles)
331
+ src_origin_row = min(idx // self.cols for idx in tiles)
332
+ target_col = target_idx % self.cols
333
+ target_row = target_idx // self.cols
334
+
335
+ # Pre-compute all destination positions using current grid dimensions
336
+ dst_positions: List[Tuple[int, int, Surface]] = []
337
+ for src_idx, tile in tiles.items():
338
+ src_c = src_idx % self.cols - src_origin_col
339
+ src_r = src_idx // self.cols - src_origin_row
340
+ dst_c = target_col + src_c
341
+ dst_r = target_row + src_r
342
+ dst_positions.append((dst_r, dst_c, tile))
343
+
344
+ # Expand canvas if needed
345
+ need_rows = max(r for r, _, _ in dst_positions) + 1
346
+ need_cols = max(c for _, c, _ in dst_positions) + 1
347
+ if need_rows > self.rows or need_cols > self.cols:
348
+ self._expand_canvas(max(self.cols, need_cols), max(self.rows, need_rows))
349
+
328
350
  self.snapshot()
329
- sorted_src = sorted(tiles.keys())
330
- for offset, src_idx in enumerate(sorted_src):
331
- dst = target_idx + offset
332
- if dst >= self.total_frames:
333
- break
334
- tile = tiles[src_idx]
351
+ for dst_row, dst_col, tile in dst_positions:
352
+ if dst_row >= self.rows or dst_col >= self.cols:
353
+ continue
354
+ dst = dst_row * self.cols + dst_col
335
355
  self.write_tile(dst, tile)
356
+
336
357
  # Select the newly pasted tiles
337
- self.selected_indices = {
338
- target_idx + offset
339
- for offset in range(len(sorted_src))
340
- if target_idx + offset < self.total_frames
341
- }
358
+ self.selected_indices = set()
359
+ for dst_row, dst_col, _ in dst_positions:
360
+ if dst_row < self.rows and dst_col < self.cols:
361
+ self.selected_indices.add(dst_row * self.cols + dst_col)
362
+
363
+ def _expand_canvas(self, new_cols: int, new_rows: int) -> None:
364
+ """Enlarge the spritesheet surface to fit new_cols x new_rows tiles."""
365
+ tw, th = self.tile_size
366
+ new_w = new_cols * tw + self.grid_offset_x
367
+ new_h = new_rows * th + self.grid_offset_y
368
+ new_surf = Surface((new_w, new_h), SRCALPHA)
369
+ new_surf.fill((0, 0, 0, 0))
370
+ new_surf.blit(self.surface, (0, 0))
371
+ self.surface = new_surf
372
+ self.cols = new_cols
373
+ self.rows = new_rows
374
+ self.total_frames = new_cols * new_rows
375
+ # Reset view so the new area is visible
376
+ if self.offset_x < 0:
377
+ self.offset_x = 0
378
+ if self.offset_y < 0:
379
+ self.offset_y = 0
342
380
 
343
381
  def save_png(self, path: Path) -> None:
344
382
  """Write current surface to a PNG file."""
File without changes
File without changes
File without changes