Merge pull request #80435 from YuriSizov/region-editor-quality-pass

Fix multiple usability issues in the texture region editor
This commit is contained in:
Rémi Verschelde 2023-08-28 12:04:18 +02:00
commit 33a3e12fe1
No known key found for this signature in database
GPG Key ID: C3336907360768E1
4 changed files with 417 additions and 408 deletions

View File

@ -1507,6 +1507,11 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) {
style_theme_preview_bg_tab->set_expand_margin(SIDE_BOTTOM, 2 * EDSCALE);
theme->set_stylebox("ThemeEditorPreviewBG", "EditorStyles", style_theme_preview_bg_tab);
Ref<StyleBoxFlat> style_texture_region_bg = style_tree_bg->duplicate();
style_texture_region_bg->set_content_margin_all(0);
theme->set_stylebox("TextureRegionPreviewBG", "EditorStyles", style_texture_region_bg);
theme->set_stylebox("TextureRegionPreviewFG", "EditorStyles", make_empty_stylebox(0, 0, 0, 0));
// Separators
theme->set_stylebox("separator", "HSeparator", make_line_stylebox(separator_color, MAX(Math::round(EDSCALE), border_width)));
theme->set_stylebox("separator", "VSeparator", make_line_stylebox(separator_color, MAX(Math::round(EDSCALE), border_width), 0, 0, true));

File diff suppressed because it is too large Load Diff

View File

@ -42,6 +42,7 @@
class AtlasTexture;
class OptionButton;
class PanelContainer;
class ViewPanner;
class TextureRegionEditor : public AcceptDialog {
@ -66,16 +67,18 @@ class TextureRegionEditor : public AcceptDialog {
SpinBox *sb_off_x = nullptr;
SpinBox *sb_sep_y = nullptr;
SpinBox *sb_sep_x = nullptr;
Panel *edit_draw = nullptr;
PanelContainer *texture_preview = nullptr;
Panel *texture_overlay = nullptr;
VScrollBar *vscroll = nullptr;
HScrollBar *hscroll = nullptr;
Vector2 draw_ofs;
float draw_zoom = 0.0;
float draw_zoom = 1.0;
bool updating_scroll = false;
int snap_mode = 0;
SnapMode snap_mode = SNAP_NONE;
Vector2 snap_offset;
Vector2 snap_step;
Vector2 snap_separation;
@ -83,28 +86,28 @@ class TextureRegionEditor : public AcceptDialog {
Sprite2D *node_sprite_2d = nullptr;
Sprite3D *node_sprite_3d = nullptr;
NinePatchRect *node_ninepatch = nullptr;
Ref<StyleBoxTexture> obj_styleBox;
Ref<AtlasTexture> atlas_tex;
Ref<CanvasTexture> preview_tex;
Ref<StyleBoxTexture> res_stylebox;
Ref<AtlasTexture> res_atlas_texture;
Rect2 rect;
Rect2 rect_prev;
float prev_margin = 0.0f;
int edited_margin = 0;
int edited_margin = -1;
HashMap<RID, List<Rect2>> cache_map;
List<Rect2> autoslice_cache;
bool autoslice_is_dirty = false;
bool autoslice_is_dirty = true;
bool drag = false;
bool creating = false;
Vector2 drag_from;
int drag_index = 0;
int drag_index = -1;
bool request_center = false;
Ref<ViewPanner> panner;
void _pan_callback(Vector2 p_scroll_vec, Ref<InputEvent> p_event);
void _zoom_callback(float p_zoom_factor, Vector2 p_origin, Ref<InputEvent> p_event);
void _scroll_changed(float);
Transform2D _get_offset_transform() const;
void _set_snap_mode(int p_mode);
void _set_snap_off_x(float p_val);
@ -113,35 +116,39 @@ class TextureRegionEditor : public AcceptDialog {
void _set_snap_step_y(float p_val);
void _set_snap_sep_x(float p_val);
void _set_snap_sep_y(float p_val);
void _zoom_on_position(float p_zoom, Point2 p_position = Point2());
void _zoom_in();
void _zoom_reset();
void _zoom_out();
void apply_rect(const Rect2 &p_rect);
void _apply_rect(const Rect2 &p_rect);
void _update_rect();
void _update_autoslice();
Ref<Texture2D> _get_edited_object_texture() const;
Rect2 _get_edited_object_region() const;
void _texture_changed();
void _node_removed(Node *p_node);
void _edit_region();
void _clear_edited_object();
void _draw_margin_line(Vector2 p_from, Vector2 p_to);
protected:
void _notification(int p_what);
void _node_removed(Object *p_obj);
static void _bind_methods();
void _texture_preview_draw();
void _texture_overlay_draw();
void _texture_overlay_input(const Ref<InputEvent> &p_input);
Vector2 snap_point(Vector2 p_target) const;
public:
void _edit_region();
void _region_draw();
void _region_input(const Ref<InputEvent> &p_input);
void _scroll_changed(float);
bool is_stylebox();
bool is_atlas_texture();
bool is_ninepatch();
Sprite2D *get_sprite_2d();
Sprite3D *get_sprite_3d();
void edit(Object *p_obj);
TextureRegionEditor();
};

View File

@ -245,11 +245,16 @@ bool AtlasTexture::is_pixel_opaque(int p_x, int p_y) const {
}
Ref<Image> AtlasTexture::get_image() const {
if (!atlas.is_valid() || !atlas->get_image().is_valid()) {
if (atlas.is_null() || region.size.x <= 0 || region.size.y <= 0) {
return Ref<Image>();
}
return atlas->get_image()->get_region(region);
Ref<Image> atlas_image = atlas->get_image();
if (atlas_image.is_null()) {
return Ref<Image>();
}
return atlas_image->get_region(region);
}
AtlasTexture::AtlasTexture() {}