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.
- {tilemap_editor-4.1.0/src/tilemap_editor.egg-info → tilemap_editor-4.2.0}/PKG-INFO +1 -1
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/pyproject.toml +1 -1
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/layers.py +30 -13
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap.py +32 -6
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0/src/tilemap_editor.egg-info}/PKG-INFO +1 -1
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor.egg-info/SOURCES.txt +2 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/ttypes/tilemap.py +6 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/tile_grid.py +9 -0
- tilemap_editor-4.2.0/tests/test_gid_collision.py +43 -0
- tilemap_editor-4.2.0/tests/test_layers_autotile.py +821 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/LICENSE +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/MANIFEST.in +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/README.md +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/fonts/jetbrain-fonts/JetBrainsMono-Bold.ttf +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/fonts/jetbrain-fonts/JetBrainsMono-BoldItalic.ttf +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/fonts/jetbrain-fonts/JetBrainsMono-Italic.ttf +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/fonts/jetbrain-fonts/JetBrainsMono-Regular.ttf +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/fonts/noto/NotoSans-Bold.ttf +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/fonts/noto/NotoSans-BoldItalic.ttf +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/fonts/noto/NotoSans-Italic.ttf +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/fonts/noto/NotoSans-Regular.ttf +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/icons/arrow-down.svg +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/icons/check.svg +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/icons/checked.svg +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/icons/close.svg +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/icons/duplicate.svg +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/icons/error.svg +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/icons/file.svg +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/icons/filedead.svg +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/icons/fit.svg +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/icons/folder.svg +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/icons/grid.svg +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/icons/image.svg +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/icons/info.svg +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/icons/load.svg +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/icons/loop.svg +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/icons/onion.svg +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/icons/pan.svg +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/icons/pause.svg +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/icons/pencil.svg +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/icons/play.svg +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/icons/plus.svg +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/icons/radio.svg +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/icons/reset.svg +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/icons/save.svg +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/icons/skip-back.svg +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/icons/skip-forward.svg +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/icons/stop.svg +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/icons/tilemap.svg +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/icons/tileset.svg +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/icons/unchecked.svg +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/icons/warning.svg +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/icons/zoomin.svg +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/assets/icons/zoomout.svg +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/setup.cfg +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/configs/themes.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/constants.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/editor.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/event_map.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/main.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/node_manager.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/nodes.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/plugins/__init__.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/plugins/character_collision/__init__.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/plugins/character_collision/editor.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/plugins/character_collision/models.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/plugins/character_collision/protocols.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/plugins/character_collision/shape_editor.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/plugins/character_collision/standalone.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/plugins/object_tileset_collision/__init__.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/plugins/object_tileset_collision/editor.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/plugins/object_tileset_collision/models.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/plugins/object_tileset_collision/protocols.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/plugins/object_tileset_collision/standalone.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/plugins/sprite_animation/__init__.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/plugins/sprite_animation/__main__.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/plugins/sprite_animation/clipboard_util.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/plugins/sprite_animation/editor.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/plugins/sprite_animation/frame_picker.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/plugins/sprite_animation/models.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/plugins/sprite_animation/preview.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/plugins/sprite_animation/protocols.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/plugins/sprite_animation/runtime_load.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/plugins/sprite_animation/standalone.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/plugins/sprite_animation/timeline.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/plugins/sprite_animation/validation.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/plugins/sprite_editor/__init__.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/plugins/sprite_editor/editor.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/plugins/sprite_editor/standalone.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/plugins/tileset_collision/__init__.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/plugins/tileset_collision/collision_painter.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/plugins/tileset_collision/editor.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/plugins/tileset_collision/models.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/plugins/tileset_collision/protocols.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/plugins/tileset_collision/standalone.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/standalone_automap.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/standalone_error_console.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/standalone_filemanager.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/standalone_image_viewer.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/__init__.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/__main__.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/__init__.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/fonts/jetbrain-fonts/JetBrainsMono-Bold.ttf +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/fonts/jetbrain-fonts/JetBrainsMono-BoldItalic.ttf +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/fonts/jetbrain-fonts/JetBrainsMono-Italic.ttf +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/fonts/jetbrain-fonts/JetBrainsMono-Regular.ttf +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/fonts/noto/NotoSans-Bold.ttf +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/fonts/noto/NotoSans-BoldItalic.ttf +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/fonts/noto/NotoSans-Italic.ttf +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/fonts/noto/NotoSans-Regular.ttf +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/icons/ToolMove.svg +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/icons/arrow-down.svg +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/icons/check.svg +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/icons/checked.svg +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/icons/close.svg +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/icons/duplicate.svg +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/icons/error.svg +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/icons/file.svg +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/icons/filedead.svg +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/icons/fit.svg +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/icons/folder.svg +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/icons/grid.svg +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/icons/image.svg +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/icons/info.svg +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/icons/load.svg +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/icons/loop.svg +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/icons/onion.svg +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/icons/pan.svg +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/icons/pause.svg +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/icons/pencil.svg +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/icons/play.svg +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/icons/plus.svg +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/icons/radio.svg +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/icons/reset.svg +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/icons/save.svg +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/icons/skip-back.svg +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/icons/skip-forward.svg +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/icons/stop.svg +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/icons/tilemap.svg +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/icons/tileset.svg +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/icons/unchecked.svg +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/icons/warning.svg +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/icons/zoomin.svg +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/assets/icons/zoomout.svg +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/cli.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/main.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor/settings.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor.egg-info/dependency_links.txt +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor.egg-info/entry_points.txt +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor.egg-info/requires.txt +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/tilemap_editor.egg-info/top_level.txt +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/ttypes/__init__.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/utils/__init__.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/utils/editor_preference.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/utils/error_handler.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/utils/font_manager.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/utils/history.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/utils/icon_manager.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/utils/icons_cache.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/utils/log_capture.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/utils/project_paths.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/utils/serialization.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/utils/standalone.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/utils/validation.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/__init__.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/automap_models.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/autotile_template.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/autotiler.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/filemanager.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/input.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/layer_selector.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/map_properties.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/mapsetup.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/particle_presets.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/particle_system.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/regex_automap_designer.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/spritesheet_grid.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/tile_selector.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/ui/button.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/ui/checkbox.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/ui/collision_layer_mask.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/ui/collision_layer_sidebar.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/ui/confirm_dialog.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/ui/dialog_base.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/ui/draw_utils.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/ui/fileinput.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/ui/label.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/ui/layer_type_dialog.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/ui/menubar.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/ui/mode_indicator.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/ui/node_editor.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/ui/node_selector.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/ui/notification.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/ui/particle_config_dialog.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/ui/property_editor.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/ui/region_selector.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/ui/scrollbar.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/ui/sidebar_container.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/ui/status_bar.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/ui/theme.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/ui/tileset_type_dialog.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/ui/toolbar.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/ui/tooltip.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/src/widgets/widget_base.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/tests/test_animation_library_grid_offset.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/tests/test_collision_layer_mask.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/tests/test_collision_layer_sidebar.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/tests/test_editor_pan_mode.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/tests/test_project_paths.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/tests/test_render_scale.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/tests/test_serialization_regression.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/tests/test_sprite_animation_editor_grid.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/tests/test_tile_grid_selection.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/tests/test_tile_selector_pick.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/tests/test_tilemap_save.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/tests/test_timeline_invalidate_cache.py +0 -0
- {tilemap_editor-4.1.0 → tilemap_editor-4.2.0}/tests/test_toolbar_tools.py +0 -0
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "tilemap-editor"
|
|
7
|
-
version = "4.
|
|
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 =
|
|
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 =
|
|
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
|
-
|
|
187
|
-
|
|
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
|
-
|
|
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":
|
|
330
|
-
"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":
|
|
361
|
-
"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
|
|
|
@@ -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
|