|
@@ -31,6 +31,7 @@
|
|
|
#include "label.h"
|
|
|
|
|
|
#include "core/config/project_settings.h"
|
|
|
+#include "core/core_string_names.h"
|
|
|
#include "core/string/print_string.h"
|
|
|
#include "core/string/translation.h"
|
|
|
|
|
@@ -64,7 +65,7 @@ bool Label::is_uppercase() const {
|
|
|
}
|
|
|
|
|
|
int Label::get_line_height(int p_line) const {
|
|
|
- Ref<Font> font = get_theme_font(SNAME("font"));
|
|
|
+ Ref<Font> font = (settings.is_valid() && settings->get_font().is_valid()) ? settings->get_font() : get_theme_font(SNAME("font"));
|
|
|
if (p_line >= 0 && p_line < lines_rid.size()) {
|
|
|
return TS->shaped_text_get_size(lines_rid[p_line]).y;
|
|
|
} else if (lines_rid.size() > 0) {
|
|
@@ -74,7 +75,8 @@ int Label::get_line_height(int p_line) const {
|
|
|
}
|
|
|
return h;
|
|
|
} else {
|
|
|
- return font->get_height(get_theme_font_size(SNAME("font_size")));
|
|
|
+ int font_size = settings.is_valid() ? settings->get_font_size() : get_theme_font_size(SNAME("font_size"));
|
|
|
+ return font->get_height(font_size);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -91,8 +93,8 @@ void Label::_shape() {
|
|
|
} else {
|
|
|
TS->shaped_text_set_direction(text_rid, (TextServer::Direction)text_direction);
|
|
|
}
|
|
|
- const Ref<Font> &font = get_theme_font(SNAME("font"));
|
|
|
- int font_size = get_theme_font_size(SNAME("font_size"));
|
|
|
+ const Ref<Font> &font = (settings.is_valid() && settings->get_font().is_valid()) ? settings->get_font() : get_theme_font(SNAME("font"));
|
|
|
+ int font_size = settings.is_valid() ? settings->get_font_size() : get_theme_font_size(SNAME("font_size"));
|
|
|
ERR_FAIL_COND(font.is_null());
|
|
|
String text = (uppercase) ? TS->string_to_upper(xl_text, language) : xl_text;
|
|
|
if (visible_chars >= 0 && visible_chars_behavior == TextServer::VC_CHARS_BEFORE_SHAPING) {
|
|
@@ -223,9 +225,8 @@ void Label::_shape() {
|
|
|
}
|
|
|
|
|
|
void Label::_update_visible() {
|
|
|
- int line_spacing = get_theme_constant(SNAME("line_spacing"), SNAME("Label"));
|
|
|
+ int line_spacing = settings.is_valid() ? settings->get_line_spacing() : get_theme_constant(SNAME("line_spacing"), SNAME("Label"));
|
|
|
Ref<StyleBox> style = get_theme_stylebox(SNAME("normal"), SNAME("Label"));
|
|
|
- Ref<Font> font = get_theme_font(SNAME("font"));
|
|
|
int lines_visible = lines_rid.size();
|
|
|
|
|
|
if (max_lines_visible >= 0 && lines_visible > max_lines_visible) {
|
|
@@ -295,17 +296,19 @@ void Label::_notification(int p_what) {
|
|
|
|
|
|
RID ci = get_canvas_item();
|
|
|
|
|
|
+ bool has_settings = settings.is_valid();
|
|
|
+
|
|
|
Size2 string_size;
|
|
|
Size2 size = get_size();
|
|
|
Ref<StyleBox> style = get_theme_stylebox(SNAME("normal"));
|
|
|
- Ref<Font> font = get_theme_font(SNAME("font"));
|
|
|
- Color font_color = get_theme_color(SNAME("font_color"));
|
|
|
- Color font_shadow_color = get_theme_color(SNAME("font_shadow_color"));
|
|
|
- Point2 shadow_ofs(get_theme_constant(SNAME("shadow_offset_x")), get_theme_constant(SNAME("shadow_offset_y")));
|
|
|
- int line_spacing = get_theme_constant(SNAME("line_spacing"));
|
|
|
- Color font_outline_color = get_theme_color(SNAME("font_outline_color"));
|
|
|
- int outline_size = get_theme_constant(SNAME("outline_size"));
|
|
|
- int shadow_outline_size = get_theme_constant(SNAME("shadow_outline_size"));
|
|
|
+ Ref<Font> font = (has_settings && settings->get_font().is_valid()) ? settings->get_font() : get_theme_font(SNAME("font"));
|
|
|
+ Color font_color = has_settings ? settings->get_font_color() : get_theme_color(SNAME("font_color"));
|
|
|
+ Color font_shadow_color = has_settings ? settings->get_shadow_color() : get_theme_color(SNAME("font_shadow_color"));
|
|
|
+ Point2 shadow_ofs = has_settings ? settings->get_shadow_offset() : Point2(get_theme_constant(SNAME("shadow_offset_x")), get_theme_constant(SNAME("shadow_offset_y")));
|
|
|
+ int line_spacing = has_settings ? settings->get_line_spacing() : get_theme_constant(SNAME("line_spacing"));
|
|
|
+ Color font_outline_color = has_settings ? settings->get_outline_color() : get_theme_color(SNAME("font_outline_color"));
|
|
|
+ int outline_size = has_settings ? settings->get_outline_size() : get_theme_constant(SNAME("outline_size"));
|
|
|
+ int shadow_outline_size = has_settings ? settings->get_shadow_size() : get_theme_constant(SNAME("shadow_outline_size"));
|
|
|
bool rtl = (TS->shaped_text_get_inferred_direction(text_rid) == TextServer::DIRECTION_RTL);
|
|
|
bool rtl_layout = is_layout_rtl();
|
|
|
|
|
@@ -552,8 +555,10 @@ Size2 Label::get_minimum_size() const {
|
|
|
|
|
|
Size2 min_size = minsize;
|
|
|
|
|
|
- Ref<Font> font = get_theme_font(SNAME("font"));
|
|
|
- min_size.height = MAX(min_size.height, font->get_height(get_theme_font_size(SNAME("font_size"))));
|
|
|
+ const Ref<Font> &font = (settings.is_valid() && settings->get_font().is_valid()) ? settings->get_font() : get_theme_font(SNAME("font"));
|
|
|
+ int font_size = settings.is_valid() ? settings->get_font_size() : get_theme_font_size(SNAME("font_size"));
|
|
|
+
|
|
|
+ min_size.height = MAX(min_size.height, font->get_height(font_size) + font->get_spacing(TextServer::SPACING_TOP) + font->get_spacing(TextServer::SPACING_BOTTOM));
|
|
|
|
|
|
Size2 min_style = get_theme_stylebox(SNAME("normal"))->get_minimum_size();
|
|
|
if (autowrap_mode != TextServer::AUTOWRAP_OFF) {
|
|
@@ -578,9 +583,8 @@ int Label::get_line_count() const {
|
|
|
}
|
|
|
|
|
|
int Label::get_visible_line_count() const {
|
|
|
- Ref<Font> font = get_theme_font(SNAME("font"));
|
|
|
Ref<StyleBox> style = get_theme_stylebox(SNAME("normal"));
|
|
|
- int line_spacing = get_theme_constant(SNAME("line_spacing"));
|
|
|
+ int line_spacing = settings.is_valid() ? settings->get_line_spacing() : get_theme_constant(SNAME("line_spacing"));
|
|
|
int lines_visible = 0;
|
|
|
float total_h = 0.0;
|
|
|
for (int64_t i = lines_skipped; i < lines_rid.size(); i++) {
|
|
@@ -641,6 +645,28 @@ void Label::set_text(const String &p_string) {
|
|
|
update_minimum_size();
|
|
|
}
|
|
|
|
|
|
+void Label::_invalidate() {
|
|
|
+ font_dirty = true;
|
|
|
+ update();
|
|
|
+}
|
|
|
+
|
|
|
+void Label::set_label_settings(const Ref<LabelSettings> &p_settings) {
|
|
|
+ if (settings != p_settings) {
|
|
|
+ if (settings.is_valid()) {
|
|
|
+ settings->disconnect(CoreStringNames::get_singleton()->changed, callable_mp(this, &Label::_invalidate));
|
|
|
+ }
|
|
|
+ settings = p_settings;
|
|
|
+ if (settings.is_valid()) {
|
|
|
+ settings->connect(CoreStringNames::get_singleton()->changed, callable_mp(this, &Label::_invalidate), varray(), CONNECT_REFERENCE_COUNTED);
|
|
|
+ }
|
|
|
+ _invalidate();
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+Ref<LabelSettings> Label::get_label_settings() const {
|
|
|
+ return settings;
|
|
|
+}
|
|
|
+
|
|
|
void Label::set_text_direction(Control::TextDirection p_text_direction) {
|
|
|
ERR_FAIL_COND((int)p_text_direction < -1 || (int)p_text_direction > 3);
|
|
|
if (text_direction != p_text_direction) {
|
|
@@ -804,6 +830,8 @@ void Label::_bind_methods() {
|
|
|
ClassDB::bind_method(D_METHOD("get_vertical_alignment"), &Label::get_vertical_alignment);
|
|
|
ClassDB::bind_method(D_METHOD("set_text", "text"), &Label::set_text);
|
|
|
ClassDB::bind_method(D_METHOD("get_text"), &Label::get_text);
|
|
|
+ ClassDB::bind_method(D_METHOD("set_label_settings", "settings"), &Label::set_label_settings);
|
|
|
+ ClassDB::bind_method(D_METHOD("get_label_settings"), &Label::get_label_settings);
|
|
|
ClassDB::bind_method(D_METHOD("set_text_direction", "direction"), &Label::set_text_direction);
|
|
|
ClassDB::bind_method(D_METHOD("get_text_direction"), &Label::get_text_direction);
|
|
|
ClassDB::bind_method(D_METHOD("set_language", "language"), &Label::set_language);
|
|
@@ -836,6 +864,7 @@ void Label::_bind_methods() {
|
|
|
ClassDB::bind_method(D_METHOD("get_structured_text_bidi_override_options"), &Label::get_structured_text_bidi_override_options);
|
|
|
|
|
|
ADD_PROPERTY(PropertyInfo(Variant::STRING, "text", PROPERTY_HINT_MULTILINE_TEXT, "", PROPERTY_USAGE_DEFAULT_INTL), "set_text", "get_text");
|
|
|
+ ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "label_settings", PROPERTY_HINT_RESOURCE_TYPE, "LabelSettings"), "set_label_settings", "get_label_settings");
|
|
|
ADD_PROPERTY(PropertyInfo(Variant::INT, "horizontal_alignment", PROPERTY_HINT_ENUM, "Left,Center,Right,Fill"), "set_horizontal_alignment", "get_horizontal_alignment");
|
|
|
ADD_PROPERTY(PropertyInfo(Variant::INT, "vertical_alignment", PROPERTY_HINT_ENUM, "Top,Center,Bottom,Fill"), "set_vertical_alignment", "get_vertical_alignment");
|
|
|
ADD_PROPERTY(PropertyInfo(Variant::INT, "autowrap_mode", PROPERTY_HINT_ENUM, "Off,Arbitrary,Word,Word (Smart)"), "set_autowrap_mode", "get_autowrap_mode");
|