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