Add cache to color picker for presets

This prevents loading from the project metadata more than once,
significantly saving performance with nodes that have color pickers.
This commit is contained in:
Francois Belair 2021-07-07 14:17:44 -04:00
parent 56d7126864
commit 94a464f555
2 changed files with 15 additions and 4 deletions

View file

@ -40,6 +40,8 @@
#endif
#include "scene/main/window.h"
List<Color> ColorPicker::preset_cache;
void ColorPicker::_notification(int p_what) {
switch (p_what) {
case NOTIFICATION_THEME_CHANGED: {
@ -57,11 +59,17 @@ void ColorPicker::_notification(int p_what) {
#ifdef TOOLS_ENABLED
if (Engine::get_singleton()->is_editor_hint()) {
PackedColorArray saved_presets = EditorSettings::get_singleton()->get_project_metadata("color_picker", "presets", PackedColorArray());
for (int i = 0; i < saved_presets.size(); i++) {
add_preset(saved_presets[i]);
if (preset_cache.is_empty()) {
PackedColorArray saved_presets = EditorSettings::get_singleton()->get_project_metadata("color_picker", "presets", PackedColorArray());
for (int i = 0; i < saved_presets.size(); i++) {
preset_cache.push_back(saved_presets[i]);
}
}
for (int i = 0; i < preset_cache.size(); i++) {
presets.push_back(preset_cache[i]);
}
preset->update();
}
#endif
} break;
@ -413,6 +421,7 @@ void ColorPicker::add_preset(const Color &p_color) {
presets.move_to_back(presets.find(p_color));
} else {
presets.push_back(p_color);
preset_cache.push_back(p_color);
}
preset->update();
@ -427,6 +436,7 @@ void ColorPicker::add_preset(const Color &p_color) {
void ColorPicker::erase_preset(const Color &p_color) {
if (presets.find(p_color)) {
presets.erase(presets.find(p_color));
preset_cache.erase(preset_cache.find(p_color));
preset->update();
#ifdef TOOLS_ENABLED

View file

@ -58,6 +58,7 @@ public:
private:
static Ref<Shader> wheel_shader;
static Ref<Shader> circle_shader;
static List<Color> preset_cache;
Control *screen = nullptr;
Control *uv_edit = memnew(Control);