tilemap-editor 3.2.4__tar.gz → 3.2.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 (194) hide show
  1. {tilemap_editor-3.2.4/src/tilemap_editor.egg-info → tilemap_editor-3.2.6}/PKG-INFO +1 -1
  2. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/pyproject.toml +1 -1
  3. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/editor.py +13 -0
  4. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6/src/tilemap_editor.egg-info}/PKG-INFO +1 -1
  5. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/tilemap_editor.egg-info/SOURCES.txt +1 -0
  6. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/widgets/layer_selector.py +9 -9
  7. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/widgets/tile_selector.py +29 -45
  8. tilemap_editor-3.2.6/src/widgets/ui/confirm_dialog.py +149 -0
  9. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/LICENSE +0 -0
  10. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/MANIFEST.in +0 -0
  11. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/README.md +0 -0
  12. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/assets/fonts/jetbrain-fonts/JetBrainsMono-Bold.ttf +0 -0
  13. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/assets/fonts/jetbrain-fonts/JetBrainsMono-BoldItalic.ttf +0 -0
  14. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/assets/fonts/jetbrain-fonts/JetBrainsMono-Italic.ttf +0 -0
  15. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/assets/fonts/jetbrain-fonts/JetBrainsMono-Regular.ttf +0 -0
  16. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/assets/fonts/noto/NotoSans-Bold.ttf +0 -0
  17. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/assets/fonts/noto/NotoSans-BoldItalic.ttf +0 -0
  18. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/assets/fonts/noto/NotoSans-Italic.ttf +0 -0
  19. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/assets/fonts/noto/NotoSans-Regular.ttf +0 -0
  20. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/assets/icons/arrow-down.svg +0 -0
  21. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/assets/icons/check.svg +0 -0
  22. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/assets/icons/checked.svg +0 -0
  23. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/assets/icons/close.svg +0 -0
  24. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/assets/icons/duplicate.svg +0 -0
  25. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/assets/icons/error.svg +0 -0
  26. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/assets/icons/file.svg +0 -0
  27. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/assets/icons/filedead.svg +0 -0
  28. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/assets/icons/fit.svg +0 -0
  29. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/assets/icons/folder.svg +0 -0
  30. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/assets/icons/grid.svg +0 -0
  31. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/assets/icons/image.svg +0 -0
  32. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/assets/icons/info.svg +0 -0
  33. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/assets/icons/load.svg +0 -0
  34. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/assets/icons/loop.svg +0 -0
  35. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/assets/icons/pan.svg +0 -0
  36. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/assets/icons/pause.svg +0 -0
  37. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/assets/icons/pencil.svg +0 -0
  38. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/assets/icons/play.svg +0 -0
  39. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/assets/icons/plus.svg +0 -0
  40. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/assets/icons/radio.svg +0 -0
  41. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/assets/icons/reset.svg +0 -0
  42. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/assets/icons/save.svg +0 -0
  43. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/assets/icons/stop.svg +0 -0
  44. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/assets/icons/tilemap.svg +0 -0
  45. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/assets/icons/tileset.svg +0 -0
  46. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/assets/icons/unchecked.svg +0 -0
  47. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/assets/icons/warning.svg +0 -0
  48. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/assets/icons/zoomin.svg +0 -0
  49. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/assets/icons/zoomout.svg +0 -0
  50. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/setup.cfg +0 -0
  51. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/configs/themes.py +0 -0
  52. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/constants.py +0 -0
  53. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/event_map.py +0 -0
  54. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/layers.py +0 -0
  55. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/main.py +0 -0
  56. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/plugins/__init__.py +0 -0
  57. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/plugins/character_collision/__init__.py +0 -0
  58. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/plugins/character_collision/editor.py +0 -0
  59. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/plugins/character_collision/models.py +0 -0
  60. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/plugins/character_collision/protocols.py +0 -0
  61. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/plugins/character_collision/shape_editor.py +0 -0
  62. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/plugins/character_collision/standalone.py +0 -0
  63. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/plugins/object_tileset_collision/__init__.py +0 -0
  64. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/plugins/object_tileset_collision/editor.py +0 -0
  65. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/plugins/object_tileset_collision/models.py +0 -0
  66. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/plugins/object_tileset_collision/protocols.py +0 -0
  67. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/plugins/object_tileset_collision/standalone.py +0 -0
  68. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/plugins/sprite_animation/__init__.py +0 -0
  69. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/plugins/sprite_animation/__main__.py +0 -0
  70. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/plugins/sprite_animation/clipboard_util.py +0 -0
  71. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/plugins/sprite_animation/editor.py +0 -0
  72. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/plugins/sprite_animation/frame_picker.py +0 -0
  73. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/plugins/sprite_animation/models.py +0 -0
  74. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/plugins/sprite_animation/preview.py +0 -0
  75. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/plugins/sprite_animation/protocols.py +0 -0
  76. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/plugins/sprite_animation/runtime_load.py +0 -0
  77. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/plugins/sprite_animation/standalone.py +0 -0
  78. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/plugins/sprite_animation/timeline.py +0 -0
  79. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/plugins/sprite_animation/validation.py +0 -0
  80. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/plugins/sprite_editor/__init__.py +0 -0
  81. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/plugins/sprite_editor/editor.py +0 -0
  82. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/plugins/sprite_editor/standalone.py +0 -0
  83. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/plugins/tileset_collision/__init__.py +0 -0
  84. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/plugins/tileset_collision/collision_painter.py +0 -0
  85. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/plugins/tileset_collision/editor.py +0 -0
  86. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/plugins/tileset_collision/models.py +0 -0
  87. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/plugins/tileset_collision/protocols.py +0 -0
  88. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/plugins/tileset_collision/standalone.py +0 -0
  89. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/standalone_automap.py +0 -0
  90. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/standalone_error_console.py +0 -0
  91. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/standalone_filemanager.py +0 -0
  92. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/standalone_image_viewer.py +0 -0
  93. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/tilemap.py +0 -0
  94. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/tilemap_editor/__init__.py +0 -0
  95. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/tilemap_editor/__main__.py +0 -0
  96. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/tilemap_editor/assets/__init__.py +0 -0
  97. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/tilemap_editor/assets/fonts/jetbrain-fonts/JetBrainsMono-Bold.ttf +0 -0
  98. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/tilemap_editor/assets/fonts/jetbrain-fonts/JetBrainsMono-BoldItalic.ttf +0 -0
  99. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/tilemap_editor/assets/fonts/jetbrain-fonts/JetBrainsMono-Italic.ttf +0 -0
  100. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/tilemap_editor/assets/fonts/jetbrain-fonts/JetBrainsMono-Regular.ttf +0 -0
  101. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/tilemap_editor/assets/fonts/noto/NotoSans-Bold.ttf +0 -0
  102. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/tilemap_editor/assets/fonts/noto/NotoSans-BoldItalic.ttf +0 -0
  103. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/tilemap_editor/assets/fonts/noto/NotoSans-Italic.ttf +0 -0
  104. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/tilemap_editor/assets/fonts/noto/NotoSans-Regular.ttf +0 -0
  105. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/tilemap_editor/assets/icons/ToolMove.svg +0 -0
  106. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/tilemap_editor/assets/icons/arrow-down.svg +0 -0
  107. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/tilemap_editor/assets/icons/check.svg +0 -0
  108. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/tilemap_editor/assets/icons/checked.svg +0 -0
  109. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/tilemap_editor/assets/icons/close.svg +0 -0
  110. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/tilemap_editor/assets/icons/duplicate.svg +0 -0
  111. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/tilemap_editor/assets/icons/error.svg +0 -0
  112. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/tilemap_editor/assets/icons/file.svg +0 -0
  113. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/tilemap_editor/assets/icons/filedead.svg +0 -0
  114. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/tilemap_editor/assets/icons/fit.svg +0 -0
  115. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/tilemap_editor/assets/icons/folder.svg +0 -0
  116. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/tilemap_editor/assets/icons/grid.svg +0 -0
  117. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/tilemap_editor/assets/icons/image.svg +0 -0
  118. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/tilemap_editor/assets/icons/info.svg +0 -0
  119. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/tilemap_editor/assets/icons/load.svg +0 -0
  120. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/tilemap_editor/assets/icons/loop.svg +0 -0
  121. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/tilemap_editor/assets/icons/pan.svg +0 -0
  122. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/tilemap_editor/assets/icons/pause.svg +0 -0
  123. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/tilemap_editor/assets/icons/pencil.svg +0 -0
  124. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/tilemap_editor/assets/icons/play.svg +0 -0
  125. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/tilemap_editor/assets/icons/plus.svg +0 -0
  126. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/tilemap_editor/assets/icons/radio.svg +0 -0
  127. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/tilemap_editor/assets/icons/reset.svg +0 -0
  128. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/tilemap_editor/assets/icons/save.svg +0 -0
  129. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/tilemap_editor/assets/icons/stop.svg +0 -0
  130. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/tilemap_editor/assets/icons/tilemap.svg +0 -0
  131. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/tilemap_editor/assets/icons/tileset.svg +0 -0
  132. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/tilemap_editor/assets/icons/unchecked.svg +0 -0
  133. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/tilemap_editor/assets/icons/warning.svg +0 -0
  134. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/tilemap_editor/assets/icons/zoomin.svg +0 -0
  135. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/tilemap_editor/assets/icons/zoomout.svg +0 -0
  136. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/tilemap_editor/cli.py +0 -0
  137. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/tilemap_editor/main.py +0 -0
  138. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/tilemap_editor/settings.py +0 -0
  139. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/tilemap_editor.egg-info/dependency_links.txt +0 -0
  140. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/tilemap_editor.egg-info/entry_points.txt +0 -0
  141. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/tilemap_editor.egg-info/requires.txt +0 -0
  142. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/tilemap_editor.egg-info/top_level.txt +0 -0
  143. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/ttypes/__init__.py +0 -0
  144. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/ttypes/tilemap.py +0 -0
  145. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/utils/__init__.py +0 -0
  146. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/utils/editor_preference.py +0 -0
  147. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/utils/error_handler.py +0 -0
  148. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/utils/font_manager.py +0 -0
  149. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/utils/history.py +0 -0
  150. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/utils/icon_manager.py +0 -0
  151. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/utils/icons_cache.py +0 -0
  152. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/utils/log_capture.py +0 -0
  153. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/utils/project_paths.py +0 -0
  154. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/utils/serialization.py +0 -0
  155. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/utils/standalone.py +0 -0
  156. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/utils/validation.py +0 -0
  157. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/widgets/__init__.py +0 -0
  158. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/widgets/automap_models.py +0 -0
  159. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/widgets/autotile_template.py +0 -0
  160. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/widgets/autotiler.py +0 -0
  161. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/widgets/filemanager.py +0 -0
  162. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/widgets/input.py +0 -0
  163. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/widgets/map_properties.py +0 -0
  164. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/widgets/mapsetup.py +0 -0
  165. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/widgets/regex_automap_designer.py +0 -0
  166. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/widgets/spritesheet_grid.py +0 -0
  167. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/widgets/tile_grid.py +0 -0
  168. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/widgets/ui/collision_layer_mask.py +0 -0
  169. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/widgets/ui/collision_layer_sidebar.py +0 -0
  170. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/widgets/ui/draw_utils.py +0 -0
  171. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/widgets/ui/fileinput.py +0 -0
  172. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/widgets/ui/layer_type_dialog.py +0 -0
  173. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/widgets/ui/menubar.py +0 -0
  174. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/widgets/ui/mode_indicator.py +0 -0
  175. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/widgets/ui/notification.py +0 -0
  176. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/widgets/ui/property_editor.py +0 -0
  177. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/widgets/ui/region_selector.py +0 -0
  178. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/widgets/ui/status_bar.py +0 -0
  179. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/widgets/ui/theme.py +0 -0
  180. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/widgets/ui/tileset_type_dialog.py +0 -0
  181. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/widgets/ui/toolbar.py +0 -0
  182. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/src/widgets/ui/tooltip.py +0 -0
  183. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/tests/test_animation_library_grid_offset.py +0 -0
  184. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/tests/test_collision_layer_mask.py +0 -0
  185. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/tests/test_collision_layer_sidebar.py +0 -0
  186. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/tests/test_editor_pan_mode.py +0 -0
  187. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/tests/test_project_paths.py +0 -0
  188. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/tests/test_render_scale.py +0 -0
  189. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/tests/test_sprite_animation_editor_grid.py +0 -0
  190. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/tests/test_tile_grid_selection.py +0 -0
  191. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/tests/test_tile_selector_pick.py +0 -0
  192. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/tests/test_tilemap_save.py +0 -0
  193. {tilemap_editor-3.2.4 → tilemap_editor-3.2.6}/tests/test_timeline_invalidate_cache.py +0 -0
  194. {tilemap_editor-3.2.4 → tilemap_editor-3.2.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: 3.2.4
3
+ Version: 3.2.6
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.4"
7
+ version = "3.2.6"
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"
@@ -27,6 +27,7 @@ from widgets.tile_grid import TileGrid
27
27
  from widgets.layer_selector import LayerSelector
28
28
  from widgets.ui.fileinput import FilenameInput
29
29
  from widgets.ui.tileset_type_dialog import TilesetTypeDialog
30
+ from widgets.ui.confirm_dialog import ConfirmDialog
30
31
  from widgets.ui.layer_type_dialog import LayerTypeDialog
31
32
  from widgets.ui.menubar import MenuBar
32
33
  from widgets.ui.toolbar import Toolbar
@@ -208,6 +209,7 @@ class Editor:
208
209
  on_cancel=lambda: None,
209
210
  )
210
211
  self.tileset_type_dialog = TilesetTypeDialog(editor_rect)
212
+ self.confirm_dialog = ConfirmDialog(editor_rect)
211
213
  self.layer_type_dialog = LayerTypeDialog(editor_rect)
212
214
 
213
215
  self.menubar = MenuBar(self, self.width, 30)
@@ -542,6 +544,8 @@ class Editor:
542
544
 
543
545
  if hasattr(self, "tileset_type_dialog") and self.tileset_type_dialog:
544
546
  self.tileset_type_dialog.editor_rect = rect_full
547
+ if hasattr(self, "confirm_dialog") and self.confirm_dialog:
548
+ self.confirm_dialog.editor_rect = rect_full
545
549
  if hasattr(self, "layer_type_dialog") and self.layer_type_dialog:
546
550
  self.layer_type_dialog.editor_rect = rect_full
547
551
 
@@ -1052,6 +1056,10 @@ class Editor:
1052
1056
  self.tileset_type_dialog.handle_event(event)
1053
1057
  continue
1054
1058
 
1059
+ if self.confirm_dialog.active:
1060
+ self.confirm_dialog.handle_event(event)
1061
+ continue
1062
+
1055
1063
  if self.layer_type_dialog.active:
1056
1064
  self.layer_type_dialog.handle_event(event)
1057
1065
  continue
@@ -1261,6 +1269,11 @@ class Editor:
1261
1269
  overlay.fill((0, 0, 0, 150))
1262
1270
  self.screen.blit(overlay, (0, 0))
1263
1271
  self.tileset_type_dialog.draw(self.screen)
1272
+ if self.confirm_dialog.active:
1273
+ overlay = pygame.Surface((self.width, self.height), pygame.SRCALPHA)
1274
+ overlay.fill((0, 0, 0, 150))
1275
+ self.screen.blit(overlay, (0, 0))
1276
+ self.confirm_dialog.draw(self.screen)
1264
1277
  if self.layer_type_dialog.active:
1265
1278
  overlay = pygame.Surface((self.width, self.height), pygame.SRCALPHA)
1266
1279
  overlay.fill((0, 0, 0, 150))
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tilemap-editor
3
- Version: 3.2.4
3
+ Version: 3.2.6
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
@@ -164,6 +164,7 @@ src/widgets/tile_grid.py
164
164
  src/widgets/tile_selector.py
165
165
  src/widgets/ui/collision_layer_mask.py
166
166
  src/widgets/ui/collision_layer_sidebar.py
167
+ src/widgets/ui/confirm_dialog.py
167
168
  src/widgets/ui/draw_utils.py
168
169
  src/widgets/ui/fileinput.py
169
170
  src/widgets/ui/layer_type_dialog.py
@@ -382,13 +382,6 @@ class LayerSelector:
382
382
  pygame.draw.rect(screen, color, item_rect)
383
383
  pygame.draw.rect(screen, COLORS.border_soft, item_rect, 1)
384
384
 
385
- if i == self.renaming_layer_idx:
386
- pygame.draw.rect(
387
- screen,
388
- COLORS.selected,
389
- Rect(item_rect.x + 4, item_rect.y + 4, 120, 20),
390
- border_radius=SHAPE.radius_sm,
391
- )
392
385
  mx, my = pygame.mouse.get_pos()
393
386
  eye_rect = self._get_eye_icon_rect(i, (mx, my))
394
387
  lock_rect = self._get_lock_icon_rect(i, (mx, my))
@@ -396,13 +389,20 @@ class LayerSelector:
396
389
  self.editor.tooltip.show("Toggle Visibility", (mx + 10, my + 10))
397
390
  elif lock_rect and lock_rect.collidepoint(mx, my):
398
391
  self.editor.tooltip.show("Toggle Lock", (mx + 10, my + 10))
392
+
393
+ if i == self.renaming_layer_idx:
394
+ pygame.draw.rect(
395
+ screen,
396
+ COLORS.selected,
397
+ Rect(item_rect.x + 4, item_rect.y + 4, 120, 20),
398
+ border_radius=SHAPE.radius_sm,
399
+ )
399
400
  name_txt = self.font_layer.render(
400
401
  self.rename_text + "|", True, self.text_color
401
402
  )
402
- screen.blit(name_txt, (item_rect.x + 5, item_rect.y + 5))
403
403
  else:
404
404
  name_txt = self.font_layer.render(layer.name, True, self.text_color)
405
- screen.blit(name_txt, (item_rect.x + 5, item_rect.y + 5))
405
+ screen.blit(name_txt, (item_rect.x + 5, item_rect.y + 5))
406
406
 
407
407
  eye_x = item_rect.right - 25
408
408
  eye_y = item_rect.y + 7
@@ -348,66 +348,56 @@ class TileSelector:
348
348
  if path.exists():
349
349
  try:
350
350
  surf = pygame.image.load(path).convert_alpha()
351
- if tileset_type == "object" or is_image_multipleof(
352
- surf.get_size(), self.editor.tilemap.tile_size
353
- ):
354
- tileset_data = TilesetData(
355
- path.name, path, surf, tileset_type=tileset_type
356
- )
357
- tileset_data.properties = properties
358
- # Convert string keys back to int if necessary
359
- tileset_data.tile_properties = {
360
- int(k): v for k, v in tile_properties.items()
361
- }
362
- self._load_collision_data_for_tileset(tileset_data)
363
-
364
- self.tilesets.append(tileset_data)
365
- self.active_idx = len(self.tilesets) - 1
366
- self.tileset_map[self.active_idx] = tileset_data
367
- if tileset_type == "object":
368
- self.selected_tile = (0, 0, surf.get_width(), surf.get_height())
369
- else:
370
- print("Tileset isnt multiple of tile size")
351
+ tileset_data = TilesetData(
352
+ path.name, path, surf, tileset_type=tileset_type
353
+ )
354
+ tileset_data.properties = properties
355
+ tileset_data.tile_properties = {
356
+ int(k): v for k, v in tile_properties.items()
357
+ }
358
+ self._load_collision_data_for_tileset(tileset_data)
359
+
360
+ self.tilesets.append(tileset_data)
361
+ self.active_idx = len(self.tilesets) - 1
362
+ self.tileset_map[self.active_idx] = tileset_data
363
+ if tileset_type == "object":
364
+ self.selected_tile = (0, 0, surf.get_width(), surf.get_height())
371
365
  except Exception as e:
372
366
  error_handler.capture(e, context="load_tileset_surface")
373
367
 
374
368
  def _on_tileset_type_selected(self, tileset_type: str):
375
369
  """Callback when user selects tileset type from dialog."""
376
- print(f"DEBUG: Tileset type selected: {tileset_type}")
377
370
  if not hasattr(self, "_pending_tileset_path"):
378
- print("DEBUG: No pending tileset path!")
379
371
  return
380
372
 
381
- path = self._pending_tileset_path
382
373
  surf = self._pending_tileset_surf
383
374
 
384
375
  if tileset_type == "tile" and not is_image_multipleof(
385
376
  surf.get_size(), self.editor.tilemap.tile_size
386
377
  ):
387
- self.editor.notifications.error(
388
- "Tileset size must be multiple of tile size"
378
+ w, h = surf.get_size()
379
+ tw, th = self.editor.tilemap.tile_size
380
+ self.editor.confirm_dialog.show(
381
+ title="Tileset Size Warning",
382
+ message=f"Image size ({w}x{h}) is not an exact multiple of tile size ({tw}x{th}). "
383
+ f"Some pixels at the edges will be ignored. Proceed?",
384
+ on_confirm=lambda: self._commit_tileset_load(tileset_type),
385
+ on_cancel=self._on_tileset_type_cancel,
389
386
  )
390
- delattr(self, "_pending_tileset_path")
391
- delattr(self, "_pending_tileset_surf")
392
- if self._pending_tileset_queue:
393
- error_handler.capture(
394
- Exception(
395
- f"Queue error continuation: {len(self._pending_tileset_queue)} items"
396
- ),
397
- context="tileset_queue_error",
398
- severity="info",
399
- )
400
- # Delay slightly to allow dialog to fully close
401
- pygame.time.set_timer(pygame.USEREVENT + 1, 100, 1)
402
- self._queue_timer_active = True
403
387
  return
404
388
 
389
+ self._commit_tileset_load(tileset_type)
390
+
391
+ def _commit_tileset_load(self, tileset_type: str):
392
+ path = self._pending_tileset_path
393
+ surf = self._pending_tileset_surf
394
+
405
395
  tileset_data = TilesetData(path.name, path, surf, tileset_type=tileset_type)
406
396
  self._load_collision_data_for_tileset(tileset_data)
407
397
  self.tilesets.append(tileset_data)
408
398
  self.active_idx = len(self.tilesets) - 1
409
399
  self.tileset_map[self.active_idx] = tileset_data
410
- print(f"DEBUG: Added tileset {path.name}, total tilesets: {len(self.tilesets)}")
400
+
411
401
  if tileset_type == "object":
412
402
  self.selected_tile = (0, 0, surf.get_width(), surf.get_height())
413
403
  else:
@@ -416,14 +406,8 @@ class TileSelector:
416
406
  delattr(self, "_pending_tileset_path")
417
407
  delattr(self, "_pending_tileset_surf")
418
408
  if self._pending_tileset_queue:
419
- print(
420
- f"DEBUG: Continuing queue, {len(self._pending_tileset_queue)} items remaining"
421
- )
422
- # Delay slightly to allow dialog to fully close
423
409
  pygame.time.set_timer(pygame.USEREVENT + 1, 100, 1)
424
410
  self._queue_timer_active = True
425
- else:
426
- print("DEBUG: Queue processing complete")
427
411
 
428
412
  def _load_collision_data_for_tileset(self, tileset_data: TilesetData) -> None:
429
413
  """Attach existing collision data for tilesets that have sidecar files."""
@@ -0,0 +1,149 @@
1
+ import pygame
2
+ from pygame import Rect, Surface
3
+ from typing import Callable, Optional
4
+
5
+
6
+ class ConfirmDialog:
7
+ def __init__(self, editor_rect: Rect):
8
+ self.editor_rect = editor_rect
9
+ self.rect = Rect(0, 0, 420, 180)
10
+ self.rect.center = editor_rect.center
11
+
12
+ self.active = False
13
+ self.title = ""
14
+ self.message = ""
15
+ self.on_confirm: Optional[Callable[[], None]] = None
16
+ self.on_cancel: Optional[Callable[[], None]] = None
17
+
18
+ self.bg_color = (40, 40, 40)
19
+ self.border_color = (100, 100, 100)
20
+ self.text_color = (255, 255, 255)
21
+ self.warn_color = (255, 200, 60)
22
+ self.button_color = (60, 100, 180)
23
+ self.button_hover_color = (80, 120, 200)
24
+
25
+ self.btn_proceed = Rect(0, 0, 110, 30)
26
+ self.btn_cancel = Rect(0, 0, 110, 30)
27
+
28
+ self.font_title = pygame.font.SysFont("Arial", 18, bold=True)
29
+ self.font_text = pygame.font.SysFont("Arial", 14)
30
+ self.font_btn = pygame.font.SysFont("Arial", 14, bold=True)
31
+
32
+ self.btn_proceed_hover = False
33
+ self.btn_cancel_hover = False
34
+ self._layout()
35
+
36
+ def _layout(self):
37
+ self.rect.center = self.editor_rect.center
38
+ btn_y = self.rect.bottom - 50
39
+ cx = self.rect.centerx
40
+ self.btn_cancel = Rect(cx - 120, btn_y, 110, 30)
41
+ self.btn_proceed = Rect(cx + 10, btn_y, 110, 30)
42
+
43
+ def show(
44
+ self,
45
+ title: str,
46
+ message: str,
47
+ on_confirm: Callable[[], None],
48
+ on_cancel: Callable[[], None],
49
+ ):
50
+ if self.active:
51
+ self.hide()
52
+ self.active = True
53
+ self.title = title
54
+ self.message = message
55
+ self.on_confirm = on_confirm
56
+ self.on_cancel = on_cancel
57
+ self.btn_proceed_hover = False
58
+ self.btn_cancel_hover = False
59
+ self._layout()
60
+
61
+ def hide(self):
62
+ self.active = False
63
+
64
+ def handle_event(self, event: pygame.event.Event) -> bool:
65
+ if not self.active:
66
+ return False
67
+
68
+ self._layout()
69
+ mouse_pos = pygame.mouse.get_pos()
70
+
71
+ if event.type == pygame.MOUSEBUTTONDOWN and event.button == 1:
72
+ if self.btn_proceed.collidepoint(mouse_pos):
73
+ if self.on_confirm:
74
+ self.on_confirm()
75
+ self.hide()
76
+ return True
77
+ if self.btn_cancel.collidepoint(mouse_pos):
78
+ if self.on_cancel:
79
+ self.on_cancel()
80
+ self.hide()
81
+ return True
82
+
83
+ elif event.type == pygame.KEYDOWN:
84
+ if event.key == pygame.K_ESCAPE:
85
+ if self.on_cancel:
86
+ self.on_cancel()
87
+ self.hide()
88
+ return True
89
+ elif event.key == pygame.K_RETURN:
90
+ if self.on_confirm:
91
+ self.on_confirm()
92
+ self.hide()
93
+ return True
94
+
95
+ elif event.type == pygame.MOUSEMOTION:
96
+ self.btn_proceed_hover = self.btn_proceed.collidepoint(mouse_pos)
97
+ self.btn_cancel_hover = self.btn_cancel.collidepoint(mouse_pos)
98
+
99
+ return False
100
+
101
+ def draw(self, surface: Surface):
102
+ if not self.active:
103
+ return
104
+
105
+ self._layout()
106
+ pygame.draw.rect(surface, self.bg_color, self.rect)
107
+ pygame.draw.rect(surface, self.border_color, self.rect, 2)
108
+
109
+ title_surf = self.font_title.render(self.title, True, self.warn_color)
110
+ title_rect = title_surf.get_rect(topleft=(self.rect.x + 20, self.rect.y + 15))
111
+ surface.blit(title_surf, title_rect)
112
+
113
+ lines = self._wrap_text(self.message, self.rect.width - 40)
114
+ y = self.rect.y + 50
115
+ for line in lines:
116
+ line_surf = self.font_text.render(line, True, self.text_color)
117
+ surface.blit(line_surf, (self.rect.x + 20, y))
118
+ y += 22
119
+
120
+ proceed_color = self.button_hover_color if self.btn_proceed_hover else self.button_color
121
+ cancel_color = self.button_hover_color if self.btn_cancel_hover else (60, 60, 60)
122
+
123
+ pygame.draw.rect(surface, cancel_color, self.btn_cancel)
124
+ pygame.draw.rect(surface, proceed_color, self.btn_proceed)
125
+
126
+ cancel_text = self.font_btn.render("Cancel", True, self.text_color)
127
+ proceed_text = self.font_btn.render("Proceed", True, self.text_color)
128
+
129
+ cancel_text_rect = cancel_text.get_rect(center=self.btn_cancel.center)
130
+ proceed_text_rect = proceed_text.get_rect(center=self.btn_proceed.center)
131
+
132
+ surface.blit(cancel_text, cancel_text_rect)
133
+ surface.blit(proceed_text, proceed_text_rect)
134
+
135
+ def _wrap_text(self, text: str, max_width: int):
136
+ words = text.split()
137
+ lines = []
138
+ current = ""
139
+ for word in words:
140
+ test = f"{current} {word}".strip()
141
+ if self.font_text.size(test)[0] <= max_width:
142
+ current = test
143
+ else:
144
+ if current:
145
+ lines.append(current)
146
+ current = word
147
+ if current:
148
+ lines.append(current)
149
+ return lines
File without changes
File without changes
File without changes