Improve theme editor responsiveness
This commit is contained in:
parent
4bef4d9808
commit
748c88f194
|
@ -2304,27 +2304,20 @@ VBoxContainer *ThemeTypeEditor::_create_item_list(Theme::DataType p_data_type) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void ThemeTypeEditor::_update_type_list() {
|
void ThemeTypeEditor::_update_type_list() {
|
||||||
ERR_FAIL_COND(edited_theme.is_null());
|
|
||||||
|
|
||||||
if (updating) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
updating = true;
|
|
||||||
|
|
||||||
Control *focused = get_viewport()->gui_get_focus_owner();
|
Control *focused = get_viewport()->gui_get_focus_owner();
|
||||||
|
bool is_internal = focused == this;
|
||||||
if (focused) {
|
if (focused) {
|
||||||
if (focusables.has(focused)) {
|
if (focusables.has(focused)) {
|
||||||
// If focus is currently on one of the internal property editors, don't update.
|
// If focus is currently on one of the internal property editors, don't update.
|
||||||
updating = false;
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Node *focus_parent = focused->get_parent();
|
Node *focus_parent = focused->get_parent();
|
||||||
while (focus_parent) {
|
while (focus_parent) {
|
||||||
Control *c = Object::cast_to<Control>(focus_parent);
|
Control *c = Object::cast_to<Control>(focus_parent);
|
||||||
|
is_internal |= c == this;
|
||||||
if (c && focusables.has(c)) {
|
if (c && focusables.has(c)) {
|
||||||
// If focus is currently on one of the internal property editors, don't update.
|
// If focus is currently on one of the internal property editors, don't update.
|
||||||
updating = false;
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2332,6 +2325,21 @@ void ThemeTypeEditor::_update_type_list() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (is_internal) {
|
||||||
|
_update_type_list_internal();
|
||||||
|
} else {
|
||||||
|
_update_type_list_debounced();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ThemeTypeEditor::_update_type_list_internal() {
|
||||||
|
ERR_FAIL_COND(edited_theme.is_null());
|
||||||
|
|
||||||
|
if (updating) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
updating = true;
|
||||||
|
|
||||||
List<StringName> theme_types;
|
List<StringName> theme_types;
|
||||||
edited_theme->get_type_list(&theme_types);
|
edited_theme->get_type_list(&theme_types);
|
||||||
theme_types.sort_custom<StringName::AlphCompare>();
|
theme_types.sort_custom<StringName::AlphCompare>();
|
||||||
|
@ -3382,12 +3390,12 @@ void ThemeTypeEditor::_bind_methods() {
|
||||||
|
|
||||||
void ThemeTypeEditor::set_edited_theme(const Ref<Theme> &p_theme) {
|
void ThemeTypeEditor::set_edited_theme(const Ref<Theme> &p_theme) {
|
||||||
if (edited_theme.is_valid()) {
|
if (edited_theme.is_valid()) {
|
||||||
edited_theme->disconnect_changed(callable_mp(this, &ThemeTypeEditor::_update_type_list_debounced));
|
edited_theme->disconnect_changed(callable_mp(this, &ThemeTypeEditor::_update_type_list));
|
||||||
}
|
}
|
||||||
|
|
||||||
edited_theme = p_theme;
|
edited_theme = p_theme;
|
||||||
if (edited_theme.is_valid()) {
|
if (edited_theme.is_valid()) {
|
||||||
edited_theme->connect_changed(callable_mp(this, &ThemeTypeEditor::_update_type_list_debounced));
|
edited_theme->connect_changed(callable_mp(this, &ThemeTypeEditor::_update_type_list));
|
||||||
_update_type_list();
|
_update_type_list();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3526,7 +3534,7 @@ ThemeTypeEditor::ThemeTypeEditor() {
|
||||||
update_debounce_timer = memnew(Timer);
|
update_debounce_timer = memnew(Timer);
|
||||||
update_debounce_timer->set_one_shot(true);
|
update_debounce_timer->set_one_shot(true);
|
||||||
update_debounce_timer->set_wait_time(0.5);
|
update_debounce_timer->set_wait_time(0.5);
|
||||||
update_debounce_timer->connect("timeout", callable_mp(this, &ThemeTypeEditor::_update_type_list));
|
update_debounce_timer->connect("timeout", callable_mp(this, &ThemeTypeEditor::_update_type_list_internal));
|
||||||
add_child(update_debounce_timer);
|
add_child(update_debounce_timer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -372,6 +372,7 @@ class ThemeTypeEditor : public MarginContainer {
|
||||||
|
|
||||||
VBoxContainer *_create_item_list(Theme::DataType p_data_type);
|
VBoxContainer *_create_item_list(Theme::DataType p_data_type);
|
||||||
void _update_type_list();
|
void _update_type_list();
|
||||||
|
void _update_type_list_internal();
|
||||||
void _update_type_list_debounced();
|
void _update_type_list_debounced();
|
||||||
HashMap<StringName, bool> _get_type_items(String p_type_name, Theme::DataType p_type, bool p_include_default);
|
HashMap<StringName, bool> _get_type_items(String p_type_name, Theme::DataType p_type, bool p_include_default);
|
||||||
HBoxContainer *_create_property_control(Theme::DataType p_data_type, String p_item_name, bool p_editable);
|
HBoxContainer *_create_property_control(Theme::DataType p_data_type, String p_item_name, bool p_editable);
|
||||||
|
|
Loading…
Reference in New Issue