tilemap-editor 3.3.1__tar.gz → 3.3.3__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.3.1/src/tilemap_editor.egg-info → tilemap_editor-3.3.3}/PKG-INFO +1 -1
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/pyproject.toml +1 -1
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/editor.py +26 -11
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/node_manager.py +11 -1
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/plugins/sprite_animation/preview.py +2 -1
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/tilemap.py +4 -2
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3/src/tilemap_editor.egg-info}/PKG-INFO +1 -1
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/tilemap_editor.egg-info/SOURCES.txt +3 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/widgets/autotiler.py +3 -1
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/widgets/filemanager.py +4 -2
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/widgets/mapsetup.py +25 -6
- tilemap_editor-3.3.3/src/widgets/particle_presets.py +663 -0
- tilemap_editor-3.3.3/src/widgets/particle_system.py +436 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/widgets/regex_automap_designer.py +4 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/widgets/tile_grid.py +67 -12
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/widgets/tile_selector.py +19 -8
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/widgets/ui/node_editor.py +114 -24
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/widgets/ui/node_selector.py +15 -4
- tilemap_editor-3.3.3/src/widgets/ui/particle_config_dialog.py +712 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/LICENSE +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/MANIFEST.in +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/README.md +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/assets/fonts/jetbrain-fonts/JetBrainsMono-Bold.ttf +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/assets/fonts/jetbrain-fonts/JetBrainsMono-BoldItalic.ttf +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/assets/fonts/jetbrain-fonts/JetBrainsMono-Italic.ttf +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/assets/fonts/jetbrain-fonts/JetBrainsMono-Regular.ttf +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/assets/fonts/noto/NotoSans-Bold.ttf +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/assets/fonts/noto/NotoSans-BoldItalic.ttf +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/assets/fonts/noto/NotoSans-Italic.ttf +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/assets/fonts/noto/NotoSans-Regular.ttf +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/assets/icons/arrow-down.svg +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/assets/icons/check.svg +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/assets/icons/checked.svg +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/assets/icons/close.svg +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/assets/icons/duplicate.svg +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/assets/icons/error.svg +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/assets/icons/file.svg +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/assets/icons/filedead.svg +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/assets/icons/fit.svg +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/assets/icons/folder.svg +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/assets/icons/grid.svg +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/assets/icons/image.svg +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/assets/icons/info.svg +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/assets/icons/load.svg +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/assets/icons/loop.svg +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/assets/icons/pan.svg +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/assets/icons/pause.svg +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/assets/icons/pencil.svg +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/assets/icons/play.svg +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/assets/icons/plus.svg +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/assets/icons/radio.svg +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/assets/icons/reset.svg +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/assets/icons/save.svg +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/assets/icons/stop.svg +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/assets/icons/tilemap.svg +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/assets/icons/tileset.svg +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/assets/icons/unchecked.svg +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/assets/icons/warning.svg +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/assets/icons/zoomin.svg +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/assets/icons/zoomout.svg +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/setup.cfg +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/configs/themes.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/constants.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/event_map.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/layers.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/main.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/nodes.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/plugins/__init__.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/plugins/character_collision/__init__.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/plugins/character_collision/editor.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/plugins/character_collision/models.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/plugins/character_collision/protocols.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/plugins/character_collision/shape_editor.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/plugins/character_collision/standalone.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/plugins/object_tileset_collision/__init__.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/plugins/object_tileset_collision/editor.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/plugins/object_tileset_collision/models.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/plugins/object_tileset_collision/protocols.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/plugins/object_tileset_collision/standalone.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/plugins/sprite_animation/__init__.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/plugins/sprite_animation/__main__.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/plugins/sprite_animation/clipboard_util.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/plugins/sprite_animation/editor.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/plugins/sprite_animation/frame_picker.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/plugins/sprite_animation/models.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/plugins/sprite_animation/protocols.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/plugins/sprite_animation/runtime_load.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/plugins/sprite_animation/standalone.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/plugins/sprite_animation/timeline.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/plugins/sprite_animation/validation.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/plugins/sprite_editor/__init__.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/plugins/sprite_editor/editor.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/plugins/sprite_editor/standalone.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/plugins/tileset_collision/__init__.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/plugins/tileset_collision/collision_painter.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/plugins/tileset_collision/editor.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/plugins/tileset_collision/models.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/plugins/tileset_collision/protocols.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/plugins/tileset_collision/standalone.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/standalone_automap.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/standalone_error_console.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/standalone_filemanager.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/standalone_image_viewer.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/tilemap_editor/__init__.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/tilemap_editor/__main__.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/tilemap_editor/assets/__init__.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/tilemap_editor/assets/fonts/jetbrain-fonts/JetBrainsMono-Bold.ttf +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/tilemap_editor/assets/fonts/jetbrain-fonts/JetBrainsMono-BoldItalic.ttf +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/tilemap_editor/assets/fonts/jetbrain-fonts/JetBrainsMono-Italic.ttf +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/tilemap_editor/assets/fonts/jetbrain-fonts/JetBrainsMono-Regular.ttf +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/tilemap_editor/assets/fonts/noto/NotoSans-Bold.ttf +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/tilemap_editor/assets/fonts/noto/NotoSans-BoldItalic.ttf +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/tilemap_editor/assets/fonts/noto/NotoSans-Italic.ttf +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/tilemap_editor/assets/fonts/noto/NotoSans-Regular.ttf +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/tilemap_editor/assets/icons/ToolMove.svg +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/tilemap_editor/assets/icons/arrow-down.svg +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/tilemap_editor/assets/icons/check.svg +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/tilemap_editor/assets/icons/checked.svg +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/tilemap_editor/assets/icons/close.svg +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/tilemap_editor/assets/icons/duplicate.svg +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/tilemap_editor/assets/icons/error.svg +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/tilemap_editor/assets/icons/file.svg +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/tilemap_editor/assets/icons/filedead.svg +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/tilemap_editor/assets/icons/fit.svg +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/tilemap_editor/assets/icons/folder.svg +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/tilemap_editor/assets/icons/grid.svg +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/tilemap_editor/assets/icons/image.svg +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/tilemap_editor/assets/icons/info.svg +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/tilemap_editor/assets/icons/load.svg +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/tilemap_editor/assets/icons/loop.svg +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/tilemap_editor/assets/icons/pan.svg +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/tilemap_editor/assets/icons/pause.svg +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/tilemap_editor/assets/icons/pencil.svg +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/tilemap_editor/assets/icons/play.svg +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/tilemap_editor/assets/icons/plus.svg +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/tilemap_editor/assets/icons/radio.svg +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/tilemap_editor/assets/icons/reset.svg +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/tilemap_editor/assets/icons/save.svg +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/tilemap_editor/assets/icons/stop.svg +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/tilemap_editor/assets/icons/tilemap.svg +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/tilemap_editor/assets/icons/tileset.svg +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/tilemap_editor/assets/icons/unchecked.svg +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/tilemap_editor/assets/icons/warning.svg +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/tilemap_editor/assets/icons/zoomin.svg +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/tilemap_editor/assets/icons/zoomout.svg +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/tilemap_editor/cli.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/tilemap_editor/main.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/tilemap_editor/settings.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/tilemap_editor.egg-info/dependency_links.txt +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/tilemap_editor.egg-info/entry_points.txt +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/tilemap_editor.egg-info/requires.txt +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/tilemap_editor.egg-info/top_level.txt +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/ttypes/__init__.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/ttypes/tilemap.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/utils/__init__.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/utils/editor_preference.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/utils/error_handler.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/utils/font_manager.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/utils/history.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/utils/icon_manager.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/utils/icons_cache.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/utils/log_capture.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/utils/project_paths.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/utils/serialization.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/utils/standalone.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/utils/validation.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/widgets/__init__.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/widgets/automap_models.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/widgets/autotile_template.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/widgets/input.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/widgets/layer_selector.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/widgets/map_properties.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/widgets/spritesheet_grid.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/widgets/ui/collision_layer_mask.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/widgets/ui/collision_layer_sidebar.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/widgets/ui/confirm_dialog.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/widgets/ui/draw_utils.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/widgets/ui/fileinput.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/widgets/ui/layer_type_dialog.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/widgets/ui/menubar.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/widgets/ui/mode_indicator.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/widgets/ui/notification.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/widgets/ui/property_editor.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/widgets/ui/region_selector.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/widgets/ui/status_bar.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/widgets/ui/theme.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/widgets/ui/tileset_type_dialog.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/widgets/ui/toolbar.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/src/widgets/ui/tooltip.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/tests/test_animation_library_grid_offset.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/tests/test_collision_layer_mask.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/tests/test_collision_layer_sidebar.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/tests/test_editor_pan_mode.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/tests/test_project_paths.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/tests/test_render_scale.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/tests/test_sprite_animation_editor_grid.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/tests/test_tile_grid_selection.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/tests/test_tile_selector_pick.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/tests/test_tilemap_save.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/tests/test_timeline_invalidate_cache.py +0 -0
- {tilemap_editor-3.3.1 → tilemap_editor-3.3.3}/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.3.
|
|
7
|
+
version = "3.3.3"
|
|
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"
|
|
@@ -35,6 +35,7 @@ from widgets.ui.node_selector import NodeSelector
|
|
|
35
35
|
from widgets.ui.node_editor import NodeEditor
|
|
36
36
|
from widgets.ui.notification import NotificationManager
|
|
37
37
|
from widgets.ui.property_editor import PropertyEditor
|
|
38
|
+
from widgets.ui.particle_config_dialog import ParticleConfigDialog
|
|
38
39
|
from widgets.ui.tooltip import TooltipManager
|
|
39
40
|
from widgets.ui.theme import get_theme_manager, set_theme, THEMES
|
|
40
41
|
from utils.log_capture import setup_console_log
|
|
@@ -192,6 +193,7 @@ class Editor:
|
|
|
192
193
|
self.tooltip = TooltipManager()
|
|
193
194
|
self.error_console_process: Optional[subprocess.Popen] = None
|
|
194
195
|
self.property_editor: Optional[PropertyEditor] = None
|
|
196
|
+
self.particle_config_dialog: Optional[ParticleConfigDialog] = None
|
|
195
197
|
|
|
196
198
|
self.child_processes: List[subprocess.Popen] = []
|
|
197
199
|
self.file_manager_process: Optional[subprocess.Popen] = None
|
|
@@ -246,7 +248,7 @@ class Editor:
|
|
|
246
248
|
self.map_properties_dialog = MapPropertiesDialog(self, Rect(center_x, center_y, 400, 260))
|
|
247
249
|
self.node_manager = NodeManager(self)
|
|
248
250
|
self.node_selector = NodeSelector(self, 0, 65, 260, 240)
|
|
249
|
-
self.node_editor = NodeEditor(self, 0, 310, 260,
|
|
251
|
+
self.node_editor = NodeEditor(self, 0, 310, 260, 230)
|
|
250
252
|
|
|
251
253
|
def open_file_manager(
|
|
252
254
|
self,
|
|
@@ -443,6 +445,9 @@ class Editor:
|
|
|
443
445
|
error_handler.capture(e, context="save_map_selected")
|
|
444
446
|
|
|
445
447
|
def export_selection_as_png(self):
|
|
448
|
+
if self.tile_grid_widget is None:
|
|
449
|
+
self.notifications.notify("No tile grid available", duration=2.0)
|
|
450
|
+
return
|
|
446
451
|
rect = self.tile_grid_widget.selection_rect
|
|
447
452
|
if rect is None:
|
|
448
453
|
self.notifications.notify("No region selected", duration=2.0)
|
|
@@ -458,6 +463,9 @@ class Editor:
|
|
|
458
463
|
rect = self.tile_grid_widget.selection_rect
|
|
459
464
|
if rect is None:
|
|
460
465
|
return
|
|
466
|
+
if self.tileset_widget is None:
|
|
467
|
+
self.notifications.notify("No tileset available", duration=2.0)
|
|
468
|
+
return
|
|
461
469
|
x1, y1, x2, y2 = rect
|
|
462
470
|
tw, th = self.tilemap.tile_size
|
|
463
471
|
pw = (x2 - x1 + 1) * tw
|
|
@@ -811,7 +819,7 @@ class Editor:
|
|
|
811
819
|
resolved = None
|
|
812
820
|
|
|
813
821
|
if not resolved or not resolved.exists():
|
|
814
|
-
|
|
822
|
+
self.notifications.notify(f"Could not locate spritesheet: {path.name}", duration=2.0)
|
|
815
823
|
return
|
|
816
824
|
|
|
817
825
|
args = [
|
|
@@ -1135,6 +1143,10 @@ class Editor:
|
|
|
1135
1143
|
if self.property_editor.handle_event(event):
|
|
1136
1144
|
continue
|
|
1137
1145
|
|
|
1146
|
+
if self.particle_config_dialog and self.particle_config_dialog.active:
|
|
1147
|
+
if self.particle_config_dialog.handle_event(event):
|
|
1148
|
+
continue
|
|
1149
|
+
|
|
1138
1150
|
# Priority 2: Autotiler and Regex Designer (block all events when visible)
|
|
1139
1151
|
if self.autotiler.visible:
|
|
1140
1152
|
if self.autotiler.handle_event(event):
|
|
@@ -1167,7 +1179,7 @@ class Editor:
|
|
|
1167
1179
|
else:
|
|
1168
1180
|
self.perform_quick_save()
|
|
1169
1181
|
continue
|
|
1170
|
-
elif event.key == pygame.K_BACKQUOTE and ctrl_held:
|
|
1182
|
+
elif event.key == pygame.K_BACKQUOTE and (ctrl_held or meta_held):
|
|
1171
1183
|
self.launch_error_console()
|
|
1172
1184
|
continue
|
|
1173
1185
|
elif event.key == pygame.K_z and (ctrl_held or meta_held):
|
|
@@ -1210,10 +1222,10 @@ class Editor:
|
|
|
1210
1222
|
self.eraser_mode = False
|
|
1211
1223
|
self.node_editing_mode = False
|
|
1212
1224
|
continue
|
|
1213
|
-
elif event.
|
|
1225
|
+
elif event.key == pygame.K_g and (ctrl_held or meta_held):
|
|
1214
1226
|
self.toggle_grid()
|
|
1215
1227
|
continue
|
|
1216
|
-
elif event.key == pygame.K_e and ctrl_held and shift_held:
|
|
1228
|
+
elif event.key == pygame.K_e and (ctrl_held or meta_held) and shift_held:
|
|
1217
1229
|
self.export_selection_as_png()
|
|
1218
1230
|
continue
|
|
1219
1231
|
elif event.key == pygame.K_t and (ctrl_held or meta_held):
|
|
@@ -1245,14 +1257,14 @@ class Editor:
|
|
|
1245
1257
|
if self.animation_panel.handle_event(event):
|
|
1246
1258
|
continue
|
|
1247
1259
|
|
|
1248
|
-
# Priority 7: Side panels (
|
|
1260
|
+
# Priority 7: Side panels (layer widget first so rename captures keys)
|
|
1249
1261
|
consumed = False
|
|
1250
|
-
if self.
|
|
1262
|
+
if self.layer_widget and self.layer_widget.handle_event(event):
|
|
1251
1263
|
consumed = True
|
|
1252
1264
|
if (
|
|
1253
1265
|
not consumed
|
|
1254
|
-
and self.
|
|
1255
|
-
and self.
|
|
1266
|
+
and self.tileset_widget
|
|
1267
|
+
and self.tileset_widget.handle_event(event)
|
|
1256
1268
|
):
|
|
1257
1269
|
consumed = True
|
|
1258
1270
|
|
|
@@ -1354,8 +1366,6 @@ class Editor:
|
|
|
1354
1366
|
self.screen.blit(overlay, (0, 0))
|
|
1355
1367
|
self.layer_type_dialog.draw(self.screen)
|
|
1356
1368
|
|
|
1357
|
-
if self.property_editor and self.property_editor.active:
|
|
1358
|
-
self.property_editor.draw(self.screen)
|
|
1359
1369
|
if self.loading_state["active"]:
|
|
1360
1370
|
overlay = pygame.Surface((self.width, self.height), pygame.SRCALPHA)
|
|
1361
1371
|
overlay.fill((0, 0, 0, 180))
|
|
@@ -1381,6 +1391,11 @@ class Editor:
|
|
|
1381
1391
|
self.node_selector.draw(self.screen)
|
|
1382
1392
|
if self.node_editor:
|
|
1383
1393
|
self.node_editor.draw(self.screen)
|
|
1394
|
+
# Modal dialogs draw on top of everything
|
|
1395
|
+
if self.property_editor and self.property_editor.active:
|
|
1396
|
+
self.property_editor.draw(self.screen)
|
|
1397
|
+
if self.particle_config_dialog and self.particle_config_dialog.active:
|
|
1398
|
+
self.particle_config_dialog.draw(self.screen)
|
|
1384
1399
|
self.menubar.draw(self.screen)
|
|
1385
1400
|
self.tooltip.draw(self.screen)
|
|
1386
1401
|
|
|
@@ -100,12 +100,20 @@ class NodeManager:
|
|
|
100
100
|
|
|
101
101
|
def create_default_node(self, layer_name: str, node_type: str = "area") -> Node:
|
|
102
102
|
count = len(self.nodes) + 1
|
|
103
|
+
props: Dict[str, Any] = {}
|
|
104
|
+
if node_type == "particle_emitter":
|
|
105
|
+
from widgets.particle_system import get_default_config
|
|
106
|
+
props = get_default_config()
|
|
107
|
+
name = f"Emitter {count}"
|
|
108
|
+
else:
|
|
109
|
+
name = f"{node_type.capitalize()} {count}"
|
|
103
110
|
return Node(
|
|
104
111
|
node_id=create_node_id(),
|
|
105
|
-
name=
|
|
112
|
+
name=name,
|
|
106
113
|
node_type=node_type,
|
|
107
114
|
area=NodeRect(x=0, y=0, w=64, h=64),
|
|
108
115
|
layer_name=layer_name,
|
|
116
|
+
properties=props,
|
|
109
117
|
)
|
|
110
118
|
|
|
111
119
|
def rename_group(self, old_name: str, new_name: str) -> bool:
|
|
@@ -132,6 +140,8 @@ class NodeManager:
|
|
|
132
140
|
def reorder_node(self, node_id: str, target_node_id: str, before: bool = True) -> None:
|
|
133
141
|
if node_id not in self.nodes or target_node_id not in self.nodes:
|
|
134
142
|
return
|
|
143
|
+
if node_id == target_node_id:
|
|
144
|
+
return
|
|
135
145
|
node = self.nodes[node_id]
|
|
136
146
|
keys = list(self.nodes.keys())
|
|
137
147
|
keys.remove(node_id)
|
|
@@ -416,7 +416,8 @@ class AnimationPreview:
|
|
|
416
416
|
|
|
417
417
|
def _extract_tile(self, variant_id: int) -> Optional[pygame.Surface]:
|
|
418
418
|
tw, th = self.tile_size
|
|
419
|
-
ox
|
|
419
|
+
ox = self.grid_offset_x
|
|
420
|
+
oy = self.grid_offset_y
|
|
420
421
|
available_w = self.surface.get_width() - ox
|
|
421
422
|
cols = max(1, available_w // tw)
|
|
422
423
|
col = variant_id % cols
|
|
@@ -60,7 +60,9 @@ class Tilemap:
|
|
|
60
60
|
if active_layer:
|
|
61
61
|
active_layer.tiles = value
|
|
62
62
|
|
|
63
|
-
def init_size(
|
|
63
|
+
def init_size(
|
|
64
|
+
self, tile_size: "TCoor", map_size: "TCoor", render_scale: float = 1.0
|
|
65
|
+
):
|
|
64
66
|
self.tile_size = tile_size
|
|
65
67
|
self.map_size = map_size
|
|
66
68
|
self.initial_map_size = map_size # Store what user initially setup
|
|
@@ -298,7 +300,7 @@ class Tilemap:
|
|
|
298
300
|
ts_data["tile_properties"] = {
|
|
299
301
|
str(k): v for k, v in ts.tile_properties.items()
|
|
300
302
|
}
|
|
301
|
-
if ts.animation:
|
|
303
|
+
if ts.animation is not None:
|
|
302
304
|
ts_data["animation"] = ts.animation
|
|
303
305
|
|
|
304
306
|
save_data["resources"]["tilesets"].append(ts_data)
|
|
@@ -160,6 +160,8 @@ src/widgets/input.py
|
|
|
160
160
|
src/widgets/layer_selector.py
|
|
161
161
|
src/widgets/map_properties.py
|
|
162
162
|
src/widgets/mapsetup.py
|
|
163
|
+
src/widgets/particle_presets.py
|
|
164
|
+
src/widgets/particle_system.py
|
|
163
165
|
src/widgets/regex_automap_designer.py
|
|
164
166
|
src/widgets/spritesheet_grid.py
|
|
165
167
|
src/widgets/tile_grid.py
|
|
@@ -175,6 +177,7 @@ src/widgets/ui/mode_indicator.py
|
|
|
175
177
|
src/widgets/ui/node_editor.py
|
|
176
178
|
src/widgets/ui/node_selector.py
|
|
177
179
|
src/widgets/ui/notification.py
|
|
180
|
+
src/widgets/ui/particle_config_dialog.py
|
|
178
181
|
src/widgets/ui/property_editor.py
|
|
179
182
|
src/widgets/ui/region_selector.py
|
|
180
183
|
src/widgets/ui/status_bar.py
|
|
@@ -271,7 +271,9 @@ class AutotileRuleDesigner:
|
|
|
271
271
|
self._update_preview_from_selector()
|
|
272
272
|
|
|
273
273
|
if event.type == pygame.KEYDOWN:
|
|
274
|
-
|
|
274
|
+
if event.key == pygame.K_ESCAPE:
|
|
275
|
+
self.hide()
|
|
276
|
+
return True
|
|
275
277
|
|
|
276
278
|
if event.type == pygame.MOUSEBUTTONDOWN:
|
|
277
279
|
if event.button == 1:
|
|
@@ -333,10 +333,12 @@ class ImagePreview:
|
|
|
333
333
|
new_height = target_height
|
|
334
334
|
new_width = int(target_height * aspect_ratio)
|
|
335
335
|
|
|
336
|
+
source_surface = self.current_image.convert_alpha()
|
|
337
|
+
|
|
336
338
|
scaled_surface = pygame.transform.smoothscale(
|
|
337
|
-
|
|
339
|
+
source_surface, (new_width, new_height)
|
|
338
340
|
)
|
|
339
|
-
|
|
341
|
+
|
|
340
342
|
self.scaled_cache = scaled_surface
|
|
341
343
|
self.cached_target_size = (target_width, target_height)
|
|
342
344
|
|
|
@@ -14,6 +14,7 @@ COLOR_BORDER = (80, 80, 80)
|
|
|
14
14
|
COLOR_ACCENT = (60, 100, 160)
|
|
15
15
|
COLOR_TEXT = (220, 220, 220)
|
|
16
16
|
COLOR_ERROR = (200, 60, 60)
|
|
17
|
+
COLOR_DIM = (140, 140, 140)
|
|
17
18
|
|
|
18
19
|
|
|
19
20
|
class MapSetup:
|
|
@@ -42,8 +43,10 @@ class MapSetup:
|
|
|
42
43
|
r = Rect(start_x + col * cell_w, start_y + row * cell_h, cell_w - 10, 60)
|
|
43
44
|
self.inputs.append(DigitInput(r, lbl, key, default, tab_index=i))
|
|
44
45
|
|
|
45
|
-
self.btn_rect = Rect(self.rect.centerx - 60, self.rect.bottom -
|
|
46
|
+
self.btn_rect = Rect(self.rect.centerx - 60, self.rect.bottom - 105, 120, 35)
|
|
47
|
+
self.btn_open_rect = Rect(self.rect.centerx - 60, self.rect.bottom - 50, 120, 35)
|
|
46
48
|
self.font = pygame.font.SysFont("Arial", 20, bold=True)
|
|
49
|
+
self.font_sm = pygame.font.SysFont("Arial", 13)
|
|
47
50
|
|
|
48
51
|
def resize(self, center_rect: Rect):
|
|
49
52
|
self.rect = center_rect
|
|
@@ -59,18 +62,26 @@ class MapSetup:
|
|
|
59
62
|
inp.rect_area = r
|
|
60
63
|
inp.rect_input = Rect(r.x, r.y + 20, r.width, 30)
|
|
61
64
|
|
|
62
|
-
self.btn_rect = Rect(self.rect.centerx - 60, self.rect.bottom -
|
|
65
|
+
self.btn_rect = Rect(self.rect.centerx - 60, self.rect.bottom - 105, 120, 35)
|
|
66
|
+
self.btn_open_rect = Rect(self.rect.centerx - 60, self.rect.bottom - 50, 120, 35)
|
|
63
67
|
|
|
64
68
|
def handle_event(self, event: pygame.event.Event) -> bool:
|
|
65
69
|
if not self.visible:
|
|
66
70
|
return False
|
|
67
71
|
|
|
68
|
-
if event.type == pygame.
|
|
69
|
-
|
|
70
|
-
):
|
|
71
|
-
self.submit()
|
|
72
|
+
if event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE:
|
|
73
|
+
self.visible = False
|
|
72
74
|
return True
|
|
73
75
|
|
|
76
|
+
if event.type == pygame.MOUSEBUTTONDOWN:
|
|
77
|
+
if self.btn_rect.collidepoint(event.pos):
|
|
78
|
+
self.submit()
|
|
79
|
+
return True
|
|
80
|
+
if self.btn_open_rect.collidepoint(event.pos):
|
|
81
|
+
self.visible = False
|
|
82
|
+
self.editor.perform_load()
|
|
83
|
+
return True
|
|
84
|
+
|
|
74
85
|
if event.type == pygame.KEYDOWN and event.key == pygame.K_TAB:
|
|
75
86
|
focused = [i for i in self.inputs if i.is_focused]
|
|
76
87
|
shift_held = pygame.key.get_mods() & pygame.KMOD_SHIFT
|
|
@@ -134,6 +145,14 @@ class MapSetup:
|
|
|
134
145
|
btn_txt = self.font.render("Create", True, COLOR_TEXT)
|
|
135
146
|
screen.blit(btn_txt, btn_txt.get_rect(center=self.btn_rect.center))
|
|
136
147
|
|
|
148
|
+
or_surf = self.font_sm.render("─ OR ─", True, COLOR_DIM)
|
|
149
|
+
or_rect = or_surf.get_rect(center=(self.rect.centerx, self.btn_rect.bottom + 10))
|
|
150
|
+
screen.blit(or_surf, or_rect)
|
|
151
|
+
|
|
152
|
+
pygame.draw.rect(screen, COLOR_ACCENT, self.btn_open_rect)
|
|
153
|
+
open_txt = self.font_sm.render("Open map", True, COLOR_TEXT)
|
|
154
|
+
screen.blit(open_txt, open_txt.get_rect(center=self.btn_open_rect.center))
|
|
155
|
+
|
|
137
156
|
if self.error_message:
|
|
138
157
|
err = pygame.font.SysFont("Arial", 12).render(
|
|
139
158
|
self.error_message, True, COLOR_ERROR
|