Merge pull request #41100 from bruvzg/ctl_text_server_interface

[Complex Text Layouts] Implement TextServer interface.
This commit is contained in:
Rémi Verschelde 2020-11-28 09:03:15 +01:00 committed by GitHub
commit a6751e6c58
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
980 changed files with 386729 additions and 5108 deletions

View file

@ -157,6 +157,11 @@ Copyright: 2018, Source Foundry Authors
2003, Bitstream Inc.
License: Expat and Bitstream Vera Fonts Copyright
Files: ./thirdparty/fonts/Tamsyn*.png
Comment: Tamsyn font
Copyright: 2015, Scott Fial
License: Tamsyn
Files: ./thirdparty/freetype/
Comment: The FreeType Project
Copyright: 1996-2020, David Turner, Robert Wilhelm, and Werner Lemberg.
@ -169,6 +174,33 @@ Copyright: 2015-2020 Google, Inc.
2002, NVIDIA Corporation.
License: glslang
Files: ./thirdparty/graphite/
Comment: Graphite engine
Copyright: 2010, SIL International
License: MPL-2.0
Files: ./thirdparty/harfbuzz/
Comment: HarfBuzz text shaping library
Copyright: 2010,2011,2012,2013,2014,2015,2016,2017,2018,2019,2020 Google, Inc.
2018,2019,2020 Ebrahim Byagowi
2019,2020 Facebook, Inc.
2012 Mozilla Foundation
2011 Codethink Limited
2008,2010 Nokia Corporation and/or its subsidiary(-ies)
2009 Keith Stribley
2009 Martin Hosken and SIL International
2007 Chris Wilson
2006 Behdad Esfahbod
2005 David Turner
2004,2007,2008,2009,2010 Red Hat, Inc.
1998-2004 David Turner and Werner Lemberg
License: HarfBuzz
Files: ./thirdparty/icu4c/
Comment: International Components for Unicode
Copyright: 1991-2020, Unicode
License: Unicode
Files: ./thirdparty/jpeg_compressor/
Comment: jpeg-compressor
Copyright: 2012, Rich Geldreich
@ -1175,6 +1207,46 @@ License: FTL
Robert Wilhelm <robert.wilhelm@freetype.org>
Werner Lemberg <werner.lemberg@freetype.org>
License: HarfBuzz
HarfBuzz is licensed under the so-called "Old MIT" license. Details follow.
For parts of HarfBuzz that are licensed under different licenses see individual
files names COPYING in subdirectories where applicable.
.
Copyright (C) 2010,2011,2012,2013,2014,2015,2016,2017,2018,2019,2020 Google, Inc.
Copyright (C) 2018,2019,2020 Ebrahim Byagowi
Copyright (C) 2019,2020 Facebook, Inc.
Copyright (C) 2012 Mozilla Foundation
Copyright (C) 2011 Codethink Limited
Copyright (C) 2008,2010 Nokia Corporation and/or its subsidiary(-ies)
Copyright (C) 2009 Keith Stribley
Copyright (C) 2009 Martin Hosken and SIL International
Copyright (C) 2007 Chris Wilson
Copyright (C) 2006 Behdad Esfahbod
Copyright (C) 2005 David Turner
Copyright (C) 2004,2007,2008,2009,2010 Red Hat, Inc.
Copyright (C) 1998-2004 David Turner and Werner Lemberg
.
For full copyright notices consult the individual files in the package.
.
.
Permission is hereby granted, without written agreement and without
license or royalty fees, to use, copy, modify, and distribute this
software and its documentation for any purpose, provided that the
above copyright notice and the following two paragraphs appear in
all copies of this software.
.
IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
DAMAGE.
.
THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
License: MPL-2.0
Mozilla Public License Version 2.0
==================================
@ -1633,6 +1705,53 @@ License: OFL-1.1
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE.
License: Tamsyn
Tamsyn font is free. You are hereby granted permission to use, copy, modify,
and distribute it as you see fit.
.
Tamsyn font is provided "as is" without any express or implied warranty.
.
The author makes no representations about the suitability of this font for
a particular purpose.
.
In no event will the author be held liable for damages arising from the use
of this font.
License: Unicode
COPYRIGHT AND PERMISSION NOTICE (ICU 58 and later)
.
Copyright (C) 1991-2020 Unicode, Inc. All rights reserved.
Distributed under the Terms of Use in https://www.unicode.org/copyright.html.
.
Permission is hereby granted, free of charge, to any person obtaining
a copy of the Unicode data files and any associated documentation
(the "Data Files") or Unicode software and any associated documentation
(the "Software") to deal in the Data Files or Software
without restriction, including without limitation the rights to use,
copy, modify, merge, publish, distribute, and/or sell copies of
the Data Files or Software, and to permit persons to whom the Data Files
or Software are furnished to do so, provided that either
(a) this copyright and permission notice appear with all copies
of the Data Files or Software, or
(b) this copyright and permission notice appear in associated
Documentation.
.
THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF
ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT OF THIRD PARTY RIGHTS.
IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS
NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL
DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THE DATA FILES OR SOFTWARE.
.
Except as contained in this notice, the name of a copyright holder
shall not be used in advertising or otherwise to promote the sale,
use or other dealings in these Data Files or Software without prior
written authorization of the copyright holder.
License: Zlib
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages

View file

@ -144,6 +144,9 @@ opts.Add(BoolVariable("builtin_certs", "Use the built-in SSL certificates bundle
opts.Add(BoolVariable("builtin_enet", "Use the built-in ENet library", True))
opts.Add(BoolVariable("builtin_freetype", "Use the built-in FreeType library", True))
opts.Add(BoolVariable("builtin_glslang", "Use the built-in glslang library", True))
opts.Add(BoolVariable("builtin_graphite", "Use the built-in Graphite library", True))
opts.Add(BoolVariable("builtin_harfbuzz", "Use the built-in HarfBuzz library", True))
opts.Add(BoolVariable("builtin_icu", "Use the built-in ICU library", True))
opts.Add(BoolVariable("builtin_libogg", "Use the built-in libogg library", True))
opts.Add(BoolVariable("builtin_libpng", "Use the built-in libpng library", True))
opts.Add(BoolVariable("builtin_libtheora", "Use the built-in libtheora library", True))

View file

@ -128,6 +128,7 @@ void register_global_constants() {
BIND_CORE_ENUM_CONSTANT(HALIGN_LEFT);
BIND_CORE_ENUM_CONSTANT(HALIGN_CENTER);
BIND_CORE_ENUM_CONSTANT(HALIGN_RIGHT);
BIND_CORE_ENUM_CONSTANT(HALIGN_FILL);
BIND_CORE_ENUM_CONSTANT(VALIGN_TOP);
BIND_CORE_ENUM_CONSTANT(VALIGN_CENTER);

View file

@ -73,7 +73,8 @@ enum Orientation {
enum HAlign {
HALIGN_LEFT,
HALIGN_CENTER,
HALIGN_RIGHT
HALIGN_RIGHT,
HALIGN_FILL,
};
enum VAlign {

View file

@ -47,6 +47,7 @@ void MainLoop::_bind_methods() {
BIND_CONSTANT(NOTIFICATION_APPLICATION_PAUSED);
BIND_CONSTANT(NOTIFICATION_APPLICATION_FOCUS_IN);
BIND_CONSTANT(NOTIFICATION_APPLICATION_FOCUS_OUT);
BIND_CONSTANT(NOTIFICATION_TEXT_SERVER_CHANGED);
ADD_SIGNAL(MethodInfo("on_request_permissions_result", PropertyInfo(Variant::STRING, "permission"), PropertyInfo(Variant::BOOL, "granted")));
};

View file

@ -56,6 +56,7 @@ public:
NOTIFICATION_APPLICATION_PAUSED = 2015,
NOTIFICATION_APPLICATION_FOCUS_IN = 2016,
NOTIFICATION_APPLICATION_FOCUS_OUT = 2017,
NOTIFICATION_TEXT_SERVER_CHANGED = 2018,
};
virtual void init();

View file

@ -34,6 +34,11 @@
#include "core/io/resource_loader.h"
#include "core/os/os.h"
#ifdef TOOLS_ENABLED
#include "editor/editor_settings.h"
#include "main/main.h"
#endif
// ISO 639-1 language codes, with the addition of glibc locales with their
// regional identifiers. This list must match the language names (in English)
// of locale_names.
@ -1214,6 +1219,22 @@ void TranslationServer::set_tool_translation(const Ref<Translation> &p_translati
tool_translation = p_translation;
}
Ref<Translation> TranslationServer::get_tool_translation() const {
return tool_translation;
}
String TranslationServer::get_tool_locale() {
#ifdef TOOLS_ENABLED
if (TranslationServer::get_singleton()->get_tool_translation().is_valid() && (Engine::get_singleton()->is_editor_hint() || Main::is_project_manager())) {
return tool_translation->get_locale();
} else {
#else
{
#endif
return get_locale();
}
}
StringName TranslationServer::tool_translate(const StringName &p_message, const StringName &p_context) const {
if (tool_translation.is_valid()) {
StringName r = tool_translation->get_message(p_message, p_context);

View file

@ -110,7 +110,9 @@ public:
static String standardize_locale(const String &p_locale);
static String get_language_code(const String &p_locale);
String get_tool_locale();
void set_tool_translation(const Ref<Translation> &p_translation);
Ref<Translation> get_tool_translation() const;
StringName tool_translate(const StringName &p_message, const StringName &p_context = "") const;
StringName tool_translate_plural(const StringName &p_message, const StringName &p_message_plural, int p_n, const StringName &p_context = "") const;
void set_doc_translation(const Ref<Translation> &p_translation);

View file

@ -209,7 +209,6 @@ void CharString::copy_from(const char *p_cstr) {
/* String */
/*************************************************************************/
//TODO: move to TextServer
//kind of poor should be rewritten properly
String String::word_wrap(int p_chars_per_line) const {
int from = 0;
@ -4796,7 +4795,7 @@ Vector<uint8_t> String::to_utf16_buffer() const {
Char16String charstr = s->utf16();
Vector<uint8_t> retval;
size_t len = charstr.length() * 2;
size_t len = charstr.length() * sizeof(char16_t);
retval.resize(len);
uint8_t *w = retval.ptrw();
copymem(w, (const void *)charstr.ptr(), len);
@ -4811,7 +4810,7 @@ Vector<uint8_t> String::to_utf32_buffer() const {
}
Vector<uint8_t> retval;
size_t len = s->length() * 4;
size_t len = s->length() * sizeof(char32_t);
retval.resize(len);
uint8_t *w = retval.ptrw();
copymem(w, (const void *)s->ptr(), len);

View file

@ -28,8 +28,9 @@
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
#ifndef USTRING_H
#define USTRING_H
#ifndef USTRING_GODOT_H
#define USTRING_GODOT_H
// Note: Renamed to avoid conflict with ICU header with the same name.
#include "core/templates/cowdata.h"
#include "core/templates/vector.h"
@ -555,4 +556,4 @@ _FORCE_INLINE_ Vector<String> sarray(P... p_args) {
return arr;
}
#endif // USTRING_H
#endif // USTRING_GODOT_H

View file

@ -114,6 +114,24 @@ static inline uint32_t make_uint32_t(T p_in) {
return _u._u32;
}
static inline uint64_t hash_djb2_one_float_64(double p_in, uint64_t p_prev = 5381) {
union {
double d;
uint64_t i;
} u;
// Normalize +/- 0.0 and NaN values so they hash the same.
if (p_in == 0.0f) {
u.d = 0.0;
} else if (Math::is_nan(p_in)) {
u.d = Math_NAN;
} else {
u.d = p_in;
}
return ((p_prev << 5) + p_prev) + u.i;
}
static inline uint64_t hash_djb2_one_64(uint64_t p_in, uint64_t p_prev = 5381) {
return ((p_prev << 5) + p_prev) + p_in;
}

126
core/templates/lru.h Normal file
View file

@ -0,0 +1,126 @@
/*************************************************************************/
/* lru.h */
/*************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
/* "Software"), to deal in the Software without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of the Software, and to */
/* permit persons to whom the Software is furnished to do so, subject to */
/* the following conditions: */
/* */
/* The above copyright notice and this permission notice shall be */
/* included in all copies or substantial portions of the Software. */
/* */
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
#ifndef LRU_H
#define LRU_H
#include "core/math/math_funcs.h"
#include "hash_map.h"
#include "list.h"
template <class TKey, class TData>
class LRUCache {
private:
struct Pair {
TKey key;
TData data;
Pair() {}
Pair(const TKey &p_key, const TData &p_data) :
key(p_key),
data(p_data) {
}
};
typedef typename List<Pair>::Element *Element;
List<Pair> _list;
HashMap<TKey, Element> _map;
size_t capacity;
public:
const TData *insert(const TKey &p_key, const TData &p_value) {
Element *e = _map.getptr(p_key);
Element n = _list.push_front(Pair(p_key, p_value));
if (e) {
_list.erase(*e);
_map.erase(p_key);
}
_map[p_key] = _list.front();
while (_map.size() > capacity) {
Element d = _list.back();
_map.erase(d->get().key);
_list.pop_back();
}
return &n->get().data;
}
void clear() {
_map.clear();
_list.clear();
}
bool has(const TKey &p_key) const {
return _map.getptr(p_key);
}
const TData &get(const TKey &p_key) {
Element *e = _map.getptr(p_key);
CRASH_COND(!e);
_list.move_to_front(*e);
return (*e)->get().data;
};
const TData *getptr(const TKey &p_key) {
Element *e = _map.getptr(p_key);
if (!e) {
return nullptr;
} else {
_list.move_to_front(*e);
return &(*e)->get().data;
}
}
_FORCE_INLINE_ size_t get_capacity() const { return capacity; }
void set_capacity(size_t p_capacity) {
if (capacity > 0) {
capacity = p_capacity;
while (_map.size() > capacity) {
Element d = _list.back();
_map.erase(d->get().key);
_list.pop_back();
}
}
}
LRUCache() {
capacity = 64;
}
LRUCache(int p_capacity) {
capacity = p_capacity;
}
};
#endif

View file

@ -418,7 +418,7 @@ struct _VariantCall {
String s;
if (p_instance->size() > 0) {
const uint8_t *r = p_instance->ptr();
s.parse_utf16((const char16_t *)r, p_instance->size() / 2);
s.parse_utf16((const char16_t *)r, floor((double)p_instance->size() / (double)sizeof(char16_t)));
}
return s;
}
@ -427,7 +427,7 @@ struct _VariantCall {
String s;
if (p_instance->size() > 0) {
const uint8_t *r = p_instance->ptr();
s = String((const char32_t *)r, p_instance->size() / 4);
s = String((const char32_t *)r, floor((double)p_instance->size() / (double)sizeof(char32_t)));
}
return s;
}

View file

@ -1236,6 +1236,9 @@
<member name="ResourceSaver" type="ResourceSaver" setter="" getter="">
The [ResourceSaver] singleton.
</member>
<member name="TextServerManager" type="TextServerManager" setter="" getter="">
The [TextServerManager] singleton.
</member>
<member name="TranslationServer" type="TranslationServer" setter="" getter="">
The [TranslationServer] singleton.
</member>
@ -1286,6 +1289,9 @@
<constant name="HALIGN_RIGHT" value="2" enum="HAlign">
Horizontal right alignment, usually for text-derived classes.
</constant>
<constant name="HALIGN_FILL" value="3" enum="HAlign">
Expand row to fit width, usually for text-derived classes.
</constant>
<constant name="VALIGN_TOP" value="0" enum="VAlign">
Vertical top alignment, usually for text-derived classes.
</constant>

View file

@ -1,112 +0,0 @@
<?xml version="1.0" encoding="UTF-8" ?>
<class name="BitmapFont" inherits="Font" version="4.0">
<brief_description>
Renders text using fonts under the [url=https://www.angelcode.com/products/bmfont/]BMFont[/url] format.
Handles files with the [code].fnt[/code] extension.
</brief_description>
<description>
Renders text using [code]*.fnt[/code] fonts containing texture atlases. Supports distance fields. For using vector font files like TTF directly, see [DynamicFont].
</description>
<tutorials>
</tutorials>
<methods>
<method name="add_char">
<return type="void">
</return>
<argument index="0" name="character" type="int">
</argument>
<argument index="1" name="texture" type="int">
</argument>
<argument index="2" name="rect" type="Rect2">
</argument>
<argument index="3" name="align" type="Vector2" default="Vector2( 0, 0 )">
</argument>
<argument index="4" name="advance" type="float" default="-1">
</argument>
<description>
Adds a character to the font, where [code]character[/code] is the Unicode value, [code]texture[/code] is the texture index, [code]rect[/code] is the region in the texture (in pixels!), [code]align[/code] is the (optional) alignment for the character and [code]advance[/code] is the (optional) advance.
</description>
</method>
<method name="add_kerning_pair">
<return type="void">
</return>
<argument index="0" name="char_a" type="int">
</argument>
<argument index="1" name="char_b" type="int">
</argument>
<argument index="2" name="kerning" type="int">
</argument>
<description>
Adds a kerning pair to the [BitmapFont] as a difference. Kerning pairs are special cases where a typeface advance is determined by the next character.
</description>
</method>
<method name="add_texture">
<return type="void">
</return>
<argument index="0" name="texture" type="Texture2D">
</argument>
<description>
Adds a texture to the [BitmapFont].
</description>
</method>
<method name="clear">
<return type="void">
</return>
<description>
Clears all the font data and settings.
</description>
</method>
<method name="create_from_fnt">
<return type="int" enum="Error">
</return>
<argument index="0" name="path" type="String">
</argument>
<description>
Creates a BitmapFont from the [code]*.fnt[/code] file at [code]path[/code].
</description>
</method>
<method name="get_kerning_pair" qualifiers="const">
<return type="int">
</return>
<argument index="0" name="char_a" type="int">
</argument>
<argument index="1" name="char_b" type="int">
</argument>
<description>
Returns a kerning pair as a difference.
</description>
</method>
<method name="get_texture" qualifiers="const">
<return type="Texture2D">
</return>
<argument index="0" name="idx" type="int">
</argument>
<description>
Returns the font atlas texture at index [code]idx[/code].
</description>
</method>
<method name="get_texture_count" qualifiers="const">
<return type="int">
</return>
<description>
Returns the number of textures in the BitmapFont atlas.
</description>
</method>
</methods>
<members>
<member name="ascent" type="float" setter="set_ascent" getter="get_ascent" default="0.0">
Ascent (number of pixels above the baseline).
</member>
<member name="distance_field" type="bool" setter="set_distance_field_hint" getter="is_distance_field_hint" default="false">
If [code]true[/code], distance field hint is enabled.
</member>
<member name="fallback" type="BitmapFont" setter="set_fallback" getter="get_fallback">
The fallback font.
</member>
<member name="height" type="float" setter="set_height" getter="get_height" default="1.0">
Total font height (ascent plus descent) in pixels.
</member>
</members>
<constants>
</constants>
</class>

View file

@ -40,6 +40,33 @@
<link title="OS Test Demo">https://godotengine.org/asset-library/asset/677</link>
</tutorials>
<methods>
<method name="clear_opentype_features">
<return type="void">
</return>
<description>
Removes all OpenType features.
</description>
</method>
<method name="get_opentype_feature" qualifiers="const">
<return type="int">
</return>
<argument index="0" name="tag" type="String">
</argument>
<description>
Returns OpenType feature [code]tag[/code].
</description>
</method>
<method name="set_opentype_feature">
<return type="void">
</return>
<argument index="0" name="tag" type="String">
</argument>
<argument index="1" name="value" type="int">
</argument>
<description>
Sets OpenType feature [code]tag[/code]. More info: [url=https://docs.microsoft.com/en-us/typography/opentype/spec/featuretags]OpenType feature tags[/url].
</description>
</method>
</methods>
<members>
<member name="align" type="int" setter="set_text_align" getter="get_text_align" enum="Button.TextAlign" default="1">
@ -57,9 +84,15 @@
<member name="icon" type="Texture2D" setter="set_button_icon" getter="get_button_icon">
Button's icon, if text is present the icon will be placed before the text.
</member>
<member name="language" type="String" setter="set_language" getter="get_language" default="&quot;&quot;">
Language code used for line-breaking and text shaping algorithms, if left empty current locale is used instead.
</member>
<member name="text" type="String" setter="set_text" getter="get_text" default="&quot;&quot;">
The button's text that will be displayed inside the button's area.
</member>
<member name="text_direction" type="int" setter="set_text_direction" getter="get_text_direction" enum="Control.TextDirection" default="0">
Base text writing direction.
</member>
</members>
<constants>
<constant name="ALIGN_LEFT" value="0" enum="TextAlign">
@ -94,6 +127,12 @@
<theme_item name="font_color_pressed" type="Color" default="Color( 1, 1, 1, 1 )">
Text [Color] used when the [Button] is being pressed.
</theme_item>
<theme_item name="font_outline_modulate" type="Color" default="Color( 1, 1, 1, 1 )">
Text oubline [Color] of the [Button].
</theme_item>
<theme_item name="font_size" type="int">
Font size of the [Button]'s text.
</theme_item>
<theme_item name="hover" type="StyleBox">
[StyleBox] used when the [Button] is being hovered.
</theme_item>
@ -103,6 +142,9 @@
<theme_item name="normal" type="StyleBox">
Default [StyleBox] for the [Button].
</theme_item>
<theme_item name="outline_size" type="int" default="0">
Size of the [Button]'s text outline.
</theme_item>
<theme_item name="pressed" type="StyleBox">
[StyleBox] used when the [Button] is being pressed.
</theme_item>

View file

@ -45,18 +45,24 @@
Draws an arc between the given angles. The larger the value of [code]point_count[/code], the smoother the curve.
</description>
</method>
<method name="draw_char">
<method name="draw_char" qualifiers="const">
<return type="float">
</return>
<argument index="0" name="font" type="Font">
</argument>
<argument index="1" name="position" type="Vector2">
<argument index="1" name="pos" type="Vector2">
</argument>
<argument index="2" name="char" type="String">
</argument>
<argument index="3" name="next" type="String">
<argument index="3" name="next" type="String" default="&quot;&quot;">
</argument>
<argument index="4" name="modulate" type="Color" default="Color( 1, 1, 1, 1 )">
<argument index="4" name="size" type="int" default="-1">
</argument>
<argument index="5" name="modulate" type="Color" default="Color( 1, 1, 1, 1 )">
</argument>
<argument index="6" name="outline_size" type="int" default="0">
</argument>
<argument index="7" name="outline_modulate" type="Color" default="Color( 1, 1, 1, 0 )">
</argument>
<description>
Draws a string character using a custom font. Returns the advance, depending on the character width and kerning with an optional next character.
@ -146,6 +152,35 @@
Draws multiple, parallel lines with a uniform [code]width[/code] and segment-by-segment coloring. Colors assigned to line segments match by index between [code]points[/code] and [code]colors[/code].
</description>
</method>
<method name="draw_multiline_string" qualifiers="const">
<return type="void">
</return>
<argument index="0" name="font" type="Font">
</argument>
<argument index="1" name="pos" type="Vector2">
</argument>
<argument index="2" name="text" type="String">
</argument>
<argument index="3" name="align" type="int" enum="HAlign" default="0">
</argument>
<argument index="4" name="width" type="float" default="-1">
</argument>
<argument index="5" name="max_lines" type="int" default="-1">
</argument>
<argument index="6" name="size" type="int" default="-1">
</argument>
<argument index="7" name="modulate" type="Color" default="Color( 1, 1, 1, 1 )">
</argument>
<argument index="8" name="outline_size" type="int" default="0">
</argument>
<argument index="9" name="outline_modulate" type="Color" default="Color( 1, 1, 1, 0 )">
</argument>
<argument index="10" name="flags" type="int" default="51">
</argument>
<description>
Breaks [code]text[/code] to the lines and draws it using the specified [code]font[/code] at the [code]position[/code] (top-left corner). The text will have its color multiplied by [code]modulate[/code]. If [code]clip_w[/code] is greater than or equal to 0, the text will be clipped if it exceeds the specified width.
</description>
</method>
<method name="draw_multimesh">
<return type="void">
</return>
@ -253,18 +288,28 @@
Sets a custom transform for drawing via matrix. Anything drawn afterwards will be transformed by this.
</description>
</method>
<method name="draw_string">
<method name="draw_string" qualifiers="const">
<return type="void">
</return>
<argument index="0" name="font" type="Font">
</argument>
<argument index="1" name="position" type="Vector2">
<argument index="1" name="pos" type="Vector2">
</argument>
<argument index="2" name="text" type="String">
</argument>
<argument index="3" name="modulate" type="Color" default="Color( 1, 1, 1, 1 )">
<argument index="3" name="align" type="int" enum="HAlign" default="0">
</argument>
<argument index="4" name="clip_w" type="int" default="-1">
<argument index="4" name="width" type="float" default="-1">
</argument>
<argument index="5" name="size" type="int" default="-1">
</argument>
<argument index="6" name="modulate" type="Color" default="Color( 1, 1, 1, 1 )">
</argument>
<argument index="7" name="outline_size" type="int" default="0">
</argument>
<argument index="8" name="outline_modulate" type="Color" default="Color( 1, 1, 1, 0 )">
</argument>
<argument index="9" name="flags" type="int" default="3">
</argument>
<description>
Draws [code]text[/code] using the specified [code]font[/code] at the [code]position[/code] (top-left corner). The text will have its color multiplied by [code]modulate[/code]. If [code]clip_w[/code] is greater than or equal to 0, the text will be clipped if it exceeds the specified width.
@ -275,17 +320,19 @@
# `default_font` declaration to a member variable assigned in `_ready()`
# so the Control is only created once.
var default_font = Control.new().get_font("font")
draw_string(default_font, Vector2(64, 64), "Hello world")
var default_font_size = Control.new().get_font_size("font_size")
draw_string(default_font, Vector2(64, 64), "Hello world", HALIGN_LEFT, -1, font_size)
[/gdscript]
[csharp]
// If using this method in a script that redraws constantly, move the
// `default_font` declaration to a member variable assigned in `_ready()`
// so the Control is only created once.
Font defaultFont = new Control().GetFont("font");
DrawString(defaultFont, new Vector2(64, 64), "Hello world");
int defaultFontSize = new Control().GetFontSize("font_size");
DrawString(defaultFont, new Vector2(64, 64), "Hello world", HALIGN_LEFT, -1, defaultFontSize);
[/csharp]
[/codeblocks]
See also [method Font.draw].
See also [method Font.draw_string].
</description>
</method>
<method name="draw_style_box">

View file

@ -48,6 +48,9 @@
<theme_item name="font_color_pressed" type="Color" default="Color( 1, 1, 1, 1 )">
The [CheckBox] text's font color when it's pressed.
</theme_item>
<theme_item name="font_size" type="int">
Font size of the [CheckBox]'s text.
</theme_item>
<theme_item name="hover" type="StyleBox">
The [StyleBox] to display as a background when the [CheckBox] is hovered.
</theme_item>

View file

@ -45,6 +45,9 @@
<theme_item name="font_color_pressed" type="Color" default="Color( 1, 1, 1, 1 )">
The [CheckButton] text's font color when it's pressed.
</theme_item>
<theme_item name="font_size" type="int">
Font size of the [CheckButton]'s text.
</theme_item>
<theme_item name="hover" type="StyleBox">
The [StyleBox] to display as a background when the [CheckButton] is hovered.
</theme_item>
@ -58,16 +61,28 @@
The [StyleBox] to display as a background.
</theme_item>
<theme_item name="off" type="Texture2D">
The icon to display when the [CheckButton] is unchecked.
The icon to display when the [CheckButton] is unchecked (for left-to-right layouts).
</theme_item>
<theme_item name="off_disabled" type="Texture2D">
The icon to display when the [CheckButton] is unchecked and disabled.
The icon to display when the [CheckButton] is unchecked and disabled (for left-to-right layouts).
</theme_item>
<theme_item name="off_disabled_mirrored" type="Texture2D">
The icon to display when the [CheckButton] is unchecked and disabled (for right-to-left layouts).
</theme_item>
<theme_item name="off_mirrored" type="Texture2D">
The icon to display when the [CheckButton] is unchecked (for right-to-left layouts).
</theme_item>
<theme_item name="on" type="Texture2D">
The icon to display when the [CheckButton] is checked.
The icon to display when the [CheckButton] is checked (for left-to-right layouts).
</theme_item>
<theme_item name="on_disabled" type="Texture2D">
The icon to display when the [CheckButton] is checked and disabled.
The icon to display when the [CheckButton] is checked and disabled (for left-to-right layouts).
</theme_item>
<theme_item name="on_disabled_mirrored" type="Texture2D">
The icon to display when the [CheckButton] is checked and disabled (for right-to-left layouts).
</theme_item>
<theme_item name="on_mirrored" type="Texture2D">
The icon to display when the [CheckButton] is checked (for right-to-left layouts).
</theme_item>
<theme_item name="pressed" type="StyleBox">
The [StyleBox] to display as a background when the [CheckButton] is pressed.

View file

@ -3,6 +3,7 @@
<brief_description>
</brief_description>
<description>
[b]Note[/b]: By default [CodeEdit] always use left-to-right text direction to correcly display source code.
</description>
<tutorials>
</tutorials>
@ -109,6 +110,9 @@
</member>
<member name="draw_line_numbers" type="bool" setter="set_draw_line_numbers" getter="is_draw_line_numbers_enabled" default="false">
</member>
<member name="layout_direction" type="int" setter="set_layout_direction" getter="get_layout_direction" override="true" enum="Control.LayoutDirection" default="2" />
<member name="structured_text_bidi_override_options" type="Array" setter="set_structured_text_bidi_override_options" getter="get_structured_text_bidi_override_options" override="true" default="[ ]" />
<member name="text_direction" type="int" setter="set_text_direction" getter="get_text_direction" override="true" enum="Control.TextDirection" default="1" />
<member name="zero_pad_line_numbers" type="bool" setter="set_line_numbers_zero_padded" getter="is_line_numbers_zero_padded" default="false">
</member>
</members>
@ -179,6 +183,9 @@
</theme_item>
<theme_item name="font_color_selected" type="Color" default="Color( 0, 0, 0, 1 )">
</theme_item>
<theme_item name="font_size" type="int">
Font size of the [CodeEdit]'s text.
</theme_item>
<theme_item name="line_number_color" type="Color" default="Color( 0.67, 0.67, 0.67, 0.4 )">
</theme_item>
<theme_item name="line_spacing" type="int" default="4">

View file

@ -82,6 +82,9 @@
<theme_item name="font_color_pressed" type="Color" default="Color( 0.8, 0.8, 0.8, 1 )">
Text [Color] used when the [ColorPickerButton] is being pressed.
</theme_item>
<theme_item name="font_size" type="int">
Font size of the [ColorPickerButton]'s text.
</theme_item>
<theme_item name="hover" type="StyleBox">
[StyleBox] used when the [ColorPickerButton] is being hovered.
</theme_item>

View file

@ -121,6 +121,18 @@
[/codeblocks]
</description>
</method>
<method name="_structured_text_parser" qualifiers="virtual">
<return type="void">
</return>
<argument index="0" name="args" type="Array">
</argument>
<argument index="1" name="text" type="String">
</argument>
<description>
User defined BiDi algorithm override function.
Return [code]Array[/code] of [code]Vector2i[/code] text ranges, in the left-to-right order. Ranges should cover full source [code]text[/code] without overlaps. BiDi algorithm will be used on each range separately.
</description>
</method>
<method name="accept_event">
<return type="void">
</return>
@ -179,6 +191,17 @@
Overrides the font with given [code]name[/code] in the [member theme] resource the control uses. If [code]font[/code] is [code]null[/code] or invalid, the override is cleared and the font from assigned [Theme] is used.
</description>
</method>
<method name="add_theme_font_size_override">
<return type="void">
</return>
<argument index="0" name="name" type="StringName">
</argument>
<argument index="1" name="font_size" type="int">
</argument>
<description>
Overrides the font size with given [code]name[/code] in the [member theme] resource the control uses. If [code]font_size[/code] is [code]-1[/code], the override is cleared and the font size from assigned [Theme] is used.
</description>
</method>
<method name="add_theme_icon_override">
<return type="void">
</return>
@ -443,7 +466,7 @@
</return>
<argument index="0" name="name" type="StringName">
</argument>
<argument index="1" name="type" type="StringName" default="&quot;&quot;">
<argument index="1" name="node_type" type="StringName" default="&quot;&quot;">
</argument>
<description>
Returns a color from assigned [Theme] with given [code]name[/code] and associated with [Control] of given [code]node_type[/code].
@ -466,7 +489,7 @@
</return>
<argument index="0" name="name" type="StringName">
</argument>
<argument index="1" name="type" type="StringName" default="&quot;&quot;">
<argument index="1" name="node_type" type="StringName" default="&quot;&quot;">
</argument>
<description>
Returns a constant from assigned [Theme] with given [code]name[/code] and associated with [Control] of given [code]node_type[/code].
@ -477,18 +500,29 @@
</return>
<argument index="0" name="name" type="StringName">
</argument>
<argument index="1" name="type" type="StringName" default="&quot;&quot;">
<argument index="1" name="node_type" type="StringName" default="&quot;&quot;">
</argument>
<description>
Returns a font from assigned [Theme] with given [code]name[/code] and associated with [Control] of given [code]node_type[/code].
</description>
</method>
<method name="get_theme_font_size" qualifiers="const">
<return type="int">
</return>
<argument index="0" name="name" type="StringName">
</argument>
<argument index="1" name="node_type" type="StringName" default="&quot;&quot;">
</argument>
<description>
Returns a font size from assigned [Theme] with given [code]name[/code] and associated with [Control] of given [code]type[/code].
</description>
</method>
<method name="get_theme_icon" qualifiers="const">
<return type="Texture2D">
</return>
<argument index="0" name="name" type="StringName">
</argument>
<argument index="1" name="type" type="StringName" default="&quot;&quot;">
<argument index="1" name="node_type" type="StringName" default="&quot;&quot;">
</argument>
<description>
Returns an icon from assigned [Theme] with given [code]name[/code] and associated with [Control] of given [code]node_type[/code].
@ -499,7 +533,7 @@
</return>
<argument index="0" name="name" type="StringName">
</argument>
<argument index="1" name="type" type="StringName" default="&quot;&quot;">
<argument index="1" name="node_type" type="StringName" default="&quot;&quot;">
</argument>
<description>
Returns a [StyleBox] from assigned [Theme] with given [code]name[/code] and associated with [Control] of given [code]node_type[/code].
@ -563,7 +597,7 @@
</return>
<argument index="0" name="name" type="StringName">
</argument>
<argument index="1" name="type" type="StringName" default="&quot;&quot;">
<argument index="1" name="node_type" type="StringName" default="&quot;&quot;">
</argument>
<description>
Returns [code]true[/code] if [Color] with given [code]name[/code] and associated with [Control] of given [code]node_type[/code] exists in assigned [Theme].
@ -583,7 +617,7 @@
</return>
<argument index="0" name="name" type="StringName">
</argument>
<argument index="1" name="type" type="StringName" default="&quot;&quot;">
<argument index="1" name="node_type" type="StringName" default="&quot;&quot;">
</argument>
<description>
Returns [code]true[/code] if constant with given [code]name[/code] and associated with [Control] of given [code]node_type[/code] exists in assigned [Theme].
@ -603,7 +637,7 @@
</return>
<argument index="0" name="name" type="StringName">
</argument>
<argument index="1" name="type" type="StringName" default="&quot;&quot;">
<argument index="1" name="node_type" type="StringName" default="&quot;&quot;">
</argument>
<description>
Returns [code]true[/code] if font with given [code]name[/code] and associated with [Control] of given [code]node_type[/code] exists in assigned [Theme].
@ -618,12 +652,32 @@
Returns [code]true[/code] if font with given [code]name[/code] has a valid override in this [Control] node.
</description>
</method>
<method name="has_theme_font_size" qualifiers="const">
<return type="bool">
</return>
<argument index="0" name="name" type="StringName">
</argument>
<argument index="1" name="node_type" type="StringName" default="&quot;&quot;">
</argument>
<description>
Returns [code]true[/code] if font size with given [code]name[/code] and associated with [Control] of given [code]type[/code] exists in assigned [Theme].
</description>
</method>
<method name="has_theme_font_size_override" qualifiers="const">
<return type="bool">
</return>
<argument index="0" name="name" type="StringName">
</argument>
<description>
Returns [code]true[/code] if font size with given [code]name[/code] has a valid override in this [Control] node.
</description>
</method>
<method name="has_theme_icon" qualifiers="const">
<return type="bool">
</return>
<argument index="0" name="name" type="StringName">
</argument>
<argument index="1" name="type" type="StringName" default="&quot;&quot;">
<argument index="1" name="node_type" type="StringName" default="&quot;&quot;">
</argument>
<description>
Returns [code]true[/code] if icon with given [code]name[/code] and associated with [Control] of given [code]node_type[/code] exists in assigned [Theme].
@ -652,7 +706,7 @@
</return>
<argument index="0" name="name" type="StringName">
</argument>
<argument index="1" name="type" type="StringName" default="&quot;&quot;">
<argument index="1" name="node_type" type="StringName" default="&quot;&quot;">
</argument>
<description>
Returns [code]true[/code] if [StyleBox] with given [code]name[/code] and associated with [Control] of given [code]node_type[/code] exists in assigned [Theme].
@ -667,6 +721,13 @@
Returns [code]true[/code] if [StyleBox] with given [code]name[/code] has a valid override in this [Control] node.
</description>
</method>
<method name="is_layout_rtl" qualifiers="const">
<return type="bool">
</return>
<description>
Returns [code]true[/code] if layout is right-to-left.
</description>
</method>
<method name="minimum_size_changed">
<return type="void">
</return>
@ -1015,6 +1076,9 @@
[/csharp]
[/codeblocks]
</member>
<member name="layout_direction" type="int" setter="set_layout_direction" getter="get_layout_direction" enum="Control.LayoutDirection" default="0">
Controls layout direction and text writing direction. Right-to-left layouts are necessary for certain languages (e.g. Arabic and Hebrew).
</member>
<member name="margin_bottom" type="float" setter="set_margin" getter="get_margin" default="0.0">
Distance between the node's bottom edge and its parent control, based on [member anchor_bottom].
Margins are often controlled by one or multiple parent [Container] nodes, so you should not modify them manually if your node is a direct child of a [Container]. Margins update automatically when you move or resize the node.
@ -1159,6 +1223,9 @@
<constant name="NOTIFICATION_SCROLL_END" value="48">
Sent when this node is inside a [ScrollContainer] which has stopped being scrolled.
</constant>
<constant name="NOTIFICATION_LAYOUT_DIRECTION_CHANGED" value="49">
Sent when control layout direction is changed.
</constant>
<constant name="CURSOR_ARROW" value="0" enum="CursorShape">
Show the system's arrow mouse cursor when the user hovers the node. Use with [member mouse_default_cursor_shape].
</constant>
@ -1309,5 +1376,51 @@
<constant name="ANCHOR_END" value="1" enum="Anchor">
Snaps one of the 4 anchor's sides to the end of the node's [code]Rect[/code], in the bottom right. Use it with one of the [code]anchor_*[/code] member variables, like [member anchor_left]. To change all 4 anchors at once, use [method set_anchors_preset].
</constant>
<constant name="LAYOUT_DIRECTION_INHERITED" value="0" enum="LayoutDirection">
Automatic layout direction, determined from the parent control layout direction.
</constant>
<constant name="LAYOUT_DIRECTION_LOCALE" value="1" enum="LayoutDirection">
Automatic layout direction, determined from the current locale.
</constant>
<constant name="LAYOUT_DIRECTION_LTR" value="2" enum="LayoutDirection">
Left-to-right layout direction.
</constant>
<constant name="LAYOUT_DIRECTION_RTL" value="3" enum="LayoutDirection">
Right-to-left layout direction.
</constant>
<constant name="TEXT_DIRECTION_INHERITED" value="3" enum="TextDirection">
Text writing direction is the same as layout direction.
</constant>
<constant name="TEXT_DIRECTION_AUTO" value="0" enum="TextDirection">
Automatic text writing direction, determined from the current locale and text content.
</constant>
<constant name="TEXT_DIRECTION_LTR" value="1" enum="TextDirection">
Left-to-right text writing direction.
</constant>
<constant name="TEXT_DIRECTION_RTL" value="2" enum="TextDirection">
Right-to-left text writing direction.
</constant>
<constant name="STRUCTURED_TEXT_DEFAULT" value="0" enum="StructuredTextParser">
Use default behavior. Same as [code]STRUCTURED_TEXT_NONE[/code] unless specified otherwise in the control description.
</constant>
<constant name="STRUCTURED_TEXT_URI" value="1" enum="StructuredTextParser">
BiDi override for URI.
</constant>
<constant name="STRUCTURED_TEXT_FILE" value="2" enum="StructuredTextParser">
BiDi override for file path.
</constant>
<constant name="STRUCTURED_TEXT_EMAIL" value="3" enum="StructuredTextParser">
BiDi override for email.
</constant>
<constant name="STRUCTURED_TEXT_LIST" value="4" enum="StructuredTextParser">
BiDi override for lists.
Structured text options: list separator [code]String[/code].
</constant>
<constant name="STRUCTURED_TEXT_NONE" value="5" enum="StructuredTextParser">
Use default Unicode BiDi algorithm.
</constant>
<constant name="STRUCTURED_TEXT_CUSTOM" value="6" enum="StructuredTextParser">
User defined structured text BiDi override function.
</constant>
</constants>
</class>

View file

@ -1,146 +0,0 @@
<?xml version="1.0" encoding="UTF-8" ?>
<class name="DynamicFont" inherits="Font" version="4.0">
<brief_description>
DynamicFont renders vector font files at runtime.
</brief_description>
<description>
DynamicFont renders vector font files (such as TTF or OTF) dynamically at runtime instead of using a prerendered texture atlas like [BitmapFont]. This trades the faster loading time of [BitmapFont]s for the ability to change font parameters like size and spacing during runtime. [DynamicFontData] is used for referencing the font file paths. DynamicFont also supports defining one or more fallback fonts, which will be used when displaying a character not supported by the main font.
DynamicFont uses the [url=https://www.freetype.org/]FreeType[/url] library for rasterization.
[codeblocks]
[gdscript]
var dynamic_font = DynamicFont.new()
dynamic_font.font_data = load("res://BarlowCondensed-Bold.ttf")
dynamic_font.size = 64
$"Label".set("custom_fonts/font", dynamic_font)
[/gdscript]
[csharp]
var dynamicFont = new DynamicFont();
dynamicFont.FontData = ResourceLoader.Load&lt;DynamicFontData&gt;("res://BarlowCondensed-Bold.ttf");
dynamicFont.Size = 64;
GetNode("Label").Set("custom_fonts/font", dynamicFont);
[/csharp]
[/codeblocks]
[b]Note:[/b] DynamicFont doesn't support features such as kerning, right-to-left typesetting, ligatures, text shaping, variable fonts and optional font features yet. If you wish to "bake" an optional font feature into a TTF font file, you can use [url=https://fontforge.org/]FontForge[/url] to do so. In FontForge, use [b]File &gt; Generate Fonts[/b], click [b]Options[/b], choose the desired features then generate the font.
</description>
<tutorials>
<link title="3D Voxel Demo">https://godotengine.org/asset-library/asset/676</link>
</tutorials>
<methods>
<method name="add_fallback">
<return type="void">
</return>
<argument index="0" name="data" type="DynamicFontData">
</argument>
<description>
Adds a fallback font.
</description>
</method>
<method name="get_available_chars" qualifiers="const">
<return type="String">
</return>
<description>
Returns a string containing all the characters available in the main and all the fallback fonts.
If a given character is included in more than one font, it appears only once in the returned string.
</description>
</method>
<method name="get_fallback" qualifiers="const">
<return type="DynamicFontData">
</return>
<argument index="0" name="idx" type="int">
</argument>
<description>
Returns the fallback font at index [code]idx[/code].
</description>
</method>
<method name="get_fallback_count" qualifiers="const">
<return type="int">
</return>
<description>
Returns the number of fallback fonts.
</description>
</method>
<method name="get_spacing" qualifiers="const">
<return type="int">
</return>
<argument index="0" name="type" type="int">
</argument>
<description>
Returns the spacing for the given [code]type[/code] (see [enum SpacingType]).
</description>
</method>
<method name="remove_fallback">
<return type="void">
</return>
<argument index="0" name="idx" type="int">
</argument>
<description>
Removes the fallback font at index [code]idx[/code].
</description>
</method>
<method name="set_fallback">
<return type="void">
</return>
<argument index="0" name="idx" type="int">
</argument>
<argument index="1" name="data" type="DynamicFontData">
</argument>
<description>
Sets the fallback font at index [code]idx[/code].
</description>
</method>
<method name="set_spacing">
<return type="void">
</return>
<argument index="0" name="type" type="int">
</argument>
<argument index="1" name="value" type="int">
</argument>
<description>
Sets the spacing for [code]type[/code] (see [enum SpacingType]) to [code]value[/code] in pixels (not relative to the font size).
</description>
</method>
</methods>
<members>
<member name="extra_spacing_bottom" type="int" setter="set_spacing" getter="get_spacing" default="0">
Extra spacing at the bottom in pixels.
</member>
<member name="extra_spacing_char" type="int" setter="set_spacing" getter="get_spacing" default="0">
Extra spacing for each character in pixels.
This can be a negative number to make the distance between characters smaller.
</member>
<member name="extra_spacing_space" type="int" setter="set_spacing" getter="get_spacing" default="0">
Extra spacing for the space character (in addition to [member extra_spacing_char]) in pixels.
This can be a negative number to make the distance between words smaller.
</member>
<member name="extra_spacing_top" type="int" setter="set_spacing" getter="get_spacing" default="0">
Extra spacing at the top in pixels.
</member>
<member name="font_data" type="DynamicFontData" setter="set_font_data" getter="get_font_data">
The font data.
</member>
<member name="outline_color" type="Color" setter="set_outline_color" getter="get_outline_color" default="Color( 1, 1, 1, 1 )">
The font outline's color.
[b]Note:[/b] It's recommended to leave this at the default value so that you can adjust it in individual controls. For example, if the outline is made black here, it won't be possible to change its color using a Label's font outline modulate theme item.
</member>
<member name="outline_size" type="int" setter="set_outline_size" getter="get_outline_size" default="0">
The font outline's thickness in pixels (not relative to the font size).
</member>
<member name="size" type="int" setter="set_size" getter="get_size" default="16">
The font size in pixels.
</member>
</members>
<constants>
<constant name="SPACING_TOP" value="0" enum="SpacingType">
Spacing at the top.
</constant>
<constant name="SPACING_BOTTOM" value="1" enum="SpacingType">
Spacing at the bottom.
</constant>
<constant name="SPACING_CHAR" value="2" enum="SpacingType">
Spacing for each character.
</constant>
<constant name="SPACING_SPACE" value="3" enum="SpacingType">
Spacing for the space character.
</constant>
</constants>
</class>

View file

@ -1,36 +0,0 @@
<?xml version="1.0" encoding="UTF-8" ?>
<class name="DynamicFontData" inherits="Resource" version="4.0">
<brief_description>
Used with [DynamicFont] to describe the location of a font file.
</brief_description>
<description>
Used with [DynamicFont] to describe the location of a vector font file for dynamic rendering at runtime.
</description>
<tutorials>
<link title="3D Voxel Demo">https://godotengine.org/asset-library/asset/676</link>
</tutorials>
<methods>
</methods>
<members>
<member name="antialiased" type="bool" setter="set_antialiased" getter="is_antialiased" default="true">
If [code]true[/code], the font is rendered with anti-aliasing. This property applies both to the main font and its outline (if it has one).
</member>
<member name="font_path" type="String" setter="set_font_path" getter="get_font_path" default="&quot;&quot;">
The path to the vector font file.
</member>
<member name="hinting" type="int" setter="set_hinting" getter="get_hinting" enum="DynamicFontData.Hinting" default="2">
The font hinting mode used by FreeType. See [enum Hinting] for options.
</member>
</members>
<constants>
<constant name="HINTING_NONE" value="0" enum="Hinting">
Disables font hinting (smoother but less crisp).
</constant>
<constant name="HINTING_LIGHT" value="1" enum="Hinting">
Use the light font hinting mode.
</constant>
<constant name="HINTING_NORMAL" value="2" enum="Hinting">
Use the default font hinting mode (crisper but less smooth).
</constant>
</constants>
</class>

View file

@ -1,34 +1,75 @@
<?xml version="1.0" encoding="UTF-8" ?>
<class name="Font" inherits="Resource" version="4.0">
<brief_description>
Internationalized font and text drawing support.
Font class is set of font data sources used to draw text.
</brief_description>
<description>
Font contains a Unicode-compatible character set, as well as the ability to draw it with variable width, ascent, descent and kerning. For creating fonts from TTF files (or other font formats), see the editor support for fonts.
[b]Note:[/b] If a DynamicFont doesn't contain a character used in a string, the character in question will be replaced with codepoint [code]0xfffd[/code] if it's available in the DynamicFont. If this replacement character isn't available in the DynamicFont, the character will be hidden without displaying any replacement character in the string.
[b]Note:[/b] If a BitmapFont doesn't contain a character used in a string, the character in question will be hidden without displaying any replacement character in the string.
Font contains a set of glyphs to represent Unicode characters, as well as the ability to draw it with variable width, ascent, descent and kerning.
[b]Note:[/b] A character is a symbol that represents an item (letter, digit etc.) in an abstract way.
[b]Note:[/b] A glyph is a bitmap or shape used to draw a one or more characters in a context-dependent manner. Glyph indices are bound to the specific font data source.
[b]Note:[/b] If a non of the font data sources contain glyphs for a character used in a string, the character in question will be replaced with a box displaying its hexadecimal code.
[codeblocks]
[gdscript]
var font = Font.new()
font.add_data(load("res://BarlowCondensed-Bold.ttf"))
$"Label".set("custom_fonts/font", font)
$"Label".set("custom_fonts/font_size", 64)
[/gdscript]
[csharp]
var font = new Font();
font.AddData(ResourceLoader.Load&lt;FontData&gt;("res://BarlowCondensed-Bold.ttf"));
GetNode("Label").Set("custom_fonts/font", font);
GetNode("Label").Set("custom_font_sizes/font_size", 64);
[/csharp]
[/codeblocks]
To control font substitution priority use [FontData] language and script support.
Use language overrides to use same [Font] stack for multiple languages:
[codeblocks]
[gdscript]
# Use Naskh font for Persian and Nastaʼlīq font for Urdu text.
var font_data_fa = load("res://NotoNaskhArabicUI_Regular.ttf");
font_data_fa.set_language_support_override("fa", true);
font_data_fa.set_language_support_override("ur", false);
var font_data_ur = load("res://NotoNastaliqUrdu_Regular.ttf");
font_data_ur.set_language_support_override("fa", false);
font_data_ur.set_language_support_override("ur", true);
[/gdscript]
[csharp]
// Use Naskh font for Persian and Nastaʼlīq font for Urdu text.
var fontDataFA = ResourceLoader.Load&lt;FontData&gt;("res://NotoNaskhArabicUI_Regular.ttf");
fontDataFA.SetLanguageSupportOverride("fa", true);
fontDataFA.SetLanguageSupportOverride("ur", false);
var fontDataUR = ResourceLoader.Load&lt;FontData&gt;("res://NotoNastaliqUrdu_Regular.ttf");
fontDataUR.SetLanguageSupportOverride("fa", false);
fontDataUR.SetLanguageSupportOverride("ur", true);
[/csharp]
[/codeblocks]
Use script overrides to specify supported scripts for bitmap font or for less common scripts not directly supported by TrueType format:
[codeblocks]
[gdscript]
# Use specified font for Egyptian hieroglyphs.
var font_data = load("res://unifont.ttf");
font_data.set_script_support_override("Egyp", true);
[/gdscript]
[csharp]
// Use specified font for Egyptian hieroglyphs.
var fontData = ResourceLoader.Load&lt;FontData&gt;("res://unifont.ttf");
fontData.SetScriptSupportOverride("Egyp", true);
[/csharp]
[/codeblocks]
</description>
<tutorials>
</tutorials>
<methods>
<method name="draw" qualifiers="const">
<method name="add_data">
<return type="void">
</return>
<argument index="0" name="canvas_item" type="RID">
</argument>
<argument index="1" name="position" type="Vector2">
</argument>
<argument index="2" name="string" type="String">
</argument>
<argument index="3" name="modulate" type="Color" default="Color( 1, 1, 1, 1 )">
</argument>
<argument index="4" name="clip_w" type="int" default="-1">
</argument>
<argument index="5" name="outline_modulate" type="Color" default="Color( 1, 1, 1, 1 )">
<argument index="0" name="data" type="FontData">
</argument>
<description>
Draw [code]string[/code] into a canvas item using the font at a given position, with [code]modulate[/code] color, and optionally clipping the width. [code]position[/code] specifies the baseline, not the top. To draw from the top, [i]ascent[/i] must be added to the Y axis.
See also [method CanvasItem.draw_string].
Add font data source to the set.
</description>
</method>
<method name="draw_char" qualifiers="const">
@ -36,25 +77,91 @@
</return>
<argument index="0" name="canvas_item" type="RID">
</argument>
<argument index="1" name="position" type="Vector2">
<argument index="1" name="pos" type="Vector2">
</argument>
<argument index="2" name="char" type="int">
</argument>
<argument index="3" name="next" type="int" default="-1">
<argument index="3" name="next" type="int" default="0">
</argument>
<argument index="4" name="modulate" type="Color" default="Color( 1, 1, 1, 1 )">
<argument index="4" name="size" type="int" default="-1">
</argument>
<argument index="5" name="outline" type="bool" default="false">
<argument index="5" name="modulate" type="Color" default="Color( 1, 1, 1, 1 )">
</argument>
<argument index="6" name="outline_size" type="int" default="0">
</argument>
<argument index="7" name="outline_modulate" type="Color" default="Color( 1, 1, 1, 0 )">
</argument>
<description>
Draw character [code]char[/code] into a canvas item using the font at a given position, with [code]modulate[/code] color, and optionally kerning if [code]next[/code] is passed. clipping the width. [code]position[/code] specifies the baseline, not the top. To draw from the top, [i]ascent[/i] must be added to the Y axis. The width used by the character is returned, making this function useful for drawing strings character by character.
Draw a single Unicode character [code]char[/code] into a canvas item using the font, at a given position, with [code]modulate[/code] color, and optionally kerning if [code]next[/code] is passed. [code]position[/code] specifies the baseline, not the top. To draw from the top, [i]ascent[/i] must be added to the Y axis.
[b]Note:[/b] Do not use this function to draw strings character by character, use [method draw_string] or [TextLine] instead.
</description>
</method>
<method name="draw_multiline_string" qualifiers="const">
<return type="void">
</return>
<argument index="0" name="canvas_item" type="RID">
</argument>
<argument index="1" name="pos" type="Vector2">
</argument>
<argument index="2" name="text" type="String">
</argument>
<argument index="3" name="align" type="int" enum="HAlign" default="0">
</argument>
<argument index="4" name="width" type="float" default="-1">
</argument>
<argument index="5" name="max_lines" type="int" default="-1">
</argument>
<argument index="6" name="size" type="int" default="-1">
</argument>
<argument index="7" name="modulate" type="Color" default="Color( 1, 1, 1, 1 )">
</argument>
<argument index="8" name="outline_size" type="int" default="0">
</argument>
<argument index="9" name="outline_modulate" type="Color" default="Color( 1, 1, 1, 0 )">
</argument>
<argument index="10" name="flags" type="int" default="51">
</argument>
<description>
Breaks [code]text[/code] to the lines using rules specified by [code]flags[/code] and draws it into a canvas item using the font, at a given position, with [code]modulate[/code] color, optionally clipping the width and aligning horizontally. [code]position[/code] specifies the baseline of the first line, not the top. To draw from the top, [i]ascent[/i] must be added to the Y axis.
See also [method CanvasItem.draw_multiline_string].
</description>
</method>
<method name="draw_string" qualifiers="const">
<return type="void">
</return>
<argument index="0" name="canvas_item" type="RID">
</argument>
<argument index="1" name="pos" type="Vector2">
</argument>
<argument index="2" name="text" type="String">
</argument>
<argument index="3" name="align" type="int" enum="HAlign" default="0">
</argument>
<argument index="4" name="width" type="float" default="-1">
</argument>
<argument index="5" name="size" type="int" default="-1">
</argument>
<argument index="6" name="modulate" type="Color" default="Color( 1, 1, 1, 1 )">
</argument>
<argument index="7" name="outline_size" type="int" default="0">
</argument>
<argument index="8" name="outline_modulate" type="Color" default="Color( 1, 1, 1, 0 )">
</argument>
<argument index="9" name="flags" type="int" default="3">
</argument>
<description>
Draw [code]text[/code] into a canvas item using the font, at a given position, with [code]modulate[/code] color, optionally clipping the width and aligning horizontally. [code]position[/code] specifies the baseline, not the top. To draw from the top, [i]ascent[/i] must be added to the Y axis.
See also [method CanvasItem.draw_string].
</description>
</method>
<method name="get_ascent" qualifiers="const">
<return type="float">
</return>
<argument index="0" name="size" type="int" default="-1">
</argument>
<description>
Returns the font ascent (number of pixels above the baseline).
Returns the average font ascent (number of pixels above the baseline).
[b]Note:[/b] Real ascent of the string is context-dependent and can be significantly different from the value returned by this function. Use it only as rough estimate (e.g. as the ascent of empty line).
</description>
</method>
<method name="get_char_size" qualifiers="const">
@ -64,65 +171,176 @@
</argument>
<argument index="1" name="next" type="int" default="0">
</argument>
<argument index="2" name="size" type="int" default="-1">
</argument>
<description>
Returns the size of a character, optionally taking kerning into account if the next character is provided.
[b]Note:[/b] Do not use this function to calculate width of the string character by character, use [method get_string_size] or [TextLine] instead.
</description>
</method>
<method name="get_data" qualifiers="const">
<return type="FontData">
</return>
<argument index="0" name="idx" type="int">
</argument>
<description>
Returns the font data source at index [code]idx[/code]. If the index does not exist, returns [code]null[/code].
</description>
</method>
<method name="get_data_count" qualifiers="const">
<return type="int">
</return>
<description>
Returns the number of font data sources.
</description>
</method>
<method name="get_descent" qualifiers="const">
<return type="float">
</return>
<argument index="0" name="size" type="int" default="-1">
</argument>
<description>
Returns the font descent (number of pixels below the baseline).
Returns the average font descent (number of pixels below the baseline).
[b]Note:[/b] Real descent of the string is context-dependent and can be significantly different from the value returned by this function. Use it only as rough estimate (e.g. as the descent of empty line).
</description>
</method>
<method name="get_height" qualifiers="const">
<return type="float">
</return>
<argument index="0" name="size" type="int" default="-1">
</argument>
<description>
Returns the total font height (ascent plus descent) in pixels.
Returns the total average font height (ascent plus descent) in pixels.
[b]Note:[/b] Real height of the string is context-dependent and can be significantly different from the value returned by this function. Use it only as rough estimate (e.g. as the height of empty line).
</description>
</method>
<method name="get_multiline_string_size" qualifiers="const">
<return type="Vector2">
</return>
<argument index="0" name="text" type="String">
</argument>
<argument index="1" name="width" type="float" default="-1">
</argument>
<argument index="2" name="size" type="int" default="-1">
</argument>
<argument index="3" name="flags" type="int" default="48">
</argument>
<description>
Returns the size of a bounding box of a string broken into the lines, taking kerning and advance into account.
See also [method draw_multiline_string].
</description>
</method>
<method name="get_spacing" qualifiers="const">
<return type="int">
</return>
<argument index="0" name="type" type="int">
</argument>
<description>
Returns the spacing for the given [code]type[/code] (see [enum SpacingType]).
</description>
</method>
<method name="get_string_size" qualifiers="const">
<return type="Vector2">
</return>
<argument index="0" name="string" type="String">
<argument index="0" name="text" type="String">
</argument>
<argument index="1" name="size" type="int" default="-1">
</argument>
<description>
Returns the size of a string, taking kerning and advance into account.
Returns the size size of a bounding box of a string, taking kerning and advance into account.
See also [method draw_string].
</description>
</method>
<method name="get_wordwrap_string_size" qualifiers="const">
<return type="Vector2">
<method name="get_supported_chars" qualifiers="const">
<return type="String">
</return>
<argument index="0" name="string" type="String">
</argument>
<argument index="1" name="width" type="float">
</argument>
<description>
Returns the size that the string would have with word wrapping enabled with a fixed [code]width[/code].
Returns a string containing all the characters available in the font.
If a given character is included in more than one font data source, it appears only once in the returned string.
</description>
</method>
<method name="has_outline" qualifiers="const">
<method name="get_underline_position" qualifiers="const">
<return type="float">
</return>
<argument index="0" name="size" type="int" default="-1">
</argument>
<description>
Return average pixel offset of the underline below the baseline.
[b]Note:[/b] Real underline position of the string is context-dependent and can be significantly different from the value returned by this function. Use it only as rough estimate.
</description>
</method>
<method name="get_underline_thickness" qualifiers="const">
<return type="float">
</return>
<argument index="0" name="size" type="int" default="-1">
</argument>
<description>
Return average thickness of the underline.
[b]Note:[/b] Real underline thickness of the string is context-dependent and can be significantly different from the value returned by this function. Use it only as rough estimate.
</description>
</method>
<method name="has_char" qualifiers="const">
<return type="bool">
</return>
<argument index="0" name="char" type="int">
</argument>
<description>
Returns [code]true[/code] if the font has an outline.
Return [code]true[/code] if a Unicode [code]char[/code] is available in the font.
</description>
</method>
<method name="is_distance_field_hint" qualifiers="const">
<return type="bool">
<method name="remove_data">
<return type="void">
</return>
<argument index="0" name="idx" type="int">
</argument>
<description>
Removes the font data source at index [code]idx[/code]. If the index does not exist, nothing happens.
</description>
</method>
<method name="set_data">
<return type="void">
</return>
<argument index="0" name="idx" type="int">
</argument>
<argument index="1" name="data" type="FontData">
</argument>
<description>
Sets the font data source at index [code]idx[/code]. If the index does not exist, nothing happens.
</description>
</method>
<method name="set_spacing">
<return type="void">
</return>
<argument index="0" name="type" type="int">
</argument>
<argument index="1" name="value" type="int">
</argument>
<description>
Sets the spacing for [code]type[/code] (see [enum SpacingType]) to [code]value[/code] in pixels (not relative to the font size).
</description>
</method>
<method name="update_changes">
<return type="void">
</return>
<description>
After editing a font (changing size, ascent, char rects, etc.). Call this function to propagate changes to controls that might use it.
After editing a font (changing data sources, etc.). Call this function to propagate changes to controls that might use it.
</description>
</method>
</methods>
<members>
<member name="extra_spacing_bottom" type="int" setter="set_spacing" getter="get_spacing" default="0">
Extra spacing at the bottom in pixels.
</member>
<member name="extra_spacing_top" type="int" setter="set_spacing" getter="get_spacing" default="0">
Extra character spacing in pixels.
</member>
</members>
<constants>
<constant name="SPACING_TOP" value="0" enum="SpacingType">
Spacing at the top of the line.
</constant>
<constant name="SPACING_BOTTOM" value="1" enum="SpacingType">
Spacing at the bottom of the line.
</constant>
</constants>
</class>

302
doc/classes/FontData.xml Normal file
View file

@ -0,0 +1,302 @@
<?xml version="1.0" encoding="UTF-8" ?>
<class name="FontData" inherits="Resource" version="4.0">
<brief_description>
Font data source, file or memory buffer.
</brief_description>
<description>
Built-in text servers support font data sources of the following formats:
- Bitmap fonts in the [url=https://www.angelcode.com/products/bmfont/]BMFont[/url] format. Handles [code].fnt, *.font[/code] fonts containing texture atlases. Non-scalable. Supports distance fields. Complex text shaping support is limited.
- Dynamic fonts using the [url=https://www.freetype.org/]FreeType[/url] and [url=https://github.com/silnrsi/graphite/]Graphite[/url] library for rasterization. Handles [code]*.ttf, *.otf[/code] fonts. Scalable. Doesn't support distance fields. Supports complex text shaping and OpenType features.
</description>
<tutorials>
</tutorials>
<methods>
<method name="draw_glyph" qualifiers="const">
<return type="Vector2">
</return>
<argument index="0" name="canvas" type="RID">
</argument>
<argument index="1" name="size" type="int">
</argument>
<argument index="2" name="pos" type="Vector2">
</argument>
<argument index="3" name="index" type="int">
</argument>
<argument index="4" name="color" type="Color" default="Color( 1, 1, 1, 1 )">
</argument>
<description>
Draws single glyph into a canvas item at the position, using [code]font[/code] at the size [code]size[/code].
Returns advance of the glyph for horizontal and vertical layouts.
Note: Glyph index is bound to the font data, use only glyphs indices returned by [method TextServer.shaped_text_get_glyphs] or [method get_glyph_index] for this font data.
</description>
</method>
<method name="draw_glyph_outline" qualifiers="const">
<return type="Vector2">
</return>
<argument index="0" name="canvas" type="RID">
</argument>
<argument index="1" name="size" type="int">
</argument>
<argument index="2" name="outline_size" type="int">
</argument>
<argument index="3" name="pos" type="Vector2">
</argument>
<argument index="4" name="index" type="int">
</argument>
<argument index="5" name="color" type="Color" default="Color( 1, 1, 1, 1 )">
</argument>
<description>
Draws single glyph outline of size [code]outline_size[/code] into a canvas item at the position, using [code]font[/code] at the size [code]size[/code]. If outline drawing is not supported, nothing is drawn.
Returns advance of the glyph for horizontal and vertical layouts (regardless of outline drawing support).
Note: Glyph index is bound to the font data, use only glyphs indices returned by [method TextServer.shaped_text_get_glyphs] or [method get_glyph_index] for this font data.
</description>
</method>
<method name="get_ascent" qualifiers="const">
<return type="float">
</return>
<argument index="0" name="size" type="int">
</argument>
<description>
Returns the font ascent (number of pixels above the baseline).
</description>
</method>
<method name="get_base_size" qualifiers="const">
<return type="float">
</return>
<description>
Returns the base size of the font (the only size supported for non-scalable fonts, meaningless for scalable fonts).
</description>
</method>
<method name="get_descent" qualifiers="const">
<return type="float">
</return>
<argument index="0" name="size" type="int">
</argument>
<description>
Returns the font descent (number of pixels below the baseline).
</description>
</method>
<method name="get_glyph_advance" qualifiers="const">
<return type="Vector2">
</return>
<argument index="0" name="index" type="int">
</argument>
<argument index="1" name="size" type="int">
</argument>
<description>
Returns advance of the glyph for horizontal and vertical layouts.
Note: Glyph index is bound to the font data, use only glyphs indices returned by [method TextServer.shaped_text_get_glyphs] or [method get_glyph_index] for this font data.
</description>
</method>
<method name="get_glyph_index" qualifiers="const">
<return type="int">
</return>
<argument index="0" name="char" type="int">
</argument>
<argument index="1" name="variation_selector" type="int" default="0">
</argument>
<description>
Return the glyph index of a [code]char[/code], optionally modified by the [code]variation_selector[/code].
</description>
</method>
<method name="get_glyph_kerning" qualifiers="const">
<return type="Vector2">
</return>
<argument index="0" name="index_a" type="int">
</argument>
<argument index="1" name="index_b" type="int">
</argument>
<argument index="2" name="size" type="int">
</argument>
<description>
Returns a kerning of the pair of glyphs for horizontal and vertical layouts.
Note: Glyph index is bound to the font data, use only glyphs indices returned by [method TextServer.shaped_text_get_glyphs] or [method get_glyph_index] for this font data.
</description>
</method>
<method name="get_height" qualifiers="const">
<return type="float">
</return>
<argument index="0" name="size" type="int">
</argument>
<description>
Returns the total font height (ascent plus descent) in pixels.
</description>
</method>
<method name="get_language_support_override" qualifiers="const">
<return type="bool">
</return>
<argument index="0" name="language" type="String">
</argument>
<description>
Returns [code]true[/code] if support override is enabled for the [code]language[/code].
</description>
</method>
<method name="get_language_support_overrides" qualifiers="const">
<return type="PackedStringArray">
</return>
<description>
Returns list of language support overrides.
</description>
</method>
<method name="get_script_support_override" qualifiers="const">
<return type="bool">
</return>
<argument index="0" name="script" type="String">
</argument>
<description>
Returns [code]true[/code] if support override is enabled for the [code]script[/code].
</description>
</method>
<method name="get_script_support_overrides" qualifiers="const">
<return type="PackedStringArray">
</return>
<description>
Returns list of script support overrides.
</description>
</method>
<method name="get_supported_chars" qualifiers="const">
<return type="String">
</return>
<description>
Returns a string containing all the characters available in the font.
</description>
</method>
<method name="get_underline_position" qualifiers="const">
<return type="float">
</return>
<argument index="0" name="size" type="int">
</argument>
<description>
Returns underline offset (number of pixels below the baseline).
</description>
</method>
<method name="get_underline_thickness" qualifiers="const">
<return type="float">
</return>
<argument index="0" name="size" type="int">
</argument>
<description>
Returns underline thickness in pixels.
</description>
</method>
<method name="has_char" qualifiers="const">
<return type="bool">
</return>
<argument index="0" name="char" type="int">
</argument>
<description>
Return [code]true[/code] if a Unicode [code]char[/code] is available in the font.
</description>
</method>
<method name="has_outline" qualifiers="const">
<return type="bool">
</return>
<description>
Returns [code]true[/code], if font supports drawing glyph outlines.
</description>
</method>
<method name="is_language_supported" qualifiers="const">
<return type="bool">
</return>
<argument index="0" name="language" type="String">
</argument>
<description>
Returns [code]true[/code], if font supports given language ([url=https://en.wikipedia.org/wiki/ISO_639-1]ISO 639[/url] code).
</description>
</method>
<method name="is_script_supported" qualifiers="const">
<return type="bool">
</return>
<argument index="0" name="script" type="String">
</argument>
<description>
Returns [code]true[/code], if font supports given script ([url=https://en.wikipedia.org/wiki/ISO_15924]ISO 15924[/url] code).
</description>
</method>
<method name="load_memory">
<return type="void">
</return>
<argument index="0" name="data" type="PackedByteArray">
</argument>
<argument index="1" name="type" type="String">
</argument>
<argument index="2" name="base_size" type="int" default="16">
</argument>
<description>
Creates new font from the data in memory.
Note: For non-scalable fonts [code]base_size[/code] is ignored, use [method get_base_size] to check actual font size.
</description>
</method>
<method name="load_resource">
<return type="void">
</return>
<argument index="0" name="filename" type="String">
</argument>
<argument index="1" name="base_size" type="int" default="16">
</argument>
<description>
Creates new font from the file.
Note: For non-scalable fonts [code]base_size[/code] is ignored, use [method get_base_size] to check actual font size.
</description>
</method>
<method name="remove_language_support_override">
<return type="void">
</return>
<argument index="0" name="language" type="String">
</argument>
<description>
Remove language support override.
</description>
</method>
<method name="remove_script_support_override">
<return type="void">
</return>
<argument index="0" name="script" type="String">
</argument>
<description>
Removes script support override.
</description>
</method>
<method name="set_language_support_override">
<return type="void">
</return>
<argument index="0" name="language" type="String">
</argument>
<argument index="1" name="supported" type="bool">
</argument>
<description>
Adds override for [method is_language_supported].
</description>
</method>
<method name="set_script_support_override">
<return type="void">
</return>
<argument index="0" name="script" type="String">
</argument>
<argument index="1" name="supported" type="bool">
</argument>
<description>
Adds override for [method is_script_supported].
</description>
</method>
</methods>
<members>
<member name="antialiased" type="bool" setter="set_antialiased" getter="get_antialiased" default="false">
If [code]true[/code], the font is rendered with anti-aliasing.
</member>
<member name="data_path" type="String" setter="set_data_path" getter="get_data_path" default="&quot;&quot;">
The path to the font data file. If font data was loaded from memory location is set to [code]"(Memory)"[/code].
</member>
<member name="distance_field_hint" type="bool" setter="set_distance_field_hint" getter="get_distance_field_hint" default="false">
If [code]true[/code], distance field hint is enabled.
</member>
<member name="force_autohinter" type="bool" setter="set_force_autohinter" getter="get_force_autohinter" default="false">
If [code]true[/code], default autohinter is used for font hinting.
</member>
<member name="hinting" type="int" setter="set_hinting" getter="get_hinting" enum="TextServer.Hinting" default="0">
The font hinting mode used by FreeType. See [enum TextServer.Hinting] for options.
</member>
</members>
<constants>
</constants>
</class>

View file

@ -18,6 +18,13 @@
Disables all input and output slots of the GraphNode.
</description>
</method>
<method name="clear_opentype_features">
<return type="void">
</return>
<description>
Removes all OpenType features.
</description>
</method>
<method name="clear_slot">
<return type="void">
</return>
@ -95,6 +102,15 @@
Returns the type of the output connection [code]idx[/code].
</description>
</method>
<method name="get_opentype_feature" qualifiers="const">
<return type="int">
</return>
<argument index="0" name="tag" type="String">
</argument>
<description>
Returns OpenType feature [code]tag[/code].
</description>
</method>
<method name="get_slot_color_left" qualifiers="const">
<return type="Color">
</return>
@ -149,6 +165,17 @@
Returns [code]true[/code] if right (output) slot [code]idx[/code] is enabled, [code]false[/code] otherwise.
</description>
</method>
<method name="set_opentype_feature">
<return type="void">
</return>
<argument index="0" name="tag" type="String">
</argument>
<argument index="1" name="value" type="int">
</argument>
<description>
Sets OpenType feature [code]tag[/code]. More info: [url=https://docs.microsoft.com/en-us/typography/opentype/spec/featuretags]OpenType feature tags[/url].
</description>
</method>
<method name="set_slot">
<return type="void">
</return>
@ -184,6 +211,9 @@
<member name="comment" type="bool" setter="set_comment" getter="is_comment" default="false">
If [code]true[/code], the GraphNode is a comment node.
</member>
<member name="language" type="String" setter="set_language" getter="get_language" default="&quot;&quot;">
Language code used for line-breaking and text shaping algorithms, if left empty current locale is used instead.
</member>
<member name="mouse_filter" type="int" setter="set_mouse_filter" getter="get_mouse_filter" override="true" enum="Control.MouseFilter" default="0" />
<member name="offset" type="Vector2" setter="set_offset" getter="get_offset" default="Vector2( 0, 0 )">
The offset of the GraphNode, relative to the scroll offset of the [GraphEdit].
@ -203,6 +233,9 @@
If [code]true[/code], the close button will be visible.
[b]Note:[/b] Pressing it will only emit the [signal close_request] signal, the GraphNode needs to be removed manually.
</member>
<member name="text_direction" type="int" setter="set_text_direction" getter="get_text_direction" enum="Control.TextDirection" default="0">
Base text writing direction.
</member>
<member name="title" type="String" setter="set_title" getter="get_title" default="&quot;&quot;">
The text displayed in the GraphNode's title bar.
</member>

View file

@ -43,6 +43,15 @@
Removes all items from the list.
</description>
</method>
<method name="clear_item_opentype_features">
<return type="void">
</return>
<argument index="0" name="idx" type="int">
</argument>
<description>
Removes all OpenType features from the item's text.
</description>
</method>
<method name="ensure_current_is_visible">
<return type="void">
</return>
@ -114,6 +123,15 @@
Returns the region of item's icon used. The whole icon will be used if the region has no area.
</description>
</method>
<method name="get_item_language" qualifiers="const">
<return type="String">
</return>
<argument index="0" name="idx" type="int">
</argument>
<description>
Returns item's text language code.
</description>
</method>
<method name="get_item_metadata" qualifiers="const">
<return type="Variant">
</return>
@ -123,6 +141,17 @@
Returns the metadata value of the specified index.
</description>
</method>
<method name="get_item_opentype_feature" qualifiers="const">
<return type="int">
</return>
<argument index="0" name="idx" type="int">
</argument>
<argument index="1" name="tag" type="String">
</argument>
<description>
Returns OpenType feature [code]tag[/code] of the item's text.
</description>
</method>
<method name="get_item_text" qualifiers="const">
<return type="String">
</return>
@ -132,6 +161,15 @@
Returns the text associated with the specified index.
</description>
</method>
<method name="get_item_text_direction" qualifiers="const">
<return type="int" enum="Control.TextDirection">
</return>
<argument index="0" name="idx" type="int">
</argument>
<description>
Returns item's text base writing direction.
</description>
</method>
<method name="get_item_tooltip" qualifiers="const">
<return type="String">
</return>
@ -336,6 +374,17 @@
Sets whether the item icon will be drawn transposed.
</description>
</method>
<method name="set_item_language">
<return type="void">
</return>
<argument index="0" name="idx" type="int">
</argument>
<argument index="1" name="language" type="String">
</argument>
<description>
Sets language code of item's text used for line-breaking and text shaping algorithms, if left empty current locale is used instead.
</description>
</method>
<method name="set_item_metadata">
<return type="void">
</return>
@ -347,6 +396,19 @@
Sets a value (of any type) to be stored with the item associated with the specified index.
</description>
</method>
<method name="set_item_opentype_feature">
<return type="void">
</return>
<argument index="0" name="idx" type="int">
</argument>
<argument index="1" name="tag" type="String">
</argument>
<argument index="2" name="value" type="int">
</argument>
<description>
Sets OpenType feature [code]tag[/code] for the item's text. More info: [url=https://docs.microsoft.com/en-us/typography/opentype/spec/featuretags]OpenType feature tags[/url].
</description>
</method>
<method name="set_item_selectable">
<return type="void">
</return>
@ -369,6 +431,17 @@
Sets text of the item associated with the specified index.
</description>
</method>
<method name="set_item_text_direction">
<return type="void">
</return>
<argument index="0" name="idx" type="int">
</argument>
<argument index="1" name="direction" type="int" enum="Control.TextDirection">
</argument>
<description>
Sets item's text base writing direction.
</description>
</method>
<method name="set_item_tooltip">
<return type="void">
</return>
@ -544,6 +617,9 @@
<theme_item name="font_color_selected" type="Color" default="Color( 1, 1, 1, 1 )">
Text [Color] used when the item is selected.
</theme_item>
<theme_item name="font_size" type="int">
Font size of the item's text.
</theme_item>
<theme_item name="guide_color" type="Color" default="Color( 0, 0, 0, 0.1 )">
[Color] of the guideline. The guideline is a line drawn between each row of items.
</theme_item>

View file

@ -11,6 +11,13 @@
<link title="2D Dodge The Creeps Demo">https://godotengine.org/asset-library/asset/515</link>
</tutorials>
<methods>
<method name="clear_opentype_features">
<return type="void">
</return>
<description>
Removes all OpenType features.
</description>
</method>
<method name="get_line_count" qualifiers="const">
<return type="int">
</return>
@ -21,8 +28,21 @@
<method name="get_line_height" qualifiers="const">
<return type="int">
</return>
<argument index="0" name="line" type="int" default="-1">
</argument>
<description>
Returns the font size in pixels.
Returns the height of the line [code]line[/code].
If [code]line[/code] is set to [code]-1[/code], returns biggest line height.
If there're no lines returns font size in pixels.
</description>
</method>
<method name="get_opentype_feature" qualifiers="const">
<return type="int">
</return>
<argument index="0" name="tag" type="String">
</argument>
<description>
Returns OpenType feature [code]tag[/code].
</description>
</method>
<method name="get_total_character_count" qualifiers="const">
@ -39,6 +59,17 @@
Returns the number of lines shown. Useful if the [Label]'s height cannot currently display all lines.
</description>
</method>
<method name="set_opentype_feature">
<return type="void">
</return>
<argument index="0" name="tag" type="String">
</argument>
<argument index="1" name="value" type="int">
</argument>
<description>
Returns OpenType feature [code]tag[/code]. More info: [url=https://docs.microsoft.com/en-us/typography/opentype/spec/featuretags]OpenType feature tags[/url].
</description>
</method>
</methods>
<members>
<member name="align" type="int" setter="set_align" getter="get_align" enum="Label.Align" default="0">
@ -50,6 +81,9 @@
<member name="clip_text" type="bool" setter="set_clip_text" getter="is_clipping_text" default="false">
If [code]true[/code], the Label only shows the text that fits inside its bounding rectangle. It also lets you scale the node down freely.
</member>
<member name="language" type="String" setter="set_language" getter="get_language" default="&quot;&quot;">
Language code used for line-breaking and text shaping algorithms, if left empty current locale is used instead.
</member>
<member name="lines_skipped" type="int" setter="set_lines_skipped" getter="get_lines_skipped" default="0">
The node ignores the first [code]lines_skipped[/code] lines before it starts to display text.
</member>
@ -61,9 +95,18 @@
Limits the amount of visible characters. If you set [code]percent_visible[/code] to 0.5, only up to half of the text's characters will display on screen. Useful to animate the text in a dialog box.
</member>
<member name="size_flags_vertical" type="int" setter="set_v_size_flags" getter="get_v_size_flags" override="true" default="4" />
<member name="structured_text_bidi_override" type="int" setter="set_structured_text_bidi_override" getter="get_structured_text_bidi_override" enum="Control.StructuredTextParser" default="0">
Set BiDi algorithm override for the structured text.
</member>
<member name="structured_text_bidi_override_options" type="Array" setter="set_structured_text_bidi_override_options" getter="get_structured_text_bidi_override_options" default="[ ]">
Set additional options for BiDi override.
</member>
<member name="text" type="String" setter="set_text" getter="get_text" default="&quot;&quot;">
The text to display on screen.
</member>
<member name="text_direction" type="int" setter="set_text_direction" getter="get_text_direction" enum="Control.TextDirection" default="0">
Base text writing direction.
</member>
<member name="uppercase" type="bool" setter="set_uppercase" getter="is_uppercase" default="false">
If [code]true[/code], all the text displays as UPPERCASE.
</member>
@ -85,7 +128,7 @@
Align rows to the right.
</constant>
<constant name="ALIGN_FILL" value="3" enum="Align">
Expand row whitespaces to fit the width.
Expand row to fit the width.
</constant>
<constant name="VALIGN_TOP" value="0" enum="VAlign">
Align the whole text to the top.
@ -111,7 +154,10 @@
[Color] of the text's shadow effect.
</theme_item>
<theme_item name="font_outline_modulate" type="Color" default="Color( 1, 1, 1, 1 )">
The tint of [Font]'s outline. See [member DynamicFont.outline_color].
The tint of [Font]'s outline.
</theme_item>
<theme_item name="font_size" type="int">
Font size of the [Label]'s text.
</theme_item>
<theme_item name="line_spacing" type="int" default="3">
Vertical space between lines in multiline [Label].
@ -119,8 +165,8 @@
<theme_item name="normal" type="StyleBox">
Background [StyleBox] for the [Label].
</theme_item>
<theme_item name="shadow_as_outline" type="int" default="0">
Boolean value. If set to 1 ([code]true[/code]), the shadow will be displayed around the whole text as an outline.
<theme_item name="outline_size" type="int" default="0">
Text outline size.
</theme_item>
<theme_item name="shadow_offset_x" type="int" default="1">
The horizontal offset of the text's shadow.
@ -128,5 +174,8 @@
<theme_item name="shadow_offset_y" type="int" default="1">
The vertical offset of the text's shadow.
</theme_item>
<theme_item name="shadow_outline_size" type="int" default="1">
Shadow outline size. If set to 1 or greater, the shadow will be displayed around the whole text as an outline.
</theme_item>
</theme_items>
</class>

View file

@ -10,6 +10,7 @@
- [kbd]Ctrl + X[/kbd]: Cut
- [kbd]Ctrl + V[/kbd] or [kbd]Ctrl + Y[/kbd]: Paste/"yank"
- [kbd]Ctrl + Z[/kbd]: Undo
- [kbd]Ctrl + ~[/kbd]: Swap input direction.
- [kbd]Ctrl + Shift + Z[/kbd]: Redo
- [kbd]Ctrl + U[/kbd]: Delete text from the cursor position to the beginning of the line
- [kbd]Ctrl + K[/kbd]: Delete text from the cursor position to the end of the line
@ -46,6 +47,13 @@
Erases the [LineEdit]'s [member text].
</description>
</method>
<method name="clear_opentype_features">
<return type="void">
</return>
<description>
Removes all OpenType features.
</description>
</method>
<method name="delete_char_at_cursor">
<return type="void">
</return>
@ -78,6 +86,15 @@
Returns the [PopupMenu] of this [LineEdit]. By default, this menu is displayed when right-clicking on the [LineEdit].
</description>
</method>
<method name="get_opentype_feature" qualifiers="const">
<return type="int">
</return>
<argument index="0" name="tag" type="String">
</argument>
<description>
Returns OpenType feature [code]tag[/code].
</description>
</method>
<method name="get_scroll_offset" qualifiers="const">
<return type="int">
</return>
@ -126,6 +143,17 @@
Selects the whole [String].
</description>
</method>
<method name="set_opentype_feature">
<return type="void">
</return>
<argument index="0" name="tag" type="String">
</argument>
<argument index="1" name="value" type="int">
</argument>
<description>
Returns OpenType feature [code]tag[/code]. More info: [url=https://docs.microsoft.com/en-us/typography/opentype/spec/featuretags]OpenType feature tags[/url].
</description>
</method>
</methods>
<members>
<member name="align" type="int" setter="set_align" getter="get_align" enum="LineEdit.Align" default="0">
@ -139,6 +167,10 @@
</member>
<member name="caret_force_displayed" type="bool" setter="cursor_set_force_displayed" getter="cursor_get_force_displayed" default="false">
</member>
<member name="caret_mid_grapheme" type="bool" setter="set_mid_grapheme_caret_enabled" getter="get_mid_grapheme_caret_enabled" default="false">
Allow moving caret, selecting and removing the individual composite character components.
Note: [kbd]Backspace[/kbd] is always removing individual composite character components.
</member>
<member name="caret_position" type="int" setter="set_cursor_position" getter="get_cursor_position" default="0">
The cursor's position inside the [LineEdit]. When set, the text may scroll to accommodate it.
</member>
@ -148,6 +180,9 @@
<member name="context_menu_enabled" type="bool" setter="set_context_menu_enabled" getter="is_context_menu_enabled" default="true">
If [code]true[/code], the context menu will appear when right-clicked.
</member>
<member name="draw_control_chars" type="bool" setter="set_draw_control_chars" getter="get_draw_control_chars" default="false">
If [code]true[/code], control characters are displayed.
</member>
<member name="editable" type="bool" setter="set_editable" getter="is_editable" default="true">
If [code]false[/code], existing text cannot be modified and new text cannot be added.
</member>
@ -155,6 +190,9 @@
If [code]true[/code], the [LineEdit] width will increase to stay longer than the [member text]. It will [b]not[/b] compress if the [member text] is shortened.
</member>
<member name="focus_mode" type="int" setter="set_focus_mode" getter="get_focus_mode" override="true" enum="Control.FocusMode" default="2" />
<member name="language" type="String" setter="set_language" getter="get_language" default="&quot;&quot;">
Language code used for line-breaking and text shaping algorithms, if left empty current locale is used instead.
</member>
<member name="max_length" type="int" setter="set_max_length" getter="get_max_length" default="0">
Maximum amount of characters that can be entered inside the [LineEdit]. If [code]0[/code], there is no limit.
</member>
@ -180,10 +218,19 @@
<member name="shortcut_keys_enabled" type="bool" setter="set_shortcut_keys_enabled" getter="is_shortcut_keys_enabled" default="true">
If [code]false[/code], using shortcuts will be disabled.
</member>
<member name="structured_text_bidi_override" type="int" setter="set_structured_text_bidi_override" getter="get_structured_text_bidi_override" enum="Control.StructuredTextParser" default="0">
Set BiDi algorithm override for the structured text.
</member>
<member name="structured_text_bidi_override_options" type="Array" setter="set_structured_text_bidi_override_options" getter="get_structured_text_bidi_override_options" default="[ ]">
Set additional options for BiDi override.
</member>
<member name="text" type="String" setter="set_text" getter="get_text" default="&quot;&quot;">
String value of the [LineEdit].
[b]Note:[/b] Changing text using this property won't emit the [signal text_changed] signal.
</member>
<member name="text_direction" type="int" setter="set_text_direction" getter="get_text_direction" enum="Control.TextDirection" default="0">
Base text writing direction.
</member>
<member name="virtual_keyboard_enabled" type="bool" setter="set_virtual_keyboard_enabled" getter="is_virtual_keyboard_enabled" default="true">
If [code]true[/code], the native virtual keyboard is shown when focused on platforms that support it.
</member>
@ -220,7 +267,7 @@
Aligns the text on the right-hand side of the [LineEdit].
</constant>
<constant name="ALIGN_FILL" value="3" enum="Align">
Stretches whitespaces to fit the [LineEdit]'s width.
Expand row to fit the [LineEdit]'s width.
</constant>
<constant name="MENU_CUT" value="0" enum="MenuItems">
Cuts (copies and clears) the selected text.
@ -244,7 +291,70 @@
<constant name="MENU_REDO" value="6" enum="MenuItems">
Reverse the last undo action.
</constant>
<constant name="MENU_MAX" value="7" enum="MenuItems">
<constant name="MENU_DIR_INHERITED" value="7" enum="MenuItems">
Sets text direction to inherited.
</constant>
<constant name="MENU_DIR_AUTO" value="8" enum="MenuItems">
Sets text direction to automatic.
</constant>
<constant name="MENU_DIR_LTR" value="9" enum="MenuItems">
Sets text direction to left-to-right.
</constant>
<constant name="MENU_DIR_RTL" value="10" enum="MenuItems">
Sets text direction to right-to-left.
</constant>
<constant name="MENU_DISPLAY_UCC" value="11" enum="MenuItems">
Toggles control character display.
</constant>
<constant name="MENU_INSERT_LRM" value="12" enum="MenuItems">
Inserts left-to-right mark (LRM) character.
</constant>
<constant name="MENU_INSERT_RLM" value="13" enum="MenuItems">
Inserts right-to-left mark (RLM) character.
</constant>
<constant name="MENU_INSERT_LRE" value="14" enum="MenuItems">
Inserts start of left-to-right embedding (LRE) character.
</constant>
<constant name="MENU_INSERT_RLE" value="15" enum="MenuItems">
Inserts start of right-to-left embedding (RLE) character.
</constant>
<constant name="MENU_INSERT_LRO" value="16" enum="MenuItems">
Inserts start of left-to-right override (LRO) character.
</constant>
<constant name="MENU_INSERT_RLO" value="17" enum="MenuItems">
Inserts start of right-to-left override (RLO) character.
</constant>
<constant name="MENU_INSERT_PDF" value="18" enum="MenuItems">
Inserts pop direction formatting (PDF) character.
</constant>
<constant name="MENU_INSERT_ALM" value="19" enum="MenuItems">
Inserts Arabic letter mark (ALM) character.
</constant>
<constant name="MENU_INSERT_LRI" value="20" enum="MenuItems">
Inserts left-to-right isolate (LRI) character.
</constant>
<constant name="MENU_INSERT_RLI" value="21" enum="MenuItems">
Inserts right-to-left isolate (RLI) character.
</constant>
<constant name="MENU_INSERT_FSI" value="22" enum="MenuItems">
Inserts first strong isolate (FSI) character.
</constant>
<constant name="MENU_INSERT_PDI" value="23" enum="MenuItems">
Inserts pop direction isolate (PDI) character.
</constant>
<constant name="MENU_INSERT_ZWJ" value="24" enum="MenuItems">
Inserts zero width joiner (ZWJ) character.
</constant>
<constant name="MENU_INSERT_ZWNJ" value="25" enum="MenuItems">
Inserts zero width non-joiner (ZWNJ) character.
</constant>
<constant name="MENU_INSERT_WJ" value="26" enum="MenuItems">
Inserts word joiner (WJ) character.
</constant>
<constant name="MENU_INSERT_SHY" value="27" enum="MenuItems">
Inserts soft hyphen (SHY) character.
</constant>
<constant name="MENU_MAX" value="28" enum="MenuItems">
Represents the size of the [enum MenuItems] enum.
</constant>
</constants>
@ -276,6 +386,9 @@
<theme_item name="font_color_uneditable" type="Color" default="Color( 0.88, 0.88, 0.88, 0.5 )">
Font color when editing is disabled.
</theme_item>
<theme_item name="font_size" type="int">
Font size of the [LineEdit]'s text.
</theme_item>
<theme_item name="minimum_spaces" type="int" default="12">
Minimum horizontal space for the text (not counting the clear button and content margins). This value is measured in count of space characters (i.e. this amount of space characters can be displayed without scrolling).
</theme_item>

View file

@ -10,12 +10,51 @@
<tutorials>
</tutorials>
<methods>
<method name="clear_opentype_features">
<return type="void">
</return>
<description>
Removes all OpenType features.
</description>
</method>
<method name="get_opentype_feature" qualifiers="const">
<return type="int">
</return>
<argument index="0" name="tag" type="String">
</argument>
<description>
Returns OpenType feature [code]tag[/code].
</description>
</method>
<method name="set_opentype_feature">
<return type="void">
</return>
<argument index="0" name="tag" type="String">
</argument>
<argument index="1" name="value" type="int">
</argument>
<description>
Returns OpenType feature [code]tag[/code]. More info: [url=https://docs.microsoft.com/en-us/typography/opentype/spec/featuretags]OpenType feature tags[/url].
</description>
</method>
</methods>
<members>
<member name="language" type="String" setter="set_language" getter="get_language" default="&quot;&quot;">
Language code used for line-breaking and text shaping algorithms, if left empty current locale is used instead.
</member>
<member name="mouse_default_cursor_shape" type="int" setter="set_default_cursor_shape" getter="get_default_cursor_shape" override="true" enum="Control.CursorShape" default="2" />
<member name="structured_text_bidi_override" type="int" setter="set_structured_text_bidi_override" getter="get_structured_text_bidi_override" enum="Control.StructuredTextParser" default="0">
Set BiDi algorithm override for the structured text.
</member>
<member name="structured_text_bidi_override_options" type="Array" setter="set_structured_text_bidi_override_options" getter="get_structured_text_bidi_override_options" default="[ ]">
Set additional options for BiDi override.
</member>
<member name="text" type="String" setter="set_text" getter="get_text" default="&quot;&quot;">
The button's text that will be displayed inside the button's area.
</member>
<member name="text_direction" type="int" setter="set_text_direction" getter="get_text_direction" enum="Control.TextDirection" default="0">
Base text writing direction.
</member>
<member name="underline" type="int" setter="set_underline_mode" getter="get_underline_mode" enum="LinkButton.UnderlineMode" default="0">
Determines when to show the underline. See [enum UnderlineMode] for options.
</member>
@ -47,6 +86,9 @@
<theme_item name="font_color_pressed" type="Color" default="Color( 1, 1, 1, 1 )">
Text [Color] used when the [LinkButton] is being pressed.
</theme_item>
<theme_item name="font_size" type="int">
Font size of the [LinkButton]'s text.
</theme_item>
<theme_item name="underline_spacing" type="int" default="2">
The vertical space between the baseline of text and the underline.
</theme_item>

View file

@ -126,5 +126,8 @@
Notification received from the OS when the application is defocused, i.e. when changing the focus from any open window of the Godot instance to the OS desktop or a thirdparty application.
Implemented on desktop platforms.
</constant>
<constant name="NOTIFICATION_TEXT_SERVER_CHANGED" value="2018">
Notification received when text server is changed.
</constant>
</constants>
</class>

View file

@ -67,6 +67,9 @@
<theme_item name="font_color_pressed" type="Color" default="Color( 1, 1, 1, 1 )">
Text [Color] used when the [MenuButton] is being pressed.
</theme_item>
<theme_item name="font_size" type="int">
Font size of the [MenuButton]'s text.
</theme_item>
<theme_item name="hover" type="StyleBox">
[StyleBox] used when the [MenuButton] is being hovered.
</theme_item>

View file

@ -1013,6 +1013,9 @@
Notification received from the OS when the application is defocused, i.e. when changing the focus from any open window of the Godot instance to the OS desktop or a thirdparty application.
Implemented on desktop platforms.
</constant>
<constant name="NOTIFICATION_TEXT_SERVER_CHANGED" value="2018">
Notification received when text server is changed.
</constant>
<constant name="PAUSE_MODE_INHERIT" value="0" enum="PauseMode">
Inherits pause mode from the node's parent. For the root node, it is equivalent to [constant PAUSE_MODE_STOP]. Default.
</constant>

View file

@ -239,7 +239,10 @@
The horizontal space between the arrow icon and the right edge of the button.
</theme_item>
<theme_item name="disabled" type="StyleBox">
[StyleBox] used when the [OptionButton] is disabled.
[StyleBox] used when the [OptionButton] is disabled (for left-to-right layouts).
</theme_item>
<theme_item name="disabled_mirrored" type="StyleBox">
[StyleBox] used when the [OptionButton] is disabled (for right-to-left layouts).
</theme_item>
<theme_item name="focus" type="StyleBox">
[StyleBox] used when the [OptionButton] is focused. It is displayed over the current [StyleBox], so using [StyleBoxEmpty] will just disable the focus visual effect.
@ -259,17 +262,29 @@
<theme_item name="font_color_pressed" type="Color" default="Color( 1, 1, 1, 1 )">
Text [Color] used when the [OptionButton] is being pressed.
</theme_item>
<theme_item name="font_size" type="int">
Font size of the [OptionButton]'s text.
</theme_item>
<theme_item name="hover" type="StyleBox">
[StyleBox] used when the [OptionButton] is being hovered.
[StyleBox] used when the [OptionButton] is being hovered (for left-to-right layouts).
</theme_item>
<theme_item name="hover_mirrored" type="StyleBox">
[StyleBox] used when the [OptionButton] is being hovered (for right-to-left layouts).
</theme_item>
<theme_item name="hseparation" type="int" default="2">
The horizontal space between [OptionButton]'s icon and text.
</theme_item>
<theme_item name="normal" type="StyleBox">
Default [StyleBox] for the [OptionButton].
Default [StyleBox] for the [OptionButton] (for left-to-right layouts).
</theme_item>
<theme_item name="normal_mirrored" type="StyleBox">
Default [StyleBox] for the [OptionButton] (for right-to-left layouts).
</theme_item>
<theme_item name="pressed" type="StyleBox">
[StyleBox] used when the [OptionButton] is being pressed.
[StyleBox] used when the [OptionButton] is being pressed (for left-to-right layouts).
</theme_item>
<theme_item name="pressed_mirrored" type="StyleBox">
[StyleBox] used when the [OptionButton] is being pressed (for right-to-left layouts).
</theme_item>
</theme_items>
</class>

View file

@ -244,6 +244,15 @@
Removes all items from the [PopupMenu].
</description>
</method>
<method name="clear_item_opentype_features">
<return type="void">
</return>
<argument index="0" name="idx" type="int">
</argument>
<description>
Removes all OpenType features form the item's text.
</description>
</method>
<method name="get_current_index" qualifiers="const">
<return type="int">
</return>
@ -293,6 +302,15 @@
Returns the index of the item containing the specified [code]id[/code]. Index is automatically assigned to each item by the engine. Index can not be set manually.
</description>
</method>
<method name="get_item_language" qualifiers="const">
<return type="String">
</return>
<argument index="0" name="idx" type="int">
</argument>
<description>
Returns item's text language code.
</description>
</method>
<method name="get_item_metadata" qualifiers="const">
<return type="Variant">
</return>
@ -302,6 +320,17 @@
Returns the metadata of the specified item, which might be of any type. You can set it with [method set_item_metadata], which provides a simple way of assigning context data to items.
</description>
</method>
<method name="get_item_opentype_feature" qualifiers="const">
<return type="int">
</return>
<argument index="0" name="idx" type="int">
</argument>
<argument index="1" name="tag" type="String">
</argument>
<description>
Returns OpenType feature [code]tag[/code] of the item's text.
</description>
</method>
<method name="get_item_shortcut" qualifiers="const">
<return type="Shortcut">
</return>
@ -329,6 +358,15 @@
Returns the text of the item at index [code]idx[/code].
</description>
</method>
<method name="get_item_text_direction" qualifiers="const">
<return type="int" enum="Control.TextDirection">
</return>
<argument index="0" name="idx" type="int">
</argument>
<description>
Returns item's text base writing direction.
</description>
</method>
<method name="get_item_tooltip" qualifiers="const">
<return type="String">
</return>
@ -494,6 +532,17 @@
Sets the [code]id[/code] of the item at index [code]idx[/code].
</description>
</method>
<method name="set_item_language">
<return type="void">
</return>
<argument index="0" name="idx" type="int">
</argument>
<argument index="1" name="language" type="String">
</argument>
<description>
Sets language code of item's text used for line-breaking and text shaping algorithms, if left empty current locale is used instead.
</description>
</method>
<method name="set_item_metadata">
<return type="void">
</return>
@ -516,6 +565,19 @@
Sets the state of an multistate item. See [method add_multistate_item] for details.
</description>
</method>
<method name="set_item_opentype_feature">
<return type="void">
</return>
<argument index="0" name="idx" type="int">
</argument>
<argument index="1" name="tag" type="String">
</argument>
<argument index="2" name="value" type="int">
</argument>
<description>
Sets OpenType feature [code]tag[/code] for the item's text. More info: [url=https://docs.microsoft.com/en-us/typography/opentype/spec/featuretags]OpenType feature tags[/url].
</description>
</method>
<method name="set_item_shortcut">
<return type="void">
</return>
@ -562,6 +624,17 @@
Sets the text of the item at index [code]idx[/code].
</description>
</method>
<method name="set_item_text_direction">
<return type="void">
</return>
<argument index="0" name="idx" type="int">
</argument>
<argument index="1" name="direction" type="int" enum="Control.TextDirection">
</argument>
<description>
Sets item's text base writing direction.
</description>
</method>
<method name="set_item_tooltip">
<return type="void">
</return>
@ -653,6 +726,9 @@
<theme_item name="font_color_hover" type="Color" default="Color( 0.88, 0.88, 0.88, 1 )">
[Color] used for the hovered text.
</theme_item>
<theme_item name="font_size" type="int">
Font size of the menu items.
</theme_item>
<theme_item name="hover" type="StyleBox">
[StyleBox] displayed when the [PopupMenu] item is hovered.
</theme_item>
@ -681,7 +757,10 @@
[StyleBox] used for the separators. See [method add_separator].
</theme_item>
<theme_item name="submenu" type="Texture2D">
[Texture2D] icon for the submenu arrow.
[Texture2D] icon for the submenu arrow (for left-to-right layouts).
</theme_item>
<theme_item name="submenu_mirrored" type="Texture2D">
[Texture2D] icon for the submenu arrow (for right-to-left layouts).
</theme_item>
<theme_item name="unchecked" type="Texture2D">
[Texture2D] icon for the unchecked checkbox items.

View file

@ -35,5 +35,8 @@
<theme_item name="font_color_shadow" type="Color" default="Color( 0, 0, 0, 1 )">
The color of the text's shadow.
</theme_item>
<theme_item name="font_size" type="int">
Font size used to draw the fill percentage if [member percent_visible] is [code]true[/code].
</theme_item>
</theme_items>
</class>

View file

@ -453,6 +453,9 @@
<member name="display/window/energy_saving/keep_screen_on" type="bool" setter="" getter="" default="true">
If [code]true[/code], keeps the screen on (even in case of inactivity), so the screensaver does not take over. Works on desktop and mobile platforms.
</member>
<member name="display/window/force_right_to_left_layout_direction" type="bool" setter="" getter="" default="false">
Force layout direction and text writing direction to RTL for all locales.
</member>
<member name="display/window/handheld/orientation" type="String" setter="" getter="" default="&quot;landscape&quot;">
Default orientation on mobile devices.
</member>
@ -491,6 +494,9 @@
<member name="display/window/tablet_driver" type="String" setter="" getter="">
Specifies the tablet driver to use. If left empty, the default driver will be used.
</member>
<member name="display/window/text_name" type="String" setter="" getter="" default="&quot;&quot;">
Specifies the [TextServer] to use. If left empty, the default will be used.
</member>
<member name="display/window/vsync/use_vsync" type="bool" setter="" getter="" default="true">
If [code]true[/code], enables vertical synchronization. This eliminates tearing that may appear in moving scenes, at the cost of higher input latency and stuttering at lower framerates. If [code]false[/code], vertical synchronization will be disabled, however, many platforms will enforce it regardless (such as mobile platforms and HTML5).
</member>

View file

@ -329,6 +329,9 @@
The raw text of the label.
When set, clears the tag stack and adds a raw text tag to the top of it. Does not parse BBCodes. Does not modify [member bbcode_text].
</member>
<member name="text_direction" type="int" setter="set_text_direction" getter="get_text_direction" enum="Control.TextDirection" default="0">
Base text writing direction.
</member>
<member name="visible_characters" type="int" setter="set_visible_characters" getter="get_visible_characters" default="-1">
The restricted number of characters to display in the label. If [code]-1[/code], all characters will be displayed.
</member>

View file

@ -204,6 +204,9 @@
<theme_item name="font_color_fg" type="Color" default="Color( 0.94, 0.94, 0.94, 1 )">
Font color of the currently selected tab.
</theme_item>
<theme_item name="font_size" type="int">
Font size of the tab names.
</theme_item>
<theme_item name="icon_separation" type="int" default="4">
Space between tab's name and its icon.
</theme_item>

View file

@ -20,6 +20,15 @@
Adds a new tab.
</description>
</method>
<method name="clear_tab_opentype_features">
<return type="void">
</return>
<argument index="0" name="tab_idx" type="int">
</argument>
<description>
Removes all OpenType features from the tab title.
</description>
</method>
<method name="ensure_tab_visible">
<return type="void">
</return>
@ -75,6 +84,15 @@
Returns the [Texture2D] for the tab at index [code]tab_idx[/code] or [code]null[/code] if the tab has no [Texture2D].
</description>
</method>
<method name="get_tab_language" qualifiers="const">
<return type="String">
</return>
<argument index="0" name="tab_idx" type="int">
</argument>
<description>
Returns tab title language code.
</description>
</method>
<method name="get_tab_offset" qualifiers="const">
<return type="int">
</return>
@ -82,6 +100,17 @@
Returns the number of hidden tabs offsetted to the left.
</description>
</method>
<method name="get_tab_opentype_feature" qualifiers="const">
<return type="int">
</return>
<argument index="0" name="tab_idx" type="int">
</argument>
<argument index="1" name="tag" type="String">
</argument>
<description>
Returns OpenType feature [code]tag[/code] of the tab title.
</description>
</method>
<method name="get_tab_rect" qualifiers="const">
<return type="Rect2">
</return>
@ -91,6 +120,15 @@
Returns tab [Rect2] with local position and size.
</description>
</method>
<method name="get_tab_text_direction" qualifiers="const">
<return type="int" enum="Control.TextDirection">
</return>
<argument index="0" name="tab_idx" type="int">
</argument>
<description>
Returns tab title text base writing direction.
</description>
</method>
<method name="get_tab_title" qualifiers="const">
<return type="String">
</return>
@ -159,6 +197,41 @@
Sets an [code]icon[/code] for the tab at index [code]tab_idx[/code].
</description>
</method>
<method name="set_tab_language">
<return type="void">
</return>
<argument index="0" name="tab_idx" type="int">
</argument>
<argument index="1" name="language" type="String">
</argument>
<description>
Sets language code of tab title used for line-breaking and text shaping algorithms, if left empty current locale is used instead.
</description>
</method>
<method name="set_tab_opentype_feature">
<return type="void">
</return>
<argument index="0" name="tab_idx" type="int">
</argument>
<argument index="1" name="tag" type="String">
</argument>
<argument index="2" name="values" type="int">
</argument>
<description>
Sets OpenType feature [code]tag[/code] for the tab title. More info: [url=https://docs.microsoft.com/en-us/typography/opentype/spec/featuretags]OpenType feature tags[/url].
</description>
</method>
<method name="set_tab_text_direction">
<return type="void">
</return>
<argument index="0" name="tab_idx" type="int">
</argument>
<argument index="1" name="direction" type="int" enum="Control.TextDirection">
</argument>
<description>
Sets tab title base writing direction.
</description>
</method>
<method name="set_tab_title">
<return type="void">
</return>
@ -295,6 +368,9 @@
<theme_item name="font_color_fg" type="Color" default="Color( 0.94, 0.94, 0.94, 1 )">
Font color of the currently selected tab.
</theme_item>
<theme_item name="font_size" type="int">
Font size of the tab names.
</theme_item>
<theme_item name="hseparation" type="int" default="4">
The horizontal separation between the tabs.
</theme_item>

View file

@ -33,6 +33,13 @@
Centers the viewport on the line the editing cursor is at. This also resets the [member scroll_horizontal] value to [code]0[/code].
</description>
</method>
<method name="clear_opentype_features">
<return type="void">
</return>
<description>
Removes all OpenType features.
</description>
</method>
<method name="clear_undo_history">
<return type="void">
</return>
@ -213,6 +220,15 @@
Returns the [PopupMenu] of this [TextEdit]. By default, this menu is displayed when right-clicking on the [TextEdit].
</description>
</method>
<method name="get_opentype_feature" qualifiers="const">
<return type="int">
</return>
<argument index="0" name="tag" type="String">
</argument>
<description>
Returns OpenType feature [code]tag[/code].
</description>
</method>
<method name="get_selection_column" qualifiers="const">
<return type="int">
</return>
@ -573,6 +589,17 @@
<description>
</description>
</method>
<method name="set_opentype_feature">
<return type="void">
</return>
<argument index="0" name="tag" type="String">
</argument>
<argument index="1" name="value" type="int">
</argument>
<description>
Sets OpenType feature [code]tag[/code]. More info: [url=https://docs.microsoft.com/en-us/typography/opentype/spec/featuretags]OpenType feature tags[/url].
</description>
</method>
<method name="set_selection_mode">
<return type="void">
</return>
@ -629,6 +656,10 @@
If [code]true[/code], the caret displays as a rectangle.
If [code]false[/code], the caret displays as a bar.
</member>
<member name="caret_mid_grapheme" type="bool" setter="set_mid_grapheme_caret_enabled" getter="get_mid_grapheme_caret_enabled" default="false">
Allow moving caret, selecting and removing the individual composite character components.
Note: [kbd]Backspace[/kbd] is always removing individual composite character components.
</member>
<member name="caret_moving_by_right_click" type="bool" setter="set_right_click_moves_caret" getter="is_right_click_moving_caret" default="true">
If [code]true[/code], a right-click moves the cursor at the mouse position before displaying the context menu.
If [code]false[/code], the context menu disregards mouse location.
@ -636,6 +667,9 @@
<member name="context_menu_enabled" type="bool" setter="set_context_menu_enabled" getter="is_context_menu_enabled" default="true">
If [code]true[/code], a right-click displays the context menu.
</member>
<member name="draw_control_chars" type="bool" setter="set_draw_control_chars" getter="get_draw_control_chars" default="false">
If [code]true[/code], control characters are displayed.
</member>
<member name="draw_spaces" type="bool" setter="set_draw_spaces" getter="is_drawing_spaces" default="false">
If [code]true[/code], the "space" character will have a visible representation.
</member>
@ -652,6 +686,9 @@
<member name="highlight_current_line" type="bool" setter="set_highlight_current_line" getter="is_highlight_current_line_enabled" default="false">
If [code]true[/code], the line containing the cursor is highlighted.
</member>
<member name="language" type="String" setter="set_language" getter="get_language" default="&quot;&quot;">
Language code used for line-breaking and text shaping algorithms, if left empty current locale is used instead.
</member>
<member name="minimap_draw" type="bool" setter="draw_minimap" getter="is_drawing_minimap" default="false">
If [code]true[/code], a minimap is shown, providing an outline of your source code.
</member>
@ -681,11 +718,20 @@
<member name="smooth_scrolling" type="bool" setter="set_smooth_scroll_enable" getter="is_smooth_scroll_enabled" default="false">
If [code]true[/code], sets the [code]step[/code] of the scrollbars to [code]0.25[/code] which results in smoother scrolling.
</member>
<member name="structured_text_bidi_override" type="int" setter="set_structured_text_bidi_override" getter="get_structured_text_bidi_override" enum="Control.StructuredTextParser" default="0">
Set BiDi algorithm override for the structured text.
</member>
<member name="structured_text_bidi_override_options" type="Array" setter="set_structured_text_bidi_override_options" getter="get_structured_text_bidi_override_options" default="[ ]">
Set additional options for BiDi override.
</member>
<member name="syntax_highlighter" type="SyntaxHighlighter" setter="set_syntax_highlighter" getter="get_syntax_highlighter">
</member>
<member name="text" type="String" setter="set_text" getter="get_text" default="&quot;&quot;">
String value of the [TextEdit].
</member>
<member name="text_direction" type="int" setter="set_text_direction" getter="get_text_direction" enum="Control.TextDirection" default="0">
Base text writing direction.
</member>
<member name="v_scroll_speed" type="float" setter="set_v_scroll_speed" getter="get_v_scroll_speed" default="80.0">
Vertical scroll sensitivity.
</member>
@ -799,7 +845,70 @@
<constant name="MENU_REDO" value="6" enum="MenuItems">
Redoes the previous action.
</constant>
<constant name="MENU_MAX" value="7" enum="MenuItems">
<constant name="MENU_DIR_INHERITED" value="7" enum="MenuItems">
Sets text direction to inherited.
</constant>
<constant name="MENU_DIR_AUTO" value="8" enum="MenuItems">
Sets text direction to automatic.
</constant>
<constant name="MENU_DIR_LTR" value="9" enum="MenuItems">
Sets text direction to left-to-right.
</constant>
<constant name="MENU_DIR_RTL" value="10" enum="MenuItems">
Sets text direction to right-to-left.
</constant>
<constant name="MENU_DISPLAY_UCC" value="11" enum="MenuItems">
Toggles control character display.
</constant>
<constant name="MENU_INSERT_LRM" value="12" enum="MenuItems">
Inserts left-to-right mark (LRM) character.
</constant>
<constant name="MENU_INSERT_RLM" value="13" enum="MenuItems">
Inserts right-to-left mark (RLM) character.
</constant>
<constant name="MENU_INSERT_LRE" value="14" enum="MenuItems">
Inserts start of left-to-right embedding (LRE) character.
</constant>
<constant name="MENU_INSERT_RLE" value="15" enum="MenuItems">
Inserts start of right-to-left embedding (RLE) character.
</constant>
<constant name="MENU_INSERT_LRO" value="16" enum="MenuItems">
Inserts start of left-to-right override (LRO) character.
</constant>
<constant name="MENU_INSERT_RLO" value="17" enum="MenuItems">
Inserts start of right-to-left override (RLO) character.
</constant>
<constant name="MENU_INSERT_PDF" value="18" enum="MenuItems">
Inserts pop direction formatting (PDF) character.
</constant>
<constant name="MENU_INSERT_ALM" value="19" enum="MenuItems">
Inserts Arabic letter mark (ALM) character.
</constant>
<constant name="MENU_INSERT_LRI" value="20" enum="MenuItems">
Inserts left-to-right isolate (LRI) character.
</constant>
<constant name="MENU_INSERT_RLI" value="21" enum="MenuItems">
Inserts right-to-left isolate (RLI) character.
</constant>
<constant name="MENU_INSERT_FSI" value="22" enum="MenuItems">
Inserts first strong isolate (FSI) character.
</constant>
<constant name="MENU_INSERT_PDI" value="23" enum="MenuItems">
Inserts pop direction isolate (PDI) character.
</constant>
<constant name="MENU_INSERT_ZWJ" value="24" enum="MenuItems">
Inserts zero width joiner (ZWJ) character.
</constant>
<constant name="MENU_INSERT_ZWNJ" value="25" enum="MenuItems">
Inserts zero width non-joiner (ZWNJ) character.
</constant>
<constant name="MENU_INSERT_WJ" value="26" enum="MenuItems">
Inserts word joiner (WJ) character.
</constant>
<constant name="MENU_INSERT_SHY" value="27" enum="MenuItems">
Inserts soft hyphen (SHY) character.
</constant>
<constant name="MENU_MAX" value="28" enum="MenuItems">
Represents the size of the [enum MenuItems] enum.
</constant>
</constants>
@ -849,6 +958,9 @@
<theme_item name="font_color_selected" type="Color" default="Color( 0, 0, 0, 1 )">
Sets the [Color] of the selected text. [member override_selected_font_color] has to be enabled.
</theme_item>
<theme_item name="font_size" type="int">
Sets default font size.
</theme_item>
<theme_item name="line_spacing" type="int" default="4">
Sets the spacing between the lines.
</theme_item>
@ -865,6 +977,7 @@
Sets the highlight [Color] of text selections.
</theme_item>
<theme_item name="space" type="Texture2D">
Sets a custom [Texture2D] for space text characters.
</theme_item>
<theme_item name="tab" type="Texture2D">
Sets a custom [Texture2D] for tab text characters.

212
doc/classes/TextLine.xml Normal file
View file

@ -0,0 +1,212 @@
<?xml version="1.0" encoding="UTF-8" ?>
<class name="TextLine" inherits="Reference" version="4.0">
<brief_description>
Holds a line of text.
</brief_description>
<description>
Abstraction over [TextServer] for handling single line of text.
</description>
<tutorials>
</tutorials>
<methods>
<method name="add_object">
<return type="bool">
</return>
<argument index="0" name="key" type="Variant">
</argument>
<argument index="1" name="size" type="Vector2">
</argument>
<argument index="2" name="inline_align" type="int" enum="VAlign" default="1">
</argument>
<argument index="3" name="length" type="int" default="1">
</argument>
<description>
Adds inline object to the text buffer, [code]key[/code] must be unique. In the text, object is represented as [code]length[/code] object replacement characters.
</description>
</method>
<method name="add_string">
<return type="bool">
</return>
<argument index="0" name="text" type="String">
</argument>
<argument index="1" name="fonts" type="Font">
</argument>
<argument index="2" name="size" type="int">
</argument>
<argument index="3" name="opentype_features" type="Dictionary" default="{
}">
</argument>
<argument index="4" name="language" type="String" default="&quot;&quot;">
</argument>
<description>
Adds text span and font to draw it.
</description>
</method>
<method name="clear">
<return type="void">
</return>
<description>
Clears text line (removes text and inline objects).
</description>
</method>
<method name="draw" qualifiers="const">
<return type="void">
</return>
<argument index="0" name="canvas" type="RID">
</argument>
<argument index="1" name="pos" type="Vector2">
</argument>
<argument index="2" name="color" type="Color" default="Color( 1, 1, 1, 1 )">
</argument>
<description>
Draw text into a canvas item at a given position, with [code]color[/code]. [code]pos[/code] specifies the top left corner of the bounding box.
</description>
</method>
<method name="draw_outline" qualifiers="const">
<return type="void">
</return>
<argument index="0" name="canvas" type="RID">
</argument>
<argument index="1" name="pos" type="Vector2">
</argument>
<argument index="2" name="outline_size" type="int" default="1">
</argument>
<argument index="3" name="color" type="Color" default="Color( 1, 1, 1, 1 )">
</argument>
<description>
Draw text into a canvas item at a given position, with [code]color[/code]. [code]pos[/code] specifies the top left corner of the bounding box.
</description>
</method>
<method name="get_line_ascent" qualifiers="const">
<return type="float">
</return>
<description>
Returns the text ascent (number of pixels above the baseline for horizontal layout or to the left of baseline for vertical).
</description>
</method>
<method name="get_line_descent" qualifiers="const">
<return type="float">
</return>
<description>
Returns the text descent (number of pixels below the baseline for horizontal layout or to the right of baseline for vertical).
</description>
</method>
<method name="get_line_underline_position" qualifiers="const">
<return type="float">
</return>
<description>
Returns pixel offset of the underline below the baseline.
</description>
</method>
<method name="get_line_underline_thickness" qualifiers="const">
<return type="float">
</return>
<description>
Returns thickness of the underline.
</description>
</method>
<method name="get_line_width" qualifiers="const">
<return type="float">
</return>
<description>
Returns width (for horizontal layout) or height (for vertical) of the text.
</description>
</method>
<method name="get_object_rect" qualifiers="const">
<return type="Rect2">
</return>
<argument index="0" name="key" type="Variant">
</argument>
<description>
Returns bounding rectangle of the inline object.
</description>
</method>
<method name="get_objects" qualifiers="const">
<return type="Array">
</return>
<description>
Returns array of inline objects.
</description>
</method>
<method name="get_rid" qualifiers="const">
<return type="RID">
</return>
<description>
Returns TextServer buffer RID.
</description>
</method>
<method name="get_size" qualifiers="const">
<return type="Vector2">
</return>
<description>
Returns size of the bounding box of the text.
</description>
</method>
<method name="hit_test" qualifiers="const">
<return type="int">
</return>
<argument index="0" name="coords" type="float">
</argument>
<description>
Returns caret character offset at the specified pixel offset at the baseline. This function always returns a valid position.
</description>
</method>
<method name="resize_object">
<return type="bool">
</return>
<argument index="0" name="key" type="Variant">
</argument>
<argument index="1" name="size" type="Vector2">
</argument>
<argument index="2" name="inline_align" type="int" enum="VAlign" default="1">
</argument>
<description>
Sets new size and alignment of embedded object.
</description>
</method>
<method name="set_bidi_override">
<return type="void">
</return>
<argument index="0" name="override" type="Array">
</argument>
<description>
Overrides BiDi for the structured text.
Override ranges should cover full source text without overlaps. BiDi algorithm will be used on each range separately.
</description>
</method>
<method name="tab_align">
<return type="void">
</return>
<argument index="0" name="tab_stops" type="PackedFloat32Array">
</argument>
<description>
Aligns text to the given tab-stops.
</description>
</method>
</methods>
<members>
<member name="align" type="int" setter="set_align" getter="get_align" enum="HAlign" default="0">
Text horizontal alignment.
</member>
<member name="direction" type="int" setter="set_direction" getter="get_direction" enum="TextServer.Direction" default="0">
Text writing direction.
</member>
<member name="flags" type="int" setter="set_flags" getter="get_flags" default="3">
Line Alignment rules. For more info see [TextServer].
</member>
<member name="orientation" type="int" setter="set_orientation" getter="get_orientation" enum="TextServer.Orientation" default="0">
Text orientation.
</member>
<member name="preserve_control" type="bool" setter="set_preserve_control" getter="get_preserve_control" default="false">
If set to [code]true[/code] text will display control characters.
</member>
<member name="preserve_invalid" type="bool" setter="set_preserve_invalid" getter="get_preserve_invalid" default="true">
If set to [code]true[/code] text will display invalid characters.
</member>
<member name="width" type="float" setter="set_width" getter="get_width" default="-1.0">
Text line width.
</member>
</members>
<constants>
</constants>
</class>

View file

@ -0,0 +1,299 @@
<?xml version="1.0" encoding="UTF-8" ?>
<class name="TextParagraph" inherits="Reference" version="4.0">
<brief_description>
Holds a paragraph of text.
</brief_description>
<description>
Abstraction over [TextServer] for handling paragraph of text.
</description>
<tutorials>
</tutorials>
<methods>
<method name="add_object">
<return type="bool">
</return>
<argument index="0" name="key" type="Variant">
</argument>
<argument index="1" name="size" type="Vector2">
</argument>
<argument index="2" name="inline_align" type="int" enum="VAlign" default="1">
</argument>
<argument index="3" name="length" type="int" default="1">
</argument>
<description>
Adds inline object to the text buffer, [code]key[/code] must be unique. In the text, object is represented as [code]length[/code] object replacement characters.
</description>
</method>
<method name="add_string">
<return type="bool">
</return>
<argument index="0" name="text" type="String">
</argument>
<argument index="1" name="fonts" type="Font">
</argument>
<argument index="2" name="size" type="int">
</argument>
<argument index="3" name="opentype_features" type="Dictionary" default="{
}">
</argument>
<argument index="4" name="language" type="String" default="&quot;&quot;">
</argument>
<description>
Adds text span and font to draw it.
</description>
</method>
<method name="clear">
<return type="void">
</return>
<description>
Clears text paragraph (removes text and inline objects).
</description>
</method>
<method name="draw" qualifiers="const">
<return type="void">
</return>
<argument index="0" name="canvas" type="RID">
</argument>
<argument index="1" name="pos" type="Vector2">
</argument>
<argument index="2" name="color" type="Color" default="Color( 1, 1, 1, 1 )">
</argument>
<description>
Draw text into a canvas item at a given position, with [code]color[/code]. [code]pos[/code] specifies the top left corner of the bounding box.
</description>
</method>
<method name="draw_line" qualifiers="const">
<return type="void">
</return>
<argument index="0" name="canvas" type="RID">
</argument>
<argument index="1" name="pos" type="Vector2">
</argument>
<argument index="2" name="line" type="int">
</argument>
<argument index="3" name="color" type="Color" default="Color( 1, 1, 1, 1 )">
</argument>
<description>
Draw single line of text into a canvas item at a given position, with [code]color[/code]. [code]pos[/code] specifies the top left corner of the bounding box.
</description>
</method>
<method name="draw_line_outline" qualifiers="const">
<return type="void">
</return>
<argument index="0" name="canvas" type="RID">
</argument>
<argument index="1" name="pos" type="Vector2">
</argument>
<argument index="2" name="line" type="int">
</argument>
<argument index="3" name="outline_size" type="int" default="1">
</argument>
<argument index="4" name="color" type="Color" default="Color( 1, 1, 1, 1 )">
</argument>
<description>
Draw outline of the single line of text into a canvas item at a given position, with [code]color[/code]. [code]pos[/code] specifies the top left corner of the bounding box.
</description>
</method>
<method name="draw_outline" qualifiers="const">
<return type="void">
</return>
<argument index="0" name="canvas" type="RID">
</argument>
<argument index="1" name="outline_size" type="Vector2">
</argument>
<argument index="2" name="color" type="int" default="1">
</argument>
<argument index="3" name="arg3" type="Color" default="Color( 1, 1, 1, 1 )">
</argument>
<description>
Draw outline of the text into a canvas item at a given position, with [code]color[/code]. [code]pos[/code] specifies the top left corner of the bounding box.
</description>
</method>
<method name="get_line_ascent" qualifiers="const">
<return type="float">
</return>
<argument index="0" name="line" type="int">
</argument>
<description>
Returns the text line ascent (number of pixels above the baseline for horizontal layout or to the left of baseline for vertical).
</description>
</method>
<method name="get_line_count" qualifiers="const">
<return type="int">
</return>
<description>
Returns number of lines in the paragraph.
</description>
</method>
<method name="get_line_descent" qualifiers="const">
<return type="float">
</return>
<argument index="0" name="line" type="int">
</argument>
<description>
Returns the text line descent (number of pixels below the baseline for horizontal layout or to the right of baseline for vertical).
</description>
</method>
<method name="get_line_object_rect" qualifiers="const">
<return type="Rect2">
</return>
<argument index="0" name="line" type="int">
</argument>
<argument index="1" name="key" type="Variant">
</argument>
<description>
Returns bounding rectangle of the inline object.
</description>
</method>
<method name="get_line_objects" qualifiers="const">
<return type="Array">
</return>
<argument index="0" name="line" type="int">
</argument>
<description>
Returns array of inline objects in the line.
</description>
</method>
<method name="get_line_range" qualifiers="const">
<return type="Vector2i">
</return>
<argument index="0" name="line" type="int">
</argument>
<description>
Returns character range of the line.
</description>
</method>
<method name="get_line_rid" qualifiers="const">
<return type="RID">
</return>
<argument index="0" name="line" type="int">
</argument>
<description>
Returns TextServer line buffer RID.
</description>
</method>
<method name="get_line_size" qualifiers="const">
<return type="Vector2">
</return>
<argument index="0" name="line" type="int">
</argument>
<description>
Returns size of the bounding box of the line of text.
</description>
</method>
<method name="get_line_underline_position" qualifiers="const">
<return type="float">
</return>
<argument index="0" name="line" type="int">
</argument>
<description>
Returns pixel offset of the underline below the baseline.
</description>
</method>
<method name="get_line_underline_thickness" qualifiers="const">
<return type="float">
</return>
<argument index="0" name="line" type="int">
</argument>
<description>
Returns thickness of the underline.
</description>
</method>
<method name="get_line_width" qualifiers="const">
<return type="float">
</return>
<argument index="0" name="line" type="int">
</argument>
<description>
Returns width (for horizontal layout) or height (for vertical) of the line of text.
</description>
</method>
<method name="get_non_wraped_size" qualifiers="const">
<return type="Vector2">
</return>
<description>
Returns the size of the bounding box of the paragraph, without line breaks.
</description>
</method>
<method name="get_rid" qualifiers="const">
<return type="RID">
</return>
<description>
Returns TextServer full string buffer RID.
</description>
</method>
<method name="get_size" qualifiers="const">
<return type="Vector2">
</return>
<description>
Returns the size of the bounding box of the paragraph.
</description>
</method>
<method name="hit_test" qualifiers="const">
<return type="int">
</return>
<argument index="0" name="coords" type="Vector2">
</argument>
<description>
Returns caret character offset at the specified coordinates. This function always returns a valid position.
</description>
</method>
<method name="resize_object">
<return type="bool">
</return>
<argument index="0" name="key" type="Variant">
</argument>
<argument index="1" name="size" type="Vector2">
</argument>
<argument index="2" name="inline_align" type="int" enum="VAlign" default="1">
</argument>
<description>
Sets new size and alignment of embedded object.
</description>
</method>
<method name="set_bidi_override">
<return type="void">
</return>
<argument index="0" name="override" type="Array">
</argument>
<description>
Overrides BiDi for the structured text.
Override ranges should cover full source text without overlaps. BiDi algorithm will be used on each range separately.
</description>
</method>
<method name="tab_align">
<return type="void">
</return>
<argument index="0" name="tab_stops" type="PackedFloat32Array">
</argument>
<description>
Aligns paragraph to the given tab-stops.
</description>
</method>
</methods>
<members>
<member name="align" type="int" setter="set_align" getter="get_align" enum="HAlign" default="0">
Paragraph horizontal alignment.
</member>
<member name="direction" type="int" setter="set_direction" getter="get_direction" enum="TextServer.Direction" default="0">
Text writing direction.
</member>
<member name="flags" type="int" setter="set_flags" getter="get_flags" default="51">
Line breaking and alignment rules. For more info see [TextServer].
</member>
<member name="orientation" type="int" setter="set_orientation" getter="get_orientation" enum="TextServer.Orientation" default="0">
Text orientation.
</member>
<member name="preserve_control" type="bool" setter="set_preserve_control" getter="get_preserve_control" default="false">
If set to [code]true[/code] text will display control characters.
</member>
<member name="preserve_invalid" type="bool" setter="set_preserve_invalid" getter="get_preserve_invalid" default="true">
If set to [code]true[/code] text will display invalid characters.
</member>
<member name="width" type="float" setter="set_width" getter="get_width" default="-1.0">
Paragraph width.
</member>
</members>
<constants>
</constants>
</class>

1167
doc/classes/TextServer.xml Normal file

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,82 @@
<?xml version="1.0" encoding="UTF-8" ?>
<class name="TextServerManager" inherits="Object" version="4.0">
<brief_description>
Manager for the font and complex text layout servers.
</brief_description>
<description>
[TextServerManager] is the API backend for loading, enumeration and switching [TextServer]s.
Note: Switching text server at runtime is possible, but will invalidate all fonts and text buffers. Make sure to unload all controls, fonts, and themes before doing so.
</description>
<tutorials>
</tutorials>
<methods>
<method name="find_interface" qualifiers="const">
<return type="TextServer">
</return>
<argument index="0" name="name" type="String">
</argument>
<description>
Finds an interface by its name.
</description>
</method>
<method name="get_interface" qualifiers="const">
<return type="TextServer">
</return>
<argument index="0" name="index" type="int">
</argument>
<description>
Returns the interface registered at a given index.
</description>
</method>
<method name="get_interface_count" qualifiers="const">
<return type="int">
</return>
<description>
Returns the number of interfaces currently registered.
</description>
</method>
<method name="get_interface_features" qualifiers="const">
<return type="int">
</return>
<argument index="0" name="index" type="int">
</argument>
<description>
Returns text server supported features (binary OR).
</description>
</method>
<method name="get_interface_name" qualifiers="const">
<return type="String">
</return>
<argument index="0" name="index" type="int">
</argument>
<description>
Returns the interface name registered at a given index.
</description>
</method>
<method name="get_interfaces" qualifiers="const">
<return type="Array">
</return>
<description>
Returns a list of available interfaces the index and name of each interface.
</description>
</method>
<method name="get_primary_interface" qualifiers="const">
<return type="TextServer">
</return>
<description>
Returns the primary [TextServer] interface.
</description>
</method>
<method name="set_primary_interface">
<return type="bool">
</return>
<argument index="0" name="index" type="int">
</argument>
<description>
Sets (and initializes it if required) interface registered at a given index as the primary. Invalidates all references to the fonts and text buffers.
</description>
</method>
</methods>
<constants>
</constants>
</class>

View file

@ -51,6 +51,17 @@
Clears the [Font] at [code]name[/code] if the theme has [code]node_type[/code].
</description>
</method>
<method name="clear_font_size">
<return type="void">
</return>
<argument index="0" name="name" type="StringName">
</argument>
<argument index="1" name="node_type" type="StringName">
</argument>
<description>
Clears the font size [code]name[/code] if the theme has [code]node_type[/code].
</description>
</method>
<method name="clear_icon">
<return type="void">
</return>
@ -149,6 +160,26 @@
Returns all the [Font]s as a [PackedStringArray] filled with each [Font]'s name, for use in [method get_font], if the theme has [code]node_type[/code].
</description>
</method>
<method name="get_font_size" qualifiers="const">
<return type="int">
</return>
<argument index="0" name="name" type="StringName">
</argument>
<argument index="1" name="node_type" type="StringName">
</argument>
<description>
Returns the font size at [code]name[/code] if the theme has [code]node_type[/code].
</description>
</method>
<method name="get_font_size_list" qualifiers="const">
<return type="PackedStringArray">
</return>
<argument index="0" name="node_type" type="String">
</argument>
<description>
Returns all the font sizes as a [PackedStringArray] filled with each font size name, for use in [method get_font_size], if the theme has [code]node_type[/code].
</description>
</method>
<method name="get_icon" qualifiers="const">
<return type="Texture2D">
</return>
@ -241,6 +272,18 @@
Returns [code]false[/code] if the theme does not have [code]node_type[/code].
</description>
</method>
<method name="has_font_size" qualifiers="const">
<return type="bool">
</return>
<argument index="0" name="name" type="StringName">
</argument>
<argument index="1" name="node_type" type="StringName">
</argument>
<description>
Returns [code]true[/code] if font size with [code]name[/code] is in [code]node_type[/code].
Returns [code]false[/code] if the theme does not have [code]node_type[/code].
</description>
</method>
<method name="has_icon" qualifiers="const">
<return type="bool">
</return>
@ -307,6 +350,20 @@
Does nothing if the theme does not have [code]node_type[/code].
</description>
</method>
<method name="set_font_size">
<return type="void">
</return>
<argument index="0" name="name" type="StringName">
</argument>
<argument index="1" name="node_type" type="StringName">
</argument>
<argument index="2" name="font_size" type="int">
</argument>
<description>
Sets the theme's font size to [code]font_size[/code] at [code]name[/code] in [code]node_type[/code].
Does nothing if the theme does not have [code]node_type[/code].
</description>
</method>
<method name="set_icon">
<return type="void">
</return>
@ -340,6 +397,9 @@
<member name="default_font" type="Font" setter="set_default_font" getter="get_default_font">
The theme's default font.
</member>
<member name="default_font_size" type="int" setter="set_default_font_size" getter="get_default_font_size" default="-1">
The theme's default font size. Set to [code]-1[/code] to ignore and use global default.
</member>
</members>
<constants>
</constants>

View file

@ -35,6 +35,15 @@
Clears the tree. This removes all items.
</description>
</method>
<method name="clear_column_title_opentype_features">
<return type="void">
</return>
<argument index="0" name="column" type="int">
</argument>
<description>
Removes all OpenType features from the item's text.
</description>
</method>
<method name="create_item">
<return type="TreeItem">
</return>
@ -75,6 +84,35 @@
Returns the column's title.
</description>
</method>
<method name="get_column_title_direction" qualifiers="const">
<return type="int" enum="Control.TextDirection">
</return>
<argument index="0" name="column" type="int">
</argument>
<description>
Returns column title base writing direction.
</description>
</method>
<method name="get_column_title_language" qualifiers="const">
<return type="String">
</return>
<argument index="0" name="column" type="int">
</argument>
<description>
Returns column title language code.
</description>
</method>
<method name="get_column_title_opentype_feature" qualifiers="const">
<return type="int">
</return>
<argument index="0" name="column" type="int">
</argument>
<argument index="1" name="tag" type="String">
</argument>
<description>
Returns OpenType feature [code]tag[/code] of the column title.
</description>
</method>
<method name="get_column_width" qualifiers="const">
<return type="int">
</return>
@ -225,6 +263,41 @@
Sets the title of a column.
</description>
</method>
<method name="set_column_title_direction">
<return type="void">
</return>
<argument index="0" name="column" type="int">
</argument>
<argument index="1" name="direction" type="int" enum="Control.TextDirection">
</argument>
<description>
Sets column title base writing direction.
</description>
</method>
<method name="set_column_title_language">
<return type="void">
</return>
<argument index="0" name="column" type="int">
</argument>
<argument index="1" name="language" type="String">
</argument>
<description>
Sets language code of column title used for line-breaking and text shaping algorithms, if left empty current locale is used instead.
</description>
</method>
<method name="set_column_title_opentype_feature">
<return type="void">
</return>
<argument index="0" name="column" type="int">
</argument>
<argument index="1" name="tag" type="String">
</argument>
<argument index="2" name="value" type="int">
</argument>
<description>
Sets OpenType feature [code]tag[/code] for the column title.
</description>
</method>
<method name="set_column_titles_visible">
<return type="void">
</return>
@ -398,7 +471,10 @@
The arrow icon used when a foldable item is not collapsed.
</theme_item>
<theme_item name="arrow_collapsed" type="Texture2D">
The arrow icon used when a foldable item is collapsed.
The arrow icon used when a foldable item is collapsed (for left-to-right layouts).
</theme_item>
<theme_item name="arrow_collapsed_mirrored" type="Texture2D">
The arrow icon used when a foldable item is collapsed (for right-to-left layouts).
</theme_item>
<theme_item name="bg" type="StyleBox">
Default [StyleBox] for the [Tree], i.e. used when the control is not being focused.
@ -451,6 +527,9 @@
<theme_item name="font_color_selected" type="Color" default="Color( 1, 1, 1, 1 )">
Text [Color] used when the item is selected.
</theme_item>
<theme_item name="font_size" type="int">
Font size of the item's text.
</theme_item>
<theme_item name="guide_color" type="Color" default="Color( 0, 0, 0, 0.1 )">
[Color] of the guideline.
</theme_item>

View file

@ -54,6 +54,15 @@
Resets the color for the given column to default.
</description>
</method>
<method name="clear_opentype_features">
<return type="void">
</return>
<argument index="0" name="column" type="int">
</argument>
<description>
Removes all OpenType features.
</description>
</method>
<method name="deselect">
<return type="void">
</return>
@ -184,6 +193,15 @@
Returns the icon [Texture2D] region as [Rect2].
</description>
</method>
<method name="get_language" qualifiers="const">
<return type="String">
</return>
<argument index="0" name="column" type="int">
</argument>
<description>
Returns item's text language code.
</description>
</method>
<method name="get_metadata" qualifiers="const">
<return type="Variant">
</return>
@ -209,6 +227,17 @@
If [code]wrap[/code] is enabled, the method will wrap around to the first visible element in the tree when called on the last visible element, otherwise it returns [code]null[/code].
</description>
</method>
<method name="get_opentype_feature" qualifiers="const">
<return type="int">
</return>
<argument index="0" name="column" type="int">
</argument>
<argument index="1" name="tag" type="String">
</argument>
<description>
Returns OpenType feature [code]tag[/code] of the item's text.
</description>
</method>
<method name="get_parent">
<return type="TreeItem">
</return>
@ -249,6 +278,22 @@
<description>
</description>
</method>
<method name="get_structured_text_bidi_override" qualifiers="const">
<return type="int" enum="Control.StructuredTextParser">
</return>
<argument index="0" name="column" type="int">
</argument>
<description>
</description>
</method>
<method name="get_structured_text_bidi_override_options" qualifiers="const">
<return type="Array">
</return>
<argument index="0" name="column" type="int">
</argument>
<description>
</description>
</method>
<method name="get_suffix" qualifiers="const">
<return type="String">
</return>
@ -275,6 +320,15 @@
Returns the given column's text alignment.
</description>
</method>
<method name="get_text_direction" qualifiers="const">
<return type="int" enum="Control.TextDirection">
</return>
<argument index="0" name="column" type="int">
</argument>
<description>
Returns item's text base writing direction.
</description>
</method>
<method name="get_tooltip" qualifiers="const">
<return type="String">
</return>
@ -533,6 +587,17 @@
Sets the given column's icon's texture region.
</description>
</method>
<method name="set_language">
<return type="void">
</return>
<argument index="0" name="column" type="int">
</argument>
<argument index="1" name="language" type="String">
</argument>
<description>
Sets language code of item's text used for line-breaking and text shaping algorithms, if left empty current locale is used instead.
</description>
</method>
<method name="set_metadata">
<return type="void">
</return>
@ -543,6 +608,19 @@
<description>
</description>
</method>
<method name="set_opentype_feature">
<return type="void">
</return>
<argument index="0" name="column" type="int">
</argument>
<argument index="1" name="tag" type="String">
</argument>
<argument index="2" name="value" type="int">
</argument>
<description>
Sets OpenType feature [code]tag[/code] for the item's text.
</description>
</method>
<method name="set_range">
<return type="void">
</return>
@ -580,6 +658,26 @@
If [code]true[/code], the given column is selectable.
</description>
</method>
<method name="set_structured_text_bidi_override">
<return type="void">
</return>
<argument index="0" name="column" type="int">
</argument>
<argument index="1" name="parser" type="int" enum="Control.StructuredTextParser">
</argument>
<description>
</description>
</method>
<method name="set_structured_text_bidi_override_options">
<return type="void">
</return>
<argument index="0" name="column" type="int">
</argument>
<argument index="1" name="args" type="Array">
</argument>
<description>
</description>
</method>
<method name="set_suffix">
<return type="void">
</return>
@ -611,6 +709,17 @@
Sets the given column's text alignment. See [enum TextAlign] for possible values.
</description>
</method>
<method name="set_text_direction">
<return type="void">
</return>
<argument index="0" name="column" type="int">
</argument>
<argument index="1" name="direction" type="int" enum="Control.TextDirection">
</argument>
<description>
Sets item's text base writing direction.
</description>
</method>
<method name="set_tooltip">
<return type="void">
</return>

View file

@ -27,6 +27,13 @@
<description>
</description>
</method>
<method name="get_layout_direction" qualifiers="const">
<return type="int" enum="Window.LayoutDirection">
</return>
<description>
Returns layout direction and text writing direction.
</description>
</method>
<method name="get_real_size" qualifiers="const">
<return type="Vector2i">
</return>
@ -61,6 +68,18 @@
<argument index="1" name="type" type="StringName" default="&quot;&quot;">
</argument>
<description>
Returns the [Font] at [code]name[/code] if the theme has [code]type[/code].
</description>
</method>
<method name="get_theme_font_size" qualifiers="const">
<return type="int">
</return>
<argument index="0" name="name" type="StringName">
</argument>
<argument index="1" name="type" type="StringName" default="&quot;&quot;">
</argument>
<description>
Returns the font size at [code]name[/code] if the theme has [code]type[/code].
</description>
</method>
<method name="get_theme_icon" qualifiers="const">
@ -123,6 +142,20 @@
<argument index="1" name="type" type="StringName" default="&quot;&quot;">
</argument>
<description>
Returns [code]true[/code] if [Font] with [code]name[/code] is in [code]type[/code].
Returns [code]false[/code] if the theme does not have [code]type[/code].
</description>
</method>
<method name="has_theme_font_size" qualifiers="const">
<return type="bool">
</return>
<argument index="0" name="name" type="StringName">
</argument>
<argument index="1" name="type" type="StringName" default="&quot;&quot;">
</argument>
<description>
Returns [code]true[/code] if font size with [code]name[/code] is in [code]type[/code].
Returns [code]false[/code] if the theme does not have [code]type[/code].
</description>
</method>
<method name="has_theme_icon" qualifiers="const">
@ -157,6 +190,13 @@
<description>
</description>
</method>
<method name="is_layout_rtl" qualifiers="const">
<return type="bool">
</return>
<description>
Returns [code]true[/code] if layout is right-to-left.
</description>
</method>
<method name="is_maximize_allowed" qualifiers="const">
<return type="bool">
</return>
@ -249,6 +289,15 @@
<description>
</description>
</method>
<method name="set_layout_direction">
<return type="void">
</return>
<argument index="0" name="direction" type="int" enum="Window.LayoutDirection">
</argument>
<description>
Sets layout direction and text writing direction. Right-to-left layouts are necessary for certain languages (e.g. Arabic and Hebrew).
</description>
</method>
<method name="set_use_font_oversampling">
<return type="void">
</return>
@ -393,6 +442,18 @@
</constant>
<constant name="CONTENT_SCALE_ASPECT_EXPAND" value="4" enum="ContentScaleAspect">
</constant>
<constant name="LAYOUT_DIRECTION_INHERITED" value="0" enum="LayoutDirection">
Automatic layout direction, determined from the parent control layout direction.
</constant>
<constant name="LAYOUT_DIRECTION_LOCALE" value="1" enum="LayoutDirection">
Automatic layout direction, determined from the current locale.
</constant>
<constant name="LAYOUT_DIRECTION_LTR" value="2" enum="LayoutDirection">
Left-to-right layout direction.
</constant>
<constant name="LAYOUT_DIRECTION_RTL" value="3" enum="LayoutDirection">
Right-to-left layout direction.
</constant>
</constants>
<theme_items>
<theme_item name="close" type="Texture2D">

View file

@ -32,6 +32,7 @@
#include "editor/editor_node.h"
#include "editor_scale.h"
#include "scene/resources/text_line.h"
float AnimationBezierTrackEdit::_bezier_h_to_pixel(float p_h) {
float h = p_h;
@ -247,6 +248,7 @@ void AnimationBezierTrackEdit::_notification(int p_what) {
}
Ref<Font> font = get_theme_font("font", "Label");
int font_size = get_theme_font_size("font_size", "Label");
Color color = get_theme_color("font_color", "Label");
int hsep = get_theme_constant("hseparation", "ItemList");
int vsep = get_theme_constant("vseparation", "ItemList");
@ -286,26 +288,27 @@ void AnimationBezierTrackEdit::_notification(int p_what) {
String text;
int h = font->get_height();
if (node) {
int ofs = 0;
Ref<Texture2D> icon = EditorNode::get_singleton()->get_object_icon(node, "Node");
h = MAX(h, icon->get_height());
text = node->get_name();
ofs += hsep;
ofs += icon->get_width();
TextLine text_buf = TextLine(text, font, font_size);
text_buf.set_width(limit - ofs - hsep);
int h = MAX(text_buf.get_size().y, icon->get_height());
draw_texture(icon, Point2(ofs, vofs + int(h - icon->get_height()) / 2));
margin = icon->get_width();
text = node->get_name();
ofs += hsep;
ofs += icon->get_width();
Vector2 string_pos = Point2(ofs, vofs + (h - font->get_height()) / 2 + font->get_ascent());
Vector2 string_pos = Point2(ofs, vofs + (h - text_buf.get_size().y) / 2 + text_buf.get_line_ascent());
string_pos = string_pos.floor();
draw_string(font, string_pos, text, color, limit - ofs - hsep);
text_buf.draw(get_canvas_item(), string_pos, color);
vofs += h + vsep;
}
@ -327,7 +330,10 @@ void AnimationBezierTrackEdit::_notification(int p_what) {
path = path.replace_first(base_path, "");
Color cc = color;
Rect2 rect = Rect2(margin, vofs, limit - margin - hsep, font->get_height() + vsep);
TextLine text_buf = TextLine(path, font, font_size);
text_buf.set_width(limit - margin - hsep);
Rect2 rect = Rect2(margin, vofs, limit - margin - hsep, text_buf.get_size().y + vsep);
if (i != track) {
cc.a *= 0.7;
uint32_t hash = path.hash();
@ -338,7 +344,7 @@ void AnimationBezierTrackEdit::_notification(int p_what) {
Color subcolor;
subcolor.set_hsv(h, 0.2, 0.8);
subcolor.a = 0.5;
draw_rect(Rect2(0, vofs + font->get_height() * 0.1, margin - hsep, font->get_height() * 0.8), subcolor);
draw_rect(Rect2(0, vofs + text_buf.get_size().y * 0.1, margin - hsep, text_buf.get_size().y * 0.8), subcolor);
subtrack_colors[i] = subcolor;
subtracks[i] = rect;
@ -347,15 +353,17 @@ void AnimationBezierTrackEdit::_notification(int p_what) {
ac.a = 0.5;
draw_rect(rect, ac);
}
draw_string(font, Point2(margin, vofs + font->get_ascent()), path, cc, limit - margin - hsep);
vofs += font->get_height() + vsep;
Vector2 string_pos = Point2(margin, vofs + text_buf.get_line_ascent());
text_buf.draw(get_canvas_item(), string_pos, cc);
vofs += text_buf.get_size().y + vsep;
}
Color accent = get_theme_color("accent_color", "Editor");
{ //guides
float min_left_scale = font->get_height() + vsep;
float min_left_scale = font->get_height(font_size) + vsep;
float scale = (min_left_scale * 2) * v_zoom;
float step = Math::pow(10.0, Math::round(Math::log(scale / 5.0) / Math::log(10.0))) * 5.0;
@ -367,7 +375,7 @@ void AnimationBezierTrackEdit::_notification(int p_what) {
bool first = true;
int prev_iv = 0;
for (int i = font->get_height(); i < get_size().height; i++) {
for (int i = font->get_height(font_size); i < get_size().height; i++) {
float ofs = get_size().height / 2 - i;
ofs *= v_zoom;
ofs += v_scroll;
@ -382,7 +390,7 @@ void AnimationBezierTrackEdit::_notification(int p_what) {
draw_line(Point2(limit, i), Point2(right_limit, i), lc);
Color c = color;
c.a *= 0.5;
draw_string(font, Point2(limit + 8, i - 2), rtos(Math::stepify((iv + 1) * scale, step)), c);
draw_string(font, Point2(limit + 8, i - 2), TS->format_number(rtos(Math::stepify((iv + 1) * scale, step))), HALIGN_LEFT, -1, font_size, c);
}
first = false;
@ -453,8 +461,8 @@ void AnimationBezierTrackEdit::_notification(int p_what) {
ep.point_rect.size = bezier_icon->get_size();
if (selection.has(i)) {
draw_texture(selected_icon, ep.point_rect.position);
draw_string(font, ep.point_rect.position + Vector2(8, -font->get_height() - 4), TTR("Time:") + " " + rtos(Math::stepify(offset, 0.001)), accent);
draw_string(font, ep.point_rect.position + Vector2(8, -8), TTR("Value:") + " " + rtos(Math::stepify(value, 0.001)), accent);
draw_string(font, ep.point_rect.position + Vector2(8, -font->get_height(font_size) - 4), TTR("Time:") + " " + TS->format_number(rtos(Math::stepify(offset, 0.001))), HALIGN_LEFT, -1, font_size, accent);
draw_string(font, ep.point_rect.position + Vector2(8, -8), TTR("Value:") + " " + TS->format_number(rtos(Math::stepify(value, 0.001))), HALIGN_LEFT, -1, font_size, accent);
} else {
draw_texture(bezier_icon, ep.point_rect.position);
}

View file

@ -1397,6 +1397,7 @@ void AnimationTimelineEdit::_notification(int p_what) {
}
Ref<Font> font = get_theme_font("font", "Label");
int font_size = get_theme_font_size("font_size", "Label");
Color color = get_theme_color("font_color", "Label");
int zoomw = key_range;
@ -1488,10 +1489,10 @@ void AnimationTimelineEdit::_notification(int p_what) {
int decimals = 2;
bool step_found = false;
const int period_width = font->get_char_size('.').width;
int max_digit_width = font->get_char_size('0').width;
const int period_width = font->get_char_size('.', 0, font_size).width;
int max_digit_width = font->get_char_size('0', 0, font_size).width;
for (int i = 1; i <= 9; i++) {
const int digit_width = font->get_char_size('0' + i).width;
const int digit_width = font->get_char_size('0' + i, 0, font_size).width;
max_digit_width = MAX(digit_width, max_digit_width);
}
const int max_sc = int(Math::ceil(zoomw / scale));
@ -1538,8 +1539,8 @@ void AnimationTimelineEdit::_notification(int p_what) {
if (frame != prev_frame && i >= prev_frame_ofs) {
draw_line(Point2(get_name_limit() + i, 0), Point2(get_name_limit() + i, h), linecolor, Math::round(EDSCALE));
draw_string(font, Point2(get_name_limit() + i + 3 * EDSCALE, (h - font->get_height()) / 2 + font->get_ascent()).floor(), itos(frame), sub ? color_time_dec : color_time_sec, zoomw - i);
prev_frame_ofs = i + font->get_string_size(itos(frame)).x + 5 * EDSCALE;
draw_string(font, Point2(get_name_limit() + i + 3 * EDSCALE, (h - font->get_height(font_size)) / 2 + font->get_ascent(font_size)).floor(), itos(frame), HALIGN_LEFT, zoomw - i, font_size, sub ? color_time_dec : color_time_sec);
prev_frame_ofs = i + font->get_string_size(itos(frame), font_size).x + 5 * EDSCALE;
}
}
}
@ -1556,7 +1557,7 @@ void AnimationTimelineEdit::_notification(int p_what) {
if ((sc / step) != (prev_sc / step) || (prev_sc < 0 && sc >= 0)) {
int scd = sc < 0 ? prev_sc : sc;
draw_line(Point2(get_name_limit() + i, 0), Point2(get_name_limit() + i, h), linecolor, Math::round(EDSCALE));
draw_string(font, Point2(get_name_limit() + i + 3, (h - font->get_height()) / 2 + font->get_ascent()).floor(), String::num((scd - (scd % step)) / double(SC_ADJ), decimals), sub ? color_time_dec : color_time_sec, zoomw - i);
draw_string(font, Point2(get_name_limit() + i + 3, (h - font->get_height(font_size)) / 2 + font->get_ascent(font_size)).floor(), String::num((scd - (scd % step)) / double(SC_ADJ), decimals), HALIGN_LEFT, zoomw - i, font_size, sub ? color_time_dec : color_time_sec);
}
}
}
@ -1583,7 +1584,8 @@ void AnimationTimelineEdit::set_animation(const Ref<Animation> &p_animation) {
Size2 AnimationTimelineEdit::get_minimum_size() const {
Size2 ms = add_track->get_minimum_size();
Ref<Font> font = get_theme_font("font", "Label");
ms.height = MAX(ms.height, font->get_height());
int font_size = get_theme_font_size("font_size", "Label");
ms.height = MAX(ms.height, font->get_height(font_size));
ms.width = get_buttons_width() + add_track->get_minimum_size().width + get_theme_icon("Hsize", "EditorIcons")->get_width() + 2;
return ms;
}
@ -1798,6 +1800,8 @@ AnimationTimelineEdit::AnimationTimelineEdit() {
panning_timeline = false;
dragging_timeline = false;
dragging_hsize = false;
set_layout_direction(Control::LAYOUT_DIRECTION_LTR);
}
////////////////////////////////////
@ -1819,6 +1823,7 @@ void AnimationTrackEdit::_notification(int p_what) {
}
Ref<Font> font = get_theme_font("font", "Label");
int font_size = get_theme_font_size("font_size", "Label");
Color color = get_theme_color("font_color", "Label");
Ref<Texture2D> type_icons[6] = {
get_theme_icon("KeyValue", "EditorIcons"),
@ -1890,9 +1895,9 @@ void AnimationTrackEdit::_notification(int p_what) {
path_rect = Rect2(ofs, 0, limit - ofs - hsep, get_size().height);
Vector2 string_pos = Point2(ofs, (get_size().height - font->get_height()) / 2 + font->get_ascent());
Vector2 string_pos = Point2(ofs, (get_size().height - font->get_height(font_size)) / 2 + font->get_ascent(font_size));
string_pos = string_pos.floor();
draw_string(font, string_pos, text, text_color, limit - ofs - hsep);
draw_string(font, string_pos, text, HALIGN_LEFT, limit - ofs - hsep, font_size, text_color);
draw_line(Point2(limit, 0), Point2(limit, get_size().height), linecolor, Math::round(EDSCALE));
}
@ -2173,6 +2178,7 @@ void AnimationTrackEdit::draw_key(int p_index, float p_pixels_sec, int p_x, bool
if (animation->track_get_type(track) == Animation::TYPE_METHOD) {
Ref<Font> font = get_theme_font("font", "Label");
int font_size = get_theme_font_size("font_size", "Label");
Color color = get_theme_color("font_color", "Label");
color.a = 0.5;
@ -2197,7 +2203,7 @@ void AnimationTrackEdit::draw_key(int p_index, float p_pixels_sec, int p_x, bool
int limit = MAX(0, p_clip_right - p_x - icon_to_draw->get_width());
if (limit > 0) {
draw_string(font, Vector2(p_x + icon_to_draw->get_width(), int(get_size().height - font->get_height()) / 2 + font->get_ascent()), text, color, limit);
draw_string(font, Vector2(p_x + icon_to_draw->get_width(), int(get_size().height - font->get_height(font_size)) / 2 + font->get_ascent(font_size)), text, HALIGN_LEFT, limit, font_size, color);
}
}
@ -2302,9 +2308,10 @@ NodePath AnimationTrackEdit::get_path() const {
Size2 AnimationTrackEdit::get_minimum_size() const {
Ref<Texture2D> texture = get_theme_icon("Object", "EditorIcons");
Ref<Font> font = get_theme_font("font", "Label");
int font_size = get_theme_font_size("font_size", "Label");
int separation = get_theme_constant("vseparation", "ItemList");
int max_h = MAX(texture->get_height(), font->get_height());
int max_h = MAX(texture->get_height(), font->get_height(font_size));
max_h = MAX(max_h, get_key_height());
return Vector2(1, max_h + separation);
@ -3036,6 +3043,7 @@ AnimationTrackEdit *AnimationTrackEditPlugin::create_animation_track_edit(Object
void AnimationTrackEditGroup::_notification(int p_what) {
if (p_what == NOTIFICATION_DRAW) {
Ref<Font> font = get_theme_font("font", "Label");
int font_size = get_theme_font_size("font_size", "Label");
int separation = get_theme_constant("hseparation", "ItemList");
Color color = get_theme_color("font_color", "Label");
@ -3059,7 +3067,7 @@ void AnimationTrackEditGroup::_notification(int p_what) {
int ofs = 0;
draw_texture(icon, Point2(ofs, int(get_size().height - icon->get_height()) / 2));
ofs += separation + icon->get_width();
draw_string(font, Point2(ofs, int(get_size().height - font->get_height()) / 2 + font->get_ascent()), node_name, color, timeline->get_name_limit() - ofs);
draw_string(font, Point2(ofs, int(get_size().height - font->get_height(font_size)) / 2 + font->get_ascent(font_size)), node_name, HALIGN_LEFT, timeline->get_name_limit() - ofs, font_size, color);
int px = (-timeline->get_value() + timeline->get_play_position()) * timeline->get_zoom_scale() + timeline->get_name_limit();
@ -3080,9 +3088,10 @@ void AnimationTrackEditGroup::set_type_and_name(const Ref<Texture2D> &p_type, co
Size2 AnimationTrackEditGroup::get_minimum_size() const {
Ref<Font> font = get_theme_font("font", "Label");
int font_size = get_theme_font_size("font_size", "Label");
int separation = get_theme_constant("vseparation", "ItemList");
return Vector2(0, MAX(font->get_height(), icon->get_height()) + separation);
return Vector2(0, MAX(font->get_height(font_size), icon->get_height()) + separation);
}
void AnimationTrackEditGroup::set_timeline(AnimationTimelineEdit *p_timeline) {

View file

@ -37,6 +37,7 @@
#include "scene/2d/sprite_2d.h"
#include "scene/3d/sprite_3d.h"
#include "scene/animation/animation_player.h"
#include "scene/resources/text_line.h"
#include "servers/audio/audio_stream.h"
/// BOOL ///
@ -80,12 +81,14 @@ void AnimationTrackEditBool::draw_key(int p_index, float p_pixels_sec, int p_x,
int AnimationTrackEditColor::get_key_height() const {
Ref<Font> font = get_theme_font("font", "Label");
return font->get_height() * 0.8;
int font_size = get_theme_font_size("font_size", "Label");
return font->get_height(font_size) * 0.8;
}
Rect2 AnimationTrackEditColor::get_key_rect(int p_index, float p_pixels_sec) {
Ref<Font> font = get_theme_font("font", "Label");
int fh = font->get_height() * 0.8;
int font_size = get_theme_font_size("font_size", "Label");
int fh = font->get_height(font_size) * 0.8;
return Rect2(-fh / 2, 0, fh, get_size().height);
}
@ -95,7 +98,8 @@ bool AnimationTrackEditColor::is_key_selectable_by_distance() const {
void AnimationTrackEditColor::draw_key_link(int p_index, float p_pixels_sec, int p_x, int p_next_x, int p_clip_left, int p_clip_right) {
Ref<Font> font = get_theme_font("font", "Label");
int fh = (font->get_height() * 0.8);
int font_size = get_theme_font_size("font_size", "Label");
int fh = (font->get_height(font_size) * 0.8);
int x_from = p_x + fh / 2 - 1;
int x_to = p_next_x - fh / 2 + 1;
@ -144,7 +148,8 @@ void AnimationTrackEditColor::draw_key(int p_index, float p_pixels_sec, int p_x,
Color color = get_animation()->track_get_key_value(get_track(), p_index);
Ref<Font> font = get_theme_font("font", "Label");
int fh = font->get_height() * 0.8;
int font_size = get_theme_font_size("font_size", "Label");
int fh = font->get_height(font_size) * 0.8;
Rect2 rect(Vector2(p_x - fh / 2, int(get_size().height - fh) / 2), Size2(fh, fh));
@ -182,7 +187,8 @@ int AnimationTrackEditAudio::get_key_height() const {
}
Ref<Font> font = get_theme_font("font", "Label");
return int(font->get_height() * 1.5);
int font_size = get_theme_font_size("font_size", "Label");
return int(font->get_height(font_size) * 1.5);
}
Rect2 AnimationTrackEditAudio::get_key_rect(int p_index, float p_pixels_sec) {
@ -214,7 +220,8 @@ Rect2 AnimationTrackEditAudio::get_key_rect(int p_index, float p_pixels_sec) {
return Rect2(0, 0, len * p_pixels_sec, get_size().height);
} else {
Ref<Font> font = get_theme_font("font", "Label");
int fh = font->get_height() * 0.8;
int font_size = get_theme_font_size("font_size", "Label");
int fh = font->get_height(font_size) * 0.8;
return Rect2(0, 0, fh, get_size().height);
}
}
@ -277,7 +284,8 @@ void AnimationTrackEditAudio::draw_key(int p_index, float p_pixels_sec, int p_x,
}
Ref<Font> font = get_theme_font("font", "Label");
float fh = int(font->get_height() * 1.5);
int font_size = get_theme_font_size("font_size", "Label");
float fh = int(font->get_height(font_size) * 1.5);
Rect2 rect = Rect2(from_x, (get_size().height - fh) / 2, to_x - from_x, fh);
draw_rect(rect, Color(0.25, 0.25, 0.25));
@ -307,7 +315,8 @@ void AnimationTrackEditAudio::draw_key(int p_index, float p_pixels_sec, int p_x,
}
} else {
Ref<Font> font = get_theme_font("font", "Label");
int fh = font->get_height() * 0.8;
int font_size = get_theme_font_size("font_size", "Label");
int fh = font->get_height(font_size) * 0.8;
Rect2 rect(Vector2(p_x, int(get_size().height - fh) / 2), Size2(fh, fh));
Color color = get_theme_color("font_color", "Label");
@ -339,7 +348,8 @@ int AnimationTrackEditSpriteFrame::get_key_height() const {
}
Ref<Font> font = get_theme_font("font", "Label");
return int(font->get_height() * 2);
int font_size = get_theme_font_size("font_size", "Label");
return int(font->get_height(font_size) * 2);
}
Rect2 AnimationTrackEditSpriteFrame::get_key_rect(int p_index, float p_pixels_sec) {
@ -406,7 +416,8 @@ Rect2 AnimationTrackEditSpriteFrame::get_key_rect(int p_index, float p_pixels_se
size = size.floor();
Ref<Font> font = get_theme_font("font", "Label");
int height = int(font->get_height() * 2);
int font_size = get_theme_font_size("font_size", "Label");
int height = int(font->get_height(font_size) * 2);
int width = height * size.width / size.height;
return Rect2(0, 0, width, get_size().height);
@ -496,7 +507,8 @@ void AnimationTrackEditSpriteFrame::draw_key(int p_index, float p_pixels_sec, in
}
Ref<Font> font = get_theme_font("font", "Label");
int height = int(font->get_height() * 2);
int font_size = get_theme_font_size("font_size", "Label");
int height = int(font->get_height(font_size) * 2);
int width = height * region.size.width / region.size.height;
@ -539,7 +551,8 @@ int AnimationTrackEditSubAnim::get_key_height() const {
}
Ref<Font> font = get_theme_font("font", "Label");
return int(font->get_height() * 1.5);
int font_size = get_theme_font_size("font_size", "Label");
return int(font->get_height(font_size) * 1.5);
}
Rect2 AnimationTrackEditSubAnim::get_key_rect(int p_index, float p_pixels_sec) {
@ -567,7 +580,8 @@ Rect2 AnimationTrackEditSubAnim::get_key_rect(int p_index, float p_pixels_sec) {
return Rect2(0, 0, len * p_pixels_sec, get_size().height);
} else {
Ref<Font> font = get_theme_font("font", "Label");
int fh = font->get_height() * 0.8;
int font_size = get_theme_font_size("font_size", "Label");
int fh = font->get_height(font_size) * 0.8;
return Rect2(0, 0, fh, get_size().height);
}
}
@ -621,7 +635,8 @@ void AnimationTrackEditSubAnim::draw_key(int p_index, float p_pixels_sec, int p_
}
Ref<Font> font = get_theme_font("font", "Label");
int fh = font->get_height() * 1.5;
int font_size = get_theme_font_size("font_size", "Label");
int fh = font->get_height(font_size) * 1.5;
Rect2 rect(from_x, int(get_size().height - fh) / 2, to_x - from_x, fh);
@ -664,7 +679,7 @@ void AnimationTrackEditSubAnim::draw_key(int p_index, float p_pixels_sec, int p_
int limit = to_x - from_x - 4;
if (limit > 0) {
draw_string(font, Point2(from_x + 2, int(get_size().height - font->get_height()) / 2 + font->get_ascent()), anim, color);
draw_string(font, Point2(from_x + 2, int(get_size().height - font->get_height(font_size)) / 2 + font->get_ascent(font_size)), anim, HALIGN_LEFT, -1, font_size, color);
}
if (p_selected) {
@ -673,7 +688,8 @@ void AnimationTrackEditSubAnim::draw_key(int p_index, float p_pixels_sec, int p_
}
} else {
Ref<Font> font = get_theme_font("font", "Label");
int fh = font->get_height() * 0.8;
int font_size = get_theme_font_size("font_size", "Label");
int fh = font->get_height(font_size) * 0.8;
Rect2 rect(Vector2(p_x, int(get_size().height - fh) / 2), Size2(fh, fh));
Color color = get_theme_color("font_color", "Label");
@ -771,7 +787,8 @@ void AnimationTrackEditTypeAudio::_preview_changed(ObjectID p_which) {
int AnimationTrackEditTypeAudio::get_key_height() const {
Ref<Font> font = get_theme_font("font", "Label");
return int(font->get_height() * 1.5);
int font_size = get_theme_font_size("font_size", "Label");
return int(font->get_height(font_size) * 1.5);
}
Rect2 AnimationTrackEditTypeAudio::get_key_rect(int p_index, float p_pixels_sec) {
@ -835,7 +852,8 @@ void AnimationTrackEditTypeAudio::draw_key(int p_index, float p_pixels_sec, int
}
Ref<Font> font = get_theme_font("font", "Label");
float fh = int(font->get_height() * 1.5);
int font_size = get_theme_font_size("font_size", "Label");
float fh = int(font->get_height(font_size) * 1.5);
float len = stream->get_length();
@ -1104,7 +1122,8 @@ int AnimationTrackEditTypeAnimation::get_key_height() const {
}
Ref<Font> font = get_theme_font("font", "Label");
return int(font->get_height() * 1.5);
int font_size = get_theme_font_size("font_size", "Label");
return int(font->get_height(font_size) * 1.5);
}
Rect2 AnimationTrackEditTypeAnimation::get_key_rect(int p_index, float p_pixels_sec) {
@ -1132,7 +1151,8 @@ Rect2 AnimationTrackEditTypeAnimation::get_key_rect(int p_index, float p_pixels_
return Rect2(0, 0, len * p_pixels_sec, get_size().height);
} else {
Ref<Font> font = get_theme_font("font", "Label");
int fh = font->get_height() * 0.8;
int font_size = get_theme_font_size("font_size", "Label");
int fh = font->get_height(font_size) * 0.8;
return Rect2(0, 0, fh, get_size().height);
}
}
@ -1186,7 +1206,8 @@ void AnimationTrackEditTypeAnimation::draw_key(int p_index, float p_pixels_sec,
}
Ref<Font> font = get_theme_font("font", "Label");
int fh = font->get_height() * 1.5;
int font_size = get_theme_font_size("font_size", "Label");
int fh = font->get_height(font_size) * 1.5;
Rect2 rect(from_x, int(get_size().height - fh) / 2, to_x - from_x, fh);
@ -1229,7 +1250,7 @@ void AnimationTrackEditTypeAnimation::draw_key(int p_index, float p_pixels_sec,
int limit = to_x - from_x - 4;
if (limit > 0) {
draw_string(font, Point2(from_x + 2, int(get_size().height - font->get_height()) / 2 + font->get_ascent()), anim, color);
draw_string(font, Point2(from_x + 2, int(get_size().height - font->get_height(font_size)) / 2 + font->get_ascent(font_size)), anim, HALIGN_LEFT, -1, font_size, color);
}
if (p_selected) {
@ -1238,7 +1259,8 @@ void AnimationTrackEditTypeAnimation::draw_key(int p_index, float p_pixels_sec,
}
} else {
Ref<Font> font = get_theme_font("font", "Label");
int fh = font->get_height() * 0.8;
int font_size = get_theme_font_size("font_size", "Label");
int fh = font->get_height(font_size) * 0.8;
Rect2 rect(Vector2(p_x, int(get_size().height - fh) / 2), Size2(fh, fh));
Color color = get_theme_color("font_color", "Label");

View file

@ -38,7 +38,7 @@
#include "editor_settings.h"
#include "scene/gui/margin_container.h"
#include "scene/gui/separator.h"
#include "scene/resources/dynamic_font.h"
#include "scene/resources/font.h"
void GotoLineDialog::popup_find_line(CodeEdit *p_edit) {
text_editor = p_edit;
@ -731,17 +731,10 @@ void CodeTextEditor::_text_editor_gui_input(const Ref<InputEvent> &p_event) {
Ref<InputEventMagnifyGesture> magnify_gesture = p_event;
if (magnify_gesture.is_valid()) {
Ref<DynamicFont> font = text_editor->get_theme_font("font");
font_size = text_editor->get_theme_font_size("font_size");
font_size *= powf(magnify_gesture->get_factor(), 0.25);
if (font.is_valid()) {
if (font->get_size() != (int)font_size) {
font_size = font->get_size();
}
font_size *= powf(magnify_gesture->get_factor(), 0.25);
_add_font_size((int)font_size - font->get_size());
}
_add_font_size((int)font_size - text_editor->get_theme_font_size("font_size"));
return;
}
@ -779,12 +772,8 @@ void CodeTextEditor::_zoom_changed() {
}
void CodeTextEditor::_reset_zoom() {
Ref<DynamicFont> font = text_editor->get_theme_font("font"); // Reset source font size to default.
if (font.is_valid()) {
EditorSettings::get_singleton()->set("interface/editor/code_font_size", 14);
font->set_size(14);
}
EditorSettings::get_singleton()->set("interface/editor/code_font_size", 14);
text_editor->add_theme_font_size_override("font_size", 14 * EDSCALE);
}
void CodeTextEditor::_line_col_changed() {
@ -900,20 +889,15 @@ void CodeTextEditor::_font_resize_timeout() {
}
bool CodeTextEditor::_add_font_size(int p_delta) {
Ref<DynamicFont> font = text_editor->get_theme_font("font");
int old_size = text_editor->get_theme_font_size("font_size");
int new_size = CLAMP(old_size + p_delta, 8 * EDSCALE, 96 * EDSCALE);
if (font.is_valid()) {
int new_size = CLAMP(font->get_size() + p_delta, 8 * EDSCALE, 96 * EDSCALE);
if (new_size != font->get_size()) {
EditorSettings::get_singleton()->set("interface/editor/code_font_size", new_size / EDSCALE);
font->set_size(new_size);
}
return true;
} else {
return false;
if (new_size != old_size) {
EditorSettings::get_singleton()->set("interface/editor/code_font_size", new_size / EDSCALE);
text_editor->add_theme_font_size_override("font_size", new_size);
}
return true;
}
void CodeTextEditor::update_editor_settings() {
@ -1486,17 +1470,22 @@ void CodeTextEditor::goto_error() {
void CodeTextEditor::_update_font() {
text_editor->add_theme_font_override("font", get_theme_font("source", "EditorFonts"));
text_editor->add_theme_font_size_override("font_size", get_theme_font_size("source_size", "EditorFonts"));
error->add_theme_font_override("font", get_theme_font("status_source", "EditorFonts"));
error->add_theme_font_size_override("font_size", get_theme_font_size("status_source_size", "EditorFonts"));
error->add_theme_color_override("font_color", get_theme_color("error_color", "Editor"));
Ref<Font> status_bar_font = get_theme_font("status_source", "EditorFonts");
int status_bar_font_size = get_theme_font_size("status_source_size", "EditorFonts");
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("font", status_bar_font);
n->add_theme_font_size_override("font_size", status_bar_font_size);
}
}
}
@ -1506,6 +1495,31 @@ void CodeTextEditor::_on_settings_change() {
font_size = EditorSettings::get_singleton()->get("interface/editor/code_font_size");
int ot_mode = EditorSettings::get_singleton()->get("interface/editor/code_font_contextual_ligatures");
switch (ot_mode) {
case 1: { // Disable ligatures.
text_editor->clear_opentype_features();
text_editor->set_opentype_feature("calt", 0);
} break;
case 2: { // Custom.
text_editor->clear_opentype_features();
Vector<String> subtag = String(EditorSettings::get_singleton()->get("interface/editor/code_font_custom_opentype_features")).split(",");
Dictionary ftrs;
for (int i = 0; i < subtag.size(); i++) {
Vector<String> subtag_a = subtag[i].split("=");
if (subtag_a.size() == 2) {
text_editor->set_opentype_feature(subtag_a[0], subtag_a[1].to_int());
} else if (subtag_a.size() == 1) {
text_editor->set_opentype_feature(subtag_a[0], 1);
}
}
} break;
default: { // Default.
text_editor->clear_opentype_features();
text_editor->set_opentype_feature("calt", 1);
} break;
}
// Auto brace completion.
text_editor->set_auto_brace_completion(
EDITOR_GET("text_editor/completion/auto_brace_complete"));
@ -1547,7 +1561,11 @@ void CodeTextEditor::_set_show_warnings_panel(bool p_show) {
}
void CodeTextEditor::_toggle_scripts_pressed() {
toggle_scripts_button->set_icon(ScriptEditor::get_singleton()->toggle_scripts_panel() ? get_theme_icon("Back", "EditorIcons") : get_theme_icon("Forward", "EditorIcons"));
if (is_layout_rtl()) {
toggle_scripts_button->set_icon(ScriptEditor::get_singleton()->toggle_scripts_panel() ? get_theme_icon("Back", "EditorIcons") : get_theme_icon("Forward", "EditorIcons"));
} else {
toggle_scripts_button->set_icon(ScriptEditor::get_singleton()->toggle_scripts_panel() ? get_theme_icon("Forward", "EditorIcons") : get_theme_icon("Back", "EditorIcons"));
}
}
void CodeTextEditor::_error_pressed(const Ref<InputEvent> &p_event) {
@ -1668,7 +1686,11 @@ void CodeTextEditor::show_toggle_scripts_button() {
}
void CodeTextEditor::update_toggle_scripts_button() {
toggle_scripts_button->set_icon(ScriptEditor::get_singleton()->is_scripts_panel_toggled() ? get_theme_icon("Back", "EditorIcons") : get_theme_icon("Forward", "EditorIcons"));
if (is_layout_rtl()) {
toggle_scripts_button->set_icon(ScriptEditor::get_singleton()->is_scripts_panel_toggled() ? get_theme_icon("Back", "EditorIcons") : get_theme_icon("Forward", "EditorIcons"));
} else {
toggle_scripts_button->set_icon(ScriptEditor::get_singleton()->is_scripts_panel_toggled() ? get_theme_icon("Forward", "EditorIcons") : get_theme_icon("Back", "EditorIcons"));
}
toggle_scripts_button->set_tooltip(TTR("Toggle Scripts Panel") + " (" + ED_GET_SHORTCUT("script_editor/toggle_scripts_panel")->get_as_text() + ")");
}
@ -1682,6 +1704,31 @@ CodeTextEditor::CodeTextEditor() {
add_child(text_editor);
text_editor->set_v_size_flags(SIZE_EXPAND_FILL);
int ot_mode = EditorSettings::get_singleton()->get("interface/editor/code_font_contextual_ligatures");
switch (ot_mode) {
case 1: { // Disable ligatures.
text_editor->clear_opentype_features();
text_editor->set_opentype_feature("calt", 0);
} break;
case 2: { // Custom.
text_editor->clear_opentype_features();
Vector<String> subtag = String(EditorSettings::get_singleton()->get("interface/editor/code_font_custom_opentype_features")).split(",");
Dictionary ftrs;
for (int i = 0; i < subtag.size(); i++) {
Vector<String> subtag_a = subtag[i].split("=");
if (subtag_a.size() == 2) {
text_editor->set_opentype_feature(subtag_a[0], subtag_a[1].to_int());
} else if (subtag_a.size() == 1) {
text_editor->set_opentype_feature(subtag_a[0], 1);
}
}
} break;
default: { // Default.
text_editor->clear_opentype_features();
text_editor->set_opentype_feature("calt", 1);
} break;
}
// Added second so it opens at the bottom, so it won't shift the entire text editor when opening.
find_replace_bar = memnew(FindReplaceBar);
add_child(find_replace_bar);
@ -1750,6 +1797,7 @@ CodeTextEditor::CodeTextEditor() {
warning_count_label->set_tooltip(TTR("Warnings"));
warning_count_label->add_theme_color_override("font_color", EditorNode::get_singleton()->get_gui_base()->get_theme_color("warning_color", "Editor"));
warning_count_label->add_theme_font_override("font", EditorNode::get_singleton()->get_gui_base()->get_theme_font("status_source", "EditorFonts"));
warning_count_label->add_theme_font_size_override("font_size", EditorNode::get_singleton()->get_gui_base()->get_theme_font_size("status_source_size", "EditorFonts"));
warning_count_label->connect("gui_input", callable_mp(this, &CodeTextEditor::_warning_label_gui_input));
is_warnings_panel_opened = false;
@ -1760,6 +1808,7 @@ CodeTextEditor::CodeTextEditor() {
status_bar->add_child(line_and_col_txt);
line_and_col_txt->set_v_size_flags(SIZE_EXPAND | SIZE_SHRINK_CENTER);
line_and_col_txt->add_theme_font_override("font", EditorNode::get_singleton()->get_gui_base()->get_theme_font("status_source", "EditorFonts"));
line_and_col_txt->add_theme_font_size_override("font_size", EditorNode::get_singleton()->get_gui_base()->get_theme_font_size("status_source_size", "EditorFonts"));
line_and_col_txt->set_tooltip(TTR("Line and column numbers."));
line_and_col_txt->set_mouse_filter(MOUSE_FILTER_STOP);

View file

@ -82,10 +82,10 @@ String EditorPerformanceProfiler::_create_label(float p_value, Performance::Moni
return String::humanize_size(p_value);
}
case Performance::MONITOR_TYPE_TIME: {
return rtos(p_value * 1000).pad_decimals(2) + " ms";
return TS->format_number(rtos(p_value * 1000).pad_decimals(2)) + " " + RTR("ms");
}
default: {
return rtos(p_value);
return TS->format_number(rtos(p_value));
}
}
}
@ -111,6 +111,7 @@ void EditorPerformanceProfiler::_monitor_draw() {
Ref<StyleBox> graph_style_box = get_theme_stylebox("normal", "TextEdit");
Ref<Font> graph_font = get_theme_font("font", "TextEdit");
int font_size = get_theme_font_size("font_size", "TextEdit");
int columns = int(Math::ceil(Math::sqrt(float(active.size()))));
int rows = int(Math::ceil(float(active.size()) / float(columns)));
@ -131,19 +132,19 @@ void EditorPerformanceProfiler::_monitor_draw() {
rect.size -= graph_style_box->get_minimum_size();
Color draw_color = get_theme_color("accent_color", "Editor");
draw_color.set_hsv(Math::fmod(hue_shift * float(current.frame_index), 0.9f), draw_color.get_s() * 0.9f, draw_color.get_v() * value_multiplier, 0.6f);
monitor_draw->draw_string(graph_font, rect.position + Point2(0, graph_font->get_ascent()), current.item->get_text(0), draw_color, rect.size.x);
monitor_draw->draw_string(graph_font, rect.position + Point2(0, graph_font->get_ascent(font_size)), current.item->get_text(0), HALIGN_LEFT, rect.size.x, font_size, draw_color);
draw_color.a = 0.9f;
float value_position = rect.size.width - graph_font->get_string_size(current.item->get_text(1)).width;
float value_position = rect.size.width - graph_font->get_string_size(current.item->get_text(1), font_size).width;
if (value_position < 0) {
value_position = 0;
}
monitor_draw->draw_string(graph_font, rect.position + Point2(value_position, graph_font->get_ascent()), current.item->get_text(1), draw_color, rect.size.x);
monitor_draw->draw_string(graph_font, rect.position + Point2(value_position, graph_font->get_ascent(font_size)), current.item->get_text(1), HALIGN_LEFT, rect.size.x, font_size, draw_color);
rect.position.y += graph_font->get_height();
rect.size.height -= graph_font->get_height();
rect.position.y += graph_font->get_height(font_size);
rect.size.height -= graph_font->get_height(font_size);
int line_count = rect.size.height / (graph_font->get_height() * 2);
int line_count = rect.size.height / (graph_font->get_height(font_size) * 2);
if (line_count > 5) {
line_count = 5;
}
@ -151,12 +152,12 @@ void EditorPerformanceProfiler::_monitor_draw() {
Color horizontal_line_color;
horizontal_line_color.set_hsv(draw_color.get_h(), draw_color.get_s() * 0.5f, draw_color.get_v() * 0.5f, 0.3f);
monitor_draw->draw_line(rect.position, rect.position + Vector2(rect.size.width, 0), horizontal_line_color, Math::round(EDSCALE));
monitor_draw->draw_string(graph_font, rect.position + Vector2(0, graph_font->get_ascent()), _create_label(current.max, current.type), horizontal_line_color, rect.size.width);
monitor_draw->draw_string(graph_font, rect.position + Vector2(0, graph_font->get_ascent(font_size)), _create_label(current.max, current.type), HALIGN_LEFT, rect.size.width, font_size, horizontal_line_color);
for (int j = 0; j < line_count; j++) {
Vector2 y_offset = Vector2(0, rect.size.height * (1.0f - float(j) / float(line_count)));
monitor_draw->draw_line(rect.position + y_offset, rect.position + Vector2(rect.size.width, 0) + y_offset, horizontal_line_color, Math::round(EDSCALE));
monitor_draw->draw_string(graph_font, rect.position - Vector2(0, graph_font->get_descent()) + y_offset, _create_label(current.max * float(j) / float(line_count), current.type), horizontal_line_color, rect.size.width);
monitor_draw->draw_string(graph_font, rect.position - Vector2(0, graph_font->get_descent(font_size)) + y_offset, _create_label(current.max * float(j) / float(line_count), current.type), HALIGN_LEFT, rect.size.width, font_size, horizontal_line_color);
}
}
@ -182,7 +183,7 @@ void EditorPerformanceProfiler::_monitor_draw() {
monitor_draw->draw_line(rect.position + Point2(from, 0), rect.position + Point2(from, rect.size.y), line_color, Math::round(EDSCALE));
String label = _create_label(e->get(), current.type);
Size2 size = graph_font->get_string_size(label);
Size2 size = graph_font->get_string_size(label, font_size);
Vector2 text_top_left_position = Vector2(from, h2) - (size + Vector2(MARKER_MARGIN, MARKER_MARGIN));
if (text_top_left_position.x < 0) {
text_top_left_position.x = from + MARKER_MARGIN;
@ -190,7 +191,7 @@ void EditorPerformanceProfiler::_monitor_draw() {
if (text_top_left_position.y < 0) {
text_top_left_position.y = h2 + MARKER_MARGIN;
}
monitor_draw->draw_string(graph_font, rect.position + text_top_left_position + Point2(0, graph_font->get_ascent()), label, line_color, rect.size.x);
monitor_draw->draw_string(graph_font, rect.position + text_top_left_position + Point2(0, graph_font->get_ascent(font_size)), label, HALIGN_LEFT, rect.size.x, font_size, line_color);
}
prev = h2;
e = e->next();

View file

@ -103,19 +103,19 @@ static String _get_percent_txt(float p_value, float p_total) {
p_total = 0.00001;
}
return String::num((p_value / p_total) * 100, 1) + "%";
return TS->format_number(String::num((p_value / p_total) * 100, 1)) + TS->percent_sign();
}
String EditorProfiler::_get_time_as_text(const Metric &m, float p_time, int p_calls) {
const int dmode = display_mode->get_selected();
if (dmode == DISPLAY_FRAME_TIME) {
return rtos(p_time * 1000).pad_decimals(2) + " ms";
return TS->format_number(rtos(p_time * 1000).pad_decimals(2)) + " " + RTR("ms");
} else if (dmode == DISPLAY_AVERAGE_TIME) {
if (p_calls == 0) {
return "0.00 ms";
return TS->format_number("0.00") + " " + RTR("ms");
} else {
return rtos((p_time / p_calls) * 1000).pad_decimals(2) + " ms";
return TS->format_number(rtos((p_time / p_calls) * 1000).pad_decimals(2)) + " " + RTR("ms");
}
} else if (dmode == DISPLAY_FRAME_PERCENT) {
return _get_percent_txt(p_time, m.frame_time);
@ -423,7 +423,7 @@ void EditorProfiler::_clear_pressed() {
}
void EditorProfiler::_notification(int p_what) {
if (p_what == NOTIFICATION_ENTER_TREE) {
if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_LAYOUT_DIRECTION_CHANGED || p_what == NOTIFICATION_TRANSLATION_CHANGED) {
activate->set_icon(get_theme_icon("Play", "EditorIcons"));
clear_button->set_icon(get_theme_icon("Clear", "EditorIcons"));
}

View file

@ -114,9 +114,9 @@ String EditorVisualProfiler::_get_time_as_text(float p_time) {
int dmode = display_mode->get_selected();
if (dmode == DISPLAY_FRAME_TIME) {
return rtos(p_time) + "ms";
return TS->format_number(rtos(p_time)) + " " + RTR("ms");
} else if (dmode == DISPLAY_FRAME_PERCENT) {
return String::num(p_time * 100 / graph_limit, 2) + "%";
return TS->format_number(String::num(p_time * 100 / graph_limit, 2)) + " " + TS->percent_sign();
}
return "err";
@ -423,8 +423,12 @@ void EditorVisualProfiler::_clear_pressed() {
}
void EditorVisualProfiler::_notification(int p_what) {
if (p_what == NOTIFICATION_ENTER_TREE) {
activate->set_icon(get_theme_icon("Play", "EditorIcons"));
if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_LAYOUT_DIRECTION_CHANGED || p_what == NOTIFICATION_TRANSLATION_CHANGED) {
if (is_layout_rtl()) {
activate->set_icon(get_theme_icon("PlayBackwards", "EditorIcons"));
} else {
activate->set_icon(get_theme_icon("Play", "EditorIcons"));
}
clear_button->set_icon(get_theme_icon("Clear", "EditorIcons"));
}
}
@ -434,6 +438,7 @@ void EditorVisualProfiler::_graph_tex_draw() {
return;
}
Ref<Font> font = get_theme_font("font", "Label");
int font_size = get_theme_font_size("font_size", "Label");
if (seeking) {
int max_frames = frame_metrics.size();
int frame = cursor_metric_edit->get_value() - (frame_metrics[last_metric].frame_number - max_frames + 1);
@ -457,7 +462,7 @@ void EditorVisualProfiler::_graph_tex_draw() {
graph->draw_line(Vector2(0, frame_y), Vector2(half_width, frame_y), Color(1, 1, 1, 0.3));
String limit_str = String::num(graph_limit, 2);
graph->draw_string(font, Vector2(half_width - font->get_string_size(limit_str).x - 2, frame_y - 2), limit_str, Color(1, 1, 1, 0.6));
graph->draw_string(font, Vector2(half_width - font->get_string_size(limit_str, font_size).x - 2, frame_y - 2), limit_str, HALIGN_LEFT, -1, font_size, Color(1, 1, 1, 0.6));
}
if (graph_height_gpu > 0) {
@ -468,11 +473,11 @@ void EditorVisualProfiler::_graph_tex_draw() {
graph->draw_line(Vector2(half_width, frame_y), Vector2(graph->get_size().x, frame_y), Color(1, 1, 1, 0.3));
String limit_str = String::num(graph_limit, 2);
graph->draw_string(font, Vector2(half_width * 2 - font->get_string_size(limit_str).x - 2, frame_y - 2), limit_str, Color(1, 1, 1, 0.6));
graph->draw_string(font, Vector2(half_width * 2 - font->get_string_size(limit_str, font_size).x - 2, frame_y - 2), limit_str, HALIGN_LEFT, -1, font_size, Color(1, 1, 1, 0.6));
}
graph->draw_string(font, Vector2(font->get_string_size("X").x, font->get_ascent() + 2), "CPU:", Color(1, 1, 1, 0.8));
graph->draw_string(font, Vector2(font->get_string_size("X").x + graph->get_size().width / 2, font->get_ascent() + 2), "GPU:", Color(1, 1, 1, 0.8));
graph->draw_string(font, Vector2(font->get_string_size("X", font_size).x, font->get_ascent(font_size) + 2), "CPU:", HALIGN_LEFT, -1, font_size, Color(1, 1, 1, 0.8));
graph->draw_string(font, Vector2(font->get_string_size("X", font_size).x + graph->get_size().width / 2, font->get_ascent(font_size) + 2), "GPU:", HALIGN_LEFT, -1, font_size, Color(1, 1, 1, 0.8));
/*
if (hover_metric != -1 && frame_metrics[hover_metric].valid) {

View file

@ -523,6 +523,14 @@ void DocData::generate(bool p_basic_types) {
c.theme_properties.push_back(pd);
}
l.clear();
Theme::get_default()->get_font_size_list(cname, &l);
for (List<StringName>::Element *E = l.front(); E; E = E->next()) {
PropertyDoc pd;
pd.name = E->get();
pd.type = "int";
c.theme_properties.push_back(pd);
}
l.clear();
Theme::get_default()->get_stylebox_list(cname, &l);
for (List<StringName>::Element *E = l.front(); E; E = E->next()) {
PropertyDoc pd;

View file

@ -40,9 +40,12 @@
void EditorAbout::_theme_changed() {
Control *base = EditorNode::get_singleton()->get_gui_base();
Ref<Font> font = base->get_theme_font("source", "EditorFonts");
int font_size = base->get_theme_font_size("source_size", "EditorFonts");
_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(base->get_theme_icon("Logo", "EditorIcons"));
}
@ -213,7 +216,7 @@ EditorAbout::EditorAbout() {
for (int component_index = 0; component_index < COPYRIGHT_INFO_COUNT; component_index++) {
const ComponentCopyright &component = COPYRIGHT_INFO[component_index];
TreeItem *ti = _tpl_tree->create_item(tpl_ti_tp);
String component_name = component.name;
String component_name = String::utf8(component.name);
ti->set_text(0, component_name);
String text = component_name + "\n";
long_text += "- " + component_name + "\n";
@ -221,7 +224,7 @@ EditorAbout::EditorAbout() {
const ComponentCopyrightPart &part = component.parts[part_index];
text += "\n Files:";
for (int file_num = 0; file_num < part.file_count; file_num++) {
text += "\n " + String(part.files[file_num]);
text += "\n " + String::utf8(part.files[file_num]);
}
String copyright;
for (int copyright_index = 0; copyright_index < part.copyright_count; copyright_index++) {
@ -229,7 +232,7 @@ EditorAbout::EditorAbout() {
}
text += copyright;
long_text += copyright;
String license = "\n License: " + String(part.license) + "\n";
String license = "\n License: " + String::utf8(part.license) + "\n";
text += license;
long_text += license + "\n";
}
@ -237,10 +240,10 @@ EditorAbout::EditorAbout() {
}
for (int i = 0; i < LICENSE_COUNT; i++) {
TreeItem *ti = _tpl_tree->create_item(tpl_ti_lc);
String licensename = String(LICENSE_NAMES[i]);
String licensename = String::utf8(LICENSE_NAMES[i]);
ti->set_text(0, licensename);
long_text += "- " + licensename + "\n\n";
String licensebody = String(LICENSE_BODIES[i]);
String licensebody = String::utf8(LICENSE_BODIES[i]);
ti->set_metadata(0, licensebody);
long_text += " " + licensebody.replace("\n", "\n ") + "\n\n";
}

View file

@ -1379,14 +1379,15 @@ void EditorAudioMeterNotches::add_notch(float p_normalized_offset, float p_db_va
Size2 EditorAudioMeterNotches::get_minimum_size() const {
Ref<Font> font = get_theme_font("font", "Label");
float font_height = font->get_height();
int font_size = get_theme_font_size("font_size", "Label");
float font_height = font->get_height(font_size);
float width = 0;
float height = top_padding + btm_padding;
for (int i = 0; i < notches.size(); i++) {
if (notches[i].render_db_value) {
width = MAX(width, font->get_string_size(String::num(Math::abs(notches[i].db_value)) + "dB").x);
width = MAX(width, font->get_string_size(String::num(Math::abs(notches[i].db_value)) + "dB", font_size).x);
height += font_height;
}
}
@ -1413,7 +1414,8 @@ void EditorAudioMeterNotches::_notification(int p_what) {
void EditorAudioMeterNotches::_draw_audio_notches() {
Ref<Font> font = get_theme_font("font", "Label");
float font_height = font->get_height();
int font_size = get_theme_font_size("font_size", "Label");
float font_height = font->get_height(font_size);
for (int i = 0; i < notches.size(); i++) {
AudioNotch n = notches[i];
@ -1427,6 +1429,7 @@ void EditorAudioMeterNotches::_draw_audio_notches() {
Vector2(line_length + label_space,
(1.0f - n.relative_position) * (get_size().y - btm_padding - top_padding) + (font_height / 4) + top_padding),
String::num(Math::abs(n.db_value)) + "dB",
HALIGN_LEFT, -1, font_size,
notch_color);
}
}

View file

@ -398,7 +398,11 @@ Error EditorExportPlatform::_save_zip_file(void *p_userdata, const String &p_pat
Ref<ImageTexture> EditorExportPlatform::get_option_icon(int p_index) const {
Ref<Theme> theme = EditorNode::get_singleton()->get_editor_theme();
ERR_FAIL_COND_V(theme.is_null(), Ref<ImageTexture>());
return theme->get_icon("Play", "EditorIcons");
if (EditorNode::get_singleton()->get_viewport()->is_layout_rtl()) {
return theme->get_icon("PlayBackwards", "EditorIcons");
} else {
return theme->get_icon("Play", "EditorIcons");
}
}
String EditorExportPlatform::find_export_template(String template_file_name, String *err) const {
@ -972,6 +976,15 @@ Error EditorExportPlatform::export_project_files(const Ref<EditorExportPreset> &
p_func(p_udata, splash, array, idx, total, enc_in_filters, enc_ex_filters, key);
}
// Store text server data if exists.
if (TS->has_feature(TextServer::FEATURE_USE_SUPPORT_DATA)) {
String ts_data = "res://" + TS->get_support_data_filename();
if (FileAccess::exists(ts_data)) {
Vector<uint8_t> array = FileAccess::get_file_as_array(ts_data);
p_func(p_udata, ts_data, array, idx, total, enc_in_filters, enc_ex_filters, key);
}
}
String config_file = "project.binary";
String engine_cfb = EditorSettings::get_singleton()->get_cache_dir().plus_file("tmp" + config_file);
ProjectSettings::get_singleton()->save_custom(engine_cfb, custom_map, custom_list);

View file

@ -59,12 +59,17 @@ VBoxContainer *EditorFileDialog::get_vbox() {
}
void EditorFileDialog::_notification(int p_what) {
if (p_what == NOTIFICATION_READY || p_what == NOTIFICATION_THEME_CHANGED) {
if (p_what == NOTIFICATION_READY || p_what == NOTIFICATION_THEME_CHANGED || p_what == Control::NOTIFICATION_LAYOUT_DIRECTION_CHANGED || p_what == NOTIFICATION_TRANSLATION_CHANGED) {
// Update icons.
mode_thumbnails->set_icon(item_list->get_theme_icon("FileThumbnail", "EditorIcons"));
mode_list->set_icon(item_list->get_theme_icon("FileList", "EditorIcons"));
dir_prev->set_icon(item_list->get_theme_icon("Back", "EditorIcons"));
dir_next->set_icon(item_list->get_theme_icon("Forward", "EditorIcons"));
if (is_layout_rtl()) {
dir_prev->set_icon(item_list->get_theme_icon("Forward", "EditorIcons"));
dir_next->set_icon(item_list->get_theme_icon("Back", "EditorIcons"));
} else {
dir_prev->set_icon(item_list->get_theme_icon("Back", "EditorIcons"));
dir_next->set_icon(item_list->get_theme_icon("Forward", "EditorIcons"));
}
dir_up->set_icon(item_list->get_theme_icon("ArrowUp", "EditorIcons"));
refresh->set_icon(item_list->get_theme_icon("Reload", "EditorIcons"));
favorite->set_icon(item_list->get_theme_icon("Favorites", "EditorIcons"));
@ -97,8 +102,13 @@ void EditorFileDialog::_notification(int p_what) {
// Update icons.
mode_thumbnails->set_icon(item_list->get_theme_icon("FileThumbnail", "EditorIcons"));
mode_list->set_icon(item_list->get_theme_icon("FileList", "EditorIcons"));
dir_prev->set_icon(item_list->get_theme_icon("Back", "EditorIcons"));
dir_next->set_icon(item_list->get_theme_icon("Forward", "EditorIcons"));
if (is_layout_rtl()) {
dir_prev->set_icon(item_list->get_theme_icon("Forward", "EditorIcons"));
dir_next->set_icon(item_list->get_theme_icon("Back", "EditorIcons"));
} else {
dir_prev->set_icon(item_list->get_theme_icon("Back", "EditorIcons"));
dir_next->set_icon(item_list->get_theme_icon("Forward", "EditorIcons"));
}
dir_up->set_icon(item_list->get_theme_icon("ArrowUp", "EditorIcons"));
refresh->set_icon(item_list->get_theme_icon("Reload", "EditorIcons"));
favorite->set_icon(item_list->get_theme_icon("Favorites", "EditorIcons"));
@ -1486,6 +1496,7 @@ EditorFileDialog::EditorFileDialog() {
pathhb->add_child(drives_container);
dir = memnew(LineEdit);
dir->set_structured_text_bidi_override(Control::STRUCTURED_TEXT_FILE);
pathhb->add_child(dir);
dir->set_h_size_flags(Control::SIZE_EXPAND_FILL);
@ -1624,6 +1635,7 @@ EditorFileDialog::EditorFileDialog() {
file_box = memnew(HBoxContainer);
file_box->add_child(memnew(Label(TTR("File:"))));
file = memnew(LineEdit);
file->set_structured_text_bidi_override(Control::STRUCTURED_TEXT_FILE);
file->set_stretch_ratio(4);
file->set_h_size_flags(Control::SIZE_EXPAND_FILL);
file_box->add_child(file);
@ -1662,6 +1674,7 @@ EditorFileDialog::EditorFileDialog() {
makedialog->add_child(makevb);
makedirname = memnew(LineEdit);
makedirname->set_structured_text_bidi_override(Control::STRUCTURED_TEXT_FILE);
makevb->add_margin_child(TTR("Name:"), makedirname);
add_child(makedialog);
makedialog->register_text_enter(makedirname);

View file

@ -35,57 +35,61 @@
#include "editor_scale.h"
#include "editor_settings.h"
#include "scene/resources/default_theme/default_theme.h"
#include "scene/resources/dynamic_font.h"
#include "scene/resources/font.h"
#define MAKE_FALLBACKS(m_name) \
m_name->add_fallback(FontArabic); \
m_name->add_fallback(FontHebrew); \
m_name->add_fallback(FontThai); \
m_name->add_fallback(FontHindi); \
m_name->add_fallback(FontJapanese); \
m_name->add_fallback(FontFallback);
#define MAKE_FALLBACKS(m_name) \
m_name->add_data(FontArabic); \
m_name->add_data(FontBengali); \
m_name->add_data(FontGeorgian); \
m_name->add_data(FontMalayalam); \
m_name->add_data(FontOriya); \
m_name->add_data(FontSinhala); \
m_name->add_data(FontTamil); \
m_name->add_data(FontTelugu); \
m_name->add_data(FontHebrew); \
m_name->add_data(FontThai); \
m_name->add_data(FontHindi); \
m_name->add_data(FontJapanese); \
m_name->add_data(FontFallback);
// the custom spacings might only work with Noto Sans
#define MAKE_DEFAULT_FONT(m_name, m_size) \
Ref<DynamicFont> m_name; \
m_name.instance(); \
m_name->set_size(m_size); \
if (CustomFont.is_valid()) { \
m_name->set_font_data(CustomFont); \
m_name->add_fallback(DefaultFont); \
} else { \
m_name->set_font_data(DefaultFont); \
} \
m_name->set_spacing(DynamicFont::SPACING_TOP, -EDSCALE); \
m_name->set_spacing(DynamicFont::SPACING_BOTTOM, -EDSCALE); \
#define MAKE_DEFAULT_FONT(m_name) \
Ref<Font> m_name; \
m_name.instance(); \
if (CustomFont.is_valid()) { \
m_name->add_data(CustomFont); \
m_name->add_data(DefaultFont); \
} else { \
m_name->add_data(DefaultFont); \
} \
m_name->set_spacing(Font::SPACING_TOP, -EDSCALE); \
m_name->set_spacing(Font::SPACING_BOTTOM, -EDSCALE); \
MAKE_FALLBACKS(m_name);
#define MAKE_BOLD_FONT(m_name, m_size) \
Ref<DynamicFont> m_name; \
m_name.instance(); \
m_name->set_size(m_size); \
if (CustomFontBold.is_valid()) { \
m_name->set_font_data(CustomFontBold); \
m_name->add_fallback(DefaultFontBold); \
} else { \
m_name->set_font_data(DefaultFontBold); \
} \
m_name->set_spacing(DynamicFont::SPACING_TOP, -EDSCALE); \
m_name->set_spacing(DynamicFont::SPACING_BOTTOM, -EDSCALE); \
#define MAKE_BOLD_FONT(m_name) \
Ref<Font> m_name; \
m_name.instance(); \
if (CustomFontBold.is_valid()) { \
m_name->add_data(CustomFontBold); \
m_name->add_data(DefaultFontBold); \
} else { \
m_name->add_data(DefaultFontBold); \
} \
m_name->set_spacing(Font::SPACING_TOP, -EDSCALE); \
m_name->set_spacing(Font::SPACING_BOTTOM, -EDSCALE); \
MAKE_FALLBACKS(m_name);
#define MAKE_SOURCE_FONT(m_name, m_size) \
Ref<DynamicFont> m_name; \
m_name.instance(); \
m_name->set_size(m_size); \
if (CustomFontSource.is_valid()) { \
m_name->set_font_data(CustomFontSource); \
m_name->add_fallback(dfmono); \
} else { \
m_name->set_font_data(dfmono); \
} \
m_name->set_spacing(DynamicFont::SPACING_TOP, -EDSCALE); \
m_name->set_spacing(DynamicFont::SPACING_BOTTOM, -EDSCALE); \
#define MAKE_SOURCE_FONT(m_name) \
Ref<Font> m_name; \
m_name.instance(); \
if (CustomFontSource.is_valid()) { \
m_name->add_data(CustomFontSource); \
m_name->add_data(dfmono); \
} else { \
m_name->add_data(dfmono); \
} \
m_name->set_spacing(Font::SPACING_TOP, -EDSCALE); \
m_name->set_spacing(Font::SPACING_BOTTOM, -EDSCALE); \
MAKE_FALLBACKS(m_name);
void editor_register_fonts(Ref<Theme> p_theme) {
@ -96,7 +100,7 @@ void editor_register_fonts(Ref<Theme> p_theme) {
bool font_antialiased = (bool)EditorSettings::get_singleton()->get("interface/editor/font_antialiased");
int font_hinting_setting = (int)EditorSettings::get_singleton()->get("interface/editor/font_hinting");
DynamicFontData::Hinting font_hinting;
TextServer::Hinting font_hinting;
switch (font_hinting_setting) {
case 0:
// The "Auto" setting uses the setting that best matches the OS' font rendering:
@ -104,29 +108,31 @@ void editor_register_fonts(Ref<Theme> p_theme) {
// - Windows uses ClearType, which is in between "Light" and "Normal" hinting.
// - Linux has configurable font hinting, but most distributions including Ubuntu default to "Light".
#ifdef OSX_ENABLED
font_hinting = DynamicFontData::HINTING_NONE;
font_hinting = TextServer::HINTING_NONE;
#else
font_hinting = DynamicFontData::HINTING_LIGHT;
font_hinting = TextServer::HINTING_LIGHT;
#endif
break;
case 1:
font_hinting = DynamicFontData::HINTING_NONE;
font_hinting = TextServer::HINTING_NONE;
break;
case 2:
font_hinting = DynamicFontData::HINTING_LIGHT;
font_hinting = TextServer::HINTING_LIGHT;
break;
default:
font_hinting = DynamicFontData::HINTING_NORMAL;
font_hinting = TextServer::HINTING_NORMAL;
break;
}
int default_font_size = int(EDITOR_GET("interface/editor/main_font_size")) * EDSCALE;
String custom_font_path = EditorSettings::get_singleton()->get("interface/editor/main_font");
Ref<DynamicFontData> CustomFont;
Ref<FontData> CustomFont;
if (custom_font_path.length() > 0 && dir->file_exists(custom_font_path)) {
CustomFont.instance();
CustomFont->load_resource(custom_font_path, default_font_size);
CustomFont->set_antialiased(font_antialiased);
CustomFont->set_hinting(font_hinting);
CustomFont->set_font_path(custom_font_path);
CustomFont->set_force_autohinter(true); //just looks better..i think?
} else {
EditorSettings::get_singleton()->set_manually("interface/editor/main_font", "");
@ -135,12 +141,12 @@ void editor_register_fonts(Ref<Theme> p_theme) {
/* Custom Bold font */
String custom_font_path_bold = EditorSettings::get_singleton()->get("interface/editor/main_font_bold");
Ref<DynamicFontData> CustomFontBold;
Ref<FontData> CustomFontBold;
if (custom_font_path_bold.length() > 0 && dir->file_exists(custom_font_path_bold)) {
CustomFontBold.instance();
CustomFontBold->load_resource(custom_font_path_bold, default_font_size);
CustomFontBold->set_antialiased(font_antialiased);
CustomFontBold->set_hinting(font_hinting);
CustomFontBold->set_font_path(custom_font_path_bold);
CustomFontBold->set_force_autohinter(true); //just looks better..i think?
} else {
EditorSettings::get_singleton()->set_manually("interface/editor/main_font_bold", "");
@ -149,12 +155,12 @@ void editor_register_fonts(Ref<Theme> p_theme) {
/* Custom source code font */
String custom_font_path_source = EditorSettings::get_singleton()->get("interface/editor/code_font");
Ref<DynamicFontData> CustomFontSource;
Ref<FontData> CustomFontSource;
if (custom_font_path_source.length() > 0 && dir->file_exists(custom_font_path_source)) {
CustomFontSource.instance();
CustomFontSource->load_resource(custom_font_path_source, default_font_size);
CustomFontSource->set_antialiased(font_antialiased);
CustomFontSource->set_hinting(font_hinting);
CustomFontSource->set_font_path(custom_font_path_source);
} else {
EditorSettings::get_singleton()->set_manually("interface/editor/code_font", "");
}
@ -163,115 +169,167 @@ void editor_register_fonts(Ref<Theme> p_theme) {
/* Droid Sans */
Ref<DynamicFontData> DefaultFont;
Ref<FontData> DefaultFont;
DefaultFont.instance();
DefaultFont->load_memory(_font_NotoSansUI_Regular, _font_NotoSansUI_Regular_size, "ttf", default_font_size);
DefaultFont->set_antialiased(font_antialiased);
DefaultFont->set_hinting(font_hinting);
DefaultFont->set_font_ptr(_font_NotoSansUI_Regular, _font_NotoSansUI_Regular_size);
DefaultFont->set_force_autohinter(true); //just looks better..i think?
Ref<DynamicFontData> DefaultFontBold;
Ref<FontData> DefaultFontBold;
DefaultFontBold.instance();
DefaultFontBold->load_memory(_font_NotoSansUI_Bold, _font_NotoSansUI_Bold_size, "ttf", default_font_size);
DefaultFontBold->set_antialiased(font_antialiased);
DefaultFontBold->set_hinting(font_hinting);
DefaultFontBold->set_font_ptr(_font_NotoSansUI_Bold, _font_NotoSansUI_Bold_size);
DefaultFontBold->set_force_autohinter(true); // just looks better..i think?
Ref<DynamicFontData> FontFallback;
Ref<FontData> FontFallback;
FontFallback.instance();
FontFallback->load_memory(_font_DroidSansFallback, _font_DroidSansFallback_size, "ttf", default_font_size);
FontFallback->set_antialiased(font_antialiased);
FontFallback->set_hinting(font_hinting);
FontFallback->set_font_ptr(_font_DroidSansFallback, _font_DroidSansFallback_size);
FontFallback->set_force_autohinter(true); //just looks better..i think?
Ref<DynamicFontData> FontJapanese;
Ref<FontData> FontJapanese;
FontJapanese.instance();
FontJapanese->load_memory(_font_DroidSansJapanese, _font_DroidSansJapanese_size, "ttf", default_font_size);
FontJapanese->set_antialiased(font_antialiased);
FontJapanese->set_hinting(font_hinting);
FontJapanese->set_font_ptr(_font_DroidSansJapanese, _font_DroidSansJapanese_size);
FontJapanese->set_force_autohinter(true); //just looks better..i think?
Ref<DynamicFontData> FontArabic;
Ref<FontData> FontArabic;
FontArabic.instance();
FontArabic->load_memory(_font_NotoNaskhArabicUI_Regular, _font_NotoNaskhArabicUI_Regular_size, "ttf", default_font_size);
FontArabic->set_antialiased(font_antialiased);
FontArabic->set_hinting(font_hinting);
FontArabic->set_font_ptr(_font_NotoNaskhArabicUI_Regular, _font_NotoNaskhArabicUI_Regular_size);
FontArabic->set_force_autohinter(true); //just looks better..i think?
Ref<DynamicFontData> FontHebrew;
Ref<FontData> FontBengali;
FontBengali.instance();
FontBengali->load_memory(_font_NotoSansBengali_Regular, _font_NotoSansBengali_Regular_size, "ttf", default_font_size);
FontBengali->set_antialiased(font_antialiased);
FontBengali->set_hinting(font_hinting);
FontBengali->set_force_autohinter(true); //just looks better..i think?
Ref<FontData> FontGeorgian;
FontGeorgian.instance();
FontGeorgian->load_memory(_font_NotoSansGeorgian_Regular, _font_NotoSansGeorgian_Regular_size, "ttf", default_font_size);
FontGeorgian->set_antialiased(font_antialiased);
FontGeorgian->set_hinting(font_hinting);
FontGeorgian->set_force_autohinter(true); //just looks better..i think?
Ref<FontData> FontHebrew;
FontHebrew.instance();
FontHebrew->load_memory(_font_NotoSansHebrew_Regular, _font_NotoSansHebrew_Regular_size, "ttf", default_font_size);
FontHebrew->set_antialiased(font_antialiased);
FontHebrew->set_hinting(font_hinting);
FontHebrew->set_font_ptr(_font_NotoSansHebrew_Regular, _font_NotoSansHebrew_Regular_size);
FontHebrew->set_force_autohinter(true); //just looks better..i think?
Ref<DynamicFontData> FontThai;
Ref<FontData> FontMalayalam;
FontMalayalam.instance();
FontMalayalam->load_memory(_font_NotoSansMalayalamUI_Regular, _font_NotoSansMalayalamUI_Regular_size, "ttf", default_font_size);
FontMalayalam->set_antialiased(font_antialiased);
FontMalayalam->set_hinting(font_hinting);
FontMalayalam->set_force_autohinter(true); //just looks better..i think?
Ref<FontData> FontOriya;
FontOriya.instance();
FontOriya->load_memory(_font_NotoSansOriyaUI_Regular, _font_NotoSansOriyaUI_Regular_size, "ttf", default_font_size);
FontOriya->set_antialiased(font_antialiased);
FontOriya->set_hinting(font_hinting);
FontOriya->set_force_autohinter(true); //just looks better..i think?
Ref<FontData> FontSinhala;
FontSinhala.instance();
FontSinhala->load_memory(_font_NotoSansSinhalaUI_Regular, _font_NotoSansSinhalaUI_Regular_size, "ttf", default_font_size);
FontSinhala->set_antialiased(font_antialiased);
FontSinhala->set_hinting(font_hinting);
FontSinhala->set_force_autohinter(true); //just looks better..i think?
Ref<FontData> FontTamil;
FontTamil.instance();
FontTamil->load_memory(_font_NotoSansTamilUI_Regular, _font_NotoSansTamilUI_Regular_size, "ttf", default_font_size);
FontTamil->set_antialiased(font_antialiased);
FontTamil->set_hinting(font_hinting);
FontTamil->set_force_autohinter(true); //just looks better..i think?
Ref<FontData> FontTelugu;
FontTelugu.instance();
FontTelugu->load_memory(_font_NotoSansTeluguUI_Regular, _font_NotoSansTeluguUI_Regular_size, "ttf", default_font_size);
FontTelugu->set_antialiased(font_antialiased);
FontTelugu->set_hinting(font_hinting);
FontTelugu->set_force_autohinter(true); //just looks better..i think?
Ref<FontData> FontThai;
FontThai.instance();
FontThai->load_memory(_font_NotoSansThaiUI_Regular, _font_NotoSansThaiUI_Regular_size, "ttf", default_font_size);
FontThai->set_antialiased(font_antialiased);
FontThai->set_hinting(font_hinting);
FontThai->set_font_ptr(_font_NotoSansThaiUI_Regular, _font_NotoSansThaiUI_Regular_size);
FontThai->set_force_autohinter(true); //just looks better..i think?
Ref<DynamicFontData> FontHindi;
Ref<FontData> FontHindi;
FontHindi.instance();
FontHindi->load_memory(_font_NotoSansDevanagariUI_Regular, _font_NotoSansDevanagariUI_Regular_size, "ttf", default_font_size);
FontHindi->set_antialiased(font_antialiased);
FontHindi->set_hinting(font_hinting);
FontHindi->set_font_ptr(_font_NotoSansDevanagariUI_Regular, _font_NotoSansDevanagariUI_Regular_size);
FontHindi->set_force_autohinter(true); //just looks better..i think?
/* Hack */
Ref<DynamicFontData> dfmono;
Ref<FontData> dfmono;
dfmono.instance();
dfmono->load_memory(_font_Hack_Regular, _font_Hack_Regular_size, "ttf", default_font_size);
dfmono->set_antialiased(font_antialiased);
dfmono->set_hinting(font_hinting);
dfmono->set_font_ptr(_font_Hack_Regular, _font_Hack_Regular_size);
int default_font_size = int(EDITOR_GET("interface/editor/main_font_size")) * EDSCALE;
// Default font
MAKE_DEFAULT_FONT(df, default_font_size);
p_theme->set_default_font(df); // Default theme font
MAKE_DEFAULT_FONT(df);
p_theme->set_default_theme_font(df); // Default theme font
p_theme->set_default_theme_font_size(default_font_size);
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, default_font_size);
MAKE_BOLD_FONT(df_bold);
p_theme->set_font_size("bold_size", "EditorFonts", default_font_size);
p_theme->set_font("bold", "EditorFonts", df_bold);
// Title font
MAKE_BOLD_FONT(df_title, default_font_size + 2 * EDSCALE);
p_theme->set_font("title", "EditorFonts", df_title);
p_theme->set_font_size("title_size", "EditorFonts", default_font_size + 2 * EDSCALE);
p_theme->set_font("title", "EditorFonts", df_bold);
// Documentation fonts
MAKE_DEFAULT_FONT(df_doc, int(EDITOR_GET("text_editor/help/help_font_size")) * EDSCALE);
MAKE_BOLD_FONT(df_doc_bold, int(EDITOR_GET("text_editor/help/help_font_size")) * EDSCALE);
MAKE_BOLD_FONT(df_doc_title, int(EDITOR_GET("text_editor/help/help_title_font_size")) * EDSCALE);
MAKE_SOURCE_FONT(df_doc_code, int(EDITOR_GET("text_editor/help/help_source_font_size")) * EDSCALE);
MAKE_SOURCE_FONT(df_doc_kbd, (int(EDITOR_GET("text_editor/help/help_source_font_size")) - 1) * EDSCALE);
p_theme->set_font("doc", "EditorFonts", df_doc);
p_theme->set_font("doc_bold", "EditorFonts", df_doc_bold);
p_theme->set_font("doc_title", "EditorFonts", df_doc_title);
p_theme->set_font("doc_source", "EditorFonts", df_doc_code);
p_theme->set_font("doc_keyboard", "EditorFonts", df_doc_kbd);
MAKE_SOURCE_FONT(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
MAKE_DEFAULT_FONT(df_rulers, 8 * EDSCALE);
p_theme->set_font("rulers", "EditorFonts", df_rulers);
p_theme->set_font_size("rulers_size", "EditorFonts", 8 * EDSCALE);
p_theme->set_font("rulers", "EditorFonts", df);
// Rotation widget font
MAKE_DEFAULT_FONT(df_rotation_control, 14 * EDSCALE);
p_theme->set_font("rotation_control", "EditorFonts", df_rotation_control);
p_theme->set_font_size("rotation_control_size", "EditorFonts", 14 * EDSCALE);
p_theme->set_font("rotation_control", "EditorFonts", df);
// Code font
MAKE_SOURCE_FONT(df_code, int(EDITOR_GET("interface/editor/code_font_size")) * EDSCALE);
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);
MAKE_SOURCE_FONT(df_expression, (int(EDITOR_GET("interface/editor/code_font_size")) - 1) * EDSCALE);
p_theme->set_font("expression", "EditorFonts", df_expression);
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);
MAKE_SOURCE_FONT(df_output_code, int(EDITOR_GET("run/output/font_size")) * EDSCALE);
p_theme->set_font("output_source", "EditorFonts", df_output_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);
MAKE_SOURCE_FONT(df_text_editor_status_code, default_font_size);
p_theme->set_font("status_source", "EditorFonts", df_text_editor_status_code);
p_theme->set_font_size("status_source_size", "EditorFonts", default_font_size);
p_theme->set_font("status_source", "EditorFonts", df_code);
}

View file

@ -168,7 +168,8 @@ void EditorHelp::_class_desc_resized() {
// Add extra horizontal margins for better readability.
// The margins increase as the width of the editor help container increases.
Ref<Font> doc_code_font = get_theme_font("doc_source", "EditorFonts");
real_t char_width = doc_code_font->get_char_size('x').width;
int font_size = get_theme_font_size("doc_source_size", "EditorFonts");
real_t char_width = doc_code_font->get_char_size('x', 0, font_size).width;
const int display_margin = MAX(30 * EDSCALE, get_parent_anchorable_rect().size.width - char_width * 120 * EDSCALE) * 0.5;
Ref<StyleBox> class_desc_stylebox = EditorNode::get_singleton()->get_theme_base()->get_theme_stylebox("normal", "RichTextLabel")->duplicate();

View file

@ -41,7 +41,8 @@
Size2 EditorProperty::get_minimum_size() const {
Size2 ms;
Ref<Font> font = get_theme_font("font", "Tree");
ms.height = font->get_height();
int font_size = get_theme_font_size("font_size", "Tree");
ms.height = font->get_height(font_size);
for (int i = 0; i < get_child_count(); i++) {
Control *c = Object::cast_to<Control>(get_child(i));
@ -108,7 +109,8 @@ void EditorProperty::_notification(int p_what) {
{
int child_room = size.width * (1.0 - split_ratio);
Ref<Font> font = get_theme_font("font", "Tree");
int height = font->get_height();
int font_size = get_theme_font_size("font_size", "Tree");
int height = font->get_height(font_size);
bool no_children = true;
//compute room needed
@ -135,7 +137,11 @@ void EditorProperty::_notification(int p_what) {
rect = Rect2(size.width - 1, 0, 1, height);
} else {
text_size = MAX(0, size.width - (child_room + 4 * EDSCALE));
rect = Rect2(size.width - child_room, 0, child_room, height);
if (is_layout_rtl()) {
rect = Rect2(1, 0, child_room, height);
} else {
rect = Rect2(size.width - child_room, 0, child_room, height);
}
}
if (bottom_editor) {
@ -154,6 +160,9 @@ void EditorProperty::_notification(int p_what) {
}
rect.size.x -= key->get_width() + get_theme_constant("hseparator", "Tree");
if (is_layout_rtl()) {
rect.position.x += key->get_width() + get_theme_constant("hseparator", "Tree");
}
if (no_children) {
text_size -= key->get_width() + 4 * EDSCALE;
@ -167,6 +176,10 @@ void EditorProperty::_notification(int p_what) {
rect.size.x -= close->get_width() + get_theme_constant("hseparator", "Tree");
if (is_layout_rtl()) {
rect.position.x += close->get_width() + get_theme_constant("hseparator", "Tree");
}
if (no_children) {
text_size -= close->get_width() + 4 * EDSCALE;
}
@ -200,7 +213,9 @@ void EditorProperty::_notification(int p_what) {
if (p_what == NOTIFICATION_DRAW) {
Ref<Font> font = get_theme_font("font", "Tree");
int font_size = get_theme_font_size("font_size", "Tree");
Color dark_color = get_theme_color("dark_color_2", "Editor");
bool rtl = is_layout_rtl();
Size2 size = get_size();
if (bottom_editor) {
@ -249,7 +264,11 @@ void EditorProperty::_notification(int p_what) {
color2.b *= 1.2;
}
check_rect = Rect2(ofs, ((size.height - checkbox->get_height()) / 2), checkbox->get_width(), checkbox->get_height());
draw_texture(checkbox, check_rect.position, color2);
if (rtl) {
draw_texture(checkbox, Vector2(size.width - check_rect.position.x - checkbox->get_width(), check_rect.position.y), color2);
} else {
draw_texture(checkbox, check_rect.position, color2);
}
ofs += get_theme_constant("hseparator", "Tree") + checkbox->get_width() + get_theme_constant("hseparation", "CheckBox");
text_limit -= ofs;
} else {
@ -267,14 +286,21 @@ void EditorProperty::_notification(int p_what) {
color2.g *= 1.2;
color2.b *= 1.2;
}
draw_texture(reload_icon, revert_rect.position, color2);
if (rtl) {
draw_texture(reload_icon, Vector2(size.width - revert_rect.position.x - reload_icon->get_width(), revert_rect.position.y), color2);
} else {
draw_texture(reload_icon, revert_rect.position, color2);
}
} else {
revert_rect = Rect2();
}
int v_ofs = (size.height - font->get_height()) / 2;
draw_string(font, Point2(ofs, v_ofs + font->get_ascent()), label, color, text_limit);
int v_ofs = (size.height - font->get_height(font_size)) / 2;
if (rtl) {
draw_string(font, Point2(size.width - ofs - text_limit, v_ofs + font->get_ascent(font_size)), label, HALIGN_RIGHT, text_limit, font_size, color);
} else {
draw_string(font, Point2(ofs, v_ofs + font->get_ascent(font_size)), label, HALIGN_LEFT, text_limit, font_size, color);
}
if (keying) {
Ref<Texture2D> key;
@ -294,7 +320,12 @@ void EditorProperty::_notification(int p_what) {
color2.b *= 1.2;
}
keying_rect = Rect2(ofs, ((size.height - key->get_height()) / 2), key->get_width(), key->get_height());
draw_texture(key, keying_rect.position, color2);
if (rtl) {
draw_texture(key, Vector2(size.width - keying_rect.position.x - key->get_width(), keying_rect.position.y), color2);
} else {
draw_texture(key, keying_rect.position, color2);
}
} else {
keying_rect = Rect2();
}
@ -313,7 +344,11 @@ void EditorProperty::_notification(int p_what) {
color2.b *= 1.2;
}
delete_rect = Rect2(ofs, ((size.height - close->get_height()) / 2), close->get_width(), close->get_height());
draw_texture(close, delete_rect.position, color2);
if (rtl) {
draw_texture(close, Vector2(size.width - delete_rect.position.x - close->get_width(), delete_rect.position.y), color2);
} else {
draw_texture(close, delete_rect.position, color2);
}
} else {
delete_rect = Rect2();
}
@ -648,27 +683,31 @@ void EditorProperty::_gui_input(const Ref<InputEvent> &p_event) {
Ref<InputEventMouse> me = p_event;
if (me.is_valid()) {
Vector2 mpos = me->get_position();
if (is_layout_rtl()) {
mpos.x = get_size().x - mpos.x;
}
bool button_left = me->get_button_mask() & BUTTON_MASK_LEFT;
bool new_keying_hover = keying_rect.has_point(me->get_position()) && !button_left;
bool new_keying_hover = keying_rect.has_point(mpos) && !button_left;
if (new_keying_hover != keying_hover) {
keying_hover = new_keying_hover;
update();
}
bool new_delete_hover = delete_rect.has_point(me->get_position()) && !button_left;
bool new_delete_hover = delete_rect.has_point(mpos) && !button_left;
if (new_delete_hover != delete_hover) {
delete_hover = new_delete_hover;
update();
}
bool new_revert_hover = revert_rect.has_point(me->get_position()) && !button_left;
bool new_revert_hover = revert_rect.has_point(mpos) && !button_left;
if (new_revert_hover != revert_hover) {
revert_hover = new_revert_hover;
update();
}
bool new_check_hover = check_rect.has_point(me->get_position()) && !button_left;
bool new_check_hover = check_rect.has_point(mpos) && !button_left;
if (new_check_hover != check_hover) {
check_hover = new_check_hover;
update();
@ -678,13 +717,18 @@ void EditorProperty::_gui_input(const Ref<InputEvent> &p_event) {
Ref<InputEventMouseButton> mb = p_event;
if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) {
Vector2 mpos = mb->get_position();
if (is_layout_rtl()) {
mpos.x = get_size().x - mpos.x;
}
if (!selected && selectable) {
selected = true;
emit_signal("selected", property, -1);
update();
}
if (keying_rect.has_point(mb->get_position())) {
if (keying_rect.has_point(mpos)) {
emit_signal("property_keyed", property, use_keying_next());
if (use_keying_next()) {
@ -704,11 +748,11 @@ void EditorProperty::_gui_input(const Ref<InputEvent> &p_event) {
call_deferred("update_property");
}
}
if (delete_rect.has_point(mb->get_position())) {
if (delete_rect.has_point(mpos)) {
emit_signal("property_deleted", property);
}
if (revert_rect.has_point(mb->get_position())) {
if (revert_rect.has_point(mpos)) {
Variant vorig;
Node *node = Object::cast_to<Node>(object);
@ -744,7 +788,7 @@ void EditorProperty::_gui_input(const Ref<InputEvent> &p_event) {
return;
}
}
if (check_rect.has_point(mb->get_position())) {
if (check_rect.has_point(mpos)) {
checked = !checked;
update();
emit_signal("property_checked", property, checked);
@ -1024,10 +1068,11 @@ void EditorInspectorCategory::_notification(int p_what) {
if (p_what == NOTIFICATION_DRAW) {
draw_rect(Rect2(Vector2(), get_size()), bg_color);
Ref<Font> font = get_theme_font("font", "Tree");
int font_size = get_theme_font_size("font_size", "Tree");
int hs = get_theme_constant("hseparation", "Tree");
int w = font->get_string_size(label).width;
int w = font->get_string_size(label, font_size).width;
if (icon.is_valid()) {
w += hs + icon->get_width();
}
@ -1040,7 +1085,7 @@ void EditorInspectorCategory::_notification(int p_what) {
}
Color color = get_theme_color("font_color", "Tree");
draw_string(font, Point2(ofs, font->get_ascent() + (get_size().height - font->get_height()) / 2).floor(), label, color, get_size().width);
draw_string(font, Point2(ofs, font->get_ascent(font_size) + (get_size().height - font->get_height(font_size)) / 2).floor(), label, HALIGN_LEFT, get_size().width, font_size, color);
}
}
@ -1069,10 +1114,11 @@ Control *EditorInspectorCategory::make_custom_tooltip(const String &p_text) cons
Size2 EditorInspectorCategory::get_minimum_size() const {
Ref<Font> font = get_theme_font("font", "Tree");
int font_size = get_theme_font_size("font_size", "Tree");
Size2 ms;
ms.width = 1;
ms.height = font->get_height();
ms.height = font->get_height(font_size);
if (icon.is_valid()) {
ms.height = MAX(icon->get_height(), ms.height);
}
@ -1105,19 +1151,24 @@ void EditorInspectorSection::_test_unfold() {
void EditorInspectorSection::_notification(int p_what) {
if (p_what == NOTIFICATION_SORT_CHILDREN) {
Ref<Font> font = get_theme_font("font", "Tree");
int font_size = get_theme_font_size("font_size", "Tree");
Ref<Texture2D> arrow;
if (foldable) {
if (object->editor_is_section_unfolded(section)) {
arrow = get_theme_icon("arrow", "Tree");
} else {
arrow = get_theme_icon("arrow_collapsed", "Tree");
if (is_layout_rtl()) {
arrow = get_theme_icon("arrow_collapsed_mirrored", "Tree");
} else {
arrow = get_theme_icon("arrow_collapsed", "Tree");
}
}
}
Size2 size = get_size();
Point2 offset;
offset.y = font->get_height();
offset.y = font->get_height(font_size);
if (arrow.is_valid()) {
offset.y = MAX(offset.y, arrow->get_height());
}
@ -1148,18 +1199,20 @@ void EditorInspectorSection::_notification(int p_what) {
if (p_what == NOTIFICATION_DRAW) {
Ref<Texture2D> arrow;
bool rtl = is_layout_rtl();
if (foldable) {
if (object->editor_is_section_unfolded(section)) {
arrow = get_theme_icon("arrow", "Tree");
if (rtl) {
arrow = get_theme_icon("arrow_collapsed_mirrored", "Tree");
} else {
arrow = get_theme_icon("arrow_collapsed", "Tree");
}
}
Ref<Font> font = get_theme_font("font", "Tree");
int font_size = get_theme_font_size("font_size", "Tree");
int h = font->get_height();
int h = font->get_height(font_size);
if (arrow.is_valid()) {
h = MAX(h, arrow->get_height());
}
@ -1169,10 +1222,15 @@ void EditorInspectorSection::_notification(int p_what) {
const int arrow_margin = 3;
Color color = get_theme_color("font_color", "Tree");
draw_string(font, Point2(Math::round((16 + arrow_margin) * EDSCALE), font->get_ascent() + (h - font->get_height()) / 2).floor(), label, color, get_size().width);
float text_width = get_size().width - Math::round((16 + arrow_margin) * EDSCALE);
draw_string(font, Point2(rtl ? 0 : Math::round((16 + arrow_margin) * EDSCALE), font->get_ascent(font_size) + (h - font->get_height(font_size)) / 2).floor(), label, rtl ? HALIGN_RIGHT : HALIGN_LEFT, text_width, font_size, color);
if (arrow.is_valid()) {
draw_texture(arrow, Point2(Math::round(arrow_margin * EDSCALE), (h - arrow->get_height()) / 2).floor());
if (rtl) {
draw_texture(arrow, Point2(get_size().width - arrow->get_width() - Math::round(arrow_margin * EDSCALE), (h - arrow->get_height()) / 2).floor());
} else {
draw_texture(arrow, Point2(Math::round(arrow_margin * EDSCALE), (h - arrow->get_height()) / 2).floor());
}
}
if (dropping && !vbox->is_visible_in_tree()) {
@ -1237,7 +1295,8 @@ Size2 EditorInspectorSection::get_minimum_size() const {
}
Ref<Font> font = get_theme_font("font", "Tree");
ms.height += font->get_height() + get_theme_constant("vseparation", "Tree");
int font_size = get_theme_font_size("font_size", "Tree");
ms.height += font->get_height(font_size) + get_theme_constant("vseparation", "Tree");
ms.width += get_theme_constant("inspector_margin", "Editor");
return ms;
@ -1273,7 +1332,8 @@ void EditorInspectorSection::_gui_input(const Ref<InputEvent> &p_event) {
Ref<InputEventMouseButton> mb = p_event;
if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) {
Ref<Font> font = get_theme_font("font", "Tree");
if (mb->get_position().y > font->get_height()) { //clicked outside
int font_size = get_theme_font_size("font_size", "Tree");
if (mb->get_position().y > font->get_height(font_size)) { //clicked outside
return;
}

View file

@ -69,13 +69,13 @@ private:
Rect2 bottom_child_rect;
Rect2 keying_rect;
bool keying_hover;
bool keying_hover = false;
Rect2 revert_rect;
bool revert_hover;
bool revert_hover = false;
Rect2 check_rect;
bool check_hover;
bool check_hover = false;
Rect2 delete_rect;
bool delete_hover;
bool delete_hover = false;
bool can_revert;

View file

@ -35,7 +35,7 @@
#include "editor_node.h"
#include "editor_scale.h"
#include "scene/gui/center_container.h"
#include "scene/resources/dynamic_font.h"
#include "scene/resources/font.h"
void EditorLog::_error_handler(void *p_self, const char *p_func, const char *p_file, int p_line, const char *p_error, const char *p_errorexp, ErrorHandlerType p_type) {
EditorLog *self = (EditorLog *)p_self;
@ -61,12 +61,14 @@ void EditorLog::_notification(int p_what) {
if (p_what == NOTIFICATION_ENTER_TREE) {
//button->set_icon(get_icon("Console","EditorIcons"));
log->add_theme_font_override("normal_font", get_theme_font("output_source", "EditorFonts"));
log->add_theme_font_size_override("normal_font_size", get_theme_font_size("output_source_size", "EditorFonts"));
log->add_theme_color_override("selection_color", get_theme_color("accent_color", "Editor") * Color(1, 1, 1, 0.4));
} else if (p_what == NOTIFICATION_THEME_CHANGED) {
Ref<DynamicFont> df_output_code = get_theme_font("output_source", "EditorFonts");
Ref<Font> df_output_code = get_theme_font("output_source", "EditorFonts");
if (df_output_code.is_valid()) {
if (log != nullptr) {
log->add_theme_font_override("normal_font", get_theme_font("output_source", "EditorFonts"));
log->add_theme_font_size_override("normal_font_size", get_theme_font_size("output_source_size", "EditorFonts"));
log->add_theme_color_override("selection_color", get_theme_color("accent_color", "Editor") * Color(1, 1, 1, 0.4));
}
}

View file

@ -125,6 +125,7 @@
#include "editor/plugins/debugger_editor_plugin.h"
#include "editor/plugins/editor_debugger_plugin.h"
#include "editor/plugins/editor_preview_plugins.h"
#include "editor/plugins/font_editor_plugin.h"
#include "editor/plugins/gi_probe_editor_plugin.h"
#include "editor/plugins/gpu_particles_2d_editor_plugin.h"
#include "editor/plugins/gpu_particles_3d_editor_plugin.h"
@ -140,6 +141,7 @@
#include "editor/plugins/multimesh_editor_plugin.h"
#include "editor/plugins/navigation_polygon_editor_plugin.h"
#include "editor/plugins/node_3d_editor_plugin.h"
#include "editor/plugins/ot_features_plugin.h"
#include "editor/plugins/packed_scene_translation_parser_plugin.h"
#include "editor/plugins/path_2d_editor_plugin.h"
#include "editor/plugins/path_3d_editor_plugin.h"
@ -336,7 +338,11 @@ void EditorNode::_update_scene_tabs() {
if (scene_tabs->get_offset_buttons_visible()) {
// move add button to fixed position on the tabbar
if (scene_tab_add->get_parent() == scene_tabs) {
scene_tab_add->set_position(Point2(0, 0));
if (scene_tabs->is_layout_rtl()) {
scene_tab_add->set_position(Point2(tabbar_container->get_size().x - scene_tab_add->get_size().x, 0));
} else {
scene_tab_add->set_position(Point2(0, 0));
}
scene_tabs->remove_child(scene_tab_add);
tabbar_container->add_child(scene_tab_add);
tabbar_container->move_child(scene_tab_add, 1);
@ -351,7 +357,11 @@ void EditorNode::_update_scene_tabs() {
if (scene_tabs->get_tab_count() != 0) {
last_tab = scene_tabs->get_tab_rect(scene_tabs->get_tab_count() - 1);
}
scene_tab_add->set_position(Point2(last_tab.get_position().x + last_tab.get_size().x + 3, last_tab.get_position().y));
if (scene_tabs->is_layout_rtl()) {
scene_tab_add->set_position(Point2(last_tab.get_position().x - scene_tab_add->get_size().x - 3, last_tab.get_position().y));
} else {
scene_tab_add->set_position(Point2(last_tab.get_position().x + last_tab.get_size().x + 3, last_tab.get_position().y));
}
}
}
@ -652,8 +662,13 @@ void EditorNode::_notification(int p_what) {
bottom_panel_raise->set_icon(gui_base->get_theme_icon("ExpandBottomDock", "EditorIcons"));
// clear_button->set_icon(gui_base->get_icon("Close", "EditorIcons")); don't have access to that node. needs to become a class property
dock_tab_move_left->set_icon(theme->get_icon("Back", "EditorIcons"));
dock_tab_move_right->set_icon(theme->get_icon("Forward", "EditorIcons"));
if (gui_base->is_layout_rtl()) {
dock_tab_move_left->set_icon(theme->get_icon("Forward", "EditorIcons"));
dock_tab_move_right->set_icon(theme->get_icon("Back", "EditorIcons"));
} else {
dock_tab_move_left->set_icon(theme->get_icon("Back", "EditorIcons"));
dock_tab_move_right->set_icon(theme->get_icon("Forward", "EditorIcons"));
}
PopupMenu *p = help_menu->get_popup();
p->set_item_icon(p->get_item_index(HELP_SEARCH), gui_base->get_theme_icon("HelpSearch", "EditorIcons"));
@ -5883,7 +5898,11 @@ EditorNode::EditorNode() {
HBoxContainer *dock_hb = memnew(HBoxContainer);
dock_tab_move_left = memnew(Button);
dock_tab_move_left->set_flat(true);
dock_tab_move_left->set_icon(theme->get_icon("Back", "EditorIcons"));
if (gui_base->is_layout_rtl()) {
dock_tab_move_left->set_icon(theme->get_icon("Forward", "EditorIcons"));
} else {
dock_tab_move_left->set_icon(theme->get_icon("Back", "EditorIcons"));
}
dock_tab_move_left->set_focus_mode(Control::FOCUS_NONE);
dock_tab_move_left->connect("pressed", callable_mp(this, &EditorNode::_dock_move_left));
dock_hb->add_child(dock_tab_move_left);
@ -5896,7 +5915,11 @@ EditorNode::EditorNode() {
dock_tab_move_right = memnew(Button);
dock_tab_move_right->set_flat(true);
dock_tab_move_right->set_icon(theme->get_icon("Forward", "EditorIcons"));
if (gui_base->is_layout_rtl()) {
dock_tab_move_right->set_icon(theme->get_icon("Forward", "EditorIcons"));
} else {
dock_tab_move_right->set_icon(theme->get_icon("Back", "EditorIcons"));
}
dock_tab_move_right->set_focus_mode(Control::FOCUS_NONE);
dock_tab_move_right->connect("pressed", callable_mp(this, &EditorNode::_dock_move_right));
@ -6354,6 +6377,7 @@ EditorNode::EditorNode() {
video_driver->set_focus_mode(Control::FOCUS_NONE);
video_driver->connect("item_selected", callable_mp(this, &EditorNode::_video_driver_selected));
video_driver->add_theme_font_override("font", gui_base->get_theme_font("bold", "EditorFonts"));
video_driver->add_theme_font_size_override("font_size", gui_base->get_theme_font_size("bold_size", "EditorFonts"));
// TODO re-enable when GLES2 is ported
video_driver->set_disabled(true);
right_menu_hb->add_child(video_driver);
@ -6653,6 +6677,8 @@ EditorNode::EditorNode() {
add_editor_plugin(memnew(GradientEditorPlugin(this)));
add_editor_plugin(memnew(CollisionShape2DEditorPlugin(this)));
add_editor_plugin(memnew(CurveEditorPlugin(this)));
add_editor_plugin(memnew(FontEditorPlugin(this)));
add_editor_plugin(memnew(OpenTypeFeaturesEditorPlugin(this)));
add_editor_plugin(memnew(TextureEditorPlugin(this)));
add_editor_plugin(memnew(TextureLayeredEditorPlugin(this)));
add_editor_plugin(memnew(Texture3DEditorPlugin(this)));

View file

@ -36,7 +36,7 @@
#include "editor_properties_array_dict.h"
#include "editor_scale.h"
#include "scene/main/window.h"
#include "scene/resources/dynamic_font.h"
#include "scene/resources/font.h"
///////////////////// NULL /////////////////////////
@ -146,7 +146,8 @@ void EditorPropertyMultilineText::_notification(int p_what) {
Ref<Texture2D> df = get_theme_icon("DistractionFree", "EditorIcons");
open_big_text->set_icon(df);
Ref<Font> font = get_theme_font("font", "Label");
text->set_custom_minimum_size(Vector2(0, font->get_height() * 6));
int font_size = get_theme_font_size("font_size", "Label");
text->set_custom_minimum_size(Vector2(0, font->get_height(font_size) * 6));
} break;
}
@ -290,6 +291,7 @@ EditorPropertyPath::EditorPropertyPath() {
HBoxContainer *path_hb = memnew(HBoxContainer);
add_child(path_hb);
path = memnew(LineEdit);
path->set_structured_text_bidi_override(Control::STRUCTURED_TEXT_FILE);
path_hb->add_child(path);
path->connect("text_entered", callable_mp(this, &EditorPropertyPath::_path_selected));
path->connect("focus_exited", callable_mp(this, &EditorPropertyPath::_path_focus_exited));
@ -587,7 +589,8 @@ public:
virtual Size2 get_minimum_size() const override {
Ref<Font> font = get_theme_font("font", "Label");
return Vector2(0, font->get_height() * 2);
int font_size = get_theme_font_size("font_size", "Label");
return Vector2(0, font->get_height(font_size) * 2);
}
virtual String get_tooltip(const Point2 &p_pos) const override {
@ -985,6 +988,7 @@ void EditorPropertyEasing::_draw_easing() {
const float exp = get_edited_object()->get(get_edited_property());
const Ref<Font> f = get_theme_font("font", "Label");
int font_size = get_theme_font_size("font_size", "Label");
const Color font_color = get_theme_color("font_color", "Label");
Color line_color;
if (dragging) {
@ -1022,7 +1026,7 @@ void EditorPropertyEasing::_draw_easing() {
} else {
decimals = 1;
}
f->draw(ci, Point2(10, 10 + f->get_ascent()), rtos(exp).pad_decimals(decimals), font_color);
f->draw_string(ci, Point2(10, 10 + f->get_ascent(font_size)), TS->format_number(rtos(exp).pad_decimals(decimals)), HALIGN_LEFT, -1, font_size, font_color);
}
void EditorPropertyEasing::update_property() {
@ -1039,7 +1043,7 @@ void EditorPropertyEasing::_set_preset(int p_preset) {
void EditorPropertyEasing::_setup_spin() {
setting = true;
spin->setup_and_show();
spin->get_line_edit()->set_text(rtos(get_edited_object()->get(get_edited_property())));
spin->get_line_edit()->set_text(TS->format_number(rtos(get_edited_object()->get(get_edited_property()))));
setting = false;
spin->show();
}
@ -1088,7 +1092,7 @@ void EditorPropertyEasing::_notification(int p_what) {
preset->add_icon_item(get_theme_icon("CurveInOut", "EditorIcons"), "In-Out", EASING_IN_OUT);
preset->add_icon_item(get_theme_icon("CurveOutIn", "EditorIcons"), "Out-In", EASING_OUT_IN);
}
easing_draw->set_custom_minimum_size(Size2(0, get_theme_font("font", "Label")->get_height() * 2));
easing_draw->set_custom_minimum_size(Size2(0, get_theme_font("font", "Label")->get_height(get_theme_font_size("font_size", "Label")) * 2));
} break;
}
}
@ -3016,7 +3020,7 @@ bool EditorPropertyResource::_is_drop_valid(const Dictionary &p_drag_data) const
} else if (at == "ShaderMaterial") {
allowed_types.append("Shader");
} else if (at == "Font") {
allowed_types.append("DynamicFontData");
allowed_types.append("FontData");
}
}
@ -3115,9 +3119,9 @@ void EditorPropertyResource::drop_data_fw(const Point2 &p_point, const Variant &
break;
}
if (at == "Font" && ClassDB::is_parent_class(res->get_class(), "DynamicFontData")) {
Ref<DynamicFont> font = memnew(DynamicFont);
font->set_font_data(res);
if (at == "Font" && ClassDB::is_parent_class(res->get_class(), "FontData")) {
Ref<Font> font = memnew(Font);
font->add_data(res);
res = font;
break;
}

View file

@ -262,13 +262,30 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) {
String host_lang = OS::get_singleton()->get_locale();
host_lang = TranslationServer::standardize_locale(host_lang);
// Some locales are not properly supported currently in Godot due to lack of font shaping
// (e.g. Arabic or Hindi), so even though we have work in progress translations for them,
// we skip them as they don't render properly. (GH-28577)
const Vector<String> locales_to_skip = String("ar,bn,fa,he,hi,ml,si,ta,te,ur").split(",");
// Skip locales if Text server lack required features.
Vector<String> locales_to_skip;
if (!TS->has_feature(TextServer::FEATURE_BIDI_LAYOUT) || !TS->has_feature(TextServer::FEATURE_SHAPING)) {
locales_to_skip.push_back("ar"); // Arabic
locales_to_skip.push_back("fa"); // Persian
locales_to_skip.push_back("ur"); // Urdu
}
if (!TS->has_feature(TextServer::FEATURE_BIDI_LAYOUT)) {
locales_to_skip.push_back("he"); // Hebrew
}
if (!TS->has_feature(TextServer::FEATURE_SHAPING)) {
locales_to_skip.push_back("bn"); // Bengali
locales_to_skip.push_back("hi"); // Hindi
locales_to_skip.push_back("ml"); // Malayalam
locales_to_skip.push_back("si"); // Sinhala
locales_to_skip.push_back("ta"); // Tamil
locales_to_skip.push_back("te"); // Telugu
}
if (!locales_to_skip.empty()) {
WARN_PRINT("Some locales are not properly supported by selected Text Server and are disabled.");
}
String best;
EditorTranslationList *etl = _editor_translations;
while (etl->data) {
@ -316,6 +333,9 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) {
hints["interface/editor/main_font_size"] = PropertyInfo(Variant::INT, "interface/editor/main_font_size", PROPERTY_HINT_RANGE, "8,48,1", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_RESTART_IF_CHANGED);
_initial_set("interface/editor/code_font_size", 14);
hints["interface/editor/code_font_size"] = PropertyInfo(Variant::INT, "interface/editor/code_font_size", PROPERTY_HINT_RANGE, "8,48,1", PROPERTY_USAGE_DEFAULT);
_initial_set("interface/editor/code_font_contextual_ligatures", 0);
hints["interface/editor/code_font_contextual_ligatures"] = PropertyInfo(Variant::INT, "interface/editor/code_font_contextual_ligatures", PROPERTY_HINT_ENUM, "Default,Disable contextual alternates (coding ligatures),Use custom OpenType feature set", PROPERTY_USAGE_DEFAULT);
_initial_set("interface/editor/code_font_custom_opentype_features", "");
_initial_set("interface/editor/font_antialiased", true);
_initial_set("interface/editor/font_hinting", 0);
hints["interface/editor/font_hinting"] = PropertyInfo(Variant::INT, "interface/editor/font_hinting", PROPERTY_HINT_ENUM, "Auto,None,Light,Normal", PROPERTY_USAGE_DEFAULT);

View file

@ -37,13 +37,13 @@
String EditorSpinSlider::get_tooltip(const Point2 &p_pos) const {
if (grabber->is_visible()) {
return rtos(get_value()) + "\n\n" + TTR("Hold Ctrl to round to integers. Hold Shift for more precise changes.");
return TS->format_number(rtos(get_value())) + "\n\n" + TTR("Hold Ctrl to round to integers. Hold Shift for more precise changes.");
}
return rtos(get_value());
return TS->format_number(rtos(get_value()));
}
String EditorSpinSlider::get_text_value() const {
return String::num(get_value(), Math::range_step_decimals(get_step()));
return TS->format_number(String::num(get_value(), Math::range_step_decimals(get_step())));
}
void EditorSpinSlider::_gui_input(const Ref<InputEvent> &p_event) {
@ -214,10 +214,11 @@ void EditorSpinSlider::_notification(int p_what) {
draw_style_box(sb, Rect2(Vector2(), get_size()));
}
Ref<Font> font = get_theme_font("font", "LineEdit");
int font_size = get_theme_font_size("font_size", "LineEdit");
int sep_base = 4 * EDSCALE;
int sep = sep_base + sb->get_offset().x; //make it have the same margin on both sides, looks better
int string_width = font->get_string_size(label).width;
int string_width = font->get_string_size(label, font_size).width;
int number_width = get_size().width - sb->get_minimum_size().width - string_width - sep;
Ref<Texture2D> updown = get_theme_icon("updown", "SpinBox");
@ -228,7 +229,7 @@ void EditorSpinSlider::_notification(int p_what) {
String numstr = get_text_value();
int vofs = (get_size().height - font->get_height()) / 2 + font->get_ascent();
int vofs = (get_size().height - font->get_height(font_size)) / 2 + font->get_ascent(font_size);
Color fc = get_theme_color("font_color", "LineEdit");
Color lc;
@ -248,9 +249,9 @@ void EditorSpinSlider::_notification(int p_what) {
draw_style_box(focus, Rect2(Vector2(), get_size()));
}
draw_string(font, Vector2(Math::round(sb->get_offset().x), vofs), label, lc * Color(1, 1, 1, 0.5));
draw_string(font, Vector2(Math::round(sb->get_offset().x), vofs), label, HALIGN_LEFT, -1, font_size, lc * Color(1, 1, 1, 0.5));
draw_string(font, Vector2(Math::round(sb->get_offset().x + string_width + sep), vofs), numstr, fc, number_width);
draw_string(font, Vector2(Math::round(sb->get_offset().x + string_width + sep), vofs), numstr, HALIGN_LEFT, number_width, font_size, fc);
if (get_step() == 1) {
Ref<Texture2D> updown2 = get_theme_icon("updown", "SpinBox");
@ -330,9 +331,10 @@ void EditorSpinSlider::_notification(int p_what) {
Size2 EditorSpinSlider::get_minimum_size() const {
Ref<StyleBox> sb = get_theme_stylebox("normal", "LineEdit");
Ref<Font> font = get_theme_font("font", "LineEdit");
int font_size = get_theme_font_size("font_size", "LineEdit");
Size2 ms = sb->get_minimum_size();
ms.height += font->get_height();
ms.height += font->get_height(font_size);
return ms;
}
@ -360,7 +362,7 @@ void EditorSpinSlider::_evaluate_input_text() {
// This prevents using functions like `pow()`, but using functions
// in EditorSpinSlider is a barely known (and barely used) feature.
// Instead, we'd rather support German/French keyboard layouts out of the box.
const String text = value_input->get_text().replace(",", ".");
const String text = TS->parse_number(value_input->get_text().replace(",", "."));
Ref<Expression> expr;
expr.instance();

View file

@ -600,12 +600,18 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) {
theme->set_color("icon_color_pressed", "Button", icon_color_pressed);
// OptionButton
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("focus", "OptionButton", style_widget_focus);
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_color_hover", "OptionButton", font_color_hl);
theme->set_color("font_color_pressed", "OptionButton", accent_color);
@ -627,6 +633,11 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) {
theme->set_icon("off", "CheckButton", theme->get_icon("GuiToggleOff", "EditorIcons"));
theme->set_icon("off_disabled", "CheckButton", theme->get_icon("GuiToggleOffDisabled", "EditorIcons"));
theme->set_icon("on_mirrored", "CheckButton", theme->get_icon("GuiToggleOnMirrored", "EditorIcons"));
theme->set_icon("on_disabled_mirrored", "CheckButton", theme->get_icon("GuiToggleOnDisabledMirrored", "EditorIcons"));
theme->set_icon("off_mirrored", "CheckButton", theme->get_icon("GuiToggleOffMirrored", "EditorIcons"));
theme->set_icon("off_disabled_mirrored", "CheckButton", theme->get_icon("GuiToggleOffDisabledMirrored", "EditorIcons"));
theme->set_color("font_color", "CheckButton", font_color);
theme->set_color("font_color_hover", "CheckButton", font_color_hl);
theme->set_color("font_color_pressed", "CheckButton", accent_color);
@ -679,6 +690,7 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) {
theme->set_icon("radio_checked", "PopupMenu", theme->get_icon("GuiRadioChecked", "EditorIcons"));
theme->set_icon("radio_unchecked", "PopupMenu", theme->get_icon("GuiRadioUnchecked", "EditorIcons"));
theme->set_icon("submenu", "PopupMenu", theme->get_icon("ArrowRight", "EditorIcons"));
theme->set_icon("submenu_mirrored", "PopupMenu", theme->get_icon("ArrowLeft", "EditorIcons"));
theme->set_icon("visibility_hidden", "PopupMenu", theme->get_icon("GuiVisibilityHidden", "EditorIcons"));
theme->set_icon("visibility_visible", "PopupMenu", theme->get_icon("GuiVisibilityVisible", "EditorIcons"));
theme->set_icon("visibility_xray", "PopupMenu", theme->get_icon("GuiVisibilityXray", "EditorIcons"));
@ -707,6 +719,7 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) {
theme->set_icon("unchecked", "Tree", theme->get_icon("GuiUnchecked", "EditorIcons"));
theme->set_icon("arrow", "Tree", theme->get_icon("GuiTreeArrowDown", "EditorIcons"));
theme->set_icon("arrow_collapsed", "Tree", theme->get_icon("GuiTreeArrowRight", "EditorIcons"));
theme->set_icon("arrow_collapsed_mirrored", "Tree", theme->get_icon("GuiTreeArrowLeft", "EditorIcons"));
theme->set_icon("updown", "Tree", theme->get_icon("GuiTreeUpdown", "EditorIcons"));
theme->set_icon("select_arrow", "Tree", theme->get_icon("GuiDropdown", "EditorIcons"));
theme->set_stylebox("bg_focus", "Tree", style_focus);
@ -851,7 +864,7 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) {
theme->set_stylebox("DebuggerPanel", "EditorStyles", style_panel_debugger);
Ref<StyleBoxFlat> style_panel_invisible_top = style_content_panel->duplicate();
int stylebox_offset = theme->get_font("tab_fg", "TabContainer")->get_height() + theme->get_stylebox("tab_fg", "TabContainer")->get_minimum_size().height + theme->get_stylebox("panel", "TabContainer")->get_default_margin(MARGIN_TOP);
int stylebox_offset = theme->get_font("tab_fg", "TabContainer")->get_height(theme->get_font_size("tab_fg", "TabContainer")) + theme->get_stylebox("tab_fg", "TabContainer")->get_minimum_size().height + theme->get_stylebox("panel", "TabContainer")->get_default_margin(MARGIN_TOP);
style_panel_invisible_top->set_expand_margin_size(MARGIN_TOP, -stylebox_offset);
style_panel_invisible_top->set_default_margin(MARGIN_TOP, 0);
theme->set_stylebox("BottomPanelDebuggerOverride", "EditorStyles", style_panel_invisible_top);
@ -931,6 +944,7 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) {
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("title", "EditorFonts"));
theme->set_font_size("title_font_size", "Window", theme->get_font_size("title_size", "EditorFonts"));
// complex window, for now only Editor settings and Project settings
Ref<StyleBoxFlat> style_complex_window = style_window->duplicate();

View file

@ -68,6 +68,7 @@ bool FileSystemDock::_create_tree(TreeItem *p_parent, EditorFileSystemDirectory
}
subdirectory_item->set_text(0, dname);
subdirectory_item->set_structured_text_bidi_override(0, STRUCTURED_TEXT_FILE);
subdirectory_item->set_icon(0, get_theme_icon("Folder", "EditorIcons"));
subdirectory_item->set_icon_modulate(0, get_theme_color("folder_icon_modulate", "FileDialog"));
subdirectory_item->set_selectable(0, true);
@ -136,6 +137,7 @@ bool FileSystemDock::_create_tree(TreeItem *p_parent, EditorFileSystemDirectory
TreeItem *file_item = tree->create_item(subdirectory_item);
file_item->set_text(0, fi.name);
file_item->set_structured_text_bidi_override(0, STRUCTURED_TEXT_FILE);
file_item->set_icon(0, _get_tree_item_icon(!fi.import_broken, fi.type));
String file_metadata = lpath.plus_file(fi.name);
file_item->set_metadata(0, file_metadata);
@ -320,6 +322,8 @@ void FileSystemDock::_update_display_mode(bool p_force) {
void FileSystemDock::_notification(int p_what) {
switch (p_what) {
case NOTIFICATION_TRANSLATION_CHANGED:
case NOTIFICATION_LAYOUT_DIRECTION_CHANGED:
case NOTIFICATION_ENTER_TREE: {
if (initialized) {
return;
@ -348,8 +352,13 @@ void FileSystemDock::_notification(int p_what) {
file_list_search_box->set_clear_button_enabled(true);
file_list_button_sort->set_icon(get_theme_icon("Sort", ei));
button_hist_next->set_icon(get_theme_icon("Forward", ei));
button_hist_prev->set_icon(get_theme_icon("Back", ei));
if (is_layout_rtl()) {
button_hist_next->set_icon(get_theme_icon("Back", ei));
button_hist_prev->set_icon(get_theme_icon("Forward", ei));
} else {
button_hist_next->set_icon(get_theme_icon("Forward", ei));
button_hist_prev->set_icon(get_theme_icon("Back", ei));
}
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));
@ -402,8 +411,13 @@ void FileSystemDock::_notification(int p_what) {
String ei = "EditorIcons";
button_reload->set_icon(get_theme_icon("Reload", ei));
button_toggle_display_mode->set_icon(get_theme_icon("Panels2", ei));
button_hist_next->set_icon(get_theme_icon("Forward", ei));
button_hist_prev->set_icon(get_theme_icon("Back", ei));
if (is_layout_rtl()) {
button_hist_next->set_icon(get_theme_icon("Back", ei));
button_hist_prev->set_icon(get_theme_icon("Forward", ei));
} else {
button_hist_next->set_icon(get_theme_icon("Forward", ei));
button_hist_prev->set_icon(get_theme_icon("Back", ei));
}
if (file_list_display_mode == FILE_LIST_DISPLAY_LIST) {
button_file_list_display_mode->set_icon(get_theme_icon("FileThumbnail", "EditorIcons"));
} else {
@ -2693,6 +2707,7 @@ FileSystemDock::FileSystemDock(EditorNode *p_editor) {
toolbar_hbc->add_child(button_hist_next);
current_path = memnew(LineEdit);
current_path->set_structured_text_bidi_override(Control::STRUCTURED_TEXT_FILE);
current_path->set_h_size_flags(SIZE_EXPAND_FILL);
_set_current_path_text(path);
toolbar_hbc->add_child(current_path);

View file

@ -571,6 +571,7 @@ FindInFilesPanel::FindInFilesPanel() {
_search_text_label = memnew(Label);
_search_text_label->add_theme_font_override("font", EditorNode::get_singleton()->get_gui_base()->get_theme_font("source", "EditorFonts"));
_search_text_label->add_theme_font_size_override("font_size", EditorNode::get_singleton()->get_gui_base()->get_theme_font_size("source_size", "EditorFonts"));
hbc->add_child(_search_text_label);
_progress_bar = memnew(ProgressBar);
@ -599,6 +600,7 @@ FindInFilesPanel::FindInFilesPanel() {
_results_display = memnew(Tree);
_results_display->add_theme_font_override("font", EditorNode::get_singleton()->get_gui_base()->get_theme_font("source", "EditorFonts"));
_results_display->add_theme_font_size_override("font_size", EditorNode::get_singleton()->get_gui_base()->get_theme_font_size("source_size", "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));
@ -755,10 +757,11 @@ void FindInFilesPanel::draw_result_text(Object *item_obj, Rect2 rect) {
Result r = E->value();
String item_text = item->get_text(_with_replace ? 1 : 0);
Ref<Font> font = _results_display->get_theme_font("font");
int font_size = _results_display->get_theme_font_size("font_size");
Rect2 match_rect = rect;
match_rect.position.x += font->get_string_size(item_text.left(r.begin_trimmed)).x;
match_rect.size.x = font->get_string_size(_search_text_label->get_text()).x;
match_rect.position.x += font->get_string_size(item_text.left(r.begin_trimmed), font_size).x;
match_rect.size.x = font->get_string_size(_search_text_label->get_text(), font_size).x;
match_rect.position.y += 1 * EDSCALE;
match_rect.size.y -= 2 * EDSCALE;

View file

@ -361,9 +361,16 @@ void GroupDialog::_delete_group_item(const String &p_name) {
void GroupDialog::_notification(int p_what) {
switch (p_what) {
case NOTIFICATION_TRANSLATION_CHANGED:
case Control::NOTIFICATION_LAYOUT_DIRECTION_CHANGED:
case NOTIFICATION_ENTER_TREE: {
add_button->set_icon(groups->get_theme_icon("Forward", "EditorIcons"));
remove_button->set_icon(groups->get_theme_icon("Back", "EditorIcons"));
if (is_layout_rtl()) {
add_button->set_icon(groups->get_theme_icon("Back", "EditorIcons"));
remove_button->set_icon(groups->get_theme_icon("Forward", "EditorIcons"));
} else {
add_button->set_icon(groups->get_theme_icon("Forward", "EditorIcons"));
remove_button->set_icon(groups->get_theme_icon("Back", "EditorIcons"));
}
add_filter->set_right_icon(groups->get_theme_icon("Search", "EditorIcons"));
add_filter->set_clear_button_enabled(true);

View file

@ -0,0 +1 @@
<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0"><path d="m2 14c-.552262-.000055-.999945-.447738-1-1v-10c.000055-.5522619.447738-.9999448 1-1h8c.303863-.0001753.591325.1378063.78125.375l4 5c.291397.3649711.291397.8830289 0 1.248l-4 5c-.189538.237924-.477058.376652-.78125.37695h-8zm1-2h6.5195004l3.1991996-4-3.1991996-4h-6.5195004zm6.0000004-2v-4l1.9999996 2z" fill-rule="evenodd"/><path d="m3.8685125 4.9095434h4.1550816v1.1637426h-2.6154217v1.1117544h2.4594562v1.1637428h-2.4594562v1.3676976h2.7034024v1.1637432h-4.2430623z" stroke-width=".204755"/></g></svg>

After

Width:  |  Height:  |  Size: 614 B

View file

@ -0,0 +1 @@
<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m13.999798 2a-1.0001 1.0001 0 0 1 1 1v10a-1.0001 1.0001 0 0 1 -1 1h-8.0000003a-1.0001 1.0001 0 0 1 -.78125-.375l-4-5a-1.0001 1.0001 0 0 1 0-1.248l4-5a-1.0001 1.0001 0 0 1 .78125-.37695h8.0000003zm-1 2h-6.5195003l-3.1992 4 3.1992 4h6.5195003zm-3.0000003 1c1.1046003 0 2.0000003.8954 2.0000003 2v4h-1v-2h-2.0000003v2h-1v-4c0-1.1046.89543-2 2-2zm0 1a-1 1 0 0 0 -1 1v1h2.0000003v-1a-1 1 0 0 0 -1.0000003-1zm-3 0v4l-2-2z" fill="#e0e0e0" fill-rule="evenodd"/></svg>

After

Width:  |  Height:  |  Size: 552 B

View file

@ -1 +0,0 @@
<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m1 1037.4v4h1v-1h1v-1h4v10h-1v1h-1v1h6v-1h-1v-1h-1v-10h4v1h1v1h1v-4z" fill="#84c2ff" transform="translate(0 -1036.4)"/></svg>

Before

Width:  |  Height:  |  Size: 218 B

View file

@ -1 +0,0 @@
<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><g transform="translate(0 -1036.4)"><path d="m1 1037.4v2 1h1a1 1 0 0 1 1-1h2v6a1 1 0 0 1 -1 1v1h1 2 1v-1a1 1 0 0 1 -1-1v-6h2a1 1 0 0 1 1 1h1v-1-2h-4-2z" fill="#e0e0e0"/><path d="m4 5v2 1h1a1 1 0 0 1 1-1h2v6a1 1 0 0 1 -1 1v1h1 2 1v-1a1 1 0 0 1 -1-1v-6h2a1 1 0 0 1 1 1h1v-1-2h-4-2z" fill="#84c2ff" transform="translate(0 1036.4)"/></g></svg>

Before

Width:  |  Height:  |  Size: 423 B

View file

Before

Width:  |  Height:  |  Size: 394 B

After

Width:  |  Height:  |  Size: 394 B

View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path fill-opacity=".588" fill="#fff" d="M4 3a1 1 0 0 1 1 1v6h6a1 1 0 0 1 0 2H4a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1z"/></svg>

After

Width:  |  Height:  |  Size: 183 B

View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="8" height="8"><path fill-opacity=".196" fill="#fff" d="M2 0v8H0V0zm5.014.002a-1 1 0 0 1 .693.291-1 1 0 0 1 0 1.414L5.414 4l2.293 2.293a-1 1 0 0 1 0 1.414-1 1 0 0 1-1.414 0l-3-3a-1 1 0 0 1 0-1.414l3-3a-1 1 0 0 1 .72-.29z"/></svg>

After

Width:  |  Height:  |  Size: 276 B

View file

@ -0,0 +1 @@
<svg height="26" width="42" xmlns="http://www.w3.org/2000/svg"><g fill="#e0e0e0" transform="matrix(-1 0 0 1 42 0)"><rect fill-opacity=".188" height="16" rx="9" width="38" x="2" y="5"/><circle cx="10" cy="13" r="5"/></g></svg>

After

Width:  |  Height:  |  Size: 226 B

View file

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="42" height="26"><path fill="#e0e0e0" d="M31 5c4.986 0 9 3.568 9 8s-4.014 8-9 8H11c-4.986 0-9-3.568-9-8s4.014-8 9-8zM10 8a-5 5 0 0 0-5 5-5 5 0 0 0 5 5-5 5 0 0 0 5-5-5 5 0 0 0-5-5z"/></svg>

After

Width:  |  Height:  |  Size: 235 B

View file

@ -0,0 +1 @@
<svg height="12" width="12" xmlns="http://www.w3.org/2000/svg"><path d="m7 9-3-3 3-3" style="fill:none;stroke:#fff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:.392"/></svg>

After

Width:  |  Height:  |  Size: 202 B

View file

@ -332,13 +332,20 @@ Container *InspectorDock::get_addon_area() {
void InspectorDock::_notification(int p_what) {
switch (p_what) {
case NOTIFICATION_TRANSLATION_CHANGED:
case NOTIFICATION_LAYOUT_DIRECTION_CHANGED:
case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: {
set_theme(editor->get_gui_base()->get_theme());
resource_new_button->set_icon(get_theme_icon("New", "EditorIcons"));
resource_load_button->set_icon(get_theme_icon("Load", "EditorIcons"));
resource_save_button->set_icon(get_theme_icon("Save", "EditorIcons"));
backward_button->set_icon(get_theme_icon("Back", "EditorIcons"));
forward_button->set_icon(get_theme_icon("Forward", "EditorIcons"));
if (is_layout_rtl()) {
backward_button->set_icon(get_theme_icon("Forward", "EditorIcons"));
forward_button->set_icon(get_theme_icon("Back", "EditorIcons"));
} else {
backward_button->set_icon(get_theme_icon("Back", "EditorIcons"));
forward_button->set_icon(get_theme_icon("Forward", "EditorIcons"));
}
history_menu->set_icon(get_theme_icon("History", "EditorIcons"));
object_menu->set_icon(get_theme_icon("Tools", "EditorIcons"));
warning->set_icon(get_theme_icon("NodeWarning", "EditorIcons"));
@ -524,7 +531,11 @@ InspectorDock::InspectorDock(EditorNode *p_editor, EditorData &p_editor_data) {
backward_button = memnew(Button);
backward_button->set_flat(true);
general_options_hb->add_child(backward_button);
backward_button->set_icon(get_theme_icon("Back", "EditorIcons"));
if (is_layout_rtl()) {
backward_button->set_icon(get_theme_icon("Forward", "EditorIcons"));
} else {
backward_button->set_icon(get_theme_icon("Back", "EditorIcons"));
}
backward_button->set_flat(true);
backward_button->set_tooltip(TTR("Go to the previous edited object in history."));
backward_button->set_disabled(true);
@ -533,7 +544,11 @@ InspectorDock::InspectorDock(EditorNode *p_editor, EditorData &p_editor_data) {
forward_button = memnew(Button);
forward_button->set_flat(true);
general_options_hb->add_child(forward_button);
forward_button->set_icon(get_theme_icon("Forward", "EditorIcons"));
if (is_layout_rtl()) {
forward_button->set_icon(get_theme_icon("Back", "EditorIcons"));
} else {
forward_button->set_icon(get_theme_icon("Forward", "EditorIcons"));
}
forward_button->set_flat(true);
forward_button->set_tooltip(TTR("Go to the next edited object in history."));
forward_button->set_disabled(true);

View file

@ -37,6 +37,24 @@
#include "scene/gui/control.h"
void LocalizationEditor::_notification(int p_what) {
if (p_what == NOTIFICATION_TEXT_SERVER_CHANGED) {
ts_name->set_text(TTR("Text server: ") + TS->get_name());
FileAccessRef file_check = FileAccess::create(FileAccess::ACCESS_RESOURCES);
if (TS->has_feature(TextServer::FEATURE_USE_SUPPORT_DATA)) {
if (file_check->file_exists("res://" + TS->get_support_data_filename())) {
ts_data_status->set_text(TTR("Support data: ") + TTR("Installed"));
ts_install->set_disabled(true);
} else {
ts_data_status->set_text(TTR("Support data: ") + TTR("Not installed"));
ts_install->set_disabled(false);
}
} else {
ts_data_status->set_text(TTR("Support data: ") + TTR("Not supported"));
ts_install->set_disabled(false);
}
ts_data_info->set_text(TTR("Info: ") + TS->get_support_data_info());
}
if (p_what == NOTIFICATION_ENTER_TREE) {
translation_list->connect("button_pressed", callable_mp(this, &LocalizationEditor::_translation_delete));
translation_pot_list->connect("button_pressed", callable_mp(this, &LocalizationEditor::_pot_delete));
@ -622,6 +640,26 @@ void LocalizationEditor::update_translations() {
updating_translations = false;
}
void LocalizationEditor::_install_ts_data() {
if (TS->has_feature(TextServer::FEATURE_USE_SUPPORT_DATA)) {
TS->save_support_data("res://" + TS->get_support_data_filename());
}
FileAccessRef file_check = FileAccess::create(FileAccess::ACCESS_RESOURCES);
if (TS->has_feature(TextServer::FEATURE_USE_SUPPORT_DATA)) {
if (file_check->file_exists("res://" + TS->get_support_data_filename())) {
ts_data_status->set_text(TTR("Support data: ") + TTR("Installed"));
ts_install->set_disabled(true);
} else {
ts_data_status->set_text(TTR("Support data: ") + TTR("Not installed"));
ts_install->set_disabled(false);
}
} else {
ts_data_status->set_text(TTR("Support data: ") + TTR("Not supported"));
ts_install->set_disabled(false);
}
}
void LocalizationEditor::_bind_methods() {
ClassDB::bind_method(D_METHOD("update_translations"), &LocalizationEditor::update_translations);
@ -791,4 +829,37 @@ LocalizationEditor::LocalizationEditor() {
pot_file_open_dialog->connect("file_selected", callable_mp(this, &LocalizationEditor::_pot_add));
add_child(pot_file_open_dialog);
}
{
VBoxContainer *tvb = memnew(VBoxContainer);
tvb->set_name(TTR("Text Server Data"));
translations->add_child(tvb);
ts_name = memnew(Label(TTR("Text server: ") + TS->get_name()));
tvb->add_child(ts_name);
ts_data_status = memnew(Label(TTR("Support data: ")));
tvb->add_child(ts_data_status);
ts_data_info = memnew(Label(TTR("Info: ") + TS->get_support_data_info()));
tvb->add_child(ts_data_info);
ts_install = memnew(Button(TTR("Install support data...")));
ts_install->connect("pressed", callable_mp(this, &LocalizationEditor::_install_ts_data));
tvb->add_child(ts_install);
FileAccessRef file_check = FileAccess::create(FileAccess::ACCESS_RESOURCES);
if (TS->has_feature(TextServer::FEATURE_USE_SUPPORT_DATA)) {
if (file_check->file_exists("res://" + TS->get_support_data_filename())) {
ts_data_status->set_text(TTR("Support data: ") + TTR("Installed"));
ts_install->set_disabled(true);
} else {
ts_data_status->set_text(TTR("Support data: ") + TTR("Not installed"));
ts_install->set_disabled(false);
}
} else {
ts_data_status->set_text(TTR("Support data: ") + TTR("Not supported"));
ts_install->set_disabled(false);
}
}
}

View file

@ -58,6 +58,11 @@ class LocalizationEditor : public VBoxContainer {
Vector<TreeItem *> translation_filter_treeitems;
Vector<int> translation_locales_idxs_remap;
Label *ts_name;
Label *ts_data_status;
Label *ts_data_info;
Button *ts_install;
Tree *translation_pot_list;
EditorFileDialog *pot_file_open_dialog;
EditorFileDialog *pot_generate_dialog;
@ -89,6 +94,8 @@ class LocalizationEditor : public VBoxContainer {
void _pot_generate(const String &p_file);
void _update_pot_file_extensions();
void _install_ts_data();
protected:
void _notification(int p_what);
static void _bind_methods();

View file

@ -551,9 +551,10 @@ void AbstractPolygon2DEditor::forward_canvas_draw_over_viewport(Control *p_overl
if (vertex == hover_point) {
Ref<Font> font = get_theme_font("font", "Label");
int font_size = get_theme_font_size("font_size", "Label");
String num = String::num(vertex.vertex);
Size2 num_size = font->get_string_size(num);
p_overlay->draw_string(font, point - num_size * 0.5, num, Color(1.0, 1.0, 1.0, 0.5));
Size2 num_size = font->get_string_size(num, font_size);
p_overlay->draw_string(font, point - num_size * 0.5, num, HALIGN_LEFT, -1, font_size, Color(1.0, 1.0, 1.0, 0.5));
}
}
}

View file

@ -201,6 +201,7 @@ void AnimationNodeBlendSpace1DEditor::_blend_space_draw() {
linecolor_soft.a *= 0.5;
Ref<Font> font = get_theme_font("font", "Label");
int font_size = get_theme_font_size("font_size", "Label");
Ref<Texture2D> icon = get_theme_icon("KeyValue", "EditorIcons");
Ref<Texture2D> icon_selected = get_theme_icon("KeySelected", "EditorIcons");
@ -221,7 +222,7 @@ void AnimationNodeBlendSpace1DEditor::_blend_space_draw() {
float x = point;
blend_space_draw->draw_line(Point2(x, s.height - 1), Point2(x, s.height - 5 * EDSCALE), linecolor);
blend_space_draw->draw_string(font, Point2(x + 2 * EDSCALE, s.height - 2 * EDSCALE - font->get_height() + font->get_ascent()), "0", linecolor);
blend_space_draw->draw_string(font, Point2(x + 2 * EDSCALE, s.height - 2 * EDSCALE - font->get_height(font_size) + font->get_ascent(font_size)), "0", HALIGN_LEFT, -1, font_size, linecolor);
blend_space_draw->draw_line(Point2(x, s.height - 5 * EDSCALE), Point2(x, 0), linecolor_soft);
}

View file

@ -396,6 +396,7 @@ void AnimationNodeBlendSpace2DEditor::_blend_space_draw() {
Color linecolor_soft = linecolor;
linecolor_soft.a *= 0.5;
Ref<Font> font = get_theme_font("font", "Label");
int font_size = get_theme_font_size("font_size", "Label");
Ref<Texture2D> icon = get_theme_icon("KeyValue", "EditorIcons");
Ref<Texture2D> icon_selected = get_theme_icon("KeySelected", "EditorIcons");
@ -412,14 +413,14 @@ void AnimationNodeBlendSpace2DEditor::_blend_space_draw() {
if (blend_space->get_min_space().y < 0) {
int y = (blend_space->get_max_space().y / (blend_space->get_max_space().y - blend_space->get_min_space().y)) * s.height;
blend_space_draw->draw_line(Point2(0, y), Point2(5 * EDSCALE, y), linecolor);
blend_space_draw->draw_string(font, Point2(2 * EDSCALE, y - font->get_height() + font->get_ascent()), "0", linecolor);
blend_space_draw->draw_string(font, Point2(2 * EDSCALE, y - font->get_height(font_size) + font->get_ascent(font_size)), "0", HALIGN_LEFT, -1, font_size, linecolor);
blend_space_draw->draw_line(Point2(5 * EDSCALE, y), Point2(s.width, y), linecolor_soft);
}
if (blend_space->get_min_space().x < 0) {
int x = (-blend_space->get_min_space().x / (blend_space->get_max_space().x - blend_space->get_min_space().x)) * s.width;
blend_space_draw->draw_line(Point2(x, s.height - 1), Point2(x, s.height - 5 * EDSCALE), linecolor);
blend_space_draw->draw_string(font, Point2(x + 2 * EDSCALE, s.height - 2 * EDSCALE - font->get_height() + font->get_ascent()), "0", linecolor);
blend_space_draw->draw_string(font, Point2(x + 2 * EDSCALE, s.height - 2 * EDSCALE - font->get_height(font_size) + font->get_ascent(font_size)), "0", HALIGN_LEFT, -1, font_size, linecolor);
blend_space_draw->draw_line(Point2(x, s.height - 5 * EDSCALE), Point2(x, 0), linecolor_soft);
}

View file

@ -105,6 +105,8 @@ void AnimationPlayerEditor::_notification(int p_what) {
case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: {
add_theme_style_override("panel", editor->get_gui_base()->get_theme_stylebox("panel", "Panel"));
} break;
case NOTIFICATION_TRANSLATION_CHANGED:
case NOTIFICATION_LAYOUT_DIRECTION_CHANGED:
case NOTIFICATION_THEME_CHANGED: {
autoplay->set_icon(get_theme_icon("AutoPlay", "EditorIcons"));

View file

@ -559,6 +559,7 @@ void AnimationNodeStateMachineEditor::_state_machine_draw() {
Ref<StyleBox> style_selected = get_theme_stylebox("state_machine_selectedframe", "GraphNode");
Ref<Font> font = get_theme_font("title_font", "GraphNode");
int font_size = get_theme_font_size("title_font_size", "GraphNode");
Color font_color = get_theme_color("title_color", "GraphNode");
Ref<Texture2D> play = get_theme_icon("Play", "EditorIcons");
Ref<Texture2D> auto_play = get_theme_icon("AutoPlay", "EditorIcons");
@ -612,9 +613,9 @@ void AnimationNodeStateMachineEditor::_state_machine_draw() {
Ref<StyleBox> sb = E->get() == selected_node ? style_selected : style;
Size2 s = sb->get_minimum_size();
int strsize = font->get_string_size(name).width;
int strsize = font->get_string_size(name, font_size).width;
s.width += strsize;
s.height += MAX(font->get_height(), play->get_height());
s.height += MAX(font->get_height(font_size), play->get_height());
s.width += sep + play->get_width();
if (needs_editor) {
s.width += sep + edit->get_width();
@ -741,7 +742,7 @@ void AnimationNodeStateMachineEditor::_state_machine_draw() {
Ref<AnimationNode> anode = state_machine->get_node(name);
bool needs_editor = AnimationTreeEditor::get_singleton()->can_edit(anode);
Ref<StyleBox> sb = name == selected_node ? style_selected : style;
int strsize = font->get_string_size(name).width;
int strsize = font->get_string_size(name, font_size).width;
NodeRect &nr = node_rects.write[i];
@ -759,12 +760,12 @@ void AnimationNodeStateMachineEditor::_state_machine_draw() {
bool onstart = state_machine->get_start_node() == name;
if (onstart) {
state_machine_draw->draw_string(font, offset + Vector2(0, -font->get_height() - 3 * EDSCALE + font->get_ascent()), TTR("Start"), font_color);
state_machine_draw->draw_string(font, offset + Vector2(0, -font->get_height(font_size) - 3 * EDSCALE + font->get_ascent(font_size)), TTR("Start"), HALIGN_LEFT, -1, font_size, font_color);
}
if (state_machine->get_end_node() == name) {
int endofs = nr.node.size.x - font->get_string_size(TTR("End")).x;
state_machine_draw->draw_string(font, offset + Vector2(endofs, -font->get_height() - 3 * EDSCALE + font->get_ascent()), TTR("End"), font_color);
int endofs = nr.node.size.x - font->get_string_size(TTR("End"), font_size).x;
state_machine_draw->draw_string(font, offset + Vector2(endofs, -font->get_height(font_size) - 3 * EDSCALE + font->get_ascent(font_size)), TTR("End"), HALIGN_LEFT, -1, font_size, font_color);
}
offset.x += sb->get_offset().x;
@ -781,10 +782,10 @@ void AnimationNodeStateMachineEditor::_state_machine_draw() {
}
offset.x += sep + play->get_width();
nr.name.position = offset + Vector2(0, (h - font->get_height()) / 2).floor();
nr.name.size = Vector2(strsize, font->get_height());
nr.name.position = offset + Vector2(0, (h - font->get_height(font_size)) / 2).floor();
nr.name.size = Vector2(strsize, font->get_height(font_size));
state_machine_draw->draw_string(font, nr.name.position + Vector2(0, font->get_ascent()), name, font_color);
state_machine_draw->draw_string(font, nr.name.position + Vector2(0, font->get_ascent(font_size)), name, HALIGN_LEFT, -1, font_size, font_color);
offset.x += strsize + sep;
if (needs_editor) {
@ -880,7 +881,7 @@ void AnimationNodeStateMachineEditor::_update_graph() {
}
void AnimationNodeStateMachineEditor::_notification(int p_what) {
if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_THEME_CHANGED) {
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("panel", get_theme_stylebox("bg", "Tree"));
error_label->add_theme_color_override("font_color", get_theme_color("error_color", "Editor"));
panel->add_theme_style_override("panel", get_theme_stylebox("bg", "Tree"));

View file

@ -236,11 +236,13 @@ AudioStreamEditor::AudioStreamEditor() {
_current_label->set_align(Label::ALIGN_RIGHT);
_current_label->set_h_size_flags(SIZE_EXPAND_FILL);
_current_label->add_theme_font_override("font", EditorNode::get_singleton()->get_gui_base()->get_theme_font("status_source", "EditorFonts"));
_current_label->add_theme_font_size_override("font_size", EditorNode::get_singleton()->get_gui_base()->get_theme_font_size("status_source_size", "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("font", EditorNode::get_singleton()->get_gui_base()->get_theme_font("status_source", "EditorFonts"));
_duration_label->add_theme_font_size_override("font_size", EditorNode::get_singleton()->get_gui_base()->get_theme_font_size("status_source_size", "EditorFonts"));
hbox->add_child(_duration_label);
}

View file

@ -52,7 +52,6 @@
#include "scene/gui/subviewport_container.h"
#include "scene/main/canvas_layer.h"
#include "scene/main/window.h"
#include "scene/resources/dynamic_font.h"
#include "scene/resources/packed_scene.h"
// Min and Max are power of two in order to play nicely with successive increment.
@ -857,7 +856,11 @@ Vector2 CanvasItemEditor::_anchor_to_position(const Control *p_control, Vector2
Transform2D parent_transform = p_control->get_transform().affine_inverse();
Rect2 parent_rect = p_control->get_parent_anchorable_rect();
return parent_transform.xform(parent_rect.position + Vector2(parent_rect.size.x * anchor.x, parent_rect.size.y * anchor.y));
if (p_control->is_layout_rtl()) {
return parent_transform.xform(parent_rect.position + Vector2(parent_rect.size.x - parent_rect.size.x * anchor.x, parent_rect.size.y * anchor.y));
} else {
return parent_transform.xform(parent_rect.position + Vector2(parent_rect.size.x * anchor.x, parent_rect.size.y * anchor.y));
}
}
Vector2 CanvasItemEditor::_position_to_anchor(const Control *p_control, Vector2 position) {
@ -866,7 +869,11 @@ Vector2 CanvasItemEditor::_position_to_anchor(const Control *p_control, Vector2
Rect2 parent_rect = p_control->get_parent_anchorable_rect();
Vector2 output = Vector2();
output.x = (parent_rect.size.x == 0) ? 0.0 : (p_control->get_transform().xform(position).x - parent_rect.position.x) / parent_rect.size.x;
if (p_control->is_layout_rtl()) {
output.x = (parent_rect.size.x == 0) ? 0.0 : (parent_rect.size.x - p_control->get_transform().xform(position).x - parent_rect.position.x) / parent_rect.size.x;
} else {
output.x = (parent_rect.size.x == 0) ? 0.0 : (p_control->get_transform().xform(position).x - parent_rect.position.x) / parent_rect.size.x;
}
output.y = (parent_rect.size.y == 0) ? 0.0 : (p_control->get_transform().xform(position).y - parent_rect.position.y) / parent_rect.size.y;
return output;
}
@ -1628,7 +1635,11 @@ bool CanvasItemEditor::_gui_input_anchors(const Ref<InputEvent> &p_event) {
for (int i = 0; i < 4; i++) {
anchor_pos[i] = (transform * control->get_global_transform_with_canvas()).xform(_anchor_to_position(control, anchor_pos[i]));
anchor_rects[i] = Rect2(anchor_pos[i], anchor_handle->get_size());
anchor_rects[i].position -= anchor_handle->get_size() * Vector2(float(i == 0 || i == 3), float(i <= 1));
if (control->is_layout_rtl()) {
anchor_rects[i].position -= anchor_handle->get_size() * Vector2(float(i == 1 || i == 2), float(i <= 1));
} else {
anchor_rects[i].position -= anchor_handle->get_size() * Vector2(float(i == 0 || i == 3), float(i <= 1));
}
}
DragType dragger[] = {
@ -2771,7 +2782,8 @@ void CanvasItemEditor::_draw_text_at_position(Point2 p_position, String p_string
Color color = get_theme_color("font_color", "Editor");
color.a = 0.8;
Ref<Font> font = get_theme_font("font", "Label");
Size2 text_size = font->get_string_size(p_string);
int font_size = get_theme_font_size("font_size", "Label");
Size2 text_size = font->get_string_size(p_string, font_size);
switch (p_side) {
case MARGIN_LEFT:
p_position += Vector2(-text_size.x - 5, text_size.y / 2);
@ -2786,18 +2798,18 @@ void CanvasItemEditor::_draw_text_at_position(Point2 p_position, String p_string
p_position += Vector2(-text_size.x / 2, text_size.y + 5);
break;
}
viewport->draw_string(font, p_position, p_string, color);
viewport->draw_string(font, p_position, p_string, HALIGN_LEFT, -1, font_size, color);
}
void CanvasItemEditor::_draw_margin_at_position(int p_value, Point2 p_position, Margin p_side) {
String str = vformat("%d px", p_value);
String str = TS->format_number(vformat("%d " + TTR("px"), p_value));
if (p_value != 0) {
_draw_text_at_position(p_position, str, p_side);
}
}
void CanvasItemEditor::_draw_percentage_at_position(float p_value, Point2 p_position, Margin p_side) {
String str = vformat("%.1f %%", p_value * 100.0);
String str = TS->format_number(vformat("%.1f ", p_value * 100.0)) + TS->percent_sign();
if (p_value != 0) {
_draw_text_at_position(p_position, str, p_side);
}
@ -2841,17 +2853,19 @@ void CanvasItemEditor::_draw_guides() {
Color text_color = get_theme_color("font_color", "Editor");
text_color.a = 0.5;
if (drag_type == DRAG_DOUBLE_GUIDE || drag_type == DRAG_V_GUIDE) {
String str = vformat("%d px", Math::round(xform.affine_inverse().xform(dragged_guide_pos).x));
String str = TS->format_number(vformat("%d px", Math::round(xform.affine_inverse().xform(dragged_guide_pos).x)));
Ref<Font> font = get_theme_font("font", "Label");
Size2 text_size = font->get_string_size(str);
viewport->draw_string(font, Point2(dragged_guide_pos.x + 10, RULER_WIDTH + text_size.y / 2 + 10), str, text_color);
int font_size = get_theme_font_size("font_size", "Label");
Size2 text_size = font->get_string_size(str, font_size);
viewport->draw_string(font, Point2(dragged_guide_pos.x + 10, RULER_WIDTH + text_size.y / 2 + 10), str, HALIGN_LEFT, -1, font_size, text_color);
viewport->draw_line(Point2(dragged_guide_pos.x, 0), Point2(dragged_guide_pos.x, viewport->get_size().y), guide_color, Math::round(EDSCALE));
}
if (drag_type == DRAG_DOUBLE_GUIDE || drag_type == DRAG_H_GUIDE) {
String str = vformat("%d px", Math::round(xform.affine_inverse().xform(dragged_guide_pos).y));
String str = TS->format_number(vformat("%d px", Math::round(xform.affine_inverse().xform(dragged_guide_pos).y)));
Ref<Font> font = get_theme_font("font", "Label");
Size2 text_size = font->get_string_size(str);
viewport->draw_string(font, Point2(RULER_WIDTH + 10, dragged_guide_pos.y + text_size.y / 2 + 10), str, text_color);
int font_size = get_theme_font_size("font_size", "Label");
Size2 text_size = font->get_string_size(str, font_size);
viewport->draw_string(font, Point2(RULER_WIDTH + 10, dragged_guide_pos.y + text_size.y / 2 + 10), str, HALIGN_LEFT, -1, font_size, text_color);
viewport->draw_line(Point2(0, dragged_guide_pos.y), Point2(viewport->get_size().x, dragged_guide_pos.y), guide_color, Math::round(EDSCALE));
}
}
@ -2876,6 +2890,7 @@ void CanvasItemEditor::_draw_rulers() {
Color font_color = get_theme_color("font_color", "Editor");
font_color.a = 0.8;
Ref<Font> font = get_theme_font("rulers", "EditorFonts");
int font_size = get_theme_font_size("rulers_size", "EditorFonts");
// The rule transform
Transform2D ruler_transform = Transform2D();
@ -2922,7 +2937,7 @@ void CanvasItemEditor::_draw_rulers() {
if (i % (major_subdivision * minor_subdivision) == 0) {
viewport->draw_line(Point2(position.x, 0), Point2(position.x, RULER_WIDTH), graduation_color, Math::round(EDSCALE));
float val = (ruler_transform * major_subdivide * minor_subdivide).xform(Point2(i, 0)).x;
viewport->draw_string(font, Point2(position.x + 2, font->get_height()), vformat(((int)val == val) ? "%d" : "%.1f", val), font_color);
viewport->draw_string(font, Point2(position.x + 2, font->get_height(font_size)), TS->format_number(vformat(((int)val == val) ? "%d" : "%.1f", val)), HALIGN_LEFT, -1, font_size, font_color);
} else {
if (i % minor_subdivision == 0) {
viewport->draw_line(Point2(position.x, RULER_WIDTH * 0.33), Point2(position.x, RULER_WIDTH), graduation_color, Math::round(EDSCALE));
@ -2940,9 +2955,9 @@ void CanvasItemEditor::_draw_rulers() {
viewport->draw_line(Point2(0, position.y), Point2(RULER_WIDTH, position.y), graduation_color, Math::round(EDSCALE));
float val = (ruler_transform * major_subdivide * minor_subdivide).xform(Point2(0, i)).y;
Transform2D text_xform = Transform2D(-Math_PI / 2.0, Point2(font->get_height(), position.y - 2));
Transform2D text_xform = Transform2D(-Math_PI / 2.0, Point2(font->get_height(font_size), position.y - 2));
viewport->draw_set_transform_matrix(viewport->get_transform() * text_xform);
viewport->draw_string(font, Point2(), vformat(((int)val == val) ? "%d" : "%.1f", val), font_color);
viewport->draw_string(font, Point2(), TS->format_number(vformat(((int)val == val) ? "%d" : "%.1f", val)), HALIGN_LEFT, -1, font_size, font_color);
viewport->draw_set_transform_matrix(viewport->get_transform());
} else {
@ -3054,17 +3069,18 @@ void CanvasItemEditor::_draw_ruler_tool() {
}
Ref<Font> font = get_theme_font("bold", "EditorFonts");
int font_size = get_theme_font_size("bold_size", "EditorFonts");
Color font_color = get_theme_color("font_color", "Editor");
Color font_secondary_color = font_color;
font_secondary_color.a = 0.5;
float text_height = font->get_height();
float text_height = font->get_height(font_size);
const float text_width = 76;
const float angle_text_width = 54;
Point2 text_pos = (begin + end) / 2 - Vector2(text_width / 2, text_height / 2);
text_pos.x = CLAMP(text_pos.x, text_width / 2, viewport->get_rect().size.x - text_width * 1.5);
text_pos.y = CLAMP(text_pos.y, text_height * 1.5, viewport->get_rect().size.y - text_height * 1.5);
viewport->draw_string(font, text_pos, vformat("%.2f px", length_vector.length()), font_color);
viewport->draw_string(font, text_pos, TS->format_number(vformat("%.2f " + TTR("px"), length_vector.length())), HALIGN_LEFT, -1, font_size, font_color);
if (draw_secondary_lines) {
const float horizontal_angle_rad = atan2(length_vector.y, length_vector.x);
@ -3074,16 +3090,16 @@ void CanvasItemEditor::_draw_ruler_tool() {
Point2 text_pos2 = text_pos;
text_pos2.x = begin.x < text_pos.x ? MIN(text_pos.x - text_width, begin.x - text_width / 2) : MAX(text_pos.x + text_width, begin.x - text_width / 2);
viewport->draw_string(font, text_pos2, vformat("%.2f px", length_vector.y), font_secondary_color);
viewport->draw_string(font, text_pos2, TS->format_number(vformat("%.2f " + TTR("px"), length_vector.y)), HALIGN_LEFT, -1, font_size, font_secondary_color);
Point2 v_angle_text_pos = Point2();
v_angle_text_pos.x = CLAMP(begin.x - angle_text_width / 2, angle_text_width / 2, viewport->get_rect().size.x - angle_text_width);
v_angle_text_pos.y = begin.y < end.y ? MIN(text_pos2.y - 2 * text_height, begin.y - text_height * 0.5) : MAX(text_pos2.y + text_height * 3, begin.y + text_height * 1.5);
viewport->draw_string(font, v_angle_text_pos, vformat("%d deg", vertical_angle), font_secondary_color);
viewport->draw_string(font, v_angle_text_pos, TS->format_number(vformat("%d " + TTR("deg"), vertical_angle)), HALIGN_LEFT, -1, font_size, font_secondary_color);
text_pos2 = text_pos;
text_pos2.y = end.y < text_pos.y ? MIN(text_pos.y - text_height * 2, end.y - text_height / 2) : MAX(text_pos.y + text_height * 2, end.y - text_height / 2);
viewport->draw_string(font, text_pos2, vformat("%.2f px", length_vector.x), font_secondary_color);
viewport->draw_string(font, text_pos2, TS->format_number(vformat("%.2f " + TTR("px"), length_vector.x)), HALIGN_LEFT, -1, font_size, font_secondary_color);
Point2 h_angle_text_pos = Point2();
h_angle_text_pos.x = CLAMP(end.x - angle_text_width / 2, angle_text_width / 2, viewport->get_rect().size.x - angle_text_width);
@ -3100,7 +3116,7 @@ void CanvasItemEditor::_draw_ruler_tool() {
h_angle_text_pos.y = MIN(text_pos.y - height_multiplier * text_height, MIN(end.y - text_height * 0.5, text_pos2.y - height_multiplier * text_height));
}
}
viewport->draw_string(font, h_angle_text_pos, vformat("%d deg", horizontal_angle), font_secondary_color);
viewport->draw_string(font, h_angle_text_pos, TS->format_number(vformat("%d " + TTR("deg"), horizontal_angle)), HALIGN_LEFT, -1, font_size, font_secondary_color);
// Angle arcs
int arc_point_count = 8;
@ -3137,17 +3153,17 @@ void CanvasItemEditor::_draw_ruler_tool() {
text_pos.y = CLAMP(text_pos.y, text_height * 2.5, viewport->get_rect().size.y - text_height / 2);
if (draw_secondary_lines) {
viewport->draw_string(font, text_pos, vformat("%.2f units", (length_vector / grid_step).length()), font_color);
viewport->draw_string(font, text_pos, TS->format_number(vformat("%.2f " + TTR("units"), (length_vector / grid_step).length())), HALIGN_LEFT, -1, font_size, font_color);
Point2 text_pos2 = text_pos;
text_pos2.x = begin.x < text_pos.x ? MIN(text_pos.x - text_width, begin.x - text_width / 2) : MAX(text_pos.x + text_width, begin.x - text_width / 2);
viewport->draw_string(font, text_pos2, vformat("%d units", roundf(length_vector.y / grid_step.y)), font_secondary_color);
viewport->draw_string(font, text_pos2, TS->format_number(vformat("%d " + TTR("units"), roundf(length_vector.y / grid_step.y))), HALIGN_LEFT, -1, font_size, font_secondary_color);
text_pos2 = text_pos;
text_pos2.y = end.y < text_pos.y ? MIN(text_pos.y - text_height * 2, end.y + text_height / 2) : MAX(text_pos.y + text_height * 2, end.y + text_height / 2);
viewport->draw_string(font, text_pos2, vformat("%d units", roundf(length_vector.x / grid_step.x)), font_secondary_color);
viewport->draw_string(font, text_pos2, TS->format_number(vformat("%d " + TTR("units"), roundf(length_vector.x / grid_step.x))), HALIGN_LEFT, -1, font_size, font_secondary_color);
} else {
viewport->draw_string(font, text_pos, vformat("%d units", roundf((length_vector / grid_step).length())), font_color);
viewport->draw_string(font, text_pos, TS->format_number(vformat("%d " + TTR("units"), roundf((length_vector / grid_step).length()))), HALIGN_LEFT, -1, font_size, font_color);
}
}
} else {
@ -3177,10 +3193,17 @@ void CanvasItemEditor::_draw_control_anchors(Control *control) {
// Draw the anchors handles
Rect2 anchor_rects[4];
anchor_rects[0] = Rect2(anchors_pos[0] - anchor_handle->get_size(), anchor_handle->get_size());
anchor_rects[1] = Rect2(anchors_pos[1] - Vector2(0.0, anchor_handle->get_size().y), Point2(-anchor_handle->get_size().x, anchor_handle->get_size().y));
anchor_rects[2] = Rect2(anchors_pos[2], -anchor_handle->get_size());
anchor_rects[3] = Rect2(anchors_pos[3] - Vector2(anchor_handle->get_size().x, 0.0), Point2(anchor_handle->get_size().x, -anchor_handle->get_size().y));
if (control->is_layout_rtl()) {
anchor_rects[0] = Rect2(anchors_pos[0] - Vector2(0.0, anchor_handle->get_size().y), Point2(-anchor_handle->get_size().x, anchor_handle->get_size().y));
anchor_rects[1] = Rect2(anchors_pos[1] - anchor_handle->get_size(), anchor_handle->get_size());
anchor_rects[2] = Rect2(anchors_pos[2] - Vector2(anchor_handle->get_size().x, 0.0), Point2(anchor_handle->get_size().x, -anchor_handle->get_size().y));
anchor_rects[3] = Rect2(anchors_pos[3], -anchor_handle->get_size());
} else {
anchor_rects[0] = Rect2(anchors_pos[0] - anchor_handle->get_size(), anchor_handle->get_size());
anchor_rects[1] = Rect2(anchors_pos[1] - Vector2(0.0, anchor_handle->get_size().y), Point2(-anchor_handle->get_size().x, anchor_handle->get_size().y));
anchor_rects[2] = Rect2(anchors_pos[2], -anchor_handle->get_size());
anchor_rects[3] = Rect2(anchors_pos[3] - Vector2(anchor_handle->get_size().x, 0.0), Point2(anchor_handle->get_size().x, -anchor_handle->get_size().y));
}
for (int i = 0; i < 4; i++) {
anchor_handle->draw_rect(ci, anchor_rects[i]);
@ -3744,6 +3767,7 @@ void CanvasItemEditor::_draw_hover() {
String node_name = hovering_results[i].name;
Ref<Font> font = get_theme_font("font", "Label");
int font_size = get_theme_font_size("font_size", "Label");
Size2 node_name_size = font->get_string_size(node_name);
Size2 item_size = Size2(node_icon->get_size().x + 4 + node_name_size.x, MAX(node_icon->get_size().y, node_name_size.y - 3));
@ -3761,7 +3785,7 @@ void CanvasItemEditor::_draw_hover() {
viewport->draw_texture(node_icon, pos, Color(1.0, 1.0, 1.0, 0.5));
// Draw name
viewport->draw_string(font, pos + Point2(node_icon->get_size().x + 4, item_size.y - 3), node_name, Color(1.0, 1.0, 1.0, 0.5));
viewport->draw_string(font, pos + Point2(node_icon->get_size().x + 4, item_size.y - 3), node_name, HALIGN_LEFT, -1, font_size, Color(1.0, 1.0, 1.0, 0.5));
}
}
@ -4342,8 +4366,13 @@ void CanvasItemEditor::_update_scrollbars() {
}
// Move and resize the scrollbars, avoiding overlap.
v_scroll->set_begin(Point2(size.width - vmin.width, (show_rulers) ? RULER_WIDTH : 0));
v_scroll->set_end(Point2(size.width, size.height - (h_scroll->is_visible() ? hmin.height : 0)));
if (is_layout_rtl()) {
v_scroll->set_begin(Point2(0, (show_rulers) ? RULER_WIDTH : 0));
v_scroll->set_end(Point2(vmin.width, size.height - (h_scroll->is_visible() ? hmin.height : 0)));
} else {
v_scroll->set_begin(Point2(size.width - vmin.width, (show_rulers) ? RULER_WIDTH : 0));
v_scroll->set_end(Point2(size.width, size.height - (h_scroll->is_visible() ? hmin.height : 0)));
}
h_scroll->set_begin(Point2((show_rulers) ? RULER_WIDTH : 0, size.height - hmin.height));
h_scroll->set_end(Point2(size.width - (v_scroll->is_visible() ? vmin.width : 0), size.height));
@ -4540,9 +4569,9 @@ void CanvasItemEditor::_update_zoom_label() {
// even if their display doesn't have a particularly low DPI.
if (zoom >= 10) {
// Don't show a decimal when the zoom level is higher than 1000 %.
zoom_text = rtos(Math::round((zoom / MAX(1, EDSCALE)) * 100)) + " %";
zoom_text = TS->format_number(rtos(Math::round((zoom / MAX(1, EDSCALE)) * 100))) + " " + TS->percent_sign();
} else {
zoom_text = rtos(Math::stepify((zoom / MAX(1, EDSCALE)) * 100, 0.1)) + " %";
zoom_text = TS->format_number(rtos(Math::stepify((zoom / MAX(1, EDSCALE)) * 100, 0.1))) + " " + TS->percent_sign();
}
zoom_reset->set_text(zoom_text);
@ -5703,6 +5732,7 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) {
warning_child_of_container->set_text(TTR("Warning: Children of a container get their position and size determined only by their parent."));
warning_child_of_container->add_theme_color_override("font_color", EditorNode::get_singleton()->get_gui_base()->get_theme_color("warning_color", "Editor"));
warning_child_of_container->add_theme_font_override("font", EditorNode::get_singleton()->get_gui_base()->get_theme_font("main", "EditorFonts"));
warning_child_of_container->add_theme_font_size_override("font_size", EditorNode::get_singleton()->get_gui_base()->get_theme_font_size("main_size", "EditorFonts"));
add_control_to_info_overlay(warning_child_of_container);
h_scroll = memnew(HScrollBar);
@ -5727,10 +5757,8 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) {
zoom_reset = memnew(Button);
zoom_reset->set_flat(true);
zoom_hb->add_child(zoom_reset);
Ref<DynamicFont> font = zoom_reset->get_theme_font("font")->duplicate(false);
font->set_outline_size(1);
font->set_outline_color(Color(0, 0, 0));
zoom_reset->add_theme_font_override("font", font);
zoom_reset->add_theme_constant_override("outline_size", 1);
zoom_reset->add_theme_color_override("font_outline_modulate", Color(0, 0, 0));
zoom_reset->add_theme_color_override("font_color", Color(1, 1, 1));
zoom_reset->connect("pressed", callable_mp(this, &CanvasItemEditor::_button_zoom_reset));
zoom_reset->set_shortcut(ED_SHORTCUT("canvas_item_editor/zoom_reset", TTR("Zoom Reset"), KEY_MASK_CMD | KEY_0));

View file

@ -518,7 +518,9 @@ void CurveEditor::set_hover_point_index(int index) {
void CurveEditor::update_view_transform() {
Ref<Font> font = get_theme_font("font", "Label");
const real_t margin = font->get_height() + 2 * EDSCALE;
int font_size = get_theme_font_size("font_size", "Label");
const real_t margin = font->get_height(font_size) + 2 * EDSCALE;
float min_y = 0;
float max_y = 1;
@ -662,18 +664,19 @@ void CurveEditor::_draw() {
draw_set_transform_matrix(Transform2D());
Ref<Font> font = get_theme_font("font", "Label");
float font_height = font->get_height();
int font_size = get_theme_font_size("font_size", "Label");
float font_height = font->get_height(font_size);
Color text_color = get_theme_color("font_color", "Editor");
{
// X axis
float y = curve.get_min_value();
Vector2 off(0, font_height - 1);
draw_string(font, get_view_pos(Vector2(0, y)) + off, "0.0", text_color);
draw_string(font, get_view_pos(Vector2(0.25, y)) + off, "0.25", text_color);
draw_string(font, get_view_pos(Vector2(0.5, y)) + off, "0.5", text_color);
draw_string(font, get_view_pos(Vector2(0.75, y)) + off, "0.75", text_color);
draw_string(font, get_view_pos(Vector2(1, y)) + off, "1.0", text_color);
draw_string(font, get_view_pos(Vector2(0, y)) + off, "0.0", HALIGN_LEFT, -1, font_size, text_color);
draw_string(font, get_view_pos(Vector2(0.25, y)) + off, "0.25", HALIGN_LEFT, -1, font_size, text_color);
draw_string(font, get_view_pos(Vector2(0.5, y)) + off, "0.5", HALIGN_LEFT, -1, font_size, text_color);
draw_string(font, get_view_pos(Vector2(0.75, y)) + off, "0.75", HALIGN_LEFT, -1, font_size, text_color);
draw_string(font, get_view_pos(Vector2(1, y)) + off, "1.0", HALIGN_LEFT, -1, font_size, text_color);
}
{
@ -682,9 +685,9 @@ void CurveEditor::_draw() {
float m1 = 0.5 * (curve.get_min_value() + curve.get_max_value());
float m2 = curve.get_max_value();
Vector2 off(1, -1);
draw_string(font, get_view_pos(Vector2(0, m0)) + off, String::num(m0, 2), text_color);
draw_string(font, get_view_pos(Vector2(0, m1)) + off, String::num(m1, 2), text_color);
draw_string(font, get_view_pos(Vector2(0, m2)) + off, String::num(m2, 3), text_color);
draw_string(font, get_view_pos(Vector2(0, m0)) + off, String::num(m0, 2), HALIGN_LEFT, -1, font_size, text_color);
draw_string(font, get_view_pos(Vector2(0, m1)) + off, String::num(m1, 2), HALIGN_LEFT, -1, font_size, text_color);
draw_string(font, get_view_pos(Vector2(0, m2)) + off, String::num(m2, 3), HALIGN_LEFT, -1, font_size, text_color);
}
// Draw tangents for current point
@ -744,10 +747,10 @@ void CurveEditor::_draw() {
if (_selected_point > 0 && _selected_point + 1 < curve.get_point_count()) {
text_color.a *= 0.4;
draw_string(font, Vector2(50 * EDSCALE, font_height), TTR("Hold Shift to edit tangents individually"), text_color);
draw_string(font, Vector2(50 * EDSCALE, font_height), TTR("Hold Shift to edit tangents individually"), HALIGN_LEFT, -1, font_size, text_color);
} else if (curve.get_point_count() == 0) {
text_color.a *= 0.4;
draw_string(font, Vector2(50 * EDSCALE, font_height), TTR("Right click to add point"), text_color);
draw_string(font, Vector2(50 * EDSCALE, font_height), TTR("Right click to add point"), HALIGN_LEFT, -1, font_size, text_color);
}
}

View file

@ -37,7 +37,7 @@
#include "editor/editor_scale.h"
#include "editor/editor_settings.h"
#include "scene/resources/bit_map.h"
#include "scene/resources/dynamic_font.h"
#include "scene/resources/font.h"
#include "scene/resources/material.h"
#include "scene/resources/mesh.h"
#include "servers/audio/audio_stream.h"
@ -798,25 +798,79 @@ void EditorFontPreviewPlugin::_bind_methods() {
}
bool EditorFontPreviewPlugin::handles(const String &p_type) const {
return ClassDB::is_parent_class(p_type, "DynamicFontData") || ClassDB::is_parent_class(p_type, "DynamicFont");
return ClassDB::is_parent_class(p_type, "FontData") || ClassDB::is_parent_class(p_type, "Font");
}
struct FSample {
String script;
String sample;
};
static FSample _samples[] = {
{ "hani", U"漢語" },
{ "armn", U"Աբ" },
{ "copt", U"Αα" },
{ "cyrl", U"Аб" },
{ "grek", U"Αα" },
{ "hebr", U"אב" },
{ "arab", U"اب" },
{ "syrc", U"ܐܒ" },
{ "thaa", U"ހށ" },
{ "deva", U"" },
{ "beng", U"" },
{ "guru", U"" },
{ "gujr", U"" },
{ "orya", U"" },
{ "taml", U"" },
{ "telu", U"" },
{ "knda", U"" },
{ "mylm", U"" },
{ "sinh", U"" },
{ "thai", U"กิ" },
{ "laoo", U"ກິ" },
{ "tibt", U"" },
{ "mymr", U"က" },
{ "geor", U"Ⴀა" },
{ "hang", U"한글" },
{ "ethi", U"" },
{ "cher", U"" },
{ "cans", U"" },
{ "ogam", U"" },
{ "runr", U"" },
{ "tglg", U"" },
{ "hano", U"" },
{ "buhd", U"" },
{ "tagb", U"" },
{ "khmr", U"" },
{ "mong", U"" },
{ "limb", U"" },
{ "tale", U"" },
{ "latn", U"Ab" },
{ "zyyy", U"😀" },
{ "", U"" }
};
Ref<Texture2D> EditorFontPreviewPlugin::generate_from_path(const String &p_path, const Size2 &p_size) const {
RES res = ResourceLoader::load(p_path);
Ref<DynamicFont> sampled_font;
if (res->is_class("DynamicFont")) {
Ref<Font> sampled_font;
if (res->is_class("Font")) {
sampled_font = res->duplicate();
if (sampled_font->get_outline_color() == Color(1, 1, 1, 1)) {
sampled_font->set_outline_color(Color(0, 0, 0, 1));
}
} else if (res->is_class("DynamicFontData")) {
} else if (res->is_class("FontData")) {
sampled_font.instance();
sampled_font->set_font_data(res);
sampled_font->add_data(res->duplicate());
}
sampled_font->set_size(50);
String sampled_text = "Abg";
Vector2 size = sampled_font->get_string_size(sampled_text);
String sample;
for (int j = 0; j < sampled_font->get_data_count(); j++) {
for (int i = 0; _samples[i].script != String(); i++) {
if (sampled_font->get_data(j)->is_script_supported(_samples[i].script)) {
if (sampled_font->get_data(j)->has_char(_samples[i].sample[0])) {
sample += _samples[i].sample;
}
}
}
}
Vector2 size = sampled_font->get_string_size(sample, 50);
Vector2 pos;
@ -825,7 +879,7 @@ Ref<Texture2D> EditorFontPreviewPlugin::generate_from_path(const String &p_path,
Ref<Font> font = sampled_font;
font->draw(canvas_item, pos, sampled_text);
font->draw_string(canvas_item, pos, sample, HALIGN_LEFT, -1.f, 50, Color(1, 1, 1));
preview_done = false;
RS::get_singleton()->viewport_set_update_mode(viewport, RS::VIEWPORT_UPDATE_ONCE); //once used for capture

View file

@ -0,0 +1,331 @@
/*************************************************************************/
/* font_editor_plugin.cpp */
/*************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
/* "Software"), to deal in the Software without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of the Software, and to */
/* permit persons to whom the Software is furnished to do so, subject to */
/* the following conditions: */
/* */
/* The above copyright notice and this permission notice shall be */
/* included in all copies or substantial portions of the Software. */
/* */
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
#include "font_editor_plugin.h"
#include "editor/editor_scale.h"
void FontDataPreview::_notification(int p_what) {
if (p_what == NOTIFICATION_DRAW) {
Color text_color = get_theme_color("font_color", "Label");
Color line_color = text_color;
line_color.a *= 0.6;
Vector2 pos = (get_size() - line->get_size()) / 2;
line->draw(get_canvas_item(), pos, text_color);
draw_line(Vector2(0, pos.y + line->get_line_ascent()), Vector2(pos.x - 5, pos.y + line->get_line_ascent()), line_color);
draw_line(Vector2(pos.x + line->get_size().x + 5, pos.y + line->get_line_ascent()), Vector2(get_size().x, pos.y + line->get_line_ascent()), line_color);
}
}
void FontDataPreview::_bind_methods() {}
Size2 FontDataPreview::get_minimum_size() const {
return Vector2(64, 64) * EDSCALE;
}
struct FSample {
String script;
String sample;
};
static FSample _samples[] = {
{ "hani", U"漢語" },
{ "armn", U"Աբ" },
{ "copt", U"Αα" },
{ "cyrl", U"Аб" },
{ "grek", U"Αα" },
{ "hebr", U"אב" },
{ "arab", U"اب" },
{ "syrc", U"ܐܒ" },
{ "thaa", U"ހށ" },
{ "deva", U"" },
{ "beng", U"" },
{ "guru", U"" },
{ "gujr", U"" },
{ "orya", U"" },
{ "taml", U"" },
{ "telu", U"" },
{ "knda", U"" },
{ "mylm", U"" },
{ "sinh", U"" },
{ "thai", U"กิ" },
{ "laoo", U"ກິ" },
{ "tibt", U"" },
{ "mymr", U"က" },
{ "geor", U"Ⴀა" },
{ "hang", U"한글" },
{ "ethi", U"" },
{ "cher", U"" },
{ "cans", U"" },
{ "ogam", U"" },
{ "runr", U"" },
{ "tglg", U"" },
{ "hano", U"" },
{ "buhd", U"" },
{ "tagb", U"" },
{ "khmr", U"" },
{ "mong", U"" },
{ "limb", U"" },
{ "tale", U"" },
{ "latn", U"Ab" },
{ "zyyy", U"😀" },
{ "", U"" }
};
void FontDataPreview::set_data(const Ref<FontData> &p_data) {
Ref<Font> f = memnew(Font);
f->add_data(p_data);
line->clear();
String sample;
for (int i = 0; _samples[i].script != String(); i++) {
if (p_data->is_script_supported(_samples[i].script)) {
if (p_data->has_char(_samples[i].sample[0])) {
sample += _samples[i].sample;
}
}
}
line->add_string(sample, f, 72);
update();
}
FontDataPreview::FontDataPreview() {
line.instance();
}
/*************************************************************************/
void FontDataEditor::_notification(int p_what) {
if (p_what == NOTIFICATION_SORT_CHILDREN) {
int split_width = get_name_split_ratio() * get_size().width;
button->set_size(Size2(get_theme_icon("Add", "EditorIcons")->get_width(), get_size().height));
if (is_layout_rtl()) {
if (le != nullptr) {
fit_child_in_rect(le, Rect2(Vector2(split_width, 0), Size2(split_width, get_size().height)));
}
fit_child_in_rect(chk, Rect2(Vector2(split_width - chk->get_size().x, 0), Size2(chk->get_size().x, get_size().height)));
fit_child_in_rect(button, Rect2(Vector2(0, 0), Size2(button->get_size().width, get_size().height)));
} else {
if (le != nullptr) {
fit_child_in_rect(le, Rect2(Vector2(0, 0), Size2(split_width, get_size().height)));
}
fit_child_in_rect(chk, Rect2(Vector2(split_width, 0), Size2(chk->get_size().x, get_size().height)));
fit_child_in_rect(button, Rect2(Vector2(get_size().width - button->get_size().width, 0), Size2(button->get_size().width, get_size().height)));
}
update();
}
if (p_what == NOTIFICATION_DRAW) {
int split_width = get_name_split_ratio() * get_size().width;
Color dark_color = get_theme_color("dark_color_2", "Editor");
if (is_layout_rtl()) {
draw_rect(Rect2(Vector2(0, 0), Size2(split_width, get_size().height)), dark_color);
} else {
draw_rect(Rect2(Vector2(split_width, 0), Size2(split_width, get_size().height)), dark_color);
}
}
if (p_what == NOTIFICATION_THEME_CHANGED) {
if (le != nullptr) {
button->set_icon(get_theme_icon("Add", "EditorIcons"));
} else {
button->set_icon(get_theme_icon("Remove", "EditorIcons"));
}
queue_sort();
}
if (p_what == NOTIFICATION_RESIZED) {
queue_sort();
}
}
void FontDataEditor::update_property() {
if (le == nullptr) {
bool c = get_edited_object()->get(get_edited_property());
chk->set_pressed(c);
chk->set_disabled(is_read_only());
}
}
Size2 FontDataEditor::get_minimum_size() const {
return Size2(0, 60);
}
void FontDataEditor::_bind_methods() {
}
void FontDataEditor::init_lang_add() {
le = memnew(LineEdit);
le->set_placeholder("Language code");
le->set_custom_minimum_size(Size2(get_size().width / 2, 0));
le->set_editable(true);
add_child(le);
button->set_icon(get_theme_icon("Add", "EditorIcons"));
button->connect("pressed", callable_mp(this, &FontDataEditor::add_lang));
}
void FontDataEditor::init_lang_edit() {
button->set_icon(get_theme_icon("Remove", "EditorIcons"));
button->connect("pressed", callable_mp(this, &FontDataEditor::remove_lang));
chk->connect("toggled", callable_mp(this, &FontDataEditor::toggle_lang));
}
void FontDataEditor::init_script_add() {
le = memnew(LineEdit);
le->set_placeholder("Script code");
le->set_custom_minimum_size(Size2(get_size().width / 2, 0));
le->set_editable(true);
add_child(le);
button->set_icon(get_theme_icon("Add", "EditorIcons"));
button->connect("pressed", callable_mp(this, &FontDataEditor::add_script));
}
void FontDataEditor::init_script_edit() {
button->set_icon(get_theme_icon("Remove", "EditorIcons"));
button->connect("pressed", callable_mp(this, &FontDataEditor::remove_script));
chk->connect("toggled", callable_mp(this, &FontDataEditor::toggle_script));
}
void FontDataEditor::add_lang() {
FontData *fd = Object::cast_to<FontData>(get_edited_object());
if (fd != nullptr && !le->get_text().empty()) {
fd->set_language_support_override(le->get_text(), chk->is_pressed());
le->set_text("");
chk->set_pressed(false);
}
}
void FontDataEditor::add_script() {
FontData *fd = Object::cast_to<FontData>(get_edited_object());
if (fd != nullptr && le->get_text().length() == 4) {
fd->set_script_support_override(le->get_text(), chk->is_pressed());
le->set_text("");
chk->set_pressed(false);
}
}
void FontDataEditor::toggle_lang(bool p_pressed) {
FontData *fd = Object::cast_to<FontData>(get_edited_object());
if (fd != nullptr) {
String lang = String(get_edited_property()).replace("language_support_override/", "");
fd->set_language_support_override(lang, p_pressed);
}
}
void FontDataEditor::toggle_script(bool p_pressed) {
FontData *fd = Object::cast_to<FontData>(get_edited_object());
if (fd != nullptr) {
String script = String(get_edited_property()).replace("script_support_override/", "");
fd->set_script_support_override(script, p_pressed);
}
}
void FontDataEditor::remove_lang() {
FontData *fd = Object::cast_to<FontData>(get_edited_object());
if (fd != nullptr) {
String lang = String(get_edited_property()).replace("language_support_override/", "");
fd->remove_language_support_override(lang);
}
}
void FontDataEditor::remove_script() {
FontData *fd = Object::cast_to<FontData>(get_edited_object());
if (fd != nullptr) {
String script = String(get_edited_property()).replace("script_support_override/", "");
fd->remove_script_support_override(script);
}
}
FontDataEditor::FontDataEditor() {
chk = memnew(CheckBox);
chk->set_text(TTR("On"));
chk->set_flat(true);
add_child(chk);
button = memnew(Button);
button->set_flat(true);
add_child(button);
}
/*************************************************************************/
bool EditorInspectorPluginFont::can_handle(Object *p_object) {
return Object::cast_to<FontData>(p_object) != nullptr;
}
void EditorInspectorPluginFont::parse_begin(Object *p_object) {
FontData *fd = Object::cast_to<FontData>(p_object);
ERR_FAIL_COND(!fd);
FontDataPreview *editor = memnew(FontDataPreview);
editor->set_data(fd);
add_custom_control(editor);
}
bool EditorInspectorPluginFont::parse_property(Object *p_object, Variant::Type p_type, const String &p_path, PropertyHint p_hint, const String &p_hint_text, int p_usage, bool p_wide) {
if (p_path.begins_with("language_support_override/") && p_object->is_class("FontData")) {
String lang = p_path.replace("language_support_override/", "");
FontDataEditor *editor = memnew(FontDataEditor);
if (lang != "_new") {
editor->init_lang_edit();
} else {
editor->init_lang_add();
}
add_property_editor(p_path, editor);
return true;
}
if (p_path.begins_with("script_support_override/") && p_object->is_class("FontData")) {
String script = p_path.replace("script_support_override/", "");
FontDataEditor *editor = memnew(FontDataEditor);
if (script != "_new") {
editor->init_script_edit();
} else {
editor->init_script_add();
}
add_property_editor(p_path, editor);
return true;
}
return false;
}
/*************************************************************************/
FontEditorPlugin::FontEditorPlugin(EditorNode *p_node) {
Ref<EditorInspectorPluginFont> fd_plugin;
fd_plugin.instance();
EditorInspector::add_inspector_plugin(fd_plugin);
}

View file

@ -0,0 +1,111 @@
/*************************************************************************/
/* font_editor_plugin.h */
/*************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
/* Copyright (c) 2007-2020 Juan Linietsky, Ariel Manzur. */
/* Copyright (c) 2014-2020 Godot Engine contributors (cf. AUTHORS.md). */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
/* "Software"), to deal in the Software without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of the Software, and to */
/* permit persons to whom the Software is furnished to do so, subject to */
/* the following conditions: */
/* */
/* The above copyright notice and this permission notice shall be */
/* included in all copies or substantial portions of the Software. */
/* */
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
#ifndef FONT_EDITOR_PLUGIN_H
#define FONT_EDITOR_PLUGIN_H
#include "editor/editor_node.h"
#include "editor/editor_plugin.h"
#include "scene/resources/font.h"
#include "scene/resources/text_line.h"
class FontDataPreview : public Control {
GDCLASS(FontDataPreview, Control);
protected:
void _notification(int p_what);
static void _bind_methods();
Ref<TextLine> line;
public:
virtual Size2 get_minimum_size() const override;
void set_data(const Ref<FontData> &p_data);
FontDataPreview();
};
/*************************************************************************/
class FontDataEditor : public EditorProperty {
GDCLASS(FontDataEditor, EditorProperty);
LineEdit *le = nullptr;
CheckBox *chk = nullptr;
Button *button = nullptr;
void toggle_lang(bool p_pressed);
void toggle_script(bool p_pressed);
void add_lang();
void add_script();
void remove_lang();
void remove_script();
protected:
void _notification(int p_what);
static void _bind_methods();
public:
virtual Size2 get_minimum_size() const override;
virtual void update_property() override;
void init_lang_add();
void init_lang_edit();
void init_script_add();
void init_script_edit();
FontDataEditor();
};
/*************************************************************************/
class EditorInspectorPluginFont : public EditorInspectorPlugin {
GDCLASS(EditorInspectorPluginFont, EditorInspectorPlugin);
public:
virtual bool can_handle(Object *p_object) override;
virtual void parse_begin(Object *p_object) override;
virtual bool parse_property(Object *p_object, Variant::Type p_type, const String &p_path, PropertyHint p_hint, const String &p_hint_text, int p_usage, bool p_wide) override;
};
/*************************************************************************/
class FontEditorPlugin : public EditorPlugin {
GDCLASS(FontEditorPlugin, EditorPlugin);
public:
FontEditorPlugin(EditorNode *p_node);
virtual String get_name() const override { return "Font"; }
};
#endif // FONT_EDITOR_PLUGIN_H

View file

@ -138,7 +138,7 @@ void ViewportRotationControl::_draw_axis(const Axis2D &p_axis) {
if (front) {
String axis_name = direction == 0 ? "X" : (direction == 1 ? "Y" : "Z");
draw_circle(p_axis.screen_point, AXIS_CIRCLE_RADIUS, c);
draw_char(get_theme_font("rotation_control", "EditorFonts"), p_axis.screen_point + Vector2i(-4, 5) * EDSCALE, axis_name, "", Color(0.3, 0.3, 0.3));
draw_char(get_theme_font("rotation_control", "EditorFonts"), p_axis.screen_point + Vector2i(-4, 5) * EDSCALE, axis_name, "", get_theme_font_size("rotation_control_size", "EditorFonts"), Color(0.3, 0.3, 0.3));
} else {
draw_circle(p_axis.screen_point, AXIS_CIRCLE_RADIUS * (0.55 + (0.2 * (1.0 + p_axis.z_axis))), c);
}
@ -2593,7 +2593,7 @@ void Node3DEditorViewport::_notification(int p_what) {
}
}
static void draw_indicator_bar(Control &surface, real_t fill, const Ref<Texture2D> icon, const Ref<Font> font, const String &text) {
static void draw_indicator_bar(Control &surface, real_t fill, const Ref<Texture2D> icon, const Ref<Font> font, int font_size, const String &text) {
// Adjust bar size from control height
const Vector2 surface_size = surface.get_size();
const real_t h = surface_size.y / 2.0;
@ -2613,7 +2613,7 @@ static void draw_indicator_bar(Control &surface, real_t fill, const Ref<Texture2
surface.draw_texture(icon, icon_pos);
// Draw text below the bar (for speed/zoom information).
surface.draw_string(font, Vector2(icon_pos.x, icon_pos.y + icon_size.y + 16 * EDSCALE), text);
surface.draw_string(font, Vector2(icon_pos.x, icon_pos.y + icon_size.y + 16 * EDSCALE), text, HALIGN_LEFT, -1.f, font_size);
}
void Node3DEditorViewport::_draw() {
@ -2651,10 +2651,11 @@ void Node3DEditorViewport::_draw() {
if (message_time > 0) {
Ref<Font> font = get_theme_font("font", "Label");
int font_size = get_theme_font_size("font_size", "Label");
Point2 msgpos = Point2(5, get_size().y - 20);
font->draw(ci, msgpos + Point2(1, 1), message, Color(0, 0, 0, 0.8));
font->draw(ci, msgpos + Point2(-1, -1), message, Color(0, 0, 0, 0.8));
font->draw(ci, msgpos, message, Color(1, 1, 1, 1));
font->draw_string(ci, msgpos + Point2(1, 1), message, HALIGN_LEFT, -1, font_size, Color(0, 0, 0, 0.8));
font->draw_string(ci, msgpos + Point2(-1, -1), message, HALIGN_LEFT, -1, font_size, Color(0, 0, 0, 0.8));
font->draw_string(ci, msgpos, message, HALIGN_LEFT, -1, font_size, Color(1, 1, 1, 1));
}
if (_edit.mode == TRANSFORM_ROTATE) {
@ -2717,6 +2718,7 @@ void Node3DEditorViewport::_draw() {
1.0 - logscale_t,
get_theme_icon("ViewportSpeed", "EditorIcons"),
get_theme_font("font", "Label"),
get_theme_font_size("font_size", "Label"),
vformat("%s u/s", String::num(freelook_speed).pad_decimals(precision)));
}
@ -2743,6 +2745,7 @@ void Node3DEditorViewport::_draw() {
logscale_t,
get_theme_icon("ViewportZoom", "EditorIcons"),
get_theme_font("font", "Label"),
get_theme_font_size("font_size", "Label"),
vformat("%s u", String::num(cursor.distance).pad_decimals(precision)));
}
}

Some files were not shown because too many files have changed in this diff Show more