Pārlūkot izejas kodu

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.
Francois Belair 4 gadi atpakaļ
vecāks
revīzija
a4a2ab3ee0
2 mainītis faili ar 14 papildinājumiem un 3 dzēšanām
  1. 13 3
      scene/gui/color_picker.cpp
  2. 1 0
      scene/gui/color_picker.h

+ 13 - 3
scene/gui/color_picker.cpp

@@ -40,6 +40,8 @@
 #endif
 #include "scene/main/viewport.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()) {
-				PoolColorArray saved_presets = EditorSettings::get_singleton()->get_project_metadata("color_picker", "presets", PoolColorArray());
+				if (preset_cache.empty()) {
+					PoolColorArray saved_presets = EditorSettings::get_singleton()->get_project_metadata("color_picker", "presets", PoolColorArray());
+					for (int i = 0; i < saved_presets.size(); i++) {
+						preset_cache.push_back(saved_presets[i]);
+					}
+				}
 
-				for (int i = 0; i < saved_presets.size(); i++) {
-					add_preset(saved_presets[i]);
+				for (int i = 0; i < preset_cache.size(); i++) {
+					presets.push_back(preset_cache[i]);
 				}
+				preset->update();
 			}
 #endif
 		} break;
@@ -287,6 +295,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();
 
@@ -301,6 +310,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

+ 1 - 0
scene/gui/color_picker.h

@@ -47,6 +47,7 @@ class ColorPicker : public BoxContainer {
 	GDCLASS(ColorPicker, BoxContainer);
 
 private:
+	static List<Color> preset_cache;
 	Control *screen;
 	Control *uv_edit;
 	Control *w_edit;