Merge pull request #80435 from YuriSizov/region-editor-quality-pass
Fix multiple usability issues in the texture region editor
This commit is contained in:
commit
33a3e12fe1
|
@ -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
|
@ -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();
|
||||
};
|
||||
|
||||
|
|
|
@ -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() {}
|
||||
|
|
Loading…
Reference in New Issue