mirror of
https://github.com/Redot-Engine/redot-engine.git
synced 2025-12-06 23:31:53 -05:00
Make TextureButton and Button update on texture change
This commit is contained in:
@@ -30,6 +30,7 @@
|
|||||||
|
|
||||||
#include "button.h"
|
#include "button.h"
|
||||||
|
|
||||||
|
#include "core/core_string_names.h"
|
||||||
#include "core/string/translation.h"
|
#include "core/string/translation.h"
|
||||||
#include "servers/rendering_server.h"
|
#include "servers/rendering_server.h"
|
||||||
|
|
||||||
@@ -533,8 +534,26 @@ String Button::get_language() const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Button::set_icon(const Ref<Texture2D> &p_icon) {
|
void Button::set_icon(const Ref<Texture2D> &p_icon) {
|
||||||
if (icon != p_icon) {
|
if (icon == p_icon) {
|
||||||
icon = p_icon;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (icon.is_valid()) {
|
||||||
|
icon->disconnect(CoreStringNames::get_singleton()->changed, callable_mp(this, &Button::_texture_changed));
|
||||||
|
}
|
||||||
|
|
||||||
|
icon = p_icon;
|
||||||
|
|
||||||
|
if (icon.is_valid()) {
|
||||||
|
icon->connect(CoreStringNames::get_singleton()->changed, callable_mp(this, &Button::_texture_changed));
|
||||||
|
}
|
||||||
|
|
||||||
|
queue_redraw();
|
||||||
|
update_minimum_size();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Button::_texture_changed() {
|
||||||
|
if (icon.is_valid()) {
|
||||||
queue_redraw();
|
queue_redraw();
|
||||||
update_minimum_size();
|
update_minimum_size();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -96,6 +96,7 @@ private:
|
|||||||
Size2 _fit_icon_size(const Size2 &p_size) const;
|
Size2 _fit_icon_size(const Size2 &p_size) const;
|
||||||
|
|
||||||
void _shape(Ref<TextParagraph> p_paragraph = Ref<TextParagraph>(), String p_text = "");
|
void _shape(Ref<TextParagraph> p_paragraph = Ref<TextParagraph>(), String p_text = "");
|
||||||
|
void _texture_changed();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void _set_internal_margin(Side p_side, float p_value);
|
void _set_internal_margin(Side p_side, float p_value);
|
||||||
|
|||||||
@@ -30,6 +30,7 @@
|
|||||||
|
|
||||||
#include "texture_button.h"
|
#include "texture_button.h"
|
||||||
|
|
||||||
|
#include "core/core_string_names.h"
|
||||||
#include "core/typedefs.h"
|
#include "core/typedefs.h"
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
@@ -294,42 +295,19 @@ void TextureButton::_bind_methods() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void TextureButton::set_texture_normal(const Ref<Texture2D> &p_normal) {
|
void TextureButton::set_texture_normal(const Ref<Texture2D> &p_normal) {
|
||||||
if (normal == p_normal) {
|
_set_texture(&normal, p_normal);
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
normal = p_normal;
|
|
||||||
queue_redraw();
|
|
||||||
update_minimum_size();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void TextureButton::set_texture_pressed(const Ref<Texture2D> &p_pressed) {
|
void TextureButton::set_texture_pressed(const Ref<Texture2D> &p_pressed) {
|
||||||
if (pressed == p_pressed) {
|
_set_texture(&pressed, p_pressed);
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
pressed = p_pressed;
|
|
||||||
queue_redraw();
|
|
||||||
update_minimum_size();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void TextureButton::set_texture_hover(const Ref<Texture2D> &p_hover) {
|
void TextureButton::set_texture_hover(const Ref<Texture2D> &p_hover) {
|
||||||
if (hover == p_hover) {
|
_set_texture(&hover, p_hover);
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
hover = p_hover;
|
|
||||||
queue_redraw();
|
|
||||||
update_minimum_size();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void TextureButton::set_texture_disabled(const Ref<Texture2D> &p_disabled) {
|
void TextureButton::set_texture_disabled(const Ref<Texture2D> &p_disabled) {
|
||||||
if (disabled == p_disabled) {
|
_set_texture(&disabled, p_disabled);
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
disabled = p_disabled;
|
|
||||||
queue_redraw();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void TextureButton::set_click_mask(const Ref<BitMap> &p_click_mask) {
|
void TextureButton::set_click_mask(const Ref<BitMap> &p_click_mask) {
|
||||||
@@ -337,8 +315,7 @@ void TextureButton::set_click_mask(const Ref<BitMap> &p_click_mask) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
click_mask = p_click_mask;
|
click_mask = p_click_mask;
|
||||||
queue_redraw();
|
_texture_changed();
|
||||||
update_minimum_size();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Ref<Texture2D> TextureButton::get_texture_normal() const {
|
Ref<Texture2D> TextureButton::get_texture_normal() const {
|
||||||
@@ -369,6 +346,28 @@ void TextureButton::set_texture_focused(const Ref<Texture2D> &p_focused) {
|
|||||||
focused = p_focused;
|
focused = p_focused;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void TextureButton::_set_texture(Ref<Texture2D> *p_destination, const Ref<Texture2D> &p_texture) {
|
||||||
|
DEV_ASSERT(p_destination);
|
||||||
|
Ref<Texture2D> &destination = *p_destination;
|
||||||
|
if (destination == p_texture) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (destination.is_valid()) {
|
||||||
|
destination->disconnect(CoreStringNames::get_singleton()->changed, callable_mp(this, &TextureButton::_texture_changed));
|
||||||
|
}
|
||||||
|
destination = p_texture;
|
||||||
|
if (destination.is_valid()) {
|
||||||
|
// Pass `CONNECT_REFERENCE_COUNTED` to avoid early disconnect in case the same texture is assigned to different "slots".
|
||||||
|
destination->connect(CoreStringNames::get_singleton()->changed, callable_mp(this, &TextureButton::_texture_changed), CONNECT_REFERENCE_COUNTED);
|
||||||
|
}
|
||||||
|
_texture_changed();
|
||||||
|
}
|
||||||
|
|
||||||
|
void TextureButton::_texture_changed() {
|
||||||
|
queue_redraw();
|
||||||
|
update_minimum_size();
|
||||||
|
}
|
||||||
|
|
||||||
bool TextureButton::get_ignore_texture_size() const {
|
bool TextureButton::get_ignore_texture_size() const {
|
||||||
return ignore_texture_size;
|
return ignore_texture_size;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -64,6 +64,9 @@ private:
|
|||||||
bool hflip = false;
|
bool hflip = false;
|
||||||
bool vflip = false;
|
bool vflip = false;
|
||||||
|
|
||||||
|
void _set_texture(Ref<Texture2D> *p_destination, const Ref<Texture2D> &p_texture);
|
||||||
|
void _texture_changed();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual Size2 get_minimum_size() const override;
|
virtual Size2 get_minimum_size() const override;
|
||||||
virtual bool has_point(const Point2 &p_point) const override;
|
virtual bool has_point(const Point2 &p_point) const override;
|
||||||
|
|||||||
Reference in New Issue
Block a user