diff options
155 files changed, 3016 insertions, 2505 deletions
diff --git a/core/core_constants.cpp b/core/core_constants.cpp index 2f5fd05e6a..63e7323f7a 100644 --- a/core/core_constants.cpp +++ b/core/core_constants.cpp @@ -165,6 +165,9 @@ void register_global_constants() { BIND_CORE_ENUM_CONSTANT(INLINE_ALIGNMENT_CENTER); BIND_CORE_ENUM_CONSTANT(INLINE_ALIGNMENT_BOTTOM); + BIND_CORE_ENUM_CONSTANT(INLINE_ALIGNMENT_IMAGE_MASK); + BIND_CORE_ENUM_CONSTANT(INLINE_ALIGNMENT_TEXT_MASK); + BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, SPECIAL); BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, ESCAPE); BIND_CORE_ENUM_CLASS_CONSTANT(Key, KEY, TAB); diff --git a/core/object/callable_method_pointer.h b/core/object/callable_method_pointer.h index 53410a9acf..3cd9ad3819 100644 --- a/core/object/callable_method_pointer.h +++ b/core/object/callable_method_pointer.h @@ -51,6 +51,14 @@ protected: void _setup(uint32_t *p_base_ptr, uint32_t p_ptr_size); public: + virtual StringName get_method() const { +#ifdef DEBUG_METHODS_ENABLED + return StringName(text); +#else + return StringName(); +#endif + } + #ifdef DEBUG_METHODS_ENABLED void set_text(const char *p_text) { text = p_text; diff --git a/core/object/class_db.cpp b/core/object/class_db.cpp index 72a98ca20c..3df4db9c5e 100644 --- a/core/object/class_db.cpp +++ b/core/object/class_db.cpp @@ -1632,7 +1632,8 @@ Variant ClassDB::class_get_default_property_value(const StringName &p_class, con // Some properties may have an instantiated Object as default value, // (like Path2D's `curve` used to have), but that's not a good practice. // Instead, those properties should use PROPERTY_USAGE_EDITOR_INSTANTIATE_OBJECT - // to be auto-instantiated when created in the editor. + // to be auto-instantiated when created in the editor with the following method: + // EditorNode::get_editor_data().instantiate_object_properties(obj); if (var.get_type() == Variant::OBJECT) { Object *obj = var.get_validated_object(); if (obj) { diff --git a/core/string/string_name.h b/core/string/string_name.h index 9653d2b4cf..f767f3e1ec 100644 --- a/core/string/string_name.h +++ b/core/string/string_name.h @@ -181,6 +181,18 @@ bool operator!=(const char *p_name, const StringName &p_string_name); StringName _scs_create(const char *p_chr, bool p_static = false); +/* + * The SNAME macro is used to speed up StringName creation, as it allows caching it after the first usage in a very efficient way. + * It should NOT be used everywhere, but instead in places where high performance is required and the creation of a StringName + * can be costly. Places where it should be used are: + * - Control::get_theme_*(<name> and Window::get_theme_*(<name> functions. + * - emit_signal(<name>,..) function + * - call_deferred(<name>,..) function + * - Comparisons to a StringName in overriden _set and _get methods. + * + * Use in places that can be called hundreds of times per frame (or more) is recommended, but this situation is very rare. If in doubt, do not use. + */ + #define SNAME(m_arg) ([]() -> const StringName & { static StringName sname = _scs_create(m_arg, true); return sname; })() #endif // STRING_NAME_H diff --git a/core/string/translation.cpp b/core/string/translation.cpp index 7cc41df9ef..eeac8b0acf 100644 --- a/core/string/translation.cpp +++ b/core/string/translation.cpp @@ -925,6 +925,7 @@ bool TranslationServer::is_placeholder(String &p_message, int p_index) const { void TranslationServer::_bind_methods() { ClassDB::bind_method(D_METHOD("set_locale", "locale"), &TranslationServer::set_locale); ClassDB::bind_method(D_METHOD("get_locale"), &TranslationServer::get_locale); + ClassDB::bind_method(D_METHOD("get_tool_locale"), &TranslationServer::get_tool_locale); ClassDB::bind_method(D_METHOD("compare_locales", "locale_a", "locale_b"), &TranslationServer::compare_locales); ClassDB::bind_method(D_METHOD("standardize_locale", "locale"), &TranslationServer::standardize_locale); diff --git a/core/variant/callable.cpp b/core/variant/callable.cpp index c6a67f01d5..27792ce111 100644 --- a/core/variant/callable.cpp +++ b/core/variant/callable.cpp @@ -114,8 +114,9 @@ ObjectID Callable::get_object_id() const { } StringName Callable::get_method() const { - ERR_FAIL_COND_V_MSG(is_custom(), StringName(), - vformat("Can't get method on CallableCustom \"%s\".", operator String())); + if (is_custom()) { + return get_custom()->get_method(); + } return method; } @@ -310,6 +311,10 @@ Callable::~Callable() { } } +StringName CallableCustom::get_method() const { + ERR_FAIL_V_MSG(StringName(), vformat("Can't get method on CallableCustom \"%s\".", get_as_text())); +} + void CallableCustom::rpc(int p_peer_id, const Variant **p_arguments, int p_argcount, Callable::CallError &r_call_error) const { r_call_error.error = Callable::CallError::CALL_ERROR_INVALID_METHOD; r_call_error.argument = 0; diff --git a/core/variant/callable.h b/core/variant/callable.h index 855ffa9129..c61870f194 100644 --- a/core/variant/callable.h +++ b/core/variant/callable.h @@ -125,6 +125,7 @@ public: virtual String get_as_text() const = 0; virtual CompareEqualFunc get_compare_equal_func() const = 0; virtual CompareLessFunc get_compare_less_func() const = 0; + virtual StringName get_method() const; virtual ObjectID get_object() const = 0; //must always be able to provide an object virtual void call(const Variant **p_arguments, int p_argcount, Variant &r_return_value, Callable::CallError &r_call_error) const = 0; virtual void rpc(int p_peer_id, const Variant **p_arguments, int p_argcount, Callable::CallError &r_call_error) const; diff --git a/core/variant/callable_bind.cpp b/core/variant/callable_bind.cpp index 4579621760..797e8afede 100644 --- a/core/variant/callable_bind.cpp +++ b/core/variant/callable_bind.cpp @@ -70,12 +70,19 @@ bool CallableCustomBind::_less_func(const CallableCustom *p_a, const CallableCus CallableCustom::CompareEqualFunc CallableCustomBind::get_compare_equal_func() const { return _equal_func; } + CallableCustom::CompareLessFunc CallableCustomBind::get_compare_less_func() const { return _less_func; } + +StringName CallableCustomBind::get_method() const { + return callable.get_method(); +} + ObjectID CallableCustomBind::get_object() const { return callable.get_object_id(); } + const Callable *CallableCustomBind::get_base_comparator() const { return &callable; } @@ -140,12 +147,19 @@ bool CallableCustomUnbind::_less_func(const CallableCustom *p_a, const CallableC CallableCustom::CompareEqualFunc CallableCustomUnbind::get_compare_equal_func() const { return _equal_func; } + CallableCustom::CompareLessFunc CallableCustomUnbind::get_compare_less_func() const { return _less_func; } + +StringName CallableCustomUnbind::get_method() const { + return callable.get_method(); +} + ObjectID CallableCustomUnbind::get_object() const { return callable.get_object_id(); } + const Callable *CallableCustomUnbind::get_base_comparator() const { return &callable; } diff --git a/core/variant/callable_bind.h b/core/variant/callable_bind.h index ac5797e05f..4f79a29629 100644 --- a/core/variant/callable_bind.h +++ b/core/variant/callable_bind.h @@ -47,6 +47,7 @@ public: virtual String get_as_text() const; virtual CompareEqualFunc get_compare_equal_func() const; virtual CompareLessFunc get_compare_less_func() const; + virtual StringName get_method() const; virtual ObjectID get_object() const; //must always be able to provide an object virtual void call(const Variant **p_arguments, int p_argcount, Variant &r_return_value, Callable::CallError &r_call_error) const; virtual const Callable *get_base_comparator() const; @@ -71,6 +72,7 @@ public: virtual String get_as_text() const; virtual CompareEqualFunc get_compare_equal_func() const; virtual CompareLessFunc get_compare_less_func() const; + virtual StringName get_method() const; virtual ObjectID get_object() const; //must always be able to provide an object virtual void call(const Variant **p_arguments, int p_argcount, Variant &r_return_value, Callable::CallError &r_call_error) const; virtual const Callable *get_base_comparator() const; diff --git a/core/variant/variant_call.cpp b/core/variant/variant_call.cpp index 750f23902d..a5e89eec80 100644 --- a/core/variant/variant_call.cpp +++ b/core/variant/variant_call.cpp @@ -1371,6 +1371,8 @@ static void _register_variant_builtin_methods() { bind_method(String, length, sarray(), varray()); bind_method(String, substr, sarray("from", "len"), varray(-1)); bind_method(String, get_slice, sarray("delimiter", "slice"), varray()); + bind_method(String, get_slicec, sarray("delimiter", "slice"), varray()); + bind_method(String, get_slice_count, sarray("delimiter"), varray()); bind_methodv(String, find, static_cast<int (String::*)(const String &, int) const>(&String::find), sarray("what", "from"), varray(0)); bind_method(String, count, sarray("what", "from", "to"), varray(0, 0)); bind_method(String, countn, sarray("what", "from", "to"), varray(0, 0)); @@ -1667,6 +1669,7 @@ static void _register_variant_builtin_methods() { /* RID */ + bind_method(RID, is_valid, sarray(), varray()); bind_method(RID, get_id, sarray(), varray()); /* NodePath */ diff --git a/core/variant/variant_op.cpp b/core/variant/variant_op.cpp index f35774204b..cd1ae9f41f 100644 --- a/core/variant/variant_op.cpp +++ b/core/variant/variant_op.cpp @@ -176,6 +176,7 @@ void Variant::_register_variant_operators() { register_op<OperatorEvaluatorAdd<double, double, int64_t>>(Variant::OP_ADD, Variant::FLOAT, Variant::INT); register_op<OperatorEvaluatorAdd<double, double, double>>(Variant::OP_ADD, Variant::FLOAT, Variant::FLOAT); register_op<OperatorEvaluatorAdd<String, String, String>>(Variant::OP_ADD, Variant::STRING, Variant::STRING); + register_op<OperatorEvaluatorAdd<String, char32_t, String>>(Variant::OP_ADD, Variant::INT, Variant::STRING); register_op<OperatorEvaluatorAdd<Vector2, Vector2, Vector2>>(Variant::OP_ADD, Variant::VECTOR2, Variant::VECTOR2); register_op<OperatorEvaluatorAdd<Vector2i, Vector2i, Vector2i>>(Variant::OP_ADD, Variant::VECTOR2I, Variant::VECTOR2I); register_op<OperatorEvaluatorAdd<Vector3, Vector3, Vector3>>(Variant::OP_ADD, Variant::VECTOR3, Variant::VECTOR3); @@ -622,6 +623,7 @@ void Variant::_register_variant_operators() { register_op<OperatorEvaluatorLess<double, int64_t>>(Variant::OP_LESS, Variant::FLOAT, Variant::INT); register_op<OperatorEvaluatorLess<double, double>>(Variant::OP_LESS, Variant::FLOAT, Variant::FLOAT); register_op<OperatorEvaluatorLess<String, String>>(Variant::OP_LESS, Variant::STRING, Variant::STRING); + register_op<OperatorEvaluatorLess<StringName, StringName>>(Variant::OP_LESS, Variant::STRING_NAME, Variant::STRING_NAME); register_op<OperatorEvaluatorLess<Vector2, Vector2>>(Variant::OP_LESS, Variant::VECTOR2, Variant::VECTOR2); register_op<OperatorEvaluatorLess<Vector2i, Vector2i>>(Variant::OP_LESS, Variant::VECTOR2I, Variant::VECTOR2I); register_op<OperatorEvaluatorLess<Vector3, Vector3>>(Variant::OP_LESS, Variant::VECTOR3, Variant::VECTOR3); @@ -634,6 +636,7 @@ void Variant::_register_variant_operators() { register_op<OperatorEvaluatorLessEqual<double, int64_t>>(Variant::OP_LESS_EQUAL, Variant::FLOAT, Variant::INT); register_op<OperatorEvaluatorLessEqual<double, double>>(Variant::OP_LESS_EQUAL, Variant::FLOAT, Variant::FLOAT); register_op<OperatorEvaluatorLessEqual<String, String>>(Variant::OP_LESS_EQUAL, Variant::STRING, Variant::STRING); + register_op<OperatorEvaluatorLessEqual<StringName, StringName>>(Variant::OP_LESS_EQUAL, Variant::STRING_NAME, Variant::STRING_NAME); register_op<OperatorEvaluatorLessEqual<Vector2, Vector2>>(Variant::OP_LESS_EQUAL, Variant::VECTOR2, Variant::VECTOR2); register_op<OperatorEvaluatorLessEqual<Vector2i, Vector2i>>(Variant::OP_LESS_EQUAL, Variant::VECTOR2I, Variant::VECTOR2I); register_op<OperatorEvaluatorLessEqual<Vector3, Vector3>>(Variant::OP_LESS_EQUAL, Variant::VECTOR3, Variant::VECTOR3); @@ -647,6 +650,7 @@ void Variant::_register_variant_operators() { register_op<OperatorEvaluatorGreater<double, int64_t>>(Variant::OP_GREATER, Variant::FLOAT, Variant::INT); register_op<OperatorEvaluatorGreater<double, double>>(Variant::OP_GREATER, Variant::FLOAT, Variant::FLOAT); register_op<OperatorEvaluatorGreater<String, String>>(Variant::OP_GREATER, Variant::STRING, Variant::STRING); + register_op<OperatorEvaluatorGreater<StringName, StringName>>(Variant::OP_GREATER, Variant::STRING_NAME, Variant::STRING_NAME); register_op<OperatorEvaluatorGreater<Vector2, Vector2>>(Variant::OP_GREATER, Variant::VECTOR2, Variant::VECTOR2); register_op<OperatorEvaluatorGreater<Vector2i, Vector2i>>(Variant::OP_GREATER, Variant::VECTOR2I, Variant::VECTOR2I); register_op<OperatorEvaluatorGreater<Vector3, Vector3>>(Variant::OP_GREATER, Variant::VECTOR3, Variant::VECTOR3); @@ -659,6 +663,7 @@ void Variant::_register_variant_operators() { register_op<OperatorEvaluatorGreaterEqual<double, int64_t>>(Variant::OP_GREATER_EQUAL, Variant::FLOAT, Variant::INT); register_op<OperatorEvaluatorGreaterEqual<double, double>>(Variant::OP_GREATER_EQUAL, Variant::FLOAT, Variant::FLOAT); register_op<OperatorEvaluatorGreaterEqual<String, String>>(Variant::OP_GREATER_EQUAL, Variant::STRING, Variant::STRING); + register_op<OperatorEvaluatorGreaterEqual<StringName, StringName>>(Variant::OP_GREATER_EQUAL, Variant::STRING_NAME, Variant::STRING_NAME); register_op<OperatorEvaluatorGreaterEqual<Vector2, Vector2>>(Variant::OP_GREATER_EQUAL, Variant::VECTOR2, Variant::VECTOR2); register_op<OperatorEvaluatorGreaterEqual<Vector2i, Vector2i>>(Variant::OP_GREATER_EQUAL, Variant::VECTOR2I, Variant::VECTOR2I); register_op<OperatorEvaluatorGreaterEqual<Vector3, Vector3>>(Variant::OP_GREATER_EQUAL, Variant::VECTOR3, Variant::VECTOR3); diff --git a/doc/classes/@GlobalScope.xml b/doc/classes/@GlobalScope.xml index d8c9ca08e8..4c0f89f14d 100644 --- a/doc/classes/@GlobalScope.xml +++ b/doc/classes/@GlobalScope.xml @@ -1267,6 +1267,12 @@ <constant name="INLINE_ALIGNMENT_BOTTOM" value="14" enum="InlineAlignment"> Aligns bottom of the inline object (e.g. image, table) to the bottom of the text. Equivalent to [code]INLINE_ALIGNMENT_BOTTOM_TO | INLINE_ALIGNMENT_TO_BOTTOM[/code]. </constant> + <constant name="INLINE_ALIGNMENT_IMAGE_MASK" value="3" enum="InlineAlignment"> + A bit mask for [code]INLINE_ALIGNMENT_*_TO[/code] alignment constants. + </constant> + <constant name="INLINE_ALIGNMENT_TEXT_MASK" value="12" enum="InlineAlignment"> + A bit mask for [code]INLINE_ALIGNMENT_TO_*[/code] alignment constants. + </constant> <constant name="KEY_SPECIAL" value="16777216" enum="Key"> Keycodes with this bit applied are non-printable. </constant> diff --git a/doc/classes/Color.xml b/doc/classes/Color.xml index f3fcd90f51..4e73d4d9d8 100644 --- a/doc/classes/Color.xml +++ b/doc/classes/Color.xml @@ -218,12 +218,45 @@ <return type="Color" /> <argument index="0" name="rgba" type="String" /> <description> + Returns a new color from [code]rgba[/code], an HTML hexadecimal color string. [code]rgba[/code] is not case sensitive, and may be prefixed with a '#' character. + [code]rgba[/code] must be a valid three-digit or six-digit hexadecimal color string, and may contain an alpha channel value. If [code]rgba[/code] does not contain an alpha channel value, an alpha channel value of 1.0 is applied. + If [code]rgba[/code] is invalid a Color(0.0, 0.0, 0.0, 1.0) is returned. + [codeblocks] + [gdscript] + var green = Color.html("#00FF00FF") # set green to Color(0.0, 1.0, 0.0, 1.0) + var blue = Color.html("#0000FF") # set blue to Color(0.0, 0.0, 1.0, 1.0) + [/gdscript] + [csharp] + var green = Color.Html("#00FF00FF"); // set green to Color(0.0, 1.0, 0.0, 1.0) + var blue = Color.Html("#0000FF"); // set blue to Color(0.0, 0.0, 1.0, 1.0) + [/csharp] + [/codeblocks] </description> </method> <method name="html_is_valid" qualifiers="static"> <return type="bool" /> <argument index="0" name="color" type="String" /> <description> + Returns [code]true[/code] if [code]color[/code] is a valid HTML hexadecimal color string. [code]color[/code] is not case sensitive, and may be prefixed with a '#' character. + For a string to be valid it must be three-digit or six-digit hexadecimal, and may contain an alpha channel value. + [codeblocks] + [gdscript] + var result = Color.html_is_valid("#55aaFF") # result is true + result = Color.html_is_valid("#55AAFF20") # result is true + result = Color.html_is_valid("55AAFF") # result is true + result = Color.html_is_valid("#F2C") # result is true + result = Color.html_is_valid("#AABBC) # result is false + result = Color.html_is_valid("#55aaFF5") # result is false + [/gdscript] + [csharp] + var result = Color.HtmlIsValid("#55AAFF"); // result is true + result = Color.HtmlIsValid("#55AAFF20"); // result is true + result = Color.HtmlIsValid("55AAFF); // result is true + result = Color.HtmlIsValid("#F2C"); // result is true + result = Color.HtmlIsValid("#AABBC"); // result is false + result = Color.HtmlIsValid("#55aaFF5"); // result is false + [/csharp] + [/codeblocks] </description> </method> <method name="inverted" qualifiers="const"> diff --git a/doc/classes/Mesh.xml b/doc/classes/Mesh.xml index c774528a39..8fbafcdb51 100644 --- a/doc/classes/Mesh.xml +++ b/doc/classes/Mesh.xml @@ -206,7 +206,7 @@ <constant name="ARRAY_FORMAT_INDEX" value="4096" enum="ArrayFormat"> Mesh array uses indices. </constant> - <constant name="ARRAY_FORMAT_BLEND_SHAPE_MASK" value="2147475463" enum="ArrayFormat"> + <constant name="ARRAY_FORMAT_BLEND_SHAPE_MASK" value="7" enum="ArrayFormat"> </constant> <constant name="ARRAY_FORMAT_CUSTOM_BASE" value="13" enum="ArrayFormat"> </constant> diff --git a/doc/classes/PopupMenu.xml b/doc/classes/PopupMenu.xml index eb1b0aada7..b316f822f0 100644 --- a/doc/classes/PopupMenu.xml +++ b/doc/classes/PopupMenu.xml @@ -331,6 +331,13 @@ [b]Note:[/b] The indices of items after the removed item will be shifted by one. </description> </method> + <method name="scroll_to_item"> + <return type="void" /> + <argument index="0" name="index" type="int" /> + <description> + Moves the scroll view to make the item at the given [code]index[/code] visible. + </description> + </method> <method name="set_current_index"> <return type="void" /> <argument index="0" name="index" type="int" /> diff --git a/doc/classes/RID.xml b/doc/classes/RID.xml index 695b0933fa..990e82593e 100644 --- a/doc/classes/RID.xml +++ b/doc/classes/RID.xml @@ -30,6 +30,12 @@ Returns the ID of the referenced resource. </description> </method> + <method name="is_valid" qualifiers="const"> + <return type="bool" /> + <description> + Returns [code]true[/code] if [RID] is valid. + </description> + </method> </methods> <operators> <operator name="operator !="> diff --git a/doc/classes/RenderingServer.xml b/doc/classes/RenderingServer.xml index 446db40dd8..82728c0570 100644 --- a/doc/classes/RenderingServer.xml +++ b/doc/classes/RenderingServer.xml @@ -3626,7 +3626,7 @@ <constant name="ARRAY_FORMAT_INDEX" value="4096" enum="ArrayFormat"> Flag used to mark an index array. </constant> - <constant name="ARRAY_FORMAT_BLEND_SHAPE_MASK" value="2147475463" enum="ArrayFormat"> + <constant name="ARRAY_FORMAT_BLEND_SHAPE_MASK" value="7" enum="ArrayFormat"> </constant> <constant name="ARRAY_FORMAT_CUSTOM_BASE" value="13" enum="ArrayFormat"> </constant> diff --git a/doc/classes/String.xml b/doc/classes/String.xml index eeb17c24c0..a6182f5dab 100644 --- a/doc/classes/String.xml +++ b/doc/classes/String.xml @@ -222,6 +222,22 @@ [/codeblock] </description> </method> + <method name="get_slice_count" qualifiers="const"> + <return type="int" /> + <argument index="0" name="delimiter" type="String" /> + <description> + Splits a string using a [code]delimiter[/code] and returns a number of slices. + </description> + </method> + <method name="get_slicec" qualifiers="const"> + <return type="String" /> + <argument index="0" name="delimiter" type="int" /> + <argument index="1" name="slice" type="int" /> + <description> + Splits a string using a Unicode character with code [code]delimiter[/code] and returns a substring at index [code]slice[/code]. Returns an empty string if the index doesn't exist. + This is a more performant alternative to [method split] for cases when you need only one element from the array at a fixed index. + </description> + </method> <method name="hash" qualifiers="const"> <return type="int" /> <description> diff --git a/doc/classes/StringName.xml b/doc/classes/StringName.xml index b32665a09f..85c4d7593e 100644 --- a/doc/classes/StringName.xml +++ b/doc/classes/StringName.xml @@ -48,6 +48,18 @@ <description> </description> </operator> + <operator name="operator <"> + <return type="bool" /> + <argument index="0" name="right" type="StringName" /> + <description> + </description> + </operator> + <operator name="operator <="> + <return type="bool" /> + <argument index="0" name="right" type="StringName" /> + <description> + </description> + </operator> <operator name="operator =="> <return type="bool" /> <description> @@ -65,5 +77,17 @@ <description> </description> </operator> + <operator name="operator >"> + <return type="bool" /> + <argument index="0" name="right" type="StringName" /> + <description> + </description> + </operator> + <operator name="operator >="> + <return type="bool" /> + <argument index="0" name="right" type="StringName" /> + <description> + </description> + </operator> </operators> </class> diff --git a/doc/classes/TranslationServer.xml b/doc/classes/TranslationServer.xml index c90cb2987c..6ece42da6b 100644 --- a/doc/classes/TranslationServer.xml +++ b/doc/classes/TranslationServer.xml @@ -91,6 +91,13 @@ Returns readable script name for the [code]script[/code] code. </description> </method> + <method name="get_tool_locale"> + <return type="String" /> + <description> + Returns the current locale of the editor. + [b]Note:[/b] When called from an exported project returns the same value as [method get_locale]. + </description> + </method> <method name="get_translation_object"> <return type="Translation" /> <argument index="0" name="locale" type="String" /> diff --git a/doc/classes/Tree.xml b/doc/classes/Tree.xml index 766c740a2c..4b051c4938 100644 --- a/doc/classes/Tree.xml +++ b/doc/classes/Tree.xml @@ -240,6 +240,7 @@ <method name="scroll_to_item"> <return type="void" /> <argument index="0" name="item" type="TreeItem" /> + <argument index="1" name="center_on_item" type="bool" default="false" /> <description> Causes the [Tree] to jump to the specified [TreeItem]. </description> diff --git a/doc/classes/Vector3i.xml b/doc/classes/Vector3i.xml index 8a901fdf37..e0b8a53a3c 100644 --- a/doc/classes/Vector3i.xml +++ b/doc/classes/Vector3i.xml @@ -48,6 +48,7 @@ <method name="abs" qualifiers="const"> <return type="Vector3i" /> <description> + Returns a new vector with all components in absolute values (i.e. positive). </description> </method> <method name="clamp" qualifiers="const"> diff --git a/doc/classes/int.xml b/doc/classes/int.xml index d212fe42bf..006dc7eb29 100644 --- a/doc/classes/int.xml +++ b/doc/classes/int.xml @@ -177,6 +177,13 @@ </description> </operator> <operator name="operator +"> + <return type="String" /> + <argument index="0" name="right" type="String" /> + <description> + Adds Unicode character with code [int] to the [String]. + </description> + </operator> + <operator name="operator +"> <return type="float" /> <argument index="0" name="right" type="float" /> <description> diff --git a/editor/animation_track_editor.cpp b/editor/animation_track_editor.cpp index dab928794f..2f33619a52 100644 --- a/editor/animation_track_editor.cpp +++ b/editor/animation_track_editor.cpp @@ -4368,7 +4368,7 @@ void AnimationTrackEditor::_update_tracks() { g->set_timeline(timeline); groups.push_back(g); VBoxContainer *vb = memnew(VBoxContainer); - vb->add_theme_constant_override(SNAME("separation"), 0); + vb->add_theme_constant_override("separation", 0); vb->add_child(g); track_vbox->add_child(vb); group_sort[base_path] = vb; @@ -4519,7 +4519,7 @@ void AnimationTrackEditor::_notification(int p_what) { view_group->set_icon(get_theme_icon(view_group->is_pressed() ? SNAME("AnimationTrackList") : SNAME("AnimationTrackGroup"), SNAME("EditorIcons"))); selected_filter->set_icon(get_theme_icon(SNAME("AnimationFilter"), SNAME("EditorIcons"))); imported_anim_warning->set_icon(get_theme_icon(SNAME("NodeWarning"), SNAME("EditorIcons"))); - main_panel->add_theme_style_override(SNAME("panel"), get_theme_stylebox(SNAME("bg"), SNAME("Tree"))); + main_panel->add_theme_style_override("panel", get_theme_stylebox(SNAME("bg"), SNAME("Tree"))); edit->get_popup()->set_item_icon(edit->get_popup()->get_item_index(EDIT_APPLY_RESET), get_theme_icon(SNAME("Reload"), SNAME("EditorIcons"))); } @@ -6085,7 +6085,7 @@ AnimationTrackEditor::AnimationTrackEditor() { timeline_scroll->add_child(timeline_vbox); timeline_vbox->set_v_size_flags(SIZE_EXPAND_FILL); timeline_vbox->set_h_size_flags(SIZE_EXPAND_FILL); - timeline_vbox->add_theme_constant_override(SNAME("separation"), 0); + timeline_vbox->add_theme_constant_override("separation", 0); info_message = memnew(Label); info_message->set_text(TTR("Select an AnimationPlayer node to create and edit animations.")); @@ -6140,7 +6140,7 @@ AnimationTrackEditor::AnimationTrackEditor() { scroll->add_child(track_vbox); track_vbox->set_h_size_flags(SIZE_EXPAND_FILL); scroll->set_horizontal_scroll_mode(ScrollContainer::SCROLL_MODE_DISABLED); - track_vbox->add_theme_constant_override(SNAME("separation"), 0); + track_vbox->add_theme_constant_override("separation", 0); HBoxContainer *bottom_hb = memnew(HBoxContainer); add_child(bottom_hb); diff --git a/editor/code_editor.cpp b/editor/code_editor.cpp index daca1e9587..2627baaea8 100644 --- a/editor/code_editor.cpp +++ b/editor/code_editor.cpp @@ -105,7 +105,7 @@ void FindReplaceBar::_notification(int p_what) { hide_button->set_pressed_texture(get_theme_icon(SNAME("Close"), SNAME("EditorIcons"))); hide_button->set_custom_minimum_size(hide_button->get_normal_texture()->get_size()); } else if (p_what == NOTIFICATION_THEME_CHANGED) { - matches_label->add_theme_color_override(SNAME("font_color"), results_count > 0 ? get_theme_color(SNAME("font_color"), SNAME("Label")) : get_theme_color(SNAME("error_color"), SNAME("Editor"))); + matches_label->add_theme_color_override("font_color", results_count > 0 ? get_theme_color(SNAME("font_color"), SNAME("Label")) : get_theme_color(SNAME("error_color"), SNAME("Editor"))); } else if (p_what == NOTIFICATION_PREDELETE) { if (base_text_editor) { base_text_editor->remove_find_replace_bar(); @@ -301,7 +301,7 @@ void FindReplaceBar::_replace_all() { } text_editor->set_v_scroll(vsval); - matches_label->add_theme_color_override(SNAME("font_color"), rc > 0 ? get_theme_color(SNAME("font_color"), SNAME("Label")) : get_theme_color(SNAME("error_color"), SNAME("Editor"))); + matches_label->add_theme_color_override("font_color", rc > 0 ? get_theme_color(SNAME("font_color"), SNAME("Label")) : get_theme_color(SNAME("error_color"), SNAME("Editor"))); matches_label->set_text(vformat(TTR("%d replaced."), rc)); text_editor->call_deferred(SNAME("connect"), "text_changed", callable_mp(this, &FindReplaceBar::_editor_text_changed)); @@ -365,7 +365,7 @@ void FindReplaceBar::_update_matches_label() { } else { matches_label->show(); - matches_label->add_theme_color_override(SNAME("font_color"), results_count > 0 ? get_theme_color(SNAME("font_color"), SNAME("Label")) : get_theme_color(SNAME("error_color"), SNAME("Editor"))); + matches_label->add_theme_color_override("font_color", results_count > 0 ? get_theme_color(SNAME("font_color"), SNAME("Label")) : get_theme_color(SNAME("error_color"), SNAME("Editor"))); matches_label->set_text(vformat(results_count == 1 ? TTR("%d match.") : TTR("%d matches."), results_count)); } } @@ -818,7 +818,7 @@ void CodeTextEditor::_zoom_changed() { void CodeTextEditor::_reset_zoom() { EditorSettings::get_singleton()->set("interface/editor/code_font_size", 14); - text_editor->add_theme_font_size_override(SNAME("font_size"), 14 * EDSCALE); + text_editor->add_theme_font_size_override("font_size", 14 * EDSCALE); } void CodeTextEditor::_line_col_changed() { @@ -936,7 +936,7 @@ bool CodeTextEditor::_add_font_size(int p_delta) { if (new_size != old_size) { EditorSettings::get_singleton()->set("interface/editor/code_font_size", new_size / EDSCALE); - text_editor->add_theme_font_size_override(SNAME("font_size"), new_size); + text_editor->add_theme_font_size_override("font_size", new_size); } return true; @@ -1567,14 +1567,14 @@ void CodeTextEditor::_update_text_editor_theme() { Ref<Font> status_bar_font = get_theme_font(SNAME("status_source"), SNAME("EditorFonts")); int status_bar_font_size = get_theme_font_size(SNAME("status_source_size"), SNAME("EditorFonts")); - error->add_theme_font_override(SNAME("font"), status_bar_font); - error->add_theme_font_size_override(SNAME("font_size"), status_bar_font_size); + error->add_theme_font_override("font", status_bar_font); + error->add_theme_font_size_override("font_size", status_bar_font_size); int count = status_bar->get_child_count(); for (int i = 0; i < count; i++) { Control *n = Object::cast_to<Control>(status_bar->get_child(i)); if (n) { - n->add_theme_font_override(SNAME("font"), status_bar_font); - n->add_theme_font_size_override(SNAME("font_size"), status_bar_font_size); + n->add_theme_font_override("font", status_bar_font); + n->add_theme_font_size_override("font_size", status_bar_font_size); } } error->end_bulk_theme_override(); @@ -1666,17 +1666,17 @@ void CodeTextEditor::_notification(int p_what) { case NOTIFICATION_ENTER_TREE: case NOTIFICATION_THEME_CHANGED: { error_button->set_icon(get_theme_icon(SNAME("StatusError"), SNAME("EditorIcons"))); - error_button->add_theme_color_override(SNAME("font_color"), get_theme_color(SNAME("error_color"), SNAME("Editor"))); - error_button->add_theme_font_override(SNAME("font"), get_theme_font(SNAME("status_source"), SNAME("EditorFonts"))); - error_button->add_theme_font_size_override(SNAME("font_size"), get_theme_font_size(SNAME("status_source_size"), SNAME("EditorFonts"))); + error_button->add_theme_color_override("font_color", get_theme_color(SNAME("error_color"), SNAME("Editor"))); + error_button->add_theme_font_override("font", get_theme_font(SNAME("status_source"), SNAME("EditorFonts"))); + error_button->add_theme_font_size_override("font_size", get_theme_font_size(SNAME("status_source_size"), SNAME("EditorFonts"))); warning_button->set_icon(get_theme_icon(SNAME("NodeWarning"), SNAME("EditorIcons"))); - warning_button->add_theme_color_override(SNAME("font_color"), get_theme_color(SNAME("warning_color"), SNAME("Editor"))); - warning_button->add_theme_font_override(SNAME("font"), get_theme_font(SNAME("status_source"), SNAME("EditorFonts"))); - warning_button->add_theme_font_size_override(SNAME("font_size"), get_theme_font_size(SNAME("status_source_size"), SNAME("EditorFonts"))); + warning_button->add_theme_color_override("font_color", get_theme_color(SNAME("warning_color"), SNAME("Editor"))); + warning_button->add_theme_font_override("font", get_theme_font(SNAME("status_source"), SNAME("EditorFonts"))); + warning_button->add_theme_font_size_override("font_size", get_theme_font_size(SNAME("status_source_size"), SNAME("EditorFonts"))); - line_and_col_txt->add_theme_font_override(SNAME("font"), get_theme_font(SNAME("status_source"), SNAME("EditorFonts"))); - line_and_col_txt->add_theme_font_size_override(SNAME("font_size"), get_theme_font_size(SNAME("status_source_size"), SNAME("EditorFonts"))); + line_and_col_txt->add_theme_font_override("font", get_theme_font(SNAME("status_source"), SNAME("EditorFonts"))); + line_and_col_txt->add_theme_font_size_override("font_size", get_theme_font_size(SNAME("status_source_size"), SNAME("EditorFonts"))); if (p_what == NOTIFICATION_ENTER_TREE) { break; @@ -1935,5 +1935,5 @@ CodeTextEditor::CodeTextEditor() { font_resize_timer->connect("timeout", callable_mp(this, &CodeTextEditor::_font_resize_timeout)); EditorSettings::get_singleton()->connect("settings_changed", callable_mp(this, &CodeTextEditor::_on_settings_change)); - add_theme_constant_override(SNAME("separation"), 4 * EDSCALE); + add_theme_constant_override("separation", 4 * EDSCALE); } diff --git a/editor/connections_dialog.cpp b/editor/connections_dialog.cpp index 146eb59623..8efcd60210 100644 --- a/editor/connections_dialog.cpp +++ b/editor/connections_dialog.cpp @@ -381,7 +381,7 @@ void ConnectDialog::init(ConnectionData p_cd, bool p_edit) { void ConnectDialog::popup_dialog(const String &p_for_signal) { from_signal->set_text(p_for_signal); - error_label->add_theme_color_override(SNAME("font_color"), error_label->get_theme_color(SNAME("error_color"), SNAME("Editor"))); + error_label->add_theme_color_override("font_color", error_label->get_theme_color(SNAME("error_color"), SNAME("Editor"))); if (!advanced->is_pressed()) { error_label->set_visible(!_find_first_script(get_tree()->get_edited_scene_root(), get_tree()->get_edited_scene_root())); } @@ -1200,7 +1200,7 @@ ConnectionsDock::ConnectionsDock(EditorNode *p_editor) { tree->connect("item_activated", callable_mp(this, &ConnectionsDock::_tree_item_activated)); tree->connect("item_rmb_selected", callable_mp(this, &ConnectionsDock::_rmb_pressed)); - add_theme_constant_override(SNAME("separation"), 3 * EDSCALE); + add_theme_constant_override("separation", 3 * EDSCALE); EDITOR_DEF("interface/editors/default_signal_callback_name", "_on_{node_name}_{signal_name}"); } diff --git a/editor/create_dialog.cpp b/editor/create_dialog.cpp index 119e81c150..61ec8abacf 100644 --- a/editor/create_dialog.cpp +++ b/editor/create_dialog.cpp @@ -446,14 +446,14 @@ void CreateDialog::_notification(int p_what) { } } -void CreateDialog::select_type(const String &p_type) { +void CreateDialog::select_type(const String &p_type, bool p_center_on_item) { if (!search_options_types.has(p_type)) { return; } TreeItem *to_select = search_options_types[p_type]; to_select->select(0); - search_options->scroll_to_item(to_select); + search_options->scroll_to_item(to_select, p_center_on_item); if (EditorHelp::get_doc_data()->class_list.has(p_type) && !DTR(EditorHelp::get_doc_data()->class_list[p_type].brief_description).is_empty()) { // Display both class name and description, since the help bit may be displayed @@ -503,24 +503,14 @@ Variant CreateDialog::instance_selected() { } else { obj = ClassDB::instantiate(selected->get_text(0)); } - - // Check if any Object-type property should be instantiated. - List<PropertyInfo> pinfo; - ((Object *)obj)->get_property_list(&pinfo); - - for (const PropertyInfo &pi : pinfo) { - if (pi.type == Variant::OBJECT && pi.usage & PROPERTY_USAGE_EDITOR_INSTANTIATE_OBJECT) { - Object *prop = ClassDB::instantiate(pi.class_name); - ((Object *)obj)->set(pi.name, prop); - } - } + EditorNode::get_editor_data().instantiate_object_properties(obj); return obj; } void CreateDialog::_item_selected() { String name = get_selected_type(); - select_type(name); + select_type(name, false); } void CreateDialog::_hide_requested() { @@ -743,7 +733,7 @@ CreateDialog::CreateDialog() { favorites->set_allow_reselect(true); favorites->connect("cell_selected", callable_mp(this, &CreateDialog::_favorite_selected)); favorites->connect("item_activated", callable_mp(this, &CreateDialog::_favorite_activated)); - favorites->add_theme_constant_override(SNAME("draw_guides"), 1); + favorites->add_theme_constant_override("draw_guides", 1); #ifndef _MSC_VER #warning cannot forward drag data to a non control, must be fixed #endif @@ -760,7 +750,7 @@ CreateDialog::CreateDialog() { recent->set_allow_reselect(true); recent->connect("item_selected", callable_mp(this, &CreateDialog::_history_selected)); recent->connect("item_activated", callable_mp(this, &CreateDialog::_history_activated)); - recent->add_theme_constant_override(SNAME("draw_guides"), 1); + recent->add_theme_constant_override("draw_guides", 1); VBoxContainer *vbc = memnew(VBoxContainer); vbc->set_custom_minimum_size(Size2(300, 0) * EDSCALE); diff --git a/editor/create_dialog.h b/editor/create_dialog.h index f905160df3..a82c4db191 100644 --- a/editor/create_dialog.h +++ b/editor/create_dialog.h @@ -79,7 +79,7 @@ class CreateDialog : public ConfirmationDialog { void _sbox_input(const Ref<InputEvent> &p_ie); void _text_changed(const String &p_newtext); - void select_type(const String &p_type); + void select_type(const String &p_type, bool p_center_on_item = true); void _item_selected(); void _hide_requested(); diff --git a/editor/debugger/editor_debugger_node.cpp b/editor/debugger/editor_debugger_node.cpp index 6d9ad9398c..8702e773f8 100644 --- a/editor/debugger/editor_debugger_node.cpp +++ b/editor/debugger/editor_debugger_node.cpp @@ -55,8 +55,8 @@ EditorDebuggerNode::EditorDebuggerNode() { singleton = this; } - add_theme_constant_override(SNAME("margin_left"), -EditorNode::get_singleton()->get_gui_base()->get_theme_stylebox(SNAME("BottomPanelDebuggerOverride"), SNAME("EditorStyles"))->get_margin(SIDE_LEFT)); - add_theme_constant_override(SNAME("margin_right"), -EditorNode::get_singleton()->get_gui_base()->get_theme_stylebox(SNAME("BottomPanelDebuggerOverride"), SNAME("EditorStyles"))->get_margin(SIDE_RIGHT)); + add_theme_constant_override("margin_left", -EditorNode::get_singleton()->get_gui_base()->get_theme_stylebox(SNAME("BottomPanelDebuggerOverride"), SNAME("EditorStyles"))->get_margin(SIDE_LEFT)); + add_theme_constant_override("margin_right", -EditorNode::get_singleton()->get_gui_base()->get_theme_stylebox(SNAME("BottomPanelDebuggerOverride"), SNAME("EditorStyles"))->get_margin(SIDE_RIGHT)); tabs = memnew(TabContainer); tabs->set_tab_alignment(TabContainer::ALIGNMENT_LEFT); @@ -66,7 +66,7 @@ EditorDebuggerNode::EditorDebuggerNode() { Ref<StyleBoxEmpty> empty; empty.instantiate(); - tabs->add_theme_style_override(SNAME("panel"), empty); + tabs->add_theme_style_override("panel", empty); auto_switch_remote_scene_tree = EDITOR_DEF("debugger/auto_switch_to_remote_scene_tree", false); _add_debugger(); @@ -113,7 +113,7 @@ ScriptEditorDebugger *EditorDebuggerNode::_add_debugger() { if (tabs->get_tab_count() > 1) { node->clear_style(); tabs->set_tabs_visible(true); - tabs->add_theme_style_override(SNAME("panel"), EditorNode::get_singleton()->get_gui_base()->get_theme_stylebox(SNAME("DebuggerPanel"), SNAME("EditorStyles"))); + tabs->add_theme_style_override("panel", EditorNode::get_singleton()->get_gui_base()->get_theme_stylebox(SNAME("DebuggerPanel"), SNAME("EditorStyles"))); } if (!debugger_plugins.is_empty()) { @@ -233,10 +233,10 @@ void EditorDebuggerNode::_notification(int p_what) { switch (p_what) { case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: { if (tabs->get_tab_count() > 1) { - add_theme_constant_override(SNAME("margin_left"), -EditorNode::get_singleton()->get_gui_base()->get_theme_stylebox(SNAME("BottomPanelDebuggerOverride"), SNAME("EditorStyles"))->get_margin(SIDE_LEFT)); - add_theme_constant_override(SNAME("margin_right"), -EditorNode::get_singleton()->get_gui_base()->get_theme_stylebox(SNAME("BottomPanelDebuggerOverride"), SNAME("EditorStyles"))->get_margin(SIDE_RIGHT)); + add_theme_constant_override("margin_left", -EditorNode::get_singleton()->get_gui_base()->get_theme_stylebox(SNAME("BottomPanelDebuggerOverride"), SNAME("EditorStyles"))->get_margin(SIDE_LEFT)); + add_theme_constant_override("margin_right", -EditorNode::get_singleton()->get_gui_base()->get_theme_stylebox(SNAME("BottomPanelDebuggerOverride"), SNAME("EditorStyles"))->get_margin(SIDE_RIGHT)); - tabs->add_theme_style_override(SNAME("panel"), EditorNode::get_singleton()->get_gui_base()->get_theme_stylebox(SNAME("DebuggerPanel"), SNAME("EditorStyles"))); + tabs->add_theme_style_override("panel", EditorNode::get_singleton()->get_gui_base()->get_theme_stylebox(SNAME("DebuggerPanel"), SNAME("EditorStyles"))); } } break; case NOTIFICATION_READY: { @@ -271,20 +271,20 @@ void EditorDebuggerNode::_notification(int p_what) { if (error_count == 0 && warning_count == 0) { debugger_button->set_text(TTR("Debugger")); - debugger_button->remove_theme_color_override(SNAME("font_color")); + debugger_button->remove_theme_color_override("font_color"); debugger_button->set_icon(Ref<Texture2D>()); } else { debugger_button->set_text(TTR("Debugger") + " (" + itos(error_count + warning_count) + ")"); if (error_count >= 1 && warning_count >= 1) { debugger_button->set_icon(get_theme_icon(SNAME("ErrorWarning"), SNAME("EditorIcons"))); // Use error color to represent the highest level of severity reported. - debugger_button->add_theme_color_override(SNAME("font_color"), get_theme_color(SNAME("error_color"), SNAME("Editor"))); + debugger_button->add_theme_color_override("font_color", get_theme_color(SNAME("error_color"), SNAME("Editor"))); } else if (error_count >= 1) { debugger_button->set_icon(get_theme_icon(SNAME("Error"), SNAME("EditorIcons"))); - debugger_button->add_theme_color_override(SNAME("font_color"), get_theme_color(SNAME("error_color"), SNAME("Editor"))); + debugger_button->add_theme_color_override("font_color", get_theme_color(SNAME("error_color"), SNAME("Editor"))); } else { debugger_button->set_icon(get_theme_icon(SNAME("Warning"), SNAME("EditorIcons"))); - debugger_button->add_theme_color_override(SNAME("font_color"), get_theme_color(SNAME("warning_color"), SNAME("Editor"))); + debugger_button->add_theme_color_override("font_color", get_theme_color(SNAME("warning_color"), SNAME("Editor"))); } } last_error_count = error_count; @@ -683,7 +683,7 @@ EditorDebuggerNode::CameraOverride EditorDebuggerNode::get_camera_override() { void EditorDebuggerNode::add_debugger_plugin(const Ref<Script> &p_script) { ERR_FAIL_COND_MSG(debugger_plugins.has(p_script), "Debugger plugin already exists."); ERR_FAIL_COND_MSG(p_script.is_null(), "Debugger plugin script is null"); - ERR_FAIL_COND_MSG(String(p_script->get_instance_base_type()) == "", "Debugger plugin script has error."); + ERR_FAIL_COND_MSG(p_script->get_instance_base_type() == StringName(), "Debugger plugin script has error."); ERR_FAIL_COND_MSG(String(p_script->get_instance_base_type()) != "EditorDebuggerPlugin", "Base type of debugger plugin is not 'EditorDebuggerPlugin'."); ERR_FAIL_COND_MSG(!p_script->is_tool(), "Debugger plugin script is not in tool mode."); debugger_plugins.insert(p_script); diff --git a/editor/debugger/editor_network_profiler.cpp b/editor/debugger/editor_network_profiler.cpp index c04ec465e5..698e950f57 100644 --- a/editor/debugger/editor_network_profiler.cpp +++ b/editor/debugger/editor_network_profiler.cpp @@ -46,8 +46,8 @@ void EditorNetworkProfiler::_notification(int p_what) { outgoing_bandwidth_text->set_right_icon(get_theme_icon(SNAME("ArrowUp"), SNAME("EditorIcons"))); // This needs to be done here to set the faded color when the profiler is first opened - incoming_bandwidth_text->add_theme_color_override(SNAME("font_uneditable_color"), get_theme_color(SNAME("font_color"), SNAME("Editor")) * Color(1, 1, 1, 0.5)); - outgoing_bandwidth_text->add_theme_color_override(SNAME("font_uneditable_color"), get_theme_color(SNAME("font_color"), SNAME("Editor")) * Color(1, 1, 1, 0.5)); + incoming_bandwidth_text->add_theme_color_override("font_uneditable_color", get_theme_color(SNAME("font_color"), SNAME("Editor")) * Color(1, 1, 1, 0.5)); + outgoing_bandwidth_text->add_theme_color_override("font_uneditable_color", get_theme_color(SNAME("font_color"), SNAME("Editor")) * Color(1, 1, 1, 0.5)); } } @@ -126,7 +126,7 @@ bool EditorNetworkProfiler::is_profiling() { EditorNetworkProfiler::EditorNetworkProfiler() { HBoxContainer *hb = memnew(HBoxContainer); - hb->add_theme_constant_override(SNAME("separation"), 8 * EDSCALE); + hb->add_theme_constant_override("separation", 8 * EDSCALE); add_child(hb); activate = memnew(Button); diff --git a/editor/debugger/editor_profiler.cpp b/editor/debugger/editor_profiler.cpp index 0a10bc95cc..da1d6a54f2 100644 --- a/editor/debugger/editor_profiler.cpp +++ b/editor/debugger/editor_profiler.cpp @@ -618,7 +618,7 @@ EditorProfiler::EditorProfiler() { hb->add_child(cursor_metric_edit); cursor_metric_edit->connect("value_changed", callable_mp(this, &EditorProfiler::_cursor_metric_changed)); - hb->add_theme_constant_override(SNAME("separation"), 8 * EDSCALE); + hb->add_theme_constant_override("separation", 8 * EDSCALE); h_split = memnew(HSplitContainer); add_child(h_split); diff --git a/editor/debugger/editor_visual_profiler.cpp b/editor/debugger/editor_visual_profiler.cpp index 5f61edcf8c..3cb5d3513d 100644 --- a/editor/debugger/editor_visual_profiler.cpp +++ b/editor/debugger/editor_visual_profiler.cpp @@ -758,7 +758,7 @@ EditorVisualProfiler::EditorVisualProfiler() { hb->add_child(cursor_metric_edit); cursor_metric_edit->connect("value_changed", callable_mp(this, &EditorVisualProfiler::_cursor_metric_changed)); - hb->add_theme_constant_override(SNAME("separation"), 8 * EDSCALE); + hb->add_theme_constant_override("separation", 8 * EDSCALE); h_split = memnew(HSplitContainer); add_child(h_split); diff --git a/editor/debugger/script_editor_debugger.cpp b/editor/debugger/script_editor_debugger.cpp index d0be846f76..6aedfa6ccb 100644 --- a/editor/debugger/script_editor_debugger.cpp +++ b/editor/debugger/script_editor_debugger.cpp @@ -147,7 +147,7 @@ void ScriptEditorDebugger::update_tabs() { } void ScriptEditorDebugger::clear_style() { - tabs->remove_theme_style_override(SNAME("panel")); + tabs->remove_theme_style_override("panel"); } void ScriptEditorDebugger::save_node(ObjectID p_id, const String &p_file) { @@ -762,13 +762,13 @@ void ScriptEditorDebugger::_parse_message(const String &p_msg, const Array &p_da void ScriptEditorDebugger::_set_reason_text(const String &p_reason, MessageType p_type) { switch (p_type) { case MESSAGE_ERROR: - reason->add_theme_color_override(SNAME("font_color"), get_theme_color(SNAME("error_color"), SNAME("Editor"))); + reason->add_theme_color_override("font_color", get_theme_color(SNAME("error_color"), SNAME("Editor"))); break; case MESSAGE_WARNING: - reason->add_theme_color_override(SNAME("font_color"), get_theme_color(SNAME("warning_color"), SNAME("Editor"))); + reason->add_theme_color_override("font_color", get_theme_color(SNAME("warning_color"), SNAME("Editor"))); break; default: - reason->add_theme_color_override(SNAME("font_color"), get_theme_color(SNAME("success_color"), SNAME("Editor"))); + reason->add_theme_color_override("font_color", get_theme_color(SNAME("success_color"), SNAME("Editor"))); } reason->set_text(p_reason); reason->set_tooltip(p_reason.word_wrap(80)); @@ -793,7 +793,7 @@ void ScriptEditorDebugger::_notification(int p_what) { vmem_export->set_icon(get_theme_icon(SNAME("Save"), SNAME("EditorIcons"))); search->set_right_icon(get_theme_icon(SNAME("Search"), SNAME("EditorIcons"))); - reason->add_theme_color_override(SNAME("font_color"), get_theme_color(SNAME("error_color"), SNAME("Editor"))); + reason->add_theme_color_override("font_color", get_theme_color(SNAME("error_color"), SNAME("Editor"))); } break; case NOTIFICATION_PROCESS: { @@ -855,8 +855,8 @@ void ScriptEditorDebugger::_notification(int p_what) { }; } break; case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: { - if (tabs->has_theme_stylebox_override(SNAME("panel"))) { - tabs->add_theme_style_override(SNAME("panel"), editor->get_gui_base()->get_theme_stylebox(SNAME("DebuggerPanel"), SNAME("EditorStyles"))); + if (tabs->has_theme_stylebox_override("panel")) { + tabs->add_theme_style_override("panel", editor->get_gui_base()->get_theme_stylebox(SNAME("DebuggerPanel"), SNAME("EditorStyles"))); } copy->set_icon(get_theme_icon(SNAME("ActionCopy"), SNAME("EditorIcons"))); @@ -1665,7 +1665,7 @@ ScriptEditorDebugger::ScriptEditorDebugger(EditorNode *p_editor) { tabs = memnew(TabContainer); tabs->set_tab_alignment(TabContainer::ALIGNMENT_LEFT); - tabs->add_theme_style_override(SNAME("panel"), editor->get_gui_base()->get_theme_stylebox(SNAME("DebuggerPanel"), SNAME("EditorStyles"))); + tabs->add_theme_style_override("panel", editor->get_gui_base()->get_theme_stylebox(SNAME("DebuggerPanel"), SNAME("EditorStyles"))); tabs->connect("tab_changed", callable_mp(this, &ScriptEditorDebugger::_tab_changed)); add_child(tabs); diff --git a/editor/editor_about.cpp b/editor/editor_about.cpp index 267fe875ca..54377971c6 100644 --- a/editor/editor_about.cpp +++ b/editor/editor_about.cpp @@ -43,12 +43,12 @@ static const String META_TEXT_TO_COPY = "text_to_copy"; void EditorAbout::_theme_changed() { const Ref<Font> font = get_theme_font(SNAME("source"), SNAME("EditorFonts")); const int font_size = get_theme_font_size(SNAME("source_size"), SNAME("EditorFonts")); - _tpl_text->add_theme_font_override(SNAME("normal_font"), font); - _tpl_text->add_theme_font_size_override(SNAME("normal_font_size"), font_size); - _tpl_text->add_theme_constant_override(SNAME("line_separation"), 6 * EDSCALE); - _license_text->add_theme_font_override(SNAME("normal_font"), font); - _license_text->add_theme_font_size_override(SNAME("normal_font_size"), font_size); - _license_text->add_theme_constant_override(SNAME("line_separation"), 6 * EDSCALE); + _tpl_text->add_theme_font_override("normal_font", font); + _tpl_text->add_theme_font_size_override("normal_font_size", font_size); + _tpl_text->add_theme_constant_override("line_separation", 6 * EDSCALE); + _license_text->add_theme_font_override("normal_font", font); + _license_text->add_theme_font_size_override("normal_font_size", font_size); + _license_text->add_theme_constant_override("line_separation", 6 * EDSCALE); _logo->set_texture(get_theme_icon(SNAME("Logo"), SNAME("EditorIcons"))); } @@ -101,7 +101,7 @@ ScrollContainer *EditorAbout::_populate_list(const String &p_name, const List<St il->set_same_column_width(true); il->set_auto_height(true); il->set_mouse_filter(Control::MOUSE_FILTER_IGNORE); - il->add_theme_constant_override(SNAME("hseparation"), 16 * EDSCALE); + il->add_theme_constant_override("hseparation", 16 * EDSCALE); while (*names_ptr) { il->add_item(String::utf8(*names_ptr++), nullptr, false); } @@ -126,7 +126,7 @@ EditorAbout::EditorAbout() { HBoxContainer *hbc = memnew(HBoxContainer); hbc->set_h_size_flags(Control::SIZE_EXPAND_FILL); hbc->set_alignment(BoxContainer::ALIGNMENT_CENTER); - hbc->add_theme_constant_override(SNAME("separation"), 30 * EDSCALE); + hbc->add_theme_constant_override("separation", 30 * EDSCALE); add_child(vbc); vbc->add_child(hbc); diff --git a/editor/editor_audio_buses.cpp b/editor/editor_audio_buses.cpp index 9434a4e67b..5e4e375db4 100644 --- a/editor/editor_audio_buses.cpp +++ b/editor/editor_audio_buses.cpp @@ -79,17 +79,17 @@ void EditorAudioBus::_notification(int p_what) { Color bypass_color = EditorSettings::get_singleton()->is_dark_theme() ? Color(0.13, 0.8, 1.0) : Color(0.44, 0.87, 1.0); solo->set_icon(get_theme_icon(SNAME("AudioBusSolo"), SNAME("EditorIcons"))); - solo->add_theme_color_override(SNAME("icon_pressed_color"), solo_color); + solo->add_theme_color_override("icon_pressed_color", solo_color); mute->set_icon(get_theme_icon(SNAME("AudioBusMute"), SNAME("EditorIcons"))); - mute->add_theme_color_override(SNAME("icon_pressed_color"), mute_color); + mute->add_theme_color_override("icon_pressed_color", mute_color); bypass->set_icon(get_theme_icon(SNAME("AudioBusBypass"), SNAME("EditorIcons"))); - bypass->add_theme_color_override(SNAME("icon_pressed_color"), bypass_color); + bypass->add_theme_color_override("icon_pressed_color", bypass_color); bus_options->set_icon(get_theme_icon(SNAME("GuiTabMenuHl"), SNAME("EditorIcons"))); - audio_value_preview_label->add_theme_color_override(SNAME("font_color"), get_theme_color(SNAME("font_color"), SNAME("TooltipLabel"))); - audio_value_preview_label->add_theme_color_override(SNAME("font_shadow_color"), get_theme_color(SNAME("font_shadow_color"), SNAME("TooltipLabel"))); - audio_value_preview_box->add_theme_style_override(SNAME("panel"), get_theme_stylebox(SNAME("panel"), SNAME("TooltipPanel"))); + audio_value_preview_label->add_theme_color_override("font_color", get_theme_color(SNAME("font_color"), SNAME("TooltipLabel"))); + audio_value_preview_label->add_theme_color_override("font_shadow_color", get_theme_color(SNAME("font_shadow_color"), SNAME("TooltipLabel"))); + audio_value_preview_box->add_theme_style_override("panel", get_theme_stylebox(SNAME("panel"), SNAME("TooltipPanel"))); } break; case NOTIFICATION_READY: { @@ -574,7 +574,7 @@ Variant EditorAudioBus::get_drag_data(const Point2 &p_point) { Panel *p = memnew(Panel); c->add_child(p); p->set_modulate(Color(1, 1, 1, 0.7)); - p->add_theme_style_override(SNAME("panel"), get_theme_stylebox(SNAME("focus"), SNAME("Button"))); + p->add_theme_style_override("panel", get_theme_stylebox(SNAME("focus"), SNAME("Button"))); p->set_size(get_size()); p->set_position(-p_point); set_drag_preview(c); @@ -804,10 +804,10 @@ EditorAudioBus::EditorAudioBus(EditorAudioBuses *p_buses, bool p_is_master) { Ref<StyleBoxEmpty> sbempty = memnew(StyleBoxEmpty); for (int i = 0; i < hbc->get_child_count(); i++) { Control *child = Object::cast_to<Control>(hbc->get_child(i)); - child->add_theme_style_override(SNAME("normal"), sbempty); - child->add_theme_style_override(SNAME("hover"), sbempty); - child->add_theme_style_override(SNAME("focus"), sbempty); - child->add_theme_style_override(SNAME("pressed"), sbempty); + child->add_theme_style_override("normal", sbempty); + child->add_theme_style_override("hover", sbempty); + child->add_theme_style_override("focus", sbempty); + child->add_theme_style_override("pressed", sbempty); } HSeparator *separator = memnew(HSeparator); @@ -1013,7 +1013,7 @@ void EditorAudioBuses::_notification(int p_what) { switch (p_what) { case NOTIFICATION_ENTER_TREE: case NOTIFICATION_THEME_CHANGED: { - bus_scroll->add_theme_style_override(SNAME("bg"), get_theme_stylebox(SNAME("bg"), SNAME("Tree"))); + bus_scroll->add_theme_style_override("bg", get_theme_stylebox(SNAME("bg"), SNAME("Tree"))); } break; case NOTIFICATION_READY: { _update_buses(); diff --git a/editor/editor_autoload_settings.cpp b/editor/editor_autoload_settings.cpp index d27d0c8b53..6d31141be7 100644 --- a/editor/editor_autoload_settings.cpp +++ b/editor/editor_autoload_settings.cpp @@ -362,21 +362,21 @@ Node *EditorAutoloadSettings::_create_autoload(const String &p_path) { RES res = ResourceLoader::load(p_path); ERR_FAIL_COND_V_MSG(res.is_null(), nullptr, "Can't autoload: " + p_path + "."); Node *n = nullptr; - if (res->is_class("PackedScene")) { - Ref<PackedScene> ps = res; - n = ps->instantiate(); - } else if (res->is_class("Script")) { - Ref<Script> s = res; - StringName ibt = s->get_instance_base_type(); + Ref<PackedScene> scn = res; + Ref<Script> script = res; + if (scn.is_valid()) { + n = scn->instantiate(); + } else if (script.is_valid()) { + StringName ibt = script->get_instance_base_type(); bool valid_type = ClassDB::is_parent_class(ibt, "Node"); ERR_FAIL_COND_V_MSG(!valid_type, nullptr, "Script does not inherit a Node: " + p_path + "."); Object *obj = ClassDB::instantiate(ibt); - ERR_FAIL_COND_V_MSG(obj == nullptr, nullptr, "Cannot instance script for AutoLoad, expected 'Node' inheritance, got: " + String(ibt) + "."); + ERR_FAIL_COND_V_MSG(!obj, nullptr, "Cannot instance script for AutoLoad, expected 'Node' inheritance, got: " + String(ibt) + "."); n = Object::cast_to<Node>(obj); - n->set_script(s); + n->set_script(script); } ERR_FAIL_COND_V_MSG(!n, nullptr, "Path in AutoLoad not a node or script: " + p_path + "."); @@ -839,7 +839,7 @@ EditorAutoloadSettings::EditorAutoloadSettings() { error_message = memnew(Label); error_message->hide(); error_message->set_horizontal_alignment(HORIZONTAL_ALIGNMENT_RIGHT); - error_message->add_theme_color_override(SNAME("font_color"), EditorNode::get_singleton()->get_gui_base()->get_theme_color(SNAME("error_color"), SNAME("Editor"))); + error_message->add_theme_color_override("font_color", EditorNode::get_singleton()->get_gui_base()->get_theme_color(SNAME("error_color"), SNAME("Editor"))); add_child(error_message); Label *l = memnew(Label); diff --git a/editor/editor_data.cpp b/editor/editor_data.cpp index ee53f4b343..625330ef37 100644 --- a/editor/editor_data.cpp +++ b/editor/editor_data.cpp @@ -520,6 +520,21 @@ void EditorData::remove_custom_type(const String &p_type) { } } +void EditorData::instantiate_object_properties(Object *p_object) { + ERR_FAIL_NULL(p_object); + // Check if any Object-type property should be instantiated. + List<PropertyInfo> pinfo; + p_object->get_property_list(&pinfo); + + for (List<PropertyInfo>::Element *E = pinfo.front(); E; E = E->next()) { + PropertyInfo pi = E->get(); + if (pi.type == Variant::OBJECT && pi.usage & PROPERTY_USAGE_EDITOR_INSTANTIATE_OBJECT) { + Object *prop = ClassDB::instantiate(pi.class_name); + p_object->set(pi.name, prop); + } + } +} + int EditorData::add_edited_scene(int p_at_pos) { if (p_at_pos < 0) { p_at_pos = edited_scene.size(); diff --git a/editor/editor_data.h b/editor/editor_data.h index ccf641ff26..e485d47bf6 100644 --- a/editor/editor_data.h +++ b/editor/editor_data.h @@ -182,6 +182,8 @@ public: void remove_custom_type(const String &p_type); const Map<String, Vector<CustomType>> &get_custom_types() const { return custom_types; } + void instantiate_object_properties(Object *p_object); + int add_edited_scene(int p_at_pos); void move_edited_scene_index(int p_idx, int p_to_idx); void remove_scene(int p_idx); diff --git a/editor/editor_feature_profile.cpp b/editor/editor_feature_profile.cpp index 1ab532eb32..2fc29c46af 100644 --- a/editor/editor_feature_profile.cpp +++ b/editor/editor_feature_profile.cpp @@ -955,7 +955,7 @@ EditorFeatureProfileManager::EditorFeatureProfileManager() { // Add some spacing above the help label. Ref<StyleBoxEmpty> sb = memnew(StyleBoxEmpty); sb->set_default_margin(SIDE_TOP, 20 * EDSCALE); - no_profile_selected_help->add_theme_style_override(SNAME("normal"), sb); + no_profile_selected_help->add_theme_style_override("normal", sb); no_profile_selected_help->set_horizontal_alignment(HORIZONTAL_ALIGNMENT_CENTER); no_profile_selected_help->set_v_size_flags(Control::SIZE_EXPAND_FILL); h_split->add_child(no_profile_selected_help); diff --git a/editor/editor_fonts.cpp b/editor/editor_fonts.cpp index db87801fbb..0c9a7b2972 100644 --- a/editor/editor_fonts.cpp +++ b/editor/editor_fonts.cpp @@ -279,67 +279,67 @@ void editor_register_fonts(Ref<Theme> p_theme) { p_theme->set_default_font(df); // Default theme font p_theme->set_default_font_size(default_font_size); - p_theme->set_font_size(SNAME("main_size"), SNAME("EditorFonts"), default_font_size); - p_theme->set_font(SNAME("main"), SNAME("EditorFonts"), df); + p_theme->set_font_size("main_size", "EditorFonts", default_font_size); + p_theme->set_font("main", "EditorFonts", df); // Bold font MAKE_BOLD_FONT(df_bold, String()); - p_theme->set_font_size(SNAME("bold_size"), SNAME("EditorFonts"), default_font_size); - p_theme->set_font(SNAME("bold"), SNAME("EditorFonts"), df_bold); + p_theme->set_font_size("bold_size", "EditorFonts", default_font_size); + p_theme->set_font("bold", "EditorFonts", df_bold); // Title font - p_theme->set_font_size(SNAME("title_size"), SNAME("EditorFonts"), default_font_size + 1 * EDSCALE); - p_theme->set_font(SNAME("title"), SNAME("EditorFonts"), df_bold); + p_theme->set_font_size("title_size", "EditorFonts", default_font_size + 1 * EDSCALE); + p_theme->set_font("title", "EditorFonts", df_bold); - p_theme->set_font_size(SNAME("main_button_font_size"), SNAME("EditorFonts"), default_font_size + 1 * EDSCALE); - p_theme->set_font(SNAME("main_button_font"), SNAME("EditorFonts"), df_bold); + p_theme->set_font_size("main_button_font_size", "EditorFonts", default_font_size + 1 * EDSCALE); + p_theme->set_font("main_button_font", "EditorFonts", df_bold); - p_theme->set_font(SNAME("font"), SNAME("Label"), df); + p_theme->set_font("font", "Label", df); - p_theme->set_type_variation(SNAME("HeaderSmall"), SNAME("Label")); - p_theme->set_font(SNAME("font"), SNAME("HeaderSmall"), df_bold); - p_theme->set_font_size(SNAME("font_size"), SNAME("HeaderSmall"), default_font_size); + p_theme->set_type_variation("HeaderSmall", "Label"); + p_theme->set_font("font", "HeaderSmall", df_bold); + p_theme->set_font_size("font_size", "HeaderSmall", default_font_size); - p_theme->set_type_variation(SNAME("HeaderMedium"), SNAME("Label")); - p_theme->set_font(SNAME("font"), SNAME("HeaderMedium"), df_bold); - p_theme->set_font_size(SNAME("font_size"), SNAME("HeaderMedium"), default_font_size + 1 * EDSCALE); + p_theme->set_type_variation("HeaderMedium", "Label"); + p_theme->set_font("font", "HeaderMedium", df_bold); + p_theme->set_font_size("font_size", "HeaderMedium", default_font_size + 1 * EDSCALE); - p_theme->set_type_variation(SNAME("HeaderLarge"), SNAME("Label")); - p_theme->set_font(SNAME("font"), SNAME("HeaderLarge"), df_bold); - p_theme->set_font_size(SNAME("font_size"), SNAME("HeaderLarge"), default_font_size + 3 * EDSCALE); + p_theme->set_type_variation("HeaderLarge", "Label"); + p_theme->set_font("font", "HeaderLarge", df_bold); + p_theme->set_font_size("font_size", "HeaderLarge", default_font_size + 3 * EDSCALE); // Documentation fonts String code_font_custom_variations = EditorSettings::get_singleton()->get("interface/editor/code_font_custom_variations"); MAKE_SOURCE_FONT(df_code, code_font_custom_variations); - p_theme->set_font_size(SNAME("doc_size"), SNAME("EditorFonts"), int(EDITOR_GET("text_editor/help/help_font_size")) * EDSCALE); - p_theme->set_font(SNAME("doc"), SNAME("EditorFonts"), df); - p_theme->set_font_size(SNAME("doc_bold_size"), SNAME("EditorFonts"), int(EDITOR_GET("text_editor/help/help_font_size")) * EDSCALE); - p_theme->set_font(SNAME("doc_bold"), SNAME("EditorFonts"), df_bold); - p_theme->set_font_size(SNAME("doc_title_size"), SNAME("EditorFonts"), int(EDITOR_GET("text_editor/help/help_title_font_size")) * EDSCALE); - p_theme->set_font(SNAME("doc_title"), SNAME("EditorFonts"), df_bold); - p_theme->set_font_size(SNAME("doc_source_size"), SNAME("EditorFonts"), int(EDITOR_GET("text_editor/help/help_source_font_size")) * EDSCALE); - p_theme->set_font(SNAME("doc_source"), SNAME("EditorFonts"), df_code); - p_theme->set_font_size(SNAME("doc_keyboard_size"), SNAME("EditorFonts"), (int(EDITOR_GET("text_editor/help/help_source_font_size")) - 1) * EDSCALE); - p_theme->set_font(SNAME("doc_keyboard"), SNAME("EditorFonts"), df_code); + p_theme->set_font_size("doc_size", "EditorFonts", int(EDITOR_GET("text_editor/help/help_font_size")) * EDSCALE); + p_theme->set_font("doc", "EditorFonts", df); + p_theme->set_font_size("doc_bold_size", "EditorFonts", int(EDITOR_GET("text_editor/help/help_font_size")) * EDSCALE); + p_theme->set_font("doc_bold", "EditorFonts", df_bold); + p_theme->set_font_size("doc_title_size", "EditorFonts", int(EDITOR_GET("text_editor/help/help_title_font_size")) * EDSCALE); + p_theme->set_font("doc_title", "EditorFonts", df_bold); + p_theme->set_font_size("doc_source_size", "EditorFonts", int(EDITOR_GET("text_editor/help/help_source_font_size")) * EDSCALE); + p_theme->set_font("doc_source", "EditorFonts", df_code); + p_theme->set_font_size("doc_keyboard_size", "EditorFonts", (int(EDITOR_GET("text_editor/help/help_source_font_size")) - 1) * EDSCALE); + p_theme->set_font("doc_keyboard", "EditorFonts", df_code); // Ruler font - p_theme->set_font_size(SNAME("rulers_size"), SNAME("EditorFonts"), 8 * EDSCALE); - p_theme->set_font(SNAME("rulers"), SNAME("EditorFonts"), df); + p_theme->set_font_size("rulers_size", "EditorFonts", 8 * EDSCALE); + p_theme->set_font("rulers", "EditorFonts", df); // Rotation widget font - p_theme->set_font_size(SNAME("rotation_control_size"), SNAME("EditorFonts"), 14 * EDSCALE); - p_theme->set_font(SNAME("rotation_control"), SNAME("EditorFonts"), df); + p_theme->set_font_size("rotation_control_size", "EditorFonts", 14 * EDSCALE); + p_theme->set_font("rotation_control", "EditorFonts", df); // Code font - p_theme->set_font_size(SNAME("source_size"), SNAME("EditorFonts"), int(EDITOR_GET("interface/editor/code_font_size")) * EDSCALE); - p_theme->set_font(SNAME("source"), SNAME("EditorFonts"), df_code); + p_theme->set_font_size("source_size", "EditorFonts", int(EDITOR_GET("interface/editor/code_font_size")) * EDSCALE); + p_theme->set_font("source", "EditorFonts", df_code); - p_theme->set_font_size(SNAME("expression_size"), SNAME("EditorFonts"), (int(EDITOR_GET("interface/editor/code_font_size")) - 1) * EDSCALE); - p_theme->set_font(SNAME("expression"), SNAME("EditorFonts"), df_code); + p_theme->set_font_size("expression_size", "EditorFonts", (int(EDITOR_GET("interface/editor/code_font_size")) - 1) * EDSCALE); + p_theme->set_font("expression", "EditorFonts", df_code); - p_theme->set_font_size(SNAME("output_source_size"), SNAME("EditorFonts"), int(EDITOR_GET("run/output/font_size")) * EDSCALE); - p_theme->set_font(SNAME("output_source"), SNAME("EditorFonts"), df_code); + p_theme->set_font_size("output_source_size", "EditorFonts", int(EDITOR_GET("run/output/font_size")) * EDSCALE); + p_theme->set_font("output_source", "EditorFonts", df_code); - p_theme->set_font_size(SNAME("status_source_size"), SNAME("EditorFonts"), default_font_size); - p_theme->set_font(SNAME("status_source"), SNAME("EditorFonts"), df_code); + p_theme->set_font_size("status_source_size", "EditorFonts", default_font_size); + p_theme->set_font("status_source", "EditorFonts", df_code); } diff --git a/editor/editor_help.cpp b/editor/editor_help.cpp index dd5eeac4e5..e80e9c43b0 100644 --- a/editor/editor_help.cpp +++ b/editor/editor_help.cpp @@ -54,10 +54,10 @@ void EditorHelp::_update_theme() { qualifier_color = get_theme_color(SNAME("qualifier_color"), SNAME("EditorHelp")); type_color = get_theme_color(SNAME("type_color"), SNAME("EditorHelp")); - class_desc->add_theme_color_override(SNAME("selection_color"), get_theme_color(SNAME("selection_color"), SNAME("EditorHelp"))); - class_desc->add_theme_constant_override(SNAME("line_separation"), get_theme_constant(SNAME("line_separation"), SNAME("EditorHelp"))); - class_desc->add_theme_constant_override(SNAME("table_hseparation"), get_theme_constant(SNAME("table_hseparation"), SNAME("EditorHelp"))); - class_desc->add_theme_constant_override(SNAME("table_vseparation"), get_theme_constant(SNAME("table_vseparation"), SNAME("EditorHelp"))); + class_desc->add_theme_color_override("selection_color", get_theme_color(SNAME("selection_color"), SNAME("EditorHelp"))); + class_desc->add_theme_constant_override("line_separation", get_theme_constant(SNAME("line_separation"), SNAME("EditorHelp"))); + class_desc->add_theme_constant_override("table_hseparation", get_theme_constant(SNAME("table_hseparation"), SNAME("EditorHelp"))); + class_desc->add_theme_constant_override("table_vseparation", get_theme_constant(SNAME("table_vseparation"), SNAME("EditorHelp"))); doc_font = get_theme_font(SNAME("doc"), SNAME("EditorFonts")); doc_bold_font = get_theme_font(SNAME("doc_bold"), SNAME("EditorFonts")); @@ -176,7 +176,7 @@ void EditorHelp::_class_desc_resized(bool p_force_update_theme) { Ref<StyleBox> class_desc_stylebox = EditorNode::get_singleton()->get_theme_base()->get_theme_stylebox(SNAME("normal"), SNAME("RichTextLabel"))->duplicate(); class_desc_stylebox->set_default_margin(SIDE_LEFT, display_margin); class_desc_stylebox->set_default_margin(SIDE_RIGHT, display_margin); - class_desc->add_theme_style_override(SNAME("normal"), class_desc_stylebox); + class_desc->add_theme_style_override("normal", class_desc_stylebox); } } @@ -1872,7 +1872,7 @@ EditorHelp::EditorHelp() { class_desc = memnew(RichTextLabel); add_child(class_desc); class_desc->set_v_size_flags(SIZE_EXPAND_FILL); - class_desc->add_theme_color_override(SNAME("selection_color"), get_theme_color(SNAME("accent_color"), SNAME("Editor")) * Color(1, 1, 1, 0.4)); + class_desc->add_theme_color_override("selection_color", get_theme_color(SNAME("accent_color"), SNAME("Editor")) * Color(1, 1, 1, 0.4)); class_desc->connect("meta_clicked", callable_mp(this, &EditorHelp::_class_desc_select)); class_desc->connect("gui_input", callable_mp(this, &EditorHelp::_class_desc_input)); @@ -1951,7 +1951,7 @@ void EditorHelpBit::_notification(int p_what) { switch (p_what) { case NOTIFICATION_ENTER_TREE: case NOTIFICATION_THEME_CHANGED: { - rich_text->add_theme_color_override(SNAME("selection_color"), get_theme_color(SNAME("selection_color"), SNAME("EditorHelp"))); + rich_text->add_theme_color_override("selection_color", get_theme_color(SNAME("selection_color"), SNAME("EditorHelp"))); rich_text->clear(); _add_text_to_rt(text, rich_text); rich_text->reset_size(); // Force recalculating size after parsing bbcode. @@ -2039,7 +2039,7 @@ void FindBar::_notification(int p_what) { hide_button->set_hover_texture(get_theme_icon(SNAME("Close"), SNAME("EditorIcons"))); hide_button->set_pressed_texture(get_theme_icon(SNAME("Close"), SNAME("EditorIcons"))); hide_button->set_custom_minimum_size(hide_button->get_normal_texture()->get_size()); - matches_label->add_theme_color_override(SNAME("font_color"), results_count > 0 ? get_theme_color(SNAME("font_color"), SNAME("Label")) : get_theme_color(SNAME("error_color"), SNAME("Editor"))); + matches_label->add_theme_color_override("font_color", results_count > 0 ? get_theme_color(SNAME("font_color"), SNAME("Label")) : get_theme_color(SNAME("error_color"), SNAME("Editor"))); } break; case NOTIFICATION_VISIBILITY_CHANGED: { set_process_unhandled_input(is_visible_in_tree()); @@ -2110,7 +2110,7 @@ void FindBar::_update_matches_label() { } else { matches_label->show(); - matches_label->add_theme_color_override(SNAME("font_color"), results_count > 0 ? get_theme_color(SNAME("font_color"), SNAME("Label")) : get_theme_color(SNAME("error_color"), SNAME("Editor"))); + matches_label->add_theme_color_override("font_color", results_count > 0 ? get_theme_color(SNAME("font_color"), SNAME("Label")) : get_theme_color(SNAME("error_color"), SNAME("Editor"))); matches_label->set_text(vformat(results_count == 1 ? TTR("%d match.") : TTR("%d matches."), results_count)); } } diff --git a/editor/editor_help_search.cpp b/editor/editor_help_search.cpp index 550e6ee72b..29bf22a478 100644 --- a/editor/editor_help_search.cpp +++ b/editor/editor_help_search.cpp @@ -38,7 +38,7 @@ void EditorHelpSearch::_update_icons() { search_box->set_right_icon(results_tree->get_theme_icon(SNAME("Search"), SNAME("EditorIcons"))); search_box->set_clear_button_enabled(true); - search_box->add_theme_icon_override(SNAME("right_icon"), results_tree->get_theme_icon(SNAME("Search"), SNAME("EditorIcons"))); + search_box->add_theme_icon_override("right_icon", results_tree->get_theme_icon(SNAME("Search"), SNAME("EditorIcons"))); case_sensitive_button->set_icon(results_tree->get_theme_icon(SNAME("MatchCase"), SNAME("EditorIcons"))); hierarchy_button->set_icon(results_tree->get_theme_icon(SNAME("ClassList"), SNAME("EditorIcons"))); @@ -610,11 +610,6 @@ TreeItem *EditorHelpSearch::Runner::_create_member_item(TreeItem *p_parent, cons text = p_text; } else { icon = ui_service->get_theme_icon(p_icon, SNAME("EditorIcons")); - /*// In flat mode, show the class icon. -if (ui_service->has_icon(p_class_name, "EditorIcons")) -icon = ui_service->get_icon(p_class_name, "EditorIcons"); -else if (ClassDB::is_parent_class(p_class_name, "Object")) -icon = ui_service->get_icon("Object", "EditorIcons");*/ text = p_class_name + "." + p_text; } diff --git a/editor/editor_inspector.cpp b/editor/editor_inspector.cpp index d898c84a02..cbfd6ae6de 100644 --- a/editor/editor_inspector.cpp +++ b/editor/editor_inspector.cpp @@ -1890,10 +1890,10 @@ void EditorInspectorArray::_setup() { ae.margin->set_mouse_filter(MOUSE_FILTER_PASS); if (is_inside_tree()) { Size2 min_size = get_theme_stylebox(SNAME("Focus"), SNAME("EditorStyles"))->get_minimum_size(); - ae.margin->add_theme_constant_override(SNAME("margin_left"), min_size.x / 2); - ae.margin->add_theme_constant_override(SNAME("margin_top"), min_size.y / 2); - ae.margin->add_theme_constant_override(SNAME("margin_right"), min_size.x / 2); - ae.margin->add_theme_constant_override(SNAME("margin_bottom"), min_size.y / 2); + ae.margin->add_theme_constant_override("margin_left", min_size.x / 2); + ae.margin->add_theme_constant_override("margin_top", min_size.y / 2); + ae.margin->add_theme_constant_override("margin_right", min_size.x / 2); + ae.margin->add_theme_constant_override("margin_bottom", min_size.y / 2); } ae.panel->add_child(ae.margin); @@ -1989,10 +1989,10 @@ void EditorInspectorArray::_notification(int p_what) { ae.move_texture_rect->set_texture(get_theme_icon(SNAME("TripleBar"), SNAME("EditorIcons"))); Size2 min_size = get_theme_stylebox(SNAME("Focus"), SNAME("EditorStyles"))->get_minimum_size(); - ae.margin->add_theme_constant_override(SNAME("margin_left"), min_size.x / 2); - ae.margin->add_theme_constant_override(SNAME("margin_top"), min_size.y / 2); - ae.margin->add_theme_constant_override(SNAME("margin_right"), min_size.x / 2); - ae.margin->add_theme_constant_override(SNAME("margin_bottom"), min_size.y / 2); + ae.margin->add_theme_constant_override("margin_left", min_size.x / 2); + ae.margin->add_theme_constant_override("margin_top", min_size.y / 2); + ae.margin->add_theme_constant_override("margin_right", min_size.x / 2); + ae.margin->add_theme_constant_override("margin_bottom", min_size.y / 2); } add_button->set_icon(get_theme_icon(SNAME("Add"), SNAME("EditorIcons"))); @@ -2083,7 +2083,7 @@ EditorInspectorArray::EditorInspectorArray() { add_child(rmb_popup); elements_vbox = memnew(VBoxContainer); - elements_vbox->add_theme_constant_override(SNAME("separation"), 0); + elements_vbox->add_theme_constant_override("separation", 0); vbox->add_child(elements_vbox); add_button = memnew(Button); @@ -2109,7 +2109,7 @@ EditorInspectorArray::EditorInspectorArray() { page_line_edit = memnew(LineEdit); page_line_edit->connect("text_submitted", callable_mp(this, &EditorInspectorArray::_page_line_edit_text_submitted)); - page_line_edit->add_theme_constant_override(SNAME("minimum_character_width"), 2); + page_line_edit->add_theme_constant_override("minimum_character_width", 2); hbox_pagination->add_child(page_line_edit); page_count_label = memnew(Label); @@ -2425,7 +2425,7 @@ void EditorInspector::update_tree() { if (!ClassDB::class_exists(type) && !ScriptServer::is_global_class(type) && p.hint_string.length() && FileAccess::exists(p.hint_string)) { // If we have a category inside a script, search for the first script with a valid icon. Ref<Script> script = ResourceLoader::load(p.hint_string, "Script"); - String base_type; + StringName base_type; if (script.is_valid()) { base_type = script->get_instance_base_type(); } @@ -3020,9 +3020,9 @@ void EditorInspector::_update_inspector_bg() { n = n->get_parent(); } count_subinspectors = MIN(15, count_subinspectors); - add_theme_style_override(SNAME("bg"), get_theme_stylebox("sub_inspector_bg" + itos(count_subinspectors), SNAME("Editor"))); + add_theme_style_override("bg", get_theme_stylebox("sub_inspector_bg" + itos(count_subinspectors), SNAME("Editor"))); } else { - add_theme_style_override(SNAME("bg"), get_theme_stylebox(SNAME("bg"), SNAME("Tree"))); + add_theme_style_override("bg", get_theme_stylebox(SNAME("bg"), SNAME("Tree"))); } } void EditorInspector::set_sub_inspector(bool p_enable) { @@ -3479,10 +3479,14 @@ void EditorInspector::_update_script_class_properties(const Object &p_object, Li String path = s->get_path(); String name = EditorNode::get_editor_data().script_class_get_name(path); if (name.is_empty()) { - if (!s->is_built_in()) { - name = path.get_file(); + if (s->is_built_in()) { + if (s->get_name().is_empty()) { + name = TTR("Built-in script"); + } else { + name = vformat("%s (%s)", s->get_name(), TTR("Built-in")); + } } else { - name = TTR("Built-in script"); + name = path.get_file(); } } @@ -3551,7 +3555,7 @@ EditorInspector::EditorInspector() { undo_redo = nullptr; main_vbox = memnew(VBoxContainer); main_vbox->set_h_size_flags(SIZE_EXPAND_FILL); - main_vbox->add_theme_constant_override(SNAME("separation"), 0); + main_vbox->add_theme_constant_override("separation", 0); add_child(main_vbox); set_horizontal_scroll_mode(SCROLL_MODE_DISABLED); diff --git a/editor/editor_log.cpp b/editor/editor_log.cpp index e6aa38e7c4..db4de3bed0 100644 --- a/editor/editor_log.cpp +++ b/editor/editor_log.cpp @@ -64,15 +64,15 @@ void EditorLog::_error_handler(void *p_self, const char *p_func, const char *p_f void EditorLog::_update_theme() { Ref<Font> normal_font = get_theme_font(SNAME("output_source"), SNAME("EditorFonts")); if (normal_font.is_valid()) { - log->add_theme_font_override(SNAME("normal_font"), normal_font); + log->add_theme_font_override("normal_font", normal_font); } - log->add_theme_font_size_override(SNAME("normal_font_size"), get_theme_font_size(SNAME("output_source_size"), SNAME("EditorFonts"))); - log->add_theme_color_override(SNAME("selection_color"), get_theme_color(SNAME("accent_color"), SNAME("Editor")) * Color(1, 1, 1, 0.4)); + log->add_theme_font_size_override("normal_font_size", get_theme_font_size(SNAME("output_source_size"), SNAME("EditorFonts"))); + log->add_theme_color_override("selection_color", get_theme_color(SNAME("accent_color"), SNAME("Editor")) * Color(1, 1, 1, 0.4)); Ref<Font> bold_font = get_theme_font(SNAME("bold"), SNAME("EditorFonts")); if (bold_font.is_valid()) { - log->add_theme_font_override(SNAME("bold_font"), bold_font); + log->add_theme_font_override("bold_font", bold_font); } type_filter_map[MSG_TYPE_STD]->toggle_button->set_icon(get_theme_icon(SNAME("Popup"), SNAME("EditorIcons"))); diff --git a/editor/editor_log.h b/editor/editor_log.h index abfc78fdcd..69a6a0b449 100644 --- a/editor/editor_log.h +++ b/editor/editor_log.h @@ -85,7 +85,7 @@ private: toggle_button->set_text(itos(message_count)); toggle_button->set_tooltip(TTR(p_tooltip)); // Don't tint the icon even when in "pressed" state. - toggle_button->add_theme_color_override(SNAME("icon_color_pressed"), Color(1, 1, 1, 1)); + toggle_button->add_theme_color_override("icon_color_pressed", Color(1, 1, 1, 1)); toggle_button->set_focus_mode(FOCUS_NONE); // When toggled call the callback and pass the MessageType this button is for. toggle_button->connect("toggled", p_toggled_callback, varray(type)); diff --git a/editor/editor_node.cpp b/editor/editor_node.cpp index a4b6790d1c..0e8a6828ea 100644 --- a/editor/editor_node.cpp +++ b/editor/editor_node.cpp @@ -692,17 +692,17 @@ void EditorNode::_notification(int p_what) { theme_base->set_theme(theme); gui_base->set_theme(theme); - gui_base->add_theme_style_override(SNAME("panel"), gui_base->get_theme_stylebox(SNAME("Background"), SNAME("EditorStyles"))); - scene_root_parent->add_theme_style_override(SNAME("panel"), gui_base->get_theme_stylebox(SNAME("Content"), SNAME("EditorStyles"))); - bottom_panel->add_theme_style_override(SNAME("panel"), gui_base->get_theme_stylebox(SNAME("panel"), SNAME("TabContainer"))); - scene_tabs->add_theme_style_override(SNAME("tab_selected"), gui_base->get_theme_stylebox(SNAME("SceneTabFG"), SNAME("EditorStyles"))); - scene_tabs->add_theme_style_override(SNAME("tab_unselected"), gui_base->get_theme_stylebox(SNAME("SceneTabBG"), SNAME("EditorStyles"))); - - file_menu->add_theme_style_override(SNAME("hover"), gui_base->get_theme_stylebox(SNAME("MenuHover"), SNAME("EditorStyles"))); - project_menu->add_theme_style_override(SNAME("hover"), gui_base->get_theme_stylebox(SNAME("MenuHover"), SNAME("EditorStyles"))); - debug_menu->add_theme_style_override(SNAME("hover"), gui_base->get_theme_stylebox(SNAME("MenuHover"), SNAME("EditorStyles"))); - settings_menu->add_theme_style_override(SNAME("hover"), gui_base->get_theme_stylebox(SNAME("MenuHover"), SNAME("EditorStyles"))); - help_menu->add_theme_style_override(SNAME("hover"), gui_base->get_theme_stylebox(SNAME("MenuHover"), SNAME("EditorStyles"))); + gui_base->add_theme_style_override("panel", gui_base->get_theme_stylebox(SNAME("Background"), SNAME("EditorStyles"))); + scene_root_parent->add_theme_style_override("panel", gui_base->get_theme_stylebox(SNAME("Content"), SNAME("EditorStyles"))); + bottom_panel->add_theme_style_override("panel", gui_base->get_theme_stylebox(SNAME("panel"), SNAME("TabContainer"))); + scene_tabs->add_theme_style_override("tab_selected", gui_base->get_theme_stylebox(SNAME("SceneTabFG"), SNAME("EditorStyles"))); + scene_tabs->add_theme_style_override("tab_unselected", gui_base->get_theme_stylebox(SNAME("SceneTabBG"), SNAME("EditorStyles"))); + + file_menu->add_theme_style_override("hover", gui_base->get_theme_stylebox(SNAME("MenuHover"), SNAME("EditorStyles"))); + project_menu->add_theme_style_override("hover", gui_base->get_theme_stylebox(SNAME("MenuHover"), SNAME("EditorStyles"))); + debug_menu->add_theme_style_override("hover", gui_base->get_theme_stylebox(SNAME("MenuHover"), SNAME("EditorStyles"))); + settings_menu->add_theme_style_override("hover", gui_base->get_theme_stylebox(SNAME("MenuHover"), SNAME("EditorStyles"))); + help_menu->add_theme_style_override("hover", gui_base->get_theme_stylebox(SNAME("MenuHover"), SNAME("EditorStyles"))); if (EDITOR_GET("interface/scene_tabs/resize_if_many_tabs")) { scene_tabs->set_min_width(int(EDITOR_GET("interface/scene_tabs/minimum_width")) * EDSCALE); @@ -715,7 +715,7 @@ void EditorNode::_notification(int p_what) { // debugger area if (EditorDebuggerNode::get_singleton()->is_visible()) { - bottom_panel->add_theme_style_override(SNAME("panel"), gui_base->get_theme_stylebox(SNAME("BottomPanelDebuggerOverride"), SNAME("EditorStyles"))); + bottom_panel->add_theme_style_override("panel", gui_base->get_theme_stylebox(SNAME("BottomPanelDebuggerOverride"), SNAME("EditorStyles"))); } // update_icons @@ -745,7 +745,6 @@ void EditorNode::_notification(int p_what) { bottom_panel_raise->set_icon(gui_base->get_theme_icon(SNAME("ExpandBottomDock"), SNAME("EditorIcons"))); - // clear_button->set_icon(gui_base->get_icon("Close", "EditorIcons")); don't have access to that node. needs to become a class property if (gui_base->is_layout_rtl()) { dock_tab_move_left->set_icon(theme->get_icon(SNAME("Forward"), SNAME("EditorIcons"))); dock_tab_move_right->set_icon(theme->get_icon(SNAME("Back"), SNAME("EditorIcons"))); @@ -766,8 +765,8 @@ void EditorNode::_notification(int p_what) { p->set_item_icon(p->get_item_index(HELP_SUPPORT_GODOT_DEVELOPMENT), gui_base->get_theme_icon(SNAME("Heart"), SNAME("EditorIcons"))); for (int i = 0; i < main_editor_buttons.size(); i++) { - main_editor_buttons.write[i]->add_theme_font_override(SNAME("font"), gui_base->get_theme_font(SNAME("main_button_font"), SNAME("EditorFonts"))); - main_editor_buttons.write[i]->add_theme_font_size_override(SNAME("font_size"), gui_base->get_theme_font_size(SNAME("main_button_font_size"), SNAME("EditorFonts"))); + main_editor_buttons.write[i]->add_theme_font_override("font", gui_base->get_theme_font(SNAME("main_button_font"), SNAME("EditorFonts"))); + main_editor_buttons.write[i]->add_theme_font_size_override("font_size", gui_base->get_theme_font_size(SNAME("main_button_font_size"), SNAME("EditorFonts"))); } Set<String> updated_textfile_extensions; @@ -2280,7 +2279,7 @@ void EditorNode::_edit_current(bool p_skip_foreign) { if (main_plugin) { // special case if use of external editor is true Resource *current_res = Object::cast_to<Resource>(current_obj); - if (main_plugin->get_name() == "Script" && current_obj->get_class_name() != StringName("VisualScript") && current_res && !current_res->is_built_in() && (bool(EditorSettings::get_singleton()->get("text_editor/external/use_external_editor")) || overrides_external_editor(current_obj))) { + if (main_plugin->get_name() == "Script" && current_obj->is_class("VisualScript") && current_res && !current_res->is_built_in() && (bool(EditorSettings::get_singleton()->get("text_editor/external/use_external_editor")) || overrides_external_editor(current_obj))) { if (!changing_scene) { main_plugin->edit(current_obj); } @@ -3184,8 +3183,8 @@ void EditorNode::add_editor_plugin(EditorPlugin *p_editor, bool p_config_changed tb->set_icon(singleton->gui_base->get_theme_icon(p_editor->get_name(), SNAME("EditorIcons"))); } - tb->add_theme_font_override(SNAME("font"), singleton->gui_base->get_theme_font(SNAME("main_button_font"), SNAME("EditorFonts"))); - tb->add_theme_font_size_override(SNAME("font_size"), singleton->gui_base->get_theme_font_size(SNAME("main_button_font_size"), SNAME("EditorFonts"))); + tb->add_theme_font_override("font", singleton->gui_base->get_theme_font(SNAME("main_button_font"), SNAME("EditorFonts"))); + tb->add_theme_font_size_override("font_size", singleton->gui_base->get_theme_font_size(SNAME("main_button_font_size"), SNAME("EditorFonts"))); singleton->main_editor_buttons.push_back(tb); singleton->main_editor_button_vb->add_child(tb); @@ -3293,8 +3292,8 @@ void EditorNode::set_addon_plugin_enabled(const String &p_addon, bool p_enabled, return; } - // Errors in the script cause the base_type to be an empty string. - if (String(script->get_instance_base_type()) == "") { + // Errors in the script cause the base_type to be an empty StringName. + if (script->get_instance_base_type() == StringName()) { show_warning(vformat(TTR("Unable to load addon script from path: '%s'. This might be due to a code error in that script.\nDisabling the addon at '%s' to prevent further errors."), script_path, p_addon)); _remove_plugin_from_enabled(p_addon); return; @@ -3937,7 +3936,7 @@ StringName EditorNode::get_object_custom_type_name(const Object *p_object) const ERR_FAIL_COND_V(!p_object, StringName()); Ref<Script> script = p_object->get_script(); - if (script.is_null() && p_object->is_class("Script")) { + if (script.is_null() && Object::cast_to<Script>(p_object)) { script = p_object; } @@ -4148,13 +4147,12 @@ Ref<Texture2D> EditorNode::_file_dialog_get_icon(const String &p_path) { void EditorNode::_build_icon_type_cache() { List<StringName> tl; - StringName ei = "EditorIcons"; - theme_base->get_theme()->get_icon_list(ei, &tl); + theme_base->get_theme()->get_icon_list(SNAME("EditorIcons"), &tl); for (const StringName &E : tl) { if (!ClassDB::class_exists(E)) { continue; } - icon_type_cache[E] = theme_base->get_theme()->get_icon(E, ei); + icon_type_cache[E] = theme_base->get_theme()->get_icon(E, SNAME("EditorIcons")); } } @@ -4252,10 +4250,10 @@ void EditorNode::_dock_make_float() { window->add_child(p); MarginContainer *margin = memnew(MarginContainer); margin->set_anchors_and_offsets_preset(Control::PRESET_WIDE); - margin->add_theme_constant_override(SNAME("margin_right"), borders.width); - margin->add_theme_constant_override(SNAME("margin_top"), borders.height); - margin->add_theme_constant_override(SNAME("margin_left"), borders.width); - margin->add_theme_constant_override(SNAME("margin_bottom"), borders.height); + margin->add_theme_constant_override("margin_right", borders.width); + margin->add_theme_constant_override("margin_top", borders.height); + margin->add_theme_constant_override("margin_left", borders.width); + margin->add_theme_constant_override("margin_bottom", borders.height); window->add_child(margin); dock->set_anchors_and_offsets_preset(Control::PRESET_WIDE); margin->add_child(dock); @@ -5200,9 +5198,9 @@ void EditorNode::_bottom_panel_switch(bool p_enable, int p_idx) { bottom_panel_items[i].control->set_visible(i == p_idx); } if (EditorDebuggerNode::get_singleton() == bottom_panel_items[p_idx].control) { // this is the debug panel which uses tabs, so the top section should be smaller - bottom_panel->add_theme_style_override(SNAME("panel"), gui_base->get_theme_stylebox(SNAME("BottomPanelDebuggerOverride"), SNAME("EditorStyles"))); + bottom_panel->add_theme_style_override("panel", gui_base->get_theme_stylebox(SNAME("BottomPanelDebuggerOverride"), SNAME("EditorStyles"))); } else { - bottom_panel->add_theme_style_override(SNAME("panel"), gui_base->get_theme_stylebox(SNAME("panel"), SNAME("TabContainer"))); + bottom_panel->add_theme_style_override("panel", gui_base->get_theme_stylebox(SNAME("panel"), SNAME("TabContainer"))); } center_split->set_dragger_visibility(SplitContainer::DRAGGER_VISIBLE); center_split->set_collapsed(false); @@ -5212,7 +5210,7 @@ void EditorNode::_bottom_panel_switch(bool p_enable, int p_idx) { bottom_panel_raise->show(); } else { - bottom_panel->add_theme_style_override(SNAME("panel"), gui_base->get_theme_stylebox(SNAME("panel"), SNAME("TabContainer"))); + bottom_panel->add_theme_style_override("panel", gui_base->get_theme_stylebox(SNAME("panel"), SNAME("TabContainer"))); bottom_panel_items[p_idx].button->set_pressed(false); bottom_panel_items[p_idx].control->set_visible(false); center_split->set_dragger_visibility(SplitContainer::DRAGGER_HIDDEN); @@ -5603,9 +5601,9 @@ void EditorNode::_bottom_panel_raise_toggled(bool p_pressed) { void EditorNode::_update_rendering_driver_color() { if (rendering_driver->get_text() == "opengl3") { - rendering_driver->add_theme_color_override(SNAME("font_color"), Color::hex(0x5586a4ff)); + rendering_driver->add_theme_color_override("font_color", Color::hex(0x5586a4ff)); } else if (rendering_driver->get_text() == "vulkan") { - rendering_driver->add_theme_color_override(SNAME("font_color"), theme_base->get_theme_color(SNAME("vulkan_color"), SNAME("Editor"))); + rendering_driver->add_theme_color_override("font_color", theme_base->get_theme_color(SNAME("vulkan_color"), SNAME("Editor"))); } } @@ -6054,7 +6052,7 @@ EditorNode::EditorNode() { theme_base->set_theme(theme); gui_base->set_theme(theme); - gui_base->add_theme_style_override(SNAME("panel"), gui_base->get_theme_stylebox(SNAME("Background"), SNAME("EditorStyles"))); + gui_base->add_theme_style_override("panel", gui_base->get_theme_stylebox(SNAME("Background"), SNAME("EditorStyles"))); resource_preview = memnew(EditorResourcePreview); add_child(resource_preview); @@ -6069,7 +6067,7 @@ EditorNode::EditorNode() { main_vbox = memnew(VBoxContainer); gui_base->add_child(main_vbox); main_vbox->set_anchors_and_offsets_preset(Control::PRESET_WIDE, Control::PRESET_MODE_MINSIZE, 8); - main_vbox->add_theme_constant_override(SNAME("separation"), 8 * EDSCALE); + main_vbox->add_theme_constant_override("separation", 8 * EDSCALE); menu_hb = memnew(HBoxContainer); main_vbox->add_child(menu_hb); @@ -6220,7 +6218,7 @@ EditorNode::EditorNode() { VBoxContainer *srt = memnew(VBoxContainer); srt->set_v_size_flags(Control::SIZE_EXPAND_FILL); top_split->add_child(srt); - srt->add_theme_constant_override(SNAME("separation"), 0); + srt->add_theme_constant_override("separation", 0); tab_preview_panel = memnew(Panel); tab_preview_panel->set_size(Size2(100, 100) * EDSCALE); @@ -6238,8 +6236,8 @@ EditorNode::EditorNode() { srt->add_child(tabbar_container); scene_tabs = memnew(TabBar); - scene_tabs->add_theme_style_override(SNAME("tab_selected"), gui_base->get_theme_stylebox(SNAME("SceneTabFG"), SNAME("EditorStyles"))); - scene_tabs->add_theme_style_override(SNAME("tab_unselected"), gui_base->get_theme_stylebox(SNAME("SceneTabBG"), SNAME("EditorStyles"))); + scene_tabs->add_theme_style_override("tab_selected", gui_base->get_theme_stylebox(SNAME("SceneTabFG"), SNAME("EditorStyles"))); + scene_tabs->add_theme_style_override("tab_unselected", gui_base->get_theme_stylebox(SNAME("SceneTabBG"), SNAME("EditorStyles"))); scene_tabs->set_select_with_rmb(true); scene_tabs->add_tab("unsaved"); scene_tabs->set_tab_alignment(TabBar::ALIGNMENT_LEFT); @@ -6265,7 +6263,7 @@ EditorNode::EditorNode() { scene_tab_add->set_flat(true); scene_tab_add->set_tooltip(TTR("Add a new scene.")); scene_tab_add->set_icon(gui_base->get_theme_icon(SNAME("Add"), SNAME("EditorIcons"))); - scene_tab_add->add_theme_color_override(SNAME("icon_normal_color"), Color(0.6f, 0.6f, 0.6f, 0.8f)); + scene_tab_add->add_theme_color_override("icon_normal_color", Color(0.6f, 0.6f, 0.6f, 0.8f)); scene_tabs->add_child(scene_tab_add); scene_tab_add->connect("pressed", callable_mp(this, &EditorNode::_menu_option), make_binds(FILE_NEW_SCENE)); @@ -6287,7 +6285,7 @@ EditorNode::EditorNode() { scene_root_parent = memnew(PanelContainer); scene_root_parent->set_custom_minimum_size(Size2(0, 80) * EDSCALE); - scene_root_parent->add_theme_style_override(SNAME("panel"), gui_base->get_theme_stylebox(SNAME("Content"), SNAME("EditorStyles"))); + scene_root_parent->add_theme_style_override("panel", gui_base->get_theme_stylebox(SNAME("Content"), SNAME("EditorStyles"))); scene_root_parent->set_draw_behind_parent(true); srt->add_child(scene_root_parent); scene_root_parent->set_v_size_flags(Control::SIZE_EXPAND_FILL); @@ -6301,7 +6299,7 @@ EditorNode::EditorNode() { main_control = memnew(VBoxContainer); main_control->set_v_size_flags(Control::SIZE_EXPAND_FILL); - main_control->add_theme_constant_override(SNAME("separation"), 0); + main_control->add_theme_constant_override("separation", 0); scene_root_parent->add_child(main_control); HBoxContainer *left_menu_hb = memnew(HBoxContainer); @@ -6311,7 +6309,7 @@ EditorNode::EditorNode() { file_menu->set_flat(false); file_menu->set_switch_on_hover(true); file_menu->set_text(TTR("Scene")); - file_menu->add_theme_style_override(SNAME("hover"), gui_base->get_theme_stylebox(SNAME("MenuHover"), SNAME("EditorStyles"))); + file_menu->add_theme_style_override("hover", gui_base->get_theme_stylebox(SNAME("MenuHover"), SNAME("EditorStyles"))); left_menu_hb->add_child(file_menu); prev_scene = memnew(Button); @@ -6427,7 +6425,7 @@ EditorNode::EditorNode() { project_menu->set_switch_on_hover(true); project_menu->set_tooltip(TTR("Miscellaneous project or scene-wide tools.")); project_menu->set_text(TTR("Project")); - project_menu->add_theme_style_override(SNAME("hover"), gui_base->get_theme_stylebox(SNAME("MenuHover"), SNAME("EditorStyles"))); + project_menu->add_theme_style_override("hover", gui_base->get_theme_stylebox(SNAME("MenuHover"), SNAME("EditorStyles"))); left_menu_hb->add_child(project_menu); p = project_menu->get_popup(); @@ -6477,7 +6475,7 @@ EditorNode::EditorNode() { debug_menu->set_flat(false); debug_menu->set_switch_on_hover(true); debug_menu->set_text(TTR("Debug")); - debug_menu->add_theme_style_override(SNAME("hover"), gui_base->get_theme_stylebox(SNAME("MenuHover"), SNAME("EditorStyles"))); + debug_menu->add_theme_style_override("hover", gui_base->get_theme_stylebox(SNAME("MenuHover"), SNAME("EditorStyles"))); left_menu_hb->add_child(debug_menu); menu_hb->add_spacer(); @@ -6486,7 +6484,7 @@ EditorNode::EditorNode() { settings_menu->set_flat(false); settings_menu->set_switch_on_hover(true); settings_menu->set_text(TTR("Editor")); - settings_menu->add_theme_style_override(SNAME("hover"), gui_base->get_theme_stylebox(SNAME("MenuHover"), SNAME("EditorStyles"))); + settings_menu->add_theme_style_override("hover", gui_base->get_theme_stylebox(SNAME("MenuHover"), SNAME("EditorStyles"))); left_menu_hb->add_child(settings_menu); p = settings_menu->get_popup(); @@ -6534,7 +6532,7 @@ EditorNode::EditorNode() { help_menu->set_flat(false); help_menu->set_switch_on_hover(true); help_menu->set_text(TTR("Help")); - help_menu->add_theme_style_override(SNAME("hover"), gui_base->get_theme_stylebox(SNAME("MenuHover"), SNAME("EditorStyles"))); + help_menu->add_theme_style_override("hover", gui_base->get_theme_stylebox(SNAME("MenuHover"), SNAME("EditorStyles"))); left_menu_hb->add_child(help_menu); p = help_menu->get_popup(); @@ -6638,8 +6636,8 @@ EditorNode::EditorNode() { rendering_driver->set_flat(true); rendering_driver->set_focus_mode(Control::FOCUS_NONE); rendering_driver->connect("item_selected", callable_mp(this, &EditorNode::_rendering_driver_selected)); - rendering_driver->add_theme_font_override(SNAME("font"), gui_base->get_theme_font(SNAME("bold"), SNAME("EditorFonts"))); - rendering_driver->add_theme_font_size_override(SNAME("font_size"), gui_base->get_theme_font_size(SNAME("bold_size"), SNAME("EditorFonts"))); + rendering_driver->add_theme_font_override("font", gui_base->get_theme_font(SNAME("bold"), SNAME("EditorFonts"))); + rendering_driver->add_theme_font_size_override("font_size", gui_base->get_theme_font_size(SNAME("bold_size"), SNAME("EditorFonts"))); right_menu_hb->add_child(rendering_driver); @@ -6762,7 +6760,7 @@ EditorNode::EditorNode() { // Bottom panels bottom_panel = memnew(PanelContainer); - bottom_panel->add_theme_style_override(SNAME("panel"), gui_base->get_theme_stylebox(SNAME("panel"), SNAME("TabContainer"))); + bottom_panel->add_theme_style_override("panel", gui_base->get_theme_stylebox(SNAME("panel"), SNAME("TabContainer"))); center_split->add_child(bottom_panel); center_split->set_dragger_visibility(SplitContainer::DRAGGER_HIDDEN); diff --git a/editor/editor_path.cpp b/editor/editor_path.cpp index e9ffb08cec..3dee06fb3e 100644 --- a/editor/editor_path.cpp +++ b/editor/editor_path.cpp @@ -181,7 +181,7 @@ void EditorPath::_notification(int p_what) { update_path(); sub_objects_icon->set_texture(get_theme_icon(SNAME("select_arrow"), SNAME("Tree"))); - current_object_label->add_theme_font_override(SNAME("font"), get_theme_font(SNAME("main"), SNAME("EditorFonts"))); + current_object_label->add_theme_font_override("font", get_theme_font(SNAME("main"), SNAME("EditorFonts"))); } break; case NOTIFICATION_READY: { @@ -198,8 +198,8 @@ EditorPath::EditorPath(EditorHistory *p_history) { MarginContainer *main_mc = memnew(MarginContainer); main_mc->set_anchors_and_offsets_preset(PRESET_WIDE); - main_mc->add_theme_constant_override(SNAME("margin_left"), 4 * EDSCALE); - main_mc->add_theme_constant_override(SNAME("margin_right"), 6 * EDSCALE); + main_mc->add_theme_constant_override("margin_left", 4 * EDSCALE); + main_mc->add_theme_constant_override("margin_right", 6 * EDSCALE); add_child(main_mc); HBoxContainer *main_hb = memnew(HBoxContainer); diff --git a/editor/editor_properties.cpp b/editor/editor_properties.cpp index 80da8363ad..ef1ceebabf 100644 --- a/editor/editor_properties.cpp +++ b/editor/editor_properties.cpp @@ -3087,18 +3087,18 @@ void EditorPropertyResource::_update_property_bg() { } count_subinspectors = MIN(15, count_subinspectors); - add_theme_color_override(SNAME("property_color"), get_theme_color(SNAME("sub_inspector_property_color"), SNAME("Editor"))); - add_theme_style_override(SNAME("bg_selected"), get_theme_stylebox("sub_inspector_property_bg_selected" + itos(count_subinspectors), SNAME("Editor"))); - add_theme_style_override(SNAME("bg"), get_theme_stylebox("sub_inspector_property_bg" + itos(count_subinspectors), SNAME("Editor"))); + add_theme_color_override("property_color", get_theme_color(SNAME("sub_inspector_property_color"), SNAME("Editor"))); + add_theme_style_override("bg_selected", get_theme_stylebox("sub_inspector_property_bg_selected" + itos(count_subinspectors), SNAME("Editor"))); + add_theme_style_override("bg", get_theme_stylebox("sub_inspector_property_bg" + itos(count_subinspectors), SNAME("Editor"))); - add_theme_constant_override(SNAME("font_offset"), get_theme_constant(SNAME("sub_inspector_font_offset"), SNAME("Editor"))); - add_theme_constant_override(SNAME("vseparation"), 0); + add_theme_constant_override("font_offset", get_theme_constant(SNAME("sub_inspector_font_offset"), SNAME("Editor"))); + add_theme_constant_override("vseparation", 0); } else { - add_theme_color_override(SNAME("property_color"), get_theme_color(SNAME("property_color"), SNAME("EditorProperty"))); - add_theme_style_override(SNAME("bg_selected"), get_theme_stylebox(SNAME("bg_selected"), SNAME("EditorProperty"))); - add_theme_style_override(SNAME("bg"), get_theme_stylebox(SNAME("bg"), SNAME("EditorProperty"))); - add_theme_constant_override(SNAME("vseparation"), get_theme_constant(SNAME("vseparation"), SNAME("EditorProperty"))); - add_theme_constant_override(SNAME("font_offset"), get_theme_constant(SNAME("font_offset"), SNAME("EditorProperty"))); + add_theme_color_override("property_color", get_theme_color(SNAME("property_color"), SNAME("EditorProperty"))); + add_theme_style_override("bg_selected", get_theme_stylebox(SNAME("bg_selected"), SNAME("EditorProperty"))); + add_theme_style_override("bg", get_theme_stylebox(SNAME("bg"), SNAME("EditorProperty"))); + add_theme_constant_override("vseparation", get_theme_constant(SNAME("vseparation"), SNAME("EditorProperty"))); + add_theme_constant_override("font_offset", get_theme_constant(SNAME("font_offset"), SNAME("EditorProperty"))); } updating_theme = false; diff --git a/editor/editor_properties_array_dict.cpp b/editor/editor_properties_array_dict.cpp index a96b7d3730..cfed86d1ae 100644 --- a/editor/editor_properties_array_dict.cpp +++ b/editor/editor_properties_array_dict.cpp @@ -1082,7 +1082,7 @@ void EditorPropertyDictionary::update_property() { } flat->set_bg_color(get_theme_color(SNAME("prop_subsection"), SNAME("Editor"))); - pc->add_theme_style_override(SNAME("panel"), flat); + pc->add_theme_style_override("panel", flat); add_vbox = memnew(VBoxContainer); pc->add_child(add_vbox); } diff --git a/editor/editor_resource_picker.cpp b/editor/editor_resource_picker.cpp index 716643f812..398a096550 100644 --- a/editor/editor_resource_picker.cpp +++ b/editor/editor_resource_picker.cpp @@ -77,16 +77,16 @@ void EditorResourcePicker::_update_resource_preview(const String &p_path, const return; } - String type = edited_resource->get_class_name(); - if (ClassDB::is_parent_class(type, "Script")) { - assign_button->set_text(edited_resource->get_path().get_file()); + Ref<Script> script = edited_resource; + if (script.is_valid()) { + assign_button->set_text(script->get_path().get_file()); return; } if (p_preview.is_valid()) { preview_rect->set_offset(SIDE_LEFT, assign_button->get_icon()->get_width() + assign_button->get_theme_stylebox(SNAME("normal"))->get_default_margin(SIDE_LEFT) + get_theme_constant(SNAME("hseparation"), SNAME("Button"))); - if (type == "GradientTexture1D") { + if (Ref<GradientTexture1D>(edited_resource).is_valid()) { preview_rect->set_stretch_mode(TextureRect::STRETCH_SCALE); assign_button->set_custom_minimum_size(Size2(1, 1)); } else { @@ -377,6 +377,8 @@ void EditorResourcePicker::_edit_menu_cbk(int p_which) { Resource *resp = Object::cast_to<Resource>(obj); ERR_BREAK(!resp); + EditorNode::get_editor_data().instantiate_object_properties(obj); + edited_resource = RES(resp); emit_signal(SNAME("resource_changed"), edited_resource); _update_resource(); @@ -640,7 +642,7 @@ void EditorResourcePicker::drop_data_fw(const Point2 &p_point, const Variant &p_ for (Set<String>::Element *E = allowed_types.front(); E; E = E->next()) { String at = E->get().strip_edges(); - if (at == "BaseMaterial3D" && ClassDB::is_parent_class(dropped_resource->get_class(), "Texture2D")) { + if (at == "BaseMaterial3D" && Ref<Texture2D>(dropped_resource).is_valid()) { // Use existing resource if possible and only replace its data. Ref<StandardMaterial3D> mat = edited_resource; if (!mat.is_valid()) { @@ -651,7 +653,7 @@ void EditorResourcePicker::drop_data_fw(const Point2 &p_point, const Variant &p_ break; } - if (at == "ShaderMaterial" && ClassDB::is_parent_class(dropped_resource->get_class(), "Shader")) { + if (at == "ShaderMaterial" && Ref<Shader>(dropped_resource).is_valid()) { Ref<ShaderMaterial> mat = edited_resource; if (!mat.is_valid()) { mat.instantiate(); @@ -661,7 +663,7 @@ void EditorResourcePicker::drop_data_fw(const Point2 &p_point, const Variant &p_ break; } - if (at == "Font" && ClassDB::is_parent_class(dropped_resource->get_class(), "FontData")) { + if (at == "Font" && Ref<FontData>(dropped_resource).is_valid()) { Ref<Font> font = edited_resource; if (!font.is_valid()) { font.instantiate(); @@ -671,7 +673,7 @@ void EditorResourcePicker::drop_data_fw(const Point2 &p_point, const Variant &p_ break; } - if (at == "Texture2D" && ClassDB::is_parent_class(dropped_resource->get_class(), "Image")) { + if (at == "Texture2D" && Ref<Image>(dropped_resource).is_valid()) { Ref<ImageTexture> texture = edited_resource; if (!texture.is_valid()) { texture.instantiate(); diff --git a/editor/editor_sectioned_inspector.cpp b/editor/editor_sectioned_inspector.cpp index 012f10a1bd..1bab56ac4a 100644 --- a/editor/editor_sectioned_inspector.cpp +++ b/editor/editor_sectioned_inspector.cpp @@ -302,7 +302,7 @@ SectionedInspector::SectionedInspector() : sections(memnew(Tree)), filter(memnew(SectionedInspectorFilter)), inspector(memnew(EditorInspector)) { - add_theme_constant_override(SNAME("autohide"), 1); // Fixes the dragger always showing up + add_theme_constant_override("autohide", 1); // Fixes the dragger always showing up VBoxContainer *left_vb = memnew(VBoxContainer); left_vb->set_custom_minimum_size(Size2(190, 0) * EDSCALE); diff --git a/editor/editor_settings_dialog.cpp b/editor/editor_settings_dialog.cpp index 22425ae37d..fc37590337 100644 --- a/editor/editor_settings_dialog.cpp +++ b/editor/editor_settings_dialog.cpp @@ -182,9 +182,9 @@ void EditorSettingsDialog::_update_icons() { shortcut_search_box->set_clear_button_enabled(true); restart_close_button->set_icon(shortcuts->get_theme_icon(SNAME("Close"), SNAME("EditorIcons"))); - restart_container->add_theme_style_override(SNAME("panel"), shortcuts->get_theme_stylebox(SNAME("bg"), SNAME("Tree"))); + restart_container->add_theme_style_override("panel", shortcuts->get_theme_stylebox(SNAME("bg"), SNAME("Tree"))); restart_icon->set_texture(shortcuts->get_theme_icon(SNAME("StatusWarning"), SNAME("EditorIcons"))); - restart_label->add_theme_color_override(SNAME("font_color"), shortcuts->get_theme_color(SNAME("warning_color"), SNAME("Editor"))); + restart_label->add_theme_color_override("font_color", shortcuts->get_theme_color(SNAME("warning_color"), SNAME("Editor"))); } void EditorSettingsDialog::_event_config_confirmed() { diff --git a/editor/editor_spin_slider.cpp b/editor/editor_spin_slider.cpp index 881cd7a8a5..cd28a65c7b 100644 --- a/editor/editor_spin_slider.cpp +++ b/editor/editor_spin_slider.cpp @@ -268,7 +268,7 @@ void EditorSpinSlider::_update_value_input_stylebox() { stylebox->set_default_margin(SIDE_RIGHT, 0); } - value_input->add_theme_style_override(SNAME("normal"), stylebox); + value_input->add_theme_style_override("normal", stylebox); } void EditorSpinSlider::_draw_spin_slider() { diff --git a/editor/editor_themes.cpp b/editor/editor_themes.cpp index 7aa5ba7023..1e373239a6 100644 --- a/editor/editor_themes.cpp +++ b/editor/editor_themes.cpp @@ -446,28 +446,28 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { float prev_icon_saturation = theme->has_color(SNAME("icon_saturation"), SNAME("Editor")) ? theme->get_color(SNAME("icon_saturation"), SNAME("Editor")).r : 1.0; - theme->set_color(SNAME("icon_saturation"), SNAME("Editor"), Color(icon_saturation, icon_saturation, icon_saturation)); // can't save single float in theme, so using color - theme->set_color(SNAME("accent_color"), SNAME("Editor"), accent_color); - theme->set_color(SNAME("highlight_color"), SNAME("Editor"), highlight_color); - theme->set_color(SNAME("disabled_highlight_color"), SNAME("Editor"), disabled_highlight_color); - theme->set_color(SNAME("base_color"), SNAME("Editor"), base_color); - theme->set_color(SNAME("dark_color_1"), SNAME("Editor"), dark_color_1); - theme->set_color(SNAME("dark_color_2"), SNAME("Editor"), dark_color_2); - theme->set_color(SNAME("dark_color_3"), SNAME("Editor"), dark_color_3); - theme->set_color(SNAME("contrast_color_1"), SNAME("Editor"), contrast_color_1); - theme->set_color(SNAME("contrast_color_2"), SNAME("Editor"), contrast_color_2); - theme->set_color(SNAME("box_selection_fill_color"), SNAME("Editor"), accent_color * Color(1, 1, 1, 0.3)); - theme->set_color(SNAME("box_selection_stroke_color"), SNAME("Editor"), accent_color * Color(1, 1, 1, 0.8)); - - theme->set_color(SNAME("axis_x_color"), SNAME("Editor"), Color(0.96, 0.20, 0.32)); - theme->set_color(SNAME("axis_y_color"), SNAME("Editor"), Color(0.53, 0.84, 0.01)); - theme->set_color(SNAME("axis_z_color"), SNAME("Editor"), Color(0.16, 0.55, 0.96)); - - theme->set_color(SNAME("font_color"), SNAME("Editor"), font_color); - theme->set_color(SNAME("highlighted_font_color"), SNAME("Editor"), font_hover_color); - theme->set_color(SNAME("disabled_font_color"), SNAME("Editor"), font_disabled_color); - - theme->set_color(SNAME("mono_color"), SNAME("Editor"), mono_color); + theme->set_color("icon_saturation", "Editor", Color(icon_saturation, icon_saturation, icon_saturation)); // can't save single float in theme, so using color + theme->set_color("accent_color", "Editor", accent_color); + theme->set_color("highlight_color", "Editor", highlight_color); + theme->set_color("disabled_highlight_color", "Editor", disabled_highlight_color); + theme->set_color("base_color", "Editor", base_color); + theme->set_color("dark_color_1", "Editor", dark_color_1); + theme->set_color("dark_color_2", "Editor", dark_color_2); + theme->set_color("dark_color_3", "Editor", dark_color_3); + theme->set_color("contrast_color_1", "Editor", contrast_color_1); + theme->set_color("contrast_color_2", "Editor", contrast_color_2); + theme->set_color("box_selection_fill_color", "Editor", accent_color * Color(1, 1, 1, 0.3)); + theme->set_color("box_selection_stroke_color", "Editor", accent_color * Color(1, 1, 1, 0.8)); + + theme->set_color("axis_x_color", "Editor", Color(0.96, 0.20, 0.32)); + theme->set_color("axis_y_color", "Editor", Color(0.53, 0.84, 0.01)); + theme->set_color("axis_z_color", "Editor", Color(0.16, 0.55, 0.96)); + + theme->set_color("font_color", "Editor", font_color); + theme->set_color("highlighted_font_color", "Editor", font_hover_color); + theme->set_color("disabled_font_color", "Editor", font_disabled_color); + + theme->set_color("mono_color", "Editor", mono_color); Color success_color = Color(0.45, 0.95, 0.5); Color warning_color = Color(1, 0.87, 0.4); @@ -483,21 +483,21 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { error_color = error_color.lerp(mono_color, 0.25); } - theme->set_color(SNAME("success_color"), SNAME("Editor"), success_color); - theme->set_color(SNAME("warning_color"), SNAME("Editor"), warning_color); - theme->set_color(SNAME("error_color"), SNAME("Editor"), error_color); - theme->set_color(SNAME("property_color"), SNAME("Editor"), property_color); - theme->set_color(SNAME("readonly_color"), SNAME("Editor"), readonly_color); + theme->set_color("success_color", "Editor", success_color); + theme->set_color("warning_color", "Editor", warning_color); + theme->set_color("error_color", "Editor", error_color); + theme->set_color("property_color", "Editor", property_color); + theme->set_color("readonly_color", "Editor", readonly_color); if (!dark_theme) { - theme->set_color(SNAME("vulkan_color"), SNAME("Editor"), Color::hex(0xad1128ff)); + theme->set_color("vulkan_color", "Editor", Color::hex(0xad1128ff)); } else { - theme->set_color(SNAME("vulkan_color"), SNAME("Editor"), Color(1.0, 0.0, 0.0)); + theme->set_color("vulkan_color", "Editor", Color(1.0, 0.0, 0.0)); } const int thumb_size = EDITOR_GET("filesystem/file_dialog/thumbnail_size"); - theme->set_constant(SNAME("scale"), SNAME("Editor"), EDSCALE); - theme->set_constant(SNAME("thumb_size"), SNAME("Editor"), thumb_size); - theme->set_constant(SNAME("dark_theme"), SNAME("Editor"), dark_theme); + theme->set_constant("scale", "Editor", EDSCALE); + theme->set_constant("thumb_size", "Editor", thumb_size); + theme->set_constant("dark_theme", "Editor", dark_theme); // Register icons + font @@ -632,113 +632,113 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { // Editor background Color background_color_opaque = background_color; background_color_opaque.a = 1.0; - theme->set_stylebox(SNAME("Background"), SNAME("EditorStyles"), make_flat_stylebox(background_color_opaque, default_margin_size, default_margin_size, default_margin_size, default_margin_size)); + theme->set_stylebox("Background", "EditorStyles", make_flat_stylebox(background_color_opaque, default_margin_size, default_margin_size, default_margin_size, default_margin_size)); // Focus - theme->set_stylebox(SNAME("Focus"), SNAME("EditorStyles"), style_widget_focus); + theme->set_stylebox("Focus", "EditorStyles", style_widget_focus); // Use a less opaque color to be less distracting for the 2D and 3D editor viewports. Ref<StyleBoxFlat> style_widget_focus_viewport = style_widget_focus->duplicate(); style_widget_focus_viewport->set_border_color(accent_color * Color(1, 1, 1, 0.5)); - theme->set_stylebox(SNAME("FocusViewport"), SNAME("EditorStyles"), style_widget_focus_viewport); + theme->set_stylebox("FocusViewport", "EditorStyles", style_widget_focus_viewport); // Menu Ref<StyleBoxFlat> style_menu = style_widget->duplicate(); style_menu->set_draw_center(false); style_menu->set_border_width_all(0); - theme->set_stylebox(SNAME("panel"), SNAME("PanelContainer"), style_menu); - theme->set_stylebox(SNAME("MenuPanel"), SNAME("EditorStyles"), style_menu); + theme->set_stylebox("panel", "PanelContainer", style_menu); + theme->set_stylebox("MenuPanel", "EditorStyles", style_menu); // CanvasItem Editor Ref<StyleBoxFlat> style_canvas_editor_info = make_flat_stylebox(Color(0.0, 0.0, 0.0, 0.2)); style_canvas_editor_info->set_expand_margin_size_all(4 * EDSCALE); - theme->set_stylebox(SNAME("CanvasItemInfoOverlay"), SNAME("EditorStyles"), style_canvas_editor_info); + theme->set_stylebox("CanvasItemInfoOverlay", "EditorStyles", style_canvas_editor_info); // Script Editor - theme->set_stylebox(SNAME("ScriptEditorPanel"), SNAME("EditorStyles"), make_empty_stylebox(default_margin_size, 0, default_margin_size, default_margin_size)); - theme->set_stylebox(SNAME("ScriptEditor"), SNAME("EditorStyles"), make_empty_stylebox(0, 0, 0, 0)); + theme->set_stylebox("ScriptEditorPanel", "EditorStyles", make_empty_stylebox(default_margin_size, 0, default_margin_size, default_margin_size)); + theme->set_stylebox("ScriptEditor", "EditorStyles", make_empty_stylebox(0, 0, 0, 0)); // Play button group - theme->set_stylebox(SNAME("PlayButtonPanel"), SNAME("EditorStyles"), style_empty); + theme->set_stylebox("PlayButtonPanel", "EditorStyles", style_empty); - theme->set_stylebox(SNAME("normal"), SNAME("MenuButton"), style_menu); - theme->set_stylebox(SNAME("hover"), SNAME("MenuButton"), style_widget_hover); - theme->set_stylebox(SNAME("pressed"), SNAME("MenuButton"), style_menu); - theme->set_stylebox(SNAME("focus"), SNAME("MenuButton"), style_menu); - theme->set_stylebox(SNAME("disabled"), SNAME("MenuButton"), style_menu); + theme->set_stylebox("normal", "MenuButton", style_menu); + theme->set_stylebox("hover", "MenuButton", style_widget_hover); + theme->set_stylebox("pressed", "MenuButton", style_menu); + theme->set_stylebox("focus", "MenuButton", style_menu); + theme->set_stylebox("disabled", "MenuButton", style_menu); - theme->set_color(SNAME("font_color"), SNAME("MenuButton"), font_color); - theme->set_color(SNAME("font_hover_color"), SNAME("MenuButton"), font_hover_color); - theme->set_color(SNAME("font_focus_color"), SNAME("MenuButton"), font_focus_color); + theme->set_color("font_color", "MenuButton", font_color); + theme->set_color("font_hover_color", "MenuButton", font_hover_color); + theme->set_color("font_focus_color", "MenuButton", font_focus_color); - theme->set_stylebox(SNAME("MenuHover"), SNAME("EditorStyles"), style_widget_hover); + theme->set_stylebox("MenuHover", "EditorStyles", style_widget_hover); // Buttons - theme->set_stylebox(SNAME("normal"), SNAME("Button"), style_widget); - theme->set_stylebox(SNAME("hover"), SNAME("Button"), style_widget_hover); - theme->set_stylebox(SNAME("pressed"), SNAME("Button"), style_widget_pressed); - theme->set_stylebox(SNAME("focus"), SNAME("Button"), style_widget_focus); - theme->set_stylebox(SNAME("disabled"), SNAME("Button"), style_widget_disabled); - - theme->set_color(SNAME("font_color"), SNAME("Button"), font_color); - theme->set_color(SNAME("font_hover_color"), SNAME("Button"), font_hover_color); - theme->set_color(SNAME("font_focus_color"), SNAME("Button"), font_focus_color); - theme->set_color(SNAME("font_pressed_color"), SNAME("Button"), accent_color); - theme->set_color(SNAME("font_disabled_color"), SNAME("Button"), font_disabled_color); - theme->set_color(SNAME("icon_hover_color"), SNAME("Button"), icon_hover_color); - theme->set_color(SNAME("icon_focus_color"), SNAME("Button"), icon_focus_color); - theme->set_color(SNAME("icon_pressed_color"), SNAME("Button"), icon_pressed_color); + theme->set_stylebox("normal", "Button", style_widget); + theme->set_stylebox("hover", "Button", style_widget_hover); + theme->set_stylebox("pressed", "Button", style_widget_pressed); + theme->set_stylebox("focus", "Button", style_widget_focus); + theme->set_stylebox("disabled", "Button", style_widget_disabled); + + theme->set_color("font_color", "Button", font_color); + theme->set_color("font_hover_color", "Button", font_hover_color); + theme->set_color("font_focus_color", "Button", font_focus_color); + theme->set_color("font_pressed_color", "Button", accent_color); + theme->set_color("font_disabled_color", "Button", font_disabled_color); + theme->set_color("icon_hover_color", "Button", icon_hover_color); + theme->set_color("icon_focus_color", "Button", icon_focus_color); + theme->set_color("icon_pressed_color", "Button", icon_pressed_color); // OptionButton - theme->set_stylebox(SNAME("focus"), SNAME("OptionButton"), style_widget_focus); - - theme->set_stylebox(SNAME("normal"), SNAME("OptionButton"), style_widget); - theme->set_stylebox(SNAME("hover"), SNAME("OptionButton"), style_widget_hover); - theme->set_stylebox(SNAME("pressed"), SNAME("OptionButton"), style_widget_pressed); - theme->set_stylebox(SNAME("disabled"), SNAME("OptionButton"), style_widget_disabled); - - theme->set_stylebox(SNAME("normal_mirrored"), SNAME("OptionButton"), style_widget); - theme->set_stylebox(SNAME("hover_mirrored"), SNAME("OptionButton"), style_widget_hover); - theme->set_stylebox(SNAME("pressed_mirrored"), SNAME("OptionButton"), style_widget_pressed); - theme->set_stylebox(SNAME("disabled_mirrored"), SNAME("OptionButton"), style_widget_disabled); - - theme->set_color(SNAME("font_color"), SNAME("OptionButton"), font_color); - theme->set_color(SNAME("font_hover_color"), SNAME("OptionButton"), font_hover_color); - theme->set_color(SNAME("font_focus_color"), SNAME("OptionButton"), font_focus_color); - theme->set_color(SNAME("font_pressed_color"), SNAME("OptionButton"), accent_color); - theme->set_color(SNAME("font_disabled_color"), SNAME("OptionButton"), font_disabled_color); - theme->set_color(SNAME("icon_hover_color"), SNAME("OptionButton"), icon_hover_color); - theme->set_color(SNAME("icon_focus_color"), SNAME("OptionButton"), icon_focus_color); - theme->set_icon(SNAME("arrow"), SNAME("OptionButton"), theme->get_icon(SNAME("GuiOptionArrow"), SNAME("EditorIcons"))); - theme->set_constant(SNAME("arrow_margin"), SNAME("OptionButton"), widget_default_margin.x - 2 * EDSCALE); - theme->set_constant(SNAME("modulate_arrow"), SNAME("OptionButton"), true); - theme->set_constant(SNAME("hseparation"), SNAME("OptionButton"), 4 * EDSCALE); + theme->set_stylebox("focus", "OptionButton", style_widget_focus); + + theme->set_stylebox("normal", "OptionButton", style_widget); + theme->set_stylebox("hover", "OptionButton", style_widget_hover); + theme->set_stylebox("pressed", "OptionButton", style_widget_pressed); + theme->set_stylebox("disabled", "OptionButton", style_widget_disabled); + + theme->set_stylebox("normal_mirrored", "OptionButton", style_widget); + theme->set_stylebox("hover_mirrored", "OptionButton", style_widget_hover); + theme->set_stylebox("pressed_mirrored", "OptionButton", style_widget_pressed); + theme->set_stylebox("disabled_mirrored", "OptionButton", style_widget_disabled); + + theme->set_color("font_color", "OptionButton", font_color); + theme->set_color("font_hover_color", "OptionButton", font_hover_color); + theme->set_color("font_focus_color", "OptionButton", font_focus_color); + theme->set_color("font_pressed_color", "OptionButton", accent_color); + theme->set_color("font_disabled_color", "OptionButton", font_disabled_color); + theme->set_color("icon_hover_color", "OptionButton", icon_hover_color); + theme->set_color("icon_focus_color", "OptionButton", icon_focus_color); + theme->set_icon("arrow", "OptionButton", theme->get_icon(SNAME("GuiOptionArrow"), SNAME("EditorIcons"))); + theme->set_constant("arrow_margin", "OptionButton", widget_default_margin.x - 2 * EDSCALE); + theme->set_constant("modulate_arrow", "OptionButton", true); + theme->set_constant("hseparation", "OptionButton", 4 * EDSCALE); // CheckButton - theme->set_stylebox(SNAME("normal"), SNAME("CheckButton"), style_menu); - theme->set_stylebox(SNAME("pressed"), SNAME("CheckButton"), style_menu); - theme->set_stylebox(SNAME("disabled"), SNAME("CheckButton"), style_menu); - theme->set_stylebox(SNAME("hover"), SNAME("CheckButton"), style_menu); - - theme->set_icon(SNAME("on"), SNAME("CheckButton"), theme->get_icon(SNAME("GuiToggleOn"), SNAME("EditorIcons"))); - theme->set_icon(SNAME("on_disabled"), SNAME("CheckButton"), theme->get_icon(SNAME("GuiToggleOnDisabled"), SNAME("EditorIcons"))); - theme->set_icon(SNAME("off"), SNAME("CheckButton"), theme->get_icon(SNAME("GuiToggleOff"), SNAME("EditorIcons"))); - theme->set_icon(SNAME("off_disabled"), SNAME("CheckButton"), theme->get_icon(SNAME("GuiToggleOffDisabled"), SNAME("EditorIcons"))); - - theme->set_icon(SNAME("on_mirrored"), SNAME("CheckButton"), theme->get_icon(SNAME("GuiToggleOnMirrored"), SNAME("EditorIcons"))); - theme->set_icon(SNAME("on_disabled_mirrored"), SNAME("CheckButton"), theme->get_icon(SNAME("GuiToggleOnDisabledMirrored"), SNAME("EditorIcons"))); - theme->set_icon(SNAME("off_mirrored"), SNAME("CheckButton"), theme->get_icon(SNAME("GuiToggleOffMirrored"), SNAME("EditorIcons"))); - theme->set_icon(SNAME("off_disabled_mirrored"), SNAME("CheckButton"), theme->get_icon(SNAME("GuiToggleOffDisabledMirrored"), SNAME("EditorIcons"))); - - theme->set_color(SNAME("font_color"), SNAME("CheckButton"), font_color); - theme->set_color(SNAME("font_hover_color"), SNAME("CheckButton"), font_hover_color); - theme->set_color(SNAME("font_focus_color"), SNAME("CheckButton"), font_focus_color); - theme->set_color(SNAME("font_pressed_color"), SNAME("CheckButton"), accent_color); - theme->set_color(SNAME("font_disabled_color"), SNAME("CheckButton"), font_disabled_color); - theme->set_color(SNAME("icon_hover_color"), SNAME("CheckButton"), icon_hover_color); - theme->set_color(SNAME("icon_focus_color"), SNAME("CheckButton"), icon_focus_color); - - theme->set_constant(SNAME("hseparation"), SNAME("CheckButton"), 8 * EDSCALE); - theme->set_constant(SNAME("check_vadjust"), SNAME("CheckButton"), 0 * EDSCALE); + theme->set_stylebox("normal", "CheckButton", style_menu); + theme->set_stylebox("pressed", "CheckButton", style_menu); + theme->set_stylebox("disabled", "CheckButton", style_menu); + theme->set_stylebox("hover", "CheckButton", style_menu); + + theme->set_icon("on", "CheckButton", theme->get_icon(SNAME("GuiToggleOn"), SNAME("EditorIcons"))); + theme->set_icon("on_disabled", "CheckButton", theme->get_icon(SNAME("GuiToggleOnDisabled"), SNAME("EditorIcons"))); + theme->set_icon("off", "CheckButton", theme->get_icon(SNAME("GuiToggleOff"), SNAME("EditorIcons"))); + theme->set_icon("off_disabled", "CheckButton", theme->get_icon(SNAME("GuiToggleOffDisabled"), SNAME("EditorIcons"))); + + theme->set_icon("on_mirrored", "CheckButton", theme->get_icon(SNAME("GuiToggleOnMirrored"), SNAME("EditorIcons"))); + theme->set_icon("on_disabled_mirrored", "CheckButton", theme->get_icon(SNAME("GuiToggleOnDisabledMirrored"), SNAME("EditorIcons"))); + theme->set_icon("off_mirrored", "CheckButton", theme->get_icon(SNAME("GuiToggleOffMirrored"), SNAME("EditorIcons"))); + theme->set_icon("off_disabled_mirrored", "CheckButton", theme->get_icon(SNAME("GuiToggleOffDisabledMirrored"), SNAME("EditorIcons"))); + + theme->set_color("font_color", "CheckButton", font_color); + theme->set_color("font_hover_color", "CheckButton", font_hover_color); + theme->set_color("font_focus_color", "CheckButton", font_focus_color); + theme->set_color("font_pressed_color", "CheckButton", accent_color); + theme->set_color("font_disabled_color", "CheckButton", font_disabled_color); + theme->set_color("icon_hover_color", "CheckButton", icon_hover_color); + theme->set_color("icon_focus_color", "CheckButton", icon_focus_color); + + theme->set_constant("hseparation", "CheckButton", 8 * EDSCALE); + theme->set_constant("check_vadjust", "CheckButton", 0 * EDSCALE); // Checkbox Ref<StyleBoxFlat> sb_checkbox = style_menu->duplicate(); @@ -747,32 +747,32 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { sb_checkbox->set_default_margin(SIDE_TOP, default_margin_size * EDSCALE); sb_checkbox->set_default_margin(SIDE_BOTTOM, default_margin_size * EDSCALE); - theme->set_stylebox(SNAME("normal"), SNAME("CheckBox"), sb_checkbox); - theme->set_stylebox(SNAME("pressed"), SNAME("CheckBox"), sb_checkbox); - theme->set_stylebox(SNAME("disabled"), SNAME("CheckBox"), sb_checkbox); - theme->set_stylebox(SNAME("hover"), SNAME("CheckBox"), sb_checkbox); - theme->set_icon(SNAME("checked"), SNAME("CheckBox"), theme->get_icon(SNAME("GuiChecked"), SNAME("EditorIcons"))); - theme->set_icon(SNAME("unchecked"), SNAME("CheckBox"), theme->get_icon(SNAME("GuiUnchecked"), SNAME("EditorIcons"))); - theme->set_icon(SNAME("radio_checked"), SNAME("CheckBox"), theme->get_icon(SNAME("GuiRadioChecked"), SNAME("EditorIcons"))); - theme->set_icon(SNAME("radio_unchecked"), SNAME("CheckBox"), theme->get_icon(SNAME("GuiRadioUnchecked"), SNAME("EditorIcons"))); - theme->set_icon(SNAME("checked_disabled"), SNAME("CheckBox"), theme->get_icon(SNAME("GuiCheckedDisabled"), SNAME("EditorIcons"))); - theme->set_icon(SNAME("unchecked_disabled"), SNAME("CheckBox"), theme->get_icon(SNAME("GuiUncheckedDisabled"), SNAME("EditorIcons"))); - theme->set_icon(SNAME("radio_checked_disabled"), SNAME("CheckBox"), theme->get_icon(SNAME("GuiRadioCheckedDisabled"), SNAME("EditorIcons"))); - theme->set_icon(SNAME("radio_unchecked_disabled"), SNAME("CheckBox"), theme->get_icon(SNAME("GuiRadioUncheckedDisabled"), SNAME("EditorIcons"))); - - theme->set_color(SNAME("font_color"), SNAME("CheckBox"), font_color); - theme->set_color(SNAME("font_hover_color"), SNAME("CheckBox"), font_hover_color); - theme->set_color(SNAME("font_focus_color"), SNAME("CheckBox"), font_focus_color); - theme->set_color(SNAME("font_pressed_color"), SNAME("CheckBox"), accent_color); - theme->set_color(SNAME("font_disabled_color"), SNAME("CheckBox"), font_disabled_color); - theme->set_color(SNAME("icon_hover_color"), SNAME("CheckBox"), icon_hover_color); - theme->set_color(SNAME("icon_focus_color"), SNAME("CheckBox"), icon_focus_color); - - theme->set_constant(SNAME("hseparation"), SNAME("CheckBox"), 8 * EDSCALE); - theme->set_constant(SNAME("check_vadjust"), SNAME("CheckBox"), 0 * EDSCALE); + theme->set_stylebox("normal", "CheckBox", sb_checkbox); + theme->set_stylebox("pressed", "CheckBox", sb_checkbox); + theme->set_stylebox("disabled", "CheckBox", sb_checkbox); + theme->set_stylebox("hover", "CheckBox", sb_checkbox); + theme->set_icon("checked", "CheckBox", theme->get_icon(SNAME("GuiChecked"), SNAME("EditorIcons"))); + theme->set_icon("unchecked", "CheckBox", theme->get_icon(SNAME("GuiUnchecked"), SNAME("EditorIcons"))); + theme->set_icon("radio_checked", "CheckBox", theme->get_icon(SNAME("GuiRadioChecked"), SNAME("EditorIcons"))); + theme->set_icon("radio_unchecked", "CheckBox", theme->get_icon(SNAME("GuiRadioUnchecked"), SNAME("EditorIcons"))); + theme->set_icon("checked_disabled", "CheckBox", theme->get_icon(SNAME("GuiCheckedDisabled"), SNAME("EditorIcons"))); + theme->set_icon("unchecked_disabled", "CheckBox", theme->get_icon(SNAME("GuiUncheckedDisabled"), SNAME("EditorIcons"))); + theme->set_icon("radio_checked_disabled", "CheckBox", theme->get_icon(SNAME("GuiRadioCheckedDisabled"), SNAME("EditorIcons"))); + theme->set_icon("radio_unchecked_disabled", "CheckBox", theme->get_icon(SNAME("GuiRadioUncheckedDisabled"), SNAME("EditorIcons"))); + + theme->set_color("font_color", "CheckBox", font_color); + theme->set_color("font_hover_color", "CheckBox", font_hover_color); + theme->set_color("font_focus_color", "CheckBox", font_focus_color); + theme->set_color("font_pressed_color", "CheckBox", accent_color); + theme->set_color("font_disabled_color", "CheckBox", font_disabled_color); + theme->set_color("icon_hover_color", "CheckBox", icon_hover_color); + theme->set_color("icon_focus_color", "CheckBox", icon_focus_color); + + theme->set_constant("hseparation", "CheckBox", 8 * EDSCALE); + theme->set_constant("check_vadjust", "CheckBox", 0 * EDSCALE); // PopupDialog - theme->set_stylebox(SNAME("panel"), SNAME("PopupDialog"), style_popup); + theme->set_stylebox("panel", "PopupDialog", style_popup); // PopupMenu const int popup_menu_margin_size = default_margin_size * 1.5 * EDSCALE; @@ -787,39 +787,39 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { // Always display a border for PopupMenus so they can be distinguished from their background. style_popup_menu->set_border_width_all(1 * EDSCALE); style_popup_menu->set_border_color(dark_color_2); - theme->set_stylebox(SNAME("panel"), SNAME("PopupMenu"), style_popup_menu); + theme->set_stylebox("panel", "PopupMenu", style_popup_menu); Ref<StyleBoxFlat> style_menu_hover = style_widget_hover->duplicate(); // Don't use rounded corners for hover highlights since the StyleBox touches the PopupMenu's edges. style_menu_hover->set_corner_radius_all(0); - theme->set_stylebox(SNAME("hover"), SNAME("PopupMenu"), style_menu_hover); - - theme->set_stylebox(SNAME("separator"), SNAME("PopupMenu"), style_popup_separator); - theme->set_stylebox(SNAME("labeled_separator_left"), SNAME("PopupMenu"), style_popup_labeled_separator_left); - theme->set_stylebox(SNAME("labeled_separator_right"), SNAME("PopupMenu"), style_popup_labeled_separator_right); - - theme->set_color(SNAME("font_color"), SNAME("PopupMenu"), font_color); - theme->set_color(SNAME("font_hover_color"), SNAME("PopupMenu"), font_hover_color); - theme->set_color(SNAME("font_accelerator_color"), SNAME("PopupMenu"), font_disabled_color); - theme->set_color(SNAME("font_disabled_color"), SNAME("PopupMenu"), font_disabled_color); - theme->set_color(SNAME("font_separator_color"), SNAME("PopupMenu"), font_disabled_color); - theme->set_icon(SNAME("checked"), SNAME("PopupMenu"), theme->get_icon(SNAME("GuiChecked"), SNAME("EditorIcons"))); - theme->set_icon(SNAME("unchecked"), SNAME("PopupMenu"), theme->get_icon(SNAME("GuiUnchecked"), SNAME("EditorIcons"))); - theme->set_icon(SNAME("radio_checked"), SNAME("PopupMenu"), theme->get_icon(SNAME("GuiRadioChecked"), SNAME("EditorIcons"))); - theme->set_icon(SNAME("radio_unchecked"), SNAME("PopupMenu"), theme->get_icon(SNAME("GuiRadioUnchecked"), SNAME("EditorIcons"))); - theme->set_icon(SNAME("checked_disabled"), SNAME("PopupMenu"), theme->get_icon(SNAME("GuiCheckedDisabled"), SNAME("EditorIcons"))); - theme->set_icon(SNAME("unchecked_disabled"), SNAME("PopupMenu"), theme->get_icon(SNAME("GuiUncheckedDisabled"), SNAME("EditorIcons"))); - theme->set_icon(SNAME("radio_checked_disabled"), SNAME("PopupMenu"), theme->get_icon(SNAME("GuiRadioCheckedDisabled"), SNAME("EditorIcons"))); - theme->set_icon(SNAME("radio_unchecked_disabled"), SNAME("PopupMenu"), theme->get_icon(SNAME("GuiRadioUncheckedDisabled"), SNAME("EditorIcons"))); - theme->set_icon(SNAME("submenu"), SNAME("PopupMenu"), theme->get_icon(SNAME("ArrowRight"), SNAME("EditorIcons"))); - theme->set_icon(SNAME("submenu_mirrored"), SNAME("PopupMenu"), theme->get_icon(SNAME("ArrowLeft"), SNAME("EditorIcons"))); - theme->set_icon(SNAME("visibility_hidden"), SNAME("PopupMenu"), theme->get_icon(SNAME("GuiVisibilityHidden"), SNAME("EditorIcons"))); - theme->set_icon(SNAME("visibility_visible"), SNAME("PopupMenu"), theme->get_icon(SNAME("GuiVisibilityVisible"), SNAME("EditorIcons"))); - theme->set_icon(SNAME("visibility_xray"), SNAME("PopupMenu"), theme->get_icon(SNAME("GuiVisibilityXray"), SNAME("EditorIcons"))); - - theme->set_constant(SNAME("vseparation"), SNAME("PopupMenu"), (extra_spacing + default_margin_size + 1) * EDSCALE); - theme->set_constant(SNAME("item_start_padding"), SNAME("PopupMenu"), popup_menu_margin_size * EDSCALE); - theme->set_constant(SNAME("item_end_padding"), SNAME("PopupMenu"), popup_menu_margin_size * EDSCALE); + theme->set_stylebox("hover", "PopupMenu", style_menu_hover); + + theme->set_stylebox("separator", "PopupMenu", style_popup_separator); + theme->set_stylebox("labeled_separator_left", "PopupMenu", style_popup_labeled_separator_left); + theme->set_stylebox("labeled_separator_right", "PopupMenu", style_popup_labeled_separator_right); + + theme->set_color("font_color", "PopupMenu", font_color); + theme->set_color("font_hover_color", "PopupMenu", font_hover_color); + theme->set_color("font_accelerator_color", "PopupMenu", font_disabled_color); + theme->set_color("font_disabled_color", "PopupMenu", font_disabled_color); + theme->set_color("font_separator_color", "PopupMenu", font_disabled_color); + theme->set_icon("checked", "PopupMenu", theme->get_icon(SNAME("GuiChecked"), SNAME("EditorIcons"))); + theme->set_icon("unchecked", "PopupMenu", theme->get_icon(SNAME("GuiUnchecked"), SNAME("EditorIcons"))); + theme->set_icon("radio_checked", "PopupMenu", theme->get_icon(SNAME("GuiRadioChecked"), SNAME("EditorIcons"))); + theme->set_icon("radio_unchecked", "PopupMenu", theme->get_icon(SNAME("GuiRadioUnchecked"), SNAME("EditorIcons"))); + theme->set_icon("checked_disabled", "PopupMenu", theme->get_icon(SNAME("GuiCheckedDisabled"), SNAME("EditorIcons"))); + theme->set_icon("unchecked_disabled", "PopupMenu", theme->get_icon(SNAME("GuiUncheckedDisabled"), SNAME("EditorIcons"))); + theme->set_icon("radio_checked_disabled", "PopupMenu", theme->get_icon(SNAME("GuiRadioCheckedDisabled"), SNAME("EditorIcons"))); + theme->set_icon("radio_unchecked_disabled", "PopupMenu", theme->get_icon(SNAME("GuiRadioUncheckedDisabled"), SNAME("EditorIcons"))); + theme->set_icon("submenu", "PopupMenu", theme->get_icon(SNAME("ArrowRight"), SNAME("EditorIcons"))); + theme->set_icon("submenu_mirrored", "PopupMenu", theme->get_icon(SNAME("ArrowLeft"), SNAME("EditorIcons"))); + theme->set_icon("visibility_hidden", "PopupMenu", theme->get_icon(SNAME("GuiVisibilityHidden"), SNAME("EditorIcons"))); + theme->set_icon("visibility_visible", "PopupMenu", theme->get_icon(SNAME("GuiVisibilityVisible"), SNAME("EditorIcons"))); + theme->set_icon("visibility_xray", "PopupMenu", theme->get_icon(SNAME("GuiVisibilityXray"), SNAME("EditorIcons"))); + + theme->set_constant("vseparation", "PopupMenu", (extra_spacing + default_margin_size + 1) * EDSCALE); + theme->set_constant("item_start_padding", "PopupMenu", popup_menu_margin_size * EDSCALE); + theme->set_constant("item_end_padding", "PopupMenu", popup_menu_margin_size * EDSCALE); for (int i = 0; i < 16; i++) { Color si_base_color = accent_color; @@ -843,7 +843,7 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { sub_inspector_bg->set_border_color(si_base_color * Color(0.7, 0.7, 0.7, 0.8)); sub_inspector_bg->set_draw_center(true); - theme->set_stylebox("sub_inspector_bg" + itos(i), SNAME("Editor"), sub_inspector_bg); + theme->set_stylebox("sub_inspector_bg" + itos(i), "Editor", sub_inspector_bg); Ref<StyleBoxFlat> bg_color; bg_color.instantiate(); @@ -855,99 +855,99 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { bg_color_selected->set_border_width_all(0); bg_color_selected->set_bg_color(si_base_color * Color(0.8, 0.8, 0.8, 0.8)); - theme->set_stylebox("sub_inspector_property_bg" + itos(i), SNAME("Editor"), bg_color); - theme->set_stylebox("sub_inspector_property_bg_selected" + itos(i), SNAME("Editor"), bg_color_selected); + theme->set_stylebox("sub_inspector_property_bg" + itos(i), "Editor", bg_color); + theme->set_stylebox("sub_inspector_property_bg_selected" + itos(i), "Editor", bg_color_selected); } - theme->set_color(SNAME("sub_inspector_property_color"), SNAME("Editor"), dark_theme ? Color(1, 1, 1, 1) : Color(0, 0, 0, 1)); - theme->set_constant(SNAME("sub_inspector_font_offset"), SNAME("Editor"), 4 * EDSCALE); + theme->set_color("sub_inspector_property_color", "Editor", dark_theme ? Color(1, 1, 1, 1) : Color(0, 0, 0, 1)); + theme->set_constant("sub_inspector_font_offset", "Editor", 4 * EDSCALE); Ref<StyleBoxFlat> style_property_bg = style_default->duplicate(); style_property_bg->set_bg_color(highlight_color); style_property_bg->set_border_width_all(0); - theme->set_constant(SNAME("font_offset"), SNAME("EditorProperty"), 8 * EDSCALE); - theme->set_stylebox(SNAME("bg_selected"), SNAME("EditorProperty"), style_property_bg); - theme->set_stylebox(SNAME("bg"), SNAME("EditorProperty"), Ref<StyleBoxEmpty>(memnew(StyleBoxEmpty))); - theme->set_constant(SNAME("vseparation"), SNAME("EditorProperty"), (extra_spacing + default_margin_size) * EDSCALE); - theme->set_color(SNAME("warning_color"), SNAME("EditorProperty"), warning_color); - theme->set_color(SNAME("property_color"), SNAME("EditorProperty"), property_color); - theme->set_color(SNAME("readonly_color"), SNAME("EditorProperty"), readonly_color); - theme->set_color(SNAME("readonly_warning_color"), SNAME("EditorProperty"), readonly_warning_color); + theme->set_constant("font_offset", "EditorProperty", 8 * EDSCALE); + theme->set_stylebox("bg_selected", "EditorProperty", style_property_bg); + theme->set_stylebox("bg", "EditorProperty", Ref<StyleBoxEmpty>(memnew(StyleBoxEmpty))); + theme->set_constant("vseparation", "EditorProperty", (extra_spacing + default_margin_size) * EDSCALE); + theme->set_color("warning_color", "EditorProperty", warning_color); + theme->set_color("property_color", "EditorProperty", property_color); + theme->set_color("readonly_color", "EditorProperty", readonly_color); + theme->set_color("readonly_warning_color", "EditorProperty", readonly_warning_color); Color inspector_section_color = font_color.lerp(Color(0.5, 0.5, 0.5), 0.35); - theme->set_color(SNAME("font_color"), SNAME("EditorInspectorSection"), inspector_section_color); + theme->set_color("font_color", "EditorInspectorSection", inspector_section_color); - theme->set_constant(SNAME("inspector_margin"), SNAME("Editor"), 12 * EDSCALE); + theme->set_constant("inspector_margin", "Editor", 12 * EDSCALE); // Tree & ItemList background Ref<StyleBoxFlat> style_tree_bg = style_default->duplicate(); // Make Trees easier to distinguish from other controls by using a darker background color. style_tree_bg->set_bg_color(dark_color_1.lerp(dark_color_2, 0.5)); style_tree_bg->set_border_color(dark_color_3); - theme->set_stylebox(SNAME("bg"), SNAME("Tree"), style_tree_bg); + theme->set_stylebox("bg", "Tree", style_tree_bg); // Tree - theme->set_icon(SNAME("checked"), SNAME("Tree"), theme->get_icon(SNAME("GuiChecked"), SNAME("EditorIcons"))); - theme->set_icon(SNAME("indeterminate"), SNAME("Tree"), theme->get_icon(SNAME("GuiIndeterminate"), SNAME("EditorIcons"))); - theme->set_icon(SNAME("unchecked"), SNAME("Tree"), theme->get_icon(SNAME("GuiUnchecked"), SNAME("EditorIcons"))); - theme->set_icon(SNAME("arrow"), SNAME("Tree"), theme->get_icon(SNAME("GuiTreeArrowDown"), SNAME("EditorIcons"))); - theme->set_icon(SNAME("arrow_collapsed"), SNAME("Tree"), theme->get_icon(SNAME("GuiTreeArrowRight"), SNAME("EditorIcons"))); - theme->set_icon(SNAME("arrow_collapsed_mirrored"), SNAME("Tree"), theme->get_icon(SNAME("GuiTreeArrowLeft"), SNAME("EditorIcons"))); - theme->set_icon(SNAME("updown"), SNAME("Tree"), theme->get_icon(SNAME("GuiTreeUpdown"), SNAME("EditorIcons"))); - theme->set_icon(SNAME("select_arrow"), SNAME("Tree"), theme->get_icon(SNAME("GuiDropdown"), SNAME("EditorIcons"))); - theme->set_stylebox(SNAME("bg_focus"), SNAME("Tree"), style_widget_focus); - theme->set_stylebox(SNAME("custom_button"), SNAME("Tree"), make_empty_stylebox()); - theme->set_stylebox(SNAME("custom_button_pressed"), SNAME("Tree"), make_empty_stylebox()); - theme->set_stylebox(SNAME("custom_button_hover"), SNAME("Tree"), style_widget); - theme->set_color(SNAME("custom_button_font_highlight"), SNAME("Tree"), font_hover_color); - theme->set_color(SNAME("font_color"), SNAME("Tree"), font_color); - theme->set_color(SNAME("font_selected_color"), SNAME("Tree"), mono_color); - theme->set_color(SNAME("title_button_color"), SNAME("Tree"), font_color); - theme->set_color(SNAME("drop_position_color"), SNAME("Tree"), accent_color); - theme->set_constant(SNAME("vseparation"), SNAME("Tree"), widget_default_margin.y - EDSCALE); - theme->set_constant(SNAME("hseparation"), SNAME("Tree"), 6 * EDSCALE); - theme->set_constant(SNAME("guide_width"), SNAME("Tree"), border_width); - theme->set_constant(SNAME("item_margin"), SNAME("Tree"), 3 * default_margin_size * EDSCALE); - theme->set_constant(SNAME("button_margin"), SNAME("Tree"), default_margin_size * EDSCALE); - theme->set_constant(SNAME("scroll_border"), SNAME("Tree"), 40 * EDSCALE); - theme->set_constant(SNAME("scroll_speed"), SNAME("Tree"), 12); + theme->set_icon("checked", "Tree", theme->get_icon(SNAME("GuiChecked"), SNAME("EditorIcons"))); + theme->set_icon("indeterminate", "Tree", theme->get_icon(SNAME("GuiIndeterminate"), SNAME("EditorIcons"))); + theme->set_icon("unchecked", "Tree", theme->get_icon(SNAME("GuiUnchecked"), SNAME("EditorIcons"))); + theme->set_icon("arrow", "Tree", theme->get_icon(SNAME("GuiTreeArrowDown"), SNAME("EditorIcons"))); + theme->set_icon("arrow_collapsed", "Tree", theme->get_icon(SNAME("GuiTreeArrowRight"), SNAME("EditorIcons"))); + theme->set_icon("arrow_collapsed_mirrored", "Tree", theme->get_icon(SNAME("GuiTreeArrowLeft"), SNAME("EditorIcons"))); + theme->set_icon("updown", "Tree", theme->get_icon(SNAME("GuiTreeUpdown"), SNAME("EditorIcons"))); + theme->set_icon("select_arrow", "Tree", theme->get_icon(SNAME("GuiDropdown"), SNAME("EditorIcons"))); + theme->set_stylebox("bg_focus", "Tree", style_widget_focus); + theme->set_stylebox("custom_button", "Tree", make_empty_stylebox()); + theme->set_stylebox("custom_button_pressed", "Tree", make_empty_stylebox()); + theme->set_stylebox("custom_button_hover", "Tree", style_widget); + theme->set_color("custom_button_font_highlight", "Tree", font_hover_color); + theme->set_color("font_color", "Tree", font_color); + theme->set_color("font_selected_color", "Tree", mono_color); + theme->set_color("title_button_color", "Tree", font_color); + theme->set_color("drop_position_color", "Tree", accent_color); + theme->set_constant("vseparation", "Tree", widget_default_margin.y - EDSCALE); + theme->set_constant("hseparation", "Tree", 6 * EDSCALE); + theme->set_constant("guide_width", "Tree", border_width); + theme->set_constant("item_margin", "Tree", 3 * default_margin_size * EDSCALE); + theme->set_constant("button_margin", "Tree", default_margin_size * EDSCALE); + theme->set_constant("scroll_border", "Tree", 40 * EDSCALE); + theme->set_constant("scroll_speed", "Tree", 12); const Color guide_color = mono_color * Color(1, 1, 1, 0.05); Color relationship_line_color = mono_color * Color(1, 1, 1, relationship_line_opacity); - theme->set_constant(SNAME("draw_guides"), SNAME("Tree"), relationship_line_opacity < 0.01); - theme->set_color(SNAME("guide_color"), SNAME("Tree"), guide_color); + theme->set_constant("draw_guides", "Tree", relationship_line_opacity < 0.01); + theme->set_color("guide_color", "Tree", guide_color); int relationship_line_width = 1; Color parent_line_color = mono_color * Color(1, 1, 1, CLAMP(relationship_line_opacity + 0.45, 0.0, 1.0)); Color children_line_color = mono_color * Color(1, 1, 1, CLAMP(relationship_line_opacity + 0.25, 0.0, 1.0)); - theme->set_constant(SNAME("draw_relationship_lines"), SNAME("Tree"), relationship_line_opacity >= 0.01); - theme->set_constant(SNAME("relationship_line_width"), SNAME("Tree"), relationship_line_width); - theme->set_constant(SNAME("parent_hl_line_width"), SNAME("Tree"), relationship_line_width * 2); - theme->set_constant(SNAME("children_hl_line_width"), SNAME("Tree"), relationship_line_width); - theme->set_constant(SNAME("parent_hl_line_margin"), SNAME("Tree"), relationship_line_width * 3); - theme->set_color(SNAME("relationship_line_color"), SNAME("Tree"), relationship_line_color); - theme->set_color(SNAME("parent_hl_line_color"), SNAME("Tree"), parent_line_color); - theme->set_color(SNAME("children_hl_line_color"), SNAME("Tree"), children_line_color); + theme->set_constant("draw_relationship_lines", "Tree", relationship_line_opacity >= 0.01); + theme->set_constant("relationship_line_width", "Tree", relationship_line_width); + theme->set_constant("parent_hl_line_width", "Tree", relationship_line_width * 2); + theme->set_constant("children_hl_line_width", "Tree", relationship_line_width); + theme->set_constant("parent_hl_line_margin", "Tree", relationship_line_width * 3); + theme->set_color("relationship_line_color", "Tree", relationship_line_color); + theme->set_color("parent_hl_line_color", "Tree", parent_line_color); + theme->set_color("children_hl_line_color", "Tree", children_line_color); Ref<StyleBoxFlat> style_tree_btn = style_default->duplicate(); style_tree_btn->set_bg_color(highlight_color); style_tree_btn->set_border_width_all(0); - theme->set_stylebox(SNAME("button_pressed"), SNAME("Tree"), style_tree_btn); + theme->set_stylebox("button_pressed", "Tree", style_tree_btn); Ref<StyleBoxFlat> style_tree_hover = style_default->duplicate(); style_tree_hover->set_bg_color(highlight_color * Color(1, 1, 1, 0.4)); style_tree_hover->set_border_width_all(0); - theme->set_stylebox(SNAME("hover"), SNAME("Tree"), style_tree_hover); + theme->set_stylebox("hover", "Tree", style_tree_hover); Ref<StyleBoxFlat> style_tree_focus = style_default->duplicate(); style_tree_focus->set_bg_color(highlight_color); style_tree_focus->set_border_width_all(0); - theme->set_stylebox(SNAME("selected_focus"), SNAME("Tree"), style_tree_focus); + theme->set_stylebox("selected_focus", "Tree", style_tree_focus); Ref<StyleBoxFlat> style_tree_selected = style_tree_focus->duplicate(); - theme->set_stylebox(SNAME("selected"), SNAME("Tree"), style_tree_selected); + theme->set_stylebox("selected", "Tree", style_tree_selected); Ref<StyleBoxFlat> style_tree_cursor = style_default->duplicate(); style_tree_cursor->set_draw_center(false); @@ -957,25 +957,25 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { Ref<StyleBoxFlat> style_tree_title = style_default->duplicate(); style_tree_title->set_bg_color(dark_color_3); style_tree_title->set_border_width_all(0); - theme->set_stylebox(SNAME("cursor"), SNAME("Tree"), style_tree_cursor); - theme->set_stylebox(SNAME("cursor_unfocused"), SNAME("Tree"), style_tree_cursor); - theme->set_stylebox(SNAME("title_button_normal"), SNAME("Tree"), style_tree_title); - theme->set_stylebox(SNAME("title_button_hover"), SNAME("Tree"), style_tree_title); - theme->set_stylebox(SNAME("title_button_pressed"), SNAME("Tree"), style_tree_title); + theme->set_stylebox("cursor", "Tree", style_tree_cursor); + theme->set_stylebox("cursor_unfocused", "Tree", style_tree_cursor); + theme->set_stylebox("title_button_normal", "Tree", style_tree_title); + theme->set_stylebox("title_button_hover", "Tree", style_tree_title); + theme->set_stylebox("title_button_pressed", "Tree", style_tree_title); Color prop_category_color = dark_color_1.lerp(mono_color, 0.12); Color prop_section_color = dark_color_1.lerp(mono_color, 0.09); Color prop_subsection_color = dark_color_1.lerp(mono_color, 0.06); - theme->set_color(SNAME("prop_category"), SNAME("Editor"), prop_category_color); - theme->set_color(SNAME("prop_section"), SNAME("Editor"), prop_section_color); - theme->set_color(SNAME("prop_subsection"), SNAME("Editor"), prop_subsection_color); - theme->set_color(SNAME("drop_position_color"), SNAME("Tree"), accent_color); + theme->set_color("prop_category", "Editor", prop_category_color); + theme->set_color("prop_section", "Editor", prop_section_color); + theme->set_color("prop_subsection", "Editor", prop_subsection_color); + theme->set_color("drop_position_color", "Tree", accent_color); Ref<StyleBoxFlat> category_bg = style_default->duplicate(); // Make Trees easier to distinguish from other controls by using a darker background color. category_bg->set_bg_color(prop_category_color); category_bg->set_border_color(prop_category_color); - theme->set_stylebox(SNAME("prop_category_style"), SNAME("Editor"), category_bg); + theme->set_stylebox("prop_category_style", "Editor", category_bg); // ItemList Ref<StyleBoxFlat> style_itemlist_bg = style_default->duplicate(); @@ -987,47 +987,47 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { style_itemlist_cursor->set_draw_center(false); style_itemlist_cursor->set_border_width_all(border_width); style_itemlist_cursor->set_border_color(highlight_color); - theme->set_stylebox(SNAME("cursor"), SNAME("ItemList"), style_itemlist_cursor); - theme->set_stylebox(SNAME("cursor_unfocused"), SNAME("ItemList"), style_itemlist_cursor); - theme->set_stylebox(SNAME("selected_focus"), SNAME("ItemList"), style_tree_focus); - theme->set_stylebox(SNAME("selected"), SNAME("ItemList"), style_tree_selected); - theme->set_stylebox(SNAME("bg_focus"), SNAME("ItemList"), style_widget_focus); - theme->set_stylebox(SNAME("bg"), SNAME("ItemList"), style_itemlist_bg); - theme->set_color(SNAME("font_color"), SNAME("ItemList"), font_color); - theme->set_color(SNAME("font_selected_color"), SNAME("ItemList"), mono_color); - theme->set_color(SNAME("guide_color"), SNAME("ItemList"), guide_color); - theme->set_constant(SNAME("vseparation"), SNAME("ItemList"), widget_default_margin.y - EDSCALE); - theme->set_constant(SNAME("hseparation"), SNAME("ItemList"), 6 * EDSCALE); - theme->set_constant(SNAME("icon_margin"), SNAME("ItemList"), 6 * EDSCALE); - theme->set_constant(SNAME("line_separation"), SNAME("ItemList"), 3 * EDSCALE); + theme->set_stylebox("cursor", "ItemList", style_itemlist_cursor); + theme->set_stylebox("cursor_unfocused", "ItemList", style_itemlist_cursor); + theme->set_stylebox("selected_focus", "ItemList", style_tree_focus); + theme->set_stylebox("selected", "ItemList", style_tree_selected); + theme->set_stylebox("bg_focus", "ItemList", style_widget_focus); + theme->set_stylebox("bg", "ItemList", style_itemlist_bg); + theme->set_color("font_color", "ItemList", font_color); + theme->set_color("font_selected_color", "ItemList", mono_color); + theme->set_color("guide_color", "ItemList", guide_color); + theme->set_constant("vseparation", "ItemList", widget_default_margin.y - EDSCALE); + theme->set_constant("hseparation", "ItemList", 6 * EDSCALE); + theme->set_constant("icon_margin", "ItemList", 6 * EDSCALE); + theme->set_constant("line_separation", "ItemList", 3 * EDSCALE); // TabBar & TabContainer - theme->set_stylebox(SNAME("tab_selected"), SNAME("TabContainer"), style_tab_selected); - theme->set_stylebox(SNAME("tab_unselected"), SNAME("TabContainer"), style_tab_unselected); - theme->set_stylebox(SNAME("tab_disabled"), SNAME("TabContainer"), style_tab_disabled); - theme->set_stylebox(SNAME("tab_selected"), SNAME("TabBar"), style_tab_selected); - theme->set_stylebox(SNAME("tab_unselected"), SNAME("TabBar"), style_tab_unselected); - theme->set_stylebox(SNAME("tab_disabled"), SNAME("TabBar"), style_tab_disabled); - theme->set_color(SNAME("font_selected_color"), SNAME("TabContainer"), font_color); - theme->set_color(SNAME("font_unselected_color"), SNAME("TabContainer"), font_disabled_color); - theme->set_color(SNAME("font_selected_color"), SNAME("TabBar"), font_color); - theme->set_color(SNAME("font_unselected_color"), SNAME("TabBar"), font_disabled_color); - theme->set_icon(SNAME("menu"), SNAME("TabContainer"), theme->get_icon(SNAME("GuiTabMenu"), SNAME("EditorIcons"))); - theme->set_icon(SNAME("menu_highlight"), SNAME("TabContainer"), theme->get_icon(SNAME("GuiTabMenuHl"), SNAME("EditorIcons"))); - theme->set_stylebox(SNAME("SceneTabFG"), SNAME("EditorStyles"), style_tab_selected); - theme->set_stylebox(SNAME("SceneTabBG"), SNAME("EditorStyles"), style_tab_unselected); - theme->set_icon(SNAME("close"), SNAME("TabBar"), theme->get_icon(SNAME("GuiClose"), SNAME("EditorIcons"))); - theme->set_stylebox(SNAME("button_pressed"), SNAME("TabBar"), style_menu); - theme->set_stylebox(SNAME("button_highlight"), SNAME("TabBar"), style_menu); - theme->set_icon(SNAME("increment"), SNAME("TabContainer"), theme->get_icon(SNAME("GuiScrollArrowRight"), SNAME("EditorIcons"))); - theme->set_icon(SNAME("decrement"), SNAME("TabContainer"), theme->get_icon(SNAME("GuiScrollArrowLeft"), SNAME("EditorIcons"))); - theme->set_icon(SNAME("increment"), SNAME("TabBar"), theme->get_icon(SNAME("GuiScrollArrowRight"), SNAME("EditorIcons"))); - theme->set_icon(SNAME("decrement"), SNAME("TabBar"), theme->get_icon(SNAME("GuiScrollArrowLeft"), SNAME("EditorIcons"))); - theme->set_icon(SNAME("increment_highlight"), SNAME("TabBar"), theme->get_icon(SNAME("GuiScrollArrowRightHl"), SNAME("EditorIcons"))); - theme->set_icon(SNAME("decrement_highlight"), SNAME("TabBar"), theme->get_icon(SNAME("GuiScrollArrowLeftHl"), SNAME("EditorIcons"))); - theme->set_icon(SNAME("increment_highlight"), SNAME("TabContainer"), theme->get_icon(SNAME("GuiScrollArrowRightHl"), SNAME("EditorIcons"))); - theme->set_icon(SNAME("decrement_highlight"), SNAME("TabContainer"), theme->get_icon(SNAME("GuiScrollArrowLeftHl"), SNAME("EditorIcons"))); - theme->set_constant(SNAME("hseparation"), SNAME("TabBar"), 4 * EDSCALE); + theme->set_stylebox("tab_selected", "TabContainer", style_tab_selected); + theme->set_stylebox("tab_unselected", "TabContainer", style_tab_unselected); + theme->set_stylebox("tab_disabled", "TabContainer", style_tab_disabled); + theme->set_stylebox("tab_selected", "TabBar", style_tab_selected); + theme->set_stylebox("tab_unselected", "TabBar", style_tab_unselected); + theme->set_stylebox("tab_disabled", "TabBar", style_tab_disabled); + theme->set_color("font_selected_color", "TabContainer", font_color); + theme->set_color("font_unselected_color", "TabContainer", font_disabled_color); + theme->set_color("font_selected_color", "TabBar", font_color); + theme->set_color("font_unselected_color", "TabBar", font_disabled_color); + theme->set_icon("menu", "TabContainer", theme->get_icon(SNAME("GuiTabMenu"), SNAME("EditorIcons"))); + theme->set_icon("menu_highlight", "TabContainer", theme->get_icon(SNAME("GuiTabMenuHl"), SNAME("EditorIcons"))); + theme->set_stylebox("SceneTabFG", "EditorStyles", style_tab_selected); + theme->set_stylebox("SceneTabBG", "EditorStyles", style_tab_unselected); + theme->set_icon("close", "TabBar", theme->get_icon(SNAME("GuiClose"), SNAME("EditorIcons"))); + theme->set_stylebox("button_pressed", "TabBar", style_menu); + theme->set_stylebox("button_highlight", "TabBar", style_menu); + theme->set_icon("increment", "TabContainer", theme->get_icon(SNAME("GuiScrollArrowRight"), SNAME("EditorIcons"))); + theme->set_icon("decrement", "TabContainer", theme->get_icon(SNAME("GuiScrollArrowLeft"), SNAME("EditorIcons"))); + theme->set_icon("increment", "TabBar", theme->get_icon(SNAME("GuiScrollArrowRight"), SNAME("EditorIcons"))); + theme->set_icon("decrement", "TabBar", theme->get_icon(SNAME("GuiScrollArrowLeft"), SNAME("EditorIcons"))); + theme->set_icon("increment_highlight", "TabBar", theme->get_icon(SNAME("GuiScrollArrowRightHl"), SNAME("EditorIcons"))); + theme->set_icon("decrement_highlight", "TabBar", theme->get_icon(SNAME("GuiScrollArrowLeftHl"), SNAME("EditorIcons"))); + theme->set_icon("increment_highlight", "TabContainer", theme->get_icon(SNAME("GuiScrollArrowRightHl"), SNAME("EditorIcons"))); + theme->set_icon("decrement_highlight", "TabContainer", theme->get_icon(SNAME("GuiScrollArrowLeftHl"), SNAME("EditorIcons"))); + theme->set_constant("hseparation", "TabBar", 4 * EDSCALE); // Content of each tab Ref<StyleBoxFlat> style_content_panel = style_default->duplicate(); @@ -1041,16 +1041,16 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { // Display border to visually split the body of the container from its possible backgrounds. style_content_panel->set_border_width(Side::SIDE_TOP, Math::round(2 * EDSCALE)); style_content_panel->set_border_color(dark_color_2); - theme->set_stylebox(SNAME("panel"), SNAME("TabContainer"), style_content_panel); + theme->set_stylebox("panel", "TabContainer", style_content_panel); // These styleboxes can be used on tabs against the base color background (e.g. nested tabs). Ref<StyleBoxFlat> style_tab_selected_odd = style_tab_selected->duplicate(); style_tab_selected_odd->set_bg_color(disabled_bg_color); - theme->set_stylebox(SNAME("tab_selected_odd"), SNAME("TabContainer"), style_tab_selected_odd); + theme->set_stylebox("tab_selected_odd", "TabContainer", style_tab_selected_odd); Ref<StyleBoxFlat> style_content_panel_odd = style_content_panel->duplicate(); style_content_panel_odd->set_bg_color(disabled_bg_color); - theme->set_stylebox(SNAME("panel_odd"), SNAME("TabContainer"), style_content_panel_odd); + theme->set_stylebox("panel_odd", "TabContainer", style_content_panel_odd); // This stylebox is used in 3d and 2d viewports (no borders). Ref<StyleBoxFlat> style_content_panel_vp = style_content_panel->duplicate(); @@ -1058,31 +1058,31 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { style_content_panel_vp->set_default_margin(SIDE_TOP, default_margin_size * EDSCALE); style_content_panel_vp->set_default_margin(SIDE_RIGHT, border_width * 2); style_content_panel_vp->set_default_margin(SIDE_BOTTOM, border_width * 2); - theme->set_stylebox(SNAME("Content"), SNAME("EditorStyles"), style_content_panel_vp); + theme->set_stylebox("Content", "EditorStyles", style_content_panel_vp); // This stylebox is used by preview tabs in the Theme Editor. Ref<StyleBoxFlat> style_theme_preview_tab = style_tab_selected_odd->duplicate(); style_theme_preview_tab->set_expand_margin_size(SIDE_BOTTOM, 5 * EDSCALE); - theme->set_stylebox(SNAME("ThemeEditorPreviewFG"), SNAME("EditorStyles"), style_theme_preview_tab); + theme->set_stylebox("ThemeEditorPreviewFG", "EditorStyles", style_theme_preview_tab); Ref<StyleBoxFlat> style_theme_preview_bg_tab = style_tab_unselected->duplicate(); style_theme_preview_bg_tab->set_expand_margin_size(SIDE_BOTTOM, 2 * EDSCALE); - theme->set_stylebox(SNAME("ThemeEditorPreviewBG"), SNAME("EditorStyles"), style_theme_preview_bg_tab); + theme->set_stylebox("ThemeEditorPreviewBG", "EditorStyles", style_theme_preview_bg_tab); // Separators - theme->set_stylebox(SNAME("separator"), SNAME("HSeparator"), make_line_stylebox(separator_color, MAX(Math::round(EDSCALE), border_width))); - theme->set_stylebox(SNAME("separator"), SNAME("VSeparator"), make_line_stylebox(separator_color, MAX(Math::round(EDSCALE), border_width), 0, 0, true)); + theme->set_stylebox("separator", "HSeparator", make_line_stylebox(separator_color, MAX(Math::round(EDSCALE), border_width))); + theme->set_stylebox("separator", "VSeparator", make_line_stylebox(separator_color, MAX(Math::round(EDSCALE), border_width), 0, 0, true)); // Debugger Ref<StyleBoxFlat> style_panel_debugger = style_content_panel->duplicate(); style_panel_debugger->set_border_width(SIDE_BOTTOM, 0); - theme->set_stylebox(SNAME("DebuggerPanel"), SNAME("EditorStyles"), style_panel_debugger); + theme->set_stylebox("DebuggerPanel", "EditorStyles", style_panel_debugger); Ref<StyleBoxFlat> style_panel_invisible_top = style_content_panel->duplicate(); int stylebox_offset = theme->get_font(SNAME("tab_selected"), SNAME("TabContainer"))->get_height(theme->get_font_size(SNAME("tab_selected"), SNAME("TabContainer"))) + theme->get_stylebox(SNAME("tab_selected"), SNAME("TabContainer"))->get_minimum_size().height + theme->get_stylebox(SNAME("panel"), SNAME("TabContainer"))->get_default_margin(SIDE_TOP); style_panel_invisible_top->set_expand_margin_size(SIDE_TOP, -stylebox_offset); style_panel_invisible_top->set_default_margin(SIDE_TOP, 0); - theme->set_stylebox(SNAME("BottomPanelDebuggerOverride"), SNAME("EditorStyles"), style_panel_invisible_top); + theme->set_stylebox("BottomPanelDebuggerOverride", "EditorStyles", style_panel_invisible_top); // LineEdit @@ -1102,74 +1102,74 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { style_line_edit_disabled->set_border_color(disabled_color); style_line_edit_disabled->set_bg_color(disabled_bg_color); - theme->set_stylebox(SNAME("normal"), SNAME("LineEdit"), style_line_edit); - theme->set_stylebox(SNAME("focus"), SNAME("LineEdit"), style_widget_focus); - theme->set_stylebox(SNAME("read_only"), SNAME("LineEdit"), style_line_edit_disabled); - theme->set_icon(SNAME("clear"), SNAME("LineEdit"), theme->get_icon(SNAME("GuiClose"), SNAME("EditorIcons"))); - theme->set_color(SNAME("read_only"), SNAME("LineEdit"), font_disabled_color); - theme->set_color(SNAME("font_color"), SNAME("LineEdit"), font_color); - theme->set_color(SNAME("font_selected_color"), SNAME("LineEdit"), mono_color); - theme->set_color(SNAME("font_uneditable_color"), SNAME("LineEdit"), font_readonly_color); - theme->set_color(SNAME("font_placeholder_color"), SNAME("LineEdit"), font_placeholder_color); - theme->set_color(SNAME("caret_color"), SNAME("LineEdit"), font_color); - theme->set_color(SNAME("selection_color"), SNAME("LineEdit"), selection_color); - theme->set_color(SNAME("clear_button_color"), SNAME("LineEdit"), font_color); - theme->set_color(SNAME("clear_button_color_pressed"), SNAME("LineEdit"), accent_color); + theme->set_stylebox("normal", "LineEdit", style_line_edit); + theme->set_stylebox("focus", "LineEdit", style_widget_focus); + theme->set_stylebox("read_only", "LineEdit", style_line_edit_disabled); + theme->set_icon("clear", "LineEdit", theme->get_icon(SNAME("GuiClose"), SNAME("EditorIcons"))); + theme->set_color("read_only", "LineEdit", font_disabled_color); + theme->set_color("font_color", "LineEdit", font_color); + theme->set_color("font_selected_color", "LineEdit", mono_color); + theme->set_color("font_uneditable_color", "LineEdit", font_readonly_color); + theme->set_color("font_placeholder_color", "LineEdit", font_placeholder_color); + theme->set_color("caret_color", "LineEdit", font_color); + theme->set_color("selection_color", "LineEdit", selection_color); + theme->set_color("clear_button_color", "LineEdit", font_color); + theme->set_color("clear_button_color_pressed", "LineEdit", accent_color); // TextEdit - theme->set_stylebox(SNAME("normal"), SNAME("TextEdit"), style_line_edit); - theme->set_stylebox(SNAME("focus"), SNAME("TextEdit"), style_widget_focus); - theme->set_stylebox(SNAME("read_only"), SNAME("TextEdit"), style_line_edit_disabled); - theme->set_constant(SNAME("side_margin"), SNAME("TabContainer"), 0); - theme->set_icon(SNAME("tab"), SNAME("TextEdit"), theme->get_icon(SNAME("GuiTab"), SNAME("EditorIcons"))); - theme->set_icon(SNAME("space"), SNAME("TextEdit"), theme->get_icon(SNAME("GuiSpace"), SNAME("EditorIcons"))); - theme->set_color(SNAME("font_color"), SNAME("TextEdit"), font_color); - theme->set_color(SNAME("font_readonly_color"), SNAME("TextEdit"), font_readonly_color); - theme->set_color(SNAME("font_placeholder_color"), SNAME("TextEdit"), font_placeholder_color); - theme->set_color(SNAME("caret_color"), SNAME("TextEdit"), font_color); - theme->set_color(SNAME("selection_color"), SNAME("TextEdit"), selection_color); - theme->set_constant(SNAME("line_spacing"), SNAME("TextEdit"), 4 * EDSCALE); + theme->set_stylebox("normal", "TextEdit", style_line_edit); + theme->set_stylebox("focus", "TextEdit", style_widget_focus); + theme->set_stylebox("read_only", "TextEdit", style_line_edit_disabled); + theme->set_constant("side_margin", "TabContainer", 0); + theme->set_icon("tab", "TextEdit", theme->get_icon(SNAME("GuiTab"), SNAME("EditorIcons"))); + theme->set_icon("space", "TextEdit", theme->get_icon(SNAME("GuiSpace"), SNAME("EditorIcons"))); + theme->set_color("font_color", "TextEdit", font_color); + theme->set_color("font_readonly_color", "TextEdit", font_readonly_color); + theme->set_color("font_placeholder_color", "TextEdit", font_placeholder_color); + theme->set_color("caret_color", "TextEdit", font_color); + theme->set_color("selection_color", "TextEdit", selection_color); + theme->set_constant("line_spacing", "TextEdit", 4 * EDSCALE); // CodeEdit - theme->set_font(SNAME("font"), SNAME("CodeEdit"), theme->get_font(SNAME("source"), SNAME("EditorFonts"))); - theme->set_font_size(SNAME("font_size"), SNAME("CodeEdit"), theme->get_font_size(SNAME("source_size"), SNAME("EditorFonts"))); - theme->set_stylebox(SNAME("normal"), SNAME("CodeEdit"), style_widget); - theme->set_stylebox(SNAME("focus"), SNAME("CodeEdit"), style_widget_hover); - theme->set_stylebox(SNAME("read_only"), SNAME("CodeEdit"), style_widget_disabled); - theme->set_icon(SNAME("tab"), SNAME("CodeEdit"), theme->get_icon(SNAME("GuiTab"), SNAME("EditorIcons"))); - theme->set_icon(SNAME("space"), SNAME("CodeEdit"), theme->get_icon(SNAME("GuiSpace"), SNAME("EditorIcons"))); - theme->set_icon(SNAME("folded"), SNAME("CodeEdit"), theme->get_icon(SNAME("GuiTreeArrowRight"), SNAME("EditorIcons"))); - theme->set_icon(SNAME("can_fold"), SNAME("CodeEdit"), theme->get_icon(SNAME("GuiTreeArrowDown"), SNAME("EditorIcons"))); - theme->set_icon(SNAME("executing_line"), SNAME("CodeEdit"), theme->get_icon(SNAME("MainPlay"), SNAME("EditorIcons"))); - theme->set_icon(SNAME("breakpoint"), SNAME("CodeEdit"), theme->get_icon(SNAME("Breakpoint"), SNAME("EditorIcons"))); - theme->set_constant(SNAME("line_spacing"), SNAME("CodeEdit"), EDITOR_DEF("text_editor/appearance/whitespace/line_spacing", 6)); + theme->set_font("font", "CodeEdit", theme->get_font(SNAME("source"), SNAME("EditorFonts"))); + theme->set_font_size("font_size", "CodeEdit", theme->get_font_size(SNAME("source_size"), SNAME("EditorFonts"))); + theme->set_stylebox("normal", "CodeEdit", style_widget); + theme->set_stylebox("focus", "CodeEdit", style_widget_hover); + theme->set_stylebox("read_only", "CodeEdit", style_widget_disabled); + theme->set_icon("tab", "CodeEdit", theme->get_icon(SNAME("GuiTab"), SNAME("EditorIcons"))); + theme->set_icon("space", "CodeEdit", theme->get_icon(SNAME("GuiSpace"), SNAME("EditorIcons"))); + theme->set_icon("folded", "CodeEdit", theme->get_icon(SNAME("GuiTreeArrowRight"), SNAME("EditorIcons"))); + theme->set_icon("can_fold", "CodeEdit", theme->get_icon(SNAME("GuiTreeArrowDown"), SNAME("EditorIcons"))); + theme->set_icon("executing_line", "CodeEdit", theme->get_icon(SNAME("MainPlay"), SNAME("EditorIcons"))); + theme->set_icon("breakpoint", "CodeEdit", theme->get_icon(SNAME("Breakpoint"), SNAME("EditorIcons"))); + theme->set_constant("line_spacing", "CodeEdit", EDITOR_DEF("text_editor/appearance/whitespace/line_spacing", 6)); // H/VSplitContainer - theme->set_stylebox(SNAME("bg"), SNAME("VSplitContainer"), make_stylebox(theme->get_icon(SNAME("GuiVsplitBg"), SNAME("EditorIcons")), 1, 1, 1, 1)); - theme->set_stylebox(SNAME("bg"), SNAME("HSplitContainer"), make_stylebox(theme->get_icon(SNAME("GuiHsplitBg"), SNAME("EditorIcons")), 1, 1, 1, 1)); + theme->set_stylebox("bg", "VSplitContainer", make_stylebox(theme->get_icon(SNAME("GuiVsplitBg"), SNAME("EditorIcons")), 1, 1, 1, 1)); + theme->set_stylebox("bg", "HSplitContainer", make_stylebox(theme->get_icon(SNAME("GuiHsplitBg"), SNAME("EditorIcons")), 1, 1, 1, 1)); - theme->set_icon(SNAME("grabber"), SNAME("VSplitContainer"), theme->get_icon(SNAME("GuiVsplitter"), SNAME("EditorIcons"))); - theme->set_icon(SNAME("grabber"), SNAME("HSplitContainer"), theme->get_icon(SNAME("GuiHsplitter"), SNAME("EditorIcons"))); + theme->set_icon("grabber", "VSplitContainer", theme->get_icon(SNAME("GuiVsplitter"), SNAME("EditorIcons"))); + theme->set_icon("grabber", "HSplitContainer", theme->get_icon(SNAME("GuiHsplitter"), SNAME("EditorIcons"))); - theme->set_constant(SNAME("separation"), SNAME("HSplitContainer"), default_margin_size * 2 * EDSCALE); - theme->set_constant(SNAME("separation"), SNAME("VSplitContainer"), default_margin_size * 2 * EDSCALE); + theme->set_constant("separation", "HSplitContainer", default_margin_size * 2 * EDSCALE); + theme->set_constant("separation", "VSplitContainer", default_margin_size * 2 * EDSCALE); // Containers - theme->set_constant(SNAME("separation"), SNAME("BoxContainer"), default_margin_size * EDSCALE); - theme->set_constant(SNAME("separation"), SNAME("HBoxContainer"), default_margin_size * EDSCALE); - theme->set_constant(SNAME("separation"), SNAME("VBoxContainer"), default_margin_size * EDSCALE); - theme->set_constant(SNAME("margin_left"), SNAME("MarginContainer"), 0); - theme->set_constant(SNAME("margin_top"), SNAME("MarginContainer"), 0); - theme->set_constant(SNAME("margin_right"), SNAME("MarginContainer"), 0); - theme->set_constant(SNAME("margin_bottom"), SNAME("MarginContainer"), 0); - theme->set_constant(SNAME("hseparation"), SNAME("GridContainer"), default_margin_size * EDSCALE); - theme->set_constant(SNAME("vseparation"), SNAME("GridContainer"), default_margin_size * EDSCALE); - theme->set_constant(SNAME("hseparation"), SNAME("FlowContainer"), default_margin_size * EDSCALE); - theme->set_constant(SNAME("vseparation"), SNAME("FlowContainer"), default_margin_size * EDSCALE); - theme->set_constant(SNAME("hseparation"), SNAME("HFlowContainer"), default_margin_size * EDSCALE); - theme->set_constant(SNAME("vseparation"), SNAME("HFlowContainer"), default_margin_size * EDSCALE); - theme->set_constant(SNAME("hseparation"), SNAME("VFlowContainer"), default_margin_size * EDSCALE); - theme->set_constant(SNAME("vseparation"), SNAME("VFlowContainer"), default_margin_size * EDSCALE); + theme->set_constant("separation", "BoxContainer", default_margin_size * EDSCALE); + theme->set_constant("separation", "HBoxContainer", default_margin_size * EDSCALE); + theme->set_constant("separation", "VBoxContainer", default_margin_size * EDSCALE); + theme->set_constant("margin_left", "MarginContainer", 0); + theme->set_constant("margin_top", "MarginContainer", 0); + theme->set_constant("margin_right", "MarginContainer", 0); + theme->set_constant("margin_bottom", "MarginContainer", 0); + theme->set_constant("hseparation", "GridContainer", default_margin_size * EDSCALE); + theme->set_constant("vseparation", "GridContainer", default_margin_size * EDSCALE); + theme->set_constant("hseparation", "FlowContainer", default_margin_size * EDSCALE); + theme->set_constant("vseparation", "FlowContainer", default_margin_size * EDSCALE); + theme->set_constant("hseparation", "HFlowContainer", default_margin_size * EDSCALE); + theme->set_constant("vseparation", "HFlowContainer", default_margin_size * EDSCALE); + theme->set_constant("hseparation", "VFlowContainer", default_margin_size * EDSCALE); + theme->set_constant("vseparation", "VFlowContainer", default_margin_size * EDSCALE); // Window @@ -1184,119 +1184,119 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { style_window->set_border_color(base_color); style_window->set_border_width(SIDE_TOP, 24 * EDSCALE); style_window->set_expand_margin_size(SIDE_TOP, 24 * EDSCALE); - theme->set_stylebox(SNAME("embedded_border"), SNAME("Window"), style_window); - - theme->set_color(SNAME("title_color"), SNAME("Window"), font_color); - theme->set_icon(SNAME("close"), SNAME("Window"), theme->get_icon(SNAME("GuiClose"), SNAME("EditorIcons"))); - theme->set_icon(SNAME("close_pressed"), SNAME("Window"), theme->get_icon(SNAME("GuiClose"), SNAME("EditorIcons"))); - theme->set_constant(SNAME("close_h_ofs"), SNAME("Window"), 22 * EDSCALE); - theme->set_constant(SNAME("close_v_ofs"), SNAME("Window"), 20 * EDSCALE); - theme->set_constant(SNAME("title_height"), SNAME("Window"), 24 * EDSCALE); - theme->set_constant(SNAME("resize_margin"), SNAME("Window"), 4 * EDSCALE); - theme->set_font(SNAME("title_font"), SNAME("Window"), theme->get_font(SNAME("title"), SNAME("EditorFonts"))); - theme->set_font_size(SNAME("title_font_size"), SNAME("Window"), theme->get_font_size(SNAME("title_size"), SNAME("EditorFonts"))); + theme->set_stylebox("embedded_border", "Window", style_window); + + theme->set_color("title_color", "Window", font_color); + theme->set_icon("close", "Window", theme->get_icon(SNAME("GuiClose"), SNAME("EditorIcons"))); + theme->set_icon("close_pressed", "Window", theme->get_icon(SNAME("GuiClose"), SNAME("EditorIcons"))); + theme->set_constant("close_h_ofs", "Window", 22 * EDSCALE); + theme->set_constant("close_v_ofs", "Window", 20 * EDSCALE); + theme->set_constant("title_height", "Window", 24 * EDSCALE); + theme->set_constant("resize_margin", "Window", 4 * EDSCALE); + theme->set_font("title_font", "Window", theme->get_font(SNAME("title"), SNAME("EditorFonts"))); + theme->set_font_size("title_font_size", "Window", theme->get_font_size(SNAME("title_size"), SNAME("EditorFonts"))); // Complex window (currently only Editor Settings and Project Settings) Ref<StyleBoxFlat> style_complex_window = style_window->duplicate(); style_complex_window->set_bg_color(dark_color_2); style_complex_window->set_border_color(dark_color_2); - theme->set_stylebox(SNAME("panel"), SNAME("EditorSettingsDialog"), style_complex_window); - theme->set_stylebox(SNAME("panel"), SNAME("ProjectSettingsEditor"), style_complex_window); - theme->set_stylebox(SNAME("panel"), SNAME("EditorAbout"), style_complex_window); + theme->set_stylebox("panel", "EditorSettingsDialog", style_complex_window); + theme->set_stylebox("panel", "ProjectSettingsEditor", style_complex_window); + theme->set_stylebox("panel", "EditorAbout", style_complex_window); // AcceptDialog - theme->set_stylebox(SNAME("panel"), SNAME("AcceptDialog"), style_window_title); + theme->set_stylebox("panel", "AcceptDialog", style_window_title); // HScrollBar Ref<Texture2D> empty_icon = memnew(ImageTexture); - theme->set_stylebox(SNAME("scroll"), SNAME("HScrollBar"), make_stylebox(theme->get_icon(SNAME("GuiScrollBg"), SNAME("EditorIcons")), 5, 5, 5, 5, 0, 0, 0, 0)); - theme->set_stylebox(SNAME("scroll_focus"), SNAME("HScrollBar"), make_stylebox(theme->get_icon(SNAME("GuiScrollBg"), SNAME("EditorIcons")), 5, 5, 5, 5, 0, 0, 0, 0)); - theme->set_stylebox(SNAME("grabber"), SNAME("HScrollBar"), make_stylebox(theme->get_icon(SNAME("GuiScrollGrabber"), SNAME("EditorIcons")), 6, 6, 6, 6, 2, 2, 2, 2)); - theme->set_stylebox(SNAME("grabber_highlight"), SNAME("HScrollBar"), make_stylebox(theme->get_icon(SNAME("GuiScrollGrabberHl"), SNAME("EditorIcons")), 5, 5, 5, 5, 2, 2, 2, 2)); - theme->set_stylebox(SNAME("grabber_pressed"), SNAME("HScrollBar"), make_stylebox(theme->get_icon(SNAME("GuiScrollGrabberPressed"), SNAME("EditorIcons")), 6, 6, 6, 6, 2, 2, 2, 2)); + theme->set_stylebox("scroll", "HScrollBar", make_stylebox(theme->get_icon(SNAME("GuiScrollBg"), SNAME("EditorIcons")), 5, 5, 5, 5, 0, 0, 0, 0)); + theme->set_stylebox("scroll_focus", "HScrollBar", make_stylebox(theme->get_icon(SNAME("GuiScrollBg"), SNAME("EditorIcons")), 5, 5, 5, 5, 0, 0, 0, 0)); + theme->set_stylebox("grabber", "HScrollBar", make_stylebox(theme->get_icon(SNAME("GuiScrollGrabber"), SNAME("EditorIcons")), 6, 6, 6, 6, 2, 2, 2, 2)); + theme->set_stylebox("grabber_highlight", "HScrollBar", make_stylebox(theme->get_icon(SNAME("GuiScrollGrabberHl"), SNAME("EditorIcons")), 5, 5, 5, 5, 2, 2, 2, 2)); + theme->set_stylebox("grabber_pressed", "HScrollBar", make_stylebox(theme->get_icon(SNAME("GuiScrollGrabberPressed"), SNAME("EditorIcons")), 6, 6, 6, 6, 2, 2, 2, 2)); - theme->set_icon(SNAME("increment"), SNAME("HScrollBar"), empty_icon); - theme->set_icon(SNAME("increment_highlight"), SNAME("HScrollBar"), empty_icon); - theme->set_icon(SNAME("increment_pressed"), SNAME("HScrollBar"), empty_icon); - theme->set_icon(SNAME("decrement"), SNAME("HScrollBar"), empty_icon); - theme->set_icon(SNAME("decrement_highlight"), SNAME("HScrollBar"), empty_icon); - theme->set_icon(SNAME("decrement_pressed"), SNAME("HScrollBar"), empty_icon); + theme->set_icon("increment", "HScrollBar", empty_icon); + theme->set_icon("increment_highlight", "HScrollBar", empty_icon); + theme->set_icon("increment_pressed", "HScrollBar", empty_icon); + theme->set_icon("decrement", "HScrollBar", empty_icon); + theme->set_icon("decrement_highlight", "HScrollBar", empty_icon); + theme->set_icon("decrement_pressed", "HScrollBar", empty_icon); // VScrollBar - theme->set_stylebox(SNAME("scroll"), SNAME("VScrollBar"), make_stylebox(theme->get_icon(SNAME("GuiScrollBg"), SNAME("EditorIcons")), 5, 5, 5, 5, 0, 0, 0, 0)); - theme->set_stylebox(SNAME("scroll_focus"), SNAME("VScrollBar"), make_stylebox(theme->get_icon(SNAME("GuiScrollBg"), SNAME("EditorIcons")), 5, 5, 5, 5, 0, 0, 0, 0)); - theme->set_stylebox(SNAME("grabber"), SNAME("VScrollBar"), make_stylebox(theme->get_icon(SNAME("GuiScrollGrabber"), SNAME("EditorIcons")), 6, 6, 6, 6, 2, 2, 2, 2)); - theme->set_stylebox(SNAME("grabber_highlight"), SNAME("VScrollBar"), make_stylebox(theme->get_icon(SNAME("GuiScrollGrabberHl"), SNAME("EditorIcons")), 5, 5, 5, 5, 2, 2, 2, 2)); - theme->set_stylebox(SNAME("grabber_pressed"), SNAME("VScrollBar"), make_stylebox(theme->get_icon(SNAME("GuiScrollGrabberPressed"), SNAME("EditorIcons")), 6, 6, 6, 6, 2, 2, 2, 2)); - - theme->set_icon(SNAME("increment"), SNAME("VScrollBar"), empty_icon); - theme->set_icon(SNAME("increment_highlight"), SNAME("VScrollBar"), empty_icon); - theme->set_icon(SNAME("increment_pressed"), SNAME("VScrollBar"), empty_icon); - theme->set_icon(SNAME("decrement"), SNAME("VScrollBar"), empty_icon); - theme->set_icon(SNAME("decrement_highlight"), SNAME("VScrollBar"), empty_icon); - theme->set_icon(SNAME("decrement_pressed"), SNAME("VScrollBar"), empty_icon); + theme->set_stylebox("scroll", "VScrollBar", make_stylebox(theme->get_icon(SNAME("GuiScrollBg"), SNAME("EditorIcons")), 5, 5, 5, 5, 0, 0, 0, 0)); + theme->set_stylebox("scroll_focus", "VScrollBar", make_stylebox(theme->get_icon(SNAME("GuiScrollBg"), SNAME("EditorIcons")), 5, 5, 5, 5, 0, 0, 0, 0)); + theme->set_stylebox("grabber", "VScrollBar", make_stylebox(theme->get_icon(SNAME("GuiScrollGrabber"), SNAME("EditorIcons")), 6, 6, 6, 6, 2, 2, 2, 2)); + theme->set_stylebox("grabber_highlight", "VScrollBar", make_stylebox(theme->get_icon(SNAME("GuiScrollGrabberHl"), SNAME("EditorIcons")), 5, 5, 5, 5, 2, 2, 2, 2)); + theme->set_stylebox("grabber_pressed", "VScrollBar", make_stylebox(theme->get_icon(SNAME("GuiScrollGrabberPressed"), SNAME("EditorIcons")), 6, 6, 6, 6, 2, 2, 2, 2)); + + theme->set_icon("increment", "VScrollBar", empty_icon); + theme->set_icon("increment_highlight", "VScrollBar", empty_icon); + theme->set_icon("increment_pressed", "VScrollBar", empty_icon); + theme->set_icon("decrement", "VScrollBar", empty_icon); + theme->set_icon("decrement_highlight", "VScrollBar", empty_icon); + theme->set_icon("decrement_pressed", "VScrollBar", empty_icon); // HSlider - theme->set_icon(SNAME("grabber_highlight"), SNAME("HSlider"), theme->get_icon(SNAME("GuiSliderGrabberHl"), SNAME("EditorIcons"))); - theme->set_icon(SNAME("grabber"), SNAME("HSlider"), theme->get_icon(SNAME("GuiSliderGrabber"), SNAME("EditorIcons"))); - theme->set_stylebox(SNAME("slider"), SNAME("HSlider"), make_flat_stylebox(dark_color_3, 0, default_margin_size / 2, 0, default_margin_size / 2, corner_width)); - theme->set_stylebox(SNAME("grabber_area"), SNAME("HSlider"), make_flat_stylebox(contrast_color_1, 0, default_margin_size / 2, 0, default_margin_size / 2, corner_width)); - theme->set_stylebox(SNAME("grabber_area_highlight"), SNAME("HSlider"), make_flat_stylebox(contrast_color_1, 0, default_margin_size / 2, 0, default_margin_size / 2)); + theme->set_icon("grabber_highlight", "HSlider", theme->get_icon(SNAME("GuiSliderGrabberHl"), SNAME("EditorIcons"))); + theme->set_icon("grabber", "HSlider", theme->get_icon(SNAME("GuiSliderGrabber"), SNAME("EditorIcons"))); + theme->set_stylebox("slider", "HSlider", make_flat_stylebox(dark_color_3, 0, default_margin_size / 2, 0, default_margin_size / 2, corner_width)); + theme->set_stylebox("grabber_area", "HSlider", make_flat_stylebox(contrast_color_1, 0, default_margin_size / 2, 0, default_margin_size / 2, corner_width)); + theme->set_stylebox("grabber_area_highlight", "HSlider", make_flat_stylebox(contrast_color_1, 0, default_margin_size / 2, 0, default_margin_size / 2)); // VSlider - theme->set_icon(SNAME("grabber"), SNAME("VSlider"), theme->get_icon(SNAME("GuiSliderGrabber"), SNAME("EditorIcons"))); - theme->set_icon(SNAME("grabber_highlight"), SNAME("VSlider"), theme->get_icon(SNAME("GuiSliderGrabberHl"), SNAME("EditorIcons"))); - theme->set_stylebox(SNAME("slider"), SNAME("VSlider"), make_flat_stylebox(dark_color_3, default_margin_size / 2, 0, default_margin_size / 2, 0, corner_width)); - theme->set_stylebox(SNAME("grabber_area"), SNAME("VSlider"), make_flat_stylebox(contrast_color_1, default_margin_size / 2, 0, default_margin_size / 2, 0, corner_width)); - theme->set_stylebox(SNAME("grabber_area_highlight"), SNAME("VSlider"), make_flat_stylebox(contrast_color_1, default_margin_size / 2, 0, default_margin_size / 2, 0)); + theme->set_icon("grabber", "VSlider", theme->get_icon(SNAME("GuiSliderGrabber"), SNAME("EditorIcons"))); + theme->set_icon("grabber_highlight", "VSlider", theme->get_icon(SNAME("GuiSliderGrabberHl"), SNAME("EditorIcons"))); + theme->set_stylebox("slider", "VSlider", make_flat_stylebox(dark_color_3, default_margin_size / 2, 0, default_margin_size / 2, 0, corner_width)); + theme->set_stylebox("grabber_area", "VSlider", make_flat_stylebox(contrast_color_1, default_margin_size / 2, 0, default_margin_size / 2, 0, corner_width)); + theme->set_stylebox("grabber_area_highlight", "VSlider", make_flat_stylebox(contrast_color_1, default_margin_size / 2, 0, default_margin_size / 2, 0)); // RichTextLabel - theme->set_color(SNAME("default_color"), SNAME("RichTextLabel"), font_color); - theme->set_color(SNAME("font_shadow_color"), SNAME("RichTextLabel"), Color(0, 0, 0, 0)); - theme->set_constant(SNAME("shadow_offset_x"), SNAME("RichTextLabel"), 1 * EDSCALE); - theme->set_constant(SNAME("shadow_offset_y"), SNAME("RichTextLabel"), 1 * EDSCALE); - theme->set_constant(SNAME("shadow_outline_size"), SNAME("RichTextLabel"), 1 * EDSCALE); - theme->set_stylebox(SNAME("focus"), SNAME("RichTextLabel"), make_empty_stylebox()); - theme->set_stylebox(SNAME("normal"), SNAME("RichTextLabel"), style_tree_bg); + theme->set_color("default_color", "RichTextLabel", font_color); + theme->set_color("font_shadow_color", "RichTextLabel", Color(0, 0, 0, 0)); + theme->set_constant("shadow_offset_x", "RichTextLabel", 1 * EDSCALE); + theme->set_constant("shadow_offset_y", "RichTextLabel", 1 * EDSCALE); + theme->set_constant("shadow_outline_size", "RichTextLabel", 1 * EDSCALE); + theme->set_stylebox("focus", "RichTextLabel", make_empty_stylebox()); + theme->set_stylebox("normal", "RichTextLabel", style_tree_bg); // Editor help. - theme->set_color(SNAME("title_color"), SNAME("EditorHelp"), accent_color); - theme->set_color(SNAME("headline_color"), SNAME("EditorHelp"), mono_color); - theme->set_color(SNAME("text_color"), SNAME("EditorHelp"), font_color); - theme->set_color(SNAME("comment_color"), SNAME("EditorHelp"), font_color * Color(1, 1, 1, 0.6)); - theme->set_color(SNAME("symbol_color"), SNAME("EditorHelp"), font_color * Color(1, 1, 1, 0.6)); - theme->set_color(SNAME("value_color"), SNAME("EditorHelp"), font_color * Color(1, 1, 1, 0.6)); - theme->set_color(SNAME("qualifier_color"), SNAME("EditorHelp"), font_color * Color(1, 1, 1, 0.8)); - theme->set_color(SNAME("type_color"), SNAME("EditorHelp"), accent_color.lerp(font_color, 0.5)); - theme->set_color(SNAME("selection_color"), SNAME("EditorHelp"), accent_color * Color(1, 1, 1, 0.4)); - theme->set_color(SNAME("link_color"), SNAME("EditorHelp"), accent_color.lerp(mono_color, 0.8)); - theme->set_color(SNAME("code_color"), SNAME("EditorHelp"), accent_color.lerp(mono_color, 0.6)); - theme->set_color(SNAME("kbd_color"), SNAME("EditorHelp"), accent_color.lerp(property_color, 0.6)); - theme->set_constant(SNAME("line_separation"), SNAME("EditorHelp"), Math::round(6 * EDSCALE)); - theme->set_constant(SNAME("table_hseparation"), SNAME("EditorHelp"), 16 * EDSCALE); - theme->set_constant(SNAME("table_vseparation"), SNAME("EditorHelp"), 6 * EDSCALE); + theme->set_color("title_color", "EditorHelp", accent_color); + theme->set_color("headline_color", "EditorHelp", mono_color); + theme->set_color("text_color", "EditorHelp", font_color); + theme->set_color("comment_color", "EditorHelp", font_color * Color(1, 1, 1, 0.6)); + theme->set_color("symbol_color", "EditorHelp", font_color * Color(1, 1, 1, 0.6)); + theme->set_color("value_color", "EditorHelp", font_color * Color(1, 1, 1, 0.6)); + theme->set_color("qualifier_color", "EditorHelp", font_color * Color(1, 1, 1, 0.8)); + theme->set_color("type_color", "EditorHelp", accent_color.lerp(font_color, 0.5)); + theme->set_color("selection_color", "EditorHelp", accent_color * Color(1, 1, 1, 0.4)); + theme->set_color("link_color", "EditorHelp", accent_color.lerp(mono_color, 0.8)); + theme->set_color("code_color", "EditorHelp", accent_color.lerp(mono_color, 0.6)); + theme->set_color("kbd_color", "EditorHelp", accent_color.lerp(property_color, 0.6)); + theme->set_constant("line_separation", "EditorHelp", Math::round(6 * EDSCALE)); + theme->set_constant("table_hseparation", "EditorHelp", 16 * EDSCALE); + theme->set_constant("table_vseparation", "EditorHelp", 6 * EDSCALE); // Panel - theme->set_stylebox(SNAME("panel"), SNAME("Panel"), make_flat_stylebox(dark_color_1, 6, 4, 6, 4, corner_width)); - theme->set_stylebox(SNAME("PanelForeground"), SNAME("EditorStyles"), style_default); + theme->set_stylebox("panel", "Panel", make_flat_stylebox(dark_color_1, 6, 4, 6, 4, corner_width)); + theme->set_stylebox("PanelForeground", "EditorStyles", style_default); // Label - theme->set_stylebox(SNAME("normal"), SNAME("Label"), style_empty); - theme->set_color(SNAME("font_color"), SNAME("Label"), font_color); - theme->set_color(SNAME("font_shadow_color"), SNAME("Label"), Color(0, 0, 0, 0)); - theme->set_constant(SNAME("shadow_offset_x"), SNAME("Label"), 1 * EDSCALE); - theme->set_constant(SNAME("shadow_offset_y"), SNAME("Label"), 1 * EDSCALE); - theme->set_constant(SNAME("shadow_outline_size"), SNAME("Label"), 1 * EDSCALE); - theme->set_constant(SNAME("line_spacing"), SNAME("Label"), 3 * EDSCALE); + theme->set_stylebox("normal", "Label", style_empty); + theme->set_color("font_color", "Label", font_color); + theme->set_color("font_shadow_color", "Label", Color(0, 0, 0, 0)); + theme->set_constant("shadow_offset_x", "Label", 1 * EDSCALE); + theme->set_constant("shadow_offset_y", "Label", 1 * EDSCALE); + theme->set_constant("shadow_outline_size", "Label", 1 * EDSCALE); + theme->set_constant("line_spacing", "Label", 3 * EDSCALE); // LinkButton - theme->set_stylebox(SNAME("focus"), SNAME("LinkButton"), style_empty); - theme->set_color(SNAME("font_color"), SNAME("LinkButton"), font_color); - theme->set_color(SNAME("font_hover_color"), SNAME("LinkButton"), font_hover_color); - theme->set_color(SNAME("font_focus_color"), SNAME("LinkButton"), font_focus_color); - theme->set_color(SNAME("font_pressed_color"), SNAME("LinkButton"), accent_color); - theme->set_color(SNAME("font_disabled_color"), SNAME("LinkButton"), font_disabled_color); + theme->set_stylebox("focus", "LinkButton", style_empty); + theme->set_color("font_color", "LinkButton", font_color); + theme->set_color("font_hover_color", "LinkButton", font_hover_color); + theme->set_color("font_focus_color", "LinkButton", font_focus_color); + theme->set_color("font_pressed_color", "LinkButton", accent_color); + theme->set_color("font_disabled_color", "LinkButton", font_disabled_color); // TooltipPanel Ref<StyleBoxFlat> style_tooltip = style_popup->duplicate(); @@ -1307,48 +1307,48 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { style_tooltip->set_default_margin(SIDE_BOTTOM, default_margin_size * EDSCALE * 0.5); style_tooltip->set_bg_color(dark_color_3 * Color(0.8, 0.8, 0.8, 0.9)); style_tooltip->set_border_width_all(0); - theme->set_color(SNAME("font_color"), SNAME("TooltipLabel"), font_hover_color); - theme->set_color(SNAME("font_color_shadow"), SNAME("TooltipLabel"), Color(0, 0, 0, 0)); - theme->set_stylebox(SNAME("panel"), SNAME("TooltipPanel"), style_tooltip); + theme->set_color("font_color", "TooltipLabel", font_hover_color); + theme->set_color("font_color_shadow", "TooltipLabel", Color(0, 0, 0, 0)); + theme->set_stylebox("panel", "TooltipPanel", style_tooltip); // PopupPanel - theme->set_stylebox(SNAME("panel"), SNAME("PopupPanel"), style_popup); + theme->set_stylebox("panel", "PopupPanel", style_popup); // SpinBox - theme->set_icon(SNAME("updown"), SNAME("SpinBox"), theme->get_icon(SNAME("GuiSpinboxUpdown"), SNAME("EditorIcons"))); - theme->set_icon(SNAME("updown_disabled"), SNAME("SpinBox"), theme->get_icon(SNAME("GuiSpinboxUpdownDisabled"), SNAME("EditorIcons"))); + theme->set_icon("updown", "SpinBox", theme->get_icon(SNAME("GuiSpinboxUpdown"), SNAME("EditorIcons"))); + theme->set_icon("updown_disabled", "SpinBox", theme->get_icon(SNAME("GuiSpinboxUpdownDisabled"), SNAME("EditorIcons"))); // ProgressBar - theme->set_stylebox(SNAME("bg"), SNAME("ProgressBar"), make_stylebox(theme->get_icon(SNAME("GuiProgressBar"), SNAME("EditorIcons")), 4, 4, 4, 4, 0, 0, 0, 0)); - theme->set_stylebox(SNAME("fg"), SNAME("ProgressBar"), make_stylebox(theme->get_icon(SNAME("GuiProgressFill"), SNAME("EditorIcons")), 6, 6, 6, 6, 2, 1, 2, 1)); - theme->set_color(SNAME("font_color"), SNAME("ProgressBar"), font_color); + theme->set_stylebox("bg", "ProgressBar", make_stylebox(theme->get_icon(SNAME("GuiProgressBar"), SNAME("EditorIcons")), 4, 4, 4, 4, 0, 0, 0, 0)); + theme->set_stylebox("fg", "ProgressBar", make_stylebox(theme->get_icon(SNAME("GuiProgressFill"), SNAME("EditorIcons")), 6, 6, 6, 6, 2, 1, 2, 1)); + theme->set_color("font_color", "ProgressBar", font_color); // GraphEdit - theme->set_stylebox(SNAME("bg"), "GraphEdit", style_tree_bg); + theme->set_stylebox("bg", "GraphEdit", style_tree_bg); if (dark_theme) { - theme->set_color(SNAME("grid_major"), SNAME("GraphEdit"), Color(1.0, 1.0, 1.0, 0.15)); - theme->set_color(SNAME("grid_minor"), SNAME("GraphEdit"), Color(1.0, 1.0, 1.0, 0.07)); + theme->set_color("grid_major", "GraphEdit", Color(1.0, 1.0, 1.0, 0.15)); + theme->set_color("grid_minor", "GraphEdit", Color(1.0, 1.0, 1.0, 0.07)); } else { - theme->set_color(SNAME("grid_major"), SNAME("GraphEdit"), Color(0.0, 0.0, 0.0, 0.15)); - theme->set_color(SNAME("grid_minor"), SNAME("GraphEdit"), Color(0.0, 0.0, 0.0, 0.07)); + theme->set_color("grid_major", "GraphEdit", Color(0.0, 0.0, 0.0, 0.15)); + theme->set_color("grid_minor", "GraphEdit", Color(0.0, 0.0, 0.0, 0.07)); } - theme->set_color(SNAME("selection_fill"), SNAME("GraphEdit"), theme->get_color(SNAME("box_selection_fill_color"), SNAME("Editor"))); - theme->set_color(SNAME("selection_stroke"), SNAME("GraphEdit"), theme->get_color(SNAME("box_selection_stroke_color"), SNAME("Editor"))); - theme->set_color(SNAME("activity"), SNAME("GraphEdit"), accent_color); - theme->set_icon(SNAME("minus"), SNAME("GraphEdit"), theme->get_icon(SNAME("ZoomLess"), SNAME("EditorIcons"))); - theme->set_icon(SNAME("more"), SNAME("GraphEdit"), theme->get_icon(SNAME("ZoomMore"), SNAME("EditorIcons"))); - theme->set_icon(SNAME("reset"), SNAME("GraphEdit"), theme->get_icon(SNAME("ZoomReset"), SNAME("EditorIcons"))); - theme->set_icon(SNAME("snap"), SNAME("GraphEdit"), theme->get_icon(SNAME("SnapGrid"), SNAME("EditorIcons"))); - theme->set_icon(SNAME("minimap"), SNAME("GraphEdit"), theme->get_icon(SNAME("GridMinimap"), SNAME("EditorIcons"))); - theme->set_icon(SNAME("layout"), SNAME("GraphEdit"), theme->get_icon(SNAME("GridLayout"), SNAME("EditorIcons"))); - theme->set_constant(SNAME("bezier_len_pos"), SNAME("GraphEdit"), 80 * EDSCALE); - theme->set_constant(SNAME("bezier_len_neg"), SNAME("GraphEdit"), 160 * EDSCALE); + theme->set_color("selection_fill", "GraphEdit", theme->get_color(SNAME("box_selection_fill_color"), SNAME("Editor"))); + theme->set_color("selection_stroke", "GraphEdit", theme->get_color(SNAME("box_selection_stroke_color"), SNAME("Editor"))); + theme->set_color("activity", "GraphEdit", accent_color); + theme->set_icon("minus", "GraphEdit", theme->get_icon(SNAME("ZoomLess"), SNAME("EditorIcons"))); + theme->set_icon("more", "GraphEdit", theme->get_icon(SNAME("ZoomMore"), SNAME("EditorIcons"))); + theme->set_icon("reset", "GraphEdit", theme->get_icon(SNAME("ZoomReset"), SNAME("EditorIcons"))); + theme->set_icon("snap", "GraphEdit", theme->get_icon(SNAME("SnapGrid"), SNAME("EditorIcons"))); + theme->set_icon("minimap", "GraphEdit", theme->get_icon(SNAME("GridMinimap"), SNAME("EditorIcons"))); + theme->set_icon("layout", "GraphEdit", theme->get_icon(SNAME("GridLayout"), SNAME("EditorIcons"))); + theme->set_constant("bezier_len_pos", "GraphEdit", 80 * EDSCALE); + theme->set_constant("bezier_len_neg", "GraphEdit", 160 * EDSCALE); // GraphEditMinimap Ref<StyleBoxFlat> style_minimap_bg = make_flat_stylebox(dark_color_1, 0, 0, 0, 0); style_minimap_bg->set_border_color(dark_color_3); style_minimap_bg->set_border_width_all(1); - theme->set_stylebox(SNAME("bg"), SNAME("GraphEditMinimap"), style_minimap_bg); + theme->set_stylebox("bg", "GraphEditMinimap", style_minimap_bg); Ref<StyleBoxFlat> style_minimap_camera; Ref<StyleBoxFlat> style_minimap_node; @@ -1363,8 +1363,8 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { } style_minimap_camera->set_border_width_all(1); style_minimap_node->set_corner_radius_all(1); - theme->set_stylebox(SNAME("camera"), SNAME("GraphEditMinimap"), style_minimap_camera); - theme->set_stylebox(SNAME("node"), SNAME("GraphEditMinimap"), style_minimap_node); + theme->set_stylebox("camera", "GraphEditMinimap", style_minimap_camera); + theme->set_stylebox("node", "GraphEditMinimap", style_minimap_node); Ref<Texture2D> minimap_resizer_icon = theme->get_icon(SNAME("GuiResizer"), SNAME("EditorIcons")); Color minimap_resizer_color; @@ -1373,8 +1373,8 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { } else { minimap_resizer_color = Color(0, 0, 0, 0.65); } - theme->set_icon(SNAME("resizer"), SNAME("GraphEditMinimap"), flip_icon(minimap_resizer_icon, true, true)); - theme->set_color(SNAME("resizer_color"), SNAME("GraphEditMinimap"), minimap_resizer_color); + theme->set_icon("resizer", "GraphEditMinimap", flip_icon(minimap_resizer_icon, true, true)); + theme->set_color("resizer_color", "GraphEditMinimap", minimap_resizer_color); // GraphNode const int gn_margin_side = 28; @@ -1413,93 +1413,93 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { graphsbcomment->set_border_width(SIDE_TOP, 24 * EDSCALE); graphsbcommentselected->set_border_width(SIDE_TOP, 24 * EDSCALE); - theme->set_stylebox(SNAME("frame"), SNAME("GraphNode"), graphsb); - theme->set_stylebox(SNAME("selectedframe"), SNAME("GraphNode"), graphsbselected); - theme->set_stylebox(SNAME("comment"), SNAME("GraphNode"), graphsbcomment); - theme->set_stylebox(SNAME("commentfocus"), SNAME("GraphNode"), graphsbcommentselected); - theme->set_stylebox(SNAME("breakpoint"), SNAME("GraphNode"), graphsbbreakpoint); - theme->set_stylebox(SNAME("position"), SNAME("GraphNode"), graphsbposition); - theme->set_stylebox(SNAME("state_machine_frame"), SNAME("GraphNode"), smgraphsb); - theme->set_stylebox(SNAME("state_machine_selectedframe"), SNAME("GraphNode"), smgraphsbselected); + theme->set_stylebox("frame", "GraphNode", graphsb); + theme->set_stylebox("selectedframe", "GraphNode", graphsbselected); + theme->set_stylebox("comment", "GraphNode", graphsbcomment); + theme->set_stylebox("commentfocus", "GraphNode", graphsbcommentselected); + theme->set_stylebox("breakpoint", "GraphNode", graphsbbreakpoint); + theme->set_stylebox("position", "GraphNode", graphsbposition); + theme->set_stylebox("state_machine_frame", "GraphNode", smgraphsb); + theme->set_stylebox("state_machine_selectedframe", "GraphNode", smgraphsbselected); Color default_node_color = dark_color_1.inverted(); - theme->set_color(SNAME("title_color"), SNAME("GraphNode"), default_node_color); + theme->set_color("title_color", "GraphNode", default_node_color); default_node_color.a = 0.7; - theme->set_color(SNAME("close_color"), SNAME("GraphNode"), default_node_color); - theme->set_color(SNAME("resizer_color"), SNAME("GraphNode"), default_node_color); + theme->set_color("close_color", "GraphNode", default_node_color); + theme->set_color("resizer_color", "GraphNode", default_node_color); - theme->set_constant(SNAME("port_offset"), SNAME("GraphNode"), 14 * EDSCALE); - theme->set_constant(SNAME("title_h_offset"), SNAME("GraphNode"), -16 * EDSCALE); - theme->set_constant(SNAME("title_offset"), SNAME("GraphNode"), 20 * EDSCALE); - theme->set_constant(SNAME("close_h_offset"), SNAME("GraphNode"), 20 * EDSCALE); - theme->set_constant(SNAME("close_offset"), SNAME("GraphNode"), 20 * EDSCALE); - theme->set_constant(SNAME("separation"), SNAME("GraphNode"), 1 * EDSCALE); + theme->set_constant("port_offset", "GraphNode", 14 * EDSCALE); + theme->set_constant("title_h_offset", "GraphNode", -16 * EDSCALE); + theme->set_constant("title_offset", "GraphNode", 20 * EDSCALE); + theme->set_constant("close_h_offset", "GraphNode", 20 * EDSCALE); + theme->set_constant("close_offset", "GraphNode", 20 * EDSCALE); + theme->set_constant("separation", "GraphNode", 1 * EDSCALE); - theme->set_icon(SNAME("close"), SNAME("GraphNode"), theme->get_icon(SNAME("GuiCloseCustomizable"), SNAME("EditorIcons"))); - theme->set_icon(SNAME("resizer"), SNAME("GraphNode"), theme->get_icon(SNAME("GuiResizer"), SNAME("EditorIcons"))); - theme->set_icon(SNAME("port"), SNAME("GraphNode"), theme->get_icon(SNAME("GuiGraphNodePort"), SNAME("EditorIcons"))); + theme->set_icon("close", "GraphNode", theme->get_icon(SNAME("GuiCloseCustomizable"), SNAME("EditorIcons"))); + theme->set_icon("resizer", "GraphNode", theme->get_icon(SNAME("GuiResizer"), SNAME("EditorIcons"))); + theme->set_icon("port", "GraphNode", theme->get_icon(SNAME("GuiGraphNodePort"), SNAME("EditorIcons"))); // GridContainer - theme->set_constant(SNAME("vseparation"), SNAME("GridContainer"), Math::round(widget_default_margin.y - 2 * EDSCALE)); + theme->set_constant("vseparation", "GridContainer", Math::round(widget_default_margin.y - 2 * EDSCALE)); // FileDialog - theme->set_icon(SNAME("folder"), SNAME("FileDialog"), theme->get_icon(SNAME("Folder"), SNAME("EditorIcons"))); - theme->set_icon(SNAME("parent_folder"), SNAME("FileDialog"), theme->get_icon(SNAME("ArrowUp"), SNAME("EditorIcons"))); - theme->set_icon(SNAME("back_folder"), SNAME("FileDialog"), theme->get_icon(SNAME("Back"), SNAME("EditorIcons"))); - theme->set_icon(SNAME("forward_folder"), SNAME("FileDialog"), theme->get_icon(SNAME("Forward"), SNAME("EditorIcons"))); - theme->set_icon(SNAME("reload"), SNAME("FileDialog"), theme->get_icon(SNAME("Reload"), SNAME("EditorIcons"))); - theme->set_icon(SNAME("toggle_hidden"), SNAME("FileDialog"), theme->get_icon(SNAME("GuiVisibilityVisible"), SNAME("EditorIcons"))); + theme->set_icon("folder", "FileDialog", theme->get_icon(SNAME("Folder"), SNAME("EditorIcons"))); + theme->set_icon("parent_folder", "FileDialog", theme->get_icon(SNAME("ArrowUp"), SNAME("EditorIcons"))); + theme->set_icon("back_folder", "FileDialog", theme->get_icon(SNAME("Back"), SNAME("EditorIcons"))); + theme->set_icon("forward_folder", "FileDialog", theme->get_icon(SNAME("Forward"), SNAME("EditorIcons"))); + theme->set_icon("reload", "FileDialog", theme->get_icon(SNAME("Reload"), SNAME("EditorIcons"))); + theme->set_icon("toggle_hidden", "FileDialog", theme->get_icon(SNAME("GuiVisibilityVisible"), SNAME("EditorIcons"))); // Use a different color for folder icons to make them easier to distinguish from files. // On a light theme, the icon will be dark, so we need to lighten it before blending it with the accent color. - theme->set_color(SNAME("folder_icon_modulate"), SNAME("FileDialog"), (dark_theme ? Color(1, 1, 1) : Color(4.25, 4.25, 4.25)).lerp(accent_color, 0.7)); - theme->set_color(SNAME("files_disabled"), SNAME("FileDialog"), font_disabled_color); + theme->set_color("folder_icon_modulate", "FileDialog", (dark_theme ? Color(1, 1, 1) : Color(4.25, 4.25, 4.25)).lerp(accent_color, 0.7)); + theme->set_color("files_disabled", "FileDialog", font_disabled_color); // ColorPicker - theme->set_constant(SNAME("margin"), SNAME("ColorPicker"), popup_margin_size); - theme->set_constant(SNAME("sv_width"), SNAME("ColorPicker"), 256 * EDSCALE); - theme->set_constant(SNAME("sv_height"), SNAME("ColorPicker"), 256 * EDSCALE); - theme->set_constant(SNAME("h_width"), SNAME("ColorPicker"), 30 * EDSCALE); - theme->set_constant(SNAME("label_width"), SNAME("ColorPicker"), 10 * EDSCALE); - theme->set_icon(SNAME("screen_picker"), SNAME("ColorPicker"), theme->get_icon(SNAME("ColorPick"), SNAME("EditorIcons"))); - theme->set_icon(SNAME("add_preset"), SNAME("ColorPicker"), theme->get_icon(SNAME("Add"), SNAME("EditorIcons"))); - theme->set_icon(SNAME("sample_bg"), SNAME("ColorPicker"), theme->get_icon(SNAME("GuiMiniCheckerboard"), SNAME("EditorIcons"))); - theme->set_icon(SNAME("overbright_indicator"), SNAME("ColorPicker"), theme->get_icon(SNAME("OverbrightIndicator"), SNAME("EditorIcons"))); - theme->set_icon(SNAME("bar_arrow"), SNAME("ColorPicker"), theme->get_icon(SNAME("ColorPickerBarArrow"), SNAME("EditorIcons"))); - theme->set_icon(SNAME("picker_cursor"), SNAME("ColorPicker"), theme->get_icon(SNAME("PickerCursor"), SNAME("EditorIcons"))); + theme->set_constant("margin", "ColorPicker", popup_margin_size); + theme->set_constant("sv_width", "ColorPicker", 256 * EDSCALE); + theme->set_constant("sv_height", "ColorPicker", 256 * EDSCALE); + theme->set_constant("h_width", "ColorPicker", 30 * EDSCALE); + theme->set_constant("label_width", "ColorPicker", 10 * EDSCALE); + theme->set_icon("screen_picker", "ColorPicker", theme->get_icon(SNAME("ColorPick"), SNAME("EditorIcons"))); + theme->set_icon("add_preset", "ColorPicker", theme->get_icon(SNAME("Add"), SNAME("EditorIcons"))); + theme->set_icon("sample_bg", "ColorPicker", theme->get_icon(SNAME("GuiMiniCheckerboard"), SNAME("EditorIcons"))); + theme->set_icon("overbright_indicator", "ColorPicker", theme->get_icon(SNAME("OverbrightIndicator"), SNAME("EditorIcons"))); + theme->set_icon("bar_arrow", "ColorPicker", theme->get_icon(SNAME("ColorPickerBarArrow"), SNAME("EditorIcons"))); + theme->set_icon("picker_cursor", "ColorPicker", theme->get_icon(SNAME("PickerCursor"), SNAME("EditorIcons"))); // ColorPickerButton - theme->set_icon(SNAME("bg"), SNAME("ColorPickerButton"), theme->get_icon(SNAME("GuiMiniCheckerboard"), SNAME("EditorIcons"))); + theme->set_icon("bg", "ColorPickerButton", theme->get_icon(SNAME("GuiMiniCheckerboard"), SNAME("EditorIcons"))); // ColorPresetButton Ref<StyleBoxFlat> preset_sb = make_flat_stylebox(Color(1, 1, 1), 2, 2, 2, 2, 2); preset_sb->set_anti_aliased(false); - theme->set_stylebox(SNAME("preset_fg"), SNAME("ColorPresetButton"), preset_sb); - theme->set_icon(SNAME("preset_bg"), SNAME("ColorPresetButton"), theme->get_icon(SNAME("GuiMiniCheckerboard"), SNAME("EditorIcons"))); - theme->set_icon(SNAME("overbright_indicator"), SNAME("ColorPresetButton"), theme->get_icon(SNAME("OverbrightIndicator"), SNAME("EditorIcons"))); + theme->set_stylebox("preset_fg", "ColorPresetButton", preset_sb); + theme->set_icon("preset_bg", "ColorPresetButton", theme->get_icon(SNAME("GuiMiniCheckerboard"), SNAME("EditorIcons"))); + theme->set_icon("overbright_indicator", "ColorPresetButton", theme->get_icon(SNAME("OverbrightIndicator"), SNAME("EditorIcons"))); // Information on 3D viewport Ref<StyleBoxFlat> style_info_3d_viewport = style_default->duplicate(); style_info_3d_viewport->set_bg_color(style_info_3d_viewport->get_bg_color() * Color(1, 1, 1, 0.5)); style_info_3d_viewport->set_border_width_all(0); - theme->set_stylebox(SNAME("Information3dViewport"), SNAME("EditorStyles"), style_info_3d_viewport); + theme->set_stylebox("Information3dViewport", "EditorStyles", style_info_3d_viewport); // Asset Library. - theme->set_stylebox(SNAME("panel"), SNAME("AssetLib"), style_content_panel); - theme->set_color(SNAME("status_color"), SNAME("AssetLib"), Color(0.5, 0.5, 0.5)); - theme->set_icon(SNAME("dismiss"), SNAME("AssetLib"), theme->get_icon(SNAME("Close"), SNAME("EditorIcons"))); + theme->set_stylebox("panel", "AssetLib", style_content_panel); + theme->set_color("status_color", "AssetLib", Color(0.5, 0.5, 0.5)); + theme->set_icon("dismiss", "AssetLib", theme->get_icon(SNAME("Close"), SNAME("EditorIcons"))); // Theme editor. - theme->set_color(SNAME("preview_picker_overlay_color"), SNAME("ThemeEditor"), Color(0.1, 0.1, 0.1, 0.25)); + theme->set_color("preview_picker_overlay_color", "ThemeEditor", Color(0.1, 0.1, 0.1, 0.25)); Color theme_preview_picker_bg_color = accent_color; theme_preview_picker_bg_color.a = 0.2; Ref<StyleBoxFlat> theme_preview_picker_sb = make_flat_stylebox(theme_preview_picker_bg_color, 0, 0, 0, 0); theme_preview_picker_sb->set_border_color(accent_color); theme_preview_picker_sb->set_border_width_all(1.0 * EDSCALE); - theme->set_stylebox(SNAME("preview_picker_overlay"), SNAME("ThemeEditor"), theme_preview_picker_sb); + theme->set_stylebox("preview_picker_overlay", "ThemeEditor", theme_preview_picker_sb); Color theme_preview_picker_label_bg_color = accent_color; theme_preview_picker_label_bg_color.set_v(0.5); Ref<StyleBoxFlat> theme_preview_picker_label_sb = make_flat_stylebox(theme_preview_picker_label_bg_color, 4.0, 1.0, 4.0, 3.0); - theme->set_stylebox(SNAME("preview_picker_label"), SNAME("ThemeEditor"), theme_preview_picker_label_sb); + theme->set_stylebox("preview_picker_label", "ThemeEditor", theme_preview_picker_label_sb); // adaptive script theme constants // for comments and elements with lower relevance @@ -1593,27 +1593,27 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) { } // Now theme is loaded, apply it to CodeEdit. - theme->set_color(SNAME("background_color"), SNAME("CodeEdit"), EDITOR_GET("text_editor/theme/highlighting/background_color")); - theme->set_color(SNAME("completion_background_color"), SNAME("CodeEdit"), EDITOR_GET("text_editor/theme/highlighting/completion_background_color")); - theme->set_color(SNAME("completion_selected_color"), SNAME("CodeEdit"), EDITOR_GET("text_editor/theme/highlighting/completion_selected_color")); - theme->set_color(SNAME("completion_existing_color"), SNAME("CodeEdit"), EDITOR_GET("text_editor/theme/highlighting/completion_existing_color")); - theme->set_color(SNAME("completion_scroll_color"), SNAME("CodeEdit"), EDITOR_GET("text_editor/theme/highlighting/completion_scroll_color")); - theme->set_color(SNAME("completion_font_color"), SNAME("CodeEdit"), EDITOR_GET("text_editor/theme/highlighting/completion_font_color")); - theme->set_color(SNAME("font_color"), SNAME("CodeEdit"), EDITOR_GET("text_editor/theme/highlighting/text_color")); - theme->set_color(SNAME("line_number_color"), SNAME("CodeEdit"), EDITOR_GET("text_editor/theme/highlighting/line_number_color")); - theme->set_color(SNAME("caret_color"), SNAME("CodeEdit"), EDITOR_GET("text_editor/theme/highlighting/caret_color")); - theme->set_color(SNAME("font_selected_color"), SNAME("CodeEdit"), EDITOR_GET("text_editor/theme/highlighting/text_selected_color")); - theme->set_color(SNAME("selection_color"), SNAME("CodeEdit"), EDITOR_GET("text_editor/theme/highlighting/selection_color")); - theme->set_color(SNAME("brace_mismatch_color"), SNAME("CodeEdit"), EDITOR_GET("text_editor/theme/highlighting/brace_mismatch_color")); - theme->set_color(SNAME("current_line_color"), SNAME("CodeEdit"), EDITOR_GET("text_editor/theme/highlighting/current_line_color")); - theme->set_color(SNAME("line_length_guideline_color"), SNAME("CodeEdit"), EDITOR_GET("text_editor/theme/highlighting/line_length_guideline_color")); - theme->set_color(SNAME("word_highlighted_color"), SNAME("CodeEdit"), EDITOR_GET("text_editor/theme/highlighting/word_highlighted_color")); - theme->set_color(SNAME("bookmark_color"), SNAME("CodeEdit"), EDITOR_GET("text_editor/theme/highlighting/bookmark_color")); - theme->set_color(SNAME("breakpoint_color"), SNAME("CodeEdit"), EDITOR_GET("text_editor/theme/highlighting/breakpoint_color")); - theme->set_color(SNAME("executing_line_color"), SNAME("CodeEdit"), EDITOR_GET("text_editor/theme/highlighting/executing_line_color")); - theme->set_color(SNAME("code_folding_color"), SNAME("CodeEdit"), EDITOR_GET("text_editor/theme/highlighting/code_folding_color")); - theme->set_color(SNAME("search_result_color"), SNAME("CodeEdit"), EDITOR_GET("text_editor/theme/highlighting/search_result_color")); - theme->set_color(SNAME("search_result_border_color"), SNAME("CodeEdit"), EDITOR_GET("text_editor/theme/highlighting/search_result_border_color")); + theme->set_color("background_color", "CodeEdit", EDITOR_GET("text_editor/theme/highlighting/background_color")); + theme->set_color("completion_background_color", "CodeEdit", EDITOR_GET("text_editor/theme/highlighting/completion_background_color")); + theme->set_color("completion_selected_color", "CodeEdit", EDITOR_GET("text_editor/theme/highlighting/completion_selected_color")); + theme->set_color("completion_existing_color", "CodeEdit", EDITOR_GET("text_editor/theme/highlighting/completion_existing_color")); + theme->set_color("completion_scroll_color", "CodeEdit", EDITOR_GET("text_editor/theme/highlighting/completion_scroll_color")); + theme->set_color("completion_font_color", "CodeEdit", EDITOR_GET("text_editor/theme/highlighting/completion_font_color")); + theme->set_color("font_color", "CodeEdit", EDITOR_GET("text_editor/theme/highlighting/text_color")); + theme->set_color("line_number_color", "CodeEdit", EDITOR_GET("text_editor/theme/highlighting/line_number_color")); + theme->set_color("caret_color", "CodeEdit", EDITOR_GET("text_editor/theme/highlighting/caret_color")); + theme->set_color("font_selected_color", "CodeEdit", EDITOR_GET("text_editor/theme/highlighting/text_selected_color")); + theme->set_color("selection_color", "CodeEdit", EDITOR_GET("text_editor/theme/highlighting/selection_color")); + theme->set_color("brace_mismatch_color", "CodeEdit", EDITOR_GET("text_editor/theme/highlighting/brace_mismatch_color")); + theme->set_color("current_line_color", "CodeEdit", EDITOR_GET("text_editor/theme/highlighting/current_line_color")); + theme->set_color("line_length_guideline_color", "CodeEdit", EDITOR_GET("text_editor/theme/highlighting/line_length_guideline_color")); + theme->set_color("word_highlighted_color", "CodeEdit", EDITOR_GET("text_editor/theme/highlighting/word_highlighted_color")); + theme->set_color("bookmark_color", "CodeEdit", EDITOR_GET("text_editor/theme/highlighting/bookmark_color")); + theme->set_color("breakpoint_color", "CodeEdit", EDITOR_GET("text_editor/theme/highlighting/breakpoint_color")); + theme->set_color("executing_line_color", "CodeEdit", EDITOR_GET("text_editor/theme/highlighting/executing_line_color")); + theme->set_color("code_folding_color", "CodeEdit", EDITOR_GET("text_editor/theme/highlighting/code_folding_color")); + theme->set_color("search_result_color", "CodeEdit", EDITOR_GET("text_editor/theme/highlighting/search_result_color")); + theme->set_color("search_result_border_color", "CodeEdit", EDITOR_GET("text_editor/theme/highlighting/search_result_border_color")); return theme; } diff --git a/editor/editor_toaster.cpp b/editor/editor_toaster.cpp index f326c9fc37..24227b3a6b 100644 --- a/editor/editor_toaster.cpp +++ b/editor/editor_toaster.cpp @@ -333,13 +333,13 @@ Control *EditorToaster::popup(Control *p_control, Severity p_severity, double p_ panel->set_tooltip(p_tooltip); switch (p_severity) { case SEVERITY_INFO: - panel->add_theme_style_override(SNAME("panel"), info_panel_style_background); + panel->add_theme_style_override("panel", info_panel_style_background); break; case SEVERITY_WARNING: - panel->add_theme_style_override(SNAME("panel"), warning_panel_style_background); + panel->add_theme_style_override("panel", warning_panel_style_background); break; case SEVERITY_ERROR: - panel->add_theme_style_override(SNAME("panel"), error_panel_style_background); + panel->add_theme_style_override("panel", error_panel_style_background); break; default: break; @@ -508,7 +508,7 @@ EditorToaster::EditorToaster() { // Disable notification button. disable_notifications_panel = memnew(PanelContainer); disable_notifications_panel->set_as_top_level(true); - disable_notifications_panel->add_theme_style_override(SNAME("panel"), info_panel_style_background); + disable_notifications_panel->add_theme_style_override("panel", info_panel_style_background); add_child(disable_notifications_panel); disable_notifications_button = memnew(Button); diff --git a/editor/editor_zoom_widget.cpp b/editor/editor_zoom_widget.cpp index 8d258ba2e1..abfa383297 100644 --- a/editor/editor_zoom_widget.cpp +++ b/editor/editor_zoom_widget.cpp @@ -176,9 +176,9 @@ EditorZoomWidget::EditorZoomWidget() { zoom_reset = memnew(Button); zoom_reset->set_flat(true); add_child(zoom_reset); - zoom_reset->add_theme_constant_override(SNAME("outline_size"), 1); - zoom_reset->add_theme_color_override(SNAME("font_outline_color"), Color(0, 0, 0)); - zoom_reset->add_theme_color_override(SNAME("font_color"), Color(1, 1, 1)); + zoom_reset->add_theme_constant_override("outline_size", 1); + zoom_reset->add_theme_color_override("font_outline_color", Color(0, 0, 0)); + zoom_reset->add_theme_color_override("font_color", Color(1, 1, 1)); zoom_reset->connect("pressed", callable_mp(this, &EditorZoomWidget::_button_zoom_reset)); zoom_reset->set_shortcut(ED_SHORTCUT("canvas_item_editor/zoom_reset", TTR("Zoom Reset"), KeyModifierMask::CMD | Key::KEY_0)); zoom_reset->set_shortcut_context(this); @@ -197,5 +197,5 @@ EditorZoomWidget::EditorZoomWidget() { _update_zoom_label(); - add_theme_constant_override(SNAME("separation"), Math::round(-8 * EDSCALE)); + add_theme_constant_override("separation", Math::round(-8 * EDSCALE)); } diff --git a/editor/export_template_manager.cpp b/editor/export_template_manager.cpp index 9519224c12..8c34609e9c 100644 --- a/editor/export_template_manager.cpp +++ b/editor/export_template_manager.cpp @@ -357,9 +357,9 @@ void ExportTemplateManager::_set_current_progress_status(const String &p_status, download_progress_label->set_text(p_status); if (p_error) { - download_progress_label->add_theme_color_override(SNAME("font_color"), get_theme_color(SNAME("error_color"), SNAME("Editor"))); + download_progress_label->add_theme_color_override("font_color", get_theme_color(SNAME("error_color"), SNAME("Editor"))); } else { - download_progress_label->add_theme_color_override(SNAME("font_color"), get_theme_color(SNAME("font_color"), SNAME("Label"))); + download_progress_label->add_theme_color_override("font_color", get_theme_color(SNAME("font_color"), SNAME("Label"))); } } @@ -744,9 +744,9 @@ void ExportTemplateManager::_notification(int p_what) { switch (p_what) { case NOTIFICATION_ENTER_TREE: case NOTIFICATION_THEME_CHANGED: { - current_value->add_theme_font_override(SNAME("font"), get_theme_font(SNAME("main"), SNAME("EditorFonts"))); - current_missing_label->add_theme_color_override(SNAME("font_color"), get_theme_color(SNAME("error_color"), SNAME("Editor"))); - current_installed_label->add_theme_color_override(SNAME("font_color"), get_theme_color(SNAME("disabled_font_color"), SNAME("Editor"))); + current_value->add_theme_font_override("font", get_theme_font(SNAME("main"), SNAME("EditorFonts"))); + current_missing_label->add_theme_color_override("font_color", get_theme_color(SNAME("error_color"), SNAME("Editor"))); + current_installed_label->add_theme_color_override("font_color", get_theme_color(SNAME("disabled_font_color"), SNAME("Editor"))); mirror_options_button->set_icon(get_theme_icon(SNAME("GuiTabMenuHl"), SNAME("EditorIcons"))); } break; diff --git a/editor/filesystem_dock.cpp b/editor/filesystem_dock.cpp index 324aed5d02..c91351022f 100644 --- a/editor/filesystem_dock.cpp +++ b/editor/filesystem_dock.cpp @@ -338,30 +338,28 @@ void FileSystemDock::_notification(int p_what) { EditorFileSystem::get_singleton()->connect("filesystem_changed", callable_mp(this, &FileSystemDock::_fs_changed)); EditorResourcePreview::get_singleton()->connect("preview_invalidated", callable_mp(this, &FileSystemDock::_preview_invalidated)); - String ei = "EditorIcons"; - - button_reload->set_icon(get_theme_icon(SNAME("Reload"), ei)); - button_toggle_display_mode->set_icon(get_theme_icon(SNAME("Panels2"), ei)); + button_reload->set_icon(get_theme_icon(SNAME("Reload"), SNAME("EditorIcons"))); + button_toggle_display_mode->set_icon(get_theme_icon(SNAME("Panels2"), SNAME("EditorIcons"))); button_file_list_display_mode->connect("pressed", callable_mp(this, &FileSystemDock::_toggle_file_display)); files->connect("item_activated", callable_mp(this, &FileSystemDock::_file_list_activate_file)); button_hist_next->connect("pressed", callable_mp(this, &FileSystemDock::_fw_history)); button_hist_prev->connect("pressed", callable_mp(this, &FileSystemDock::_bw_history)); - tree_search_box->set_right_icon(get_theme_icon(SNAME("Search"), ei)); + tree_search_box->set_right_icon(get_theme_icon(SNAME("Search"), SNAME("EditorIcons"))); tree_search_box->set_clear_button_enabled(true); - tree_button_sort->set_icon(get_theme_icon(SNAME("Sort"), ei)); + tree_button_sort->set_icon(get_theme_icon(SNAME("Sort"), SNAME("EditorIcons"))); - file_list_search_box->set_right_icon(get_theme_icon(SNAME("Search"), ei)); + file_list_search_box->set_right_icon(get_theme_icon(SNAME("Search"), SNAME("EditorIcons"))); file_list_search_box->set_clear_button_enabled(true); - file_list_button_sort->set_icon(get_theme_icon(SNAME("Sort"), ei)); + file_list_button_sort->set_icon(get_theme_icon(SNAME("Sort"), SNAME("EditorIcons"))); if (is_layout_rtl()) { - button_hist_next->set_icon(get_theme_icon(SNAME("Back"), ei)); - button_hist_prev->set_icon(get_theme_icon(SNAME("Forward"), ei)); + button_hist_next->set_icon(get_theme_icon(SNAME("Back"), SNAME("EditorIcons"))); + button_hist_prev->set_icon(get_theme_icon(SNAME("Forward"), SNAME("EditorIcons"))); } else { - button_hist_next->set_icon(get_theme_icon(SNAME("Forward"), ei)); - button_hist_prev->set_icon(get_theme_icon(SNAME("Back"), ei)); + button_hist_next->set_icon(get_theme_icon(SNAME("Forward"), SNAME("EditorIcons"))); + button_hist_prev->set_icon(get_theme_icon(SNAME("Back"), SNAME("EditorIcons"))); } file_list_popup->connect("id_pressed", callable_mp(this, &FileSystemDock::_file_list_rmb_option)); tree_popup->connect("id_pressed", callable_mp(this, &FileSystemDock::_tree_rmb_option)); @@ -412,15 +410,14 @@ void FileSystemDock::_notification(int p_what) { case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: { // Update icons. - String ei = "EditorIcons"; - button_reload->set_icon(get_theme_icon(SNAME("Reload"), ei)); - button_toggle_display_mode->set_icon(get_theme_icon(SNAME("Panels2"), ei)); + button_reload->set_icon(get_theme_icon(SNAME("Reload"), SNAME("EditorIcons"))); + button_toggle_display_mode->set_icon(get_theme_icon(SNAME("Panels2"), SNAME("EditorIcons"))); if (is_layout_rtl()) { - button_hist_next->set_icon(get_theme_icon(SNAME("Back"), ei)); - button_hist_prev->set_icon(get_theme_icon(SNAME("Forward"), ei)); + button_hist_next->set_icon(get_theme_icon(SNAME("Back"), SNAME("EditorIcons"))); + button_hist_prev->set_icon(get_theme_icon(SNAME("Forward"), SNAME("EditorIcons"))); } else { - button_hist_next->set_icon(get_theme_icon(SNAME("Forward"), ei)); - button_hist_prev->set_icon(get_theme_icon(SNAME("Back"), ei)); + button_hist_next->set_icon(get_theme_icon(SNAME("Forward"), SNAME("EditorIcons"))); + button_hist_prev->set_icon(get_theme_icon(SNAME("Back"), SNAME("EditorIcons"))); } if (file_list_display_mode == FILE_LIST_DISPLAY_LIST) { button_file_list_display_mode->set_icon(get_theme_icon(SNAME("FileThumbnail"), SNAME("EditorIcons"))); @@ -428,13 +425,13 @@ void FileSystemDock::_notification(int p_what) { button_file_list_display_mode->set_icon(get_theme_icon(SNAME("FileList"), SNAME("EditorIcons"))); } - tree_search_box->set_right_icon(get_theme_icon(SNAME("Search"), ei)); + tree_search_box->set_right_icon(get_theme_icon(SNAME("Search"), SNAME("EditorIcons"))); tree_search_box->set_clear_button_enabled(true); - tree_button_sort->set_icon(get_theme_icon(SNAME("Sort"), ei)); + tree_button_sort->set_icon(get_theme_icon(SNAME("Sort"), SNAME("EditorIcons"))); - file_list_search_box->set_right_icon(get_theme_icon(SNAME("Search"), ei)); + file_list_search_box->set_right_icon(get_theme_icon(SNAME("Search"), SNAME("EditorIcons"))); file_list_search_box->set_clear_button_enabled(true); - file_list_button_sort->set_icon(get_theme_icon(SNAME("Sort"), ei)); + file_list_button_sort->set_icon(get_theme_icon(SNAME("Sort"), SNAME("EditorIcons"))); // Update always show folders. bool new_always_show_folders = bool(EditorSettings::get_singleton()->get("docks/filesystem/always_show_folders")); @@ -718,7 +715,6 @@ void FileSystemDock::_update_file_list(bool p_keep_selection) { String directory = path; String file = ""; - String ei = "EditorIcons"; int thumbnail_size = EditorSettings::get_singleton()->get("docks/filesystem/thumbnail_size"); thumbnail_size *= EDSCALE; Ref<Texture2D> folder_thumbnail; @@ -736,13 +732,13 @@ void FileSystemDock::_update_file_list(bool p_keep_selection) { files->set_fixed_icon_size(Size2(thumbnail_size, thumbnail_size)); if (thumbnail_size < 64) { - folder_thumbnail = get_theme_icon(SNAME("FolderMediumThumb"), ei); - file_thumbnail = get_theme_icon(SNAME("FileMediumThumb"), ei); - file_thumbnail_broken = get_theme_icon(SNAME("FileDeadMediumThumb"), ei); + folder_thumbnail = get_theme_icon(SNAME("FolderMediumThumb"), SNAME("EditorIcons")); + file_thumbnail = get_theme_icon(SNAME("FileMediumThumb"), SNAME("EditorIcons")); + file_thumbnail_broken = get_theme_icon(SNAME("FileDeadMediumThumb"), SNAME("EditorIcons")); } else { - folder_thumbnail = get_theme_icon(SNAME("FolderBigThumb"), ei); - file_thumbnail = get_theme_icon(SNAME("FileBigThumb"), ei); - file_thumbnail_broken = get_theme_icon(SNAME("FileDeadBigThumb"), ei); + folder_thumbnail = get_theme_icon(SNAME("FolderBigThumb"), SNAME("EditorIcons")); + file_thumbnail = get_theme_icon(SNAME("FileBigThumb"), SNAME("EditorIcons")); + file_thumbnail_broken = get_theme_icon(SNAME("FileDeadBigThumb"), SNAME("EditorIcons")); } } else { // No thumbnails. @@ -871,7 +867,6 @@ void FileSystemDock::_update_file_list(bool p_keep_selection) { // Fills the ItemList control node from the FileInfos. String main_scene = ProjectSettings::get_singleton()->get("application/run/main_scene"); - String oi = "Object"; for (FileInfo &E : file_list) { FileInfo *finfo = &(E); String fname = finfo->name; @@ -885,10 +880,10 @@ void FileSystemDock::_update_file_list(bool p_keep_selection) { // Select the icons. if (!finfo->import_broken) { - type_icon = (has_theme_icon(ftype, ei)) ? get_theme_icon(ftype, ei) : get_theme_icon(oi, ei); + type_icon = (has_theme_icon(ftype, SNAME("EditorIcons"))) ? get_theme_icon(ftype, SNAME("EditorIcons")) : get_theme_icon(SNAME("Object"), SNAME("EditorIcons")); big_icon = file_thumbnail; } else { - type_icon = get_theme_icon(SNAME("ImportFail"), ei); + type_icon = get_theme_icon(SNAME("ImportFail"), SNAME("EditorIcons")); big_icon = file_thumbnail_broken; tooltip += "\n" + TTR("Status: Import of file failed. Please fix file and reimport manually."); } @@ -1230,6 +1225,30 @@ void FileSystemDock::_try_duplicate_item(const FileOrFolder &p_item, const Strin if (err != OK) { EditorNode::get_singleton()->add_io_error(TTR("Error duplicating:") + "\n" + old_path + ".import\n"); } + + // Remove uid from .import file to avoid conflict. + Ref<ConfigFile> cfg; + cfg.instantiate(); + cfg->load(new_path + ".import"); + cfg->erase_section_key("remap", "uid"); + cfg->save(new_path + ".import"); + } else if (p_item.is_file && (old_path.get_extension() == "tscn" || old_path.get_extension() == "tres")) { + // FIXME: Quick hack to fix text resources. This should be fixed properly. + FileAccessRef file = FileAccess::open(old_path, FileAccess::READ, &err); + if (err == OK) { + PackedStringArray lines = file->get_as_utf8_string().split("\n"); + String line = lines[0]; + + if (line.contains("uid")) { + line = line.substr(0, line.find(" uid")) + "]"; + lines.write[0] = line; + + FileAccessRef file2 = FileAccess::open(new_path, FileAccess::WRITE, &err); + if (err == OK) { + file2->store_string(String("\n").join(lines)); + } + } + } } } else { EditorNode::get_singleton()->add_io_error(TTR("Error duplicating:") + "\n" + old_path + "\n"); @@ -2834,7 +2853,7 @@ FileSystemDock::FileSystemDock(EditorNode *p_editor) { add_child(top_vbc); HBoxContainer *toolbar_hbc = memnew(HBoxContainer); - toolbar_hbc->add_theme_constant_override(SNAME("separation"), 0); + toolbar_hbc->add_theme_constant_override("separation", 0); top_vbc->add_child(toolbar_hbc); button_hist_prev = memnew(Button); @@ -2873,7 +2892,7 @@ FileSystemDock::FileSystemDock(EditorNode *p_editor) { toolbar_hbc->add_child(button_toggle_display_mode); toolbar2_hbc = memnew(HBoxContainer); - toolbar2_hbc->add_theme_constant_override(SNAME("separation"), 0); + toolbar2_hbc->add_theme_constant_override("separation", 0); top_vbc->add_child(toolbar2_hbc); tree_search_box = memnew(LineEdit); diff --git a/editor/find_in_files.cpp b/editor/find_in_files.cpp index e2e5f89e23..dd72def6ad 100644 --- a/editor/find_in_files.cpp +++ b/editor/find_in_files.cpp @@ -567,8 +567,8 @@ FindInFilesPanel::FindInFilesPanel() { hbc->add_child(find_label); _search_text_label = memnew(Label); - _search_text_label->add_theme_font_override(SNAME("font"), EditorNode::get_singleton()->get_gui_base()->get_theme_font(SNAME("source"), SNAME("EditorFonts"))); - _search_text_label->add_theme_font_size_override(SNAME("font_size"), EditorNode::get_singleton()->get_gui_base()->get_theme_font_size(SNAME("source_size"), SNAME("EditorFonts"))); + _search_text_label->add_theme_font_override("font", EditorNode::get_singleton()->get_gui_base()->get_theme_font(SNAME("source"), SNAME("EditorFonts"))); + _search_text_label->add_theme_font_size_override("font_size", EditorNode::get_singleton()->get_gui_base()->get_theme_font_size(SNAME("source_size"), SNAME("EditorFonts"))); hbc->add_child(_search_text_label); _progress_bar = memnew(ProgressBar); @@ -596,8 +596,8 @@ FindInFilesPanel::FindInFilesPanel() { } _results_display = memnew(Tree); - _results_display->add_theme_font_override(SNAME("font"), EditorNode::get_singleton()->get_gui_base()->get_theme_font(SNAME("source"), SNAME("EditorFonts"))); - _results_display->add_theme_font_size_override(SNAME("font_size"), EditorNode::get_singleton()->get_gui_base()->get_theme_font_size(SNAME("source_size"), SNAME("EditorFonts"))); + _results_display->add_theme_font_override("font", EditorNode::get_singleton()->get_gui_base()->get_theme_font(SNAME("source"), SNAME("EditorFonts"))); + _results_display->add_theme_font_size_override("font_size", EditorNode::get_singleton()->get_gui_base()->get_theme_font_size(SNAME("source_size"), SNAME("EditorFonts"))); _results_display->set_v_size_flags(SIZE_EXPAND_FILL); _results_display->connect("item_selected", callable_mp(this, &FindInFilesPanel::_on_result_selected)); _results_display->connect("item_edited", callable_mp(this, &FindInFilesPanel::_on_item_edited)); @@ -689,8 +689,8 @@ void FindInFilesPanel::_notification(int p_what) { if (p_what == NOTIFICATION_PROCESS) { _progress_bar->set_as_ratio(_finder->get_progress()); } else if (p_what == NOTIFICATION_THEME_CHANGED) { - _search_text_label->add_theme_font_override(SNAME("font"), get_theme_font(SNAME("source"), SNAME("EditorFonts"))); - _results_display->add_theme_font_override(SNAME("font"), get_theme_font(SNAME("source"), SNAME("EditorFonts"))); + _search_text_label->add_theme_font_override("font", get_theme_font(SNAME("source"), SNAME("EditorFonts"))); + _results_display->add_theme_font_override("font", get_theme_font(SNAME("source"), SNAME("EditorFonts"))); } } diff --git a/editor/groups_editor.cpp b/editor/groups_editor.cpp index 4753035686..1644bb9dbe 100644 --- a/editor/groups_editor.cpp +++ b/editor/groups_editor.cpp @@ -448,7 +448,7 @@ GroupDialog::GroupDialog() { groups->set_allow_reselect(true); groups->set_allow_rmb_select(true); groups->set_v_size_flags(Control::SIZE_EXPAND_FILL); - groups->add_theme_constant_override(SNAME("draw_guides"), 1); + groups->add_theme_constant_override("draw_guides", 1); groups->connect("item_selected", callable_mp(this, &GroupDialog::_group_selected)); groups->connect("button_pressed", callable_mp(this, &GroupDialog::_modify_group_pressed)); groups->connect("item_edited", callable_mp(this, &GroupDialog::_group_renamed)); @@ -484,10 +484,10 @@ GroupDialog::GroupDialog() { nodes_to_add->set_hide_folding(true); nodes_to_add->set_select_mode(Tree::SELECT_MULTI); nodes_to_add->set_v_size_flags(Control::SIZE_EXPAND_FILL); - nodes_to_add->add_theme_constant_override(SNAME("draw_guides"), 1); + nodes_to_add->add_theme_constant_override("draw_guides", 1); HBoxContainer *add_filter_hbc = memnew(HBoxContainer); - add_filter_hbc->add_theme_constant_override(SNAME("separate"), 0); + add_filter_hbc->add_theme_constant_override("separate", 0); vbc_add->add_child(add_filter_hbc); add_filter = memnew(LineEdit); @@ -534,10 +534,10 @@ GroupDialog::GroupDialog() { nodes_to_remove->set_hide_root(true); nodes_to_remove->set_hide_folding(true); nodes_to_remove->set_select_mode(Tree::SELECT_MULTI); - nodes_to_remove->add_theme_constant_override(SNAME("draw_guides"), 1); + nodes_to_remove->add_theme_constant_override("draw_guides", 1); HBoxContainer *remove_filter_hbc = memnew(HBoxContainer); - remove_filter_hbc->add_theme_constant_override(SNAME("separate"), 0); + remove_filter_hbc->add_theme_constant_override("separate", 0); vbc_remove->add_child(remove_filter_hbc); remove_filter = memnew(LineEdit); @@ -733,8 +733,8 @@ GroupsEditor::GroupsEditor() { tree->set_v_size_flags(Control::SIZE_EXPAND_FILL); vbc->add_child(tree); tree->connect("button_pressed", callable_mp(this, &GroupsEditor::_modify_group)); - tree->add_theme_constant_override(SNAME("draw_guides"), 1); - add_theme_constant_override(SNAME("separation"), 3 * EDSCALE); + tree->add_theme_constant_override("draw_guides", 1); + add_theme_constant_override("separation", 3 * EDSCALE); _group_name_changed(""); } diff --git a/editor/import/dynamicfont_import_settings.cpp b/editor/import/dynamicfont_import_settings.cpp index 6f4966dd33..244352fbb2 100644 --- a/editor/import/dynamicfont_import_settings.cpp +++ b/editor/import/dynamicfont_import_settings.cpp @@ -481,7 +481,7 @@ void DynamicFontImportSettings::_main_prop_changed(const String &p_edited_proper font_preview->get_data(0)->set_oversampling(import_settings_data->get("oversampling")); } } - font_preview_label->add_theme_font_override(SNAME("font"), font_preview); + font_preview_label->add_theme_font_override("font", font_preview); font_preview_label->update(); } @@ -1036,7 +1036,7 @@ void DynamicFontImportSettings::open_settings(const String &p_path) { font_main.instantiate(); font_main->add_data(dfont_main); - text_edit->add_theme_font_override(SNAME("font"), font_main); + text_edit->add_theme_font_override("font", font_main); base_path = p_path; @@ -1263,7 +1263,7 @@ void DynamicFontImportSettings::open_settings(const String &p_path) { font_preview->get_data(0)->set_hinting((TextServer::Hinting)import_settings_data->get("hinting").operator int()); font_preview->get_data(0)->set_oversampling(import_settings_data->get("oversampling")); } - font_preview_label->add_theme_font_override(SNAME("font"), font_preview); + font_preview_label->add_theme_font_override("font", font_preview); font_preview_label->update(); menu_ot->clear(); @@ -1372,7 +1372,7 @@ DynamicFontImportSettings::DynamicFontImportSettings() { label_warn->set_horizontal_alignment(HORIZONTAL_ALIGNMENT_CENTER); label_warn->set_text(""); root_vb->add_child(label_warn); - label_warn->add_theme_color_override(SNAME("font_color"), warn_color); + label_warn->add_theme_color_override("font_color", warn_color); label_warn->hide(); // Page 1 layout: Rendering Options @@ -1392,7 +1392,7 @@ DynamicFontImportSettings::DynamicFontImportSettings() { page1_vb->add_child(page1_hb); font_preview_label = memnew(Label); - font_preview_label->add_theme_font_size_override(SNAME("font_size"), 200 * EDSCALE); + font_preview_label->add_theme_font_size_override("font_size", 200 * EDSCALE); font_preview_label->set_horizontal_alignment(HORIZONTAL_ALIGNMENT_CENTER); font_preview_label->set_vertical_alignment(VERTICAL_ALIGNMENT_CENTER); font_preview_label->set_autowrap_mode(Label::AUTOWRAP_ARBITRARY); @@ -1545,9 +1545,9 @@ DynamicFontImportSettings::DynamicFontImportSettings() { for (int i = 0; i < 16; i++) { glyph_table->set_column_title(i + 1, String::num_int64(i, 16)); } - glyph_table->add_theme_style_override(SNAME("selected"), glyph_table->get_theme_stylebox(SNAME("bg"))); - glyph_table->add_theme_style_override(SNAME("selected_focus"), glyph_table->get_theme_stylebox(SNAME("bg"))); - glyph_table->add_theme_constant_override(SNAME("hseparation"), 0); + glyph_table->add_theme_style_override("selected", glyph_table->get_theme_stylebox(SNAME("bg"))); + glyph_table->add_theme_style_override("selected_focus", glyph_table->get_theme_stylebox(SNAME("bg"))); + glyph_table->add_theme_constant_override("hseparation", 0); glyph_table->set_h_size_flags(Control::SIZE_EXPAND_FILL); glyph_table->set_v_size_flags(Control::SIZE_EXPAND_FILL); diff --git a/editor/import_dock.cpp b/editor/import_dock.cpp index b76d31ec1f..f809747410 100644 --- a/editor/import_dock.cpp +++ b/editor/import_dock.cpp @@ -561,12 +561,12 @@ void ImportDock::_reimport() { void ImportDock::_notification(int p_what) { switch (p_what) { case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: { - imported->add_theme_style_override(SNAME("normal"), get_theme_stylebox(SNAME("normal"), SNAME("LineEdit"))); + imported->add_theme_style_override("normal", get_theme_stylebox(SNAME("normal"), SNAME("LineEdit"))); } break; case NOTIFICATION_ENTER_TREE: { import_opts->edit(params); - label_warning->add_theme_color_override(SNAME("font_color"), get_theme_color(SNAME("warning_color"), SNAME("Editor"))); + label_warning->add_theme_color_override("font_color", get_theme_color(SNAME("warning_color"), SNAME("Editor"))); } break; } } @@ -579,12 +579,12 @@ void ImportDock::_set_dirty(bool p_dirty) { if (p_dirty) { // Add a dirty marker to notify the user that they should reimport the selected resource to see changes. import->set_text(TTR("Reimport") + " (*)"); - import->add_theme_color_override(SNAME("font_color"), get_theme_color(SNAME("warning_color"), SNAME("Editor"))); + import->add_theme_color_override("font_color", get_theme_color(SNAME("warning_color"), SNAME("Editor"))); import->set_tooltip(TTR("You have pending changes that haven't been applied yet. Click Reimport to apply changes made to the import options.\nSelecting another resource in the FileSystem dock without clicking Reimport first will discard changes made in the Import dock.")); } else { // Remove the dirty marker on the Reimport button. import->set_text(TTR("Reimport")); - import->remove_theme_color_override(SNAME("font_color")); + import->remove_theme_color_override("font_color"); import->set_tooltip(""); } } @@ -617,7 +617,7 @@ ImportDock::ImportDock() { content->hide(); imported = memnew(Label); - imported->add_theme_style_override(SNAME("normal"), EditorNode::get_singleton()->get_gui_base()->get_theme_stylebox(SNAME("normal"), SNAME("LineEdit"))); + imported->add_theme_style_override("normal", EditorNode::get_singleton()->get_gui_base()->get_theme_stylebox(SNAME("normal"), SNAME("LineEdit"))); imported->set_clip_text(true); content->add_child(imported); HBoxContainer *hb = memnew(HBoxContainer); diff --git a/editor/inspector_dock.cpp b/editor/inspector_dock.cpp index 95e50d90b9..e36c86fb10 100644 --- a/editor/inspector_dock.cpp +++ b/editor/inspector_dock.cpp @@ -422,7 +422,7 @@ void InspectorDock::_notification(int p_what) { object_menu->set_icon(get_theme_icon(SNAME("Tools"), SNAME("EditorIcons"))); search->set_right_icon(get_theme_icon(SNAME("Search"), SNAME("EditorIcons"))); warning->set_icon(get_theme_icon(SNAME("NodeWarning"), SNAME("EditorIcons"))); - warning->add_theme_color_override(SNAME("font_color"), get_theme_color(SNAME("warning_color"), SNAME("Editor"))); + warning->add_theme_color_override("font_color", get_theme_color(SNAME("warning_color"), SNAME("Editor"))); } break; } } diff --git a/editor/plugins/animation_blend_space_1d_editor.cpp b/editor/plugins/animation_blend_space_1d_editor.cpp index 9a350437a1..3dcb769faf 100644 --- a/editor/plugins/animation_blend_space_1d_editor.cpp +++ b/editor/plugins/animation_blend_space_1d_editor.cpp @@ -530,9 +530,9 @@ void AnimationNodeBlendSpace1DEditor::_open_editor() { void AnimationNodeBlendSpace1DEditor::_notification(int p_what) { if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_THEME_CHANGED) { - error_panel->add_theme_style_override(SNAME("panel"), get_theme_stylebox(SNAME("bg"), SNAME("Tree"))); - error_label->add_theme_color_override(SNAME("font_color"), get_theme_color(SNAME("error_color"), SNAME("Editor"))); - panel->add_theme_style_override(SNAME("panel"), get_theme_stylebox(SNAME("bg"), SNAME("Tree"))); + error_panel->add_theme_style_override("panel", get_theme_stylebox(SNAME("bg"), SNAME("Tree"))); + error_label->add_theme_color_override("font_color", get_theme_color(SNAME("error_color"), SNAME("Editor"))); + panel->add_theme_style_override("panel", get_theme_stylebox(SNAME("bg"), SNAME("Tree"))); tool_blend->set_icon(get_theme_icon(SNAME("EditPivot"), SNAME("EditorIcons"))); tool_select->set_icon(get_theme_icon(SNAME("ToolSelect"), SNAME("EditorIcons"))); tool_create->set_icon(get_theme_icon(SNAME("EditKey"), SNAME("EditorIcons"))); diff --git a/editor/plugins/animation_blend_space_2d_editor.cpp b/editor/plugins/animation_blend_space_2d_editor.cpp index 15d522d8e7..f9df8db419 100644 --- a/editor/plugins/animation_blend_space_2d_editor.cpp +++ b/editor/plugins/animation_blend_space_2d_editor.cpp @@ -730,9 +730,9 @@ void AnimationNodeBlendSpace2DEditor::_edit_point_pos(double) { void AnimationNodeBlendSpace2DEditor::_notification(int p_what) { if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_THEME_CHANGED) { - error_panel->add_theme_style_override(SNAME("panel"), get_theme_stylebox(SNAME("bg"), SNAME("Tree"))); - error_label->add_theme_color_override(SNAME("font_color"), get_theme_color(SNAME("error_color"), SNAME("Editor"))); - panel->add_theme_style_override(SNAME("panel"), get_theme_stylebox(SNAME("bg"), SNAME("Tree"))); + error_panel->add_theme_style_override("panel", get_theme_stylebox(SNAME("bg"), SNAME("Tree"))); + error_label->add_theme_color_override("font_color", get_theme_color(SNAME("error_color"), SNAME("Editor"))); + panel->add_theme_style_override("panel", get_theme_stylebox(SNAME("bg"), SNAME("Tree"))); tool_blend->set_icon(get_theme_icon(SNAME("EditPivot"), SNAME("EditorIcons"))); tool_select->set_icon(get_theme_icon(SNAME("ToolSelect"), SNAME("EditorIcons"))); tool_create->set_icon(get_theme_icon(SNAME("EditKey"), SNAME("EditorIcons"))); diff --git a/editor/plugins/animation_blend_tree_editor_plugin.cpp b/editor/plugins/animation_blend_tree_editor_plugin.cpp index 216405110b..40d6bc48e7 100644 --- a/editor/plugins/animation_blend_tree_editor_plugin.cpp +++ b/editor/plugins/animation_blend_tree_editor_plugin.cpp @@ -243,10 +243,10 @@ void AnimationNodeBlendTreeEditor::_update_graph() { mono_color.a = 0.85; c = mono_color; - node->add_theme_color_override(SNAME("title_color"), c); + node->add_theme_color_override("title_color", c); c.a = 0.7; - node->add_theme_color_override(SNAME("close_color"), c); - node->add_theme_color_override(SNAME("resizer_color"), c); + node->add_theme_color_override("close_color", c); + node->add_theme_color_override("resizer_color", c); } List<AnimationNodeBlendTree::NodeConnection> connections; @@ -300,7 +300,7 @@ void AnimationNodeBlendTreeEditor::_add_node(int p_idx) { base_name = add_options[p_idx].name; } else { ERR_FAIL_COND(add_options[p_idx].script.is_null()); - String base_type = add_options[p_idx].script->get_instance_base_type(); + StringName base_type = add_options[p_idx].script->get_instance_base_type(); AnimationNode *an = Object::cast_to<AnimationNode>(ClassDB::instantiate(base_type)); ERR_FAIL_COND(!an); anode = Ref<AnimationNode>(an); @@ -739,8 +739,8 @@ void AnimationNodeBlendTreeEditor::_notification(int p_what) { } if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_THEME_CHANGED) { - error_panel->add_theme_style_override(SNAME("panel"), get_theme_stylebox(SNAME("bg"), SNAME("Tree"))); - error_label->add_theme_color_override(SNAME("font_color"), get_theme_color(SNAME("error_color"), SNAME("Editor"))); + error_panel->add_theme_style_override("panel", get_theme_stylebox(SNAME("bg"), SNAME("Tree"))); + error_label->add_theme_color_override("font_color", get_theme_color(SNAME("error_color"), SNAME("Editor"))); if (p_what == NOTIFICATION_THEME_CHANGED && is_visible_in_tree()) { _update_graph(); diff --git a/editor/plugins/animation_player_editor_plugin.cpp b/editor/plugins/animation_player_editor_plugin.cpp index 2a1843fbf2..320c47e820 100644 --- a/editor/plugins/animation_player_editor_plugin.cpp +++ b/editor/plugins/animation_player_editor_plugin.cpp @@ -101,10 +101,10 @@ void AnimationPlayerEditor::_notification(int p_what) { get_tree()->connect("node_removed", callable_mp(this, &AnimationPlayerEditor::_node_removed)); - add_theme_style_override(SNAME("panel"), editor->get_gui_base()->get_theme_stylebox(SNAME("panel"), SNAME("Panel"))); + add_theme_style_override("panel", editor->get_gui_base()->get_theme_stylebox(SNAME("panel"), SNAME("Panel"))); } break; case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: { - add_theme_style_override(SNAME("panel"), editor->get_gui_base()->get_theme_stylebox(SNAME("panel"), SNAME("Panel"))); + add_theme_style_override("panel", editor->get_gui_base()->get_theme_stylebox(SNAME("panel"), SNAME("Panel"))); } break; case NOTIFICATION_TRANSLATION_CHANGED: case NOTIFICATION_LAYOUT_DIRECTION_CHANGED: @@ -137,8 +137,8 @@ void AnimationPlayerEditor::_notification(int p_what) { pin->set_icon(get_theme_icon(SNAME("Pin"), SNAME("EditorIcons"))); - tool_anim->add_theme_style_override(SNAME("normal"), get_theme_stylebox(SNAME("normal"), SNAME("Button"))); - track_editor->get_edit_menu()->add_theme_style_override(SNAME("normal"), get_theme_stylebox(SNAME("normal"), SNAME("Button"))); + tool_anim->add_theme_style_override("normal", get_theme_stylebox(SNAME("normal"), SNAME("Button"))); + track_editor->get_edit_menu()->add_theme_style_override("normal", get_theme_stylebox(SNAME("normal"), SNAME("Button"))); #define ITEM_ICON(m_item, m_icon) tool_anim->get_popup()->set_item_icon(tool_anim->get_popup()->get_item_index(m_item), get_theme_icon(SNAME(m_icon), SNAME("EditorIcons"))) diff --git a/editor/plugins/animation_state_machine_editor.cpp b/editor/plugins/animation_state_machine_editor.cpp index 55cbe640b3..f750c92fb3 100644 --- a/editor/plugins/animation_state_machine_editor.cpp +++ b/editor/plugins/animation_state_machine_editor.cpp @@ -883,9 +883,9 @@ void AnimationNodeStateMachineEditor::_update_graph() { void AnimationNodeStateMachineEditor::_notification(int p_what) { if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_THEME_CHANGED || p_what == NOTIFICATION_LAYOUT_DIRECTION_CHANGED || p_what == NOTIFICATION_TRANSLATION_CHANGED) { - error_panel->add_theme_style_override(SNAME("panel"), get_theme_stylebox(SNAME("bg"), SNAME("Tree"))); - error_label->add_theme_color_override(SNAME("font_color"), get_theme_color(SNAME("error_color"), SNAME("Editor"))); - panel->add_theme_style_override(SNAME("panel"), get_theme_stylebox(SNAME("bg"), SNAME("Tree"))); + error_panel->add_theme_style_override("panel", get_theme_stylebox(SNAME("bg"), SNAME("Tree"))); + error_label->add_theme_color_override("font_color", get_theme_color(SNAME("error_color"), SNAME("Editor"))); + panel->add_theme_style_override("panel", get_theme_stylebox(SNAME("bg"), SNAME("Tree"))); tool_select->set_icon(get_theme_icon(SNAME("ToolSelect"), SNAME("EditorIcons"))); tool_create->set_icon(get_theme_icon(SNAME("ToolAddNode"), SNAME("EditorIcons"))); diff --git a/editor/plugins/asset_library_editor_plugin.cpp b/editor/plugins/asset_library_editor_plugin.cpp index d11bcb5f1f..7199f69f0b 100644 --- a/editor/plugins/asset_library_editor_plugin.cpp +++ b/editor/plugins/asset_library_editor_plugin.cpp @@ -68,9 +68,9 @@ void EditorAssetLibraryItem::set_image(int p_type, int p_index, const Ref<Textur void EditorAssetLibraryItem::_notification(int p_what) { if (p_what == NOTIFICATION_ENTER_TREE) { icon->set_normal_texture(get_theme_icon(SNAME("ProjectIconLoading"), SNAME("EditorIcons"))); - category->add_theme_color_override(SNAME("font_color"), Color(0.5, 0.5, 0.5)); - author->add_theme_color_override(SNAME("font_color"), Color(0.5, 0.5, 0.5)); - price->add_theme_color_override(SNAME("font_color"), Color(0.5, 0.5, 0.5)); + category->add_theme_color_override("font_color", Color(0.5, 0.5, 0.5)); + author->add_theme_color_override("font_color", Color(0.5, 0.5, 0.5)); + price->add_theme_color_override("font_color", Color(0.5, 0.5, 0.5)); } } @@ -100,11 +100,11 @@ EditorAssetLibraryItem::EditorAssetLibraryItem() { border->set_default_margin(SIDE_RIGHT, 5 * EDSCALE); border->set_default_margin(SIDE_BOTTOM, 5 * EDSCALE); border->set_default_margin(SIDE_TOP, 5 * EDSCALE); - add_theme_style_override(SNAME("panel"), border); + add_theme_style_override("panel", border); HBoxContainer *hb = memnew(HBoxContainer); // Add some spacing to visually separate the icon from the asset details. - hb->add_theme_constant_override(SNAME("separation"), 15 * EDSCALE); + hb->add_theme_constant_override("separation", 15 * EDSCALE); add_child(hb); icon = memnew(TextureButton); @@ -195,7 +195,7 @@ void EditorAssetLibraryItemDescription::_notification(int p_what) { switch (p_what) { case NOTIFICATION_ENTER_TREE: case NOTIFICATION_THEME_CHANGED: { - previews_bg->add_theme_style_override(SNAME("panel"), previews->get_theme_stylebox(SNAME("normal"), SNAME("TextEdit"))); + previews_bg->add_theme_style_override("panel", previews->get_theme_stylebox(SNAME("normal"), SNAME("TextEdit"))); } break; } } @@ -269,7 +269,7 @@ EditorAssetLibraryItemDescription::EditorAssetLibraryItemDescription() { add_child(hbox); VBoxContainer *desc_vbox = memnew(VBoxContainer); hbox->add_child(desc_vbox); - hbox->add_theme_constant_override(SNAME("separation"), 15 * EDSCALE); + hbox->add_theme_constant_override("separation", 15 * EDSCALE); item = memnew(EditorAssetLibraryItem); @@ -280,11 +280,11 @@ EditorAssetLibraryItemDescription::EditorAssetLibraryItemDescription() { desc_vbox->add_child(description); description->set_v_size_flags(Control::SIZE_EXPAND_FILL); description->connect("meta_clicked", callable_mp(this, &EditorAssetLibraryItemDescription::_link_click)); - description->add_theme_constant_override(SNAME("line_separation"), Math::round(5 * EDSCALE)); + description->add_theme_constant_override("line_separation", Math::round(5 * EDSCALE)); VBoxContainer *previews_vbox = memnew(VBoxContainer); hbox->add_child(previews_vbox); - previews_vbox->add_theme_constant_override(SNAME("separation"), 15 * EDSCALE); + previews_vbox->add_theme_constant_override("separation", 15 * EDSCALE); previews_vbox->set_v_size_flags(Control::SIZE_EXPAND_FILL); preview = memnew(TextureRect); @@ -400,8 +400,8 @@ void EditorAssetLibraryItemDownload::_notification(int p_what) { switch (p_what) { case NOTIFICATION_ENTER_TREE: case NOTIFICATION_THEME_CHANGED: { - panel->add_theme_style_override(SNAME("panel"), get_theme_stylebox(SNAME("panel"), SNAME("AssetLib"))); - status->add_theme_color_override(SNAME("font_color"), get_theme_color(SNAME("status_color"), SNAME("AssetLib"))); + panel->add_theme_style_override("panel", get_theme_stylebox(SNAME("panel"), SNAME("AssetLib"))); + status->add_theme_color_override("font_color", get_theme_color(SNAME("status_color"), SNAME("AssetLib"))); dismiss_button->set_normal_texture(get_theme_icon(SNAME("dismiss"), SNAME("AssetLib"))); } break; case NOTIFICATION_PROCESS: { @@ -578,9 +578,9 @@ void EditorAssetLibrary::_notification(int p_what) { case NOTIFICATION_THEME_CHANGED: { error_tr->set_texture(get_theme_icon(SNAME("Error"), SNAME("EditorIcons"))); filter->set_right_icon(get_theme_icon(SNAME("Search"), SNAME("EditorIcons"))); - library_scroll_bg->add_theme_style_override(SNAME("panel"), get_theme_stylebox(SNAME("bg"), SNAME("Tree"))); - downloads_scroll->add_theme_style_override(SNAME("bg"), get_theme_stylebox(SNAME("bg"), SNAME("Tree"))); - error_label->add_theme_color_override(SNAME("color"), get_theme_color(SNAME("error_color"), SNAME("Editor"))); + library_scroll_bg->add_theme_style_override("panel", get_theme_stylebox(SNAME("bg"), SNAME("Tree"))); + downloads_scroll->add_theme_style_override("bg", get_theme_stylebox(SNAME("bg"), SNAME("Tree"))); + error_label->add_theme_color_override("color", get_theme_color(SNAME("error_color"), SNAME("Editor"))); } break; case NOTIFICATION_VISIBILITY_CHANGED: { if (is_visible()) { @@ -984,7 +984,7 @@ HBoxContainer *EditorAssetLibrary::_make_pages(int p_page, int p_page_count, int } hbc->add_spacer(); - hbc->add_theme_constant_override(SNAME("separation"), 5 * EDSCALE); + hbc->add_theme_constant_override("separation", 5 * EDSCALE); Button *first = memnew(Button); first->set_text(TTR("First")); @@ -1191,8 +1191,8 @@ void EditorAssetLibrary::_http_request_completed(int p_status, int p_code, const asset_items = memnew(GridContainer); asset_items->set_columns(2); - asset_items->add_theme_constant_override(SNAME("hseparation"), 10 * EDSCALE); - asset_items->add_theme_constant_override(SNAME("vseparation"), 10 * EDSCALE); + asset_items->add_theme_constant_override("hseparation", 10 * EDSCALE); + asset_items->add_theme_constant_override("vseparation", 10 * EDSCALE); library_vb->add_child(asset_items); @@ -1374,7 +1374,7 @@ EditorAssetLibrary::EditorAssetLibrary(bool p_templates_only) { HBoxContainer *search_hb = memnew(HBoxContainer); library_main->add_child(search_hb); - library_main->add_theme_constant_override(SNAME("separation"), 10 * EDSCALE); + library_main->add_theme_constant_override("separation", 10 * EDSCALE); filter = memnew(LineEdit); if (templates_only) { @@ -1482,7 +1482,7 @@ EditorAssetLibrary::EditorAssetLibrary(bool p_templates_only) { PanelContainer *library_vb_border = memnew(PanelContainer); library_scroll->add_child(library_vb_border); - library_vb_border->add_theme_style_override(SNAME("panel"), border2); + library_vb_border->add_theme_style_override("panel", border2); library_vb_border->set_h_size_flags(Control::SIZE_EXPAND_FILL); library_vb = memnew(VBoxContainer); @@ -1504,8 +1504,8 @@ EditorAssetLibrary::EditorAssetLibrary(bool p_templates_only) { asset_items = memnew(GridContainer); asset_items->set_columns(2); - asset_items->add_theme_constant_override(SNAME("hseparation"), 10 * EDSCALE); - asset_items->add_theme_constant_override(SNAME("vseparation"), 10 * EDSCALE); + asset_items->add_theme_constant_override("hseparation", 10 * EDSCALE); + asset_items->add_theme_constant_override("vseparation", 10 * EDSCALE); library_vb->add_child(asset_items); @@ -1519,7 +1519,7 @@ EditorAssetLibrary::EditorAssetLibrary(bool p_templates_only) { last_queue_id = 0; - library_vb->add_theme_constant_override(SNAME("separation"), 20 * EDSCALE); + library_vb->add_theme_constant_override("separation", 20 * EDSCALE); error_hb = memnew(HBoxContainer); library_main->add_child(error_hb); diff --git a/editor/plugins/audio_stream_editor_plugin.cpp b/editor/plugins/audio_stream_editor_plugin.cpp index e20e6dc9ea..086d5474ba 100644 --- a/editor/plugins/audio_stream_editor_plugin.cpp +++ b/editor/plugins/audio_stream_editor_plugin.cpp @@ -224,7 +224,7 @@ AudioStreamEditor::AudioStreamEditor() { _preview->add_child(_indicator); HBoxContainer *hbox = memnew(HBoxContainer); - hbox->add_theme_constant_override(SNAME("separation"), 0); + hbox->add_theme_constant_override("separation", 0); vbox->add_child(hbox); _play_button = memnew(Button); @@ -243,14 +243,14 @@ AudioStreamEditor::AudioStreamEditor() { _current_label = memnew(Label); _current_label->set_horizontal_alignment(HORIZONTAL_ALIGNMENT_RIGHT); _current_label->set_h_size_flags(SIZE_EXPAND_FILL); - _current_label->add_theme_font_override(SNAME("font"), EditorNode::get_singleton()->get_gui_base()->get_theme_font(SNAME("status_source"), SNAME("EditorFonts"))); - _current_label->add_theme_font_size_override(SNAME("font_size"), EditorNode::get_singleton()->get_gui_base()->get_theme_font_size(SNAME("status_source_size"), SNAME("EditorFonts"))); + _current_label->add_theme_font_override("font", EditorNode::get_singleton()->get_gui_base()->get_theme_font(SNAME("status_source"), SNAME("EditorFonts"))); + _current_label->add_theme_font_size_override("font_size", EditorNode::get_singleton()->get_gui_base()->get_theme_font_size(SNAME("status_source_size"), SNAME("EditorFonts"))); _current_label->set_modulate(Color(1, 1, 1, 0.5)); hbox->add_child(_current_label); _duration_label = memnew(Label); - _duration_label->add_theme_font_override(SNAME("font"), EditorNode::get_singleton()->get_gui_base()->get_theme_font(SNAME("status_source"), SNAME("EditorFonts"))); - _duration_label->add_theme_font_size_override(SNAME("font_size"), EditorNode::get_singleton()->get_gui_base()->get_theme_font_size(SNAME("status_source_size"), SNAME("EditorFonts"))); + _duration_label->add_theme_font_override("font", EditorNode::get_singleton()->get_gui_base()->get_theme_font(SNAME("status_source"), SNAME("EditorFonts"))); + _duration_label->add_theme_font_size_override("font_size", EditorNode::get_singleton()->get_gui_base()->get_theme_font_size(SNAME("status_source_size"), SNAME("EditorFonts"))); hbox->add_child(_duration_label); } diff --git a/editor/plugins/canvas_item_editor_plugin.cpp b/editor/plugins/canvas_item_editor_plugin.cpp index 4a7c8d7d01..aa8ad55ff3 100644 --- a/editor/plugins/canvas_item_editor_plugin.cpp +++ b/editor/plugins/canvas_item_editor_plugin.cpp @@ -3847,7 +3847,7 @@ void CanvasItemEditor::_notification(int p_what) { // the icon will be dark, so we need to lighten it before blending it // with the red color. const Color key_auto_color = EditorSettings::get_singleton()->is_dark_theme() ? Color(1, 1, 1) : Color(4.25, 4.25, 4.25); - key_auto_insert_button->add_theme_color_override(SNAME("icon_pressed_color"), key_auto_color.lerp(Color(1, 0, 0), 0.55)); + key_auto_insert_button->add_theme_color_override("icon_pressed_color", key_auto_color.lerp(Color(1, 0, 0), 0.55)); animation_menu->set_icon(get_theme_icon(SNAME("GuiTabMenuHl"), SNAME("EditorIcons"))); _update_context_menu_stylebox(); @@ -3967,7 +3967,7 @@ void CanvasItemEditor::_update_context_menu_stylebox() { context_menu_stylebox->set_border_color(accent_color); context_menu_stylebox->set_border_width(SIDE_BOTTOM, Math::round(2 * EDSCALE)); context_menu_stylebox->set_default_margin(SIDE_BOTTOM, 0); - context_menu_container->add_theme_style_override(SNAME("panel"), context_menu_stylebox); + context_menu_container->add_theme_style_override("panel", context_menu_stylebox); } void CanvasItemEditor::_update_scrollbars() { @@ -5804,7 +5804,7 @@ void CanvasItemEditorViewport::_create_nodes(Node *parent, Node *child, String & } // make visible for certain node type - if (ClassDB::is_parent_class(child->get_class(), "Control")) { + if (Object::cast_to<Control>(child)) { Size2 texture_size = texture->get_size(); editor_data->get_undo_redo().add_do_property(child, "rect_size", texture_size); } else if (Object::cast_to<Polygon2D>(child)) { @@ -5935,29 +5935,32 @@ bool CanvasItemEditorViewport::can_drop_data(const Point2 &p_point, const Varian if (String(d["type"]) == "files") { Vector<String> files = d["files"]; bool can_instantiate = false; - for (int i = 0; i < files.size(); i++) { // check if dragged files contain resource or scene can be created at least once - RES res = ResourceLoader::load(files[i]); - if (res.is_null()) { - continue; - } - String type = res->get_class(); - if (type == "PackedScene") { - Ref<PackedScene> sdata = Ref<PackedScene>(Object::cast_to<PackedScene>(*res)); - Node *instantiated_scene = sdata->instantiate(PackedScene::GEN_EDIT_STATE_INSTANCE); - if (!instantiated_scene) { + + List<String> scene_extensions; + ResourceLoader::get_recognized_extensions_for_type("PackedScene", &scene_extensions); + List<String> texture_extensions; + ResourceLoader::get_recognized_extensions_for_type("Texture2D", &texture_extensions); + + for (int i = 0; i < files.size(); i++) { + // Check if dragged files with texture or scene extension can be created at least once. + if (texture_extensions.find(files[i].get_extension()) || scene_extensions.find(files[i].get_extension())) { + RES res = ResourceLoader::load(files[i]); + if (res.is_null()) { continue; } - memdelete(instantiated_scene); - } else if (ClassDB::is_parent_class(type, "Texture2D")) { - Ref<Texture2D> texture = Ref<Texture2D>(Object::cast_to<Texture2D>(*res)); - if (!texture.is_valid()) { + Ref<PackedScene> scn = res; + if (scn.is_valid()) { + Node *instantiated_scene = scn->instantiate(PackedScene::GEN_EDIT_STATE_INSTANCE); + if (!instantiated_scene) { + continue; + } + memdelete(instantiated_scene); + } else { continue; } - } else { - continue; + can_instantiate = true; + break; } - can_instantiate = true; - break; } if (can_instantiate) { if (!preview_node->get_parent()) { // create preview only once @@ -6073,7 +6076,7 @@ void CanvasItemEditorViewport::_notification(int p_what) { check->set_icon(get_theme_icon(check->get_text(), SNAME("EditorIcons"))); } - label->add_theme_color_override(SNAME("font_color"), get_theme_color(SNAME("warning_color"), SNAME("Editor"))); + label->add_theme_color_override("font_color", get_theme_color(SNAME("warning_color"), SNAME("Editor"))); } switch (p_what) { @@ -6141,16 +6144,16 @@ CanvasItemEditorViewport::CanvasItemEditorViewport(EditorNode *p_node, CanvasIte } label = memnew(Label); - label->add_theme_color_override(SNAME("font_shadow_color"), Color(0, 0, 0, 1)); - label->add_theme_constant_override(SNAME("shadow_outline_size"), 1 * EDSCALE); + label->add_theme_color_override("font_shadow_color", Color(0, 0, 0, 1)); + label->add_theme_constant_override("shadow_outline_size", 1 * EDSCALE); label->hide(); canvas_item_editor->get_controls_container()->add_child(label); label_desc = memnew(Label); - label_desc->add_theme_color_override(SNAME("font_color"), Color(0.6f, 0.6f, 0.6f, 1)); - label_desc->add_theme_color_override(SNAME("font_shadow_color"), Color(0.2f, 0.2f, 0.2f, 1)); - label_desc->add_theme_constant_override(SNAME("shadow_outline_size"), 1 * EDSCALE); - label_desc->add_theme_constant_override(SNAME("line_spacing"), 0); + label_desc->add_theme_color_override("font_color", Color(0.6f, 0.6f, 0.6f, 1)); + label_desc->add_theme_color_override("font_shadow_color", Color(0.2f, 0.2f, 0.2f, 1)); + label_desc->add_theme_constant_override("shadow_outline_size", 1 * EDSCALE); + label_desc->add_theme_constant_override("line_spacing", 0); label_desc->hide(); canvas_item_editor->get_controls_container()->add_child(label_desc); diff --git a/editor/plugins/debugger_editor_plugin.cpp b/editor/plugins/debugger_editor_plugin.cpp index 3042132a4d..6e43130a92 100644 --- a/editor/plugins/debugger_editor_plugin.cpp +++ b/editor/plugins/debugger_editor_plugin.cpp @@ -54,7 +54,7 @@ DebuggerEditorPlugin::DebuggerEditorPlugin(EditorNode *p_editor, MenuButton *p_d EditorDebuggerNode *debugger = memnew(EditorDebuggerNode); Button *db = EditorNode::get_singleton()->add_bottom_panel_item(TTR("Debugger"), debugger); // Add separation for the warning/error icon that is displayed later. - db->add_theme_constant_override(SNAME("hseparation"), 6 * EDSCALE); + db->add_theme_constant_override("hseparation", 6 * EDSCALE); debugger->set_tool_button(db); // Main editor debug menu. diff --git a/editor/plugins/editor_preview_plugins.cpp b/editor/plugins/editor_preview_plugins.cpp index 7e0019faac..d23b52014e 100644 --- a/editor/plugins/editor_preview_plugins.cpp +++ b/editor/plugins/editor_preview_plugins.cpp @@ -188,7 +188,7 @@ bool EditorImagePreviewPlugin::generate_small_preview_automatically() const { } //////////////////////////////////////////////////////////////////////////// -///////////////////////////////////////////////// + bool EditorBitmapPreviewPlugin::handles(const String &p_type) const { return ClassDB::is_parent_class(p_type, "BitMap"); } @@ -308,7 +308,7 @@ void EditorMaterialPreviewPlugin::_preview_done() { } bool EditorMaterialPreviewPlugin::handles(const String &p_type) const { - return ClassDB::is_parent_class(p_type, "Material"); //any material + return ClassDB::is_parent_class(p_type, "Material"); // Any material. } bool EditorMaterialPreviewPlugin::generate_small_preview_automatically() const { @@ -699,7 +699,7 @@ void EditorMeshPreviewPlugin::_preview_done() { } bool EditorMeshPreviewPlugin::handles(const String &p_type) const { - return ClassDB::is_parent_class(p_type, "Mesh"); //any Mesh + return ClassDB::is_parent_class(p_type, "Mesh"); // Any mesh. } Ref<Texture2D> EditorMeshPreviewPlugin::generate(const RES &p_from, const Size2 &p_size) const { diff --git a/editor/plugins/input_event_editor_plugin.cpp b/editor/plugins/input_event_editor_plugin.cpp index e8497c620e..b0ee88479a 100644 --- a/editor/plugins/input_event_editor_plugin.cpp +++ b/editor/plugins/input_event_editor_plugin.cpp @@ -76,10 +76,10 @@ void InputEventConfigContainer::set_event(const Ref<InputEvent> &p_event) { InputEventConfigContainer::InputEventConfigContainer() { MarginContainer *mc = memnew(MarginContainer); - mc->add_theme_constant_override(SNAME("margin_left"), 10); - mc->add_theme_constant_override(SNAME("margin_right"), 10); - mc->add_theme_constant_override(SNAME("margin_top"), 10); - mc->add_theme_constant_override(SNAME("margin_bottom"), 10); + mc->add_theme_constant_override("margin_left", 10); + mc->add_theme_constant_override("margin_right", 10); + mc->add_theme_constant_override("margin_top", 10); + mc->add_theme_constant_override("margin_bottom", 10); add_child(mc); HBoxContainer *hb = memnew(HBoxContainer); diff --git a/editor/plugins/node_3d_editor_plugin.cpp b/editor/plugins/node_3d_editor_plugin.cpp index b069cbc0bf..f79b5027cb 100644 --- a/editor/plugins/node_3d_editor_plugin.cpp +++ b/editor/plugins/node_3d_editor_plugin.cpp @@ -384,6 +384,28 @@ int Node3DEditorViewport::get_selected_count() const { return count; } +void Node3DEditorViewport::cancel_transform() { + _edit.mode = TRANSFORM_NONE; + + List<Node *> &selection = editor_selection->get_selected_node_list(); + + for (List<Node *>::Element *E = selection.front(); E; E = E->next()) { + Node3D *sp = Object::cast_to<Node3D>(E->get()); + if (!sp) { + continue; + } + + Node3DEditorSelectedItem *se = editor_selection->get_node_editor_data<Node3DEditorSelectedItem>(sp); + if (!se) { + continue; + } + + sp->set_global_transform(se->original); + } + surface->update(); + set_message(TTR("Transform Aborted."), 3); +} + float Node3DEditorViewport::get_znear() const { return CLAMP(spatial_editor->get_znear(), MIN_Z, MAX_Z); } @@ -864,12 +886,15 @@ void Node3DEditorViewport::_update_name() { view_menu->reset_size(); } -void Node3DEditorViewport::_compute_edit(const Point2 &p_point) { +void Node3DEditorViewport::_compute_edit(const Point2 &p_point, const bool p_auto_center) { + _edit.original_local = spatial_editor->are_local_coords_enabled(); _edit.click_ray = _get_ray(p_point); _edit.click_ray_pos = _get_ray_pos(p_point); _edit.plane = TRANSFORM_VIEW; + if (p_auto_center) { + _edit.center = spatial_editor->get_gizmo_transform().origin; + } spatial_editor->update_transform_gizmo(); - _edit.center = spatial_editor->get_gizmo_transform().origin; Node3D *selected = spatial_editor->get_single_selected_node(); Node3DEditorSelectedItem *se = selected ? editor_selection->get_node_editor_data<Node3DEditorSelectedItem>(selected) : nullptr; @@ -1018,24 +1043,40 @@ bool Node3DEditorViewport::_transform_gizmo_select(const Vector2 &p_screenpos, b if (spatial_editor->get_tool_mode() == Node3DEditor::TOOL_MODE_SELECT || spatial_editor->get_tool_mode() == Node3DEditor::TOOL_MODE_ROTATE) { int col_axis = -1; - float col_d = 1e20; - for (int i = 0; i < 3; i++) { - Plane plane(gt.basis.get_axis(i).normalized(), gt.origin); - Vector3 r; - if (!plane.intersects_ray(ray_pos, ray, &r)) { - continue; + Vector3 hit_position; + Vector3 hit_normal; + real_t ray_length = gt.origin.distance_to(ray_pos) + (GIZMO_CIRCLE_SIZE * gizmo_scale) * 4.0f; + if (Geometry3D::segment_intersects_sphere(ray_pos, ray_pos + ray * ray_length, gt.origin, gizmo_scale * (GIZMO_CIRCLE_SIZE), &hit_position, &hit_normal)) { + if (hit_normal.dot(_get_camera_normal()) < 0.05) { + hit_position = gt.xform_inv(hit_position).abs(); + int min_axis = hit_position.min_axis_index(); + if (hit_position[min_axis] < gizmo_scale * GIZMO_RING_HALF_WIDTH) { + col_axis = min_axis; + } } + } + + if (col_axis == -1) { + float col_d = 1e20; - const real_t dist = r.distance_to(gt.origin); - const Vector3 r_dir = (r - gt.origin).normalized(); + for (int i = 0; i < 3; i++) { + Plane plane(gt.basis.get_axis(i).normalized(), gt.origin); + Vector3 r; + if (!plane.intersects_ray(ray_pos, ray, &r)) { + continue; + } + + const real_t dist = r.distance_to(gt.origin); + const Vector3 r_dir = (r - gt.origin).normalized(); - if (_get_camera_normal().dot(r_dir) <= 0.005) { - if (dist > gizmo_scale * (GIZMO_CIRCLE_SIZE - GIZMO_RING_HALF_WIDTH) && dist < gizmo_scale * (GIZMO_CIRCLE_SIZE + GIZMO_RING_HALF_WIDTH)) { - const real_t d = ray_pos.distance_to(r); - if (d < col_d) { - col_d = d; - col_axis = i; + if (_get_camera_normal().dot(r_dir) <= 0.005) { + if (dist > gizmo_scale * (GIZMO_CIRCLE_SIZE - GIZMO_RING_HALF_WIDTH) && dist < gizmo_scale * (GIZMO_CIRCLE_SIZE + GIZMO_RING_HALF_WIDTH)) { + const real_t d = ray_pos.distance_to(r); + if (d < col_d) { + col_d = d; + col_axis = i; + } } } } @@ -1325,6 +1366,7 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) { } } + _edit.center = spatial_editor->get_gizmo_target_center(); Ref<InputEventMouseButton> b = p_event; if (b.is_valid()) { @@ -1375,39 +1417,7 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) { } if (_edit.mode != TRANSFORM_NONE && b->is_pressed()) { - //cancel motion - _edit.mode = TRANSFORM_NONE; - - List<Node *> &selection = editor_selection->get_selected_node_list(); - - for (Node *E : selection) { - Node3D *sp = Object::cast_to<Node3D>(E); - if (!sp) { - continue; - } - - Node3DEditorSelectedItem *se = editor_selection->get_node_editor_data<Node3DEditorSelectedItem>(sp); - if (!se) { - continue; - } - - if (se->gizmo.is_valid()) { - Vector<int> ids; - Vector<Transform3D> restore; - - for (const KeyValue<int, Transform3D> &GE : se->subgizmos) { - ids.push_back(GE.key); - restore.push_back(GE.value); - } - - se->gizmo->commit_subgizmos(ids, restore, true); - spatial_editor->update_transform_gizmo(); - } else { - sp->set_global_transform(se->original); - } - } - surface->update(); - set_message(TTR("Transform Aborted."), 3); + cancel_transform(); } if (b->is_pressed()) { @@ -1461,6 +1471,10 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) { } break; case MouseButton::LEFT: { if (b->is_pressed()) { + if (_edit.mode != TRANSFORM_NONE && _edit.instant) { + commit_transform(); + break; // just commit the edit, stop processing the event so we don't deselect the object + } NavigationScheme nav_scheme = (NavigationScheme)EditorSettings::get_singleton()->get("editors/3d/navigation/navigation_scheme").operator int(); if ((nav_scheme == NAVIGATION_MAYA || nav_scheme == NAVIGATION_MODO) && b->is_alt_pressed()) { break; @@ -1567,33 +1581,17 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) { clicked = ObjectID(); if ((spatial_editor->get_tool_mode() == Node3DEditor::TOOL_MODE_SELECT && b->is_command_pressed()) || spatial_editor->get_tool_mode() == Node3DEditor::TOOL_MODE_ROTATE) { - /* HANDLE ROTATION */ - if (get_selected_count() == 0) { - break; //bye - } - //handle rotate - _edit.mode = TRANSFORM_ROTATE; - _compute_edit(b->get_position()); + begin_transform(TRANSFORM_ROTATE, false); break; } if (spatial_editor->get_tool_mode() == Node3DEditor::TOOL_MODE_MOVE) { - if (get_selected_count() == 0) { - break; //bye - } - //handle translate - _edit.mode = TRANSFORM_TRANSLATE; - _compute_edit(b->get_position()); + begin_transform(TRANSFORM_TRANSLATE, false); break; } if (spatial_editor->get_tool_mode() == Node3DEditor::TOOL_MODE_SCALE) { - if (get_selected_count() == 0) { - break; //bye - } - //handle scale - _edit.mode = TRANSFORM_SCALE; - _compute_edit(b->get_position()); + begin_transform(TRANSFORM_SCALE, false); break; } @@ -1648,32 +1646,7 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) { se->gizmo->commit_subgizmos(ids, restore, false); spatial_editor->update_transform_gizmo(); } else { - static const char *_transform_name[4] = { - TTRC("None"), - TTRC("Rotate"), - // TRANSLATORS: This refers to the movement that changes the position of an object. - TTRC("Translate"), - TTRC("Scale"), - }; - undo_redo->create_action(TTRGET(_transform_name[_edit.mode])); - - List<Node *> &selection = editor_selection->get_selected_node_list(); - - for (List<Node *>::Element *E = selection.front(); E; E = E->next()) { - Node3D *sp = Object::cast_to<Node3D>(E->get()); - if (!sp) { - continue; - } - - Node3DEditorSelectedItem *sel_item = editor_selection->get_node_editor_data<Node3DEditorSelectedItem>(sp); - if (!sel_item) { - continue; - } - - undo_redo->add_do_method(sp, "set_global_transform", sp->get_global_gizmo_transform()); - undo_redo->add_undo_method(sp, "set_global_transform", sel_item->original); - } - undo_redo->commit_action(); + commit_transform(); } _edit.mode = TRANSFORM_NONE; set_message(""); @@ -1739,7 +1712,7 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) { String n = _edit.gizmo->get_handle_name(_edit.gizmo_handle, _edit.gizmo_handle_secondary); set_message(n + ": " + String(v)); - } else if ((m->get_button_mask() & MouseButton::MASK_LEFT) != MouseButton::NONE) { + } else if ((m->get_button_mask() & MouseButton::MASK_LEFT) != MouseButton::NONE || _edit.instant) { if (nav_scheme == NAVIGATION_MAYA && m->is_alt_pressed()) { nav_mode = NAVIGATION_ORBIT; } else if (nav_scheme == NAVIGATION_MODO && m->is_alt_pressed() && m->is_shift_pressed()) { @@ -1767,324 +1740,7 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) { return; } - Vector3 ray_pos = _get_ray_pos(m->get_position()); - Vector3 ray = _get_ray(m->get_position()); - double snap = EDITOR_GET("interface/inspector/default_float_step"); - int snap_step_decimals = Math::range_step_decimals(snap); - - switch (_edit.mode) { - case TRANSFORM_SCALE: { - Vector3 motion_mask; - Plane plane; - bool plane_mv = false; - - switch (_edit.plane) { - case TRANSFORM_VIEW: - motion_mask = Vector3(0, 0, 0); - plane = Plane(_get_camera_normal(), _edit.center); - break; - case TRANSFORM_X_AXIS: - motion_mask = spatial_editor->get_gizmo_transform().basis.get_axis(0).normalized(); - plane = Plane(motion_mask.cross(motion_mask.cross(_get_camera_normal())).normalized(), _edit.center); - break; - case TRANSFORM_Y_AXIS: - motion_mask = spatial_editor->get_gizmo_transform().basis.get_axis(1).normalized(); - plane = Plane(motion_mask.cross(motion_mask.cross(_get_camera_normal())).normalized(), _edit.center); - break; - case TRANSFORM_Z_AXIS: - motion_mask = spatial_editor->get_gizmo_transform().basis.get_axis(2).normalized(); - plane = Plane(motion_mask.cross(motion_mask.cross(_get_camera_normal())).normalized(), _edit.center); - break; - case TRANSFORM_YZ: - motion_mask = spatial_editor->get_gizmo_transform().basis.get_axis(2).normalized() + spatial_editor->get_gizmo_transform().basis.get_axis(1).normalized(); - plane = Plane(spatial_editor->get_gizmo_transform().basis.get_axis(0).normalized(), _edit.center); - plane_mv = true; - break; - case TRANSFORM_XZ: - motion_mask = spatial_editor->get_gizmo_transform().basis.get_axis(2).normalized() + spatial_editor->get_gizmo_transform().basis.get_axis(0).normalized(); - plane = Plane(spatial_editor->get_gizmo_transform().basis.get_axis(1).normalized(), _edit.center); - plane_mv = true; - break; - case TRANSFORM_XY: - motion_mask = spatial_editor->get_gizmo_transform().basis.get_axis(0).normalized() + spatial_editor->get_gizmo_transform().basis.get_axis(1).normalized(); - plane = Plane(spatial_editor->get_gizmo_transform().basis.get_axis(2).normalized(), _edit.center); - plane_mv = true; - break; - } - - Vector3 intersection; - if (!plane.intersects_ray(ray_pos, ray, &intersection)) { - break; - } - - Vector3 click; - if (!plane.intersects_ray(_edit.click_ray_pos, _edit.click_ray, &click)) { - break; - } - - Vector3 motion = intersection - click; - if (_edit.plane != TRANSFORM_VIEW) { - if (!plane_mv) { - motion = motion_mask.dot(motion) * motion_mask; - - } else { - // Alternative planar scaling mode - if (_get_key_modifier(m) != Key::SHIFT) { - motion = motion_mask.dot(motion) * motion_mask; - } - } - - } else { - const real_t center_click_dist = click.distance_to(_edit.center); - const real_t center_inters_dist = intersection.distance_to(_edit.center); - if (center_click_dist == 0) { - break; - } - - const real_t scale = center_inters_dist - center_click_dist; - motion = Vector3(scale, scale, scale); - } - - motion /= click.distance_to(_edit.center); - - // Disable local transformation for TRANSFORM_VIEW - bool local_coords = (spatial_editor->are_local_coords_enabled() && _edit.plane != TRANSFORM_VIEW); - - if (_edit.snap || spatial_editor->is_snap_enabled()) { - snap = spatial_editor->get_scale_snap() / 100; - } - Vector3 motion_snapped = motion; - motion_snapped.snap(Vector3(snap, snap, snap)); - // This might not be necessary anymore after issue #288 is solved (in 4.0?). - set_message(TTR("Scaling: ") + "(" + String::num(motion_snapped.x, snap_step_decimals) + ", " + - String::num(motion_snapped.y, snap_step_decimals) + ", " + String::num(motion_snapped.z, snap_step_decimals) + ")"); - motion = _edit.original.basis.inverse().xform(motion); - - List<Node *> &selection = editor_selection->get_selected_node_list(); - for (Node *E : selection) { - Node3D *sp = Object::cast_to<Node3D>(E); - if (!sp) { - continue; - } - - Node3DEditorSelectedItem *se = editor_selection->get_node_editor_data<Node3DEditorSelectedItem>(sp); - if (!se) { - continue; - } - - if (sp->has_meta("_edit_lock_")) { - continue; - } - - if (se->gizmo.is_valid()) { - for (KeyValue<int, Transform3D> &GE : se->subgizmos) { - Transform3D xform = GE.value; - Transform3D new_xform = _compute_transform(TRANSFORM_SCALE, se->original * xform, xform, motion, snap, local_coords, true); // Force orthogonal with subgizmo. - if (!local_coords) { - new_xform = se->original.affine_inverse() * new_xform; - } - se->gizmo->set_subgizmo_transform(GE.key, new_xform); - } - } else { - Transform3D new_xform = _compute_transform(TRANSFORM_SCALE, se->original, se->original_local, motion, snap, local_coords, sp->get_rotation_edit_mode() != Node3D::ROTATION_EDIT_MODE_BASIS); - _transform_gizmo_apply(se->sp, new_xform, local_coords); - } - } - - spatial_editor->update_transform_gizmo(); - surface->update(); - - } break; - - case TRANSFORM_TRANSLATE: { - Vector3 motion_mask; - Plane plane; - bool plane_mv = false; - - switch (_edit.plane) { - case TRANSFORM_VIEW: - plane = Plane(_get_camera_normal(), _edit.center); - break; - case TRANSFORM_X_AXIS: - motion_mask = spatial_editor->get_gizmo_transform().basis.get_axis(0).normalized(); - plane = Plane(motion_mask.cross(motion_mask.cross(_get_camera_normal())).normalized(), _edit.center); - break; - case TRANSFORM_Y_AXIS: - motion_mask = spatial_editor->get_gizmo_transform().basis.get_axis(1).normalized(); - plane = Plane(motion_mask.cross(motion_mask.cross(_get_camera_normal())).normalized(), _edit.center); - break; - case TRANSFORM_Z_AXIS: - motion_mask = spatial_editor->get_gizmo_transform().basis.get_axis(2).normalized(); - plane = Plane(motion_mask.cross(motion_mask.cross(_get_camera_normal())).normalized(), _edit.center); - break; - case TRANSFORM_YZ: - plane = Plane(spatial_editor->get_gizmo_transform().basis.get_axis(0).normalized(), _edit.center); - plane_mv = true; - break; - case TRANSFORM_XZ: - plane = Plane(spatial_editor->get_gizmo_transform().basis.get_axis(1).normalized(), _edit.center); - plane_mv = true; - break; - case TRANSFORM_XY: - plane = Plane(spatial_editor->get_gizmo_transform().basis.get_axis(2).normalized(), _edit.center); - plane_mv = true; - break; - } - - Vector3 intersection; - if (!plane.intersects_ray(ray_pos, ray, &intersection)) { - break; - } - - Vector3 click; - if (!plane.intersects_ray(_edit.click_ray_pos, _edit.click_ray, &click)) { - break; - } - - Vector3 motion = intersection - click; - if (_edit.plane != TRANSFORM_VIEW) { - if (!plane_mv) { - motion = motion_mask.dot(motion) * motion_mask; - } - } - - // Disable local transformation for TRANSFORM_VIEW - bool local_coords = (spatial_editor->are_local_coords_enabled() && _edit.plane != TRANSFORM_VIEW); - - if (_edit.snap || spatial_editor->is_snap_enabled()) { - snap = spatial_editor->get_translate_snap(); - } - Vector3 motion_snapped = motion; - motion_snapped.snap(Vector3(snap, snap, snap)); - set_message(TTR("Translating: ") + "(" + String::num(motion_snapped.x, snap_step_decimals) + ", " + - String::num(motion_snapped.y, snap_step_decimals) + ", " + String::num(motion_snapped.z, snap_step_decimals) + ")"); - motion = spatial_editor->get_gizmo_transform().basis.inverse().xform(motion); - - List<Node *> &selection = editor_selection->get_selected_node_list(); - for (Node *E : selection) { - Node3D *sp = Object::cast_to<Node3D>(E); - if (!sp) { - continue; - } - - Node3DEditorSelectedItem *se = editor_selection->get_node_editor_data<Node3DEditorSelectedItem>(sp); - if (!se) { - continue; - } - - if (sp->has_meta("_edit_lock_")) { - continue; - } - - if (se->gizmo.is_valid()) { - for (KeyValue<int, Transform3D> &GE : se->subgizmos) { - Transform3D xform = GE.value; - Transform3D new_xform = _compute_transform(TRANSFORM_TRANSLATE, se->original * xform, xform, motion, snap, local_coords, true); // Force orthogonal with subgizmo. - new_xform = se->original.affine_inverse() * new_xform; - se->gizmo->set_subgizmo_transform(GE.key, new_xform); - } - } else { - Transform3D new_xform = _compute_transform(TRANSFORM_TRANSLATE, se->original, se->original_local, motion, snap, local_coords, sp->get_rotation_edit_mode() != Node3D::ROTATION_EDIT_MODE_BASIS); - _transform_gizmo_apply(se->sp, new_xform, false); - } - } - - spatial_editor->update_transform_gizmo(); - surface->update(); - - } break; - - case TRANSFORM_ROTATE: { - Plane plane; - Vector3 axis; - - switch (_edit.plane) { - case TRANSFORM_VIEW: - plane = Plane(_get_camera_normal(), _edit.center); - break; - case TRANSFORM_X_AXIS: - plane = Plane(spatial_editor->get_gizmo_transform().basis.get_axis(0).normalized(), _edit.center); - axis = Vector3(1, 0, 0); - break; - case TRANSFORM_Y_AXIS: - plane = Plane(spatial_editor->get_gizmo_transform().basis.get_axis(1).normalized(), _edit.center); - axis = Vector3(0, 1, 0); - break; - case TRANSFORM_Z_AXIS: - plane = Plane(spatial_editor->get_gizmo_transform().basis.get_axis(2).normalized(), _edit.center); - axis = Vector3(0, 0, 1); - break; - case TRANSFORM_YZ: - case TRANSFORM_XZ: - case TRANSFORM_XY: - break; - } - - Vector3 intersection; - if (!plane.intersects_ray(ray_pos, ray, &intersection)) { - break; - } - - Vector3 click; - if (!plane.intersects_ray(_edit.click_ray_pos, _edit.click_ray, &click)) { - break; - } - - Vector3 y_axis = (click - _edit.center).normalized(); - Vector3 x_axis = plane.normal.cross(y_axis).normalized(); - - double angle = Math::atan2(x_axis.dot(intersection - _edit.center), y_axis.dot(intersection - _edit.center)); - - if (_edit.snap || spatial_editor->is_snap_enabled()) { - snap = spatial_editor->get_rotate_snap(); - } - angle = Math::rad2deg(angle) + snap * 0.5; //else it won't reach +180 - angle -= Math::fmod(angle, snap); - set_message(vformat(TTR("Rotating %s degrees."), String::num(angle, snap_step_decimals))); - angle = Math::deg2rad(angle); - - bool local_coords = (spatial_editor->are_local_coords_enabled() && _edit.plane != TRANSFORM_VIEW); // Disable local transformation for TRANSFORM_VIEW - - List<Node *> &selection = editor_selection->get_selected_node_list(); - for (Node *E : selection) { - Node3D *sp = Object::cast_to<Node3D>(E); - if (!sp) { - continue; - } - - Node3DEditorSelectedItem *se = editor_selection->get_node_editor_data<Node3DEditorSelectedItem>(sp); - if (!se) { - continue; - } - - if (sp->has_meta("_edit_lock_")) { - continue; - } - - Vector3 compute_axis = local_coords ? axis : plane.normal; - if (se->gizmo.is_valid()) { - for (KeyValue<int, Transform3D> &GE : se->subgizmos) { - Transform3D xform = GE.value; - - Transform3D new_xform = _compute_transform(TRANSFORM_ROTATE, se->original * xform, xform, compute_axis, angle, local_coords, true); // Force orthogonal with subgizmo. - if (!local_coords) { - new_xform = se->original.affine_inverse() * new_xform; - } - se->gizmo->set_subgizmo_transform(GE.key, new_xform); - } - } else { - Transform3D new_xform = _compute_transform(TRANSFORM_ROTATE, se->original, se->original_local, compute_axis, angle, local_coords, sp->get_rotation_edit_mode() != Node3D::ROTATION_EDIT_MODE_BASIS); - _transform_gizmo_apply(se->sp, new_xform, local_coords); - } - } - - spatial_editor->update_transform_gizmo(); - surface->update(); - - } break; - default: { - } - } + update_transform(m->get_position(), _get_key_modifier(m) == Key::SHIFT); } } else if ((m->get_button_mask() & MouseButton::MASK_RIGHT) != MouseButton::NONE || freelook_active) { if (nav_scheme == NAVIGATION_MAYA && m->is_alt_pressed()) { @@ -2225,6 +1881,51 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) { } } + if (_edit.mode != TRANSFORM_NONE) { + // We're actively transforming, handle keys specially + TransformPlane new_plane = TRANSFORM_VIEW; + String new_message; + if (ED_IS_SHORTCUT("spatial_editor/lock_transform_x", p_event)) { + new_plane = TRANSFORM_X_AXIS; + new_message = TTR("X-Axis Transform."); + } else if (ED_IS_SHORTCUT("spatial_editor/lock_transform_y", p_event)) { + new_plane = TRANSFORM_Y_AXIS; + new_message = TTR("Y-Axis Transform."); + } else if (ED_IS_SHORTCUT("spatial_editor/lock_transform_z", p_event)) { + new_plane = TRANSFORM_Z_AXIS; + new_message = TTR("Z-Axis Transform."); + } else if (_edit.mode != TRANSFORM_ROTATE) { // rotating on a plane doesn't make sense + if (ED_IS_SHORTCUT("spatial_editor/lock_transform_yz", p_event)) { + new_plane = TRANSFORM_YZ; + new_message = TTR("YZ-Plane Transform."); + } else if (ED_IS_SHORTCUT("spatial_editor/lock_transform_xz", p_event)) { + new_plane = TRANSFORM_XZ; + new_message = TTR("XZ-Plane Transform."); + } else if (ED_IS_SHORTCUT("spatial_editor/lock_transform_xy", p_event)) { + new_plane = TRANSFORM_XY; + new_message = TTR("XY-Plane Transform."); + } + } + + if (new_plane != TRANSFORM_VIEW) { + if (new_plane != _edit.plane) { + // lock me once and get a global constraint + _edit.plane = new_plane; + spatial_editor->set_local_coords_enabled(false); + } else if (!spatial_editor->are_local_coords_enabled()) { + // lock me twice and get a local constraint + spatial_editor->set_local_coords_enabled(true); + } else { + // lock me thrice and we're back where we started + _edit.plane = TRANSFORM_VIEW; + spatial_editor->set_local_coords_enabled(false); + } + update_transform(_edit.mouse_pos, Input::get_singleton()->is_key_pressed(Key::SHIFT)); + set_message(new_message, 2); + accept_event(); + return; + } + } if (ED_IS_SHORTCUT("spatial_editor/snap", p_event)) { if (_edit.mode != TRANSFORM_NONE) { _edit.snap = !_edit.snap; @@ -2315,6 +2016,18 @@ void Node3DEditorViewport::_sinput(const Ref<InputEvent> &p_event) { set_message(TTR("Animation Key Inserted.")); } + if (ED_IS_SHORTCUT("spatial_editor/cancel_transform", p_event) && _edit.mode != TRANSFORM_NONE) { + cancel_transform(); + } + if (ED_IS_SHORTCUT("spatial_editor/instant_translate", p_event)) { + begin_transform(TRANSFORM_TRANSLATE, true); + } + if (ED_IS_SHORTCUT("spatial_editor/instant_rotate", p_event)) { + begin_transform(TRANSFORM_ROTATE, true); + } + if (ED_IS_SHORTCUT("spatial_editor/instant_scale", p_event)) { + begin_transform(TRANSFORM_SCALE, true); + } // Freelook doesn't work in orthogonal mode. if (!orthogonal && ED_IS_SHORTCUT("spatial_editor/freelook_toggle", p_event)) { @@ -2946,28 +2659,28 @@ void Node3DEditorViewport::_notification(int p_what) { view_menu->set_icon(get_theme_icon(SNAME("GuiTabMenuHl"), SNAME("EditorIcons"))); preview_camera->set_icon(get_theme_icon(SNAME("Camera3D"), SNAME("EditorIcons"))); - view_menu->add_theme_style_override(SNAME("normal"), editor->get_gui_base()->get_theme_stylebox(SNAME("Information3dViewport"), SNAME("EditorStyles"))); - view_menu->add_theme_style_override(SNAME("hover"), editor->get_gui_base()->get_theme_stylebox(SNAME("Information3dViewport"), SNAME("EditorStyles"))); - view_menu->add_theme_style_override(SNAME("pressed"), editor->get_gui_base()->get_theme_stylebox(SNAME("Information3dViewport"), SNAME("EditorStyles"))); - view_menu->add_theme_style_override(SNAME("focus"), editor->get_gui_base()->get_theme_stylebox(SNAME("Information3dViewport"), SNAME("EditorStyles"))); - view_menu->add_theme_style_override(SNAME("disabled"), editor->get_gui_base()->get_theme_stylebox(SNAME("Information3dViewport"), SNAME("EditorStyles"))); + view_menu->add_theme_style_override("normal", editor->get_gui_base()->get_theme_stylebox(SNAME("Information3dViewport"), SNAME("EditorStyles"))); + view_menu->add_theme_style_override("hover", editor->get_gui_base()->get_theme_stylebox(SNAME("Information3dViewport"), SNAME("EditorStyles"))); + view_menu->add_theme_style_override("pressed", editor->get_gui_base()->get_theme_stylebox(SNAME("Information3dViewport"), SNAME("EditorStyles"))); + view_menu->add_theme_style_override("focus", editor->get_gui_base()->get_theme_stylebox(SNAME("Information3dViewport"), SNAME("EditorStyles"))); + view_menu->add_theme_style_override("disabled", editor->get_gui_base()->get_theme_stylebox(SNAME("Information3dViewport"), SNAME("EditorStyles"))); - preview_camera->add_theme_style_override(SNAME("normal"), editor->get_gui_base()->get_theme_stylebox(SNAME("Information3dViewport"), SNAME("EditorStyles"))); - preview_camera->add_theme_style_override(SNAME("hover"), editor->get_gui_base()->get_theme_stylebox(SNAME("Information3dViewport"), SNAME("EditorStyles"))); - preview_camera->add_theme_style_override(SNAME("pressed"), editor->get_gui_base()->get_theme_stylebox(SNAME("Information3dViewport"), SNAME("EditorStyles"))); - preview_camera->add_theme_style_override(SNAME("focus"), editor->get_gui_base()->get_theme_stylebox(SNAME("Information3dViewport"), SNAME("EditorStyles"))); - preview_camera->add_theme_style_override(SNAME("disabled"), editor->get_gui_base()->get_theme_stylebox(SNAME("Information3dViewport"), SNAME("EditorStyles"))); + preview_camera->add_theme_style_override("normal", editor->get_gui_base()->get_theme_stylebox(SNAME("Information3dViewport"), SNAME("EditorStyles"))); + preview_camera->add_theme_style_override("hover", editor->get_gui_base()->get_theme_stylebox(SNAME("Information3dViewport"), SNAME("EditorStyles"))); + preview_camera->add_theme_style_override("pressed", editor->get_gui_base()->get_theme_stylebox(SNAME("Information3dViewport"), SNAME("EditorStyles"))); + preview_camera->add_theme_style_override("focus", editor->get_gui_base()->get_theme_stylebox(SNAME("Information3dViewport"), SNAME("EditorStyles"))); + preview_camera->add_theme_style_override("disabled", editor->get_gui_base()->get_theme_stylebox(SNAME("Information3dViewport"), SNAME("EditorStyles"))); frame_time_gradient->set_color(0, get_theme_color(SNAME("success_color"), SNAME("Editor"))); frame_time_gradient->set_color(1, get_theme_color(SNAME("warning_color"), SNAME("Editor"))); frame_time_gradient->set_color(2, get_theme_color(SNAME("error_color"), SNAME("Editor"))); - info_label->add_theme_style_override(SNAME("normal"), editor->get_gui_base()->get_theme_stylebox(SNAME("Information3dViewport"), SNAME("EditorStyles"))); - cpu_time_label->add_theme_style_override(SNAME("normal"), editor->get_gui_base()->get_theme_stylebox(SNAME("Information3dViewport"), SNAME("EditorStyles"))); - gpu_time_label->add_theme_style_override(SNAME("normal"), editor->get_gui_base()->get_theme_stylebox(SNAME("Information3dViewport"), SNAME("EditorStyles"))); - fps_label->add_theme_style_override(SNAME("normal"), editor->get_gui_base()->get_theme_stylebox(SNAME("Information3dViewport"), SNAME("EditorStyles"))); - cinema_label->add_theme_style_override(SNAME("normal"), editor->get_gui_base()->get_theme_stylebox(SNAME("Information3dViewport"), SNAME("EditorStyles"))); - locked_label->add_theme_style_override(SNAME("normal"), editor->get_gui_base()->get_theme_stylebox(SNAME("Information3dViewport"), SNAME("EditorStyles"))); + info_label->add_theme_style_override("normal", editor->get_gui_base()->get_theme_stylebox(SNAME("Information3dViewport"), SNAME("EditorStyles"))); + cpu_time_label->add_theme_style_override("normal", editor->get_gui_base()->get_theme_stylebox(SNAME("Information3dViewport"), SNAME("EditorStyles"))); + gpu_time_label->add_theme_style_override("normal", editor->get_gui_base()->get_theme_stylebox(SNAME("Information3dViewport"), SNAME("EditorStyles"))); + fps_label->add_theme_style_override("normal", editor->get_gui_base()->get_theme_stylebox(SNAME("Information3dViewport"), SNAME("EditorStyles"))); + cinema_label->add_theme_style_override("normal", editor->get_gui_base()->get_theme_stylebox(SNAME("Information3dViewport"), SNAME("EditorStyles"))); + locked_label->add_theme_style_override("normal", editor->get_gui_base()->get_theme_stylebox(SNAME("Information3dViewport"), SNAME("EditorStyles"))); } } @@ -3036,7 +2749,7 @@ void Node3DEditorViewport::_draw() { font->draw_string(ci, msgpos, message, HORIZONTAL_ALIGNMENT_LEFT, -1, font_size, Color(1, 1, 1, 1)); } - if (_edit.mode == TRANSFORM_ROTATE) { + if (_edit.mode == TRANSFORM_ROTATE && _edit.show_rotation_line) { Point2 center = _point_to_screen(_edit.center); Color handle_color; @@ -3544,6 +3257,13 @@ void Node3DEditorViewport::_init_gizmo_instance(int p_idx) { RS::get_singleton()->instance_geometry_set_cast_shadows_setting(scale_plane_gizmo_instance[i], RS::SHADOW_CASTING_SETTING_OFF); RS::get_singleton()->instance_set_layer_mask(scale_plane_gizmo_instance[i], layer); RS::get_singleton()->instance_geometry_set_flag(scale_plane_gizmo_instance[i], RS::INSTANCE_FLAG_IGNORE_OCCLUSION_CULLING, true); + + axis_gizmo_instance[i] = RS::get_singleton()->instance_create(); + RS::get_singleton()->instance_set_base(axis_gizmo_instance[i], spatial_editor->get_axis_gizmo(i)->get_rid()); + RS::get_singleton()->instance_set_scenario(axis_gizmo_instance[i], get_tree()->get_root()->get_world_3d()->get_scenario()); + RS::get_singleton()->instance_set_visible(axis_gizmo_instance[i], true); + RS::get_singleton()->instance_geometry_set_cast_shadows_setting(axis_gizmo_instance[i], RS::SHADOW_CASTING_SETTING_OFF); + RS::get_singleton()->instance_set_layer_mask(axis_gizmo_instance[i], layer); } // Rotation white outline @@ -3563,6 +3283,7 @@ void Node3DEditorViewport::_finish_gizmo_instances() { RS::get_singleton()->free(rotate_gizmo_instance[i]); RS::get_singleton()->free(scale_gizmo_instance[i]); RS::get_singleton()->free(scale_plane_gizmo_instance[i]); + RS::get_singleton()->free(axis_gizmo_instance[i]); } // Rotation white outline RS::get_singleton()->free(rotate_gizmo_instance[3]); @@ -3646,7 +3367,7 @@ void Node3DEditorViewport::update_transform_gizmo_view() { Transform3D xform = spatial_editor->get_gizmo_transform(); - Transform3D camera_xform = camera->get_transform(); + const Transform3D camera_xform = camera->get_transform(); if (xform.origin.is_equal_approx(camera_xform.origin)) { for (int i = 0; i < 3; i++) { @@ -3655,6 +3376,7 @@ void Node3DEditorViewport::update_transform_gizmo_view() { RenderingServer::get_singleton()->instance_set_visible(rotate_gizmo_instance[i], false); RenderingServer::get_singleton()->instance_set_visible(scale_gizmo_instance[i], false); RenderingServer::get_singleton()->instance_set_visible(scale_plane_gizmo_instance[i], false); + RenderingServer::get_singleton()->instance_set_visible(axis_gizmo_instance[i], false); } // Rotation white outline RenderingServer::get_singleton()->instance_set_visible(rotate_gizmo_instance[3], false); @@ -3664,11 +3386,63 @@ void Node3DEditorViewport::update_transform_gizmo_view() { const Vector3 camz = -camera_xform.get_basis().get_axis(2).normalized(); const Vector3 camy = -camera_xform.get_basis().get_axis(1).normalized(); const Plane p = Plane(camz, camera_xform.origin); - const real_t gizmo_d = MAX(Math::abs(p.distance_to(xform.origin)), CMP_EPSILON); + const real_t gizmo_d = CLAMP(Math::abs(p.distance_to(xform.origin)), camera->get_near() * 2, camera->get_far() / 2); const real_t d0 = camera->unproject_position(camera_xform.origin + camz * gizmo_d).y; const real_t d1 = camera->unproject_position(camera_xform.origin + camz * gizmo_d + camy).y; const real_t dd = MAX(Math::abs(d0 - d1), CMP_EPSILON); + // This code ensures the gizmo stays on the screen. This includes if + // the gizmo would otherwise be behind the camera, to the sides of + // the camera, too close to the edge of the screen, too close to + // the camera, or too far away from the camera. First we calculate + // where the gizmo would go on screen, then we put it there. + const Vector3 object_position = spatial_editor->get_gizmo_target_center(); + Vector2 gizmo_screen_position = camera->unproject_position(object_position); + const Vector2 viewport_size = viewport->get_size(); + // We would use "camera.is_position_behind(parent_translation)" instead of dot, + // except that it also accounts for the near clip plane, which we don't want. + const bool is_in_front = camera_xform.basis.get_column(2).dot(object_position - camera_xform.origin) < 0; + const bool is_in_viewport = is_in_front && Rect2(Vector2(0, 0), viewport_size).has_point(gizmo_screen_position); + if (spatial_editor->is_keep_gizmo_onscreen_enabled()) { + if (!spatial_editor->is_gizmo_visible() || is_in_viewport) { + // In this case, the gizmo is either not visible, or in the viewport + // already, so we should hide the offscreen line. + gizmo_offscreen_line->hide(); + } else { + // In this case, the point is not "normally" on screen, and + // it should be placed in the center. + const Vector2 half_viewport_size = viewport_size / 2; + gizmo_screen_position = half_viewport_size; + // The rest of this is for drawing the offscreen line. + // One point goes in the center of the viewport. + // Calculate where to put the other point of the line. + Vector2 unprojected_position = camera->unproject_position(object_position); + if (!is_in_front) { + // When the object is behind, we need to flip and grow the line. + unprojected_position -= half_viewport_size; + unprojected_position = unprojected_position.normalized() * -half_viewport_size.length_squared(); + unprojected_position += half_viewport_size; + } + gizmo_offscreen_line->point1 = half_viewport_size; + gizmo_offscreen_line->point2 = unprojected_position; + gizmo_offscreen_line->update(); + gizmo_offscreen_line->show(); + } + // Update the gizmo's position using what we calculated. + xform.origin = camera->project_position(gizmo_screen_position, gizmo_d); + } else { + // In this case, the user does not want the gizmo to be + // kept on screen, so we should hide the offscreen line, + // and just use the gizmo's unmodified position. + gizmo_offscreen_line->hide(); + if (is_in_viewport) { + xform.origin = camera->project_position(gizmo_screen_position, gizmo_d); + } else { + xform.origin = object_position; + } + } + spatial_editor->set_gizmo_transform(xform); + const real_t gizmo_size = EditorSettings::get_singleton()->get("editors/3d/manipulator_gizmo_size"); // At low viewport heights, multiply the gizmo scale based on the viewport height. // This prevents the gizmo from growing very large and going outside the viewport. @@ -3677,7 +3451,6 @@ void Node3DEditorViewport::update_transform_gizmo_view() { (gizmo_size / Math::abs(dd)) * MAX(1, EDSCALE) * MIN(viewport_base_height, subviewport_container->get_size().height) / viewport_base_height / subviewport_container->get_stretch_shrink(); - Vector3 scale = Vector3(1, 1, 1) * gizmo_scale; // if the determinant is zero, we should disable the gizmo from being rendered // this prevents supplying bad values to the renderer and then having to filter it out again @@ -3699,7 +3472,7 @@ void Node3DEditorViewport::update_transform_gizmo_view() { if (xform.basis.get_axis(i).normalized().dot(xform.basis.get_axis((i + 1) % 3).normalized()) < 1.0) { axis_angle = axis_angle.looking_at(xform.basis.get_axis(i).normalized(), xform.basis.get_axis((i + 1) % 3).normalized()); } - axis_angle.basis.scale(scale); + axis_angle.basis *= gizmo_scale; axis_angle.origin = xform.origin; RenderingServer::get_singleton()->instance_set_transform(move_gizmo_instance[i], axis_angle); RenderingServer::get_singleton()->instance_set_visible(move_gizmo_instance[i], spatial_editor->is_gizmo_visible() && (spatial_editor->get_tool_mode() == Node3DEditor::TOOL_MODE_SELECT || spatial_editor->get_tool_mode() == Node3DEditor::TOOL_MODE_MOVE)); @@ -3711,10 +3484,18 @@ void Node3DEditorViewport::update_transform_gizmo_view() { RenderingServer::get_singleton()->instance_set_visible(scale_gizmo_instance[i], spatial_editor->is_gizmo_visible() && (spatial_editor->get_tool_mode() == Node3DEditor::TOOL_MODE_SCALE)); RenderingServer::get_singleton()->instance_set_transform(scale_plane_gizmo_instance[i], axis_angle); RenderingServer::get_singleton()->instance_set_visible(scale_plane_gizmo_instance[i], spatial_editor->is_gizmo_visible() && (spatial_editor->get_tool_mode() == Node3DEditor::TOOL_MODE_SCALE)); + RenderingServer::get_singleton()->instance_set_transform(axis_gizmo_instance[i], xform); } + + bool show_axes = spatial_editor->is_gizmo_visible() && _edit.mode != TRANSFORM_NONE; + RenderingServer *rs = RenderingServer::get_singleton(); + rs->instance_set_visible(axis_gizmo_instance[0], show_axes && (_edit.plane == TRANSFORM_X_AXIS || _edit.plane == TRANSFORM_XY || _edit.plane == TRANSFORM_XZ)); + rs->instance_set_visible(axis_gizmo_instance[1], show_axes && (_edit.plane == TRANSFORM_Y_AXIS || _edit.plane == TRANSFORM_XY || _edit.plane == TRANSFORM_YZ)); + rs->instance_set_visible(axis_gizmo_instance[2], show_axes && (_edit.plane == TRANSFORM_Z_AXIS || _edit.plane == TRANSFORM_XZ || _edit.plane == TRANSFORM_YZ)); + // Rotation white outline xform.orthonormalize(); - xform.basis.scale(scale); + xform.basis *= gizmo_scale; RenderingServer::get_singleton()->instance_set_transform(rotate_gizmo_instance[3], xform); RenderingServer::get_singleton()->instance_set_visible(rotate_gizmo_instance[3], spatial_editor->is_gizmo_visible() && (spatial_editor->get_tool_mode() == Node3DEditor::TOOL_MODE_SELECT || spatial_editor->get_tool_mode() == Node3DEditor::TOOL_MODE_ROTATE)); } @@ -3978,7 +3759,7 @@ AABB Node3DEditorViewport::_calculate_spatial_bounds(const Node3D *p_parent, boo if (child) { AABB child_bounds = _calculate_spatial_bounds(child, false); - if (bounds.size == Vector3() && p_parent->get_class_name() == StringName("Node3D")) { + if (bounds.size == Vector3() && Object::cast_to<Node3D>(p_parent)) { bounds = child_bounds; } else { bounds.merge_with(child_bounds); @@ -3986,7 +3767,7 @@ AABB Node3DEditorViewport::_calculate_spatial_bounds(const Node3D *p_parent, boo } } - if (bounds.size == Vector3() && p_parent->get_class_name() != StringName("Node3D")) { + if (bounds.size == Vector3() && !Object::cast_to<Node3D>(p_parent)) { bounds = AABB(Vector3(-0.2, -0.2, -0.2), Vector3(0.4, 0.4, 0.4)); } @@ -4213,25 +3994,19 @@ bool Node3DEditorViewport::can_drop_data_fw(const Point2 &p_point, const Variant ResourceLoader::get_recognized_extensions_for_type("Mesh", &mesh_extensions); for (int i = 0; i < files.size(); i++) { + // Check if dragged files with mesh or scene extension can be created at least once. if (mesh_extensions.find(files[i].get_extension()) || scene_extensions.find(files[i].get_extension())) { RES res = ResourceLoader::load(files[i]); if (res.is_null()) { continue; } - - String type = res->get_class(); - if (type == "PackedScene") { - Ref<PackedScene> sdata = ResourceLoader::load(files[i]); - Node *instantiated_scene = sdata->instantiate(PackedScene::GEN_EDIT_STATE_INSTANCE); + Ref<PackedScene> scn = res; + if (scn.is_valid()) { + Node *instantiated_scene = scn->instantiate(PackedScene::GEN_EDIT_STATE_INSTANCE); if (!instantiated_scene) { continue; } memdelete(instantiated_scene); - } else if (ClassDB::is_parent_class(type, "Mesh")) { - Ref<Mesh> mesh = ResourceLoader::load(files[i]); - if (!mesh.is_valid()) { - continue; - } } else { continue; } @@ -4299,6 +4074,387 @@ void Node3DEditorViewport::drop_data_fw(const Point2 &p_point, const Variant &p_ _perform_drop_data(); } +void Node3DEditorViewport::begin_transform(TransformMode p_mode, bool instant) { + if (get_selected_count() > 0) { + _edit.mode = p_mode; + _compute_edit(_edit.mouse_pos, false); + _edit.instant = instant; + _edit.snap = spatial_editor->is_snap_enabled(); + } +} + +void Node3DEditorViewport::commit_transform() { + ERR_FAIL_COND(_edit.mode == TRANSFORM_NONE); + static const char *_transform_name[4] = { + TTRC("None"), + TTRC("Rotate"), + // TRANSLATORS: This refers to the movement that changes the position of an object. + TTRC("Translate"), + TTRC("Scale"), + }; + undo_redo->create_action(_transform_name[_edit.mode]); + + List<Node *> &selection = editor_selection->get_selected_node_list(); + + for (List<Node *>::Element *E = selection.front(); E; E = E->next()) { + Node3D *sp = Object::cast_to<Node3D>(E->get()); + if (!sp) { + continue; + } + + Node3DEditorSelectedItem *se = editor_selection->get_node_editor_data<Node3DEditorSelectedItem>(sp); + if (!se) { + continue; + } + + undo_redo->add_do_method(sp, "set_global_transform", sp->get_global_gizmo_transform()); + undo_redo->add_undo_method(sp, "set_global_transform", se->original); + } + undo_redo->commit_action(); + _edit.mode = TRANSFORM_NONE; + _edit.instant = false; + spatial_editor->set_local_coords_enabled(_edit.original_local); + set_message(""); + spatial_editor->update_transform_gizmo(); + surface->update(); +} + +void Node3DEditorViewport::update_transform(Point2 p_mousepos, bool p_shift) { + Vector3 ray_pos = _get_ray_pos(p_mousepos); + Vector3 ray = _get_ray(p_mousepos); + double snap = EDITOR_GET("interface/inspector/default_float_step"); + int snap_step_decimals = Math::range_step_decimals(snap); + + switch (_edit.mode) { + case TRANSFORM_SCALE: { + Vector3 motion_mask; + Plane plane; + bool plane_mv = false; + + switch (_edit.plane) { + case TRANSFORM_VIEW: + motion_mask = Vector3(0, 0, 0); + plane = Plane(_get_camera_normal(), _edit.center); + break; + case TRANSFORM_X_AXIS: + motion_mask = spatial_editor->get_gizmo_transform().basis.get_axis(0).normalized(); + plane = Plane(motion_mask.cross(motion_mask.cross(_get_camera_normal())).normalized(), _edit.center); + break; + case TRANSFORM_Y_AXIS: + motion_mask = spatial_editor->get_gizmo_transform().basis.get_axis(1).normalized(); + plane = Plane(motion_mask.cross(motion_mask.cross(_get_camera_normal())).normalized(), _edit.center); + break; + case TRANSFORM_Z_AXIS: + motion_mask = spatial_editor->get_gizmo_transform().basis.get_axis(2).normalized(); + plane = Plane(motion_mask.cross(motion_mask.cross(_get_camera_normal())).normalized(), _edit.center); + break; + case TRANSFORM_YZ: + motion_mask = spatial_editor->get_gizmo_transform().basis.get_axis(2).normalized() + spatial_editor->get_gizmo_transform().basis.get_axis(1).normalized(); + plane = Plane(spatial_editor->get_gizmo_transform().basis.get_axis(0).normalized(), _edit.center); + plane_mv = true; + break; + case TRANSFORM_XZ: + motion_mask = spatial_editor->get_gizmo_transform().basis.get_axis(2).normalized() + spatial_editor->get_gizmo_transform().basis.get_axis(0).normalized(); + plane = Plane(spatial_editor->get_gizmo_transform().basis.get_axis(1).normalized(), _edit.center); + plane_mv = true; + break; + case TRANSFORM_XY: + motion_mask = spatial_editor->get_gizmo_transform().basis.get_axis(0).normalized() + spatial_editor->get_gizmo_transform().basis.get_axis(1).normalized(); + plane = Plane(spatial_editor->get_gizmo_transform().basis.get_axis(2).normalized(), _edit.center); + plane_mv = true; + break; + } + + Vector3 intersection; + if (!plane.intersects_ray(ray_pos, ray, &intersection)) { + break; + } + + Vector3 click; + if (!plane.intersects_ray(_edit.click_ray_pos, _edit.click_ray, &click)) { + break; + } + + Vector3 motion = intersection - click; + if (_edit.plane != TRANSFORM_VIEW) { + if (!plane_mv) { + motion = motion_mask.dot(motion) * motion_mask; + + } else { + // Alternative planar scaling mode + if (p_shift) { + motion = motion_mask.dot(motion) * motion_mask; + } + } + + } else { + const real_t center_click_dist = click.distance_to(_edit.center); + const real_t center_inters_dist = intersection.distance_to(_edit.center); + if (center_click_dist == 0) { + break; + } + + const real_t scale = center_inters_dist - center_click_dist; + motion = Vector3(scale, scale, scale); + } + + motion /= click.distance_to(_edit.center); + + // Disable local transformation for TRANSFORM_VIEW + bool local_coords = (spatial_editor->are_local_coords_enabled() && _edit.plane != TRANSFORM_VIEW); + + if (_edit.snap || spatial_editor->is_snap_enabled()) { + snap = spatial_editor->get_scale_snap() / 100; + } + Vector3 motion_snapped = motion; + motion_snapped.snap(Vector3(snap, snap, snap)); + // This might not be necessary anymore after issue #288 is solved (in 4.0?). + set_message(TTR("Scaling: ") + "(" + String::num(motion_snapped.x, snap_step_decimals) + ", " + + String::num(motion_snapped.y, snap_step_decimals) + ", " + String::num(motion_snapped.z, snap_step_decimals) + ")"); + motion = _edit.original.basis.inverse().xform(motion); + + List<Node *> &selection = editor_selection->get_selected_node_list(); + for (Node *E : selection) { + Node3D *sp = Object::cast_to<Node3D>(E); + if (!sp) { + continue; + } + + Node3DEditorSelectedItem *se = editor_selection->get_node_editor_data<Node3DEditorSelectedItem>(sp); + if (!se) { + continue; + } + + if (sp->has_meta("_edit_lock_")) { + continue; + } + + if (se->gizmo.is_valid()) { + for (KeyValue<int, Transform3D> &GE : se->subgizmos) { + Transform3D xform = GE.value; + Transform3D new_xform = _compute_transform(TRANSFORM_SCALE, se->original * xform, xform, motion, snap, local_coords, true); // Force orthogonal with subgizmo. + if (!local_coords) { + new_xform = se->original.affine_inverse() * new_xform; + } + se->gizmo->set_subgizmo_transform(GE.key, new_xform); + } + } else { + Transform3D new_xform = _compute_transform(TRANSFORM_SCALE, se->original, se->original_local, motion, snap, local_coords, sp->get_rotation_edit_mode() != Node3D::ROTATION_EDIT_MODE_BASIS); + _transform_gizmo_apply(se->sp, new_xform, local_coords); + } + } + + spatial_editor->update_transform_gizmo(); + surface->update(); + + } break; + + case TRANSFORM_TRANSLATE: { + Vector3 motion_mask; + Plane plane; + bool plane_mv = false; + + switch (_edit.plane) { + case TRANSFORM_VIEW: + plane = Plane(_get_camera_normal(), _edit.center); + break; + case TRANSFORM_X_AXIS: + motion_mask = spatial_editor->get_gizmo_transform().basis.get_axis(0).normalized(); + plane = Plane(motion_mask.cross(motion_mask.cross(_get_camera_normal())).normalized(), _edit.center); + break; + case TRANSFORM_Y_AXIS: + motion_mask = spatial_editor->get_gizmo_transform().basis.get_axis(1).normalized(); + plane = Plane(motion_mask.cross(motion_mask.cross(_get_camera_normal())).normalized(), _edit.center); + break; + case TRANSFORM_Z_AXIS: + motion_mask = spatial_editor->get_gizmo_transform().basis.get_axis(2).normalized(); + plane = Plane(motion_mask.cross(motion_mask.cross(_get_camera_normal())).normalized(), _edit.center); + break; + case TRANSFORM_YZ: + plane = Plane(spatial_editor->get_gizmo_transform().basis.get_axis(0).normalized(), _edit.center); + plane_mv = true; + break; + case TRANSFORM_XZ: + plane = Plane(spatial_editor->get_gizmo_transform().basis.get_axis(1).normalized(), _edit.center); + plane_mv = true; + break; + case TRANSFORM_XY: + plane = Plane(spatial_editor->get_gizmo_transform().basis.get_axis(2).normalized(), _edit.center); + plane_mv = true; + break; + } + + Vector3 intersection; + if (!plane.intersects_ray(ray_pos, ray, &intersection)) { + break; + } + + Vector3 click; + if (!plane.intersects_ray(_edit.click_ray_pos, _edit.click_ray, &click)) { + break; + } + + Vector3 motion = intersection - click; + if (_edit.plane != TRANSFORM_VIEW) { + if (!plane_mv) { + motion = motion_mask.dot(motion) * motion_mask; + } + } + + // Disable local transformation for TRANSFORM_VIEW + bool local_coords = (spatial_editor->are_local_coords_enabled() && _edit.plane != TRANSFORM_VIEW); + + if (_edit.snap || spatial_editor->is_snap_enabled()) { + snap = spatial_editor->get_translate_snap(); + } + Vector3 motion_snapped = motion; + motion_snapped.snap(Vector3(snap, snap, snap)); + set_message(TTR("Translating: ") + "(" + String::num(motion_snapped.x, snap_step_decimals) + ", " + + String::num(motion_snapped.y, snap_step_decimals) + ", " + String::num(motion_snapped.z, snap_step_decimals) + ")"); + motion = spatial_editor->get_gizmo_transform().basis.inverse().xform(motion); + + List<Node *> &selection = editor_selection->get_selected_node_list(); + for (Node *E : selection) { + Node3D *sp = Object::cast_to<Node3D>(E); + if (!sp) { + continue; + } + + Node3DEditorSelectedItem *se = editor_selection->get_node_editor_data<Node3DEditorSelectedItem>(sp); + if (!se) { + continue; + } + + if (sp->has_meta("_edit_lock_")) { + continue; + } + + if (se->gizmo.is_valid()) { + for (KeyValue<int, Transform3D> &GE : se->subgizmos) { + Transform3D xform = GE.value; + Transform3D new_xform = _compute_transform(TRANSFORM_TRANSLATE, se->original * xform, xform, motion, snap, local_coords, true); // Force orthogonal with subgizmo. + new_xform = se->original.affine_inverse() * new_xform; + se->gizmo->set_subgizmo_transform(GE.key, new_xform); + } + } else { + Transform3D new_xform = _compute_transform(TRANSFORM_TRANSLATE, se->original, se->original_local, motion, snap, local_coords, sp->get_rotation_edit_mode() != Node3D::ROTATION_EDIT_MODE_BASIS); + _transform_gizmo_apply(se->sp, new_xform, false); + } + } + + spatial_editor->update_transform_gizmo(); + surface->update(); + + } break; + + case TRANSFORM_ROTATE: { + Plane plane = Plane(_get_camera_normal(), _edit.center); + + Vector3 local_axis; + Vector3 global_axis; + switch (_edit.plane) { + case TRANSFORM_VIEW: + // local_axis unused + global_axis = _get_camera_normal(); + break; + case TRANSFORM_X_AXIS: + local_axis = Vector3(1, 0, 0); + break; + case TRANSFORM_Y_AXIS: + local_axis = Vector3(0, 1, 0); + break; + case TRANSFORM_Z_AXIS: + local_axis = Vector3(0, 0, 1); + break; + case TRANSFORM_YZ: + case TRANSFORM_XZ: + case TRANSFORM_XY: + break; + } + + if (_edit.plane != TRANSFORM_VIEW) { + global_axis = spatial_editor->get_gizmo_transform().basis.xform(local_axis).normalized(); + } + + Vector3 intersection; + if (!plane.intersects_ray(ray_pos, ray, &intersection)) { + break; + } + + Vector3 click; + if (!plane.intersects_ray(_edit.click_ray_pos, _edit.click_ray, &click)) { + break; + } + + static const float orthogonal_threshold = Math::cos(Math::deg2rad(87.0f)); + bool axis_is_orthogonal = ABS(plane.normal.dot(global_axis)) < orthogonal_threshold; + + double angle = 0.0f; + if (axis_is_orthogonal) { + _edit.show_rotation_line = false; + Vector3 projection_axis = plane.normal.cross(global_axis); + Vector3 delta = intersection - click; + float projection = delta.dot(projection_axis); + angle = (projection * (Math_PI / 2.0f)) / (gizmo_scale * GIZMO_CIRCLE_SIZE); + } else { + _edit.show_rotation_line = true; + Vector3 click_axis = (click - _edit.center).normalized(); + Vector3 current_axis = (intersection - _edit.center).normalized(); + angle = click_axis.signed_angle_to(current_axis, global_axis); + } + + if (_edit.snap || spatial_editor->is_snap_enabled()) { + snap = spatial_editor->get_rotate_snap(); + } + angle = Math::rad2deg(angle) + snap * 0.5; //else it won't reach +180 + angle -= Math::fmod(angle, snap); + set_message(vformat(TTR("Rotating %s degrees."), String::num(angle, snap_step_decimals))); + angle = Math::deg2rad(angle); + + bool local_coords = (spatial_editor->are_local_coords_enabled() && _edit.plane != TRANSFORM_VIEW); // Disable local transformation for TRANSFORM_VIEW + + List<Node *> &selection = editor_selection->get_selected_node_list(); + for (Node *E : selection) { + Node3D *sp = Object::cast_to<Node3D>(E); + if (!sp) { + continue; + } + + Node3DEditorSelectedItem *se = editor_selection->get_node_editor_data<Node3DEditorSelectedItem>(sp); + if (!se) { + continue; + } + + if (sp->has_meta("_edit_lock_")) { + continue; + } + + Vector3 compute_axis = local_coords ? local_axis : global_axis; + if (se->gizmo.is_valid()) { + for (KeyValue<int, Transform3D> &GE : se->subgizmos) { + Transform3D xform = GE.value; + + Transform3D new_xform = _compute_transform(TRANSFORM_ROTATE, se->original * xform, xform, compute_axis, angle, local_coords, true); // Force orthogonal with subgizmo. + if (!local_coords) { + new_xform = se->original.affine_inverse() * new_xform; + } + se->gizmo->set_subgizmo_transform(GE.key, new_xform); + } + } else { + Transform3D new_xform = _compute_transform(TRANSFORM_ROTATE, se->original, se->original_local, compute_axis, angle, local_coords, sp->get_rotation_edit_mode() != Node3D::ROTATION_EDIT_MODE_BASIS); + _transform_gizmo_apply(se->sp, new_xform, local_coords); + } + } + + spatial_editor->update_transform_gizmo(); + surface->update(); + + } break; + default: { + } + } +} + Node3DEditorViewport::Node3DEditorViewport(Node3DEditor *p_spatial_editor, EditorNode *p_editor, int p_index) { cpu_time_history_index = 0; gpu_time_history_index = 0; @@ -4306,6 +4462,8 @@ Node3DEditorViewport::Node3DEditorViewport(Node3DEditor *p_spatial_editor, Edito _edit.mode = TRANSFORM_NONE; _edit.plane = TRANSFORM_VIEW; _edit.snap = true; + _edit.show_rotation_line = true; + _edit.instant = false; _edit.gizmo_handle = -1; _edit.gizmo_handle_secondary = false; @@ -4322,15 +4480,14 @@ Node3DEditorViewport::Node3DEditorViewport(Node3DEditor *p_spatial_editor, Edito zoom_indicator_delay = 0.0; spatial_editor = p_spatial_editor; - SubViewportContainer *c = memnew(SubViewportContainer); - subviewport_container = c; - c->set_stretch(true); - add_child(c); - c->set_anchors_and_offsets_preset(Control::PRESET_WIDE); + subviewport_container = memnew(SubViewportContainer); + subviewport_container->set_stretch(true); + add_child(subviewport_container); + subviewport_container->set_anchors_and_offsets_preset(Control::PRESET_WIDE); viewport = memnew(SubViewport); viewport->set_disable_input(true); - c->add_child(viewport); + subviewport_container->add_child(viewport); surface = memnew(Control); surface->set_drag_forwarding(this); add_child(surface); @@ -4343,6 +4500,9 @@ Node3DEditorViewport::Node3DEditorViewport(Node3DEditor *p_spatial_editor, Edito camera->make_current(); surface->set_focus_mode(FOCUS_ALL); + gizmo_offscreen_line = memnew(GizmoOffScreenLine); + subviewport_container->add_child(gizmo_offscreen_line); + VBoxContainer *vbox = memnew(VBoxContainer); surface->add_child(vbox); vbox->set_offset(SIDE_LEFT, 10 * EDSCALE); @@ -4383,7 +4543,7 @@ Node3DEditorViewport::Node3DEditorViewport(Node3DEditor *p_spatial_editor, Edito display_submenu->add_radio_check_item(TTR("Normal Buffer"), VIEW_DISPLAY_NORMAL_BUFFER); display_submenu->add_separator(); display_submenu->add_radio_check_item(TTR("Shadow Atlas"), VIEW_DISPLAY_DEBUG_SHADOW_ATLAS); - display_submenu->add_radio_check_item(TTR("Directional Shadow"), VIEW_DISPLAY_DEBUG_DIRECTIONAL_SHADOW_ATLAS); + display_submenu->add_radio_check_item(TTR("Directional Shadow Map"), VIEW_DISPLAY_DEBUG_DIRECTIONAL_SHADOW_ATLAS); display_submenu->add_separator(); display_submenu->add_radio_check_item(TTR("Decal Atlas"), VIEW_DISPLAY_DEBUG_DECAL_ATLAS); display_submenu->add_separator(); @@ -4399,14 +4559,14 @@ Node3DEditorViewport::Node3DEditorViewport(Node3DEditor *p_spatial_editor, Edito display_submenu->add_radio_check_item(TTR("SSAO"), VIEW_DISPLAY_DEBUG_SSAO); display_submenu->add_radio_check_item(TTR("SSIL"), VIEW_DISPLAY_DEBUG_SSIL); display_submenu->add_separator(); - display_submenu->add_radio_check_item(TTR("GI Buffer"), VIEW_DISPLAY_DEBUG_GI_BUFFER); + display_submenu->add_radio_check_item(TTR("VoxelGI/SDFGI Buffer"), VIEW_DISPLAY_DEBUG_GI_BUFFER); display_submenu->add_separator(); - display_submenu->add_radio_check_item(TTR("Disable LOD"), VIEW_DISPLAY_DEBUG_DISABLE_LOD); + display_submenu->add_radio_check_item(TTR("Disable Mesh LOD"), VIEW_DISPLAY_DEBUG_DISABLE_LOD); display_submenu->add_separator(); - display_submenu->add_radio_check_item(TTR("Omni Light Cluster"), VIEW_DISPLAY_DEBUG_CLUSTER_OMNI_LIGHTS); - display_submenu->add_radio_check_item(TTR("Spot Light Cluster"), VIEW_DISPLAY_DEBUG_CLUSTER_SPOT_LIGHTS); + display_submenu->add_radio_check_item(TTR("OmniLight3D Cluster"), VIEW_DISPLAY_DEBUG_CLUSTER_OMNI_LIGHTS); + display_submenu->add_radio_check_item(TTR("SpotLight3D Cluster"), VIEW_DISPLAY_DEBUG_CLUSTER_SPOT_LIGHTS); display_submenu->add_radio_check_item(TTR("Decal Cluster"), VIEW_DISPLAY_DEBUG_CLUSTER_DECALS); - display_submenu->add_radio_check_item(TTR("Reflection Probe Cluster"), VIEW_DISPLAY_DEBUG_CLUSTER_REFLECTION_PROBES); + display_submenu->add_radio_check_item(TTR("ReflectionProbe Cluster"), VIEW_DISPLAY_DEBUG_CLUSTER_REFLECTION_PROBES); display_submenu->add_radio_check_item(TTR("Occlusion Culling Buffer"), VIEW_DISPLAY_DEBUG_OCCLUDERS); display_submenu->set_name("display_advanced"); @@ -4465,6 +4625,16 @@ Node3DEditorViewport::Node3DEditorViewport(Node3DEditor *p_spatial_editor, Edito ED_SHORTCUT("spatial_editor/freelook_down", TTR("Freelook Down"), Key::Q); ED_SHORTCUT("spatial_editor/freelook_speed_modifier", TTR("Freelook Speed Modifier"), Key::SHIFT); ED_SHORTCUT("spatial_editor/freelook_slow_modifier", TTR("Freelook Slow Modifier"), Key::ALT); + ED_SHORTCUT("spatial_editor/lock_transform_x", TTR("Lock Transformation to X axis"), Key::X); + ED_SHORTCUT("spatial_editor/lock_transform_y", TTR("Lock Transformation to Y axis"), Key::Y); + ED_SHORTCUT("spatial_editor/lock_transform_z", TTR("Lock Transformation to Z axis"), Key::Z); + ED_SHORTCUT("spatial_editor/lock_transform_yz", TTR("Lock Transformation to YZ plane"), KeyModifierMask::SHIFT | Key::X); + ED_SHORTCUT("spatial_editor/lock_transform_xz", TTR("Lock Transformation to XZ plane"), KeyModifierMask::SHIFT | Key::Y); + ED_SHORTCUT("spatial_editor/lock_transform_xy", TTR("Lock Transformation to XY plane"), KeyModifierMask::SHIFT | Key::Z); + ED_SHORTCUT("spatial_editor/cancel_transform", TTR("Cancel Transformation"), Key::ESCAPE); + ED_SHORTCUT("spatial_editor/instant_translate", TTR("Begin Translate Transformation")); + ED_SHORTCUT("spatial_editor/instant_rotate", TTR("Begin Rotate Transformation")); + ED_SHORTCUT("spatial_editor/instant_scale", TTR("Begin Scale Transformation")); preview_camera = memnew(CheckBox); preview_camera->set_text(TTR("Preview")); @@ -4512,7 +4682,7 @@ Node3DEditorViewport::Node3DEditorViewport(Node3DEditor *p_spatial_editor, Edito zoom_limit_label->set_offset(Side::SIDE_TOP, -28 * EDSCALE); zoom_limit_label->set_text(TTR("To zoom further, change the camera's clipping planes (View -> Settings...)")); zoom_limit_label->set_name("ZoomLimitMessageLabel"); - zoom_limit_label->add_theme_color_override(SNAME("font_color"), Color(1, 1, 1, 1)); + zoom_limit_label->add_theme_color_override("font_color", Color(1, 1, 1, 1)); zoom_limit_label->hide(); surface->add_child(zoom_limit_label); @@ -4526,7 +4696,7 @@ Node3DEditorViewport::Node3DEditorViewport(Node3DEditor *p_spatial_editor, Edito // Make sure frame time labels don't touch the viewport's edge. top_right_vbox->set_custom_minimum_size(Size2(100, 0) * EDSCALE); // Prevent visible spacing between frame time labels. - top_right_vbox->add_theme_constant_override(SNAME("separation"), 0); + top_right_vbox->add_theme_constant_override("separation", 0); rotation_control = memnew(ViewportRotationControl); rotation_control->set_custom_minimum_size(Size2(80, 80) * EDSCALE); @@ -4957,6 +5127,7 @@ void Node3DEditor::update_transform_gizmo() { gizmo.visible = count > 0; gizmo.transform.origin = (count > 0) ? gizmo_center / count : Vector3(); gizmo.transform.basis = (count == 1) ? gizmo_basis : Basis(); + gizmo.target_center = gizmo_center / count; for (uint32_t i = 0; i < VIEWPORTS_COUNT; i++) { viewports[i]->update_transform_gizmo_view(); @@ -5109,6 +5280,7 @@ Dictionary Node3DEditor::get_state() const { d["show_grid"] = view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_GRID)); d["show_origin"] = view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(MENU_VIEW_ORIGIN)); + d["keep_gizmo_onscreen"] = view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(MENU_KEEP_GIZMO_ONSCREEN)); d["fov"] = get_fov(); d["znear"] = get_znear(); d["zfar"] = get_zfar(); @@ -5233,6 +5405,13 @@ void Node3DEditor::set_state(const Dictionary &p_state) { RenderingServer::get_singleton()->instance_set_visible(origin_instance, use); } } + if (d.has("keep_gizmo_onscreen")) { + bool use = d["keep_gizmo_onscreen"]; + + if (use != view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(MENU_KEEP_GIZMO_ONSCREEN))) { + _menu_item_pressed(MENU_KEEP_GIZMO_ONSCREEN); + } + } if (d.has("gizmos_status")) { Dictionary gizmos_status = d["gizmos_status"]; @@ -5586,7 +5765,13 @@ void Node3DEditor::_menu_item_pressed(int p_option) { _init_grid(); view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(p_option), grid_enabled); - + } break; + case MENU_KEEP_GIZMO_ONSCREEN: { + keep_gizmo_onscreen = !view_menu->get_popup()->is_item_checked(view_menu->get_popup()->get_item_index(p_option)); + for (uint32_t i = 0; i < VIEWPORTS_COUNT; i++) { + get_editor_viewport(i)->update_transform_gizmo_view(); + } + view_menu->get_popup()->set_item_checked(view_menu->get_popup()->get_item_index(p_option), keep_gizmo_onscreen); } break; case MENU_VIEW_CAMERA_SETTINGS: { settings_dialog->popup_centered(settings_vbc->get_combined_minimum_size() + Size2(50, 50)); @@ -5854,6 +6039,7 @@ void fragment() { rotate_gizmo[i] = Ref<ArrayMesh>(memnew(ArrayMesh)); scale_gizmo[i] = Ref<ArrayMesh>(memnew(ArrayMesh)); scale_plane_gizmo[i] = Ref<ArrayMesh>(memnew(ArrayMesh)); + axis_gizmo[i] = Ref<ArrayMesh>(memnew(ArrayMesh)); Ref<StandardMaterial3D> mat = memnew(StandardMaterial3D); mat->set_shading_mode(StandardMaterial3D::SHADING_MODE_UNSHADED); @@ -6175,6 +6361,21 @@ void fragment() { plane_mat_hl->set_albedo(col.from_hsv(col.get_h(), 0.25, 1.0, 1)); plane_gizmo_color_hl[i] = plane_mat_hl; // needed, so we can draw planes from both sides } + + // Lines to visualize transforms locked to an axis/plane + { + Ref<SurfaceTool> surftool = memnew(SurfaceTool); + surftool->begin(Mesh::PRIMITIVE_LINES); + + Vector3 vec; + vec[i] = 1; + + // line extending through infinity(ish) + surftool->add_vertex(vec * -99999); + surftool->add_vertex(vec * 99999); + surftool->set_material(mat_hl); + surftool->commit(axis_gizmo[i]); + } } } @@ -6190,7 +6391,7 @@ void Node3DEditor::_update_context_menu_stylebox() { context_menu_stylebox->set_border_color(accent_color); context_menu_stylebox->set_border_width(SIDE_BOTTOM, Math::round(2 * EDSCALE)); context_menu_stylebox->set_default_margin(SIDE_BOTTOM, 0); - context_menu_container->add_theme_style_override(SNAME("panel"), context_menu_stylebox); + context_menu_container->add_theme_style_override("panel", context_menu_stylebox); } void Node3DEditor::_update_gizmos_menu() { @@ -6777,8 +6978,8 @@ void Node3DEditor::_update_theme() { environ_button->set_icon(get_theme_icon(SNAME("WorldEnvironment"), SNAME("EditorIcons"))); sun_environ_settings->set_icon(get_theme_icon(SNAME("GuiTabMenuHl"), SNAME("EditorIcons"))); - sun_title->add_theme_font_override(SNAME("font"), get_theme_font(SNAME("title_font"), SNAME("Window"))); - environ_title->add_theme_font_override(SNAME("font"), get_theme_font(SNAME("title_font"), SNAME("Window"))); + sun_title->add_theme_font_override("font", get_theme_font(SNAME("title_font"), SNAME("Window"))); + environ_title->add_theme_font_override("font", get_theme_font(SNAME("title_font"), SNAME("Window"))); } void Node3DEditor::_notification(int p_what) { @@ -6815,8 +7016,8 @@ void Node3DEditor::_notification(int p_what) { _update_theme(); _update_gizmos_menu_theme(); _update_context_menu_stylebox(); - sun_title->add_theme_font_override(SNAME("font"), get_theme_font(SNAME("title_font"), SNAME("Window"))); - environ_title->add_theme_font_override(SNAME("font"), get_theme_font(SNAME("title_font"), SNAME("Window"))); + sun_title->add_theme_font_override("font", get_theme_font(SNAME("title_font"), SNAME("Window"))); + environ_title->add_theme_font_override("font", get_theme_font(SNAME("title_font"), SNAME("Window"))); } break; case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: { // Update grid color by rebuilding grid. @@ -7555,12 +7756,14 @@ Node3DEditor::Node3DEditor(EditorNode *p_editor) { p->add_separator(); p->add_check_shortcut(ED_SHORTCUT("spatial_editor/view_origin", TTR("View Origin")), MENU_VIEW_ORIGIN); p->add_check_shortcut(ED_SHORTCUT("spatial_editor/view_grid", TTR("View Grid"), Key::NUMBERSIGN), MENU_VIEW_GRID); + p->add_check_shortcut(ED_SHORTCUT("spatial_editor/keep_gizmo_onscreen", TTR("Keep Gizmo On Screen"), KeyModifierMask::CMD + KeyModifierMask::ALT + Key::G), MENU_KEEP_GIZMO_ONSCREEN); p->add_separator(); p->add_shortcut(ED_SHORTCUT("spatial_editor/settings", TTR("Settings...")), MENU_VIEW_CAMERA_SETTINGS); p->set_item_checked(p->get_item_index(MENU_VIEW_ORIGIN), true); p->set_item_checked(p->get_item_index(MENU_VIEW_GRID), true); + p->set_item_checked(p->get_item_index(MENU_KEEP_GIZMO_ONSCREEN), true); p->connect("id_pressed", callable_mp(this, &Node3DEditor::_menu_item_pressed)); @@ -7806,7 +8009,7 @@ void fragment() { sun_angle_azimuth->connect("value_changed", callable_mp(this, &Node3DEditor::_sun_direction_angle_set).unbind(1)); sun_angle_azimuth_vbox->add_child(sun_angle_azimuth); sun_angle_hbox->add_child(sun_angle_azimuth_vbox); - sun_angle_hbox->add_theme_constant_override(SNAME("separation"), 10); + sun_angle_hbox->add_theme_constant_override("separation", 10); sun_vb->add_child(sun_angle_hbox); sun_color = memnew(ColorPickerButton); diff --git a/editor/plugins/node_3d_editor_plugin.h b/editor/plugins/node_3d_editor_plugin.h index 20a782c8a8..f14f8b90b9 100644 --- a/editor/plugins/node_3d_editor_plugin.h +++ b/editor/plugins/node_3d_editor_plugin.h @@ -87,6 +87,19 @@ public: void set_viewport(Node3DEditorViewport *p_viewport); }; +class GizmoOffScreenLine : public Control { + GDCLASS(GizmoOffScreenLine, Control); + +public: + Vector2 point1; + Vector2 point2; + void _notification(int p_what) { + if (p_what == NOTIFICATION_DRAW && is_visible()) { + draw_line(point1, point2, Color(0.0f, 0.75f, 0.75f), 2); + } + } +}; + class Node3DEditorViewport : public Control { GDCLASS(Node3DEditorViewport, Control); friend class Node3DEditor; @@ -201,6 +214,7 @@ private: CheckBox *preview_camera; SubViewportContainer *subviewport_container; + GizmoOffScreenLine *gizmo_offscreen_line; MenuButton *view_menu; PopupMenu *display_submenu; @@ -237,7 +251,7 @@ private: }; void _update_name(); - void _compute_edit(const Point2 &p_point); + void _compute_edit(const Point2 &p_point, const bool p_auto_center = true); void _clear_selected(); void _select_clicked(bool p_allow_locked); ObjectID _select_ray(const Point2 &p_pos); @@ -247,6 +261,7 @@ private: Point2 _point_to_screen(const Vector3 &p_point); Transform3D _get_camera_transform() const; int get_selected_count() const; + void cancel_transform(); Vector3 _get_camera_position() const; Vector3 _get_camera_normal() const; @@ -310,10 +325,13 @@ private: Point2 mouse_pos; Point2 original_mouse_pos; bool snap = false; + bool show_rotation_line = false; Ref<EditorNode3DGizmo> gizmo; int gizmo_handle = 0; bool gizmo_handle_secondary = false; Variant gizmo_initial_value; + bool original_local; + bool instant; } _edit; struct Cursor { @@ -347,7 +365,7 @@ private: real_t zoom_indicator_delay; int zoom_failed_attempts_count = 0; - RID move_gizmo_instance[3], move_plane_gizmo_instance[3], rotate_gizmo_instance[4], scale_gizmo_instance[3], scale_plane_gizmo_instance[3]; + RID move_gizmo_instance[3], move_plane_gizmo_instance[3], rotate_gizmo_instance[4], scale_gizmo_instance[3], scale_plane_gizmo_instance[3], axis_gizmo_instance[3]; String last_message; String message; @@ -402,6 +420,10 @@ private: Transform3D _compute_transform(TransformMode p_mode, const Transform3D &p_original, const Transform3D &p_original_local, Vector3 p_motion, double p_extra, bool p_local, bool p_orthogonal); + void begin_transform(TransformMode p_mode, bool instant); + void commit_transform(); + void update_transform(Point2 p_mousepos, bool p_shift); + protected: void _notification(int p_what); static void _bind_methods(); @@ -499,6 +521,35 @@ class Node3DEditor : public VBoxContainer { public: static const unsigned int VIEWPORTS_COUNT = 4; + enum MenuOption { + MENU_GROUP_SELECTED, + MENU_KEEP_GIZMO_ONSCREEN, + MENU_LOCK_SELECTED, + MENU_SNAP_TO_FLOOR, + MENU_TOOL_LIST_SELECT, + MENU_TOOL_LOCAL_COORDS, + MENU_TOOL_MOVE, + MENU_TOOL_OVERRIDE_CAMERA, + MENU_TOOL_ROTATE, + MENU_TOOL_SCALE, + MENU_TOOL_SELECT, + MENU_TOOL_USE_SNAP, + MENU_TRANSFORM_CONFIGURE_SNAP, + MENU_TRANSFORM_DIALOG, + MENU_UNGROUP_SELECTED, + MENU_UNLOCK_SELECTED, + MENU_VIEW_CAMERA_SETTINGS, + MENU_VIEW_GIZMOS_3D_ICONS, + MENU_VIEW_GRID, + MENU_VIEW_ORIGIN, + MENU_VIEW_USE_1_VIEWPORT, + MENU_VIEW_USE_2_VIEWPORTS, + MENU_VIEW_USE_2_VIEWPORTS_ALT, + MENU_VIEW_USE_3_VIEWPORTS, + MENU_VIEW_USE_3_VIEWPORTS_ALT, + MENU_VIEW_USE_4_VIEWPORTS, + }; + enum ToolMode { TOOL_MODE_SELECT, TOOL_MODE_MOVE, @@ -517,7 +568,6 @@ public: TOOL_OPT_USE_SNAP, TOOL_OPT_OVERRIDE_CAMERA, TOOL_OPT_MAX - }; private: @@ -546,7 +596,8 @@ private: Camera3D::Projection grid_camera_last_update_perspective = Camera3D::PROJECTION_PERSPECTIVE; Vector3 grid_camera_last_update_position = Vector3(); - Ref<ArrayMesh> move_gizmo[3], move_plane_gizmo[3], rotate_gizmo[4], scale_gizmo[3], scale_plane_gizmo[3]; + bool keep_gizmo_onscreen = true; + Ref<ArrayMesh> move_gizmo[3], move_plane_gizmo[3], rotate_gizmo[4], scale_gizmo[3], scale_plane_gizmo[3], axis_gizmo[3]; Ref<StandardMaterial3D> gizmo_color[3]; Ref<StandardMaterial3D> plane_gizmo_color[3]; Ref<ShaderMaterial> rotate_gizmo_color[3]; @@ -579,37 +630,10 @@ private: struct Gizmo { bool visible = false; real_t scale = 0; + Vector3 target_center; Transform3D transform; } gizmo; - enum MenuOption { - MENU_TOOL_SELECT, - MENU_TOOL_MOVE, - MENU_TOOL_ROTATE, - MENU_TOOL_SCALE, - MENU_TOOL_LIST_SELECT, - MENU_TOOL_LOCAL_COORDS, - MENU_TOOL_USE_SNAP, - MENU_TOOL_OVERRIDE_CAMERA, - MENU_TRANSFORM_CONFIGURE_SNAP, - MENU_TRANSFORM_DIALOG, - MENU_VIEW_USE_1_VIEWPORT, - MENU_VIEW_USE_2_VIEWPORTS, - MENU_VIEW_USE_2_VIEWPORTS_ALT, - MENU_VIEW_USE_3_VIEWPORTS, - MENU_VIEW_USE_3_VIEWPORTS_ALT, - MENU_VIEW_USE_4_VIEWPORTS, - MENU_VIEW_ORIGIN, - MENU_VIEW_GRID, - MENU_VIEW_GIZMOS_3D_ICONS, - MENU_VIEW_CAMERA_SETTINGS, - MENU_LOCK_SELECTED, - MENU_UNLOCK_SELECTED, - MENU_GROUP_SELECTED, - MENU_UNGROUP_SELECTED, - MENU_SNAP_TO_FLOOR - }; - Button *tool_button[TOOL_MAX]; Button *tool_option_button[TOOL_OPT_MAX]; @@ -768,17 +792,22 @@ public: float get_zfar() const { return settings_zfar->get_value(); } float get_fov() const { return settings_fov->get_value(); } + Vector3 get_gizmo_target_center() const { return gizmo.target_center; } Transform3D get_gizmo_transform() const { return gizmo.transform; } + void set_gizmo_transform(const Transform3D &p_transform) { gizmo.transform = p_transform; } + bool is_keep_gizmo_onscreen_enabled() const { return keep_gizmo_onscreen; } bool is_gizmo_visible() const; ToolMode get_tool_mode() const { return tool_mode; } bool are_local_coords_enabled() const { return tool_option_button[Node3DEditor::TOOL_OPT_LOCAL_COORDS]->is_pressed(); } + void set_local_coords_enabled(bool on) const { tool_option_button[Node3DEditor::TOOL_OPT_LOCAL_COORDS]->set_pressed(on); } bool is_snap_enabled() const { return snap_enabled ^ snap_key_enabled; } double get_translate_snap() const; double get_rotate_snap() const; double get_scale_snap() const; Ref<ArrayMesh> get_move_gizmo(int idx) const { return move_gizmo[idx]; } + Ref<ArrayMesh> get_axis_gizmo(int idx) const { return axis_gizmo[idx]; } Ref<ArrayMesh> get_move_plane_gizmo(int idx) const { return move_plane_gizmo[idx]; } Ref<ArrayMesh> get_rotate_gizmo(int idx) const { return rotate_gizmo[idx]; } Ref<ArrayMesh> get_scale_gizmo(int idx) const { return scale_gizmo[idx]; } diff --git a/editor/plugins/packed_scene_translation_parser_plugin.cpp b/editor/plugins/packed_scene_translation_parser_plugin.cpp index b492c27f41..9a8584f4a2 100644 --- a/editor/plugins/packed_scene_translation_parser_plugin.cpp +++ b/editor/plugins/packed_scene_translation_parser_plugin.cpp @@ -132,10 +132,7 @@ PackedSceneEditorTranslationParserPlugin::PackedSceneEditorTranslationParserPlug lookup_properties.insert("script"); // Exception list (to prevent false positives). - exception_list.insert("LineEdit", Vector<StringName>()); - exception_list["LineEdit"].append("text"); - exception_list.insert("TextEdit", Vector<StringName>()); - exception_list["TextEdit"].append("text"); - exception_list.insert("CodeEdit", Vector<StringName>()); - exception_list["CodeEdit"].append("text"); + exception_list.insert("LineEdit", { "text" }); + exception_list.insert("TextEdit", { "text" }); + exception_list.insert("CodeEdit", { "text" }); } diff --git a/editor/plugins/packed_scene_translation_parser_plugin.h b/editor/plugins/packed_scene_translation_parser_plugin.h index fc19496eb6..ecd090b31b 100644 --- a/editor/plugins/packed_scene_translation_parser_plugin.h +++ b/editor/plugins/packed_scene_translation_parser_plugin.h @@ -37,9 +37,9 @@ class PackedSceneEditorTranslationParserPlugin : public EditorTranslationParserP GDCLASS(PackedSceneEditorTranslationParserPlugin, EditorTranslationParserPlugin); // Scene Node's properties that contain translation strings. - Set<StringName> lookup_properties; + Set<String> lookup_properties; // Properties from specific Nodes that should be ignored. - Map<StringName, Vector<StringName>> exception_list; + Map<String, Vector<String>> exception_list; public: virtual Error parse_file(const String &p_path, Vector<String> *r_ids, Vector<Vector<String>> *r_ids_ctx_plural) override; diff --git a/editor/plugins/polygon_2d_editor_plugin.cpp b/editor/plugins/polygon_2d_editor_plugin.cpp index 6a7a98ff89..b116f8ff6d 100644 --- a/editor/plugins/polygon_2d_editor_plugin.cpp +++ b/editor/plugins/polygon_2d_editor_plugin.cpp @@ -92,8 +92,8 @@ void Polygon2DEditor::_notification(int p_what) { [[fallthrough]]; } case NOTIFICATION_THEME_CHANGED: { - uv_edit_draw->add_theme_style_override(SNAME("panel"), get_theme_stylebox(SNAME("bg"), SNAME("Tree"))); - bone_scroll->add_theme_style_override(SNAME("bg"), get_theme_stylebox(SNAME("bg"), SNAME("Tree"))); + uv_edit_draw->add_theme_style_override("panel", get_theme_stylebox(SNAME("bg"), SNAME("Tree"))); + bone_scroll->add_theme_style_override("bg", get_theme_stylebox(SNAME("bg"), SNAME("Tree"))); } break; case NOTIFICATION_VISIBILITY_CHANGED: { if (!is_visible()) { diff --git a/editor/plugins/replication_editor_plugin.cpp b/editor/plugins/replication_editor_plugin.cpp index 467db13246..fd4fc8f59c 100644 --- a/editor/plugins/replication_editor_plugin.cpp +++ b/editor/plugins/replication_editor_plugin.cpp @@ -95,7 +95,7 @@ void ReplicationEditor::_bind_methods() { void ReplicationEditor::_notification(int p_what) { if (p_what == NOTIFICATION_ENTER_TREE || p_what == EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED) { - add_theme_style_override(SNAME("panel"), editor->get_gui_base()->get_theme_stylebox(SNAME("panel"), SNAME("Panel"))); + add_theme_style_override("panel", editor->get_gui_base()->get_theme_stylebox(SNAME("panel"), SNAME("Panel"))); } else if (p_what == NOTIFICATION_VISIBILITY_CHANGED) { update_keying(); } @@ -257,10 +257,10 @@ void ReplicationEditor::edit(MultiplayerSynchronizer *p_sync) { } Ref<Texture2D> ReplicationEditor::_get_class_icon(const Node *p_node) { - if (!p_node || !has_theme_icon(p_node->get_class(), SNAME("EditorIcons"))) { + if (!p_node || !has_theme_icon(p_node->get_class(), "EditorIcons")) { return get_theme_icon(SNAME("ImportFail"), SNAME("EditorIcons")); } - return get_theme_icon(p_node->get_class(), SNAME("EditorIcons")); + return get_theme_icon(p_node->get_class(), "EditorIcons"); } void ReplicationEditor::_add_property(const NodePath &p_property, bool p_spawn, bool p_sync) { diff --git a/editor/plugins/resource_preloader_editor_plugin.cpp b/editor/plugins/resource_preloader_editor_plugin.cpp index 271d035986..786217a5c2 100644 --- a/editor/plugins/resource_preloader_editor_plugin.cpp +++ b/editor/plugins/resource_preloader_editor_plugin.cpp @@ -341,7 +341,7 @@ void ResourcePreloaderEditor::_bind_methods() { } ResourcePreloaderEditor::ResourcePreloaderEditor() { - //add_style_override(SNAME("panel"), EditorNode::get_singleton()->get_gui_base()->get_stylebox("panel","Panel")); + //add_style_override("panel", EditorNode::get_singleton()->get_gui_base()->get_stylebox("panel","Panel")); VBoxContainer *vbc = memnew(VBoxContainer); add_child(vbc); diff --git a/editor/plugins/script_editor_plugin.cpp b/editor/plugins/script_editor_plugin.cpp index b20f9650ac..17de3ba026 100644 --- a/editor/plugins/script_editor_plugin.cpp +++ b/editor/plugins/script_editor_plugin.cpp @@ -381,7 +381,7 @@ ScriptEditorQuickOpen::ScriptEditorQuickOpen() { search_options->connect("item_activated", callable_mp(this, &ScriptEditorQuickOpen::_confirmed)); search_options->set_hide_root(true); search_options->set_hide_folding(true); - search_options->add_theme_constant_override(SNAME("draw_guides"), 1); + search_options->add_theme_constant_override("draw_guides", 1); } ///////////////////////////////// @@ -1630,7 +1630,7 @@ void ScriptEditor::_notification(int p_what) { filter_scripts->set_right_icon(get_theme_icon(SNAME("Search"), SNAME("EditorIcons"))); filter_methods->set_right_icon(get_theme_icon(SNAME("Search"), SNAME("EditorIcons"))); - filename->add_theme_style_override(SNAME("normal"), editor->get_gui_base()->get_theme_stylebox(SNAME("normal"), SNAME("LineEdit"))); + filename->add_theme_style_override("normal", editor->get_gui_base()->get_theme_stylebox(SNAME("normal"), SNAME("LineEdit"))); recent_scripts->set_as_minsize(); @@ -2265,7 +2265,7 @@ bool ScriptEditor::edit(const RES &p_resource, int p_line, int p_col, bool p_gra if (use_external_editor && (EditorDebuggerNode::get_singleton()->get_dump_stack_script() != p_resource || EditorDebuggerNode::get_singleton()->get_debug_with_external_editor()) && p_resource->get_path().is_resource_file() && - p_resource->get_class_name() != StringName("VisualScript")) { + !Ref<VisualScript>(p_resource).is_valid()) { String path = EditorSettings::get_singleton()->get("text_editor/external/exec_path"); String flags = EditorSettings::get_singleton()->get("text_editor/external/exec_flags"); @@ -2364,7 +2364,7 @@ bool ScriptEditor::edit(const RES &p_resource, int p_line, int p_col, bool p_gra se->set_edited_resource(p_resource); - if (p_resource->get_class_name() != StringName("VisualScript")) { + if (!Ref<VisualScript>(p_resource).is_valid()) { bool highlighter_set = false; for (int i = 0; i < syntax_highlighters.size(); i++) { Ref<EditorSyntaxHighlighter> highlighter = syntax_highlighters[i]->_create(); @@ -3693,7 +3693,7 @@ ScriptEditor::ScriptEditor(EditorNode *p_editor) { filename = memnew(Label); filename->set_clip_text(true); filename->set_h_size_flags(SIZE_EXPAND_FILL); - filename->add_theme_style_override(SNAME("normal"), EditorNode::get_singleton()->get_gui_base()->get_theme_stylebox(SNAME("normal"), SNAME("LineEdit"))); + filename->add_theme_style_override("normal", EditorNode::get_singleton()->get_gui_base()->get_theme_stylebox(SNAME("normal"), SNAME("LineEdit"))); buttons_hbox->add_child(filename); members_overview_alphabeta_sort_button = memnew(Button); @@ -3948,8 +3948,8 @@ ScriptEditor::ScriptEditor(EditorNode *p_editor) { ScriptServer::edit_request_func = _open_script_request; - add_theme_style_override(SNAME("panel"), editor->get_gui_base()->get_theme_stylebox(SNAME("ScriptEditorPanel"), SNAME("EditorStyles"))); - tab_container->add_theme_style_override(SNAME("panel"), editor->get_gui_base()->get_theme_stylebox(SNAME("ScriptEditor"), SNAME("EditorStyles"))); + add_theme_style_override("panel", editor->get_gui_base()->get_theme_stylebox(SNAME("ScriptEditorPanel"), SNAME("EditorStyles"))); + tab_container->add_theme_style_override("panel", editor->get_gui_base()->get_theme_stylebox(SNAME("ScriptEditor"), SNAME("EditorStyles"))); } ScriptEditor::~ScriptEditor() { diff --git a/editor/plugins/script_text_editor.cpp b/editor/plugins/script_text_editor.cpp index a818caabbe..c3d61dfd58 100644 --- a/editor/plugins/script_text_editor.cpp +++ b/editor/plugins/script_text_editor.cpp @@ -930,21 +930,22 @@ void ScriptTextEditor::_update_connected_methods() { continue; } - if (methods_found.has(connection.callable.get_method())) { + const StringName method = connection.callable.get_method(); + if (methods_found.has(method)) { continue; } - if (!ClassDB::has_method(script->get_instance_base_type(), connection.callable.get_method())) { + if (!ClassDB::has_method(script->get_instance_base_type(), method)) { int line = -1; for (int j = 0; j < functions.size(); j++) { String name = functions[j].get_slice(":", 0); - if (name == connection.callable.get_method()) { + if (name == method) { line = functions[j].get_slice(":", 1).to_int() - 1; - text_edit->set_line_gutter_metadata(line, connection_gutter, connection.callable.get_method()); + text_edit->set_line_gutter_metadata(line, connection_gutter, method); text_edit->set_line_gutter_icon(line, connection_gutter, get_parent_control()->get_theme_icon(SNAME("Slot"), SNAME("EditorIcons"))); text_edit->set_line_gutter_clickable(line, connection_gutter, true); - methods_found.insert(connection.callable.get_method()); + methods_found.insert(method); break; } } @@ -957,7 +958,7 @@ void ScriptTextEditor::_update_connected_methods() { bool found_inherited_function = false; Ref<Script> inherited_script = script->get_base_script(); while (!inherited_script.is_null()) { - if (inherited_script->has_method(connection.callable.get_method())) { + if (inherited_script->has_method(method)) { found_inherited_function = true; break; } @@ -1373,7 +1374,7 @@ void ScriptTextEditor::reload(bool p_soft) { return; } scr->set_source_code(te->get_text()); - bool soft = p_soft || scr->get_instance_base_type() == "EditorPlugin"; //always soft-reload editor plugins + bool soft = p_soft || scr->get_instance_base_type() == "EditorPlugin"; // Always soft-reload editor plugins. scr->get_language()->reload_tool_script(scr, soft); } @@ -1848,7 +1849,7 @@ void ScriptTextEditor::_enable_code_editor() { ScriptTextEditor::ScriptTextEditor() { code_editor = memnew(CodeTextEditor); - code_editor->add_theme_constant_override(SNAME("separation"), 2); + code_editor->add_theme_constant_override("separation", 2); code_editor->set_anchors_and_offsets_preset(Control::PRESET_WIDE); code_editor->set_code_complete_func(_code_complete_scripts, this); code_editor->set_v_size_flags(SIZE_EXPAND_FILL); diff --git a/editor/plugins/shader_editor_plugin.cpp b/editor/plugins/shader_editor_plugin.cpp index 9aff507bdd..4bbeb33406 100644 --- a/editor/plugins/shader_editor_plugin.cpp +++ b/editor/plugins/shader_editor_plugin.cpp @@ -189,8 +189,8 @@ void ShaderTextEditor::_load_theme_settings() { if (warnings_panel) { // Warnings panel - warnings_panel->add_theme_font_override(SNAME("normal_font"), EditorNode::get_singleton()->get_gui_base()->get_theme_font(SNAME("main"), SNAME("EditorFonts"))); - warnings_panel->add_theme_font_size_override(SNAME("normal_font_size"), EditorNode::get_singleton()->get_gui_base()->get_theme_font_size(SNAME("main_size"), SNAME("EditorFonts"))); + warnings_panel->add_theme_font_override("normal_font", EditorNode::get_singleton()->get_gui_base()->get_theme_font(SNAME("main"), SNAME("EditorFonts"))); + warnings_panel->add_theme_font_size_override("normal_font_size", EditorNode::get_singleton()->get_gui_base()->get_theme_font_size(SNAME("main_size"), SNAME("EditorFonts"))); } } @@ -443,7 +443,7 @@ void ShaderEditor::_notification(int p_what) { void ShaderEditor::_editor_settings_changed() { shader_editor->update_editor_settings(); - shader_editor->get_text_editor()->add_theme_constant_override(SNAME("line_spacing"), EditorSettings::get_singleton()->get("text_editor/appearance/whitespace/line_spacing")); + shader_editor->get_text_editor()->add_theme_constant_override("line_spacing", EditorSettings::get_singleton()->get("text_editor/appearance/whitespace/line_spacing")); shader_editor->get_text_editor()->set_draw_breakpoints_gutter(false); shader_editor->get_text_editor()->set_draw_executing_lines_gutter(false); } @@ -701,7 +701,7 @@ ShaderEditor::ShaderEditor(EditorNode *p_node) { shader_editor = memnew(ShaderTextEditor); shader_editor->set_v_size_flags(SIZE_EXPAND_FILL); - shader_editor->add_theme_constant_override(SNAME("separation"), 0); + shader_editor->add_theme_constant_override("separation", 0); shader_editor->set_anchors_and_offsets_preset(Control::PRESET_WIDE); shader_editor->connect("show_warnings_panel", callable_mp(this, &ShaderEditor::_show_warnings_panel)); @@ -789,7 +789,7 @@ ShaderEditor::ShaderEditor(EditorNode *p_node) { hbc->add_child(edit_menu); hbc->add_child(goto_menu); hbc->add_child(help_menu); - hbc->add_theme_style_override(SNAME("panel"), p_node->get_gui_base()->get_theme_stylebox(SNAME("ScriptEditorPanel"), SNAME("EditorStyles"))); + hbc->add_theme_style_override("panel", p_node->get_gui_base()->get_theme_stylebox(SNAME("ScriptEditorPanel"), SNAME("EditorStyles"))); VSplitContainer *editor_box = memnew(VSplitContainer); main_container->add_child(editor_box); diff --git a/editor/plugins/skeleton_3d_editor_plugin.cpp b/editor/plugins/skeleton_3d_editor_plugin.cpp index 9e2ded3ec9..ac77f51812 100644 --- a/editor/plugins/skeleton_3d_editor_plugin.cpp +++ b/editor/plugins/skeleton_3d_editor_plugin.cpp @@ -602,7 +602,7 @@ void Skeleton3DEditor::update_editors() { void Skeleton3DEditor::create_editors() { set_h_size_flags(SIZE_EXPAND_FILL); - add_theme_constant_override(SNAME("separation"), 0); + add_theme_constant_override("separation", 0); set_focus_mode(FOCUS_ALL); diff --git a/editor/plugins/sprite_frames_editor_plugin.cpp b/editor/plugins/sprite_frames_editor_plugin.cpp index e504756440..419076a3f6 100644 --- a/editor/plugins/sprite_frames_editor_plugin.cpp +++ b/editor/plugins/sprite_frames_editor_plugin.cpp @@ -328,10 +328,10 @@ void SpriteFramesEditor::_notification(int p_what) { [[fallthrough]]; } case NOTIFICATION_THEME_CHANGED: { - split_sheet_scroll->add_theme_style_override(SNAME("bg"), get_theme_stylebox(SNAME("bg"), SNAME("Tree"))); + split_sheet_scroll->add_theme_style_override("bg", get_theme_stylebox(SNAME("bg"), SNAME("Tree"))); } break; case NOTIFICATION_READY: { - add_theme_constant_override(SNAME("autohide"), 1); // Fixes the dragger always showing up. + add_theme_constant_override("autohide", 1); // Fixes the dragger always showing up. } break; } } @@ -1247,8 +1247,8 @@ SpriteFramesEditor::SpriteFramesEditor() { split_sheet_panel->add_child(split_sheet_zoom_margin); split_sheet_zoom_margin->set_h_size_flags(0); split_sheet_zoom_margin->set_v_size_flags(0); - split_sheet_zoom_margin->add_theme_constant_override(SNAME("margin_top"), 5); - split_sheet_zoom_margin->add_theme_constant_override(SNAME("margin_left"), 5); + split_sheet_zoom_margin->add_theme_constant_override("margin_top", 5); + split_sheet_zoom_margin->add_theme_constant_override("margin_left", 5); HBoxContainer *split_sheet_zoom_hb = memnew(HBoxContainer); split_sheet_zoom_margin->add_child(split_sheet_zoom_hb); diff --git a/editor/plugins/style_box_editor_plugin.cpp b/editor/plugins/style_box_editor_plugin.cpp index 8ec5ffc0a3..5d38352b22 100644 --- a/editor/plugins/style_box_editor_plugin.cpp +++ b/editor/plugins/style_box_editor_plugin.cpp @@ -50,7 +50,7 @@ void StyleBoxPreview::edit(const Ref<StyleBox> &p_stylebox) { } stylebox = p_stylebox; if (p_stylebox.is_valid()) { - preview->add_theme_style_override(SNAME("panel"), stylebox); + preview->add_theme_style_override("panel", stylebox); stylebox->connect("changed", callable_mp(this, &StyleBoxPreview::_sb_changed)); } _sb_changed(); diff --git a/editor/plugins/text_control_editor_plugin.cpp b/editor/plugins/text_control_editor_plugin.cpp index 59796179a6..4ce94176e5 100644 --- a/editor/plugins/text_control_editor_plugin.cpp +++ b/editor/plugins/text_control_editor_plugin.cpp @@ -110,7 +110,7 @@ void TextControlEditor::_update_styles_menu() { for (Map<String, String>::Element *E = fonts[name].front(); E; E = E->next()) { font_style_list->add_item(E->key()); } - } else { + } else if (font_list->get_selected() >= 0) { font_style_list->add_item("Default"); } @@ -123,9 +123,9 @@ void TextControlEditor::_update_styles_menu() { void TextControlEditor::_update_control() { if (!edited_controls.is_empty()) { - int font_selected = 0; + String font_selected; bool same_font = true; - int style_selected = 0; + String style_selected; bool same_style = true; int font_size = 0; bool same_font_size = true; @@ -136,26 +136,23 @@ void TextControlEditor::_update_control() { Color outline_color = Color{ 1.0f, 1.0f, 1.0f }; bool same_outline_color = true; - _update_fonts_menu(); - _update_styles_menu(); - int count = edited_controls.size(); for (int i = 0; i < count; ++i) { Control *edited_control = edited_controls[i]; - String edited_color; - String edited_font; - String edited_font_size; + StringName edited_color; + StringName edited_font; + StringName edited_font_size; // Get override names. - if (edited_control->is_class("RichTextLabel")) { - edited_color = "default_color"; - edited_font = "normal_font"; - edited_font_size = "normal_font_size"; + if (Object::cast_to<RichTextLabel>(edited_control)) { + edited_color = SNAME("default_color"); + edited_font = SNAME("normal_font"); + edited_font_size = SNAME("normal_font_size"); } else { - edited_color = "font_color"; - edited_font = "font"; - edited_font_size = "font_size"; + edited_color = SNAME("font_color"); + edited_font = SNAME("font"); + edited_font_size = SNAME("font_size"); } // Get font override. @@ -166,57 +163,40 @@ void TextControlEditor::_update_control() { if (font.is_valid()) { if (font->get_data_count() != 1) { - custom_font = font; if (i > 0) { - same_font = same_font && (font_selected == FONT_INFO_USER_CUSTOM); - same_style = same_style && (style_selected == 0); + same_font = same_font && (custom_font == font); } + custom_font = font; - font_selected = FONT_INFO_USER_CUSTOM; - style_selected = 0; + font_selected = TTR("[Custom Font]"); + same_style = false; } else { String name = font->get_data(0)->get_font_name(); String style = font->get_data(0)->get_font_style_name(); if (fonts.has(name) && fonts[name].has(style)) { - for (int j = 0; j < font_list->get_item_count(); j++) { - if (font_list->get_item_text(j) == name) { - if (i > 0) { - same_font = same_font && (j == font_selected); - } - - font_selected = j; - break; - } - } - for (int j = 0; j < font_style_list->get_item_count(); j++) { - if (font_style_list->get_item_text(j) == style) { - if (i > 0) { - same_style = same_style && (j == style_selected); - } - - style_selected = j; - break; - } + if (i > 0) { + same_font = same_font && (name == font_selected); + same_style = same_style && (style == style_selected); } + font_selected = name; + style_selected = style; } else { - custom_font = font; if (i > 0) { - same_font = same_font && (font_selected == FONT_INFO_USER_CUSTOM); - same_style = same_style && (style_selected == 0); + same_font = same_font && (custom_font == font); } + custom_font = font; - font_selected = FONT_INFO_USER_CUSTOM; - style_selected = 0; + font_selected = TTR("[Custom Font]"); + same_style = false; } } } else { if (i > 0) { - same_font = same_font && (font_selected == FONT_INFO_THEME_DEFAULT); - same_style = same_style && (style_selected == 0); + same_font = same_font && (font_selected == TTR("[Theme Default]")); } - font_selected = FONT_INFO_THEME_DEFAULT; - style_selected = 0; + font_selected = TTR("[Theme Default]"); + same_style = false; } int current_font_size = edited_control->get_theme_font_size(edited_font_size); @@ -235,19 +215,29 @@ void TextControlEditor::_update_control() { font_color = current_font_color; outline_color = current_outline_color; } - _update_fonts_menu(); if (same_font) { - font_list->select(font_selected); + for (int j = 0; j < font_list->get_item_count(); j++) { + if (font_list->get_item_text(j) == font_selected) { + font_list->select(j); + break; + } + } } else { + custom_font = Ref<Font>(); font_list->select(-1); } _update_styles_menu(); if (same_style) { - font_style_list->select(style_selected); + for (int j = 0; j < font_style_list->get_item_count(); j++) { + if (font_style_list->get_item_text(j) == style_selected) { + font_style_list->select(j); + break; + } + } } else { - font_list->select(-1); + font_style_list->select(-1); } // Get other theme overrides. @@ -282,6 +272,7 @@ void TextControlEditor::_update_control() { } void TextControlEditor::_font_selected(int p_id) { + _update_styles_menu(); _set_font(); } @@ -301,11 +292,11 @@ void TextControlEditor::_set_font() { for (int i = 0; i < count; ++i) { Control *edited_control = edited_controls[i]; - String edited_font; - if (edited_control->is_class("RichTextLabel")) { - edited_font = "normal_font"; + StringName edited_font; + if (Object::cast_to<RichTextLabel>(edited_control)) { + edited_font = SNAME("normal_font"); } else { - edited_font = "font"; + edited_font = SNAME("font"); } if (font_list->get_selected_id() == FONT_INFO_THEME_DEFAULT) { @@ -314,14 +305,13 @@ void TextControlEditor::_set_font() { } else if (font_list->get_selected_id() == FONT_INFO_USER_CUSTOM) { // Restore "custom_font". ur->add_do_method(edited_control, "add_theme_font_override", edited_font, custom_font); - } else { + } else if (font_list->get_selected() >= 0) { // Load new font resource using selected name and style. String name = font_list->get_item_text(font_list->get_selected()); String style = font_style_list->get_item_text(font_style_list->get_selected()); if (style.is_empty()) { style = "Default"; } - if (fonts.has(name)) { Ref<FontData> fd = ResourceLoader::load(fonts[name][style]); if (fd.is_valid()) { @@ -358,11 +348,11 @@ void TextControlEditor::_font_size_selected(double p_size) { for (int i = 0; i < count; ++i) { Control *edited_control = edited_controls[i]; - String edited_font_size; - if (edited_control->is_class("RichTextLabel")) { - edited_font_size = "normal_font_size"; + StringName edited_font_size; + if (Object::cast_to<RichTextLabel>(edited_control)) { + edited_font_size = SNAME("normal_font_size"); } else { - edited_font_size = "font_size"; + edited_font_size = SNAME("font_size"); } ur->add_do_method(edited_control, "add_theme_font_size_override", edited_font_size, p_size); @@ -392,7 +382,7 @@ void TextControlEditor::_outline_size_selected(double p_size) { Control *edited_control = edited_controls[i]; ur->add_do_method(edited_control, "add_theme_constant_override", "outline_size", p_size); - if (edited_control->has_theme_constant_override(SNAME("outline_size"))) { + if (edited_control->has_theme_constant_override("outline_size")) { ur->add_undo_method(edited_control, "add_theme_constant_override", "outline_size", edited_control->get_theme_constant(SNAME("outline_size"))); } else { ur->add_undo_method(edited_control, "remove_theme_constant_override", "outline_size"); @@ -417,11 +407,11 @@ void TextControlEditor::_font_color_changed(const Color &p_color) { for (int i = 0; i < count; ++i) { Control *edited_control = edited_controls[i]; - String edited_color; - if (edited_control->is_class("RichTextLabel")) { - edited_color = "default_color"; + StringName edited_color; + if (Object::cast_to<RichTextLabel>(edited_control)) { + edited_color = SNAME("default_color"); } else { - edited_color = "font_color"; + edited_color = SNAME("font_color"); } ur->add_do_method(edited_control, "add_theme_color_override", edited_color, p_color); @@ -451,7 +441,7 @@ void TextControlEditor::_outline_color_changed(const Color &p_color) { Control *edited_control = edited_controls[i]; ur->add_do_method(edited_control, "add_theme_color_override", "font_outline_color", p_color); - if (edited_control->has_theme_color_override(SNAME("font_outline_color"))) { + if (edited_control->has_theme_color_override("font_outline_color")) { ur->add_undo_method(edited_control, "add_theme_color_override", "font_outline_color", edited_control->get_theme_color(SNAME("font_outline_color"))); } else { ur->add_undo_method(edited_control, "remove_theme_color_override", "font_outline_color"); @@ -476,19 +466,19 @@ void TextControlEditor::_clear_formatting() { for (int i = 0; i < count; ++i) { Control *edited_control = edited_controls[i]; - String edited_color; - String edited_font; - String edited_font_size; + StringName edited_color; + StringName edited_font; + StringName edited_font_size; // Get override names. - if (edited_control->is_class("RichTextLabel")) { - edited_color = "default_color"; - edited_font = "normal_font"; - edited_font_size = "normal_font_size"; + if (Object::cast_to<RichTextLabel>(edited_control)) { + edited_color = SNAME("default_color"); + edited_font = SNAME("normal_font"); + edited_font_size = SNAME("normal_font_size"); } else { - edited_color = "font_color"; - edited_font = "font"; - edited_font_size = "font_size"; + edited_color = SNAME("font_color"); + edited_font = SNAME("font"); + edited_font_size = SNAME("font_size"); } ur->add_do_method(edited_control, "begin_bulk_theme_override"); @@ -510,12 +500,12 @@ void TextControlEditor::_clear_formatting() { } ur->add_do_method(edited_control, "remove_theme_color_override", "font_outline_color"); - if (edited_control->has_theme_color_override(SNAME("font_outline_color"))) { + if (edited_control->has_theme_color_override("font_outline_color")) { ur->add_undo_method(edited_control, "add_theme_color_override", "font_outline_color", edited_control->get_theme_color(SNAME("font_outline_color"))); } ur->add_do_method(edited_control, "remove_theme_constant_override", "outline_size"); - if (edited_control->has_theme_constant_override(SNAME("outline_size"))) { + if (edited_control->has_theme_constant_override("outline_size")) { ur->add_undo_method(edited_control, "add_theme_constant_override", "outline_size", edited_control->get_theme_constant(SNAME("outline_size"))); } @@ -600,7 +590,7 @@ TextControlEditor::TextControlEditor() { font_size_list = memnew(SpinBox); font_size_list->set_tooltip(TTR("Font Size")); - font_size_list->get_line_edit()->add_theme_constant_override(SNAME("minimum_character_width"), 2); + font_size_list->get_line_edit()->add_theme_constant_override("minimum_character_width", 2); font_size_list->set_min(6); font_size_list->set_step(1); font_size_list->set_max(96); @@ -619,7 +609,7 @@ TextControlEditor::TextControlEditor() { outline_size_list = memnew(SpinBox); outline_size_list->set_tooltip(TTR("Outline Size")); - outline_size_list->get_line_edit()->add_theme_constant_override(SNAME("minimum_character_width"), 2); + outline_size_list->get_line_edit()->add_theme_constant_override("minimum_character_width", 2); outline_size_list->set_min(0); outline_size_list->set_step(1); outline_size_list->set_max(96); diff --git a/editor/plugins/text_editor.cpp b/editor/plugins/text_editor.cpp index 54cfff66c5..940f269803 100644 --- a/editor/plugins/text_editor.cpp +++ b/editor/plugins/text_editor.cpp @@ -521,7 +521,7 @@ void TextEditor::update_toggle_scripts_button() { TextEditor::TextEditor() { code_editor = memnew(CodeTextEditor); add_child(code_editor); - code_editor->add_theme_constant_override(SNAME("separation"), 0); + code_editor->add_theme_constant_override("separation", 0); code_editor->connect("load_theme_settings", callable_mp(this, &TextEditor::_load_theme_settings)); code_editor->connect("validate_script", callable_mp(this, &TextEditor::_validate_script)); code_editor->set_anchors_and_offsets_preset(Control::PRESET_WIDE); diff --git a/editor/plugins/texture_3d_editor_plugin.cpp b/editor/plugins/texture_3d_editor_plugin.cpp index 6792d8b329..6080f9df87 100644 --- a/editor/plugins/texture_3d_editor_plugin.cpp +++ b/editor/plugins/texture_3d_editor_plugin.cpp @@ -171,11 +171,11 @@ Texture3DEditor::Texture3DEditor() { info->set_anchor(SIDE_TOP, 1); info->set_h_grow_direction(GROW_DIRECTION_BEGIN); info->set_v_grow_direction(GROW_DIRECTION_BEGIN); - info->add_theme_color_override(SNAME("font_color"), Color(1, 1, 1, 1)); - info->add_theme_color_override(SNAME("font_shadow_color"), Color(0, 0, 0, 0.5)); - info->add_theme_constant_override(SNAME("shadow_outline_size"), 1); - info->add_theme_constant_override(SNAME("shadow_offset_x"), 2); - info->add_theme_constant_override(SNAME("shadow_offset_y"), 2); + info->add_theme_color_override("font_color", Color(1, 1, 1, 1)); + info->add_theme_color_override("font_shadow_color", Color(0, 0, 0, 0.5)); + info->add_theme_constant_override("shadow_outline_size", 1); + info->add_theme_constant_override("shadow_offset_x", 2); + info->add_theme_constant_override("shadow_offset_y", 2); setting = false; layer->connect("value_changed", Callable(this, "_layer_changed")); diff --git a/editor/plugins/texture_editor_plugin.cpp b/editor/plugins/texture_editor_plugin.cpp index 85b5cde066..84b33f0986 100644 --- a/editor/plugins/texture_editor_plugin.cpp +++ b/editor/plugins/texture_editor_plugin.cpp @@ -50,7 +50,7 @@ void TexturePreview::_notification(int p_what) { if (metadata_label) { Ref<Font> metadata_label_font = get_theme_font(SNAME("expression"), SNAME("EditorFonts")); - metadata_label->add_theme_font_override(SNAME("font"), metadata_label_font); + metadata_label->add_theme_font_override("font", metadata_label_font); } checkerboard->set_texture(get_theme_icon(SNAME("Checkerboard"), SNAME("EditorIcons"))); @@ -94,14 +94,14 @@ TexturePreview::TexturePreview(Ref<Texture2D> p_texture, bool p_show_metadata) { p_texture->connect("changed", callable_mp(this, &TexturePreview::_update_metadata_label_text)); // It's okay that these colors are static since the grid color is static too. - metadata_label->add_theme_color_override(SNAME("font_color"), Color::named("white")); - metadata_label->add_theme_color_override(SNAME("font_color_shadow"), Color::named("black")); + metadata_label->add_theme_color_override("font_color", Color::named("white")); + metadata_label->add_theme_color_override("font_color_shadow", Color::named("black")); - metadata_label->add_theme_font_size_override(SNAME("font_size"), 16 * EDSCALE); - metadata_label->add_theme_color_override(SNAME("font_outline_color"), Color::named("black")); - metadata_label->add_theme_constant_override(SNAME("outline_size"), 2 * EDSCALE); + metadata_label->add_theme_font_size_override("font_size", 16 * EDSCALE); + metadata_label->add_theme_color_override("font_outline_color", Color::named("black")); + metadata_label->add_theme_constant_override("outline_size", 2 * EDSCALE); - metadata_label->add_theme_constant_override(SNAME("shadow_outline_size"), 1); + metadata_label->add_theme_constant_override("shadow_outline_size", 1); metadata_label->set_h_size_flags(Control::SIZE_SHRINK_END); metadata_label->set_v_size_flags(Control::SIZE_SHRINK_END); diff --git a/editor/plugins/texture_layered_editor_plugin.cpp b/editor/plugins/texture_layered_editor_plugin.cpp index 83bc51b8d1..a8c37d37fe 100644 --- a/editor/plugins/texture_layered_editor_plugin.cpp +++ b/editor/plugins/texture_layered_editor_plugin.cpp @@ -247,11 +247,11 @@ TextureLayeredEditor::TextureLayeredEditor() { info->set_anchor(SIDE_TOP, 1); info->set_h_grow_direction(GROW_DIRECTION_BEGIN); info->set_v_grow_direction(GROW_DIRECTION_BEGIN); - info->add_theme_color_override(SNAME("font_color"), Color(1, 1, 1, 1)); - info->add_theme_color_override(SNAME("font_shadow_color"), Color(0, 0, 0, 0.5)); - info->add_theme_constant_override(SNAME("shadow_outline_size"), 1); - info->add_theme_constant_override(SNAME("shadow_offset_x"), 2); - info->add_theme_constant_override(SNAME("shadow_offset_y"), 2); + info->add_theme_color_override("font_color", Color(1, 1, 1, 1)); + info->add_theme_color_override("font_shadow_color", Color(0, 0, 0, 0.5)); + info->add_theme_constant_override("shadow_outline_size", 1); + info->add_theme_constant_override("shadow_offset_x", 2); + info->add_theme_constant_override("shadow_offset_y", 2); setting = false; layer->connect("value_changed", Callable(this, "_layer_changed")); diff --git a/editor/plugins/texture_region_editor_plugin.cpp b/editor/plugins/texture_region_editor_plugin.cpp index dc567586d6..662c0126ec 100644 --- a/editor/plugins/texture_region_editor_plugin.cpp +++ b/editor/plugins/texture_region_editor_plugin.cpp @@ -808,7 +808,7 @@ void TextureRegionEditor::_notification(int p_what) { switch (p_what) { case NOTIFICATION_ENTER_TREE: case NOTIFICATION_THEME_CHANGED: { - edit_draw->add_theme_style_override(SNAME("panel"), get_theme_stylebox(SNAME("bg"), SNAME("Tree"))); + edit_draw->add_theme_style_override("panel", get_theme_stylebox(SNAME("bg"), SNAME("Tree"))); } break; case NOTIFICATION_READY: { zoom_out->set_icon(get_theme_icon(SNAME("ZoomLess"), SNAME("EditorIcons"))); diff --git a/editor/plugins/theme_editor_plugin.cpp b/editor/plugins/theme_editor_plugin.cpp index bfe605ea2d..aaa09237cf 100644 --- a/editor/plugins/theme_editor_plugin.cpp +++ b/editor/plugins/theme_editor_plugin.cpp @@ -830,7 +830,7 @@ void ThemeItemImportTree::_notification(int p_what) { case NOTIFICATION_ENTER_TREE: case NOTIFICATION_THEME_CHANGED: { select_icons_warning_icon->set_texture(get_theme_icon(SNAME("StatusWarning"), SNAME("EditorIcons"))); - select_icons_warning->add_theme_color_override(SNAME("font_color"), get_theme_color(SNAME("disabled_font_color"), SNAME("Editor"))); + select_icons_warning->add_theme_color_override("font_color", get_theme_color(SNAME("disabled_font_color"), SNAME("Editor"))); // Bottom panel buttons. import_collapse_types_button->set_icon(get_theme_icon(SNAME("CollapseTree"), SNAME("EditorIcons"))); @@ -1824,8 +1824,8 @@ void ThemeItemEditorDialog::_notification(int p_what) { import_another_theme_button->set_icon(get_theme_icon(SNAME("Folder"), SNAME("EditorIcons"))); - tc->add_theme_style_override(SNAME("tab_selected"), get_theme_stylebox(SNAME("tab_selected_odd"), SNAME("TabContainer"))); - tc->add_theme_style_override(SNAME("panel"), get_theme_stylebox(SNAME("panel_odd"), SNAME("TabContainer"))); + tc->add_theme_style_override("tab_selected", get_theme_stylebox(SNAME("tab_selected_odd"), SNAME("TabContainer"))); + tc->add_theme_style_override("panel", get_theme_stylebox(SNAME("panel_odd"), SNAME("TabContainer"))); } break; } } @@ -2389,7 +2389,7 @@ HBoxContainer *ThemeTypeEditor::_create_property_control(Theme::DataType p_data_ item_rename_cancel_button->connect("pressed", callable_mp(this, &ThemeTypeEditor::_item_rename_canceled), varray(p_data_type, p_item_name, item_name_container)); item_rename_cancel_button->hide(); } else { - item_name->add_theme_color_override(SNAME("font_color"), get_theme_color(SNAME("disabled_font_color"), SNAME("Editor"))); + item_name->add_theme_color_override("font_color", get_theme_color(SNAME("disabled_font_color"), SNAME("Editor"))); Button *item_override_button = memnew(Button); item_override_button->set_icon(get_theme_icon(SNAME("Add"), SNAME("EditorIcons"))); @@ -3251,8 +3251,8 @@ void ThemeTypeEditor::_notification(int p_what) { data_type_tabs->set_tab_icon(5, get_theme_icon(SNAME("StyleBoxFlat"), SNAME("EditorIcons"))); data_type_tabs->set_tab_icon(6, get_theme_icon(SNAME("Tools"), SNAME("EditorIcons"))); - data_type_tabs->add_theme_style_override(SNAME("tab_selected"), get_theme_stylebox(SNAME("tab_selected_odd"), SNAME("TabContainer"))); - data_type_tabs->add_theme_style_override(SNAME("panel"), get_theme_stylebox(SNAME("panel_odd"), SNAME("TabContainer"))); + data_type_tabs->add_theme_style_override("tab_selected", get_theme_stylebox(SNAME("tab_selected_odd"), SNAME("TabContainer"))); + data_type_tabs->add_theme_style_override("panel", get_theme_stylebox(SNAME("panel_odd"), SNAME("TabContainer"))); type_variation_button->set_icon(get_theme_icon(SNAME("Add"), SNAME("EditorIcons"))); } break; @@ -3532,9 +3532,9 @@ void ThemeEditor::_notification(int p_what) { switch (p_what) { case NOTIFICATION_ENTER_TREE: case NOTIFICATION_THEME_CHANGED: { - preview_tabs->add_theme_style_override(SNAME("tab_selected"), get_theme_stylebox(SNAME("ThemeEditorPreviewFG"), SNAME("EditorStyles"))); - preview_tabs->add_theme_style_override(SNAME("tab_unselected"), get_theme_stylebox(SNAME("ThemeEditorPreviewBG"), SNAME("EditorStyles"))); - preview_tabs_content->add_theme_style_override(SNAME("panel"), get_theme_stylebox(SNAME("panel_odd"), SNAME("TabContainer"))); + preview_tabs->add_theme_style_override("tab_selected", get_theme_stylebox(SNAME("ThemeEditorPreviewFG"), SNAME("EditorStyles"))); + preview_tabs->add_theme_style_override("tab_unselected", get_theme_stylebox(SNAME("ThemeEditorPreviewBG"), SNAME("EditorStyles"))); + preview_tabs_content->add_theme_style_override("panel", get_theme_stylebox(SNAME("panel_odd"), SNAME("TabContainer"))); add_preview_button->set_icon(get_theme_icon(SNAME("Add"), SNAME("EditorIcons"))); } break; @@ -3586,7 +3586,7 @@ ThemeEditor::ThemeEditor() { VBoxContainer *preview_tabs_vb = memnew(VBoxContainer); preview_tabs_vb->set_h_size_flags(SIZE_EXPAND_FILL); preview_tabs_vb->set_custom_minimum_size(Size2(520, 0) * EDSCALE); - preview_tabs_vb->add_theme_constant_override(SNAME("separation"), 2 * EDSCALE); + preview_tabs_vb->add_theme_constant_override("separation", 2 * EDSCALE); main_hs->add_child(preview_tabs_vb); HBoxContainer *preview_tabbar_hb = memnew(HBoxContainer); preview_tabs_vb->add_child(preview_tabbar_hb); diff --git a/editor/plugins/theme_editor_preview.cpp b/editor/plugins/theme_editor_preview.cpp index a1f98df2aa..c4ef6e086d 100644 --- a/editor/plugins/theme_editor_preview.cpp +++ b/editor/plugins/theme_editor_preview.cpp @@ -247,10 +247,10 @@ ThemeEditorPreview::ThemeEditorPreview() { preview_content = memnew(MarginContainer); preview_root->add_child(preview_content); - preview_content->add_theme_constant_override(SNAME("margin_right"), 4 * EDSCALE); - preview_content->add_theme_constant_override(SNAME("margin_top"), 4 * EDSCALE); - preview_content->add_theme_constant_override(SNAME("margin_left"), 4 * EDSCALE); - preview_content->add_theme_constant_override(SNAME("margin_bottom"), 4 * EDSCALE); + preview_content->add_theme_constant_override("margin_right", 4 * EDSCALE); + preview_content->add_theme_constant_override("margin_top", 4 * EDSCALE); + preview_content->add_theme_constant_override("margin_left", 4 * EDSCALE); + preview_content->add_theme_constant_override("margin_bottom", 4 * EDSCALE); preview_overlay = memnew(MarginContainer); preview_overlay->set_mouse_filter(MOUSE_FILTER_IGNORE); @@ -269,20 +269,20 @@ DefaultThemeEditorPreview::DefaultThemeEditorPreview() { preview_content->add_child(main_panel); MarginContainer *main_mc = memnew(MarginContainer); - main_mc->add_theme_constant_override(SNAME("margin_right"), 4 * EDSCALE); - main_mc->add_theme_constant_override(SNAME("margin_top"), 4 * EDSCALE); - main_mc->add_theme_constant_override(SNAME("margin_left"), 4 * EDSCALE); - main_mc->add_theme_constant_override(SNAME("margin_bottom"), 4 * EDSCALE); + main_mc->add_theme_constant_override("margin_right", 4 * EDSCALE); + main_mc->add_theme_constant_override("margin_top", 4 * EDSCALE); + main_mc->add_theme_constant_override("margin_left", 4 * EDSCALE); + main_mc->add_theme_constant_override("margin_bottom", 4 * EDSCALE); preview_content->add_child(main_mc); HBoxContainer *main_hb = memnew(HBoxContainer); main_mc->add_child(main_hb); - main_hb->add_theme_constant_override(SNAME("separation"), 20 * EDSCALE); + main_hb->add_theme_constant_override("separation", 20 * EDSCALE); VBoxContainer *first_vb = memnew(VBoxContainer); main_hb->add_child(first_vb); first_vb->set_h_size_flags(SIZE_EXPAND_FILL); - first_vb->add_theme_constant_override(SNAME("separation"), 10 * EDSCALE); + first_vb->add_theme_constant_override("separation", 10 * EDSCALE); first_vb->add_child(memnew(Label("Label"))); @@ -343,7 +343,7 @@ DefaultThemeEditorPreview::DefaultThemeEditorPreview() { VBoxContainer *second_vb = memnew(VBoxContainer); second_vb->set_h_size_flags(SIZE_EXPAND_FILL); main_hb->add_child(second_vb); - second_vb->add_theme_constant_override(SNAME("separation"), 10 * EDSCALE); + second_vb->add_theme_constant_override("separation", 10 * EDSCALE); LineEdit *le = memnew(LineEdit); le->set_text("LineEdit"); second_vb->add_child(le); @@ -383,7 +383,7 @@ DefaultThemeEditorPreview::DefaultThemeEditorPreview() { VBoxContainer *third_vb = memnew(VBoxContainer); third_vb->set_h_size_flags(SIZE_EXPAND_FILL); - third_vb->add_theme_constant_override(SNAME("separation"), 10 * EDSCALE); + third_vb->add_theme_constant_override("separation", 10 * EDSCALE); main_hb->add_child(third_vb); TabContainer *tc = memnew(TabContainer); diff --git a/editor/plugins/tiles/tile_atlas_view.cpp b/editor/plugins/tiles/tile_atlas_view.cpp index ebece8ef40..35496795e0 100644 --- a/editor/plugins/tiles/tile_atlas_view.cpp +++ b/editor/plugins/tiles/tile_atlas_view.cpp @@ -585,7 +585,7 @@ TileAtlasView::TileAtlasView() { hbox = memnew(HBoxContainer); hbox->set_mouse_filter(Control::MOUSE_FILTER_IGNORE); - hbox->add_theme_constant_override(SNAME("separation"), 10); + hbox->add_theme_constant_override("separation", 10); hbox->hide(); margin_container->add_child(hbox); diff --git a/editor/plugins/tiles/tile_map_editor.cpp b/editor/plugins/tiles/tile_map_editor.cpp index 621cdae927..6e3724ead9 100644 --- a/editor/plugins/tiles/tile_map_editor.cpp +++ b/editor/plugins/tiles/tile_map_editor.cpp @@ -2095,7 +2095,7 @@ TileMapEditorTilesPlugin::TileMapEditorTilesPlugin() { scatter_spinbox->set_max(1000); scatter_spinbox->set_step(0.001); scatter_spinbox->set_tooltip(TTR("Defines the probability of painting nothing instead of a randomly selected tile.")); - scatter_spinbox->get_line_edit()->add_theme_constant_override(SNAME("minimum_character_width"), 4); + scatter_spinbox->get_line_edit()->add_theme_constant_override("minimum_character_width", 4); scatter_spinbox->connect("value_changed", callable_mp(this, &TileMapEditorTilesPlugin::_on_scattering_spinbox_changed)); tools_settings->add_child(scatter_spinbox); diff --git a/editor/plugins/tiles/tile_set_atlas_source_editor.cpp b/editor/plugins/tiles/tile_set_atlas_source_editor.cpp index 7e05001b57..1bd1cd0219 100644 --- a/editor/plugins/tiles/tile_set_atlas_source_editor.cpp +++ b/editor/plugins/tiles/tile_set_atlas_source_editor.cpp @@ -609,8 +609,8 @@ void TileSetAtlasSourceEditor::_update_tile_data_editors() { } // Theming. - tile_data_editors_tree->add_theme_constant_override(SNAME("vseparation"), 1); - tile_data_editors_tree->add_theme_constant_override(SNAME("hseparation"), 3); + tile_data_editors_tree->add_theme_constant_override("vseparation", 1); + tile_data_editors_tree->add_theme_constant_override("hseparation", 3); Color group_color = get_theme_color(SNAME("prop_category"), SNAME("Editor")); @@ -908,10 +908,10 @@ void TileSetAtlasSourceEditor::_update_atlas_view() { alternative_tiles_control->add_child(button); button->set_flat(true); button->set_icon(get_theme_icon(SNAME("Add"), SNAME("EditorIcons"))); - button->add_theme_style_override(SNAME("normal"), memnew(StyleBoxEmpty)); - button->add_theme_style_override(SNAME("hover"), memnew(StyleBoxEmpty)); - button->add_theme_style_override(SNAME("focus"), memnew(StyleBoxEmpty)); - button->add_theme_style_override(SNAME("pressed"), memnew(StyleBoxEmpty)); + button->add_theme_style_override("normal", memnew(StyleBoxEmpty)); + button->add_theme_style_override("hover", memnew(StyleBoxEmpty)); + button->add_theme_style_override("focus", memnew(StyleBoxEmpty)); + button->add_theme_style_override("pressed", memnew(StyleBoxEmpty)); button->connect("pressed", callable_mp(tile_set_atlas_source, &TileSetAtlasSource::create_alternative_tile), varray(tile_id, TileSetSource::INVALID_TILE_ALTERNATIVE)); button->set_rect(Rect2(Vector2(pos.x, pos.y + (y_increment - texture_region_base_size.y) / 2.0), Vector2(texture_region_base_size_min, texture_region_base_size_min))); button->set_expand_icon(true); diff --git a/editor/plugins/visual_shader_editor_plugin.cpp b/editor/plugins/visual_shader_editor_plugin.cpp index ac316427da..dd19f3d781 100644 --- a/editor/plugins/visual_shader_editor_plugin.cpp +++ b/editor/plugins/visual_shader_editor_plugin.cpp @@ -679,7 +679,7 @@ void VisualShaderGraphPlugin::add_node(VisualShader::Type p_type, int p_id) { } else { hb = memnew(HBoxContainer); } - hb->add_theme_constant_override(SNAME("separation"), 7 * EDSCALE); + hb->add_theme_constant_override("separation", 7 * EDSCALE); Variant default_value; @@ -732,14 +732,14 @@ void VisualShaderGraphPlugin::add_node(VisualShader::Type p_type, int p_id) { } else { Label *label = memnew(Label); label->set_text(name_left); - label->add_theme_style_override(SNAME("normal"), label_style); //more compact + label->add_theme_style_override("normal", label_style); //more compact hb->add_child(label); if (vsnode->is_input_port_default(i, mode) && !port_left_used) { Label *hint_label = memnew(Label); hint_label->set_text(TTR("[default]")); - hint_label->add_theme_color_override(SNAME("font_color"), editor->get_theme_color(SNAME("font_readonly_color"), SNAME("TextEdit"))); - hint_label->add_theme_style_override(SNAME("normal"), label_style); + hint_label->add_theme_color_override("font_color", editor->get_theme_color(SNAME("font_readonly_color"), SNAME("TextEdit"))); + hint_label->add_theme_style_override("normal", label_style); hb->add_child(hint_label); } } @@ -779,7 +779,7 @@ void VisualShaderGraphPlugin::add_node(VisualShader::Type p_type, int p_id) { } else { Label *label = memnew(Label); label->set_text(name_right); - label->add_theme_style_override(SNAME("normal"), label_style); //more compact + label->add_theme_style_override("normal", label_style); //more compact hb->add_child(label); } } @@ -896,7 +896,7 @@ void VisualShaderGraphPlugin::add_node(VisualShader::Type p_type, int p_id) { String error = vsnode->get_warning(mode, p_type); if (!error.is_empty()) { Label *error_label = memnew(Label); - error_label->add_theme_color_override(SNAME("font_color"), editor->get_theme_color(SNAME("error_color"), SNAME("Editor"))); + error_label->add_theme_color_override("font_color", editor->get_theme_color(SNAME("error_color"), SNAME("Editor"))); error_label->set_text(error); node->add_child(error_label); } @@ -920,7 +920,7 @@ void VisualShaderGraphPlugin::add_node(VisualShader::Type p_type, int p_id) { Color members_color = EDITOR_GET("text_editor/theme/highlighting/member_variable_color"); expression_box->set_syntax_highlighter(expression_syntax_highlighter); - expression_box->add_theme_color_override(SNAME("background_color"), background_color); + expression_box->add_theme_color_override("background_color", background_color); for (const String &E : editor->keyword_list) { if (ShaderLanguage::is_control_flow_keyword(E)) { @@ -930,9 +930,9 @@ void VisualShaderGraphPlugin::add_node(VisualShader::Type p_type, int p_id) { } } - expression_box->add_theme_font_override(SNAME("font"), editor->get_theme_font(SNAME("expression"), SNAME("EditorFonts"))); - expression_box->add_theme_font_size_override(SNAME("font_size"), editor->get_theme_font_size(SNAME("expression_size"), SNAME("EditorFonts"))); - expression_box->add_theme_color_override(SNAME("font_color"), text_color); + expression_box->add_theme_font_override("font", editor->get_theme_font(SNAME("expression"), SNAME("EditorFonts"))); + expression_box->add_theme_font_size_override("font_size", editor->get_theme_font_size(SNAME("expression_size"), SNAME("EditorFonts"))); + expression_box->add_theme_color_override("font_color", text_color); expression_syntax_highlighter->set_number_color(number_color); expression_syntax_highlighter->set_symbol_color(symbol_color); expression_syntax_highlighter->set_function_color(function_color); @@ -1512,10 +1512,10 @@ void VisualShaderEditor::_update_created_node(GraphNode *node) { const Color mono_color = ((c.r + c.g + c.b) / 3) < 0.7 ? Color(1.0, 1.0, 1.0, 0.85) : Color(0.0, 0.0, 0.0, 0.85); c = mono_color; - node->add_theme_color_override(SNAME("title_color"), c); + node->add_theme_color_override("title_color", c); c.a = 0.7; - node->add_theme_color_override(SNAME("close_color"), c); - node->add_theme_color_override(SNAME("resizer_color"), c); + node->add_theme_color_override("close_color", c); + node->add_theme_color_override("resizer_color", c); } void VisualShaderEditor::_update_uniforms(bool p_update_refs) { @@ -2584,7 +2584,7 @@ void VisualShaderEditor::_add_node(int p_idx, const Vector<Variant> &p_ops, Stri vsnode = Ref<VisualShaderNode>(vsn); } else { ERR_FAIL_COND(add_options[p_idx].script.is_null()); - String base_type = add_options[p_idx].script->get_instance_base_type(); + StringName base_type = add_options[p_idx].script->get_instance_base_type(); VisualShaderNode *vsn = Object::cast_to<VisualShaderNode>(ClassDB::instantiate(base_type)); ERR_FAIL_COND(!vsn); vsnode = Ref<VisualShaderNode>(vsn); @@ -3421,7 +3421,7 @@ void VisualShaderEditor::_notification(int p_what) { Color number_color = EDITOR_GET("text_editor/theme/highlighting/number_color"); Color members_color = EDITOR_GET("text_editor/theme/highlighting/member_variable_color"); - preview_text->add_theme_color_override(SNAME("background_color"), background_color); + preview_text->add_theme_color_override("background_color", background_color); for (const String &E : keyword_list) { if (ShaderLanguage::is_control_flow_keyword(E)) { @@ -3431,9 +3431,9 @@ void VisualShaderEditor::_notification(int p_what) { } } - preview_text->add_theme_font_override(SNAME("font"), get_theme_font(SNAME("expression"), SNAME("EditorFonts"))); - preview_text->add_theme_font_size_override(SNAME("font_size"), get_theme_font_size(SNAME("expression_size"), SNAME("EditorFonts"))); - preview_text->add_theme_color_override(SNAME("font_color"), text_color); + preview_text->add_theme_font_override("font", get_theme_font(SNAME("expression"), SNAME("EditorFonts"))); + preview_text->add_theme_font_size_override("font_size", get_theme_font_size(SNAME("expression_size"), SNAME("EditorFonts"))); + preview_text->add_theme_color_override("font_color", text_color); syntax_highlighter->set_number_color(number_color); syntax_highlighter->set_symbol_color(symbol_color); syntax_highlighter->set_function_color(function_color); @@ -3446,10 +3446,10 @@ void VisualShaderEditor::_notification(int p_what) { preview_text->add_comment_delimiter("/*", "*/", false); preview_text->add_comment_delimiter("//", "", true); - error_panel->add_theme_style_override(SNAME("panel"), get_theme_stylebox(SNAME("panel"), SNAME("Panel"))); - error_label->add_theme_font_override(SNAME("font"), get_theme_font(SNAME("status_source"), SNAME("EditorFonts"))); - error_label->add_theme_font_size_override(SNAME("font_size"), get_theme_font_size(SNAME("status_source_size"), SNAME("EditorFonts"))); - error_label->add_theme_color_override(SNAME("font_color"), get_theme_color(SNAME("error_color"), SNAME("Editor"))); + error_panel->add_theme_style_override("panel", get_theme_stylebox(SNAME("panel"), SNAME("Panel"))); + error_label->add_theme_font_override("font", get_theme_font(SNAME("status_source"), SNAME("EditorFonts"))); + error_label->add_theme_font_size_override("font_size", get_theme_font_size(SNAME("status_source_size"), SNAME("EditorFonts"))); + error_label->add_theme_color_override("font_color", get_theme_color(SNAME("error_color"), SNAME("Editor"))); } tools->set_icon(EditorNode::get_singleton()->get_gui_base()->get_theme_icon(SNAME("Tools"), SNAME("EditorIcons"))); @@ -4301,7 +4301,7 @@ VisualShaderEditor::VisualShaderEditor() { preview_vbox = memnew(VBoxContainer); preview_window->add_child(preview_vbox); - preview_vbox->add_theme_constant_override(SNAME("separation"), 0); + preview_vbox->add_theme_constant_override("separation", 0); preview_text = memnew(CodeEdit); syntax_highlighter.instantiate(); diff --git a/editor/project_export.cpp b/editor/project_export.cpp index 5e2334f5e3..b8775cd3ed 100644 --- a/editor/project_export.cpp +++ b/editor/project_export.cpp @@ -1158,7 +1158,7 @@ ProjectExportDialog::ProjectExportDialog() { script_key->connect("text_changed", callable_mp(this, &ProjectExportDialog::_script_encryption_key_changed)); script_key_error = memnew(Label); script_key_error->set_text(String::utf8("• ") + TTR("Invalid Encryption Key (must be 64 hexadecimal characters long)")); - script_key_error->add_theme_color_override(SNAME("font_color"), EditorNode::get_singleton()->get_gui_base()->get_theme_color(SNAME("error_color"), SNAME("Editor"))); + script_key_error->add_theme_color_override("font_color", EditorNode::get_singleton()->get_gui_base()->get_theme_color(SNAME("error_color"), SNAME("Editor"))); sec_vb->add_margin_child(TTR("Encryption Key (256-bits as hexadecimal):"), script_key); sec_vb->add_child(script_key_error); sections->add_child(sec_vb); @@ -1227,12 +1227,12 @@ ProjectExportDialog::ProjectExportDialog() { export_error = memnew(Label); main_vb->add_child(export_error); export_error->hide(); - export_error->add_theme_color_override(SNAME("font_color"), EditorNode::get_singleton()->get_gui_base()->get_theme_color(SNAME("error_color"), SNAME("Editor"))); + export_error->add_theme_color_override("font_color", EditorNode::get_singleton()->get_gui_base()->get_theme_color(SNAME("error_color"), SNAME("Editor"))); export_warning = memnew(Label); main_vb->add_child(export_warning); export_warning->hide(); - export_warning->add_theme_color_override(SNAME("font_color"), EditorNode::get_singleton()->get_gui_base()->get_theme_color(SNAME("warning_color"), SNAME("Editor"))); + export_warning->add_theme_color_override("font_color", EditorNode::get_singleton()->get_gui_base()->get_theme_color(SNAME("warning_color"), SNAME("Editor"))); export_templates_error = memnew(HBoxContainer); main_vb->add_child(export_templates_error); @@ -1240,7 +1240,7 @@ ProjectExportDialog::ProjectExportDialog() { Label *export_error2 = memnew(Label); export_templates_error->add_child(export_error2); - export_error2->add_theme_color_override(SNAME("font_color"), EditorNode::get_singleton()->get_gui_base()->get_theme_color(SNAME("error_color"), SNAME("Editor"))); + export_error2->add_theme_color_override("font_color", EditorNode::get_singleton()->get_gui_base()->get_theme_color(SNAME("error_color"), SNAME("Editor"))); export_error2->set_text(String::utf8("• ") + TTR("Export templates for this platform are missing:") + " "); error_dialog = memnew(AcceptDialog); @@ -1275,8 +1275,6 @@ ProjectExportDialog::ProjectExportDialog() { set_hide_on_ok(false); - editor_icons = "EditorIcons"; - default_filename = EditorSettings::get_singleton()->get_project_metadata("export_options", "default_filename", ""); // If no default set, use project name if (default_filename.is_empty()) { diff --git a/editor/project_export.h b/editor/project_export.h index 3d90a0d3ff..09e402c67f 100644 --- a/editor/project_export.h +++ b/editor/project_export.h @@ -85,8 +85,6 @@ private: Label *include_label; MarginContainer *include_margin; - StringName editor_icons; - Button *export_button; Button *export_all_button; AcceptDialog *export_all_dialog; diff --git a/editor/project_manager.cpp b/editor/project_manager.cpp index 528347b779..cfb42c0741 100644 --- a/editor/project_manager.cpp +++ b/editor/project_manager.cpp @@ -117,13 +117,13 @@ private: switch (p_type) { case MESSAGE_ERROR: { - msg->add_theme_color_override(SNAME("font_color"), msg->get_theme_color(SNAME("error_color"), SNAME("Editor"))); + msg->add_theme_color_override("font_color", msg->get_theme_color(SNAME("error_color"), SNAME("Editor"))); msg->set_modulate(Color(1, 1, 1, 1)); new_icon = msg->get_theme_icon(SNAME("StatusError"), SNAME("EditorIcons")); } break; case MESSAGE_WARNING: { - msg->add_theme_color_override(SNAME("font_color"), msg->get_theme_color(SNAME("warning_color"), SNAME("Editor"))); + msg->add_theme_color_override("font_color", msg->get_theme_color(SNAME("warning_color"), SNAME("Editor"))); msg->set_modulate(Color(1, 1, 1, 1)); new_icon = msg->get_theme_icon(SNAME("StatusWarning"), SNAME("EditorIcons")); @@ -1349,7 +1349,7 @@ void ProjectList::create_project_item_control(int p_index) { ProjectListItemControl *hb = memnew(ProjectListItemControl); hb->connect("draw", callable_mp(this, &ProjectList::_panel_draw), varray(hb)); hb->connect("gui_input", callable_mp(this, &ProjectList::_panel_input), varray(hb)); - hb->add_theme_constant_override(SNAME("separation"), 10 * EDSCALE); + hb->add_theme_constant_override("separation", 10 * EDSCALE); hb->set_tooltip(item.description); VBoxContainer *favorite_box = memnew(VBoxContainer); @@ -1394,9 +1394,9 @@ void ProjectList::create_project_item_control(int p_index) { Label *title = memnew(Label(!item.missing ? item.project_name : TTR("Missing Project"))); title->set_h_size_flags(Control::SIZE_EXPAND_FILL); - title->add_theme_font_override(SNAME("font"), get_theme_font(SNAME("title"), SNAME("EditorFonts"))); - title->add_theme_font_size_override(SNAME("font_size"), get_theme_font_size(SNAME("title_size"), SNAME("EditorFonts"))); - title->add_theme_color_override(SNAME("font_color"), font_color); + title->add_theme_font_override("font", get_theme_font(SNAME("title"), SNAME("EditorFonts"))); + title->add_theme_font_size_override("font_size", get_theme_font_size(SNAME("title_size"), SNAME("EditorFonts"))); + title->add_theme_color_override("font_color", font_color); title->set_clip_text(true); title_hb->add_child(title); @@ -1405,8 +1405,8 @@ void ProjectList::create_project_item_control(int p_index) { if (length > 0) { Label *unsupported_label = memnew(Label(unsupported_features_str)); unsupported_label->set_custom_minimum_size(Size2(length * 15, 10) * EDSCALE); - unsupported_label->add_theme_font_override(SNAME("font"), get_theme_font(SNAME("title"), SNAME("EditorFonts"))); - unsupported_label->add_theme_color_override(SNAME("font_color"), get_theme_color(SNAME("warning_color"), SNAME("Editor"))); + unsupported_label->add_theme_font_override("font", get_theme_font(SNAME("title"), SNAME("EditorFonts"))); + unsupported_label->add_theme_color_override("font_color", get_theme_color(SNAME("warning_color"), SNAME("Editor"))); unsupported_label->set_clip_text(true); unsupported_label->set_horizontal_alignment(HORIZONTAL_ALIGNMENT_RIGHT); title_hb->add_child(unsupported_label); @@ -1443,7 +1443,7 @@ void ProjectList::create_project_item_control(int p_index) { path_hb->add_child(fpath); fpath->set_h_size_flags(Control::SIZE_EXPAND_FILL); fpath->set_modulate(Color(1, 1, 1, 0.5)); - fpath->add_theme_color_override(SNAME("font_color"), font_color); + fpath->add_theme_color_override("font_color", font_color); fpath->set_clip_text(true); } @@ -2524,7 +2524,7 @@ ProjectManager::ProjectManager() { Panel *panel = memnew(Panel); add_child(panel); panel->set_anchors_and_offsets_preset(Control::PRESET_WIDE); - panel->add_theme_style_override(SNAME("panel"), get_theme_stylebox(SNAME("Background"), SNAME("EditorStyles"))); + panel->add_theme_style_override("panel", get_theme_stylebox(SNAME("Background"), SNAME("EditorStyles"))); VBoxContainer *vb = memnew(VBoxContainer); panel->add_child(vb); @@ -2562,7 +2562,7 @@ ProjectManager::ProjectManager() { hb->add_child(search_box); loading_label = memnew(Label(TTR("Loading, please wait..."))); - loading_label->add_theme_font_override(SNAME("font"), get_theme_font(SNAME("bold"), SNAME("EditorFonts"))); + loading_label->add_theme_font_override("font", get_theme_font(SNAME("bold"), SNAME("EditorFonts"))); loading_label->set_h_size_flags(Control::SIZE_EXPAND_FILL); hb->add_child(loading_label); // Hide the label but make it still take up space. This prevents reflows when showing the label. @@ -2588,7 +2588,7 @@ ProjectManager::ProjectManager() { } PanelContainer *pc = memnew(PanelContainer); - pc->add_theme_style_override(SNAME("panel"), get_theme_stylebox(SNAME("bg"), SNAME("Tree"))); + pc->add_theme_style_override("panel", get_theme_stylebox(SNAME("bg"), SNAME("Tree"))); pc->set_v_size_flags(Control::SIZE_EXPAND_FILL); search_tree_vb->add_child(pc); diff --git a/editor/project_settings_editor.cpp b/editor/project_settings_editor.cpp index 2a72764469..c0ff1d72ee 100644 --- a/editor/project_settings_editor.cpp +++ b/editor/project_settings_editor.cpp @@ -509,9 +509,9 @@ void ProjectSettingsEditor::_update_action_map_editor() { void ProjectSettingsEditor::_update_theme() { search_box->set_right_icon(get_theme_icon(SNAME("Search"), SNAME("EditorIcons"))); restart_close_button->set_icon(get_theme_icon(SNAME("Close"), SNAME("EditorIcons"))); - restart_container->add_theme_style_override(SNAME("panel"), get_theme_stylebox(SNAME("bg"), SNAME("Tree"))); + restart_container->add_theme_style_override("panel", get_theme_stylebox(SNAME("bg"), SNAME("Tree"))); restart_icon->set_texture(get_theme_icon(SNAME("StatusWarning"), SNAME("EditorIcons"))); - restart_label->add_theme_color_override(SNAME("font_color"), get_theme_color(SNAME("warning_color"), SNAME("Editor"))); + restart_label->add_theme_color_override("font_color", get_theme_color(SNAME("warning_color"), SNAME("Editor"))); type_box->clear(); for (int i = 0; i < Variant::VARIANT_MAX; i++) { diff --git a/editor/property_editor.cpp b/editor/property_editor.cpp index 27fe696cc3..405e263a62 100644 --- a/editor/property_editor.cpp +++ b/editor/property_editor.cpp @@ -269,7 +269,9 @@ void CustomPropertyEditor::_menu_option(int p_which) { res->call("set_instance_base_type", owner->get_class()); } + EditorNode::get_editor_data().instantiate_object_properties(obj); v = obj; + emit_signal(SNAME("variant_changed")); } break; @@ -1092,7 +1094,9 @@ void CustomPropertyEditor::_type_create_selected(int p_idx) { ERR_FAIL_COND(!obj); ERR_FAIL_COND(!Object::cast_to<Resource>(obj)); + EditorNode::get_editor_data().instantiate_object_properties(obj); v = obj; + emit_signal(SNAME("variant_changed")); hide(); } @@ -1283,7 +1287,9 @@ void CustomPropertyEditor::_action_pressed(int p_which) { ERR_BREAK(!obj); ERR_BREAK(!Object::cast_to<Resource>(obj)); + EditorNode::get_editor_data().instantiate_object_properties(obj); v = obj; + emit_signal(SNAME("variant_changed")); hide(); } diff --git a/editor/property_selector.cpp b/editor/property_selector.cpp index 406bcbe342..0862efb4ee 100644 --- a/editor/property_selector.cpp +++ b/editor/property_selector.cpp @@ -214,10 +214,13 @@ void PropertySelector::_update_search() { Variant::construct(type, v, nullptr, 0, ce); v.get_method_list(&methods); } else { - Object *obj = ObjectDB::get_instance(script); - if (Object::cast_to<Script>(obj)) { + Ref<Script> script_ref = Object::cast_to<Script>(ObjectDB::get_instance(script)); + if (script_ref.is_valid()) { methods.push_back(MethodInfo("*Script Methods")); - Object::cast_to<Script>(obj)->get_script_method_list(&methods); + if (script_ref->is_built_in()) { + script_ref->reload(true); + } + script_ref->get_script_method_list(&methods); } StringName base = base_type; diff --git a/editor/quick_open.cpp b/editor/quick_open.cpp index c3fb61da86..2a8ca67fe6 100644 --- a/editor/quick_open.cpp +++ b/editor/quick_open.cpp @@ -261,7 +261,7 @@ EditorQuickOpen::EditorQuickOpen() { search_options->create_item(); search_options->set_hide_root(true); search_options->set_hide_folding(true); - search_options->add_theme_constant_override(SNAME("draw_guides"), 1); + search_options->add_theme_constant_override("draw_guides", 1); vbc->add_margin_child(TTR("Matches:"), search_options, true); get_ok_button()->set_text(TTR("Open")); diff --git a/editor/rename_dialog.cpp b/editor/rename_dialog.cpp index 835551c4af..c6a4c0d86a 100644 --- a/editor/rename_dialog.cpp +++ b/editor/rename_dialog.cpp @@ -391,9 +391,9 @@ void RenameDialog::_update_preview(String new_text) { // New name is identical to the old one. Don't color it as much to avoid distracting the user. const Color accent_color = EditorNode::get_singleton()->get_gui_base()->get_theme_color(SNAME("accent_color"), SNAME("Editor")); const Color text_color = EditorNode::get_singleton()->get_gui_base()->get_theme_color(SNAME("default_color"), SNAME("RichTextLabel")); - lbl_preview->add_theme_color_override(SNAME("font_color"), accent_color.lerp(text_color, 0.5)); + lbl_preview->add_theme_color_override("font_color", accent_color.lerp(text_color, 0.5)); } else { - lbl_preview->add_theme_color_override(SNAME("font_color"), EditorNode::get_singleton()->get_gui_base()->get_theme_color(SNAME("success_color"), SNAME("Editor"))); + lbl_preview->add_theme_color_override("font_color", EditorNode::get_singleton()->get_gui_base()->get_theme_color(SNAME("success_color"), SNAME("Editor"))); } } @@ -479,7 +479,7 @@ void RenameDialog::_error_handler(void *p_self, const char *p_func, const char * self->has_errors = true; self->lbl_preview_title->set_text(TTR("Regular Expression Error:")); - self->lbl_preview->add_theme_color_override(SNAME("font_color"), EditorNode::get_singleton()->get_gui_base()->get_theme_color(SNAME("error_color"), SNAME("Editor"))); + self->lbl_preview->add_theme_color_override("font_color", EditorNode::get_singleton()->get_gui_base()->get_theme_color(SNAME("error_color"), SNAME("Editor"))); self->lbl_preview->set_text(vformat(TTR("At character %s"), err_str)); } diff --git a/editor/scene_tree_dock.cpp b/editor/scene_tree_dock.cpp index 3c2194ccb3..0e362b13c6 100644 --- a/editor/scene_tree_dock.cpp +++ b/editor/scene_tree_dock.cpp @@ -1206,8 +1206,16 @@ void SceneTreeDock::_notification(int p_what) { create_root_dialog->add_child(top_row); + ScrollContainer *scroll_container = memnew(ScrollContainer); + scroll_container->set_name("NodeShortcutsScrollContainer"); + create_root_dialog->add_child(scroll_container); + scroll_container->set_v_size_flags(SIZE_EXPAND_FILL); + scroll_container->set_horizontal_scroll_mode(ScrollContainer::SCROLL_MODE_DISABLED); + VBoxContainer *node_shortcuts = memnew(VBoxContainer); node_shortcuts->set_name("NodeShortcuts"); + scroll_container->add_child(node_shortcuts); + node_shortcuts->set_h_size_flags(SIZE_EXPAND_FILL); VBoxContainer *beginner_node_shortcuts = memnew(VBoxContainer); beginner_node_shortcuts->set_name("BeginnerNodeShortcuts"); @@ -1247,8 +1255,6 @@ void SceneTreeDock::_notification(int p_what) { button_clipboard->set_icon(get_theme_icon(SNAME("ActionPaste"), SNAME("EditorIcons"))); button_clipboard->connect("pressed", callable_bind(callable_mp(this, &SceneTreeDock::_tool_selected), TOOL_PASTE, false)); - node_shortcuts->add_spacer(); - create_root_dialog->add_child(node_shortcuts); _update_create_root_dialog(); } break; @@ -3112,7 +3118,7 @@ void SceneTreeDock::_local_tree_selected() { void SceneTreeDock::_update_create_root_dialog() { BaseButton *toggle = Object::cast_to<BaseButton>(create_root_dialog->get_node(String("NodeShortcutsTopRow/NodeShortcutsToggle"))); - Node *node_shortcuts = create_root_dialog->get_node(String("NodeShortcuts")); + Node *node_shortcuts = create_root_dialog->get_node(String("NodeShortcutsScrollContainer/NodeShortcuts")); if (!toggle || !node_shortcuts) { return; @@ -3142,6 +3148,7 @@ void SceneTreeDock::_update_create_root_dialog() { Button *button = memnew(Button); favorite_nodes->add_child(button); button->set_text(l); + button->set_clip_text(true); String name = l.get_slicec(' ', 0); if (ScriptServer::is_global_class(name)) { name = ScriptServer::get_global_class_native_base(name); @@ -3301,7 +3308,7 @@ SceneTreeDock::SceneTreeDock(EditorNode *p_editor, Node *p_scene_root, EditorSel VBoxContainer *vbc = this; HBoxContainer *filter_hbc = memnew(HBoxContainer); - filter_hbc->add_theme_constant_override(SNAME("separate"), 0); + filter_hbc->add_theme_constant_override("separate", 0); ED_SHORTCUT("scene_tree/rename", TTR("Rename"), Key::F2); ED_SHORTCUT_OVERRIDE("scene_tree/rename", "macos", Key::ENTER); @@ -3349,7 +3356,7 @@ SceneTreeDock::SceneTreeDock(EditorNode *p_editor, Node *p_scene_root, EditorSel filter->set_h_size_flags(SIZE_EXPAND_FILL); filter->set_placeholder(TTR("Filter nodes")); filter_hbc->add_child(filter); - filter->add_theme_constant_override(SNAME("minimum_character_width"), 0); + filter->add_theme_constant_override("minimum_character_width", 0); filter->connect("text_changed", callable_mp(this, &SceneTreeDock::_filter_changed)); button_create_script = memnew(Button); @@ -3403,6 +3410,7 @@ SceneTreeDock::SceneTreeDock(EditorNode *p_editor, Node *p_scene_root, EditorSel create_root_dialog = memnew(VBoxContainer); vbc->add_child(create_root_dialog); + create_root_dialog->set_v_size_flags(SIZE_EXPAND_FILL); create_root_dialog->hide(); scene_tree = memnew(SceneTreeEditor(false, true, true)); diff --git a/editor/scene_tree_editor.cpp b/editor/scene_tree_editor.cpp index ddf7d8c465..e9aed53b4e 100644 --- a/editor/scene_tree_editor.cpp +++ b/editor/scene_tree_editor.cpp @@ -1219,7 +1219,7 @@ SceneTreeEditor::SceneTreeEditor(bool p_label, bool p_can_rename, bool p_can_ope tree->set_begin(Point2(0, p_label ? 18 : 0)); tree->set_end(Point2(0, 0)); tree->set_allow_reselect(true); - tree->add_theme_constant_override(SNAME("button_margin"), 0); + tree->add_theme_constant_override("button_margin", 0); add_child(tree); @@ -1324,7 +1324,7 @@ SceneTreeDialog::SceneTreeDialog() { filter->set_h_size_flags(Control::SIZE_EXPAND_FILL); filter->set_placeholder(TTR("Filter nodes")); filter->set_clear_button_enabled(true); - filter->add_theme_constant_override(SNAME("minimum_character_width"), 0); + filter->add_theme_constant_override("minimum_character_width", 0); filter->connect("text_changed", callable_mp(this, &SceneTreeDialog::_filter_changed)); vbc->add_child(filter); diff --git a/editor/script_create_dialog.cpp b/editor/script_create_dialog.cpp index 1fa85f8df6..b42d4a1d6d 100644 --- a/editor/script_create_dialog.cpp +++ b/editor/script_create_dialog.cpp @@ -70,7 +70,7 @@ void ScriptCreateDialog::_notification(int p_what) { path_button->set_icon(get_theme_icon(SNAME("Folder"), SNAME("EditorIcons"))); parent_browse_button->set_icon(get_theme_icon(SNAME("Folder"), SNAME("EditorIcons"))); parent_search_button->set_icon(get_theme_icon(SNAME("ClassList"), SNAME("EditorIcons"))); - status_panel->add_theme_style_override(SNAME("panel"), get_theme_stylebox(SNAME("bg"), SNAME("Tree"))); + status_panel->add_theme_style_override("panel", get_theme_stylebox(SNAME("bg"), SNAME("Tree"))); } break; } } @@ -291,7 +291,7 @@ void ScriptCreateDialog::_template_changed(int p_template) { template_info += " - " + sinfo.description; } template_info_label->set_text(template_info); - template_info_label->add_theme_color_override(SNAME("font_color"), get_theme_color(SNAME("success_color"), SNAME("Editor"))); + template_info_label->add_theme_color_override("font_color", get_theme_color(SNAME("success_color"), SNAME("Editor"))); } void ScriptCreateDialog::ok_pressed() { @@ -522,18 +522,18 @@ void ScriptCreateDialog::_path_submitted(const String &p_path) { void ScriptCreateDialog::_msg_script_valid(bool valid, const String &p_msg) { error_label->set_text(String::utf8("• ") + p_msg); if (valid) { - error_label->add_theme_color_override(SNAME("font_color"), get_theme_color(SNAME("success_color"), SNAME("Editor"))); + error_label->add_theme_color_override("font_color", get_theme_color(SNAME("success_color"), SNAME("Editor"))); } else { - error_label->add_theme_color_override(SNAME("font_color"), get_theme_color(SNAME("error_color"), SNAME("Editor"))); + error_label->add_theme_color_override("font_color", get_theme_color(SNAME("error_color"), SNAME("Editor"))); } } void ScriptCreateDialog::_msg_path_valid(bool valid, const String &p_msg) { path_error_label->set_text(String::utf8("• ") + p_msg); if (valid) { - path_error_label->add_theme_color_override(SNAME("font_color"), get_theme_color(SNAME("success_color"), SNAME("Editor"))); + path_error_label->add_theme_color_override("font_color", get_theme_color(SNAME("success_color"), SNAME("Editor"))); } else { - path_error_label->add_theme_color_override(SNAME("font_color"), get_theme_color(SNAME("error_color"), SNAME("Editor"))); + path_error_label->add_theme_color_override("font_color", get_theme_color(SNAME("error_color"), SNAME("Editor"))); } } @@ -658,7 +658,7 @@ void ScriptCreateDialog::_update_dialog() { class_name->set_placeholder(TTR("Allowed: a-z, A-Z, 0-9, _ and .")); Color placeholder_color = class_name->get_theme_color(SNAME("font_placeholder_color")); placeholder_color.a = 0.3; - class_name->add_theme_color_override(SNAME("font_placeholder_color"), placeholder_color); + class_name->add_theme_color_override("font_placeholder_color", placeholder_color); } else { class_name->set_editable(false); } @@ -667,7 +667,7 @@ void ScriptCreateDialog::_update_dialog() { class_name->set_placeholder(TTR("N/A")); Color placeholder_color = class_name->get_theme_color(SNAME("font_placeholder_color")); placeholder_color.a = 1; - class_name->add_theme_color_override(SNAME("font_placeholder_color"), placeholder_color); + class_name->add_theme_color_override("font_placeholder_color", placeholder_color); class_name->set_text(""); } @@ -911,7 +911,7 @@ ScriptCreateDialog::ScriptCreateDialog() { script_name_warning_label->set_text( TTR("Warning: Having the script name be the same as a built-in type is usually not desired.")); vb->add_child(script_name_warning_label); - script_name_warning_label->add_theme_color_override(SNAME("font_color"), Color(1, 0.85, 0.4)); + script_name_warning_label->add_theme_color_override("font_color", Color(1, 0.85, 0.4)); script_name_warning_label->set_autowrap_mode(Label::AUTOWRAP_WORD_SMART); script_name_warning_label->hide(); diff --git a/editor/shader_create_dialog.cpp b/editor/shader_create_dialog.cpp index a34cbed2dc..95c4c5ff0d 100644 --- a/editor/shader_create_dialog.cpp +++ b/editor/shader_create_dialog.cpp @@ -72,7 +72,7 @@ void ShaderCreateDialog::_update_theme() { } path_button->set_icon(get_theme_icon(SNAME("Folder"), SNAME("EditorIcons"))); - status_panel->add_theme_style_override(SNAME("panel"), get_theme_stylebox(SNAME("bg"), SNAME("Tree"))); + status_panel->add_theme_style_override("panel", get_theme_stylebox(SNAME("bg"), SNAME("Tree"))); } void ShaderCreateDialog::_update_language_info() { @@ -419,18 +419,18 @@ String ShaderCreateDialog::_validate_path(const String &p_path) { void ShaderCreateDialog::_msg_script_valid(bool valid, const String &p_msg) { error_label->set_text("- " + p_msg); if (valid) { - error_label->add_theme_color_override(SNAME("font_color"), gc->get_theme_color(SNAME("success_color"), SNAME("Editor"))); + error_label->add_theme_color_override("font_color", gc->get_theme_color(SNAME("success_color"), SNAME("Editor"))); } else { - error_label->add_theme_color_override(SNAME("font_color"), gc->get_theme_color(SNAME("error_color"), SNAME("Editor"))); + error_label->add_theme_color_override("font_color", gc->get_theme_color(SNAME("error_color"), SNAME("Editor"))); } } void ShaderCreateDialog::_msg_path_valid(bool valid, const String &p_msg) { path_error_label->set_text("- " + p_msg); if (valid) { - path_error_label->add_theme_color_override(SNAME("font_color"), gc->get_theme_color(SNAME("success_color"), SNAME("Editor"))); + path_error_label->add_theme_color_override("font_color", gc->get_theme_color(SNAME("success_color"), SNAME("Editor"))); } else { - path_error_label->add_theme_color_override(SNAME("font_color"), gc->get_theme_color(SNAME("error_color"), SNAME("Editor"))); + path_error_label->add_theme_color_override("font_color", gc->get_theme_color(SNAME("error_color"), SNAME("Editor"))); } } diff --git a/main/main.cpp b/main/main.cpp index f8088cba1c..216d0a446a 100644 --- a/main/main.cpp +++ b/main/main.cpp @@ -2250,9 +2250,8 @@ bool Main::start() { } } - if (main_loop->is_class("SceneTree")) { - SceneTree *sml = Object::cast_to<SceneTree>(main_loop); - + SceneTree *sml = Object::cast_to<SceneTree>(main_loop); + if (sml) { #ifdef DEBUG_ENABLED if (debug_collisions) { sml->set_debug_collisions_hint(true); @@ -2294,20 +2293,18 @@ bool Main::start() { RES res = ResourceLoader::load(info.path); ERR_CONTINUE_MSG(res.is_null(), "Can't autoload: " + info.path); Node *n = nullptr; - if (res->is_class("PackedScene")) { - Ref<PackedScene> ps = res; - n = ps->instantiate(); - } else if (res->is_class("Script")) { - Ref<Script> script_res = res; + Ref<PackedScene> scn = res; + Ref<Script> script_res = res; + if (scn.is_valid()) { + n = scn->instantiate(); + } else if (script_res.is_valid()) { StringName ibt = script_res->get_instance_base_type(); bool valid_type = ClassDB::is_parent_class(ibt, "Node"); ERR_CONTINUE_MSG(!valid_type, "Script does not inherit a Node: " + info.path); Object *obj = ClassDB::instantiate(ibt); - ERR_CONTINUE_MSG(obj == nullptr, - "Cannot instance script for autoload, expected 'Node' inheritance, got: " + - String(ibt)); + ERR_CONTINUE_MSG(!obj, "Cannot instance script for autoload, expected 'Node' inheritance, got: " + String(ibt) + "."); n = Object::cast_to<Node>(obj); n->set_script(script_res); diff --git a/modules/SCsub b/modules/SCsub index 5ff4623743..fcc01e2c1b 100644 --- a/modules/SCsub +++ b/modules/SCsub @@ -22,36 +22,45 @@ env.CommandNoCache( ), ) -# Header to be included in `tests/test_main.cpp` to run module-specific tests. -if env["tests"]: - env.Depends("modules_tests.gen.h", Value(env.module_list)) - env.CommandNoCache( - "modules_tests.gen.h", - Value(env.module_list), - env.Run( - modules_builders.generate_modules_tests, - "Generating modules tests header.", - # NOTE: No need to run in subprocess since this is still executed serially. - subprocess=False, - ), - ) - env.AlwaysBuild("modules_tests.gen.h") vs_sources = [] +test_headers = [] # libmodule_<name>.a for each active module. for name, path in env.module_list.items(): env.modules_sources = [] - if not os.path.isabs(path): - SConscript(name + "/SCsub") # Built-in. - else: - SConscript(path + "/SCsub") # Custom. + # Name for built-in modules, (absolute) path for custom ones. + base_path = path if os.path.isabs(path) else name + SConscript(base_path + "/SCsub") lib = env_modules.add_library("module_%s" % name, env.modules_sources) env.Prepend(LIBS=[lib]) if env["vsproj"]: vs_sources += env.modules_sources + if env["tests"]: + # Lookup potential headers in `tests` subfolder. + import glob + + module_tests = sorted(glob.glob(os.path.join(base_path, "tests", "*.h"))) + if module_tests != []: + test_headers += module_tests + + +# Generate header to be included in `tests/test_main.cpp` to run module-specific tests. +if env["tests"]: + env.Depends("modules_tests.gen.h", test_headers) + env.CommandNoCache( + "modules_tests.gen.h", + test_headers, + env.Run( + modules_builders.generate_modules_tests, + "Generating modules tests header.", + # NOTE: No need to run in subprocess since this is still executed serially. + subprocess=False, + ), + ) + # libmodules.a with only register_module_types. # Must be last so that all libmodule_<name>.a libraries are on the right side # in the linker command. diff --git a/modules/gdnative/nativescript/nativescript.cpp b/modules/gdnative/nativescript/nativescript.cpp index be304a43f0..5d5414c694 100644 --- a/modules/gdnative/nativescript/nativescript.cpp +++ b/modules/gdnative/nativescript/nativescript.cpp @@ -766,7 +766,7 @@ Variant NativeScriptInstance::call(const StringName &p_method, const Variant **p void NativeScriptInstance::notification(int p_notification) { #ifdef DEBUG_ENABLED if (p_notification == MainLoop::NOTIFICATION_CRASH) { - if (current_method_call != StringName("")) { + if (current_method_call != StringName()) { ERR_PRINT("NativeScriptInstance detected crash on method: " + current_method_call); current_method_call = ""; } diff --git a/modules/gdnative/pluginscript/pluginscript_script.cpp b/modules/gdnative/pluginscript/pluginscript_script.cpp index 71ab8ef0a2..ec3c9eb4ff 100644 --- a/modules/gdnative/pluginscript/pluginscript_script.cpp +++ b/modules/gdnative/pluginscript/pluginscript_script.cpp @@ -93,7 +93,7 @@ Variant PluginScript::_new(const Variant **p_args, int p_argcount, Callable::Cal REF ref; Object *owner = nullptr; - if (get_instance_base_type() == "") { + if (get_instance_base_type() == StringName()) { owner = memnew(RefCounted); } else { owner = ClassDB::instantiate(get_instance_base_type()); diff --git a/modules/gdscript/gdscript_analyzer.cpp b/modules/gdscript/gdscript_analyzer.cpp index 9ff52347e9..94daba4bf6 100644 --- a/modules/gdscript/gdscript_analyzer.cpp +++ b/modules/gdscript/gdscript_analyzer.cpp @@ -196,7 +196,7 @@ Error GDScriptAnalyzer::check_class_member_name_conflict(const GDScriptParser::C } if (current_data_type && current_data_type->kind == GDScriptParser::DataType::Kind::NATIVE) { - if (current_data_type->native_type != StringName("")) { + if (current_data_type->native_type != StringName()) { return check_native_member_name_conflict( p_member_name, p_member_node, @@ -250,7 +250,7 @@ Error GDScriptAnalyzer::resolve_inheritance(GDScriptParser::ClassNode *p_class, if (!p_class->extends_used) { result.type_source = GDScriptParser::DataType::ANNOTATED_INFERRED; result.kind = GDScriptParser::DataType::NATIVE; - result.native_type = "RefCounted"; + result.native_type = SNAME("RefCounted"); } else { result.type_source = GDScriptParser::DataType::ANNOTATED_EXPLICIT; @@ -438,7 +438,7 @@ GDScriptParser::DataType GDScriptAnalyzer::resolve_datatype(GDScriptParser::Type StringName first = p_type->type_chain[0]->name; - if (first == "Variant") { + if (first == SNAME("Variant")) { result.kind = GDScriptParser::DataType::VARIANT; if (p_type->type_chain.size() > 1) { push_error(R"("Variant" type don't contain nested types.)", p_type->type_chain[1]); @@ -447,9 +447,9 @@ GDScriptParser::DataType GDScriptAnalyzer::resolve_datatype(GDScriptParser::Type return result; } - if (first == "Object") { + if (first == SNAME("Object")) { result.kind = GDScriptParser::DataType::NATIVE; - result.native_type = "Object"; + result.native_type = SNAME("Object"); if (p_type->type_chain.size() > 1) { push_error(R"("Object" type don't contain nested types.)", p_type->type_chain[1]); return GDScriptParser::DataType(); @@ -2552,7 +2552,7 @@ void GDScriptAnalyzer::reduce_get_node(GDScriptParser::GetNodeNode *p_get_node) GDScriptParser::DataType result; result.type_source = GDScriptParser::DataType::ANNOTATED_EXPLICIT; result.kind = GDScriptParser::DataType::NATIVE; - result.native_type = "Node"; + result.native_type = SNAME("Node"); result.builtin_type = Variant::OBJECT; if (!ClassDB::is_parent_class(parser->current_class->base_type.native_type, result.native_type)) { @@ -3524,7 +3524,7 @@ GDScriptParser::DataType GDScriptAnalyzer::type_from_property(const PropertyInfo result.builtin_type = p_property.type; if (p_property.type == Variant::OBJECT) { result.kind = GDScriptParser::DataType::NATIVE; - result.native_type = p_property.class_name == StringName() ? "Object" : p_property.class_name; + result.native_type = p_property.class_name == StringName() ? SNAME("Object") : p_property.class_name; } else { result.kind = GDScriptParser::DataType::BUILTIN; result.builtin_type = p_property.type; diff --git a/modules/gdscript/gdscript_editor.cpp b/modules/gdscript/gdscript_editor.cpp index 33a88dd2dd..f0dc830ed8 100644 --- a/modules/gdscript/gdscript_editor.cpp +++ b/modules/gdscript/gdscript_editor.cpp @@ -652,7 +652,7 @@ static void _get_directory_contents(EditorFileSystemDirectory *p_dir, Map<String } static void _find_annotation_arguments(const GDScriptParser::AnnotationNode *p_annotation, int p_argument, const String p_quote_style, Map<String, ScriptCodeCompletionOption> &r_result) { - if (p_annotation->name == "@export_range") { + if (p_annotation->name == SNAME("@export_range")) { if (p_argument == 3 || p_argument == 4) { // Slider hint. ScriptCodeCompletionOption slider1("or_greater", ScriptCodeCompletionOption::KIND_PLAIN_TEXT); @@ -662,7 +662,7 @@ static void _find_annotation_arguments(const GDScriptParser::AnnotationNode *p_a slider2.insert_text = slider2.display.quote(p_quote_style); r_result.insert(slider2.display, slider2); } - } else if (p_annotation->name == "@export_exp_easing") { + } else if (p_annotation->name == SNAME("@export_exp_easing")) { if (p_argument == 0 || p_argument == 1) { // Easing hint. ScriptCodeCompletionOption hint1("attenuation", ScriptCodeCompletionOption::KIND_PLAIN_TEXT); @@ -672,7 +672,7 @@ static void _find_annotation_arguments(const GDScriptParser::AnnotationNode *p_a hint2.insert_text = hint2.display.quote(p_quote_style); r_result.insert(hint2.display, hint2); } - } else if (p_annotation->name == "@export_node_path") { + } else if (p_annotation->name == SNAME("@export_node_path")) { ScriptCodeCompletionOption node("Node", ScriptCodeCompletionOption::KIND_CLASS); r_result.insert(node.display, node); List<StringName> node_types; @@ -684,7 +684,7 @@ static void _find_annotation_arguments(const GDScriptParser::AnnotationNode *p_a ScriptCodeCompletionOption option(E, ScriptCodeCompletionOption::KIND_CLASS); r_result.insert(option.display, option); } - } else if (p_annotation->name == "@warning_ignore") { + } else if (p_annotation->name == SNAME("@warning_ignore")) { for (int warning_code = 0; warning_code < GDScriptWarning::WARNING_MAX; warning_code++) { ScriptCodeCompletionOption warning(GDScriptWarning::get_name_from_code((GDScriptWarning::Code)warning_code).to_lower(), ScriptCodeCompletionOption::KIND_PLAIN_TEXT); r_result.insert(warning.display, warning); @@ -1384,7 +1384,7 @@ static bool _guess_expression_type(GDScriptParser::CompletionContext &p_context, Object *baseptr = base.value; - if (all_is_const && String(call->function_name) == "get_node" && ClassDB::is_parent_class(native_type.native_type, "Node") && args.size()) { + if (all_is_const && call->function_name == SNAME("get_node") && ClassDB::is_parent_class(native_type.native_type, SNAME("Node")) && args.size()) { String arg1 = args[0]; if (arg1.begins_with("/root/")) { String which = arg1.get_slice("/", 2); @@ -2085,7 +2085,7 @@ static bool _guess_method_return_type_from_base(GDScriptParser::CompletionContex GDScriptParser::DataType base_type = p_base.type; bool is_static = base_type.is_meta_type; - if (is_static && p_method == "new") { + if (is_static && p_method == SNAME("new")) { r_type.type = base_type; r_type.type.is_meta_type = false; r_type.type.is_constant = false; @@ -2274,7 +2274,7 @@ static void _find_call_arguments(GDScriptParser::CompletionContext &p_context, c r_arghint = _make_arguments_hint(info, p_argidx); } - if (p_argidx == 0 && ClassDB::is_parent_class(class_name, "Node") && (p_method == "get_node" || p_method == "has_node")) { + if (p_argidx == 0 && ClassDB::is_parent_class(class_name, SNAME("Node")) && (p_method == SNAME("get_node") || p_method == SNAME("has_node"))) { // Get autoloads List<PropertyInfo> props; ProjectSettings::get_singleton()->get_property_list(&props); @@ -2291,7 +2291,7 @@ static void _find_call_arguments(GDScriptParser::CompletionContext &p_context, c } } - if (p_argidx == 0 && method_args > 0 && ClassDB::is_parent_class(class_name, "InputEvent") && p_method.operator String().contains("action")) { + if (p_argidx == 0 && method_args > 0 && ClassDB::is_parent_class(class_name, SNAME("InputEvent")) && p_method.operator String().contains("action")) { // Get input actions List<PropertyInfo> props; ProjectSettings::get_singleton()->get_property_list(&props); diff --git a/modules/gdscript/gdscript_parser.cpp b/modules/gdscript/gdscript_parser.cpp index cfad832a6c..8e4e457ec1 100644 --- a/modules/gdscript/gdscript_parser.cpp +++ b/modules/gdscript/gdscript_parser.cpp @@ -519,7 +519,7 @@ void GDScriptParser::parse_program() { // Check for @tool annotation. AnnotationNode *annotation = parse_annotation(AnnotationInfo::SCRIPT | AnnotationInfo::CLASS_LEVEL); if (annotation != nullptr) { - if (annotation->name == "@tool") { + if (annotation->name == SNAME("@tool")) { // TODO: don't allow @tool anywhere else. (Should all script annotations be the first thing?). _is_tool = true; if (previous.type != GDScriptTokenizer::Token::NEWLINE) { @@ -573,7 +573,7 @@ void GDScriptParser::parse_program() { // Check for @icon annotation. AnnotationNode *annotation = parse_annotation(AnnotationInfo::SCRIPT | AnnotationInfo::CLASS_LEVEL); if (annotation != nullptr) { - if (annotation->name == "@icon") { + if (annotation->name == SNAME("@icon")) { if (previous.type != GDScriptTokenizer::Token::NEWLINE) { push_error(R"(Expected newline after "@icon" annotation.)"); } @@ -3503,7 +3503,7 @@ bool GDScriptParser::export_annotations(const AnnotationNode *p_annotation, Node // This is called after the analyzer is done finding the type, so this should be set here. DataType export_type = variable->get_datatype(); - if (p_annotation->name == "@export") { + if (p_annotation->name == SNAME("@export")) { if (variable->datatype_specifier == nullptr && variable->initializer == nullptr) { push_error(R"(Cannot use simple "@export" annotation with variable without type or initializer, since type can't be inferred.)", p_annotation); return false; @@ -3528,7 +3528,7 @@ bool GDScriptParser::export_annotations(const AnnotationNode *p_annotation, Node variable->export_info.hint_string = Variant::get_type_name(export_type.builtin_type); break; case GDScriptParser::DataType::NATIVE: - if (ClassDB::is_parent_class(export_type.native_type, "Resource")) { + if (ClassDB::is_parent_class(export_type.native_type, SNAME("Resource"))) { variable->export_info.type = Variant::OBJECT; variable->export_info.hint = PROPERTY_HINT_RESOURCE_TYPE; variable->export_info.hint_string = export_type.native_type; diff --git a/modules/gdscript/tests/gdscript_test_runner.cpp b/modules/gdscript/tests/gdscript_test_runner.cpp index 73a424dae4..c2bb2caa29 100644 --- a/modules/gdscript/tests/gdscript_test_runner.cpp +++ b/modules/gdscript/tests/gdscript_test_runner.cpp @@ -73,23 +73,21 @@ void init_autoloads() { RES res = ResourceLoader::load(info.path); ERR_CONTINUE_MSG(res.is_null(), "Can't autoload: " + info.path); Node *n = nullptr; - if (res->is_class("PackedScene")) { - Ref<PackedScene> ps = res; - n = ps->instantiate(); - } else if (res->is_class("Script")) { - Ref<Script> script_res = res; - StringName ibt = script_res->get_instance_base_type(); + Ref<PackedScene> scn = res; + Ref<Script> script = res; + if (scn.is_valid()) { + n = scn->instantiate(); + } else if (script.is_valid()) { + StringName ibt = script->get_instance_base_type(); bool valid_type = ClassDB::is_parent_class(ibt, "Node"); ERR_CONTINUE_MSG(!valid_type, "Script does not inherit a Node: " + info.path); Object *obj = ClassDB::instantiate(ibt); - ERR_CONTINUE_MSG(obj == nullptr, - "Cannot instance script for autoload, expected 'Node' inheritance, got: " + - String(ibt)); + ERR_CONTINUE_MSG(!obj, "Cannot instance script for autoload, expected 'Node' inheritance, got: " + String(ibt) + "."); n = Object::cast_to<Node>(obj); - n->set_script(script_res); + n->set_script(script); } ERR_CONTINUE_MSG(!n, "Path in autoload not a node or script: " + info.path); diff --git a/modules/gridmap/grid_map_editor_plugin.cpp b/modules/gridmap/grid_map_editor_plugin.cpp index 3275851b20..84510fc71e 100644 --- a/modules/gridmap/grid_map_editor_plugin.cpp +++ b/modules/gridmap/grid_map_editor_plugin.cpp @@ -1181,7 +1181,7 @@ GridMapEditor::GridMapEditor(EditorNode *p_editor) { floor->set_min(-32767); floor->set_max(32767); floor->set_step(1); - floor->get_line_edit()->add_theme_constant_override(SNAME("minimum_character_width"), 16); + floor->get_line_edit()->add_theme_constant_override("minimum_character_width", 16); spatial_editor_hb->add_child(floor); floor->connect("value_changed", callable_mp(this, &GridMapEditor::_floor_changed)); diff --git a/modules/modules_builders.py b/modules/modules_builders.py index 2243162555..13d5a2075a 100644 --- a/modules/modules_builders.py +++ b/modules/modules_builders.py @@ -14,13 +14,10 @@ def generate_modules_enabled(target, source, env): def generate_modules_tests(target, source, env): import os - import glob with open(target[0].path, "w") as f: - for name, path in env.module_list.items(): - headers = glob.glob(os.path.join(path, "tests", "*.h")) - for h in headers: - f.write('#include "%s"\n' % (os.path.normpath(h))) + for header in source: + f.write('#include "%s"\n' % (os.path.normpath(header.path))) if __name__ == "__main__": diff --git a/modules/mono/glue/GodotSharp/GodotSharp/Core/StringExtensions.cs b/modules/mono/glue/GodotSharp/GodotSharp/Core/StringExtensions.cs index eba0ea9a79..a1f058ffe5 100644 --- a/modules/mono/glue/GodotSharp/GodotSharp/Core/StringExtensions.cs +++ b/modules/mono/glue/GodotSharp/GodotSharp/Core/StringExtensions.cs @@ -266,7 +266,7 @@ namespace Godot /// <returns>The capitalized string.</returns> public static string Capitalize(this string instance) { - string aux = instance.Replace("_", " ").ToLower(); + string aux = instance.CamelcaseToUnderscore(true).Replace("_", " ").Trim(); string cap = string.Empty; for (int i = 0; i < aux.GetSliceCount(" "); i++) @@ -284,6 +284,51 @@ namespace Godot return cap; } + private static string CamelcaseToUnderscore(this string instance, bool lowerCase) + { + string newString = string.Empty; + int startIndex = 0; + + for (int i = 1; i < instance.Length; i++) + { + bool isUpper = char.IsUpper(instance[i]); + bool isNumber = char.IsDigit(instance[i]); + + bool areNext2Lower = false; + bool isNextLower = false; + bool isNextNumber = false; + bool wasPrecedentUpper = char.IsUpper(instance[i - 1]); + bool wasPrecedentNumber = char.IsDigit(instance[i - 1]); + + if (i + 2 < instance.Length) + { + areNext2Lower = char.IsLower(instance[i + 1]) && char.IsLower(instance[i + 2]); + } + + if (i + 1 < instance.Length) + { + isNextLower = char.IsLower(instance[i + 1]); + isNextNumber = char.IsDigit(instance[i + 1]); + } + + bool condA = isUpper && !wasPrecedentUpper && !wasPrecedentNumber; + bool condB = wasPrecedentUpper && isUpper && areNext2Lower; + bool condC = isNumber && !wasPrecedentNumber; + bool canBreakNumberLetter = isNumber && !wasPrecedentNumber && isNextLower; + bool canBreakLetterNumber = !isNumber && wasPrecedentNumber && (isNextLower || isNextNumber); + + bool shouldSplit = condA || condB || condC || canBreakNumberLetter || canBreakLetterNumber; + if (shouldSplit) + { + newString += instance.Substring(startIndex, i - startIndex) + "_"; + startIndex = i; + } + } + + newString += instance.Substring(startIndex, instance.Length - startIndex); + return lowerCase ? newString.ToLower() : newString; + } + /// <summary> /// Performs a case-sensitive comparison to another string, return -1 if less, 0 if equal and +1 if greater. /// </summary> diff --git a/modules/mono/glue/GodotSharp/GodotSharp/Core/Vector2.cs b/modules/mono/glue/GodotSharp/GodotSharp/Core/Vector2.cs index 1f5282e88f..fa7838633c 100644 --- a/modules/mono/glue/GodotSharp/GodotSharp/Core/Vector2.cs +++ b/modules/mono/glue/GodotSharp/GodotSharp/Core/Vector2.cs @@ -512,24 +512,24 @@ namespace Godot /// Returns the result of the spherical linear interpolation between /// this vector and <paramref name="to"/> by amount <paramref name="weight"/>. /// - /// Note: Both vectors must be normalized. + /// This method also handles interpolating the lengths if the input vectors have different lengths. + /// For the special case of one or both input vectors having zero length, this method behaves like [method lerp]. /// </summary> - /// <param name="to">The destination vector for interpolation. Must be normalized.</param> + /// <param name="to">The destination vector for interpolation.</param> /// <param name="weight">A value on the range of 0.0 to 1.0, representing the amount of interpolation.</param> /// <returns>The resulting vector of the interpolation.</returns> public Vector2 Slerp(Vector2 to, real_t weight) { -#if DEBUG - if (!IsNormalized()) - { - throw new InvalidOperationException("Vector2.Slerp: From vector is not normalized."); + real_t startLengthSquared = LengthSquared(); + real_t endLengthSquared = to.LengthSquared(); + if (startLengthSquared == 0.0 || endLengthSquared == 0.0) { + // Zero length vectors have no angle, so the best we can do is either lerp or throw an error. + return Lerp(to, weight); } - if (!to.IsNormalized()) - { - throw new InvalidOperationException($"Vector2.Slerp: `{nameof(to)}` is not normalized."); - } -#endif - return Rotated(AngleTo(to) * weight); + real_t startLength = Mathf.Sqrt(startLengthSquared); + real_t resultLength = Mathf.Lerp(startLength, Mathf.Sqrt(endLengthSquared), weight); + real_t angle = AngleTo(to); + return Rotated(angle * weight) * (resultLength / startLength); } /// <summary> diff --git a/modules/mono/glue/GodotSharp/GodotSharp/Core/Vector3.cs b/modules/mono/glue/GodotSharp/GodotSharp/Core/Vector3.cs index 433a5d9dc9..0faf13f8b7 100644 --- a/modules/mono/glue/GodotSharp/GodotSharp/Core/Vector3.cs +++ b/modules/mono/glue/GodotSharp/GodotSharp/Core/Vector3.cs @@ -549,25 +549,24 @@ namespace Godot /// Returns the result of the spherical linear interpolation between /// this vector and <paramref name="to"/> by amount <paramref name="weight"/>. /// - /// Note: Both vectors must be normalized. + /// This method also handles interpolating the lengths if the input vectors have different lengths. + /// For the special case of one or both input vectors having zero length, this method behaves like [method lerp]. /// </summary> - /// <param name="to">The destination vector for interpolation. Must be normalized.</param> + /// <param name="to">The destination vector for interpolation.</param> /// <param name="weight">A value on the range of 0.0 to 1.0, representing the amount of interpolation.</param> /// <returns>The resulting vector of the interpolation.</returns> public Vector3 Slerp(Vector3 to, real_t weight) { -#if DEBUG - if (!IsNormalized()) - { - throw new InvalidOperationException("Vector3.Slerp: From vector is not normalized."); + real_t startLengthSquared = LengthSquared(); + real_t endLengthSquared = to.LengthSquared(); + if (startLengthSquared == 0.0 || endLengthSquared == 0.0) { + // Zero length vectors have no angle, so the best we can do is either lerp or throw an error. + return Lerp(to, weight); } - if (!to.IsNormalized()) - { - throw new InvalidOperationException($"Vector3.Slerp: `{nameof(to)}` is not normalized."); - } -#endif - real_t theta = AngleTo(to); - return Rotated(Cross(to), theta * weight); + real_t startLength = Mathf.Sqrt(startLengthSquared); + real_t resultLength = Mathf.Lerp(startLength, Mathf.Sqrt(endLengthSquared), weight); + real_t angle = AngleTo(to); + return Rotated(Cross(to).Normalized(), angle * weight) * (resultLength / startLength); } /// <summary> diff --git a/modules/visual_script/editor/visual_script_editor.cpp b/modules/visual_script/editor/visual_script_editor.cpp index 6e3b173fce..5ea8eaff00 100644 --- a/modules/visual_script/editor/visual_script_editor.cpp +++ b/modules/visual_script/editor/visual_script_editor.cpp @@ -653,7 +653,6 @@ void VisualScriptEditor::_update_graph(int p_only_id) { List<int> ids; script->get_node_list(&ids); - StringName editor_icons = "EditorIcons"; for (int &E : ids) { if (p_only_id >= 0 && p_only_id != E) { @@ -713,7 +712,7 @@ void VisualScriptEditor::_update_graph(int p_only_id) { LineEdit *line_edit = memnew(LineEdit); line_edit->set_text(node->get_text()); line_edit->set_expand_to_text_length_enabled(true); - line_edit->add_theme_font_override(SNAME("font"), get_theme_font(SNAME("source"), SNAME("EditorFonts"))); + line_edit->add_theme_font_override("font", get_theme_font(SNAME("source"), SNAME("EditorFonts"))); gnode->add_child(line_edit); line_edit->connect("text_changed", callable_mp(this, &VisualScriptEditor::_expression_text_changed), varray(E)); } else { @@ -743,11 +742,11 @@ void VisualScriptEditor::_update_graph(int p_only_id) { Color c = sbf->get_border_color(); c = ((c.r + c.g + c.b) / 3) < 0.7 ? Color(1.0, 1.0, 1.0, 0.85) : Color(0.0, 0.0, 0.0, 0.85); Color ic = c; - gnode->add_theme_color_override(SNAME("title_color"), c); + gnode->add_theme_color_override("title_color", c); c.a = 1; - gnode->add_theme_color_override(SNAME("close_color"), c); - gnode->add_theme_color_override(SNAME("resizer_color"), ic); - gnode->add_theme_style_override(SNAME("frame"), sbf); + gnode->add_theme_color_override("close_color", c); + gnode->add_theme_color_override("resizer_color", ic); + gnode->add_theme_style_override("frame", sbf); } const Color mono_color = get_theme_color(SNAME("mono_color"), SNAME("Editor")); @@ -2661,7 +2660,7 @@ Ref<Texture2D> VisualScriptEditor::get_theme_icon() { icon_name += "Internal"; } - if (Control::has_theme_icon(icon_name, SNAME("EditorIcons"))) { + if (Control::has_theme_icon(icon_name, "EditorIcons")) { return Control::get_theme_icon(icon_name, SNAME("EditorIcons")); } @@ -3931,13 +3930,13 @@ void VisualScriptEditor::_notification(int p_what) { update_toggle_scripts_button(); - edit_variable_edit->add_theme_style_override(SNAME("bg"), get_theme_stylebox(SNAME("bg"), SNAME("Tree"))); - edit_signal_edit->add_theme_style_override(SNAME("bg"), get_theme_stylebox(SNAME("bg"), SNAME("Tree"))); - func_input_scroll->add_theme_style_override(SNAME("bg"), get_theme_stylebox(SNAME("bg"), SNAME("Tree"))); + edit_variable_edit->add_theme_style_override("bg", get_theme_stylebox(SNAME("bg"), SNAME("Tree"))); + edit_signal_edit->add_theme_style_override("bg", get_theme_stylebox(SNAME("bg"), SNAME("Tree"))); + func_input_scroll->add_theme_style_override("bg", get_theme_stylebox(SNAME("bg"), SNAME("Tree"))); Ref<Theme> tm = EditorNode::get_singleton()->get_theme_base()->get_theme(); - bool dark_theme = tm->get_constant(SNAME("dark_theme"), SNAME("Editor")); + bool dark_theme = tm->get_constant("dark_theme", "Editor"); if (dark_theme) { node_colors["flow_control"] = Color(0.96, 0.96, 0.96); diff --git a/modules/visual_script/editor/visual_script_property_selector.cpp b/modules/visual_script/editor/visual_script_property_selector.cpp index 8913b88d1a..bba5410629 100644 --- a/modules/visual_script/editor/visual_script_property_selector.cpp +++ b/modules/visual_script/editor/visual_script_property_selector.cpp @@ -46,7 +46,7 @@ void VisualScriptPropertySelector::_update_icons() { search_box->set_right_icon(results_tree->get_theme_icon(SNAME("Search"), SNAME("EditorIcons"))); search_box->set_clear_button_enabled(true); - search_box->add_theme_icon_override(SNAME("right_icon"), results_tree->get_theme_icon(SNAME("Search"), SNAME("EditorIcons"))); + search_box->add_theme_icon_override("right_icon", results_tree->get_theme_icon(SNAME("Search"), SNAME("EditorIcons"))); search_visual_script_nodes->set_icon(results_tree->get_theme_icon(SNAME("VisualScript"), SNAME("EditorIcons"))); search_classes->set_icon(results_tree->get_theme_icon(SNAME("Object"), SNAME("EditorIcons"))); @@ -1142,11 +1142,11 @@ TreeItem *VisualScriptPropertySelector::SearchRunner::_create_class_item(TreeIte } else { if (p_doc->name.is_quoted()) { text_0 = p_doc->name.unquote().get_file(); - if (ui_service->has_theme_icon(p_doc->inherits, SNAME("EditorIcons"))) { - icon = ui_service->get_theme_icon(p_doc->inherits, SNAME("EditorIcons")); + if (ui_service->has_theme_icon(p_doc->inherits, "EditorIcons")) { + icon = ui_service->get_theme_icon(p_doc->inherits, "EditorIcons"); } - } else if (ui_service->has_theme_icon(p_doc->name, SNAME("EditorIcons"))) { - icon = ui_service->get_theme_icon(p_doc->name, SNAME("EditorIcons")); + } else if (ui_service->has_theme_icon(p_doc->name, "EditorIcons")) { + icon = ui_service->get_theme_icon(p_doc->name, "EditorIcons"); } else if (ClassDB::class_exists(p_doc->name) && ClassDB::is_parent_class(p_doc->name, "Object")) { icon = ui_service->get_theme_icon(SNAME("Object"), SNAME("EditorIcons")); } diff --git a/modules/visual_script/visual_script.cpp b/modules/visual_script/visual_script.cpp index fbdf3a654b..88445f2f98 100644 --- a/modules/visual_script/visual_script.cpp +++ b/modules/visual_script/visual_script.cpp @@ -1164,9 +1164,6 @@ void VisualScript::_bind_methods() { ClassDB::bind_method(D_METHOD("remove_custom_signal", "name"), &VisualScript::remove_custom_signal); ClassDB::bind_method(D_METHOD("rename_custom_signal", "name", "new_name"), &VisualScript::rename_custom_signal); - //ClassDB::bind_method(D_METHOD("set_variable_info","name","info"),&VScript::set_variable_info); - //ClassDB::bind_method(D_METHOD("get_variable_info","name"),&VScript::set_variable_info); - ClassDB::bind_method(D_METHOD("set_instance_base_type", "type"), &VisualScript::set_instance_base_type); ClassDB::bind_method(D_METHOD("_set_data", "data"), &VisualScript::_set_data); diff --git a/modules/visual_script/visual_script_nodes.cpp b/modules/visual_script/visual_script_nodes.cpp index f3594e5164..e7f4e542c1 100644 --- a/modules/visual_script/visual_script_nodes.cpp +++ b/modules/visual_script/visual_script_nodes.cpp @@ -2495,7 +2495,7 @@ static Node *_find_script_node(Node *p_edited_scene, Node *p_current_node, const VisualScriptSceneNode::TypeGuess VisualScriptSceneNode::guess_output_type(TypeGuess *p_inputs, int p_output) const { VisualScriptSceneNode::TypeGuess tg; tg.type = Variant::OBJECT; - tg.gdclass = "Node"; + tg.gdclass = SNAME("Node"); #ifdef TOOLS_ENABLED Ref<Script> script = get_visual_script(); @@ -2649,7 +2649,7 @@ VisualScriptNodeInstance *VisualScriptSceneTree::instantiate(VisualScriptInstanc VisualScriptSceneTree::TypeGuess VisualScriptSceneTree::guess_output_type(TypeGuess *p_inputs, int p_output) const { TypeGuess tg; tg.type = Variant::OBJECT; - tg.gdclass = "SceneTree"; + tg.gdclass = SNAME("SceneTree"); return tg; } @@ -2766,11 +2766,11 @@ PropertyInfo VisualScriptSelf::get_input_value_port_info(int p_idx) const { } PropertyInfo VisualScriptSelf::get_output_value_port_info(int p_idx) const { - String type_name; + StringName type_name; if (get_visual_script().is_valid()) { type_name = get_visual_script()->get_instance_base_type(); } else { - type_name = "instance"; + type_name = SNAME("instance"); } return PropertyInfo(Variant::OBJECT, type_name); @@ -2801,7 +2801,7 @@ VisualScriptNodeInstance *VisualScriptSelf::instantiate(VisualScriptInstance *p_ VisualScriptSelf::TypeGuess VisualScriptSelf::guess_output_type(TypeGuess *p_inputs, int p_output) const { VisualScriptSceneNode::TypeGuess tg; tg.type = Variant::OBJECT; - tg.gdclass = "Object"; + tg.gdclass = SNAME("Object"); Ref<Script> script = get_visual_script(); if (!script.is_valid()) { diff --git a/platform/linuxbsd/display_server_x11.cpp b/platform/linuxbsd/display_server_x11.cpp index c3b44f348c..bf9c9b1766 100644 --- a/platform/linuxbsd/display_server_x11.cpp +++ b/platform/linuxbsd/display_server_x11.cpp @@ -1835,7 +1835,7 @@ void DisplayServerX11::_set_wm_fullscreen(WindowID p_window, bool p_enabled) { Hints hints; Atom property; hints.flags = 2; - hints.decorations = window_get_flag(WINDOW_FLAG_BORDERLESS, p_window) ? 0 : 1; + hints.decorations = wd.borderless ? 0 : 1; property = XInternAtom(x11_display, "_MOTIF_WM_HINTS", True); if (property != None) { XChangeProperty(x11_display, wd.x11_window, property, property, 32, PropModeReplace, (unsigned char *)&hints, 5); diff --git a/platform/linuxbsd/joypad_linux.cpp b/platform/linuxbsd/joypad_linux.cpp index 5eda42fea6..8e963238e3 100644 --- a/platform/linuxbsd/joypad_linux.cpp +++ b/platform/linuxbsd/joypad_linux.cpp @@ -333,8 +333,9 @@ void JoypadLinux::open_joypad(const char *p_path) { } // Check if the device supports basic gamepad events - if (!(test_bit(EV_KEY, evbit) && test_bit(EV_ABS, evbit) && - test_bit(ABS_X, absbit) && test_bit(ABS_Y, absbit))) { + bool has_abs_left = (test_bit(ABS_X, absbit) && test_bit(ABS_Y, absbit)); + bool has_abs_right = (test_bit(ABS_RX, absbit) && test_bit(ABS_RY, absbit)); + if (!(test_bit(EV_KEY, evbit) && test_bit(EV_ABS, evbit) && (has_abs_left || has_abs_right))) { close(fd); return; } diff --git a/platform/osx/detect.py b/platform/osx/detect.py index e7fe37d4b5..0ff93bedb4 100644 --- a/platform/osx/detect.py +++ b/platform/osx/detect.py @@ -78,9 +78,9 @@ def configure(env): env["osxcross"] = True if env["arch"] == "arm64": - print("Building for macOS 11.00+, platform arm64.") - env.Append(CCFLAGS=["-arch", "arm64", "-mmacosx-version-min=11.00"]) - env.Append(LINKFLAGS=["-arch", "arm64", "-mmacosx-version-min=11.00"]) + print("Building for macOS 11.0+, platform arm64.") + env.Append(CCFLAGS=["-arch", "arm64", "-mmacosx-version-min=11.0"]) + env.Append(LINKFLAGS=["-arch", "arm64", "-mmacosx-version-min=11.0"]) else: print("Building for macOS 10.12+, platform x86_64.") env.Append(CCFLAGS=["-arch", "x86_64", "-mmacosx-version-min=10.12"]) diff --git a/platform/osx/display_server_osx.mm b/platform/osx/display_server_osx.mm index ba10d7593f..2691664b96 100644 --- a/platform/osx/display_server_osx.mm +++ b/platform/osx/display_server_osx.mm @@ -125,6 +125,7 @@ DisplayServerOSX::WindowID DisplayServerOSX::_create_window(WindowMode p_mode, V backing:NSBackingStoreBuffered defer:NO]; ERR_FAIL_COND_V_MSG(wd.window_object == nil, INVALID_WINDOW_ID, "Can't create a window"); + [wd.window_object setWindowID:window_id_counter]; wd.window_view = [[GodotContentView alloc] init]; ERR_FAIL_COND_V_MSG(wd.window_view == nil, INVALID_WINDOW_ID, "Can't create a window view"); diff --git a/platform/osx/godot_window.mm b/platform/osx/godot_window.mm index e392cfb384..772a2ddb9f 100644 --- a/platform/osx/godot_window.mm +++ b/platform/osx/godot_window.mm @@ -45,7 +45,7 @@ } - (BOOL)canBecomeKeyWindow { - // Required for NSBorderlessWindowMask windows. + // Required for NSWindowStyleMaskBorderless windows. DisplayServerOSX *ds = (DisplayServerOSX *)DisplayServer::get_singleton(); if (!ds || !ds->has_window(window_id)) { return YES; @@ -56,7 +56,7 @@ } - (BOOL)canBecomeMainWindow { - // Required for NSBorderlessWindowMask windows. + // Required for NSWindowStyleMaskBorderless windows. DisplayServerOSX *ds = (DisplayServerOSX *)DisplayServer::get_singleton(); if (!ds || !ds->has_window(window_id)) { return YES; diff --git a/platform/windows/display_server_windows.cpp b/platform/windows/display_server_windows.cpp index 21ab9923a2..20268b3f6a 100644 --- a/platform/windows/display_server_windows.cpp +++ b/platform/windows/display_server_windows.cpp @@ -2710,12 +2710,17 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA case WM_WINDOWPOSCHANGED: { Rect2i window_client_rect; + Rect2i window_rect; { RECT rect; GetClientRect(hWnd, &rect); ClientToScreen(hWnd, (POINT *)&rect.left); ClientToScreen(hWnd, (POINT *)&rect.right); window_client_rect = Rect2i(rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top); + + RECT wrect; + GetWindowRect(hWnd, &wrect); + window_rect = Rect2i(wrect.left, wrect.top, wrect.right - wrect.left, wrect.bottom - wrect.top); } WINDOWPOS *window_pos_params = (WINDOWPOS *)lParam; @@ -2735,7 +2740,7 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA window.minimized = true; } else if (IsZoomed(hWnd)) { window.maximized = true; - } else if (window_client_rect.position == screen_position && window_client_rect.size == screen_size) { + } else if (window_rect.position == screen_position && window_rect.size == screen_size) { window.fullscreen = true; } diff --git a/scene/2d/navigation_region_2d.cpp b/scene/2d/navigation_region_2d.cpp index 4bead978f1..e685ad8f67 100644 --- a/scene/2d/navigation_region_2d.cpp +++ b/scene/2d/navigation_region_2d.cpp @@ -104,8 +104,8 @@ void NavigationPolygon::_set_polygons(const TypedArray<Vector<int32_t>> &p_array } } -Array NavigationPolygon::_get_polygons() const { - Array ret; +TypedArray<Vector<int32_t>> NavigationPolygon::_get_polygons() const { + TypedArray<Vector<int32_t>> ret; ret.resize(polygons.size()); for (int i = 0; i < ret.size(); i++) { ret[i] = polygons[i].indices; @@ -122,8 +122,8 @@ void NavigationPolygon::_set_outlines(const TypedArray<Vector<Vector2>> &p_array rect_cache_dirty = true; } -Array NavigationPolygon::_get_outlines() const { - Array ret; +TypedArray<Vector<Vector2>> NavigationPolygon::_get_outlines() const { + TypedArray<Vector<Vector2>> ret; ret.resize(outlines.size()); for (int i = 0; i < ret.size(); i++) { ret[i] = outlines[i]; diff --git a/scene/2d/navigation_region_2d.h b/scene/2d/navigation_region_2d.h index 012debb584..487a578401 100644 --- a/scene/2d/navigation_region_2d.h +++ b/scene/2d/navigation_region_2d.h @@ -55,10 +55,10 @@ protected: static void _bind_methods(); void _set_polygons(const TypedArray<Vector<int32_t>> &p_array); - Array _get_polygons() const; + TypedArray<Vector<int32_t>> _get_polygons() const; void _set_outlines(const TypedArray<Vector<Vector2>> &p_array); - Array _get_outlines() const; + TypedArray<Vector<Vector2>> _get_outlines() const; public: #ifdef TOOLS_ENABLED diff --git a/scene/2d/ray_cast_2d.cpp b/scene/2d/ray_cast_2d.cpp index 9521667854..51b3e676f9 100644 --- a/scene/2d/ray_cast_2d.cpp +++ b/scene/2d/ray_cast_2d.cpp @@ -279,6 +279,13 @@ void RayCast2D::remove_exception(const CollisionObject2D *p_node) { void RayCast2D::clear_exceptions() { exclude.clear(); + + if (exclude_parent_body && is_inside_tree()) { + CollisionObject2D *parent = Object::cast_to<CollisionObject2D>(get_parent()); + if (parent) { + exclude.insert(parent->get_rid()); + } + } } void RayCast2D::set_collide_with_areas(bool p_enabled) { diff --git a/scene/3d/ray_cast_3d.cpp b/scene/3d/ray_cast_3d.cpp index b71c54dcf9..b251aa38ba 100644 --- a/scene/3d/ray_cast_3d.cpp +++ b/scene/3d/ray_cast_3d.cpp @@ -259,6 +259,13 @@ void RayCast3D::remove_exception(const CollisionObject3D *p_node) { void RayCast3D::clear_exceptions() { exclude.clear(); + + if (exclude_parent_body && is_inside_tree()) { + CollisionObject3D *parent = Object::cast_to<CollisionObject3D>(get_parent()); + if (parent) { + exclude.insert(parent->get_rid()); + } + } } void RayCast3D::set_collide_with_areas(bool p_enabled) { diff --git a/scene/gui/box_container.cpp b/scene/gui/box_container.cpp index 3261fc9d7b..9827bd0cef 100644 --- a/scene/gui/box_container.cpp +++ b/scene/gui/box_container.cpp @@ -353,7 +353,7 @@ MarginContainer *VBoxContainer::add_margin_child(const String &p_label, Control l->set_text(p_label); add_child(l); MarginContainer *mc = memnew(MarginContainer); - mc->add_theme_constant_override(SNAME("margin_left"), 0); + mc->add_theme_constant_override("margin_left", 0); mc->add_child(p_control, true); add_child(mc); if (p_expand) { diff --git a/scene/gui/button.cpp b/scene/gui/button.cpp index 65bfb463f0..3ed1b873af 100644 --- a/scene/gui/button.cpp +++ b/scene/gui/button.cpp @@ -127,7 +127,7 @@ void Button::_notification(int p_what) { } break; case DRAW_HOVER_PRESSED: { // Edge case for CheckButton and CheckBox. - if (has_theme_stylebox(SNAME("hover_pressed"))) { + if (has_theme_stylebox("hover_pressed")) { if (rtl && has_theme_stylebox(SNAME("hover_pressed_mirrored"))) { style = get_theme_stylebox(SNAME("hover_pressed_mirrored")); } else { diff --git a/scene/gui/color_picker.cpp b/scene/gui/color_picker.cpp index 4cc8f53837..36ea843d1e 100644 --- a/scene/gui/color_picker.cpp +++ b/scene/gui/color_picker.cpp @@ -70,7 +70,7 @@ void ColorPicker::_notification(int p_what) { w_edit->set_custom_minimum_size(Size2(get_theme_constant(SNAME("h_width")), 0)); wheel_edit->set_custom_minimum_size(Size2(get_theme_constant(SNAME("sv_width")), get_theme_constant(SNAME("sv_height")))); - wheel_margin->add_theme_constant_override(SNAME("margin_bottom"), 8 * get_theme_default_base_scale()); + wheel_margin->add_theme_constant_override("margin_bottom", 8 * get_theme_default_base_scale()); for (int i = 0; i < 4; i++) { labels[i]->set_custom_minimum_size(Size2(get_theme_constant(SNAME("label_width")), 0)); @@ -191,22 +191,22 @@ void ColorPicker::_update_controls() { if (raw_mode_enabled) { for (int i = 0; i < 3; i++) { - scroll[i]->remove_theme_icon_override(SNAME("grabber")); - scroll[i]->remove_theme_icon_override(SNAME("grabber_highlight")); - scroll[i]->remove_theme_style_override(SNAME("slider")); - scroll[i]->remove_theme_style_override(SNAME("grabber_area")); - scroll[i]->remove_theme_style_override(SNAME("grabber_area_highlight")); + scroll[i]->remove_theme_icon_override("grabber"); + scroll[i]->remove_theme_icon_override("grabber_highlight"); + scroll[i]->remove_theme_style_override("slider"); + scroll[i]->remove_theme_style_override("grabber_area"); + scroll[i]->remove_theme_style_override("grabber_area_highlight"); } } else { Ref<StyleBoxEmpty> style_box_empty(memnew(StyleBoxEmpty)); Ref<Texture2D> bar_arrow = get_theme_icon(SNAME("bar_arrow")); for (int i = 0; i < 4; i++) { - scroll[i]->add_theme_icon_override(SNAME("grabber"), bar_arrow); - scroll[i]->add_theme_icon_override(SNAME("grabber_highlight"), bar_arrow); - scroll[i]->add_theme_style_override(SNAME("slider"), style_box_empty); - scroll[i]->add_theme_style_override(SNAME("grabber_area"), style_box_empty); - scroll[i]->add_theme_style_override(SNAME("grabber_area_highlight"), style_box_empty); + scroll[i]->add_theme_icon_override("grabber", bar_arrow); + scroll[i]->add_theme_icon_override("grabber_highlight", bar_arrow); + scroll[i]->add_theme_style_override("slider", style_box_empty); + scroll[i]->add_theme_style_override("grabber_area", style_box_empty); + scroll[i]->add_theme_style_override("grabber_area_highlight", style_box_empty); } } @@ -1245,7 +1245,7 @@ ColorPicker::ColorPicker() : circle_mat.instantiate(); circle_mat->set_shader(circle_shader); - wheel_margin->add_theme_constant_override(SNAME("margin_bottom"), 8); + wheel_margin->add_theme_constant_override("margin_bottom", 8); wheel_edit->add_child(wheel_margin); wheel_margin->add_child(wheel); diff --git a/scene/gui/dialogs.cpp b/scene/gui/dialogs.cpp index 8a89c983c5..1cbe3adb3c 100644 --- a/scene/gui/dialogs.cpp +++ b/scene/gui/dialogs.cpp @@ -73,7 +73,7 @@ void AcceptDialog::_notification(int p_what) { } } break; case NOTIFICATION_THEME_CHANGED: { - bg->add_theme_style_override(SNAME("panel"), bg->get_theme_stylebox(SNAME("panel"), SNAME("AcceptDialog"))); + bg->add_theme_style_override("panel", bg->get_theme_stylebox(SNAME("panel"), SNAME("AcceptDialog"))); } break; case NOTIFICATION_EXIT_TREE: { if (parent_visible) { diff --git a/scene/gui/file_dialog.cpp b/scene/gui/file_dialog.cpp index 83dc676c55..dad84461f4 100644 --- a/scene/gui/file_dialog.cpp +++ b/scene/gui/file_dialog.cpp @@ -65,30 +65,30 @@ void FileDialog::_theme_changed() { Color font_focus_color = vbox->get_theme_color(SNAME("font_focus_color"), SNAME("Button")); Color font_pressed_color = vbox->get_theme_color(SNAME("font_pressed_color"), SNAME("Button")); - dir_up->add_theme_color_override(SNAME("icon_normal_color"), font_color); - dir_up->add_theme_color_override(SNAME("icon_hover_color"), font_hover_color); - dir_up->add_theme_color_override(SNAME("icon_focus_color"), font_focus_color); - dir_up->add_theme_color_override(SNAME("icon_pressed_color"), font_pressed_color); - - dir_prev->add_theme_color_override(SNAME("icon_color_normal"), font_color); - dir_prev->add_theme_color_override(SNAME("icon_color_hover"), font_hover_color); - dir_prev->add_theme_color_override(SNAME("icon_focus_color"), font_focus_color); - dir_prev->add_theme_color_override(SNAME("icon_color_pressed"), font_pressed_color); - - dir_next->add_theme_color_override(SNAME("icon_color_normal"), font_color); - dir_next->add_theme_color_override(SNAME("icon_color_hover"), font_hover_color); - dir_next->add_theme_color_override(SNAME("icon_focus_color"), font_focus_color); - dir_next->add_theme_color_override(SNAME("icon_color_pressed"), font_pressed_color); - - refresh->add_theme_color_override(SNAME("icon_normal_color"), font_color); - refresh->add_theme_color_override(SNAME("icon_hover_color"), font_hover_color); - refresh->add_theme_color_override(SNAME("icon_focus_color"), font_focus_color); - refresh->add_theme_color_override(SNAME("icon_pressed_color"), font_pressed_color); - - show_hidden->add_theme_color_override(SNAME("icon_normal_color"), font_color); - show_hidden->add_theme_color_override(SNAME("icon_hover_color"), font_hover_color); - show_hidden->add_theme_color_override(SNAME("icon_focus_color"), font_focus_color); - show_hidden->add_theme_color_override(SNAME("icon_pressed_color"), font_pressed_color); + dir_up->add_theme_color_override("icon_normal_color", font_color); + dir_up->add_theme_color_override("icon_hover_color", font_hover_color); + dir_up->add_theme_color_override("icon_focus_color", font_focus_color); + dir_up->add_theme_color_override("icon_pressed_color", font_pressed_color); + + dir_prev->add_theme_color_override("icon_color_normal", font_color); + dir_prev->add_theme_color_override("icon_color_hover", font_hover_color); + dir_prev->add_theme_color_override("icon_focus_color", font_focus_color); + dir_prev->add_theme_color_override("icon_color_pressed", font_pressed_color); + + dir_next->add_theme_color_override("icon_color_normal", font_color); + dir_next->add_theme_color_override("icon_color_hover", font_hover_color); + dir_next->add_theme_color_override("icon_focus_color", font_focus_color); + dir_next->add_theme_color_override("icon_color_pressed", font_pressed_color); + + refresh->add_theme_color_override("icon_normal_color", font_color); + refresh->add_theme_color_override("icon_hover_color", font_hover_color); + refresh->add_theme_color_override("icon_focus_color", font_focus_color); + refresh->add_theme_color_override("icon_pressed_color", font_pressed_color); + + show_hidden->add_theme_color_override("icon_normal_color", font_color); + show_hidden->add_theme_color_override("icon_hover_color", font_hover_color); + show_hidden->add_theme_color_override("icon_focus_color", font_focus_color); + show_hidden->add_theme_color_override("icon_pressed_color", font_pressed_color); } void FileDialog::_notification(int p_what) { diff --git a/scene/gui/option_button.cpp b/scene/gui/option_button.cpp index 31f3b306b7..ad2434cd8b 100644 --- a/scene/gui/option_button.cpp +++ b/scene/gui/option_button.cpp @@ -118,6 +118,11 @@ void OptionButton::_notification(int p_what) { bool OptionButton::_set(const StringName &p_name, const Variant &p_value) { Vector<String> components = String(p_name).split("/", true, 2); if (components.size() >= 2 && components[0] == "popup") { + String property = components[2]; + if (property != "text" && property != "icon" && property != "id" && property != "disabled" && property != "separator") { + return false; + } + bool valid; popup->set(String(p_name).trim_prefix("popup/"), p_value, &valid); @@ -136,6 +141,11 @@ bool OptionButton::_set(const StringName &p_name, const Variant &p_value) { bool OptionButton::_get(const StringName &p_name, Variant &r_ret) const { Vector<String> components = String(p_name).split("/", true, 2); if (components.size() >= 2 && components[0] == "popup") { + String property = components[2]; + if (property != "text" && property != "icon" && property != "id" && property != "disabled" && property != "separator") { + return false; + } + bool valid; r_ret = popup->get(String(p_name).trim_prefix("popup/"), &valid); return valid; @@ -151,14 +161,6 @@ void OptionButton::_get_property_list(List<PropertyInfo> *p_list) const { pi.usage &= ~(popup->get_item_icon(i).is_null() ? PROPERTY_USAGE_STORAGE : 0); p_list->push_back(pi); - pi = PropertyInfo(Variant::INT, vformat("popup/item_%d/checkable", i), PROPERTY_HINT_ENUM, "No,As checkbox,As radio button"); - pi.usage &= ~(!popup->is_item_checkable(i) ? PROPERTY_USAGE_STORAGE : 0); - p_list->push_back(pi); - - pi = PropertyInfo(Variant::BOOL, vformat("popup/item_%d/checked", i)); - pi.usage &= ~(!popup->is_item_checked(i) ? PROPERTY_USAGE_STORAGE : 0); - p_list->push_back(pi); - pi = PropertyInfo(Variant::INT, vformat("popup/item_%d/id", i), PROPERTY_HINT_RANGE, "0,10,1,or_greater"); p_list->push_back(pi); @@ -186,10 +188,13 @@ void OptionButton::pressed() { popup->set_size(Size2(size.width, 0)); // If not triggered by the mouse, start the popup with the checked item selected. - if (popup->get_item_count() > 0 && - ((get_action_mode() == ActionMode::ACTION_MODE_BUTTON_PRESS && Input::get_singleton()->is_action_just_pressed("ui_accept")) || - (get_action_mode() == ActionMode::ACTION_MODE_BUTTON_RELEASE && Input::get_singleton()->is_action_just_released("ui_accept")))) { - popup->set_current_index(current > -1 ? current : 0); + if (popup->get_item_count() > 0) { + if ((get_action_mode() == ActionMode::ACTION_MODE_BUTTON_PRESS && Input::get_singleton()->is_action_just_pressed("ui_accept")) || + (get_action_mode() == ActionMode::ACTION_MODE_BUTTON_RELEASE && Input::get_singleton()->is_action_just_released("ui_accept"))) { + popup->set_current_index(current > -1 ? current : 0); + } else { + popup->scroll_to_item(current > -1 ? current : 0); + } } popup->popup(); @@ -267,7 +272,20 @@ bool OptionButton::is_item_disabled(int p_idx) const { void OptionButton::set_item_count(int p_count) { ERR_FAIL_COND(p_count < 0); + + int count_old = get_item_count(); + if (p_count == count_old) { + return; + } + popup->set_item_count(p_count); + + if (p_count > count_old) { + for (int i = count_old; i < p_count; i++) { + popup->set_item_as_radio_checkable(i, true); + } + } + notify_property_list_changed(); } @@ -297,7 +315,7 @@ void OptionButton::_select(int p_which, bool p_emit) { current = NONE_SELECTED; set_text(""); - set_icon(NULL); + set_icon(nullptr); } else { ERR_FAIL_INDEX(p_which, popup->get_item_count()); diff --git a/scene/gui/popup.cpp b/scene/gui/popup.cpp index 416d847218..7c03fcbb37 100644 --- a/scene/gui/popup.cpp +++ b/scene/gui/popup.cpp @@ -242,9 +242,9 @@ void PopupPanel::_update_child_rects() { void PopupPanel::_notification(int p_what) { if (p_what == NOTIFICATION_THEME_CHANGED) { - panel->add_theme_style_override(SNAME("panel"), get_theme_stylebox(SNAME("panel"), get_class_name())); + panel->add_theme_style_override("panel", get_theme_stylebox(SNAME("panel"), get_class_name())); } else if (p_what == NOTIFICATION_READY || p_what == NOTIFICATION_ENTER_TREE) { - panel->add_theme_style_override(SNAME("panel"), get_theme_stylebox(SNAME("panel"), get_class_name())); + panel->add_theme_style_override("panel", get_theme_stylebox(SNAME("panel"), get_class_name())); _update_child_rects(); } else if (p_what == NOTIFICATION_WM_SIZE_CHANGED) { _update_child_rects(); diff --git a/scene/gui/popup_menu.cpp b/scene/gui/popup_menu.cpp index ca1c8505fe..6e0f1c5198 100644 --- a/scene/gui/popup_menu.cpp +++ b/scene/gui/popup_menu.cpp @@ -108,7 +108,6 @@ Size2 PopupMenu::_get_contents_minimum_size() const { int PopupMenu::_get_item_height(int p_item) const { ERR_FAIL_INDEX_V(p_item, items.size(), 0); - ERR_FAIL_COND_V(p_item < 0, 0); int icon_height = items[p_item].get_icon_size().height; if (items[p_item].checkable_type && !items[p_item].separator) { @@ -141,23 +140,6 @@ int PopupMenu::_get_items_total_height() const { return items_total_height - vsep; } -void PopupMenu::_scroll_to_item(int p_item) { - ERR_FAIL_INDEX(p_item, items.size()); - ERR_FAIL_COND(p_item < 0); - - // Scroll item into view (upwards) - if (items[p_item]._ofs_cache < -control->get_position().y) { - int amnt_over = items[p_item]._ofs_cache + control->get_position().y; - scroll_container->set_v_scroll(scroll_container->get_v_scroll() + amnt_over); - } - - // Scroll item into view (downwards) - if (items[p_item]._ofs_cache + items[p_item]._height_cache > -control->get_position().y + scroll_container->get_size().height) { - int amnt_over = items[p_item]._ofs_cache + items[p_item]._height_cache + control->get_position().y - scroll_container->get_size().height; - scroll_container->set_v_scroll(scroll_container->get_v_scroll() + amnt_over); - } -} - int PopupMenu::_get_mouse_over(const Point2 &p_over) const { if (p_over.x < 0 || p_over.x >= get_size().width) { return -1; @@ -276,7 +258,7 @@ void PopupMenu::gui_input(const Ref<InputEvent> &p_event) { if (!items[i].separator && !items[i].disabled) { mouse_over = i; emit_signal(SNAME("id_focused"), i); - _scroll_to_item(i); + scroll_to_item(i); control->update(); set_input_as_handled(); match_found = true; @@ -290,7 +272,7 @@ void PopupMenu::gui_input(const Ref<InputEvent> &p_event) { if (!items[i].separator && !items[i].disabled) { mouse_over = i; emit_signal(SNAME("id_focused"), i); - _scroll_to_item(i); + scroll_to_item(i); control->update(); set_input_as_handled(); break; @@ -308,7 +290,7 @@ void PopupMenu::gui_input(const Ref<InputEvent> &p_event) { if (!items[i].separator && !items[i].disabled) { mouse_over = i; emit_signal(SNAME("id_focused"), i); - _scroll_to_item(i); + scroll_to_item(i); control->update(); set_input_as_handled(); match_found = true; @@ -322,7 +304,7 @@ void PopupMenu::gui_input(const Ref<InputEvent> &p_event) { if (!items[i].separator && !items[i].disabled) { mouse_over = i; emit_signal(SNAME("id_focused"), i); - _scroll_to_item(i); + scroll_to_item(i); control->update(); set_input_as_handled(); break; @@ -472,7 +454,7 @@ void PopupMenu::gui_input(const Ref<InputEvent> &p_event) { if (items[i].text.findn(search_string) == 0) { mouse_over = i; emit_signal(SNAME("id_focused"), i); - _scroll_to_item(i); + scroll_to_item(i); control->update(); set_input_as_handled(); break; @@ -846,10 +828,10 @@ void PopupMenu::_notification(int p_what) { // Set margin on the margin container Ref<StyleBox> panel_style = get_theme_stylebox(SNAME("panel")); - margin_container->add_theme_constant_override(SNAME("margin_top"), panel_style->get_margin(Side::SIDE_TOP)); - margin_container->add_theme_constant_override(SNAME("margin_bottom"), panel_style->get_margin(Side::SIDE_BOTTOM)); - margin_container->add_theme_constant_override(SNAME("margin_left"), panel_style->get_margin(Side::SIDE_LEFT)); - margin_container->add_theme_constant_override(SNAME("margin_right"), panel_style->get_margin(Side::SIDE_RIGHT)); + margin_container->add_theme_constant_override("margin_top", panel_style->get_margin(Side::SIDE_TOP)); + margin_container->add_theme_constant_override("margin_bottom", panel_style->get_margin(Side::SIDE_BOTTOM)); + margin_container->add_theme_constant_override("margin_left", panel_style->get_margin(Side::SIDE_LEFT)); + margin_container->add_theme_constant_override("margin_right", panel_style->get_margin(Side::SIDE_RIGHT)); } } break; } @@ -1324,7 +1306,7 @@ bool PopupMenu::is_item_shortcut_disabled(int p_idx) const { void PopupMenu::set_current_index(int p_idx) { ERR_FAIL_INDEX(p_idx, items.size()); mouse_over = p_idx; - _scroll_to_item(mouse_over); + scroll_to_item(mouse_over); control->update(); } @@ -1352,6 +1334,20 @@ int PopupMenu::get_item_count() const { return items.size(); } +void PopupMenu::scroll_to_item(int p_item) { + ERR_FAIL_INDEX(p_item, items.size()); + + // Scroll item into view (upwards). + if (items[p_item]._ofs_cache - scroll_container->get_v_scroll() < -control->get_position().y) { + scroll_container->set_v_scroll(items[p_item]._ofs_cache + control->get_position().y); + } + + // Scroll item into view (downwards). + if (items[p_item]._ofs_cache + items[p_item]._height_cache - scroll_container->get_v_scroll() > -control->get_position().y + scroll_container->get_size().height) { + scroll_container->set_v_scroll(items[p_item]._ofs_cache + items[p_item]._height_cache + control->get_position().y); + } +} + bool PopupMenu::activate_item_by_event(const Ref<InputEvent> &p_event, bool p_for_global_only) { Key code = Key::NONE; Ref<InputEventKey> k = p_event; @@ -1625,7 +1621,7 @@ bool PopupMenu::_set(const StringName &p_name, const Variant &p_value) { } else if (property == "id") { set_item_id(item_index, p_value); return true; - } else if (components[1] == "disabled") { + } else if (property == "disabled") { set_item_disabled(item_index, p_value); return true; } else if (property == "separator") { @@ -1698,7 +1694,7 @@ bool PopupMenu::_get(const StringName &p_name, Variant &r_ret) const { } else if (property == "id") { r_ret = get_item_id(item_index); return true; - } else if (components[1] == "disabled") { + } else if (property == "disabled") { r_ret = is_item_disabled(item_index); return true; } else if (property == "separator") { @@ -1804,6 +1800,8 @@ void PopupMenu::_bind_methods() { ClassDB::bind_method(D_METHOD("set_item_count", "count"), &PopupMenu::set_item_count); ClassDB::bind_method(D_METHOD("get_item_count"), &PopupMenu::get_item_count); + ClassDB::bind_method(D_METHOD("scroll_to_item", "index"), &PopupMenu::scroll_to_item); + ClassDB::bind_method(D_METHOD("remove_item", "index"), &PopupMenu::remove_item); ClassDB::bind_method(D_METHOD("add_separator", "label", "id"), &PopupMenu::add_separator, DEFVAL(String()), DEFVAL(-1)); diff --git a/scene/gui/popup_menu.h b/scene/gui/popup_menu.h index 7c2212d82d..5ce55209d4 100644 --- a/scene/gui/popup_menu.h +++ b/scene/gui/popup_menu.h @@ -103,7 +103,6 @@ class PopupMenu : public Popup { int _get_item_height(int p_item) const; int _get_items_total_height() const; - void _scroll_to_item(int p_item); void _shape_item(int p_item); @@ -218,6 +217,8 @@ public: void set_item_count(int p_count); int get_item_count() const; + void scroll_to_item(int p_item); + bool activate_item_by_event(const Ref<InputEvent> &p_event, bool p_for_global_only = false); void activate_item(int p_item); diff --git a/scene/gui/tree.cpp b/scene/gui/tree.cpp index e2c7597f7e..9a6c87276f 100644 --- a/scene/gui/tree.cpp +++ b/scene/gui/tree.cpp @@ -4409,21 +4409,29 @@ Point2 Tree::get_scroll() const { return ofs; } -void Tree::scroll_to_item(TreeItem *p_item) { +void Tree::scroll_to_item(TreeItem *p_item, bool p_center_on_item) { if (!is_visible_in_tree()) { - // hack to work around crash in get_item_rect() if Tree is not in tree. - return; + return; // Hack to work around crash in get_item_rect() if Tree is not in tree. } - // make sure the scrollbar min and max are up to date with latest changes. update_scrollbars(); - const Rect2 r = get_item_rect(p_item); + const real_t tree_height = get_size().y; + const Rect2 item_rect = get_item_rect(p_item); + const real_t item_y = item_rect.position.y; + const real_t item_height = item_rect.size.y + cache.vseparation; - if (r.position.y <= v_scroll->get_value()) { - v_scroll->set_value(r.position.y); - } else if (r.position.y + r.size.y + 2 * cache.vseparation > v_scroll->get_value() + get_size().y) { - v_scroll->set_value(r.position.y + r.size.y + 2 * cache.vseparation - get_size().y); + if (p_center_on_item) { + v_scroll->set_value(item_y - (tree_height - item_height) / 2.0f); + } else { + if (item_y < v_scroll->get_value()) { + v_scroll->set_value(item_y); + } else { + const real_t new_position = item_y + item_height - tree_height; + if (new_position > v_scroll->get_value()) { + v_scroll->set_value(new_position); + } + } } } @@ -4868,7 +4876,7 @@ void Tree::_bind_methods() { ClassDB::bind_method(D_METHOD("get_column_title_language", "column"), &Tree::get_column_title_language); ClassDB::bind_method(D_METHOD("get_scroll"), &Tree::get_scroll); - ClassDB::bind_method(D_METHOD("scroll_to_item", "item"), &Tree::scroll_to_item); + ClassDB::bind_method(D_METHOD("scroll_to_item", "item", "center_on_item"), &Tree::scroll_to_item, DEFVAL(false)); ClassDB::bind_method(D_METHOD("set_h_scroll_enabled", "h_scroll"), &Tree::set_h_scroll_enabled); ClassDB::bind_method(D_METHOD("is_h_scroll_enabled"), &Tree::is_h_scroll_enabled); @@ -4941,7 +4949,7 @@ Tree::Tree() { add_child(popup_editor, false, INTERNAL_MODE_FRONT); popup_editor_vb = memnew(VBoxContainer); popup_editor->add_child(popup_editor_vb); - popup_editor_vb->add_theme_constant_override(SNAME("separation"), 0); + popup_editor_vb->add_theme_constant_override("separation", 0); popup_editor_vb->set_anchors_and_offsets_preset(PRESET_WIDE); text_editor = memnew(LineEdit); popup_editor_vb->add_child(text_editor); diff --git a/scene/gui/tree.h b/scene/gui/tree.h index c24763a0e4..255a4f0576 100644 --- a/scene/gui/tree.h +++ b/scene/gui/tree.h @@ -682,7 +682,7 @@ public: TreeItem *get_item_with_text(const String &p_find) const; Point2 get_scroll() const; - void scroll_to_item(TreeItem *p_item); + void scroll_to_item(TreeItem *p_item, bool p_center_on_item = false); void set_h_scroll_enabled(bool p_enable); bool is_h_scroll_enabled() const; void set_v_scroll_enabled(bool p_enable); diff --git a/scene/resources/default_theme/default_theme.cpp b/scene/resources/default_theme/default_theme.cpp index c77efcc6db..670b141080 100644 --- a/scene/resources/default_theme/default_theme.cpp +++ b/scene/resources/default_theme/default_theme.cpp @@ -139,8 +139,8 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, Ref<Te } // Panel - theme->set_stylebox(SNAME("panel"), SNAME("Panel"), make_flat_stylebox(style_normal_color, 0, 0, 0, 0)); - theme->set_stylebox(SNAME("panel_fg"), SNAME("Panel"), make_flat_stylebox(style_normal_color, 0, 0, 0, 0)); + theme->set_stylebox("panel", "Panel", make_flat_stylebox(style_normal_color, 0, 0, 0, 0)); + theme->set_stylebox("panel_fg", "Panel", make_flat_stylebox(style_normal_color, 0, 0, 0, 0)); // Button @@ -152,108 +152,108 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, Ref<Te // Make the focus outline appear to be flush with the buttons it's focusing. focus->set_expand_margin_size_all(2 * scale); - theme->set_stylebox(SNAME("normal"), SNAME("Button"), button_normal); - theme->set_stylebox(SNAME("hover"), SNAME("Button"), button_hover); - theme->set_stylebox(SNAME("pressed"), SNAME("Button"), button_pressed); - theme->set_stylebox(SNAME("disabled"), SNAME("Button"), button_disabled); - theme->set_stylebox(SNAME("focus"), SNAME("Button"), focus); - - theme->set_font(SNAME("font"), SNAME("Button"), Ref<Font>()); - theme->set_font_size(SNAME("font_size"), SNAME("Button"), -1); - theme->set_constant(SNAME("outline_size"), SNAME("Button"), 0 * scale); - - theme->set_color(SNAME("font_color"), SNAME("Button"), control_font_color); - theme->set_color(SNAME("font_pressed_color"), SNAME("Button"), control_font_pressed_color); - theme->set_color(SNAME("font_hover_color"), SNAME("Button"), control_font_hover_color); - theme->set_color(SNAME("font_focus_color"), SNAME("Button"), control_font_focus_color); - theme->set_color(SNAME("font_hover_pressed_color"), SNAME("Button"), control_font_pressed_color); - theme->set_color(SNAME("font_disabled_color"), SNAME("Button"), control_font_disabled_color); - theme->set_color(SNAME("font_outline_color"), SNAME("Button"), Color(1, 1, 1)); - - theme->set_color(SNAME("icon_normal_color"), SNAME("Button"), Color(1, 1, 1, 1)); - theme->set_color(SNAME("icon_pressed_color"), SNAME("Button"), Color(1, 1, 1, 1)); - theme->set_color(SNAME("icon_hover_color"), SNAME("Button"), Color(1, 1, 1, 1)); - theme->set_color(SNAME("icon_hover_pressed_color"), SNAME("Button"), Color(1, 1, 1, 1)); - theme->set_color(SNAME("icon_focus_color"), SNAME("Button"), Color(1, 1, 1, 1)); - theme->set_color(SNAME("icon_disabled_color"), SNAME("Button"), Color(1, 1, 1, 1)); - - theme->set_constant(SNAME("hseparation"), SNAME("Button"), 2 * scale); + theme->set_stylebox("normal", "Button", button_normal); + theme->set_stylebox("hover", "Button", button_hover); + theme->set_stylebox("pressed", "Button", button_pressed); + theme->set_stylebox("disabled", "Button", button_disabled); + theme->set_stylebox("focus", "Button", focus); + + theme->set_font("font", "Button", Ref<Font>()); + theme->set_font_size("font_size", "Button", -1); + theme->set_constant("outline_size", "Button", 0 * scale); + + theme->set_color("font_color", "Button", control_font_color); + theme->set_color("font_pressed_color", "Button", control_font_pressed_color); + theme->set_color("font_hover_color", "Button", control_font_hover_color); + theme->set_color("font_focus_color", "Button", control_font_focus_color); + theme->set_color("font_hover_pressed_color", "Button", control_font_pressed_color); + theme->set_color("font_disabled_color", "Button", control_font_disabled_color); + theme->set_color("font_outline_color", "Button", Color(1, 1, 1)); + + theme->set_color("icon_normal_color", "Button", Color(1, 1, 1, 1)); + theme->set_color("icon_pressed_color", "Button", Color(1, 1, 1, 1)); + theme->set_color("icon_hover_color", "Button", Color(1, 1, 1, 1)); + theme->set_color("icon_hover_pressed_color", "Button", Color(1, 1, 1, 1)); + theme->set_color("icon_focus_color", "Button", Color(1, 1, 1, 1)); + theme->set_color("icon_disabled_color", "Button", Color(1, 1, 1, 1)); + + theme->set_constant("hseparation", "Button", 2 * scale); // LinkButton - theme->set_stylebox(SNAME("focus"), SNAME("LinkButton"), focus); + theme->set_stylebox("focus", "LinkButton", focus); - theme->set_font(SNAME("font"), SNAME("LinkButton"), Ref<Font>()); - theme->set_font_size(SNAME("font_size"), SNAME("LinkButton"), -1); + theme->set_font("font", "LinkButton", Ref<Font>()); + theme->set_font_size("font_size", "LinkButton", -1); - theme->set_color(SNAME("font_color"), SNAME("LinkButton"), control_font_color); - theme->set_color(SNAME("font_pressed_color"), SNAME("LinkButton"), control_font_pressed_color); - theme->set_color(SNAME("font_hover_color"), SNAME("LinkButton"), control_font_hover_color); - theme->set_color(SNAME("font_focus_color"), SNAME("LinkButton"), control_font_focus_color); - theme->set_color(SNAME("font_outline_color"), SNAME("LinkButton"), Color(1, 1, 1)); + theme->set_color("font_color", "LinkButton", control_font_color); + theme->set_color("font_pressed_color", "LinkButton", control_font_pressed_color); + theme->set_color("font_hover_color", "LinkButton", control_font_hover_color); + theme->set_color("font_focus_color", "LinkButton", control_font_focus_color); + theme->set_color("font_outline_color", "LinkButton", Color(1, 1, 1)); - theme->set_constant(SNAME("outline_size"), SNAME("LinkButton"), 0); - theme->set_constant(SNAME("underline_spacing"), SNAME("LinkButton"), 2 * scale); + theme->set_constant("outline_size", "LinkButton", 0); + theme->set_constant("underline_spacing", "LinkButton", 2 * scale); // OptionButton - theme->set_stylebox(SNAME("focus"), SNAME("OptionButton"), focus); + theme->set_stylebox("focus", "OptionButton", focus); Ref<StyleBox> sb_optbutton_normal = make_flat_stylebox(style_normal_color, 2 * default_margin, default_margin, 21, default_margin); Ref<StyleBox> sb_optbutton_hover = make_flat_stylebox(style_hover_color, 2 * default_margin, default_margin, 21, default_margin); Ref<StyleBox> sb_optbutton_pressed = make_flat_stylebox(style_pressed_color, 2 * default_margin, default_margin, 21, default_margin); Ref<StyleBox> sb_optbutton_disabled = make_flat_stylebox(style_disabled_color, 2 * default_margin, default_margin, 21, default_margin); - theme->set_stylebox(SNAME("normal"), SNAME("OptionButton"), sb_optbutton_normal); - theme->set_stylebox(SNAME("hover"), SNAME("OptionButton"), sb_optbutton_hover); - theme->set_stylebox(SNAME("pressed"), SNAME("OptionButton"), sb_optbutton_pressed); - theme->set_stylebox(SNAME("disabled"), SNAME("OptionButton"), sb_optbutton_disabled); + theme->set_stylebox("normal", "OptionButton", sb_optbutton_normal); + theme->set_stylebox("hover", "OptionButton", sb_optbutton_hover); + theme->set_stylebox("pressed", "OptionButton", sb_optbutton_pressed); + theme->set_stylebox("disabled", "OptionButton", sb_optbutton_disabled); Ref<StyleBox> sb_optbutton_normal_mirrored = make_flat_stylebox(style_normal_color, 21, default_margin, 2 * default_margin, default_margin); Ref<StyleBox> sb_optbutton_hover_mirrored = make_flat_stylebox(style_hover_color, 21, default_margin, 2 * default_margin, default_margin); Ref<StyleBox> sb_optbutton_pressed_mirrored = make_flat_stylebox(style_pressed_color, 21, default_margin, 2 * default_margin, default_margin); Ref<StyleBox> sb_optbutton_disabled_mirrored = make_flat_stylebox(style_disabled_color, 21, default_margin, 2 * default_margin, default_margin); - theme->set_stylebox(SNAME("normal_mirrored"), SNAME("OptionButton"), sb_optbutton_normal_mirrored); - theme->set_stylebox(SNAME("hover_mirrored"), SNAME("OptionButton"), sb_optbutton_hover_mirrored); - theme->set_stylebox(SNAME("pressed_mirrored"), SNAME("OptionButton"), sb_optbutton_pressed_mirrored); - theme->set_stylebox(SNAME("disabled_mirrored"), SNAME("OptionButton"), sb_optbutton_disabled_mirrored); + theme->set_stylebox("normal_mirrored", "OptionButton", sb_optbutton_normal_mirrored); + theme->set_stylebox("hover_mirrored", "OptionButton", sb_optbutton_hover_mirrored); + theme->set_stylebox("pressed_mirrored", "OptionButton", sb_optbutton_pressed_mirrored); + theme->set_stylebox("disabled_mirrored", "OptionButton", sb_optbutton_disabled_mirrored); - theme->set_icon(SNAME("arrow"), SNAME("OptionButton"), icons["option_button_arrow"]); + theme->set_icon("arrow", "OptionButton", icons["option_button_arrow"]); - theme->set_font(SNAME("font"), SNAME("OptionButton"), Ref<Font>()); - theme->set_font_size(SNAME("font_size"), SNAME("OptionButton"), -1); + theme->set_font("font", "OptionButton", Ref<Font>()); + theme->set_font_size("font_size", "OptionButton", -1); - theme->set_color(SNAME("font_color"), SNAME("OptionButton"), control_font_color); - theme->set_color(SNAME("font_pressed_color"), SNAME("OptionButton"), control_font_pressed_color); - theme->set_color(SNAME("font_hover_color"), SNAME("OptionButton"), control_font_hover_color); - theme->set_color(SNAME("font_focus_color"), SNAME("OptionButton"), control_font_focus_color); - theme->set_color(SNAME("font_disabled_color"), SNAME("OptionButton"), control_font_disabled_color); - theme->set_color(SNAME("font_outline_color"), SNAME("OptionButton"), Color(1, 1, 1)); + theme->set_color("font_color", "OptionButton", control_font_color); + theme->set_color("font_pressed_color", "OptionButton", control_font_pressed_color); + theme->set_color("font_hover_color", "OptionButton", control_font_hover_color); + theme->set_color("font_focus_color", "OptionButton", control_font_focus_color); + theme->set_color("font_disabled_color", "OptionButton", control_font_disabled_color); + theme->set_color("font_outline_color", "OptionButton", Color(1, 1, 1)); - theme->set_constant(SNAME("hseparation"), SNAME("OptionButton"), 2 * scale); - theme->set_constant(SNAME("arrow_margin"), SNAME("OptionButton"), 4 * scale); - theme->set_constant(SNAME("outline_size"), SNAME("OptionButton"), 0); + theme->set_constant("hseparation", "OptionButton", 2 * scale); + theme->set_constant("arrow_margin", "OptionButton", 4 * scale); + theme->set_constant("outline_size", "OptionButton", 0); // MenuButton - theme->set_stylebox(SNAME("normal"), SNAME("MenuButton"), button_normal); - theme->set_stylebox(SNAME("pressed"), SNAME("MenuButton"), button_pressed); - theme->set_stylebox(SNAME("hover"), SNAME("MenuButton"), button_hover); - theme->set_stylebox(SNAME("disabled"), SNAME("MenuButton"), button_disabled); - theme->set_stylebox(SNAME("focus"), SNAME("MenuButton"), focus); + theme->set_stylebox("normal", "MenuButton", button_normal); + theme->set_stylebox("pressed", "MenuButton", button_pressed); + theme->set_stylebox("hover", "MenuButton", button_hover); + theme->set_stylebox("disabled", "MenuButton", button_disabled); + theme->set_stylebox("focus", "MenuButton", focus); - theme->set_font(SNAME("font"), SNAME("MenuButton"), Ref<Font>()); - theme->set_font_size(SNAME("font_size"), SNAME("MenuButton"), -1); + theme->set_font("font", "MenuButton", Ref<Font>()); + theme->set_font_size("font_size", "MenuButton", -1); - theme->set_color(SNAME("font_color"), SNAME("MenuButton"), control_font_color); - theme->set_color(SNAME("font_pressed_color"), SNAME("MenuButton"), control_font_pressed_color); - theme->set_color(SNAME("font_hover_color"), SNAME("MenuButton"), control_font_hover_color); - theme->set_color(SNAME("font_focus_color"), SNAME("MenuButton"), control_font_focus_color); - theme->set_color(SNAME("font_disabled_color"), SNAME("MenuButton"), Color(1, 1, 1, 0.3)); - theme->set_color(SNAME("font_outline_color"), SNAME("MenuButton"), Color(1, 1, 1)); + theme->set_color("font_color", "MenuButton", control_font_color); + theme->set_color("font_pressed_color", "MenuButton", control_font_pressed_color); + theme->set_color("font_hover_color", "MenuButton", control_font_hover_color); + theme->set_color("font_focus_color", "MenuButton", control_font_focus_color); + theme->set_color("font_disabled_color", "MenuButton", Color(1, 1, 1, 0.3)); + theme->set_color("font_outline_color", "MenuButton", Color(1, 1, 1)); - theme->set_constant(SNAME("hseparation"), SNAME("MenuButton"), 3 * scale); - theme->set_constant(SNAME("outline_size"), SNAME("MenuButton"), 0); + theme->set_constant("hseparation", "MenuButton", 3 * scale); + theme->set_constant("outline_size", "MenuButton", 0); // CheckBox @@ -268,36 +268,36 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, Ref<Te cbx_focus->set_default_margin(SIDE_TOP, 4 * scale); cbx_focus->set_default_margin(SIDE_BOTTOM, 4 * scale); - theme->set_stylebox(SNAME("normal"), SNAME("CheckBox"), cbx_empty); - theme->set_stylebox(SNAME("pressed"), SNAME("CheckBox"), cbx_empty); - theme->set_stylebox(SNAME("disabled"), SNAME("CheckBox"), cbx_empty); - theme->set_stylebox(SNAME("hover"), SNAME("CheckBox"), cbx_empty); - theme->set_stylebox(SNAME("hover_pressed"), SNAME("CheckBox"), cbx_empty); - theme->set_stylebox(SNAME("focus"), SNAME("CheckBox"), cbx_focus); - - theme->set_icon(SNAME("checked"), SNAME("CheckBox"), icons["checked"]); - theme->set_icon(SNAME("checked_disabled"), SNAME("CheckBox"), icons["checked"]); - theme->set_icon(SNAME("unchecked"), SNAME("CheckBox"), icons["unchecked"]); - theme->set_icon(SNAME("unchecked_disabled"), SNAME("CheckBox"), icons["unchecked"]); - theme->set_icon(SNAME("radio_checked"), SNAME("CheckBox"), icons["radio_checked"]); - theme->set_icon(SNAME("radio_checked_disabled"), SNAME("CheckBox"), icons["radio_checked"]); - theme->set_icon(SNAME("radio_unchecked"), SNAME("CheckBox"), icons["radio_unchecked"]); - theme->set_icon(SNAME("radio_unchecked_disabled"), SNAME("CheckBox"), icons["radio_unchecked"]); - - theme->set_font(SNAME("font"), SNAME("CheckBox"), Ref<Font>()); - theme->set_font_size(SNAME("font_size"), SNAME("CheckBox"), -1); - - theme->set_color(SNAME("font_color"), SNAME("CheckBox"), control_font_color); - theme->set_color(SNAME("font_pressed_color"), SNAME("CheckBox"), control_font_pressed_color); - theme->set_color(SNAME("font_hover_color"), SNAME("CheckBox"), control_font_hover_color); - theme->set_color(SNAME("font_hover_pressed_color"), SNAME("CheckBox"), control_font_pressed_color); - theme->set_color(SNAME("font_focus_color"), SNAME("CheckBox"), control_font_focus_color); - theme->set_color(SNAME("font_disabled_color"), SNAME("CheckBox"), control_font_disabled_color); - theme->set_color(SNAME("font_outline_color"), SNAME("CheckBox"), Color(1, 1, 1)); - - theme->set_constant(SNAME("hseparation"), SNAME("CheckBox"), 4 * scale); - theme->set_constant(SNAME("check_vadjust"), SNAME("CheckBox"), 0 * scale); - theme->set_constant(SNAME("outline_size"), SNAME("CheckBox"), 0); + theme->set_stylebox("normal", "CheckBox", cbx_empty); + theme->set_stylebox("pressed", "CheckBox", cbx_empty); + theme->set_stylebox("disabled", "CheckBox", cbx_empty); + theme->set_stylebox("hover", "CheckBox", cbx_empty); + theme->set_stylebox("hover_pressed", "CheckBox", cbx_empty); + theme->set_stylebox("focus", "CheckBox", cbx_focus); + + theme->set_icon("checked", "CheckBox", icons["checked"]); + theme->set_icon("checked_disabled", "CheckBox", icons["checked"]); + theme->set_icon("unchecked", "CheckBox", icons["unchecked"]); + theme->set_icon("unchecked_disabled", "CheckBox", icons["unchecked"]); + theme->set_icon("radio_checked", "CheckBox", icons["radio_checked"]); + theme->set_icon("radio_checked_disabled", "CheckBox", icons["radio_checked"]); + theme->set_icon("radio_unchecked", "CheckBox", icons["radio_unchecked"]); + theme->set_icon("radio_unchecked_disabled", "CheckBox", icons["radio_unchecked"]); + + theme->set_font("font", "CheckBox", Ref<Font>()); + theme->set_font_size("font_size", "CheckBox", -1); + + theme->set_color("font_color", "CheckBox", control_font_color); + theme->set_color("font_pressed_color", "CheckBox", control_font_pressed_color); + theme->set_color("font_hover_color", "CheckBox", control_font_hover_color); + theme->set_color("font_hover_pressed_color", "CheckBox", control_font_pressed_color); + theme->set_color("font_focus_color", "CheckBox", control_font_focus_color); + theme->set_color("font_disabled_color", "CheckBox", control_font_disabled_color); + theme->set_color("font_outline_color", "CheckBox", Color(1, 1, 1)); + + theme->set_constant("hseparation", "CheckBox", 4 * scale); + theme->set_constant("check_vadjust", "CheckBox", 0 * scale); + theme->set_constant("outline_size", "CheckBox", 0); // CheckButton @@ -307,62 +307,62 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, Ref<Te cb_empty->set_default_margin(SIDE_TOP, 4 * scale); cb_empty->set_default_margin(SIDE_BOTTOM, 4 * scale); - theme->set_stylebox(SNAME("normal"), SNAME("CheckButton"), cb_empty); - theme->set_stylebox(SNAME("pressed"), SNAME("CheckButton"), cb_empty); - theme->set_stylebox(SNAME("disabled"), SNAME("CheckButton"), cb_empty); - theme->set_stylebox(SNAME("hover"), SNAME("CheckButton"), cb_empty); - theme->set_stylebox(SNAME("hover_pressed"), SNAME("CheckButton"), cb_empty); - theme->set_stylebox(SNAME("focus"), SNAME("CheckButton"), focus); - - theme->set_icon(SNAME("on"), SNAME("CheckButton"), icons["toggle_on"]); - theme->set_icon(SNAME("on_disabled"), SNAME("CheckButton"), icons["toggle_on_disabled"]); - theme->set_icon(SNAME("off"), SNAME("CheckButton"), icons["toggle_off"]); - theme->set_icon(SNAME("off_disabled"), SNAME("CheckButton"), icons["toggle_off_disabled"]); - - theme->set_icon(SNAME("on_mirrored"), SNAME("CheckButton"), icons["toggle_on_mirrored"]); - theme->set_icon(SNAME("on_disabled_mirrored"), SNAME("CheckButton"), icons["toggle_on_disabled_mirrored"]); - theme->set_icon(SNAME("off_mirrored"), SNAME("CheckButton"), icons["toggle_off_mirrored"]); - theme->set_icon(SNAME("off_disabled_mirrored"), SNAME("CheckButton"), icons["toggle_off_disabled_mirrored"]); - - theme->set_font(SNAME("font"), SNAME("CheckButton"), Ref<Font>()); - theme->set_font_size(SNAME("font_size"), SNAME("CheckButton"), -1); - - theme->set_color(SNAME("font_color"), SNAME("CheckButton"), control_font_color); - theme->set_color(SNAME("font_pressed_color"), SNAME("CheckButton"), control_font_pressed_color); - theme->set_color(SNAME("font_hover_color"), SNAME("CheckButton"), control_font_hover_color); - theme->set_color(SNAME("font_hover_pressed_color"), SNAME("CheckButton"), control_font_pressed_color); - theme->set_color(SNAME("font_focus_color"), SNAME("CheckButton"), control_font_focus_color); - theme->set_color(SNAME("font_disabled_color"), SNAME("CheckButton"), control_font_disabled_color); - theme->set_color(SNAME("font_outline_color"), SNAME("CheckButton"), Color(1, 1, 1)); - - theme->set_constant(SNAME("hseparation"), SNAME("CheckButton"), 4 * scale); - theme->set_constant(SNAME("check_vadjust"), SNAME("CheckButton"), 0 * scale); - theme->set_constant(SNAME("outline_size"), SNAME("CheckButton"), 0); + theme->set_stylebox("normal", "CheckButton", cb_empty); + theme->set_stylebox("pressed", "CheckButton", cb_empty); + theme->set_stylebox("disabled", "CheckButton", cb_empty); + theme->set_stylebox("hover", "CheckButton", cb_empty); + theme->set_stylebox("hover_pressed", "CheckButton", cb_empty); + theme->set_stylebox("focus", "CheckButton", focus); + + theme->set_icon("on", "CheckButton", icons["toggle_on"]); + theme->set_icon("on_disabled", "CheckButton", icons["toggle_on_disabled"]); + theme->set_icon("off", "CheckButton", icons["toggle_off"]); + theme->set_icon("off_disabled", "CheckButton", icons["toggle_off_disabled"]); + + theme->set_icon("on_mirrored", "CheckButton", icons["toggle_on_mirrored"]); + theme->set_icon("on_disabled_mirrored", "CheckButton", icons["toggle_on_disabled_mirrored"]); + theme->set_icon("off_mirrored", "CheckButton", icons["toggle_off_mirrored"]); + theme->set_icon("off_disabled_mirrored", "CheckButton", icons["toggle_off_disabled_mirrored"]); + + theme->set_font("font", "CheckButton", Ref<Font>()); + theme->set_font_size("font_size", "CheckButton", -1); + + theme->set_color("font_color", "CheckButton", control_font_color); + theme->set_color("font_pressed_color", "CheckButton", control_font_pressed_color); + theme->set_color("font_hover_color", "CheckButton", control_font_hover_color); + theme->set_color("font_hover_pressed_color", "CheckButton", control_font_pressed_color); + theme->set_color("font_focus_color", "CheckButton", control_font_focus_color); + theme->set_color("font_disabled_color", "CheckButton", control_font_disabled_color); + theme->set_color("font_outline_color", "CheckButton", Color(1, 1, 1)); + + theme->set_constant("hseparation", "CheckButton", 4 * scale); + theme->set_constant("check_vadjust", "CheckButton", 0 * scale); + theme->set_constant("outline_size", "CheckButton", 0); // Label - theme->set_stylebox(SNAME("normal"), SNAME("Label"), memnew(StyleBoxEmpty)); - theme->set_font(SNAME("font"), SNAME("Label"), Ref<Font>()); - theme->set_font_size(SNAME("font_size"), SNAME("Label"), -1); + theme->set_stylebox("normal", "Label", memnew(StyleBoxEmpty)); + theme->set_font("font", "Label", Ref<Font>()); + theme->set_font_size("font_size", "Label", -1); - theme->set_color(SNAME("font_color"), SNAME("Label"), Color(1, 1, 1)); - theme->set_color(SNAME("font_shadow_color"), SNAME("Label"), Color(0, 0, 0, 0)); - theme->set_color(SNAME("font_outline_color"), SNAME("Label"), Color(1, 1, 1)); + theme->set_color("font_color", "Label", Color(1, 1, 1)); + theme->set_color("font_shadow_color", "Label", Color(0, 0, 0, 0)); + theme->set_color("font_outline_color", "Label", Color(1, 1, 1)); - theme->set_constant(SNAME("shadow_offset_x"), SNAME("Label"), 1 * scale); - theme->set_constant(SNAME("shadow_offset_y"), SNAME("Label"), 1 * scale); - theme->set_constant(SNAME("outline_size"), SNAME("Label"), 0); - theme->set_constant(SNAME("shadow_outline_size"), SNAME("Label"), 1 * scale); - theme->set_constant(SNAME("line_spacing"), SNAME("Label"), 3 * scale); + theme->set_constant("shadow_offset_x", "Label", 1 * scale); + theme->set_constant("shadow_offset_y", "Label", 1 * scale); + theme->set_constant("outline_size", "Label", 0); + theme->set_constant("shadow_outline_size", "Label", 1 * scale); + theme->set_constant("line_spacing", "Label", 3 * scale); - theme->set_type_variation(SNAME("HeaderSmall"), SNAME("Label")); - theme->set_font_size(SNAME("font_size"), SNAME("HeaderSmall"), default_font_size + 4); + theme->set_type_variation("HeaderSmall", "Label"); + theme->set_font_size("font_size", "HeaderSmall", default_font_size + 4); - theme->set_type_variation(SNAME("HeaderMedium"), SNAME("Label")); - theme->set_font_size(SNAME("font_size"), SNAME("HeaderMedium"), default_font_size + 8); + theme->set_type_variation("HeaderMedium", "Label"); + theme->set_font_size("font_size", "HeaderMedium", default_font_size + 8); - theme->set_type_variation(SNAME("HeaderLarge"), SNAME("Label")); - theme->set_font_size(SNAME("font_size"), SNAME("HeaderLarge"), default_font_size + 12); + theme->set_type_variation("HeaderLarge", "Label"); + theme->set_font_size("font_size", "HeaderLarge", default_font_size + 12); // LineEdit @@ -370,129 +370,129 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, Ref<Te // Add a line at the bottom to make LineEdits distinguishable from Buttons. style_line_edit->set_border_width(SIDE_BOTTOM, 2); style_line_edit->set_border_color(style_pressed_color); - theme->set_stylebox(SNAME("normal"), SNAME("LineEdit"), style_line_edit); + theme->set_stylebox("normal", "LineEdit", style_line_edit); - theme->set_stylebox(SNAME("focus"), SNAME("LineEdit"), focus); + theme->set_stylebox("focus", "LineEdit", focus); Ref<StyleBoxFlat> style_line_edit_read_only = make_flat_stylebox(style_disabled_color); // Add a line at the bottom to make LineEdits distinguishable from Buttons. style_line_edit_read_only->set_border_width(SIDE_BOTTOM, 2); style_line_edit_read_only->set_border_color(style_pressed_color * Color(1, 1, 1, 0.5)); - theme->set_stylebox(SNAME("read_only"), SNAME("LineEdit"), style_line_edit_read_only); + theme->set_stylebox("read_only", "LineEdit", style_line_edit_read_only); - theme->set_font(SNAME("font"), SNAME("LineEdit"), Ref<Font>()); - theme->set_font_size(SNAME("font_size"), SNAME("LineEdit"), -1); + theme->set_font("font", "LineEdit", Ref<Font>()); + theme->set_font_size("font_size", "LineEdit", -1); - theme->set_color(SNAME("font_color"), SNAME("LineEdit"), control_font_color); - theme->set_color(SNAME("font_selected_color"), SNAME("LineEdit"), control_font_pressed_color); - theme->set_color(SNAME("font_uneditable_color"), SNAME("LineEdit"), control_font_disabled_color); - theme->set_color(SNAME("font_placeholder_color"), SNAME("LineEdit"), control_font_placeholder_color); - theme->set_color(SNAME("font_outline_color"), SNAME("LineEdit"), Color(1, 1, 1)); - theme->set_color(SNAME("caret_color"), SNAME("LineEdit"), control_font_hover_color); - theme->set_color(SNAME("selection_color"), SNAME("LineEdit"), control_selection_color); - theme->set_color(SNAME("clear_button_color"), SNAME("LineEdit"), control_font_color); - theme->set_color(SNAME("clear_button_color_pressed"), SNAME("LineEdit"), control_font_pressed_color); + theme->set_color("font_color", "LineEdit", control_font_color); + theme->set_color("font_selected_color", "LineEdit", control_font_pressed_color); + theme->set_color("font_uneditable_color", "LineEdit", control_font_disabled_color); + theme->set_color("font_placeholder_color", "LineEdit", control_font_placeholder_color); + theme->set_color("font_outline_color", "LineEdit", Color(1, 1, 1)); + theme->set_color("caret_color", "LineEdit", control_font_hover_color); + theme->set_color("selection_color", "LineEdit", control_selection_color); + theme->set_color("clear_button_color", "LineEdit", control_font_color); + theme->set_color("clear_button_color_pressed", "LineEdit", control_font_pressed_color); - theme->set_constant(SNAME("minimum_character_width"), SNAME("LineEdit"), 4); - theme->set_constant(SNAME("outline_size"), SNAME("LineEdit"), 0); - theme->set_constant(SNAME("caret_width"), SNAME("LineEdit"), 1); + theme->set_constant("minimum_character_width", "LineEdit", 4); + theme->set_constant("outline_size", "LineEdit", 0); + theme->set_constant("caret_width", "LineEdit", 1); - theme->set_icon(SNAME("clear"), SNAME("LineEdit"), icons["line_edit_clear"]); + theme->set_icon("clear", "LineEdit", icons["line_edit_clear"]); // ProgressBar - theme->set_stylebox(SNAME("bg"), SNAME("ProgressBar"), make_flat_stylebox(style_disabled_color, 2, 2, 2, 2, 6)); - theme->set_stylebox(SNAME("fg"), SNAME("ProgressBar"), make_flat_stylebox(style_progress_color, 2, 2, 2, 2, 6)); + theme->set_stylebox("bg", "ProgressBar", make_flat_stylebox(style_disabled_color, 2, 2, 2, 2, 6)); + theme->set_stylebox("fg", "ProgressBar", make_flat_stylebox(style_progress_color, 2, 2, 2, 2, 6)); - theme->set_font(SNAME("font"), SNAME("ProgressBar"), Ref<Font>()); - theme->set_font_size(SNAME("font_size"), SNAME("ProgressBar"), -1); + theme->set_font("font", "ProgressBar", Ref<Font>()); + theme->set_font_size("font_size", "ProgressBar", -1); - theme->set_color(SNAME("font_color"), SNAME("ProgressBar"), control_font_hover_color); - theme->set_color(SNAME("font_shadow_color"), SNAME("ProgressBar"), Color(0, 0, 0)); - theme->set_color(SNAME("font_outline_color"), SNAME("ProgressBar"), Color(1, 1, 1)); + theme->set_color("font_color", "ProgressBar", control_font_hover_color); + theme->set_color("font_shadow_color", "ProgressBar", Color(0, 0, 0)); + theme->set_color("font_outline_color", "ProgressBar", Color(1, 1, 1)); - theme->set_constant(SNAME("outline_size"), SNAME("ProgressBar"), 0); + theme->set_constant("outline_size", "ProgressBar", 0); // TextEdit - theme->set_stylebox(SNAME("normal"), SNAME("TextEdit"), style_line_edit); - theme->set_stylebox(SNAME("focus"), SNAME("TextEdit"), focus); - theme->set_stylebox(SNAME("read_only"), SNAME("TextEdit"), style_line_edit_read_only); - - theme->set_icon(SNAME("tab"), SNAME("TextEdit"), icons["text_edit_tab"]); - theme->set_icon(SNAME("space"), SNAME("TextEdit"), icons["text_edit_space"]); - - theme->set_font(SNAME("font"), SNAME("TextEdit"), Ref<Font>()); - theme->set_font_size(SNAME("font_size"), SNAME("TextEdit"), -1); - - theme->set_color(SNAME("background_color"), SNAME("TextEdit"), Color(0, 0, 0, 0)); - theme->set_color(SNAME("font_color"), SNAME("TextEdit"), control_font_color); - theme->set_color(SNAME("font_selected_color"), SNAME("TextEdit"), control_font_pressed_color); - theme->set_color(SNAME("font_readonly_color"), SNAME("TextEdit"), control_font_disabled_color); - theme->set_color(SNAME("font_placeholder_color"), SNAME("TextEdit"), control_font_placeholder_color); - theme->set_color(SNAME("font_outline_color"), SNAME("TextEdit"), Color(1, 1, 1)); - theme->set_color(SNAME("selection_color"), SNAME("TextEdit"), control_selection_color); - theme->set_color(SNAME("current_line_color"), SNAME("TextEdit"), Color(0.25, 0.25, 0.26, 0.8)); - theme->set_color(SNAME("caret_color"), SNAME("TextEdit"), control_font_color); - theme->set_color(SNAME("caret_background_color"), SNAME("TextEdit"), Color(0, 0, 0)); - theme->set_color(SNAME("word_highlighted_color"), SNAME("TextEdit"), Color(0.5, 0.5, 0.5, 0.25)); - theme->set_color(SNAME("search_result_color"), SNAME("TextEdit"), Color(0.3, 0.3, 0.3)); - theme->set_color(SNAME("search_result_border_color"), SNAME("TextEdit"), Color(0.3, 0.3, 0.3, 0.4)); - - theme->set_constant(SNAME("line_spacing"), SNAME("TextEdit"), 4 * scale); - theme->set_constant(SNAME("outline_size"), SNAME("TextEdit"), 0); - theme->set_constant(SNAME("caret_width"), SNAME("TextEdit"), 1); + theme->set_stylebox("normal", "TextEdit", style_line_edit); + theme->set_stylebox("focus", "TextEdit", focus); + theme->set_stylebox("read_only", "TextEdit", style_line_edit_read_only); + + theme->set_icon("tab", "TextEdit", icons["text_edit_tab"]); + theme->set_icon("space", "TextEdit", icons["text_edit_space"]); + + theme->set_font("font", "TextEdit", Ref<Font>()); + theme->set_font_size("font_size", "TextEdit", -1); + + theme->set_color("background_color", "TextEdit", Color(0, 0, 0, 0)); + theme->set_color("font_color", "TextEdit", control_font_color); + theme->set_color("font_selected_color", "TextEdit", control_font_pressed_color); + theme->set_color("font_readonly_color", "TextEdit", control_font_disabled_color); + theme->set_color("font_placeholder_color", "TextEdit", control_font_placeholder_color); + theme->set_color("font_outline_color", "TextEdit", Color(1, 1, 1)); + theme->set_color("selection_color", "TextEdit", control_selection_color); + theme->set_color("current_line_color", "TextEdit", Color(0.25, 0.25, 0.26, 0.8)); + theme->set_color("caret_color", "TextEdit", control_font_color); + theme->set_color("caret_background_color", "TextEdit", Color(0, 0, 0)); + theme->set_color("word_highlighted_color", "TextEdit", Color(0.5, 0.5, 0.5, 0.25)); + theme->set_color("search_result_color", "TextEdit", Color(0.3, 0.3, 0.3)); + theme->set_color("search_result_border_color", "TextEdit", Color(0.3, 0.3, 0.3, 0.4)); + + theme->set_constant("line_spacing", "TextEdit", 4 * scale); + theme->set_constant("outline_size", "TextEdit", 0); + theme->set_constant("caret_width", "TextEdit", 1); // CodeEdit - theme->set_stylebox(SNAME("normal"), SNAME("CodeEdit"), style_line_edit); - theme->set_stylebox(SNAME("focus"), SNAME("CodeEdit"), focus); - theme->set_stylebox(SNAME("read_only"), SNAME("CodeEdit"), style_line_edit_read_only); - theme->set_stylebox(SNAME("completion"), SNAME("CodeEdit"), make_flat_stylebox(style_normal_color, 0, 0, 0, 0)); - - theme->set_icon(SNAME("tab"), SNAME("CodeEdit"), icons["text_edit_tab"]); - theme->set_icon(SNAME("space"), SNAME("CodeEdit"), icons["text_edit_space"]); - theme->set_icon(SNAME("breakpoint"), SNAME("CodeEdit"), icons["breakpoint"]); - theme->set_icon(SNAME("bookmark"), SNAME("CodeEdit"), icons["bookmark"]); - theme->set_icon(SNAME("executing_line"), SNAME("CodeEdit"), icons["arrow_right"]); - theme->set_icon(SNAME("can_fold"), SNAME("CodeEdit"), icons["arrow_down"]); - theme->set_icon(SNAME("folded"), SNAME("CodeEdit"), icons["arrow_right"]); - theme->set_icon(SNAME("folded_eol_icon"), SNAME("CodeEdit"), icons["text_edit_ellipsis"]); - - theme->set_font(SNAME("font"), SNAME("CodeEdit"), Ref<Font>()); - theme->set_font_size(SNAME("font_size"), SNAME("CodeEdit"), -1); - - theme->set_color(SNAME("background_color"), SNAME("CodeEdit"), Color(0, 0, 0, 0)); - theme->set_color(SNAME("completion_background_color"), SNAME("CodeEdit"), Color(0.17, 0.16, 0.2)); - theme->set_color(SNAME("completion_selected_color"), SNAME("CodeEdit"), Color(0.26, 0.26, 0.27)); - theme->set_color(SNAME("completion_existing_color"), SNAME("CodeEdit"), Color(0.87, 0.87, 0.87, 0.13)); - theme->set_color(SNAME("completion_scroll_color"), SNAME("CodeEdit"), control_font_pressed_color); - theme->set_color(SNAME("completion_font_color"), SNAME("CodeEdit"), Color(0.67, 0.67, 0.67)); - theme->set_color(SNAME("font_color"), SNAME("CodeEdit"), control_font_color); - theme->set_color(SNAME("font_selected_color"), SNAME("CodeEdit"), Color(0, 0, 0)); - theme->set_color(SNAME("font_readonly_color"), SNAME("CodeEdit"), Color(control_font_color.r, control_font_color.g, control_font_color.b, 0.5f)); - theme->set_color(SNAME("font_placeholder_color"), SNAME("CodeEdit"), control_font_placeholder_color); - theme->set_color(SNAME("font_outline_color"), SNAME("CodeEdit"), Color(1, 1, 1)); - theme->set_color(SNAME("selection_color"), SNAME("CodeEdit"), control_selection_color); - theme->set_color(SNAME("bookmark_color"), SNAME("CodeEdit"), Color(0.5, 0.64, 1, 0.8)); - theme->set_color(SNAME("breakpoint_color"), SNAME("CodeEdit"), Color(0.9, 0.29, 0.3)); - theme->set_color(SNAME("executing_line_color"), SNAME("CodeEdit"), Color(0.98, 0.89, 0.27)); - theme->set_color(SNAME("current_line_color"), SNAME("CodeEdit"), Color(0.25, 0.25, 0.26, 0.8)); - theme->set_color(SNAME("code_folding_color"), SNAME("CodeEdit"), Color(0.8, 0.8, 0.8, 0.8)); - theme->set_color(SNAME("caret_color"), SNAME("CodeEdit"), control_font_color); - theme->set_color(SNAME("caret_background_color"), SNAME("CodeEdit"), Color(0, 0, 0)); - theme->set_color(SNAME("brace_mismatch_color"), SNAME("CodeEdit"), Color(1, 0.2, 0.2)); - theme->set_color(SNAME("line_number_color"), SNAME("CodeEdit"), Color(0.67, 0.67, 0.67, 0.4)); - theme->set_color(SNAME("word_highlighted_color"), SNAME("CodeEdit"), Color(0.8, 0.9, 0.9, 0.15)); - theme->set_color(SNAME("line_length_guideline_color"), SNAME("CodeEdit"), Color(0.3, 0.5, 0.8, 0.1)); - theme->set_color(SNAME("search_result_color"), SNAME("CodeEdit"), Color(0.3, 0.3, 0.3)); - theme->set_color(SNAME("search_result_border_color"), SNAME("CodeEdit"), Color(0.3, 0.3, 0.3, 0.4)); - - theme->set_constant(SNAME("completion_lines"), SNAME("CodeEdit"), 7); - theme->set_constant(SNAME("completion_max_width"), SNAME("CodeEdit"), 50); - theme->set_constant(SNAME("completion_scroll_width"), SNAME("CodeEdit"), 3); - theme->set_constant(SNAME("line_spacing"), SNAME("CodeEdit"), 4 * scale); - theme->set_constant(SNAME("outline_size"), SNAME("CodeEdit"), 0); + theme->set_stylebox("normal", "CodeEdit", style_line_edit); + theme->set_stylebox("focus", "CodeEdit", focus); + theme->set_stylebox("read_only", "CodeEdit", style_line_edit_read_only); + theme->set_stylebox("completion", "CodeEdit", make_flat_stylebox(style_normal_color, 0, 0, 0, 0)); + + theme->set_icon("tab", "CodeEdit", icons["text_edit_tab"]); + theme->set_icon("space", "CodeEdit", icons["text_edit_space"]); + theme->set_icon("breakpoint", "CodeEdit", icons["breakpoint"]); + theme->set_icon("bookmark", "CodeEdit", icons["bookmark"]); + theme->set_icon("executing_line", "CodeEdit", icons["arrow_right"]); + theme->set_icon("can_fold", "CodeEdit", icons["arrow_down"]); + theme->set_icon("folded", "CodeEdit", icons["arrow_right"]); + theme->set_icon("folded_eol_icon", "CodeEdit", icons["text_edit_ellipsis"]); + + theme->set_font("font", "CodeEdit", Ref<Font>()); + theme->set_font_size("font_size", "CodeEdit", -1); + + theme->set_color("background_color", "CodeEdit", Color(0, 0, 0, 0)); + theme->set_color("completion_background_color", "CodeEdit", Color(0.17, 0.16, 0.2)); + theme->set_color("completion_selected_color", "CodeEdit", Color(0.26, 0.26, 0.27)); + theme->set_color("completion_existing_color", "CodeEdit", Color(0.87, 0.87, 0.87, 0.13)); + theme->set_color("completion_scroll_color", "CodeEdit", control_font_pressed_color); + theme->set_color("completion_font_color", "CodeEdit", Color(0.67, 0.67, 0.67)); + theme->set_color("font_color", "CodeEdit", control_font_color); + theme->set_color("font_selected_color", "CodeEdit", Color(0, 0, 0)); + theme->set_color("font_readonly_color", "CodeEdit", Color(control_font_color.r, control_font_color.g, control_font_color.b, 0.5f)); + theme->set_color("font_placeholder_color", "CodeEdit", control_font_placeholder_color); + theme->set_color("font_outline_color", "CodeEdit", Color(1, 1, 1)); + theme->set_color("selection_color", "CodeEdit", control_selection_color); + theme->set_color("bookmark_color", "CodeEdit", Color(0.5, 0.64, 1, 0.8)); + theme->set_color("breakpoint_color", "CodeEdit", Color(0.9, 0.29, 0.3)); + theme->set_color("executing_line_color", "CodeEdit", Color(0.98, 0.89, 0.27)); + theme->set_color("current_line_color", "CodeEdit", Color(0.25, 0.25, 0.26, 0.8)); + theme->set_color("code_folding_color", "CodeEdit", Color(0.8, 0.8, 0.8, 0.8)); + theme->set_color("caret_color", "CodeEdit", control_font_color); + theme->set_color("caret_background_color", "CodeEdit", Color(0, 0, 0)); + theme->set_color("brace_mismatch_color", "CodeEdit", Color(1, 0.2, 0.2)); + theme->set_color("line_number_color", "CodeEdit", Color(0.67, 0.67, 0.67, 0.4)); + theme->set_color("word_highlighted_color", "CodeEdit", Color(0.8, 0.9, 0.9, 0.15)); + theme->set_color("line_length_guideline_color", "CodeEdit", Color(0.3, 0.5, 0.8, 0.1)); + theme->set_color("search_result_color", "CodeEdit", Color(0.3, 0.3, 0.3)); + theme->set_color("search_result_border_color", "CodeEdit", Color(0.3, 0.3, 0.3, 0.4)); + + theme->set_constant("completion_lines", "CodeEdit", 7); + theme->set_constant("completion_max_width", "CodeEdit", 50); + theme->set_constant("completion_scroll_width", "CodeEdit", 3); + theme->set_constant("line_spacing", "CodeEdit", 4 * scale); + theme->set_constant("outline_size", "CodeEdit", 0); Ref<Texture2D> empty_icon = memnew(ImageTexture); @@ -503,33 +503,33 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, Ref<Te // HScrollBar - theme->set_stylebox(SNAME("scroll"), SNAME("HScrollBar"), style_scrollbar); - theme->set_stylebox(SNAME("scroll_focus"), SNAME("HScrollBar"), focus); - theme->set_stylebox(SNAME("grabber"), SNAME("HScrollBar"), style_scrollbar_grabber); - theme->set_stylebox(SNAME("grabber_highlight"), SNAME("HScrollBar"), style_scrollbar_grabber_highlight); - theme->set_stylebox(SNAME("grabber_pressed"), SNAME("HScrollBar"), style_scrollbar_grabber_pressed); + theme->set_stylebox("scroll", "HScrollBar", style_scrollbar); + theme->set_stylebox("scroll_focus", "HScrollBar", focus); + theme->set_stylebox("grabber", "HScrollBar", style_scrollbar_grabber); + theme->set_stylebox("grabber_highlight", "HScrollBar", style_scrollbar_grabber_highlight); + theme->set_stylebox("grabber_pressed", "HScrollBar", style_scrollbar_grabber_pressed); - theme->set_icon(SNAME("increment"), SNAME("HScrollBar"), empty_icon); - theme->set_icon(SNAME("increment_highlight"), SNAME("HScrollBar"), empty_icon); - theme->set_icon(SNAME("increment_pressed"), SNAME("HScrollBar"), empty_icon); - theme->set_icon(SNAME("decrement"), SNAME("HScrollBar"), empty_icon); - theme->set_icon(SNAME("decrement_highlight"), SNAME("HScrollBar"), empty_icon); - theme->set_icon(SNAME("decrement_pressed"), SNAME("HScrollBar"), empty_icon); + theme->set_icon("increment", "HScrollBar", empty_icon); + theme->set_icon("increment_highlight", "HScrollBar", empty_icon); + theme->set_icon("increment_pressed", "HScrollBar", empty_icon); + theme->set_icon("decrement", "HScrollBar", empty_icon); + theme->set_icon("decrement_highlight", "HScrollBar", empty_icon); + theme->set_icon("decrement_pressed", "HScrollBar", empty_icon); // VScrollBar - theme->set_stylebox(SNAME("scroll"), SNAME("VScrollBar"), style_scrollbar); - theme->set_stylebox(SNAME("scroll_focus"), SNAME("VScrollBar"), focus); - theme->set_stylebox(SNAME("grabber"), SNAME("VScrollBar"), style_scrollbar_grabber); - theme->set_stylebox(SNAME("grabber_highlight"), SNAME("VScrollBar"), style_scrollbar_grabber_highlight); - theme->set_stylebox(SNAME("grabber_pressed"), SNAME("VScrollBar"), style_scrollbar_grabber_pressed); + theme->set_stylebox("scroll", "VScrollBar", style_scrollbar); + theme->set_stylebox("scroll_focus", "VScrollBar", focus); + theme->set_stylebox("grabber", "VScrollBar", style_scrollbar_grabber); + theme->set_stylebox("grabber_highlight", "VScrollBar", style_scrollbar_grabber_highlight); + theme->set_stylebox("grabber_pressed", "VScrollBar", style_scrollbar_grabber_pressed); - theme->set_icon(SNAME("increment"), SNAME("VScrollBar"), empty_icon); - theme->set_icon(SNAME("increment_highlight"), SNAME("VScrollBar"), empty_icon); - theme->set_icon(SNAME("increment_pressed"), SNAME("VScrollBar"), empty_icon); - theme->set_icon(SNAME("decrement"), SNAME("VScrollBar"), empty_icon); - theme->set_icon(SNAME("decrement_highlight"), SNAME("VScrollBar"), empty_icon); - theme->set_icon(SNAME("decrement_pressed"), SNAME("VScrollBar"), empty_icon); + theme->set_icon("increment", "VScrollBar", empty_icon); + theme->set_icon("increment_highlight", "VScrollBar", empty_icon); + theme->set_icon("increment_pressed", "VScrollBar", empty_icon); + theme->set_icon("decrement", "VScrollBar", empty_icon); + theme->set_icon("decrement_highlight", "VScrollBar", empty_icon); + theme->set_icon("decrement_pressed", "VScrollBar", empty_icon); const Ref<StyleBoxFlat> style_slider = make_flat_stylebox(style_normal_color, 4, 4, 4, 4, 4); const Ref<StyleBoxFlat> style_slider_grabber = make_flat_stylebox(style_progress_color, 4, 4, 4, 4, 4); @@ -537,83 +537,83 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, Ref<Te // HSlider - theme->set_stylebox(SNAME("slider"), SNAME("HSlider"), style_slider); - theme->set_stylebox(SNAME("grabber_area"), SNAME("HSlider"), style_slider_grabber); - theme->set_stylebox(SNAME("grabber_area_highlight"), SNAME("HSlider"), style_slider_grabber_highlight); + theme->set_stylebox("slider", "HSlider", style_slider); + theme->set_stylebox("grabber_area", "HSlider", style_slider_grabber); + theme->set_stylebox("grabber_area_highlight", "HSlider", style_slider_grabber_highlight); - theme->set_icon(SNAME("grabber"), SNAME("HSlider"), icons["slider_grabber"]); - theme->set_icon(SNAME("grabber_highlight"), SNAME("HSlider"), icons["slider_grabber_hl"]); - theme->set_icon(SNAME("grabber_disabled"), SNAME("HSlider"), icons["slider_grabber_disabled"]); - theme->set_icon(SNAME("tick"), SNAME("HSlider"), icons["hslider_tick"]); + theme->set_icon("grabber", "HSlider", icons["slider_grabber"]); + theme->set_icon("grabber_highlight", "HSlider", icons["slider_grabber_hl"]); + theme->set_icon("grabber_disabled", "HSlider", icons["slider_grabber_disabled"]); + theme->set_icon("tick", "HSlider", icons["hslider_tick"]); // VSlider - theme->set_stylebox(SNAME("slider"), SNAME("VSlider"), style_slider); - theme->set_stylebox(SNAME("grabber_area"), SNAME("VSlider"), style_slider_grabber); - theme->set_stylebox(SNAME("grabber_area_highlight"), SNAME("VSlider"), style_slider_grabber_highlight); + theme->set_stylebox("slider", "VSlider", style_slider); + theme->set_stylebox("grabber_area", "VSlider", style_slider_grabber); + theme->set_stylebox("grabber_area_highlight", "VSlider", style_slider_grabber_highlight); - theme->set_icon(SNAME("grabber"), SNAME("VSlider"), icons["slider_grabber"]); - theme->set_icon(SNAME("grabber_highlight"), SNAME("VSlider"), icons["slider_grabber_hl"]); - theme->set_icon(SNAME("grabber_disabled"), SNAME("VSlider"), icons["slider_grabber_disabled"]); - theme->set_icon(SNAME("tick"), SNAME("VSlider"), icons["vslider_tick"]); + theme->set_icon("grabber", "VSlider", icons["slider_grabber"]); + theme->set_icon("grabber_highlight", "VSlider", icons["slider_grabber_hl"]); + theme->set_icon("grabber_disabled", "VSlider", icons["slider_grabber_disabled"]); + theme->set_icon("tick", "VSlider", icons["vslider_tick"]); // SpinBox - theme->set_icon(SNAME("updown"), SNAME("SpinBox"), icons["updown"]); + theme->set_icon("updown", "SpinBox", icons["updown"]); // ScrollContainer Ref<StyleBoxEmpty> empty; empty.instantiate(); - theme->set_stylebox(SNAME("bg"), SNAME("ScrollContainer"), empty); + theme->set_stylebox("bg", "ScrollContainer", empty); // Window - theme->set_stylebox(SNAME("embedded_border"), SNAME("Window"), sb_expand(make_flat_stylebox(style_popup_color, 10, 28, 10, 8), 8, 32, 8, 6)); - theme->set_constant(SNAME("scaleborder_size"), SNAME("Window"), 4 * scale); + theme->set_stylebox("embedded_border", "Window", sb_expand(make_flat_stylebox(style_popup_color, 10, 28, 10, 8), 8, 32, 8, 6)); + theme->set_constant("scaleborder_size", "Window", 4 * scale); - theme->set_font(SNAME("title_font"), SNAME("Window"), Ref<Font>()); - theme->set_font_size(SNAME("title_font_size"), SNAME("Window"), -1); - theme->set_color(SNAME("title_color"), SNAME("Window"), control_font_color); - theme->set_color(SNAME("title_outline_modulate"), SNAME("Window"), Color(1, 1, 1)); - theme->set_constant(SNAME("title_outline_size"), SNAME("Window"), 0); - theme->set_constant(SNAME("title_height"), SNAME("Window"), 36 * scale); - theme->set_constant(SNAME("resize_margin"), SNAME("Window"), 4 * scale); + theme->set_font("title_font", "Window", Ref<Font>()); + theme->set_font_size("title_font_size", "Window", -1); + theme->set_color("title_color", "Window", control_font_color); + theme->set_color("title_outline_modulate", "Window", Color(1, 1, 1)); + theme->set_constant("title_outline_size", "Window", 0); + theme->set_constant("title_height", "Window", 36 * scale); + theme->set_constant("resize_margin", "Window", 4 * scale); - theme->set_icon(SNAME("close"), SNAME("Window"), icons["close"]); - theme->set_icon(SNAME("close_pressed"), SNAME("Window"), icons["close_hl"]); - theme->set_constant(SNAME("close_h_ofs"), SNAME("Window"), 18 * scale); - theme->set_constant(SNAME("close_v_ofs"), SNAME("Window"), 24 * scale); + theme->set_icon("close", "Window", icons["close"]); + theme->set_icon("close_pressed", "Window", icons["close_hl"]); + theme->set_constant("close_h_ofs", "Window", 18 * scale); + theme->set_constant("close_v_ofs", "Window", 24 * scale); // Dialogs - theme->set_constant(SNAME("margin"), SNAME("Dialogs"), 8 * scale); - theme->set_constant(SNAME("button_margin"), SNAME("Dialogs"), 32 * scale); + theme->set_constant("margin", "Dialogs", 8 * scale); + theme->set_constant("button_margin", "Dialogs", 32 * scale); // AcceptDialog - theme->set_stylebox(SNAME("panel"), SNAME("AcceptDialog"), make_flat_stylebox(style_popup_color, 0, 0, 0, 0)); + theme->set_stylebox("panel", "AcceptDialog", make_flat_stylebox(style_popup_color, 0, 0, 0, 0)); // File Dialog - theme->set_icon(SNAME("parent_folder"), SNAME("FileDialog"), icons["folder_up"]); - theme->set_icon(SNAME("back_folder"), SNAME("FileDialog"), icons["arrow_left"]); - theme->set_icon(SNAME("forward_folder"), SNAME("FileDialog"), icons["arrow_right"]); - theme->set_icon(SNAME("reload"), SNAME("FileDialog"), icons["reload"]); - theme->set_icon(SNAME("toggle_hidden"), SNAME("FileDialog"), icons["visibility_visible"]); - theme->set_icon(SNAME("folder"), SNAME("FileDialog"), icons["folder"]); - theme->set_icon(SNAME("file"), SNAME("FileDialog"), icons["file"]); - theme->set_color(SNAME("folder_icon_modulate"), SNAME("FileDialog"), Color(1, 1, 1)); - theme->set_color(SNAME("file_icon_modulate"), SNAME("FileDialog"), Color(1, 1, 1)); - theme->set_color(SNAME("files_disabled"), SNAME("FileDialog"), Color(0, 0, 0, 0.7)); + theme->set_icon("parent_folder", "FileDialog", icons["folder_up"]); + theme->set_icon("back_folder", "FileDialog", icons["arrow_left"]); + theme->set_icon("forward_folder", "FileDialog", icons["arrow_right"]); + theme->set_icon("reload", "FileDialog", icons["reload"]); + theme->set_icon("toggle_hidden", "FileDialog", icons["visibility_visible"]); + theme->set_icon("folder", "FileDialog", icons["folder"]); + theme->set_icon("file", "FileDialog", icons["file"]); + theme->set_color("folder_icon_modulate", "FileDialog", Color(1, 1, 1)); + theme->set_color("file_icon_modulate", "FileDialog", Color(1, 1, 1)); + theme->set_color("files_disabled", "FileDialog", Color(0, 0, 0, 0.7)); // Popup - theme->set_stylebox(SNAME("panel"), SNAME("PopupPanel"), make_flat_stylebox(style_normal_color)); + theme->set_stylebox("panel", "PopupPanel", make_flat_stylebox(style_normal_color)); // PopupDialog - theme->set_stylebox(SNAME("panel"), SNAME("PopupDialog"), make_flat_stylebox(style_normal_color)); + theme->set_stylebox("panel", "PopupDialog", make_flat_stylebox(style_normal_color)); // PopupMenu @@ -638,35 +638,35 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, Ref<Te Ref<StyleBoxFlat> style_popup_panel_disabled = style_popup_panel->duplicate(); style_popup_panel_disabled->set_bg_color(style_disabled_color); - theme->set_stylebox(SNAME("panel"), SNAME("PopupMenu"), style_popup_panel); - theme->set_stylebox(SNAME("panel_disabled"), SNAME("PopupMenu"), style_popup_panel_disabled); - theme->set_stylebox(SNAME("hover"), SNAME("PopupMenu"), make_flat_stylebox(style_popup_hover_color)); - theme->set_stylebox(SNAME("separator"), SNAME("PopupMenu"), separator_horizontal); - theme->set_stylebox(SNAME("labeled_separator_left"), SNAME("PopupMenu"), separator_horizontal); - theme->set_stylebox(SNAME("labeled_separator_right"), SNAME("PopupMenu"), separator_horizontal); - - theme->set_icon(SNAME("checked"), SNAME("PopupMenu"), icons["checked"]); - theme->set_icon(SNAME("unchecked"), SNAME("PopupMenu"), icons["unchecked"]); - theme->set_icon(SNAME("radio_checked"), SNAME("PopupMenu"), icons["radio_checked"]); - theme->set_icon(SNAME("radio_unchecked"), SNAME("PopupMenu"), icons["radio_unchecked"]); - theme->set_icon(SNAME("submenu"), SNAME("PopupMenu"), icons["arrow_right"]); - theme->set_icon(SNAME("submenu_mirrored"), SNAME("PopupMenu"), icons["arrow_left"]); - - theme->set_font(SNAME("font"), SNAME("PopupMenu"), Ref<Font>()); - theme->set_font_size(SNAME("font_size"), SNAME("PopupMenu"), -1); - - theme->set_color(SNAME("font_color"), SNAME("PopupMenu"), control_font_color); - theme->set_color(SNAME("font_accelerator_color"), SNAME("PopupMenu"), Color(0.7, 0.7, 0.7, 0.8)); - theme->set_color(SNAME("font_disabled_color"), SNAME("PopupMenu"), Color(0.4, 0.4, 0.4, 0.8)); - theme->set_color(SNAME("font_hover_color"), SNAME("PopupMenu"), control_font_color); - theme->set_color(SNAME("font_separator_color"), SNAME("PopupMenu"), control_font_color); - theme->set_color(SNAME("font_outline_color"), SNAME("PopupMenu"), Color(1, 1, 1)); - - theme->set_constant(SNAME("hseparation"), SNAME("PopupMenu"), 4 * scale); - theme->set_constant(SNAME("vseparation"), SNAME("PopupMenu"), 4 * scale); - theme->set_constant(SNAME("outline_size"), SNAME("PopupMenu"), 0); - theme->set_constant(SNAME("item_start_padding"), SNAME("PopupMenu"), 2 * scale); - theme->set_constant(SNAME("item_end_padding"), SNAME("PopupMenu"), 2 * scale); + theme->set_stylebox("panel", "PopupMenu", style_popup_panel); + theme->set_stylebox("panel_disabled", "PopupMenu", style_popup_panel_disabled); + theme->set_stylebox("hover", "PopupMenu", make_flat_stylebox(style_popup_hover_color)); + theme->set_stylebox("separator", "PopupMenu", separator_horizontal); + theme->set_stylebox("labeled_separator_left", "PopupMenu", separator_horizontal); + theme->set_stylebox("labeled_separator_right", "PopupMenu", separator_horizontal); + + theme->set_icon("checked", "PopupMenu", icons["checked"]); + theme->set_icon("unchecked", "PopupMenu", icons["unchecked"]); + theme->set_icon("radio_checked", "PopupMenu", icons["radio_checked"]); + theme->set_icon("radio_unchecked", "PopupMenu", icons["radio_unchecked"]); + theme->set_icon("submenu", "PopupMenu", icons["arrow_right"]); + theme->set_icon("submenu_mirrored", "PopupMenu", icons["arrow_left"]); + + theme->set_font("font", "PopupMenu", Ref<Font>()); + theme->set_font_size("font_size", "PopupMenu", -1); + + theme->set_color("font_color", "PopupMenu", control_font_color); + theme->set_color("font_accelerator_color", "PopupMenu", Color(0.7, 0.7, 0.7, 0.8)); + theme->set_color("font_disabled_color", "PopupMenu", Color(0.4, 0.4, 0.4, 0.8)); + theme->set_color("font_hover_color", "PopupMenu", control_font_color); + theme->set_color("font_separator_color", "PopupMenu", control_font_color); + theme->set_color("font_outline_color", "PopupMenu", Color(1, 1, 1)); + + theme->set_constant("hseparation", "PopupMenu", 4 * scale); + theme->set_constant("vseparation", "PopupMenu", 4 * scale); + theme->set_constant("outline_size", "PopupMenu", 0); + theme->set_constant("item_start_padding", "PopupMenu", 2 * scale); + theme->set_constant("item_end_padding", "PopupMenu", 2 * scale); // GraphNode Ref<StyleBoxFlat> graphnode_normal = make_flat_stylebox(style_normal_color, 18, 42, 18, 12); @@ -683,101 +683,101 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, Ref<Te Ref<StyleBoxFlat> graphnode_position = make_flat_stylebox(style_pressed_color, 18, 42, 18, 12, 6, true, 4); graphnode_position->set_border_color(Color(0.98, 0.89, 0.27)); - theme->set_stylebox(SNAME("frame"), SNAME("GraphNode"), graphnode_normal); - theme->set_stylebox(SNAME("selectedframe"), SNAME("GraphNode"), graphnode_selected); - theme->set_stylebox(SNAME("comment"), SNAME("GraphNode"), graphnode_comment_normal); - theme->set_stylebox(SNAME("commentfocus"), SNAME("GraphNode"), graphnode_comment_selected); - theme->set_stylebox(SNAME("breakpoint"), SNAME("GraphNode"), graphnode_breakpoint); - theme->set_stylebox(SNAME("position"), SNAME("GraphNode"), graphnode_position); - - theme->set_icon(SNAME("port"), SNAME("GraphNode"), icons["graph_port"]); - theme->set_icon(SNAME("close"), SNAME("GraphNode"), icons["close"]); - theme->set_icon(SNAME("resizer"), SNAME("GraphNode"), icons["resizer_se"]); - theme->set_font(SNAME("title_font"), SNAME("GraphNode"), Ref<Font>()); - theme->set_color(SNAME("title_color"), SNAME("GraphNode"), control_font_color); - theme->set_color(SNAME("close_color"), SNAME("GraphNode"), control_font_color); - theme->set_color(SNAME("resizer_color"), SNAME("GraphNode"), control_font_color); - theme->set_constant(SNAME("separation"), SNAME("GraphNode"), 2 * scale); - theme->set_constant(SNAME("title_offset"), SNAME("GraphNode"), 26 * scale); - theme->set_constant(SNAME("close_offset"), SNAME("GraphNode"), 22 * scale); - theme->set_constant(SNAME("port_offset"), SNAME("GraphNode"), 0); + theme->set_stylebox("frame", "GraphNode", graphnode_normal); + theme->set_stylebox("selectedframe", "GraphNode", graphnode_selected); + theme->set_stylebox("comment", "GraphNode", graphnode_comment_normal); + theme->set_stylebox("commentfocus", "GraphNode", graphnode_comment_selected); + theme->set_stylebox("breakpoint", "GraphNode", graphnode_breakpoint); + theme->set_stylebox("position", "GraphNode", graphnode_position); + + theme->set_icon("port", "GraphNode", icons["graph_port"]); + theme->set_icon("close", "GraphNode", icons["close"]); + theme->set_icon("resizer", "GraphNode", icons["resizer_se"]); + theme->set_font("title_font", "GraphNode", Ref<Font>()); + theme->set_color("title_color", "GraphNode", control_font_color); + theme->set_color("close_color", "GraphNode", control_font_color); + theme->set_color("resizer_color", "GraphNode", control_font_color); + theme->set_constant("separation", "GraphNode", 2 * scale); + theme->set_constant("title_offset", "GraphNode", 26 * scale); + theme->set_constant("close_offset", "GraphNode", 22 * scale); + theme->set_constant("port_offset", "GraphNode", 0); // Tree - theme->set_stylebox(SNAME("bg"), SNAME("Tree"), make_flat_stylebox(style_normal_color, 4, 4, 4, 5)); - theme->set_stylebox(SNAME("bg_focus"), SNAME("Tree"), focus); - theme->set_stylebox(SNAME("selected"), SNAME("Tree"), make_flat_stylebox(style_selected_color)); - theme->set_stylebox(SNAME("selected_focus"), SNAME("Tree"), make_flat_stylebox(style_selected_color)); - theme->set_stylebox(SNAME("cursor"), SNAME("Tree"), focus); - theme->set_stylebox(SNAME("cursor_unfocused"), SNAME("Tree"), focus); - theme->set_stylebox(SNAME("button_pressed"), SNAME("Tree"), button_pressed); - theme->set_stylebox(SNAME("title_button_normal"), SNAME("Tree"), make_flat_stylebox(style_pressed_color, 4, 4, 4, 4)); - theme->set_stylebox(SNAME("title_button_pressed"), SNAME("Tree"), make_flat_stylebox(style_hover_color, 4, 4, 4, 4)); - theme->set_stylebox(SNAME("title_button_hover"), SNAME("Tree"), make_flat_stylebox(style_normal_color, 4, 4, 4, 4)); - theme->set_stylebox(SNAME("custom_button"), SNAME("Tree"), button_normal); - theme->set_stylebox(SNAME("custom_button_pressed"), SNAME("Tree"), button_pressed); - theme->set_stylebox(SNAME("custom_button_hover"), SNAME("Tree"), button_hover); - - theme->set_icon(SNAME("checked"), SNAME("Tree"), icons["checked"]); - theme->set_icon(SNAME("unchecked"), SNAME("Tree"), icons["unchecked"]); - theme->set_icon(SNAME("indeterminate"), SNAME("Tree"), icons["indeterminate"]); - theme->set_icon(SNAME("updown"), SNAME("Tree"), icons["updown"]); - theme->set_icon(SNAME("select_arrow"), SNAME("Tree"), icons["option_button_arrow"]); - theme->set_icon(SNAME("arrow"), SNAME("Tree"), icons["arrow_down"]); - theme->set_icon(SNAME("arrow_collapsed"), SNAME("Tree"), icons["arrow_right"]); - theme->set_icon(SNAME("arrow_collapsed_mirrored"), SNAME("Tree"), icons["arrow_left"]); - - theme->set_font(SNAME("title_button_font"), SNAME("Tree"), Ref<Font>()); - theme->set_font(SNAME("font"), SNAME("Tree"), Ref<Font>()); - theme->set_font_size(SNAME("font_size"), SNAME("Tree"), -1); - - theme->set_color(SNAME("title_button_color"), SNAME("Tree"), control_font_color); - theme->set_color(SNAME("font_color"), SNAME("Tree"), control_font_low_color); - theme->set_color(SNAME("font_selected_color"), SNAME("Tree"), control_font_pressed_color); - theme->set_color(SNAME("font_outline_color"), SNAME("Tree"), Color(1, 1, 1)); - theme->set_color(SNAME("guide_color"), SNAME("Tree"), Color(0.7, 0.7, 0.7, 0.25)); - theme->set_color(SNAME("drop_position_color"), SNAME("Tree"), Color(1, 0.3, 0.2)); - theme->set_color(SNAME("relationship_line_color"), SNAME("Tree"), Color(0.27, 0.27, 0.27)); - theme->set_color(SNAME("parent_hl_line_color"), SNAME("Tree"), Color(0.27, 0.27, 0.27)); - theme->set_color(SNAME("children_hl_line_color"), SNAME("Tree"), Color(0.27, 0.27, 0.27)); - theme->set_color(SNAME("custom_button_font_highlight"), SNAME("Tree"), control_font_hover_color); - - theme->set_constant(SNAME("hseparation"), SNAME("Tree"), 4 * scale); - theme->set_constant(SNAME("vseparation"), SNAME("Tree"), 4 * scale); - theme->set_constant(SNAME("item_margin"), SNAME("Tree"), 16 * scale); - theme->set_constant(SNAME("button_margin"), SNAME("Tree"), 4 * scale); - theme->set_constant(SNAME("draw_relationship_lines"), SNAME("Tree"), 0); - theme->set_constant(SNAME("relationship_line_width"), SNAME("Tree"), 1); - theme->set_constant(SNAME("parent_hl_line_width"), SNAME("Tree"), 1); - theme->set_constant(SNAME("children_hl_line_width"), SNAME("Tree"), 1); - theme->set_constant(SNAME("parent_hl_line_margin"), SNAME("Tree"), 0); - theme->set_constant(SNAME("draw_guides"), SNAME("Tree"), 1); - theme->set_constant(SNAME("scroll_border"), SNAME("Tree"), 4); - theme->set_constant(SNAME("scroll_speed"), SNAME("Tree"), 12); - theme->set_constant(SNAME("outline_size"), SNAME("Tree"), 0); + theme->set_stylebox("bg", "Tree", make_flat_stylebox(style_normal_color, 4, 4, 4, 5)); + theme->set_stylebox("bg_focus", "Tree", focus); + theme->set_stylebox("selected", "Tree", make_flat_stylebox(style_selected_color)); + theme->set_stylebox("selected_focus", "Tree", make_flat_stylebox(style_selected_color)); + theme->set_stylebox("cursor", "Tree", focus); + theme->set_stylebox("cursor_unfocused", "Tree", focus); + theme->set_stylebox("button_pressed", "Tree", button_pressed); + theme->set_stylebox("title_button_normal", "Tree", make_flat_stylebox(style_pressed_color, 4, 4, 4, 4)); + theme->set_stylebox("title_button_pressed", "Tree", make_flat_stylebox(style_hover_color, 4, 4, 4, 4)); + theme->set_stylebox("title_button_hover", "Tree", make_flat_stylebox(style_normal_color, 4, 4, 4, 4)); + theme->set_stylebox("custom_button", "Tree", button_normal); + theme->set_stylebox("custom_button_pressed", "Tree", button_pressed); + theme->set_stylebox("custom_button_hover", "Tree", button_hover); + + theme->set_icon("checked", "Tree", icons["checked"]); + theme->set_icon("unchecked", "Tree", icons["unchecked"]); + theme->set_icon("indeterminate", "Tree", icons["indeterminate"]); + theme->set_icon("updown", "Tree", icons["updown"]); + theme->set_icon("select_arrow", "Tree", icons["option_button_arrow"]); + theme->set_icon("arrow", "Tree", icons["arrow_down"]); + theme->set_icon("arrow_collapsed", "Tree", icons["arrow_right"]); + theme->set_icon("arrow_collapsed_mirrored", "Tree", icons["arrow_left"]); + + theme->set_font("title_button_font", "Tree", Ref<Font>()); + theme->set_font("font", "Tree", Ref<Font>()); + theme->set_font_size("font_size", "Tree", -1); + + theme->set_color("title_button_color", "Tree", control_font_color); + theme->set_color("font_color", "Tree", control_font_low_color); + theme->set_color("font_selected_color", "Tree", control_font_pressed_color); + theme->set_color("font_outline_color", "Tree", Color(1, 1, 1)); + theme->set_color("guide_color", "Tree", Color(0.7, 0.7, 0.7, 0.25)); + theme->set_color("drop_position_color", "Tree", Color(1, 0.3, 0.2)); + theme->set_color("relationship_line_color", "Tree", Color(0.27, 0.27, 0.27)); + theme->set_color("parent_hl_line_color", "Tree", Color(0.27, 0.27, 0.27)); + theme->set_color("children_hl_line_color", "Tree", Color(0.27, 0.27, 0.27)); + theme->set_color("custom_button_font_highlight", "Tree", control_font_hover_color); + + theme->set_constant("hseparation", "Tree", 4 * scale); + theme->set_constant("vseparation", "Tree", 4 * scale); + theme->set_constant("item_margin", "Tree", 16 * scale); + theme->set_constant("button_margin", "Tree", 4 * scale); + theme->set_constant("draw_relationship_lines", "Tree", 0); + theme->set_constant("relationship_line_width", "Tree", 1); + theme->set_constant("parent_hl_line_width", "Tree", 1); + theme->set_constant("children_hl_line_width", "Tree", 1); + theme->set_constant("parent_hl_line_margin", "Tree", 0); + theme->set_constant("draw_guides", "Tree", 1); + theme->set_constant("scroll_border", "Tree", 4); + theme->set_constant("scroll_speed", "Tree", 12); + theme->set_constant("outline_size", "Tree", 0); // ItemList - theme->set_stylebox(SNAME("bg"), SNAME("ItemList"), make_flat_stylebox(style_normal_color)); - theme->set_stylebox(SNAME("bg_focus"), SNAME("ItemList"), focus); - theme->set_constant(SNAME("hseparation"), SNAME("ItemList"), 4); - theme->set_constant(SNAME("vseparation"), SNAME("ItemList"), 2); - theme->set_constant(SNAME("icon_margin"), SNAME("ItemList"), 4); - theme->set_constant(SNAME("line_separation"), SNAME("ItemList"), 2 * scale); + theme->set_stylebox("bg", "ItemList", make_flat_stylebox(style_normal_color)); + theme->set_stylebox("bg_focus", "ItemList", focus); + theme->set_constant("hseparation", "ItemList", 4); + theme->set_constant("vseparation", "ItemList", 2); + theme->set_constant("icon_margin", "ItemList", 4); + theme->set_constant("line_separation", "ItemList", 2 * scale); - theme->set_font(SNAME("font"), SNAME("ItemList"), Ref<Font>()); - theme->set_font_size(SNAME("font_size"), SNAME("ItemList"), -1); + theme->set_font("font", "ItemList", Ref<Font>()); + theme->set_font_size("font_size", "ItemList", -1); - theme->set_color(SNAME("font_color"), SNAME("ItemList"), control_font_lower_color); - theme->set_color(SNAME("font_selected_color"), SNAME("ItemList"), control_font_pressed_color); - theme->set_color(SNAME("font_outline_color"), SNAME("ItemList"), Color(1, 1, 1)); - theme->set_color(SNAME("guide_color"), SNAME("ItemList"), Color(0, 0, 0, 0.1)); - theme->set_stylebox(SNAME("selected"), SNAME("ItemList"), make_flat_stylebox(style_selected_color)); - theme->set_stylebox(SNAME("selected_focus"), SNAME("ItemList"), make_flat_stylebox(style_selected_color)); - theme->set_stylebox(SNAME("cursor"), SNAME("ItemList"), focus); - theme->set_stylebox(SNAME("cursor_unfocused"), SNAME("ItemList"), focus); + theme->set_color("font_color", "ItemList", control_font_lower_color); + theme->set_color("font_selected_color", "ItemList", control_font_pressed_color); + theme->set_color("font_outline_color", "ItemList", Color(1, 1, 1)); + theme->set_color("guide_color", "ItemList", Color(0, 0, 0, 0.1)); + theme->set_stylebox("selected", "ItemList", make_flat_stylebox(style_selected_color)); + theme->set_stylebox("selected_focus", "ItemList", make_flat_stylebox(style_selected_color)); + theme->set_stylebox("cursor", "ItemList", focus); + theme->set_stylebox("cursor_unfocused", "ItemList", focus); - theme->set_constant(SNAME("outline_size"), SNAME("ItemList"), 0); + theme->set_constant("outline_size", "ItemList", 0); // TabContainer @@ -792,105 +792,105 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, Ref<Te Ref<StyleBoxFlat> style_tab_disabled = style_tab_unselected->duplicate(); style_tab_disabled->set_bg_color(style_disabled_color); - theme->set_stylebox(SNAME("tab_selected"), SNAME("TabContainer"), style_tab_selected); - theme->set_stylebox(SNAME("tab_unselected"), SNAME("TabContainer"), style_tab_unselected); - theme->set_stylebox(SNAME("tab_disabled"), SNAME("TabContainer"), style_tab_disabled); - theme->set_stylebox(SNAME("panel"), SNAME("TabContainer"), make_flat_stylebox(style_normal_color, 0, 0, 0, 0)); + theme->set_stylebox("tab_selected", "TabContainer", style_tab_selected); + theme->set_stylebox("tab_unselected", "TabContainer", style_tab_unselected); + theme->set_stylebox("tab_disabled", "TabContainer", style_tab_disabled); + theme->set_stylebox("panel", "TabContainer", make_flat_stylebox(style_normal_color, 0, 0, 0, 0)); - theme->set_icon(SNAME("increment"), SNAME("TabContainer"), icons["scroll_button_right"]); - theme->set_icon(SNAME("increment_highlight"), SNAME("TabContainer"), icons["scroll_button_right_hl"]); - theme->set_icon(SNAME("decrement"), SNAME("TabContainer"), icons["scroll_button_left"]); - theme->set_icon(SNAME("decrement_highlight"), SNAME("TabContainer"), icons["scroll_button_left_hl"]); - theme->set_icon(SNAME("menu"), SNAME("TabContainer"), icons["tabs_menu"]); - theme->set_icon(SNAME("menu_highlight"), SNAME("TabContainer"), icons["tabs_menu_hl"]); + theme->set_icon("increment", "TabContainer", icons["scroll_button_right"]); + theme->set_icon("increment_highlight", "TabContainer", icons["scroll_button_right_hl"]); + theme->set_icon("decrement", "TabContainer", icons["scroll_button_left"]); + theme->set_icon("decrement_highlight", "TabContainer", icons["scroll_button_left_hl"]); + theme->set_icon("menu", "TabContainer", icons["tabs_menu"]); + theme->set_icon("menu_highlight", "TabContainer", icons["tabs_menu_hl"]); - theme->set_font(SNAME("font"), SNAME("TabContainer"), Ref<Font>()); - theme->set_font_size(SNAME("font_size"), SNAME("TabContainer"), -1); + theme->set_font("font", "TabContainer", Ref<Font>()); + theme->set_font_size("font_size", "TabContainer", -1); - theme->set_color(SNAME("font_selected_color"), SNAME("TabContainer"), control_font_hover_color); - theme->set_color(SNAME("font_unselected_color"), SNAME("TabContainer"), control_font_low_color); - theme->set_color(SNAME("font_disabled_color"), SNAME("TabContainer"), control_font_disabled_color); - theme->set_color(SNAME("font_outline_color"), SNAME("TabContainer"), Color(1, 1, 1)); + theme->set_color("font_selected_color", "TabContainer", control_font_hover_color); + theme->set_color("font_unselected_color", "TabContainer", control_font_low_color); + theme->set_color("font_disabled_color", "TabContainer", control_font_disabled_color); + theme->set_color("font_outline_color", "TabContainer", Color(1, 1, 1)); - theme->set_constant(SNAME("side_margin"), SNAME("TabContainer"), 8 * scale); - theme->set_constant(SNAME("icon_separation"), SNAME("TabContainer"), 4 * scale); - theme->set_constant(SNAME("outline_size"), SNAME("TabContainer"), 0); + theme->set_constant("side_margin", "TabContainer", 8 * scale); + theme->set_constant("icon_separation", "TabContainer", 4 * scale); + theme->set_constant("outline_size", "TabContainer", 0); // TabBar - theme->set_stylebox(SNAME("tab_selected"), SNAME("TabBar"), style_tab_selected); - theme->set_stylebox(SNAME("tab_unselected"), SNAME("TabBar"), style_tab_unselected); - theme->set_stylebox(SNAME("tab_disabled"), SNAME("TabBar"), style_tab_disabled); - theme->set_stylebox(SNAME("button_pressed"), SNAME("TabBar"), button_pressed); - theme->set_stylebox(SNAME("button_highlight"), SNAME("TabBar"), button_normal); + theme->set_stylebox("tab_selected", "TabBar", style_tab_selected); + theme->set_stylebox("tab_unselected", "TabBar", style_tab_unselected); + theme->set_stylebox("tab_disabled", "TabBar", style_tab_disabled); + theme->set_stylebox("button_pressed", "TabBar", button_pressed); + theme->set_stylebox("button_highlight", "TabBar", button_normal); - theme->set_icon(SNAME("increment"), SNAME("TabBar"), icons["scroll_button_right"]); - theme->set_icon(SNAME("increment_highlight"), SNAME("TabBar"), icons["scroll_button_right_hl"]); - theme->set_icon(SNAME("decrement"), SNAME("TabBar"), icons["scroll_button_left"]); - theme->set_icon(SNAME("decrement_highlight"), SNAME("TabBar"), icons["scroll_button_left_hl"]); - theme->set_icon(SNAME("close"), SNAME("TabBar"), icons["close"]); + theme->set_icon("increment", "TabBar", icons["scroll_button_right"]); + theme->set_icon("increment_highlight", "TabBar", icons["scroll_button_right_hl"]); + theme->set_icon("decrement", "TabBar", icons["scroll_button_left"]); + theme->set_icon("decrement_highlight", "TabBar", icons["scroll_button_left_hl"]); + theme->set_icon("close", "TabBar", icons["close"]); - theme->set_font(SNAME("font"), SNAME("TabBar"), Ref<Font>()); - theme->set_font_size(SNAME("font_size"), SNAME("TabBar"), -1); + theme->set_font("font", "TabBar", Ref<Font>()); + theme->set_font_size("font_size", "TabBar", -1); - theme->set_color(SNAME("font_selected_color"), SNAME("TabBar"), control_font_hover_color); - theme->set_color(SNAME("font_unselected_color"), SNAME("TabBar"), control_font_low_color); - theme->set_color(SNAME("font_disabled_color"), SNAME("TabBar"), control_font_disabled_color); - theme->set_color(SNAME("font_outline_color"), SNAME("TabBar"), Color(1, 1, 1)); + theme->set_color("font_selected_color", "TabBar", control_font_hover_color); + theme->set_color("font_unselected_color", "TabBar", control_font_low_color); + theme->set_color("font_disabled_color", "TabBar", control_font_disabled_color); + theme->set_color("font_outline_color", "TabBar", Color(1, 1, 1)); - theme->set_constant(SNAME("hseparation"), SNAME("TabBar"), 4 * scale); - theme->set_constant(SNAME("outline_size"), SNAME("TabBar"), 0); + theme->set_constant("hseparation", "TabBar", 4 * scale); + theme->set_constant("outline_size", "TabBar", 0); // Separators - theme->set_stylebox(SNAME("separator"), SNAME("HSeparator"), separator_horizontal); - theme->set_stylebox(SNAME("separator"), SNAME("VSeparator"), separator_vertical); + theme->set_stylebox("separator", "HSeparator", separator_horizontal); + theme->set_stylebox("separator", "VSeparator", separator_vertical); - theme->set_icon(SNAME("close"), SNAME("Icons"), icons["close"]); - theme->set_font(SNAME("normal"), SNAME("Fonts"), Ref<Font>()); - theme->set_font(SNAME("large"), SNAME("Fonts"), Ref<Font>()); + theme->set_icon("close", "Icons", icons["close"]); + theme->set_font("normal", "Fonts", Ref<Font>()); + theme->set_font("large", "Fonts", Ref<Font>()); - theme->set_constant(SNAME("separation"), SNAME("HSeparator"), 4 * scale); - theme->set_constant(SNAME("separation"), SNAME("VSeparator"), 4 * scale); + theme->set_constant("separation", "HSeparator", 4 * scale); + theme->set_constant("separation", "VSeparator", 4 * scale); // ColorPicker - theme->set_constant(SNAME("margin"), SNAME("ColorPicker"), 4 * scale); - theme->set_constant(SNAME("sv_width"), SNAME("ColorPicker"), 256 * scale); - theme->set_constant(SNAME("sv_height"), SNAME("ColorPicker"), 256 * scale); - theme->set_constant(SNAME("h_width"), SNAME("ColorPicker"), 30 * scale); - theme->set_constant(SNAME("label_width"), SNAME("ColorPicker"), 10 * scale); - - theme->set_icon(SNAME("screen_picker"), SNAME("ColorPicker"), icons["color_picker_pipette"]); - theme->set_icon(SNAME("add_preset"), SNAME("ColorPicker"), icons["add"]); - theme->set_icon(SNAME("color_hue"), SNAME("ColorPicker"), icons["color_picker_hue"]); - theme->set_icon(SNAME("color_sample"), SNAME("ColorPicker"), icons["color_picker_sample"]); - theme->set_icon(SNAME("sample_bg"), SNAME("ColorPicker"), icons["mini_checkerboard"]); - theme->set_icon(SNAME("overbright_indicator"), SNAME("ColorPicker"), icons["color_picker_overbright"]); - theme->set_icon(SNAME("bar_arrow"), SNAME("ColorPicker"), icons["color_picker_bar_arrow"]); - theme->set_icon(SNAME("picker_cursor"), SNAME("ColorPicker"), icons["color_picker_cursor"]); + theme->set_constant("margin", "ColorPicker", 4 * scale); + theme->set_constant("sv_width", "ColorPicker", 256 * scale); + theme->set_constant("sv_height", "ColorPicker", 256 * scale); + theme->set_constant("h_width", "ColorPicker", 30 * scale); + theme->set_constant("label_width", "ColorPicker", 10 * scale); + + theme->set_icon("screen_picker", "ColorPicker", icons["color_picker_pipette"]); + theme->set_icon("add_preset", "ColorPicker", icons["add"]); + theme->set_icon("color_hue", "ColorPicker", icons["color_picker_hue"]); + theme->set_icon("color_sample", "ColorPicker", icons["color_picker_sample"]); + theme->set_icon("sample_bg", "ColorPicker", icons["mini_checkerboard"]); + theme->set_icon("overbright_indicator", "ColorPicker", icons["color_picker_overbright"]); + theme->set_icon("bar_arrow", "ColorPicker", icons["color_picker_bar_arrow"]); + theme->set_icon("picker_cursor", "ColorPicker", icons["color_picker_cursor"]); // ColorPickerButton - theme->set_icon(SNAME("bg"), SNAME("ColorPickerButton"), icons["mini_checkerboard"]); - theme->set_stylebox(SNAME("normal"), SNAME("ColorPickerButton"), button_normal); - theme->set_stylebox(SNAME("pressed"), SNAME("ColorPickerButton"), button_pressed); - theme->set_stylebox(SNAME("hover"), SNAME("ColorPickerButton"), button_hover); - theme->set_stylebox(SNAME("disabled"), SNAME("ColorPickerButton"), button_disabled); - theme->set_stylebox(SNAME("focus"), SNAME("ColorPickerButton"), focus); + theme->set_icon("bg", "ColorPickerButton", icons["mini_checkerboard"]); + theme->set_stylebox("normal", "ColorPickerButton", button_normal); + theme->set_stylebox("pressed", "ColorPickerButton", button_pressed); + theme->set_stylebox("hover", "ColorPickerButton", button_hover); + theme->set_stylebox("disabled", "ColorPickerButton", button_disabled); + theme->set_stylebox("focus", "ColorPickerButton", focus); - theme->set_font(SNAME("font"), SNAME("ColorPickerButton"), Ref<Font>()); - theme->set_font_size(SNAME("font_size"), SNAME("ColorPickerButton"), -1); + theme->set_font("font", "ColorPickerButton", Ref<Font>()); + theme->set_font_size("font_size", "ColorPickerButton", -1); - theme->set_color(SNAME("font_color"), SNAME("ColorPickerButton"), Color(1, 1, 1, 1)); - theme->set_color(SNAME("font_pressed_color"), SNAME("ColorPickerButton"), Color(0.8, 0.8, 0.8, 1)); - theme->set_color(SNAME("font_hover_color"), SNAME("ColorPickerButton"), Color(1, 1, 1, 1)); - theme->set_color(SNAME("font_focus_color"), SNAME("ColorPickerButton"), Color(1, 1, 1, 1)); - theme->set_color(SNAME("font_disabled_color"), SNAME("ColorPickerButton"), Color(0.9, 0.9, 0.9, 0.3)); - theme->set_color(SNAME("font_outline_color"), SNAME("ColorPickerButton"), Color(1, 1, 1)); + theme->set_color("font_color", "ColorPickerButton", Color(1, 1, 1, 1)); + theme->set_color("font_pressed_color", "ColorPickerButton", Color(0.8, 0.8, 0.8, 1)); + theme->set_color("font_hover_color", "ColorPickerButton", Color(1, 1, 1, 1)); + theme->set_color("font_focus_color", "ColorPickerButton", Color(1, 1, 1, 1)); + theme->set_color("font_disabled_color", "ColorPickerButton", Color(0.9, 0.9, 0.9, 0.3)); + theme->set_color("font_outline_color", "ColorPickerButton", Color(1, 1, 1)); - theme->set_constant(SNAME("hseparation"), SNAME("ColorPickerButton"), 2 * scale); - theme->set_constant(SNAME("outline_size"), SNAME("ColorPickerButton"), 0); + theme->set_constant("hseparation", "ColorPickerButton", 2 * scale); + theme->set_constant("outline_size", "ColorPickerButton", 0); // ColorPresetButton @@ -899,118 +899,118 @@ void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, Ref<Te preset_sb->set_corner_detail(2); preset_sb->set_anti_aliased(false); - theme->set_stylebox(SNAME("preset_fg"), SNAME("ColorPresetButton"), preset_sb); - theme->set_icon(SNAME("preset_bg"), SNAME("ColorPresetButton"), icons["mini_checkerboard"]); - theme->set_icon(SNAME("overbright_indicator"), SNAME("ColorPresetButton"), icons["color_picker_overbright"]); + theme->set_stylebox("preset_fg", "ColorPresetButton", preset_sb); + theme->set_icon("preset_bg", "ColorPresetButton", icons["mini_checkerboard"]); + theme->set_icon("overbright_indicator", "ColorPresetButton", icons["color_picker_overbright"]); // TooltipPanel + TooltipLabel - theme->set_stylebox(SNAME("panel"), SNAME("TooltipPanel"), + theme->set_stylebox("panel", "TooltipPanel", make_flat_stylebox(Color(0, 0, 0, 0.5), 2 * default_margin, 0.5 * default_margin, 2 * default_margin, 0.5 * default_margin)); - theme->set_font(SNAME("font"), SNAME("TooltipLabel"), Ref<Font>()); - theme->set_font_size(SNAME("font_size"), SNAME("TooltipLabel"), -1); + theme->set_font("font", "TooltipLabel", Ref<Font>()); + theme->set_font_size("font_size", "TooltipLabel", -1); - theme->set_color(SNAME("font_color"), SNAME("TooltipLabel"), control_font_color); - theme->set_color(SNAME("font_shadow_color"), SNAME("TooltipLabel"), Color(0, 0, 0, 0)); - theme->set_color(SNAME("font_outline_color"), SNAME("TooltipLabel"), Color(0, 0, 0, 0)); + theme->set_color("font_color", "TooltipLabel", control_font_color); + theme->set_color("font_shadow_color", "TooltipLabel", Color(0, 0, 0, 0)); + theme->set_color("font_outline_color", "TooltipLabel", Color(0, 0, 0, 0)); - theme->set_constant(SNAME("shadow_offset_x"), SNAME("TooltipLabel"), 1); - theme->set_constant(SNAME("shadow_offset_y"), SNAME("TooltipLabel"), 1); - theme->set_constant(SNAME("outline_size"), SNAME("TooltipLabel"), 0); + theme->set_constant("shadow_offset_x", "TooltipLabel", 1); + theme->set_constant("shadow_offset_y", "TooltipLabel", 1); + theme->set_constant("outline_size", "TooltipLabel", 0); // RichTextLabel - theme->set_stylebox(SNAME("focus"), SNAME("RichTextLabel"), focus); - theme->set_stylebox(SNAME("normal"), SNAME("RichTextLabel"), make_empty_stylebox(0, 0, 0, 0)); + theme->set_stylebox("focus", "RichTextLabel", focus); + theme->set_stylebox("normal", "RichTextLabel", make_empty_stylebox(0, 0, 0, 0)); - theme->set_font(SNAME("normal_font"), SNAME("RichTextLabel"), Ref<Font>()); - theme->set_font(SNAME("bold_font"), SNAME("RichTextLabel"), Ref<Font>()); - theme->set_font(SNAME("italics_font"), SNAME("RichTextLabel"), Ref<Font>()); - theme->set_font(SNAME("bold_italics_font"), SNAME("RichTextLabel"), Ref<Font>()); - theme->set_font(SNAME("mono_font"), SNAME("RichTextLabel"), Ref<Font>()); + theme->set_font("normal_font", "RichTextLabel", Ref<Font>()); + theme->set_font("bold_font", "RichTextLabel", Ref<Font>()); + theme->set_font("italics_font", "RichTextLabel", Ref<Font>()); + theme->set_font("bold_italics_font", "RichTextLabel", Ref<Font>()); + theme->set_font("mono_font", "RichTextLabel", Ref<Font>()); - theme->set_font_size(SNAME("normal_font_size"), SNAME("RichTextLabel"), -1); - theme->set_font_size(SNAME("bold_font_size"), SNAME("RichTextLabel"), -1); - theme->set_font_size(SNAME("italics_font_size"), SNAME("RichTextLabel"), -1); - theme->set_font_size(SNAME("bold_italics_font_size"), SNAME("RichTextLabel"), -1); - theme->set_font_size(SNAME("mono_font_size"), SNAME("RichTextLabel"), -1); + theme->set_font_size("normal_font_size", "RichTextLabel", -1); + theme->set_font_size("bold_font_size", "RichTextLabel", -1); + theme->set_font_size("italics_font_size", "RichTextLabel", -1); + theme->set_font_size("bold_italics_font_size", "RichTextLabel", -1); + theme->set_font_size("mono_font_size", "RichTextLabel", -1); - theme->set_color(SNAME("default_color"), SNAME("RichTextLabel"), Color(1, 1, 1)); - theme->set_color(SNAME("font_selected_color"), SNAME("RichTextLabel"), Color(0, 0, 0)); - theme->set_color(SNAME("selection_color"), SNAME("RichTextLabel"), Color(0.1, 0.1, 1, 0.8)); + theme->set_color("default_color", "RichTextLabel", Color(1, 1, 1)); + theme->set_color("font_selected_color", "RichTextLabel", Color(0, 0, 0)); + theme->set_color("selection_color", "RichTextLabel", Color(0.1, 0.1, 1, 0.8)); - theme->set_color(SNAME("font_shadow_color"), SNAME("RichTextLabel"), Color(0, 0, 0, 0)); + theme->set_color("font_shadow_color", "RichTextLabel", Color(0, 0, 0, 0)); - theme->set_color(SNAME("font_outline_color"), SNAME("RichTextLabel"), Color(1, 1, 1)); + theme->set_color("font_outline_color", "RichTextLabel", Color(1, 1, 1)); - theme->set_constant(SNAME("shadow_offset_x"), SNAME("RichTextLabel"), 1 * scale); - theme->set_constant(SNAME("shadow_offset_y"), SNAME("RichTextLabel"), 1 * scale); - theme->set_constant(SNAME("shadow_outline_size"), SNAME("RichTextLabel"), 1 * scale); + theme->set_constant("shadow_offset_x", "RichTextLabel", 1 * scale); + theme->set_constant("shadow_offset_y", "RichTextLabel", 1 * scale); + theme->set_constant("shadow_outline_size", "RichTextLabel", 1 * scale); - theme->set_constant(SNAME("line_separation"), SNAME("RichTextLabel"), 0 * scale); - theme->set_constant(SNAME("table_hseparation"), SNAME("RichTextLabel"), 3 * scale); - theme->set_constant(SNAME("table_vseparation"), SNAME("RichTextLabel"), 3 * scale); + theme->set_constant("line_separation", "RichTextLabel", 0 * scale); + theme->set_constant("table_hseparation", "RichTextLabel", 3 * scale); + theme->set_constant("table_vseparation", "RichTextLabel", 3 * scale); - theme->set_constant(SNAME("outline_size"), SNAME("RichTextLabel"), 0); + theme->set_constant("outline_size", "RichTextLabel", 0); - theme->set_color(SNAME("table_odd_row_bg"), SNAME("RichTextLabel"), Color(0, 0, 0, 0)); - theme->set_color(SNAME("table_even_row_bg"), SNAME("RichTextLabel"), Color(0, 0, 0, 0)); - theme->set_color(SNAME("table_border"), SNAME("RichTextLabel"), Color(0, 0, 0, 0)); + theme->set_color("table_odd_row_bg", "RichTextLabel", Color(0, 0, 0, 0)); + theme->set_color("table_even_row_bg", "RichTextLabel", Color(0, 0, 0, 0)); + theme->set_color("table_border", "RichTextLabel", Color(0, 0, 0, 0)); // Containers - theme->set_icon(SNAME("grabber"), SNAME("VSplitContainer"), icons["vsplitter"]); - theme->set_icon(SNAME("grabber"), SNAME("HSplitContainer"), icons["hsplitter"]); - - theme->set_constant(SNAME("separation"), SNAME("HBoxContainer"), 4 * scale); - theme->set_constant(SNAME("separation"), SNAME("VBoxContainer"), 4 * scale); - theme->set_constant(SNAME("margin_left"), SNAME("MarginContainer"), 0 * scale); - theme->set_constant(SNAME("margin_top"), SNAME("MarginContainer"), 0 * scale); - theme->set_constant(SNAME("margin_right"), SNAME("MarginContainer"), 0 * scale); - theme->set_constant(SNAME("margin_bottom"), SNAME("MarginContainer"), 0 * scale); - theme->set_constant(SNAME("hseparation"), SNAME("GridContainer"), 4 * scale); - theme->set_constant(SNAME("vseparation"), SNAME("GridContainer"), 4 * scale); - theme->set_constant(SNAME("separation"), SNAME("HSplitContainer"), 12 * scale); - theme->set_constant(SNAME("separation"), SNAME("VSplitContainer"), 12 * scale); - theme->set_constant(SNAME("autohide"), SNAME("HSplitContainer"), 1 * scale); - theme->set_constant(SNAME("autohide"), SNAME("VSplitContainer"), 1 * scale); - theme->set_constant(SNAME("hseparation"), SNAME("HFlowContainer"), 4 * scale); - theme->set_constant(SNAME("vseparation"), SNAME("HFlowContainer"), 4 * scale); - theme->set_constant(SNAME("hseparation"), SNAME("VFlowContainer"), 4 * scale); - theme->set_constant(SNAME("vseparation"), SNAME("VFlowContainer"), 4 * scale); - - theme->set_stylebox(SNAME("panel"), SNAME("PanelContainer"), make_flat_stylebox(style_normal_color, 0, 0, 0, 0)); - - theme->set_icon(SNAME("minus"), SNAME("GraphEdit"), icons["zoom_less"]); - theme->set_icon(SNAME("reset"), SNAME("GraphEdit"), icons["zoom_reset"]); - theme->set_icon(SNAME("more"), SNAME("GraphEdit"), icons["zoom_more"]); - theme->set_icon(SNAME("snap"), SNAME("GraphEdit"), icons["grid_snap"]); - theme->set_icon(SNAME("minimap"), SNAME("GraphEdit"), icons["grid_minimap"]); - theme->set_icon(SNAME("layout"), SNAME("GraphEdit"), icons["grid_layout"]); - theme->set_stylebox(SNAME("bg"), SNAME("GraphEdit"), make_flat_stylebox(style_normal_color, 4, 4, 4, 5)); - theme->set_color(SNAME("grid_minor"), SNAME("GraphEdit"), Color(1, 1, 1, 0.05)); - theme->set_color(SNAME("grid_major"), SNAME("GraphEdit"), Color(1, 1, 1, 0.2)); - theme->set_color(SNAME("selection_fill"), SNAME("GraphEdit"), Color(1, 1, 1, 0.3)); - theme->set_color(SNAME("selection_stroke"), SNAME("GraphEdit"), Color(1, 1, 1, 0.8)); - theme->set_color(SNAME("activity"), SNAME("GraphEdit"), Color(1, 1, 1)); - theme->set_constant(SNAME("bezier_len_pos"), SNAME("GraphEdit"), 80 * scale); - theme->set_constant(SNAME("bezier_len_neg"), SNAME("GraphEdit"), 160 * scale); + theme->set_icon("grabber", "VSplitContainer", icons["vsplitter"]); + theme->set_icon("grabber", "HSplitContainer", icons["hsplitter"]); + + theme->set_constant("separation", "HBoxContainer", 4 * scale); + theme->set_constant("separation", "VBoxContainer", 4 * scale); + theme->set_constant("margin_left", "MarginContainer", 0 * scale); + theme->set_constant("margin_top", "MarginContainer", 0 * scale); + theme->set_constant("margin_right", "MarginContainer", 0 * scale); + theme->set_constant("margin_bottom", "MarginContainer", 0 * scale); + theme->set_constant("hseparation", "GridContainer", 4 * scale); + theme->set_constant("vseparation", "GridContainer", 4 * scale); + theme->set_constant("separation", "HSplitContainer", 12 * scale); + theme->set_constant("separation", "VSplitContainer", 12 * scale); + theme->set_constant("autohide", "HSplitContainer", 1 * scale); + theme->set_constant("autohide", "VSplitContainer", 1 * scale); + theme->set_constant("hseparation", "HFlowContainer", 4 * scale); + theme->set_constant("vseparation", "HFlowContainer", 4 * scale); + theme->set_constant("hseparation", "VFlowContainer", 4 * scale); + theme->set_constant("vseparation", "VFlowContainer", 4 * scale); + + theme->set_stylebox("panel", "PanelContainer", make_flat_stylebox(style_normal_color, 0, 0, 0, 0)); + + theme->set_icon("minus", "GraphEdit", icons["zoom_less"]); + theme->set_icon("reset", "GraphEdit", icons["zoom_reset"]); + theme->set_icon("more", "GraphEdit", icons["zoom_more"]); + theme->set_icon("snap", "GraphEdit", icons["grid_snap"]); + theme->set_icon("minimap", "GraphEdit", icons["grid_minimap"]); + theme->set_icon("layout", "GraphEdit", icons["grid_layout"]); + theme->set_stylebox("bg", "GraphEdit", make_flat_stylebox(style_normal_color, 4, 4, 4, 5)); + theme->set_color("grid_minor", "GraphEdit", Color(1, 1, 1, 0.05)); + theme->set_color("grid_major", "GraphEdit", Color(1, 1, 1, 0.2)); + theme->set_color("selection_fill", "GraphEdit", Color(1, 1, 1, 0.3)); + theme->set_color("selection_stroke", "GraphEdit", Color(1, 1, 1, 0.8)); + theme->set_color("activity", "GraphEdit", Color(1, 1, 1)); + theme->set_constant("bezier_len_pos", "GraphEdit", 80 * scale); + theme->set_constant("bezier_len_neg", "GraphEdit", 160 * scale); // Visual Node Ports - theme->set_constant(SNAME("port_grab_distance_horizontal"), SNAME("GraphEdit"), 24 * scale); - theme->set_constant(SNAME("port_grab_distance_vertical"), SNAME("GraphEdit"), 26 * scale); + theme->set_constant("port_grab_distance_horizontal", "GraphEdit", 24 * scale); + theme->set_constant("port_grab_distance_vertical", "GraphEdit", 26 * scale); - theme->set_stylebox(SNAME("bg"), SNAME("GraphEditMinimap"), make_flat_stylebox(Color(0.24, 0.24, 0.24), 0, 0, 0, 0)); + theme->set_stylebox("bg", "GraphEditMinimap", make_flat_stylebox(Color(0.24, 0.24, 0.24), 0, 0, 0, 0)); Ref<StyleBoxFlat> style_minimap_camera = make_flat_stylebox(Color(0.65, 0.65, 0.65, 0.2), 0, 0, 0, 0, 0); style_minimap_camera->set_border_color(Color(0.65, 0.65, 0.65, 0.45)); style_minimap_camera->set_border_width_all(1); - theme->set_stylebox(SNAME("camera"), SNAME("GraphEditMinimap"), style_minimap_camera); - theme->set_stylebox(SNAME("node"), SNAME("GraphEditMinimap"), make_flat_stylebox(Color(1, 1, 1), 0, 0, 0, 0, 2)); + theme->set_stylebox("camera", "GraphEditMinimap", style_minimap_camera); + theme->set_stylebox("node", "GraphEditMinimap", make_flat_stylebox(Color(1, 1, 1), 0, 0, 0, 0, 2)); - theme->set_icon(SNAME("resizer"), SNAME("GraphEditMinimap"), icons["resizer_nw"]); - theme->set_color(SNAME("resizer_color"), SNAME("GraphEditMinimap"), Color(1, 1, 1, 0.85)); + theme->set_icon("resizer", "GraphEditMinimap", icons["resizer_nw"]); + theme->set_color("resizer_color", "GraphEditMinimap", Color(1, 1, 1, 0.85)); // Theme diff --git a/scene/resources/resource_format_text.cpp b/scene/resources/resource_format_text.cpp index 6bb710b1d9..c03faa2c2d 100644 --- a/scene/resources/resource_format_text.cpp +++ b/scene/resources/resource_format_text.cpp @@ -1951,7 +1951,7 @@ Error ResourceFormatSaverTextInstance::save(const String &p_path, const RES &p_r } Error ResourceFormatSaverText::save(const String &p_path, const RES &p_resource, uint32_t p_flags) { - if (p_path.ends_with(".sct") && p_resource->get_class() != "PackedScene") { + if (p_path.ends_with(".tscn") && !Ref<PackedScene>(p_resource).is_valid()) { return ERR_FILE_UNRECOGNIZED; } @@ -1960,14 +1960,14 @@ Error ResourceFormatSaverText::save(const String &p_path, const RES &p_resource, } bool ResourceFormatSaverText::recognize(const RES &p_resource) const { - return true; // all recognized! + return true; // All resources recognized! } void ResourceFormatSaverText::get_recognized_extensions(const RES &p_resource, List<String> *p_extensions) const { - if (p_resource->get_class() == "PackedScene") { - p_extensions->push_back("tscn"); //text scene + if (Ref<PackedScene>(p_resource).is_valid()) { + p_extensions->push_back("tscn"); // Text scene. } else { - p_extensions->push_back("tres"); //text resource + p_extensions->push_back("tres"); // Text resource. } } diff --git a/scene/resources/tile_set.cpp b/scene/resources/tile_set.cpp index 1f77cc0570..1e84947b87 100644 --- a/scene/resources/tile_set.cpp +++ b/scene/resources/tile_set.cpp @@ -4434,7 +4434,7 @@ void TileSetAtlasSource::_update_padded_texture() { Ref<Image> image; image.instantiate(); - image->create(size.x, size.y, false, Image::FORMAT_RGBA8); + image->create(size.x, size.y, false, src->get_format()); for (KeyValue<Vector2i, TileAlternativesData> kv : tiles) { for (int frame = 0; frame < (int)kv.value.animation_frames_durations.size(); frame++) { diff --git a/servers/rendering_server.cpp b/servers/rendering_server.cpp index 584abbc351..ac181cb5eb 100644 --- a/servers/rendering_server.cpp +++ b/servers/rendering_server.cpp @@ -933,7 +933,7 @@ Error RenderingServer::mesh_create_surface_data_from_arrays(SurfaceData *r_surfa } } - ERR_FAIL_COND_V_MSG((bsformat & RS::ARRAY_FORMAT_BLEND_SHAPE_MASK) != (format & RS::ARRAY_FORMAT_BLEND_SHAPE_MASK), ERR_INVALID_PARAMETER, "Blend shape format must match the main array format for Vertex, Normal and Tangent arrays."); + ERR_FAIL_COND_V_MSG(bsformat != (format & RS::ARRAY_FORMAT_BLEND_SHAPE_MASK), ERR_INVALID_PARAMETER, "Blend shape format must match the main array format for Vertex, Normal and Tangent arrays."); } } diff --git a/servers/rendering_server.h b/servers/rendering_server.h index 472fff1bf1..d21f3a3299 100644 --- a/servers/rendering_server.h +++ b/servers/rendering_server.h @@ -259,7 +259,7 @@ public: ARRAY_FORMAT_WEIGHTS = 1 << ARRAY_WEIGHTS, ARRAY_FORMAT_INDEX = 1 << ARRAY_INDEX, - ARRAY_FORMAT_BLEND_SHAPE_MASK = (~(ARRAY_FORMAT_COLOR | ARRAY_FORMAT_TEX_UV | ARRAY_FORMAT_TEX_UV2 | ARRAY_FORMAT_BONES | ARRAY_FORMAT_WEIGHTS | ARRAY_FORMAT_CUSTOM0 | ARRAY_FORMAT_CUSTOM1 | ARRAY_FORMAT_CUSTOM2 | ARRAY_FORMAT_CUSTOM3 | ARRAY_FORMAT_INDEX)) & 0x7FFFFFFF, + ARRAY_FORMAT_BLEND_SHAPE_MASK = ARRAY_FORMAT_VERTEX | ARRAY_FORMAT_NORMAL | ARRAY_FORMAT_TANGENT, ARRAY_FORMAT_CUSTOM_BASE = (ARRAY_INDEX + 1), ARRAY_FORMAT_CUSTOM_BITS = 3, diff --git a/tests/scene/test_gui.cpp b/tests/scene/test_gui.cpp index 9da6063c7b..cd5624b70c 100644 --- a/tests/scene/test_gui.cpp +++ b/tests/scene/test_gui.cpp @@ -103,7 +103,7 @@ public: item->set_editable(0, true); item->set_range_config(0, 0, 20, 0.1); item->set_range(0, 2); - item->add_button(0, Theme::get_default()->get_icon(SNAME("folder"), SNAME("FileDialog"))); + item->add_button(0, Theme::get_default()->get_icon("folder", "FileDialog")); item->set_cell_mode(1, TreeItem::CELL_MODE_RANGE); item->set_editable(1, true); item->set_range_config(1, 0, 20, 0.1); |