Merge pull request #57648 from KoBeWi/shrunken_tb

Rework TextureButton stretch
This commit is contained in:
Rémi Verschelde 2022-02-05 10:10:38 +01:00 committed by GitHub
commit c5a832e087
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 58 additions and 60 deletions

View file

@ -12,17 +12,17 @@
<link title="3D Voxel Demo">https://godotengine.org/asset-library/asset/676</link> <link title="3D Voxel Demo">https://godotengine.org/asset-library/asset/676</link>
</tutorials> </tutorials>
<members> <members>
<member name="expand" type="bool" setter="set_expand" getter="get_expand" default="false">
If [code]true[/code], the texture stretches to the edges of the node's bounding rectangle using the [member stretch_mode]. If [code]false[/code], the texture will not scale with the node.
</member>
<member name="flip_h" type="bool" setter="set_flip_h" getter="is_flipped_h" default="false"> <member name="flip_h" type="bool" setter="set_flip_h" getter="is_flipped_h" default="false">
If [code]true[/code], texture is flipped horizontally. If [code]true[/code], texture is flipped horizontally.
</member> </member>
<member name="flip_v" type="bool" setter="set_flip_v" getter="is_flipped_v" default="false"> <member name="flip_v" type="bool" setter="set_flip_v" getter="is_flipped_v" default="false">
If [code]true[/code], texture is flipped vertically. If [code]true[/code], texture is flipped vertically.
</member> </member>
<member name="stretch_mode" type="int" setter="set_stretch_mode" getter="get_stretch_mode" enum="TextureButton.StretchMode" default="0"> <member name="ignore_texture_size" type="bool" setter="set_ignore_texture_size" getter="get_ignore_texture_size" default="false">
Controls the texture's behavior when you resize the node's bounding rectangle, [b]only if[/b] [member expand] is [code]true[/code]. Set it to one of the [enum StretchMode] constants. See the constants to learn more. If [code]true[/code], the size of the texture won't be considered for minimum size calculation, so the [TextureButton] can be shrunk down past the texture size.
</member>
<member name="stretch_mode" type="int" setter="set_stretch_mode" getter="get_stretch_mode" enum="TextureButton.StretchMode" default="2">
Controls the texture's behavior when you resize the node's bounding rectangle. See the [enum StretchMode] constants for available options.
</member> </member>
<member name="texture_click_mask" type="BitMap" setter="set_click_mask" getter="get_click_mask"> <member name="texture_click_mask" type="BitMap" setter="set_click_mask" getter="get_click_mask">
Pure black and white [BitMap] image to use for click detection. On the mask, white pixels represent the button's clickable area. Use it to create buttons with curved shapes. Pure black and white [BitMap] image to use for click detection. On the mask, white pixels represent the button's clickable area. Use it to create buttons with curved shapes.

View file

@ -2007,7 +2007,7 @@ FindBar::FindBar() {
hide_button = memnew(TextureButton); hide_button = memnew(TextureButton);
add_child(hide_button); add_child(hide_button);
hide_button->set_focus_mode(FOCUS_NONE); hide_button->set_focus_mode(FOCUS_NONE);
hide_button->set_expand(true); hide_button->set_ignore_texture_size(true);
hide_button->set_stretch_mode(TextureButton::STRETCH_KEEP_CENTERED); hide_button->set_stretch_mode(TextureButton::STRETCH_KEEP_CENTERED);
hide_button->connect("pressed", callable_mp(this, &FindBar::_hide_bar)); hide_button->connect("pressed", callable_mp(this, &FindBar::_hide_bar));
} }

View file

@ -37,7 +37,7 @@
Size2 TextureButton::get_minimum_size() const { Size2 TextureButton::get_minimum_size() const {
Size2 rscale = Control::get_minimum_size(); Size2 rscale = Control::get_minimum_size();
if (!expand) { if (!ignore_texture_size) {
if (normal.is_null()) { if (normal.is_null()) {
if (pressed.is_null()) { if (pressed.is_null()) {
if (hover.is_null()) { if (hover.is_null()) {
@ -182,50 +182,48 @@ void TextureButton::_notification(int p_what) {
size = texdraw->get_size(); size = texdraw->get_size();
_texture_region = Rect2(Point2(), texdraw->get_size()); _texture_region = Rect2(Point2(), texdraw->get_size());
_tile = false; _tile = false;
if (expand) { switch (stretch_mode) {
switch (stretch_mode) { case STRETCH_KEEP:
case STRETCH_KEEP: size = texdraw->get_size();
size = texdraw->get_size(); break;
break; case STRETCH_SCALE:
case STRETCH_SCALE: size = get_size();
size = get_size(); break;
break; case STRETCH_TILE:
case STRETCH_TILE: size = get_size();
size = get_size(); _tile = true;
_tile = true; break;
break; case STRETCH_KEEP_CENTERED:
case STRETCH_KEEP_CENTERED: ofs = (get_size() - texdraw->get_size()) / 2;
ofs = (get_size() - texdraw->get_size()) / 2; size = texdraw->get_size();
size = texdraw->get_size(); break;
break; case STRETCH_KEEP_ASPECT_CENTERED:
case STRETCH_KEEP_ASPECT_CENTERED: case STRETCH_KEEP_ASPECT: {
case STRETCH_KEEP_ASPECT: { Size2 _size = get_size();
Size2 _size = get_size(); float tex_width = texdraw->get_width() * _size.height / texdraw->get_height();
float tex_width = texdraw->get_width() * _size.height / texdraw->get_height(); float tex_height = _size.height;
float tex_height = _size.height;
if (tex_width > _size.width) { if (tex_width > _size.width) {
tex_width = _size.width; tex_width = _size.width;
tex_height = texdraw->get_height() * tex_width / texdraw->get_width(); tex_height = texdraw->get_height() * tex_width / texdraw->get_width();
} }
if (stretch_mode == STRETCH_KEEP_ASPECT_CENTERED) { if (stretch_mode == STRETCH_KEEP_ASPECT_CENTERED) {
ofs.x = (_size.width - tex_width) / 2; ofs.x = (_size.width - tex_width) / 2;
ofs.y = (_size.height - tex_height) / 2; ofs.y = (_size.height - tex_height) / 2;
} }
size.width = tex_width; size.width = tex_width;
size.height = tex_height; size.height = tex_height;
} break; } break;
case STRETCH_KEEP_ASPECT_COVERED: { case STRETCH_KEEP_ASPECT_COVERED: {
size = get_size(); size = get_size();
Size2 tex_size = texdraw->get_size(); Size2 tex_size = texdraw->get_size();
Size2 scale_size(size.width / tex_size.width, size.height / tex_size.height); Size2 scale_size(size.width / tex_size.width, size.height / tex_size.height);
float scale = scale_size.width > scale_size.height ? scale_size.width : scale_size.height; float scale = scale_size.width > scale_size.height ? scale_size.width : scale_size.height;
Size2 scaled_tex_size = tex_size * scale; Size2 scaled_tex_size = tex_size * scale;
Point2 ofs2 = ((scaled_tex_size - size) / scale).abs() / 2.0f; Point2 ofs2 = ((scaled_tex_size - size) / scale).abs() / 2.0f;
_texture_region = Rect2(ofs2, size / scale); _texture_region = Rect2(ofs2, size / scale);
} break; } break;
}
} }
_position_rect = Rect2(ofs, size); _position_rect = Rect2(ofs, size);
@ -258,7 +256,7 @@ void TextureButton::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_disabled_texture", "texture"), &TextureButton::set_disabled_texture); ClassDB::bind_method(D_METHOD("set_disabled_texture", "texture"), &TextureButton::set_disabled_texture);
ClassDB::bind_method(D_METHOD("set_focused_texture", "texture"), &TextureButton::set_focused_texture); ClassDB::bind_method(D_METHOD("set_focused_texture", "texture"), &TextureButton::set_focused_texture);
ClassDB::bind_method(D_METHOD("set_click_mask", "mask"), &TextureButton::set_click_mask); ClassDB::bind_method(D_METHOD("set_click_mask", "mask"), &TextureButton::set_click_mask);
ClassDB::bind_method(D_METHOD("set_expand", "expand"), &TextureButton::set_expand); ClassDB::bind_method(D_METHOD("set_ignore_texture_size", "ignore"), &TextureButton::set_ignore_texture_size);
ClassDB::bind_method(D_METHOD("set_stretch_mode", "mode"), &TextureButton::set_stretch_mode); ClassDB::bind_method(D_METHOD("set_stretch_mode", "mode"), &TextureButton::set_stretch_mode);
ClassDB::bind_method(D_METHOD("set_flip_h", "enable"), &TextureButton::set_flip_h); ClassDB::bind_method(D_METHOD("set_flip_h", "enable"), &TextureButton::set_flip_h);
ClassDB::bind_method(D_METHOD("is_flipped_h"), &TextureButton::is_flipped_h); ClassDB::bind_method(D_METHOD("is_flipped_h"), &TextureButton::is_flipped_h);
@ -271,7 +269,7 @@ void TextureButton::_bind_methods() {
ClassDB::bind_method(D_METHOD("get_disabled_texture"), &TextureButton::get_disabled_texture); ClassDB::bind_method(D_METHOD("get_disabled_texture"), &TextureButton::get_disabled_texture);
ClassDB::bind_method(D_METHOD("get_focused_texture"), &TextureButton::get_focused_texture); ClassDB::bind_method(D_METHOD("get_focused_texture"), &TextureButton::get_focused_texture);
ClassDB::bind_method(D_METHOD("get_click_mask"), &TextureButton::get_click_mask); ClassDB::bind_method(D_METHOD("get_click_mask"), &TextureButton::get_click_mask);
ClassDB::bind_method(D_METHOD("get_expand"), &TextureButton::get_expand); ClassDB::bind_method(D_METHOD("get_ignore_texture_size"), &TextureButton::get_ignore_texture_size);
ClassDB::bind_method(D_METHOD("get_stretch_mode"), &TextureButton::get_stretch_mode); ClassDB::bind_method(D_METHOD("get_stretch_mode"), &TextureButton::get_stretch_mode);
ADD_GROUP("Textures", "texture_"); ADD_GROUP("Textures", "texture_");
@ -281,7 +279,7 @@ void TextureButton::_bind_methods() {
ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "texture_disabled", PROPERTY_HINT_RESOURCE_TYPE, "Texture2D"), "set_disabled_texture", "get_disabled_texture"); ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "texture_disabled", PROPERTY_HINT_RESOURCE_TYPE, "Texture2D"), "set_disabled_texture", "get_disabled_texture");
ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "texture_focused", PROPERTY_HINT_RESOURCE_TYPE, "Texture2D"), "set_focused_texture", "get_focused_texture"); ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "texture_focused", PROPERTY_HINT_RESOURCE_TYPE, "Texture2D"), "set_focused_texture", "get_focused_texture");
ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "texture_click_mask", PROPERTY_HINT_RESOURCE_TYPE, "BitMap"), "set_click_mask", "get_click_mask"); ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "texture_click_mask", PROPERTY_HINT_RESOURCE_TYPE, "BitMap"), "set_click_mask", "get_click_mask");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "expand", PROPERTY_HINT_RESOURCE_TYPE, "bool"), "set_expand", "get_expand"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "ignore_texture_size", PROPERTY_HINT_RESOURCE_TYPE, "bool"), "set_ignore_texture_size", "get_ignore_texture_size");
ADD_PROPERTY(PropertyInfo(Variant::INT, "stretch_mode", PROPERTY_HINT_ENUM, "Scale,Tile,Keep,Keep Centered,Keep Aspect,Keep Aspect Centered,Keep Aspect Covered"), "set_stretch_mode", "get_stretch_mode"); ADD_PROPERTY(PropertyInfo(Variant::INT, "stretch_mode", PROPERTY_HINT_ENUM, "Scale,Tile,Keep,Keep Centered,Keep Aspect,Keep Aspect Centered,Keep Aspect Covered"), "set_stretch_mode", "get_stretch_mode");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "flip_h", PROPERTY_HINT_RESOURCE_TYPE, "bool"), "set_flip_h", "is_flipped_h"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "flip_h", PROPERTY_HINT_RESOURCE_TYPE, "bool"), "set_flip_h", "is_flipped_h");
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "flip_v", PROPERTY_HINT_RESOURCE_TYPE, "bool"), "set_flip_v", "is_flipped_v"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "flip_v", PROPERTY_HINT_RESOURCE_TYPE, "bool"), "set_flip_v", "is_flipped_v");
@ -352,12 +350,12 @@ void TextureButton::set_focused_texture(const Ref<Texture2D> &p_focused) {
focused = p_focused; focused = p_focused;
}; };
bool TextureButton::get_expand() const { bool TextureButton::get_ignore_texture_size() const {
return expand; return ignore_texture_size;
} }
void TextureButton::set_expand(bool p_expand) { void TextureButton::set_ignore_texture_size(bool p_ignore) {
expand = p_expand; ignore_texture_size = p_ignore;
update_minimum_size(); update_minimum_size();
update(); update();
} }

View file

@ -54,8 +54,8 @@ private:
Ref<Texture2D> disabled; Ref<Texture2D> disabled;
Ref<Texture2D> focused; Ref<Texture2D> focused;
Ref<BitMap> click_mask; Ref<BitMap> click_mask;
bool expand = false; bool ignore_texture_size = false;
StretchMode stretch_mode = STRETCH_SCALE; StretchMode stretch_mode = STRETCH_KEEP;
Rect2 _texture_region; Rect2 _texture_region;
Rect2 _position_rect; Rect2 _position_rect;
@ -85,8 +85,8 @@ public:
Ref<Texture2D> get_focused_texture() const; Ref<Texture2D> get_focused_texture() const;
Ref<BitMap> get_click_mask() const; Ref<BitMap> get_click_mask() const;
bool get_expand() const; bool get_ignore_texture_size() const;
void set_expand(bool p_expand); void set_ignore_texture_size(bool p_ignore);
void set_stretch_mode(StretchMode p_stretch_mode); void set_stretch_mode(StretchMode p_stretch_mode);
StretchMode get_stretch_mode() const; StretchMode get_stretch_mode() const;