Browse Source

Expose and document ProjectSettings.get_global_class_list()

bitsawer 2 years ago
parent
commit
d1521933bb

+ 15 - 4
core/config/project_settings.cpp

@@ -40,6 +40,7 @@
 #include "core/io/file_access_pack.h"
 #include "core/io/file_access_pack.h"
 #include "core/io/marshalls.h"
 #include "core/io/marshalls.h"
 #include "core/os/keyboard.h"
 #include "core/os/keyboard.h"
+#include "core/variant/typed_array.h"
 #include "core/variant/variant_parser.h"
 #include "core/variant/variant_parser.h"
 #include "core/version.h"
 #include "core/version.h"
 
 
@@ -1136,20 +1137,27 @@ Variant ProjectSettings::get_setting(const String &p_setting, const Variant &p_d
 	}
 	}
 }
 }
 
 
-Array ProjectSettings::get_global_class_list() {
-	Array script_classes;
+TypedArray<Dictionary> ProjectSettings::get_global_class_list() {
+	if (is_global_class_list_loaded) {
+		return global_class_list;
+	}
 
 
 	Ref<ConfigFile> cf;
 	Ref<ConfigFile> cf;
 	cf.instantiate();
 	cf.instantiate();
 	if (cf->load(get_global_class_list_path()) == OK) {
 	if (cf->load(get_global_class_list_path()) == OK) {
-		script_classes = cf->get_value("", "list", Array());
+		global_class_list = cf->get_value("", "list", Array());
 	} else {
 	} else {
 #ifndef TOOLS_ENABLED
 #ifndef TOOLS_ENABLED
 		// Script classes can't be recreated in exported project, so print an error.
 		// Script classes can't be recreated in exported project, so print an error.
 		ERR_PRINT("Could not load global script cache.");
 		ERR_PRINT("Could not load global script cache.");
 #endif
 #endif
 	}
 	}
-	return script_classes;
+
+	// File read succeeded or failed. If it failed, assume everything is still okay.
+	// We will later receive updated class data in store_global_class_list().
+	is_global_class_list_loaded = true;
+
+	return global_class_list;
 }
 }
 
 
 String ProjectSettings::get_global_class_list_path() const {
 String ProjectSettings::get_global_class_list_path() const {
@@ -1161,6 +1169,8 @@ void ProjectSettings::store_global_class_list(const Array &p_classes) {
 	cf.instantiate();
 	cf.instantiate();
 	cf->set_value("", "list", p_classes);
 	cf->set_value("", "list", p_classes);
 	cf->save(get_global_class_list_path());
 	cf->save(get_global_class_list_path());
+
+	global_class_list = p_classes;
 }
 }
 
 
 bool ProjectSettings::has_custom_feature(const String &p_feature) const {
 bool ProjectSettings::has_custom_feature(const String &p_feature) const {
@@ -1195,6 +1205,7 @@ void ProjectSettings::_bind_methods() {
 	ClassDB::bind_method(D_METHOD("set_setting", "name", "value"), &ProjectSettings::set_setting);
 	ClassDB::bind_method(D_METHOD("set_setting", "name", "value"), &ProjectSettings::set_setting);
 	ClassDB::bind_method(D_METHOD("get_setting", "name", "default_value"), &ProjectSettings::get_setting, DEFVAL(Variant()));
 	ClassDB::bind_method(D_METHOD("get_setting", "name", "default_value"), &ProjectSettings::get_setting, DEFVAL(Variant()));
 	ClassDB::bind_method(D_METHOD("get_setting_with_override", "name"), &ProjectSettings::get_setting_with_override);
 	ClassDB::bind_method(D_METHOD("get_setting_with_override", "name"), &ProjectSettings::get_setting_with_override);
+	ClassDB::bind_method(D_METHOD("get_global_class_list"), &ProjectSettings::get_global_class_list);
 	ClassDB::bind_method(D_METHOD("set_order", "name", "position"), &ProjectSettings::set_order);
 	ClassDB::bind_method(D_METHOD("set_order", "name", "position"), &ProjectSettings::set_order);
 	ClassDB::bind_method(D_METHOD("get_order", "name"), &ProjectSettings::get_order);
 	ClassDB::bind_method(D_METHOD("get_order", "name"), &ProjectSettings::get_order);
 	ClassDB::bind_method(D_METHOD("set_initial_value", "name", "value"), &ProjectSettings::set_initial_value);
 	ClassDB::bind_method(D_METHOD("set_initial_value", "name", "value"), &ProjectSettings::set_initial_value);

+ 7 - 1
core/config/project_settings.h

@@ -37,6 +37,9 @@
 #include "core/templates/local_vector.h"
 #include "core/templates/local_vector.h"
 #include "core/templates/rb_set.h"
 #include "core/templates/rb_set.h"
 
 
+template <typename T>
+class TypedArray;
+
 class ProjectSettings : public Object {
 class ProjectSettings : public Object {
 	GDCLASS(ProjectSettings, Object);
 	GDCLASS(ProjectSettings, Object);
 	_THREAD_SAFE_CLASS_
 	_THREAD_SAFE_CLASS_
@@ -99,6 +102,9 @@ protected:
 
 
 	HashMap<StringName, AutoloadInfo> autoloads;
 	HashMap<StringName, AutoloadInfo> autoloads;
 
 
+	Array global_class_list;
+	bool is_global_class_list_loaded = false;
+
 	String project_data_dir_name;
 	String project_data_dir_name;
 
 
 	bool _set(const StringName &p_name, const Variant &p_value);
 	bool _set(const StringName &p_name, const Variant &p_value);
@@ -141,7 +147,7 @@ public:
 
 
 	void set_setting(const String &p_setting, const Variant &p_value);
 	void set_setting(const String &p_setting, const Variant &p_value);
 	Variant get_setting(const String &p_setting, const Variant &p_default_value = Variant()) const;
 	Variant get_setting(const String &p_setting, const Variant &p_default_value = Variant()) const;
-	Array get_global_class_list();
+	TypedArray<Dictionary> get_global_class_list();
 	void store_global_class_list(const Array &p_classes);
 	void store_global_class_list(const Array &p_classes);
 	String get_global_class_list_path() const;
 	String get_global_class_list_path() const;
 
 

+ 12 - 0
doc/classes/ProjectSettings.xml

@@ -60,6 +60,18 @@
 				Clears the whole configuration (not recommended, may break things).
 				Clears the whole configuration (not recommended, may break things).
 			</description>
 			</description>
 		</method>
 		</method>
+		<method name="get_global_class_list">
+			<return type="Dictionary[]" />
+			<description>
+				Returns an [Array] of registered global classes. Each global class is represented as a [Dictionary] that contains the following entries:
+				- [code]base[/code] is a name of the base class;
+				- [code]class[/code] is a name of the registered global class;
+				- [code]icon[/code] is a path to a custom icon of the global class, if it has any;
+				- [code]language[/code] is a name of a programming language in which the global class is written;
+				- [code]path[/code] is a path to a file containing the global class.
+				[b]Note:[/b] Both the script and the icon paths are local to the project filesystem, i.e. they start with [code]res://[/code].
+			</description>
+		</method>
 		<method name="get_order" qualifiers="const">
 		<method name="get_order" qualifiers="const">
 			<return type="int" />
 			<return type="int" />
 			<param index="0" name="name" type="String" />
 			<param index="0" name="name" type="String" />

+ 1 - 1
doc/classes/Variant.xml

@@ -38,7 +38,7 @@
 		        # To get the name of the underlying Object type, you need the `get_class()` method.
 		        # To get the name of the underlying Object type, you need the `get_class()` method.
 		        print("foo is a(n) %s" % foo.get_class()) # inject the class name into a formatted string.
 		        print("foo is a(n) %s" % foo.get_class()) # inject the class name into a formatted string.
 		        # Note also that there is not yet any way to get a script's `class_name` string easily.
 		        # Note also that there is not yet any way to get a script's `class_name` string easily.
-		        # To fetch that value, you can parse the [code]res://.godot/global_script_class_cache.cfg[/code] file with the [ConfigFile] API.
+		        # To fetch that value, you can use [member ProjectSettings.get_global_class_list].
 		        # Open your project.godot file to see it up close.
 		        # Open your project.godot file to see it up close.
 		[/gdscript]
 		[/gdscript]
 		[csharp]
 		[csharp]