Add bulk theme overrides to Control
This commit is contained in:
parent
1a9c8aaba9
commit
b73983340d
|
@ -306,6 +306,18 @@
|
|||
[/codeblocks]
|
||||
</description>
|
||||
</method>
|
||||
<method name="begin_bulk_theme_override">
|
||||
<return type="void" />
|
||||
<description>
|
||||
Prevents [code]*_theme_*_override[/code] methods from emitting [constant NOTIFICATION_THEME_CHANGED] until [method end_bulk_theme_override] is called.
|
||||
</description>
|
||||
</method>
|
||||
<method name="end_bulk_theme_override">
|
||||
<return type="void" />
|
||||
<description>
|
||||
Ends a bulk theme override update. See [method begin_bulk_theme_override].
|
||||
</description>
|
||||
</method>
|
||||
<method name="find_next_valid_focus" qualifiers="const">
|
||||
<return type="Control" />
|
||||
<description>
|
||||
|
|
|
@ -1686,6 +1686,17 @@ Rect2 Control::get_anchorable_rect() const {
|
|||
return Rect2(Point2(), get_size());
|
||||
}
|
||||
|
||||
void Control::begin_bulk_theme_override() {
|
||||
data.bulk_theme_override = true;
|
||||
}
|
||||
|
||||
void Control::end_bulk_theme_override() {
|
||||
ERR_FAIL_COND(!data.bulk_theme_override);
|
||||
|
||||
data.bulk_theme_override = false;
|
||||
_notify_theme_changed();
|
||||
}
|
||||
|
||||
void Control::add_theme_icon_override(const StringName &p_name, const Ref<Texture2D> &p_icon) {
|
||||
ERR_FAIL_COND(!p_icon.is_valid());
|
||||
|
||||
|
@ -1695,7 +1706,7 @@ void Control::add_theme_icon_override(const StringName &p_name, const Ref<Textur
|
|||
|
||||
data.icon_override[p_name] = p_icon;
|
||||
data.icon_override[p_name]->connect("changed", callable_mp(this, &Control::_override_changed), Vector<Variant>(), CONNECT_REFERENCE_COUNTED);
|
||||
notification(NOTIFICATION_THEME_CHANGED);
|
||||
_notify_theme_changed();
|
||||
}
|
||||
|
||||
void Control::add_theme_style_override(const StringName &p_name, const Ref<StyleBox> &p_style) {
|
||||
|
@ -1707,7 +1718,7 @@ void Control::add_theme_style_override(const StringName &p_name, const Ref<Style
|
|||
|
||||
data.style_override[p_name] = p_style;
|
||||
data.style_override[p_name]->connect("changed", callable_mp(this, &Control::_override_changed), Vector<Variant>(), CONNECT_REFERENCE_COUNTED);
|
||||
notification(NOTIFICATION_THEME_CHANGED);
|
||||
_notify_theme_changed();
|
||||
}
|
||||
|
||||
void Control::add_theme_font_override(const StringName &p_name, const Ref<Font> &p_font) {
|
||||
|
@ -1719,22 +1730,22 @@ void Control::add_theme_font_override(const StringName &p_name, const Ref<Font>
|
|||
|
||||
data.font_override[p_name] = p_font;
|
||||
data.font_override[p_name]->connect("changed", callable_mp(this, &Control::_override_changed), Vector<Variant>(), CONNECT_REFERENCE_COUNTED);
|
||||
notification(NOTIFICATION_THEME_CHANGED);
|
||||
_notify_theme_changed();
|
||||
}
|
||||
|
||||
void Control::add_theme_font_size_override(const StringName &p_name, int p_font_size) {
|
||||
data.font_size_override[p_name] = p_font_size;
|
||||
notification(NOTIFICATION_THEME_CHANGED);
|
||||
_notify_theme_changed();
|
||||
}
|
||||
|
||||
void Control::add_theme_color_override(const StringName &p_name, const Color &p_color) {
|
||||
data.color_override[p_name] = p_color;
|
||||
notification(NOTIFICATION_THEME_CHANGED);
|
||||
_notify_theme_changed();
|
||||
}
|
||||
|
||||
void Control::add_theme_constant_override(const StringName &p_name, int p_constant) {
|
||||
data.constant_override[p_name] = p_constant;
|
||||
notification(NOTIFICATION_THEME_CHANGED);
|
||||
_notify_theme_changed();
|
||||
}
|
||||
|
||||
void Control::remove_theme_icon_override(const StringName &p_name) {
|
||||
|
@ -1743,7 +1754,7 @@ void Control::remove_theme_icon_override(const StringName &p_name) {
|
|||
}
|
||||
|
||||
data.icon_override.erase(p_name);
|
||||
notification(NOTIFICATION_THEME_CHANGED);
|
||||
_notify_theme_changed();
|
||||
}
|
||||
|
||||
void Control::remove_theme_style_override(const StringName &p_name) {
|
||||
|
@ -1752,7 +1763,7 @@ void Control::remove_theme_style_override(const StringName &p_name) {
|
|||
}
|
||||
|
||||
data.style_override.erase(p_name);
|
||||
notification(NOTIFICATION_THEME_CHANGED);
|
||||
_notify_theme_changed();
|
||||
}
|
||||
|
||||
void Control::remove_theme_font_override(const StringName &p_name) {
|
||||
|
@ -1761,22 +1772,22 @@ void Control::remove_theme_font_override(const StringName &p_name) {
|
|||
}
|
||||
|
||||
data.font_override.erase(p_name);
|
||||
notification(NOTIFICATION_THEME_CHANGED);
|
||||
_notify_theme_changed();
|
||||
}
|
||||
|
||||
void Control::remove_theme_font_size_override(const StringName &p_name) {
|
||||
data.font_size_override.erase(p_name);
|
||||
notification(NOTIFICATION_THEME_CHANGED);
|
||||
_notify_theme_changed();
|
||||
}
|
||||
|
||||
void Control::remove_theme_color_override(const StringName &p_name) {
|
||||
data.color_override.erase(p_name);
|
||||
notification(NOTIFICATION_THEME_CHANGED);
|
||||
_notify_theme_changed();
|
||||
}
|
||||
|
||||
void Control::remove_theme_constant_override(const StringName &p_name) {
|
||||
data.constant_override.erase(p_name);
|
||||
notification(NOTIFICATION_THEME_CHANGED);
|
||||
_notify_theme_changed();
|
||||
}
|
||||
|
||||
void Control::set_focus_mode(FocusMode p_focus_mode) {
|
||||
|
@ -2049,6 +2060,12 @@ void Control::_theme_changed() {
|
|||
_propagate_theme_changed(this, this, nullptr, false);
|
||||
}
|
||||
|
||||
void Control::_notify_theme_changed() {
|
||||
if (!data.bulk_theme_override) {
|
||||
notification(NOTIFICATION_THEME_CHANGED);
|
||||
}
|
||||
}
|
||||
|
||||
void Control::set_theme(const Ref<Theme> &p_theme) {
|
||||
if (data.theme == p_theme) {
|
||||
return;
|
||||
|
@ -2719,6 +2736,9 @@ void Control::_bind_methods() {
|
|||
ClassDB::bind_method(D_METHOD("set_theme_type_variation", "theme_type"), &Control::set_theme_type_variation);
|
||||
ClassDB::bind_method(D_METHOD("get_theme_type_variation"), &Control::get_theme_type_variation);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("begin_bulk_theme_override"), &Control::begin_bulk_theme_override);
|
||||
ClassDB::bind_method(D_METHOD("end_bulk_theme_override"), &Control::end_bulk_theme_override);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("add_theme_icon_override", "name", "texture"), &Control::add_theme_icon_override);
|
||||
ClassDB::bind_method(D_METHOD("add_theme_stylebox_override", "name", "stylebox"), &Control::add_theme_style_override);
|
||||
ClassDB::bind_method(D_METHOD("add_theme_font_override", "name", "font"), &Control::add_theme_font_override);
|
||||
|
|
|
@ -220,6 +220,7 @@ private:
|
|||
NodePath focus_next;
|
||||
NodePath focus_prev;
|
||||
|
||||
bool bulk_theme_override = false;
|
||||
HashMap<StringName, Ref<Texture2D>> icon_override;
|
||||
HashMap<StringName, Ref<StyleBox>> style_override;
|
||||
HashMap<StringName, Ref<Font>> font_override;
|
||||
|
@ -241,6 +242,7 @@ private:
|
|||
void _set_size(const Size2 &p_size);
|
||||
|
||||
void _theme_changed();
|
||||
void _notify_theme_changed();
|
||||
|
||||
void _update_minimum_size();
|
||||
|
||||
|
@ -452,6 +454,9 @@ public:
|
|||
|
||||
/* SKINNING */
|
||||
|
||||
void begin_bulk_theme_override();
|
||||
void end_bulk_theme_override();
|
||||
|
||||
void add_theme_icon_override(const StringName &p_name, const Ref<Texture2D> &p_icon);
|
||||
void add_theme_style_override(const StringName &p_name, const Ref<StyleBox> &p_style);
|
||||
void add_theme_font_override(const StringName &p_name, const Ref<Font> &p_font);
|
||||
|
|
Loading…
Reference in New Issue