2014-02-10 09:10:30 +08:00
/*************************************************************************/
/* theme.cpp */
/*************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
2017-08-27 20:16:55 +08:00
/* https://godotengine.org */
2014-02-10 09:10:30 +08:00
/*************************************************************************/
2021-01-02 03:13:46 +08:00
/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur. */
/* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md). */
2014-02-10 09:10:30 +08:00
/* */
/* 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. */
/*************************************************************************/
2018-01-05 07:50:27 +08:00
2014-02-10 09:10:30 +08:00
# include "theme.h"
2021-06-11 20:51:48 +08:00
# include "core/io/file_access.h"
2020-11-08 06:33:38 +08:00
# include "core/string/print_string.h"
2014-02-10 09:10:30 +08:00
2016-06-18 03:00:27 +08:00
void Theme : : _emit_theme_changed ( ) {
2021-05-31 22:28:02 +08:00
if ( no_change_propagation ) {
return ;
}
notify_property_list_changed ( ) ;
2016-06-18 03:00:27 +08:00
emit_changed ( ) ;
}
2021-03-31 01:16:33 +08:00
Vector < String > Theme : : _get_icon_list ( const String & p_theme_type ) const {
2020-02-18 05:06:54 +08:00
Vector < String > ilret ;
2019-10-23 10:08:23 +08:00
List < StringName > il ;
2021-03-31 01:16:33 +08:00
get_icon_list ( p_theme_type , & il ) ;
2019-10-23 10:08:23 +08:00
ilret . resize ( il . size ( ) ) ;
2019-11-09 07:13:28 +08:00
int i = 0 ;
2020-02-18 05:06:54 +08:00
String * w = ilret . ptrw ( ) ;
2019-11-09 07:13:28 +08:00
for ( List < StringName > : : Element * E = il . front ( ) ; E ; E = E - > next ( ) , i + + ) {
w [ i ] = E - > get ( ) ;
2019-10-23 10:08:23 +08:00
}
return ilret ;
}
2020-04-10 22:50:28 +08:00
Vector < String > Theme : : _get_icon_type_list ( ) const {
Vector < String > ilret ;
List < StringName > il ;
get_icon_type_list ( & il ) ;
ilret . resize ( il . size ( ) ) ;
int i = 0 ;
String * w = ilret . ptrw ( ) ;
for ( List < StringName > : : Element * E = il . front ( ) ; E ; E = E - > next ( ) , i + + ) {
w [ i ] = E - > get ( ) ;
}
return ilret ;
}
2021-03-31 01:16:33 +08:00
Vector < String > Theme : : _get_stylebox_list ( const String & p_theme_type ) const {
2020-02-18 05:06:54 +08:00
Vector < String > ilret ;
2019-10-23 10:08:23 +08:00
List < StringName > il ;
2021-03-31 01:16:33 +08:00
get_stylebox_list ( p_theme_type , & il ) ;
2019-10-23 10:08:23 +08:00
ilret . resize ( il . size ( ) ) ;
2019-11-09 07:13:28 +08:00
int i = 0 ;
2020-02-18 05:06:54 +08:00
String * w = ilret . ptrw ( ) ;
2019-11-09 07:13:28 +08:00
for ( List < StringName > : : Element * E = il . front ( ) ; E ; E = E - > next ( ) , i + + ) {
w [ i ] = E - > get ( ) ;
2019-10-23 10:08:23 +08:00
}
return ilret ;
}
2020-04-10 22:50:28 +08:00
Vector < String > Theme : : _get_stylebox_type_list ( ) const {
2020-02-18 05:06:54 +08:00
Vector < String > ilret ;
2019-10-23 10:08:23 +08:00
List < StringName > il ;
2020-04-10 22:50:28 +08:00
get_stylebox_type_list ( & il ) ;
2019-10-23 10:08:23 +08:00
ilret . resize ( il . size ( ) ) ;
2019-11-09 07:13:28 +08:00
int i = 0 ;
2020-02-18 05:06:54 +08:00
String * w = ilret . ptrw ( ) ;
2019-11-09 07:13:28 +08:00
for ( List < StringName > : : Element * E = il . front ( ) ; E ; E = E - > next ( ) , i + + ) {
w [ i ] = E - > get ( ) ;
2019-10-23 10:08:23 +08:00
}
return ilret ;
}
2021-03-31 01:16:33 +08:00
Vector < String > Theme : : _get_font_list ( const String & p_theme_type ) const {
2020-02-18 05:06:54 +08:00
Vector < String > ilret ;
2019-10-23 10:08:23 +08:00
List < StringName > il ;
2021-03-31 01:16:33 +08:00
get_font_list ( p_theme_type , & il ) ;
2019-10-23 10:08:23 +08:00
ilret . resize ( il . size ( ) ) ;
2019-11-09 07:13:28 +08:00
int i = 0 ;
2020-02-18 05:06:54 +08:00
String * w = ilret . ptrw ( ) ;
2019-11-09 07:13:28 +08:00
for ( List < StringName > : : Element * E = il . front ( ) ; E ; E = E - > next ( ) , i + + ) {
w [ i ] = E - > get ( ) ;
2019-10-23 10:08:23 +08:00
}
return ilret ;
}
2020-04-10 22:50:28 +08:00
Vector < String > Theme : : _get_font_type_list ( ) const {
Vector < String > ilret ;
List < StringName > il ;
get_font_type_list ( & il ) ;
ilret . resize ( il . size ( ) ) ;
int i = 0 ;
String * w = ilret . ptrw ( ) ;
for ( List < StringName > : : Element * E = il . front ( ) ; E ; E = E - > next ( ) , i + + ) {
w [ i ] = E - > get ( ) ;
}
return ilret ;
}
2021-03-31 01:16:33 +08:00
Vector < String > Theme : : _get_font_size_list ( const String & p_theme_type ) const {
2020-09-03 19:22:16 +08:00
Vector < String > ilret ;
List < StringName > il ;
2021-03-31 01:16:33 +08:00
get_font_size_list ( p_theme_type , & il ) ;
2020-09-03 19:22:16 +08:00
ilret . resize ( il . size ( ) ) ;
int i = 0 ;
String * w = ilret . ptrw ( ) ;
for ( List < StringName > : : Element * E = il . front ( ) ; E ; E = E - > next ( ) , i + + ) {
w [ i ] = E - > get ( ) ;
}
return ilret ;
}
2021-03-22 19:35:58 +08:00
Vector < String > Theme : : _get_font_size_type_list ( ) const {
Vector < String > ilret ;
List < StringName > il ;
get_font_size_type_list ( & il ) ;
ilret . resize ( il . size ( ) ) ;
int i = 0 ;
String * w = ilret . ptrw ( ) ;
for ( List < StringName > : : Element * E = il . front ( ) ; E ; E = E - > next ( ) , i + + ) {
w [ i ] = E - > get ( ) ;
}
return ilret ;
}
2021-03-31 01:16:33 +08:00
Vector < String > Theme : : _get_color_list ( const String & p_theme_type ) const {
2020-02-18 05:06:54 +08:00
Vector < String > ilret ;
2019-10-23 10:08:23 +08:00
List < StringName > il ;
2021-03-31 01:16:33 +08:00
get_color_list ( p_theme_type , & il ) ;
2019-10-23 10:08:23 +08:00
ilret . resize ( il . size ( ) ) ;
2019-11-09 07:13:28 +08:00
int i = 0 ;
2020-02-18 05:06:54 +08:00
String * w = ilret . ptrw ( ) ;
2019-11-09 07:13:28 +08:00
for ( List < StringName > : : Element * E = il . front ( ) ; E ; E = E - > next ( ) , i + + ) {
w [ i ] = E - > get ( ) ;
2019-10-23 10:08:23 +08:00
}
return ilret ;
}
2020-04-10 22:50:28 +08:00
Vector < String > Theme : : _get_color_type_list ( ) const {
Vector < String > ilret ;
List < StringName > il ;
get_color_type_list ( & il ) ;
ilret . resize ( il . size ( ) ) ;
int i = 0 ;
String * w = ilret . ptrw ( ) ;
for ( List < StringName > : : Element * E = il . front ( ) ; E ; E = E - > next ( ) , i + + ) {
w [ i ] = E - > get ( ) ;
}
return ilret ;
}
2021-03-31 01:16:33 +08:00
Vector < String > Theme : : _get_constant_list ( const String & p_theme_type ) const {
2020-02-18 05:06:54 +08:00
Vector < String > ilret ;
2019-10-23 10:08:23 +08:00
List < StringName > il ;
2021-03-31 01:16:33 +08:00
get_constant_list ( p_theme_type , & il ) ;
2019-10-23 10:08:23 +08:00
ilret . resize ( il . size ( ) ) ;
2019-11-09 07:13:28 +08:00
int i = 0 ;
2020-02-18 05:06:54 +08:00
String * w = ilret . ptrw ( ) ;
2019-11-09 07:13:28 +08:00
for ( List < StringName > : : Element * E = il . front ( ) ; E ; E = E - > next ( ) , i + + ) {
w [ i ] = E - > get ( ) ;
2019-10-23 10:08:23 +08:00
}
return ilret ;
}
2020-04-10 22:50:28 +08:00
Vector < String > Theme : : _get_constant_type_list ( ) const {
Vector < String > ilret ;
List < StringName > il ;
get_constant_type_list ( & il ) ;
ilret . resize ( il . size ( ) ) ;
int i = 0 ;
String * w = ilret . ptrw ( ) ;
for ( List < StringName > : : Element * E = il . front ( ) ; E ; E = E - > next ( ) , i + + ) {
w [ i ] = E - > get ( ) ;
}
return ilret ;
}
2021-03-31 01:16:33 +08:00
Vector < String > Theme : : _get_theme_item_list ( DataType p_data_type , const String & p_theme_type ) const {
2021-03-22 19:35:58 +08:00
switch ( p_data_type ) {
case DATA_TYPE_COLOR :
2021-03-31 01:16:33 +08:00
return _get_color_list ( p_theme_type ) ;
2021-03-22 19:35:58 +08:00
case DATA_TYPE_CONSTANT :
2021-03-31 01:16:33 +08:00
return _get_constant_list ( p_theme_type ) ;
2021-03-22 19:35:58 +08:00
case DATA_TYPE_FONT :
2021-03-31 01:16:33 +08:00
return _get_font_list ( p_theme_type ) ;
2021-03-22 19:35:58 +08:00
case DATA_TYPE_FONT_SIZE :
2021-03-31 01:16:33 +08:00
return _get_font_size_list ( p_theme_type ) ;
2021-03-22 19:35:58 +08:00
case DATA_TYPE_ICON :
2021-03-31 01:16:33 +08:00
return _get_icon_list ( p_theme_type ) ;
2021-03-22 19:35:58 +08:00
case DATA_TYPE_STYLEBOX :
2021-03-31 01:16:33 +08:00
return _get_stylebox_list ( p_theme_type ) ;
2021-03-22 19:35:58 +08:00
case DATA_TYPE_MAX :
break ; // Can't happen, but silences warning.
}
return Vector < String > ( ) ;
}
Vector < String > Theme : : _get_theme_item_type_list ( DataType p_data_type ) const {
switch ( p_data_type ) {
case DATA_TYPE_COLOR :
return _get_color_type_list ( ) ;
case DATA_TYPE_CONSTANT :
return _get_constant_type_list ( ) ;
case DATA_TYPE_FONT :
return _get_font_type_list ( ) ;
case DATA_TYPE_FONT_SIZE :
return _get_font_size_type_list ( ) ;
case DATA_TYPE_ICON :
return _get_icon_type_list ( ) ;
case DATA_TYPE_STYLEBOX :
return _get_stylebox_type_list ( ) ;
case DATA_TYPE_MAX :
break ; // Can't happen, but silences warning.
}
return Vector < String > ( ) ;
}
2020-04-10 22:50:28 +08:00
Vector < String > Theme : : _get_type_list ( ) const {
2020-02-18 05:06:54 +08:00
Vector < String > ilret ;
2019-10-23 10:08:23 +08:00
List < StringName > il ;
get_type_list ( & il ) ;
ilret . resize ( il . size ( ) ) ;
2019-11-09 07:13:28 +08:00
int i = 0 ;
2020-02-18 05:06:54 +08:00
String * w = ilret . ptrw ( ) ;
2019-11-09 07:13:28 +08:00
for ( List < StringName > : : Element * E = il . front ( ) ; E ; E = E - > next ( ) , i + + ) {
w [ i ] = E - > get ( ) ;
2019-10-23 10:08:23 +08:00
}
return ilret ;
}
2017-03-05 23:44:50 +08:00
bool Theme : : _set ( const StringName & p_name , const Variant & p_value ) {
String sname = p_name ;
2014-02-10 09:10:30 +08:00
2017-03-05 23:44:50 +08:00
if ( sname . find ( " / " ) ! = - 1 ) {
String type = sname . get_slicec ( ' / ' , 1 ) ;
2021-03-31 01:16:33 +08:00
String theme_type = sname . get_slicec ( ' / ' , 0 ) ;
2017-03-05 23:44:50 +08:00
String name = sname . get_slicec ( ' / ' , 2 ) ;
2014-02-10 09:10:30 +08:00
2017-03-05 23:44:50 +08:00
if ( type = = " icons " ) {
2021-03-31 01:16:33 +08:00
set_icon ( name , theme_type , p_value ) ;
2017-03-05 23:44:50 +08:00
} else if ( type = = " styles " ) {
2021-03-31 01:16:33 +08:00
set_stylebox ( name , theme_type , p_value ) ;
2017-03-05 23:44:50 +08:00
} else if ( type = = " fonts " ) {
2021-03-31 01:16:33 +08:00
set_font ( name , theme_type , p_value ) ;
2017-03-05 23:44:50 +08:00
} else if ( type = = " colors " ) {
2021-03-31 01:16:33 +08:00
set_color ( name , theme_type , p_value ) ;
2017-03-05 23:44:50 +08:00
} else if ( type = = " constants " ) {
2021-03-31 01:16:33 +08:00
set_constant ( name , theme_type , p_value ) ;
2020-05-14 22:41:43 +08:00
} else {
2014-02-10 09:10:30 +08:00
return false ;
2020-05-14 22:41:43 +08:00
}
2014-02-10 09:10:30 +08:00
return true ;
}
return false ;
}
2017-03-05 23:44:50 +08:00
bool Theme : : _get ( const StringName & p_name , Variant & r_ret ) const {
String sname = p_name ;
2014-02-10 09:10:30 +08:00
2017-03-05 23:44:50 +08:00
if ( sname . find ( " / " ) ! = - 1 ) {
String type = sname . get_slicec ( ' / ' , 1 ) ;
2021-03-31 01:16:33 +08:00
String theme_type = sname . get_slicec ( ' / ' , 0 ) ;
2017-03-05 23:44:50 +08:00
String name = sname . get_slicec ( ' / ' , 2 ) ;
2014-02-10 09:10:30 +08:00
2017-03-05 23:44:50 +08:00
if ( type = = " icons " ) {
2021-03-31 01:16:33 +08:00
if ( ! has_icon ( name , theme_type ) ) {
2019-06-12 02:43:37 +08:00
r_ret = Ref < Texture2D > ( ) ;
2020-05-14 22:41:43 +08:00
} else {
2021-03-31 01:16:33 +08:00
r_ret = get_icon ( name , theme_type ) ;
2020-05-14 22:41:43 +08:00
}
2017-03-05 23:44:50 +08:00
} else if ( type = = " styles " ) {
2021-03-31 01:16:33 +08:00
if ( ! has_stylebox ( name , theme_type ) ) {
2017-03-05 23:44:50 +08:00
r_ret = Ref < StyleBox > ( ) ;
2020-05-14 22:41:43 +08:00
} else {
2021-03-31 01:16:33 +08:00
r_ret = get_stylebox ( name , theme_type ) ;
2020-05-14 22:41:43 +08:00
}
2017-03-05 23:44:50 +08:00
} else if ( type = = " fonts " ) {
2021-03-31 01:16:33 +08:00
if ( ! has_font ( name , theme_type ) ) {
2017-03-05 23:44:50 +08:00
r_ret = Ref < Font > ( ) ;
2020-05-14 22:41:43 +08:00
} else {
2021-03-31 01:16:33 +08:00
r_ret = get_font ( name , theme_type ) ;
2020-05-14 22:41:43 +08:00
}
2017-03-05 23:44:50 +08:00
} else if ( type = = " colors " ) {
2021-03-31 01:16:33 +08:00
r_ret = get_color ( name , theme_type ) ;
2017-03-05 23:44:50 +08:00
} else if ( type = = " constants " ) {
2021-03-31 01:16:33 +08:00
r_ret = get_constant ( name , theme_type ) ;
2020-05-14 22:41:43 +08:00
} else {
2014-02-10 09:10:30 +08:00
return false ;
2020-05-14 22:41:43 +08:00
}
2014-02-10 09:10:30 +08:00
return true ;
}
return false ;
}
2017-03-05 23:44:50 +08:00
void Theme : : _get_property_list ( List < PropertyInfo > * p_list ) const {
2015-05-04 09:37:10 +08:00
List < PropertyInfo > list ;
2020-04-02 07:20:12 +08:00
const StringName * key = nullptr ;
2016-03-09 07:00:52 +08:00
2017-03-05 23:44:50 +08:00
while ( ( key = icon_map . next ( key ) ) ) {
2020-04-02 07:20:12 +08:00
const StringName * key2 = nullptr ;
2016-03-09 07:00:52 +08:00
2017-03-05 23:44:50 +08:00
while ( ( key2 = icon_map [ * key ] . next ( key2 ) ) ) {
2019-06-12 02:43:37 +08:00
list . push_back ( PropertyInfo ( Variant : : OBJECT , String ( ) + * key + " /icons/ " + * key2 , PROPERTY_HINT_RESOURCE_TYPE , " Texture2D " , PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_STORE_IF_NULL ) ) ;
2014-02-10 09:10:30 +08:00
}
}
2016-03-09 07:00:52 +08:00
2020-04-02 07:20:12 +08:00
key = nullptr ;
2016-03-09 07:00:52 +08:00
2017-03-05 23:44:50 +08:00
while ( ( key = style_map . next ( key ) ) ) {
2020-04-02 07:20:12 +08:00
const StringName * key2 = nullptr ;
2016-03-09 07:00:52 +08:00
2017-03-05 23:44:50 +08:00
while ( ( key2 = style_map [ * key ] . next ( key2 ) ) ) {
list . push_back ( PropertyInfo ( Variant : : OBJECT , String ( ) + * key + " /styles/ " + * key2 , PROPERTY_HINT_RESOURCE_TYPE , " StyleBox " , PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_STORE_IF_NULL ) ) ;
2014-02-10 09:10:30 +08:00
}
}
2016-03-09 07:00:52 +08:00
2020-04-02 07:20:12 +08:00
key = nullptr ;
2014-02-15 13:01:39 +08:00
2017-03-05 23:44:50 +08:00
while ( ( key = font_map . next ( key ) ) ) {
2020-04-02 07:20:12 +08:00
const StringName * key2 = nullptr ;
2016-03-09 07:00:52 +08:00
2017-03-05 23:44:50 +08:00
while ( ( key2 = font_map [ * key ] . next ( key2 ) ) ) {
list . push_back ( PropertyInfo ( Variant : : OBJECT , String ( ) + * key + " /fonts/ " + * key2 , PROPERTY_HINT_RESOURCE_TYPE , " Font " , PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_STORE_IF_NULL ) ) ;
2014-02-10 09:10:30 +08:00
}
}
2016-03-09 07:00:52 +08:00
2020-04-02 07:20:12 +08:00
key = nullptr ;
2016-03-09 07:00:52 +08:00
2017-03-05 23:44:50 +08:00
while ( ( key = color_map . next ( key ) ) ) {
2020-04-02 07:20:12 +08:00
const StringName * key2 = nullptr ;
2016-03-09 07:00:52 +08:00
2017-03-05 23:44:50 +08:00
while ( ( key2 = color_map [ * key ] . next ( key2 ) ) ) {
list . push_back ( PropertyInfo ( Variant : : COLOR , String ( ) + * key + " /colors/ " + * key2 ) ) ;
2014-02-10 09:10:30 +08:00
}
}
2016-03-09 07:00:52 +08:00
2020-04-02 07:20:12 +08:00
key = nullptr ;
2016-03-09 07:00:52 +08:00
2017-03-05 23:44:50 +08:00
while ( ( key = constant_map . next ( key ) ) ) {
2020-04-02 07:20:12 +08:00
const StringName * key2 = nullptr ;
2016-03-09 07:00:52 +08:00
2017-03-05 23:44:50 +08:00
while ( ( key2 = constant_map [ * key ] . next ( key2 ) ) ) {
list . push_back ( PropertyInfo ( Variant : : INT , String ( ) + * key + " /constants/ " + * key2 ) ) ;
2014-02-10 09:10:30 +08:00
}
}
2015-05-04 09:37:10 +08:00
list . sort ( ) ;
2017-03-05 23:44:50 +08:00
for ( List < PropertyInfo > : : Element * E = list . front ( ) ; E ; E = E - > next ( ) ) {
2015-05-04 09:37:10 +08:00
p_list - > push_back ( E - > get ( ) ) ;
}
2014-02-10 09:10:30 +08:00
}
2017-03-05 23:44:50 +08:00
void Theme : : set_default_theme_font ( const Ref < Font > & p_default_font ) {
2020-05-14 22:41:43 +08:00
if ( default_theme_font = = p_default_font ) {
2016-07-19 03:41:28 +08:00
return ;
2020-05-14 22:41:43 +08:00
}
2016-07-19 03:41:28 +08:00
if ( default_theme_font . is_valid ( ) ) {
2020-02-22 01:28:45 +08:00
default_theme_font - > disconnect ( " changed " , callable_mp ( this , & Theme : : _emit_theme_changed ) ) ;
2016-07-19 03:41:28 +08:00
}
2017-03-05 23:44:50 +08:00
default_theme_font = p_default_font ;
2016-07-19 03:41:28 +08:00
if ( default_theme_font . is_valid ( ) ) {
2020-02-22 01:28:45 +08:00
default_theme_font - > connect ( " changed " , callable_mp ( this , & Theme : : _emit_theme_changed ) , varray ( ) , CONNECT_REFERENCE_COUNTED ) ;
2016-07-19 03:41:28 +08:00
}
2021-05-31 22:28:02 +08:00
_emit_theme_changed ( ) ;
2014-02-15 13:01:39 +08:00
}
Ref < Font > Theme : : get_default_theme_font ( ) const {
return default_theme_font ;
}
2020-09-03 19:22:16 +08:00
void Theme : : set_default_theme_font_size ( int p_font_size ) {
if ( default_theme_font_size = = p_font_size ) {
return ;
}
default_theme_font_size = p_font_size ;
2021-05-31 22:28:02 +08:00
_emit_theme_changed ( ) ;
2020-09-03 19:22:16 +08:00
}
int Theme : : get_default_theme_font_size ( ) const {
return default_theme_font_size ;
}
2019-07-06 04:32:52 +08:00
Ref < Theme > Theme : : project_default_theme ;
Ref < Theme > Theme : : default_theme ;
2019-06-12 02:43:37 +08:00
Ref < Texture2D > Theme : : default_icon ;
2019-07-06 04:32:52 +08:00
Ref < StyleBox > Theme : : default_style ;
Ref < Font > Theme : : default_font ;
2020-09-03 19:22:16 +08:00
int Theme : : default_font_size = 16 ;
2019-07-06 04:32:52 +08:00
Ref < Theme > Theme : : get_default ( ) {
return default_theme ;
}
2017-03-05 23:44:50 +08:00
void Theme : : set_default ( const Ref < Theme > & p_default ) {
default_theme = p_default ;
2014-02-10 09:10:30 +08:00
}
2019-07-06 04:32:52 +08:00
Ref < Theme > Theme : : get_project_default ( ) {
return project_default_theme ;
}
void Theme : : set_project_default ( const Ref < Theme > & p_project_default ) {
project_default_theme = p_project_default ;
}
2014-02-10 09:10:30 +08:00
2019-06-12 02:43:37 +08:00
void Theme : : set_default_icon ( const Ref < Texture2D > & p_icon ) {
2017-03-05 23:44:50 +08:00
default_icon = p_icon ;
2014-02-10 09:10:30 +08:00
}
2020-05-14 20:29:06 +08:00
2017-03-05 23:44:50 +08:00
void Theme : : set_default_style ( const Ref < StyleBox > & p_style ) {
default_style = p_style ;
2014-02-10 09:10:30 +08:00
}
2020-05-14 20:29:06 +08:00
2017-03-05 23:44:50 +08:00
void Theme : : set_default_font ( const Ref < Font > & p_font ) {
default_font = p_font ;
2014-02-10 09:10:30 +08:00
}
2020-09-03 19:22:16 +08:00
void Theme : : set_default_font_size ( int p_font_size ) {
default_font_size = p_font_size ;
}
2021-03-31 01:16:33 +08:00
void Theme : : set_icon ( const StringName & p_name , const StringName & p_theme_type , const Ref < Texture2D > & p_icon ) {
if ( icon_map [ p_theme_type ] . has ( p_name ) & & icon_map [ p_theme_type ] [ p_name ] . is_valid ( ) ) {
icon_map [ p_theme_type ] [ p_name ] - > disconnect ( " changed " , callable_mp ( this , & Theme : : _emit_theme_changed ) ) ;
2018-11-28 01:33:14 +08:00
}
2021-03-31 01:16:33 +08:00
icon_map [ p_theme_type ] [ p_name ] = p_icon ;
2014-02-10 09:10:30 +08:00
2018-11-28 01:33:14 +08:00
if ( p_icon . is_valid ( ) ) {
2021-03-31 01:16:33 +08:00
icon_map [ p_theme_type ] [ p_name ] - > connect ( " changed " , callable_mp ( this , & Theme : : _emit_theme_changed ) , varray ( ) , CONNECT_REFERENCE_COUNTED ) ;
2018-11-28 01:33:14 +08:00
}
2021-05-31 22:28:02 +08:00
_emit_theme_changed ( ) ;
2014-02-10 09:10:30 +08:00
}
2020-05-14 20:29:06 +08:00
2021-03-31 01:16:33 +08:00
Ref < Texture2D > Theme : : get_icon ( const StringName & p_name , const StringName & p_theme_type ) const {
if ( icon_map . has ( p_theme_type ) & & icon_map [ p_theme_type ] . has ( p_name ) & & icon_map [ p_theme_type ] [ p_name ] . is_valid ( ) ) {
return icon_map [ p_theme_type ] [ p_name ] ;
2014-02-10 09:10:30 +08:00
} else {
return default_icon ;
}
}
2021-03-31 01:16:33 +08:00
bool Theme : : has_icon ( const StringName & p_name , const StringName & p_theme_type ) const {
return ( icon_map . has ( p_theme_type ) & & icon_map [ p_theme_type ] . has ( p_name ) & & icon_map [ p_theme_type ] [ p_name ] . is_valid ( ) ) ;
2014-02-10 09:10:30 +08:00
}
2021-03-31 01:16:33 +08:00
bool Theme : : has_icon_nocheck ( const StringName & p_name , const StringName & p_theme_type ) const {
return ( icon_map . has ( p_theme_type ) & & icon_map [ p_theme_type ] . has ( p_name ) ) ;
2021-03-01 23:18:53 +08:00
}
2021-03-31 01:16:33 +08:00
void Theme : : rename_icon ( const StringName & p_old_name , const StringName & p_name , const StringName & p_theme_type ) {
ERR_FAIL_COND_MSG ( ! icon_map . has ( p_theme_type ) , " Cannot rename the icon ' " + String ( p_old_name ) + " ' because the node type ' " + String ( p_theme_type ) + " ' does not exist. " ) ;
ERR_FAIL_COND_MSG ( icon_map [ p_theme_type ] . has ( p_name ) , " Cannot rename the icon ' " + String ( p_old_name ) + " ' because the new name ' " + String ( p_name ) + " ' already exists. " ) ;
ERR_FAIL_COND_MSG ( ! icon_map [ p_theme_type ] . has ( p_old_name ) , " Cannot rename the icon ' " + String ( p_old_name ) + " ' because it does not exist. " ) ;
2021-03-22 19:35:58 +08:00
2021-03-31 01:16:33 +08:00
icon_map [ p_theme_type ] [ p_name ] = icon_map [ p_theme_type ] [ p_old_name ] ;
icon_map [ p_theme_type ] . erase ( p_old_name ) ;
2021-03-22 19:35:58 +08:00
2021-05-31 22:28:02 +08:00
_emit_theme_changed ( ) ;
2021-03-22 19:35:58 +08:00
}
2021-03-31 01:16:33 +08:00
void Theme : : clear_icon ( const StringName & p_name , const StringName & p_theme_type ) {
ERR_FAIL_COND_MSG ( ! icon_map . has ( p_theme_type ) , " Cannot clear the icon ' " + String ( p_name ) + " ' because the node type ' " + String ( p_theme_type ) + " ' does not exist. " ) ;
ERR_FAIL_COND_MSG ( ! icon_map [ p_theme_type ] . has ( p_name ) , " Cannot clear the icon ' " + String ( p_name ) + " ' because it does not exist. " ) ;
2014-02-10 09:10:30 +08:00
2021-03-31 01:16:33 +08:00
if ( icon_map [ p_theme_type ] [ p_name ] . is_valid ( ) ) {
icon_map [ p_theme_type ] [ p_name ] - > disconnect ( " changed " , callable_mp ( this , & Theme : : _emit_theme_changed ) ) ;
2018-11-28 01:33:14 +08:00
}
2021-03-31 01:16:33 +08:00
icon_map [ p_theme_type ] . erase ( p_name ) ;
2018-11-28 01:33:14 +08:00
2021-05-31 22:28:02 +08:00
_emit_theme_changed ( ) ;
2014-02-10 09:10:30 +08:00
}
2021-03-31 01:16:33 +08:00
void Theme : : get_icon_list ( StringName p_theme_type , List < StringName > * p_list ) const {
2019-10-23 10:08:23 +08:00
ERR_FAIL_NULL ( p_list ) ;
2021-03-31 01:16:33 +08:00
if ( ! icon_map . has ( p_theme_type ) ) {
2014-02-10 09:10:30 +08:00
return ;
2020-05-14 22:41:43 +08:00
}
2014-02-10 09:10:30 +08:00
2020-04-02 07:20:12 +08:00
const StringName * key = nullptr ;
2014-02-10 09:10:30 +08:00
2021-03-31 01:16:33 +08:00
while ( ( key = icon_map [ p_theme_type ] . next ( key ) ) ) {
2014-02-10 09:10:30 +08:00
p_list - > push_back ( * key ) ;
}
2015-12-21 05:21:53 +08:00
}
2021-03-31 01:16:33 +08:00
void Theme : : add_icon_type ( const StringName & p_theme_type ) {
2021-06-04 21:34:49 +08:00
if ( icon_map . has ( p_theme_type ) ) {
return ;
}
2021-03-31 01:16:33 +08:00
icon_map [ p_theme_type ] = HashMap < StringName , Ref < Texture2D > > ( ) ;
2021-03-22 19:35:58 +08:00
}
2020-04-10 22:50:28 +08:00
void Theme : : get_icon_type_list ( List < StringName > * p_list ) const {
ERR_FAIL_NULL ( p_list ) ;
const StringName * key = nullptr ;
while ( ( key = icon_map . next ( key ) ) ) {
p_list - > push_back ( * key ) ;
}
}
2021-03-31 01:16:33 +08:00
void Theme : : set_stylebox ( const StringName & p_name , const StringName & p_theme_type , const Ref < StyleBox > & p_style ) {
if ( style_map [ p_theme_type ] . has ( p_name ) & & style_map [ p_theme_type ] [ p_name ] . is_valid ( ) ) {
style_map [ p_theme_type ] [ p_name ] - > disconnect ( " changed " , callable_mp ( this , & Theme : : _emit_theme_changed ) ) ;
2018-11-28 01:33:14 +08:00
}
2021-03-31 01:16:33 +08:00
style_map [ p_theme_type ] [ p_name ] = p_style ;
2014-02-10 09:10:30 +08:00
2018-11-28 01:33:14 +08:00
if ( p_style . is_valid ( ) ) {
2021-03-31 01:16:33 +08:00
style_map [ p_theme_type ] [ p_name ] - > connect ( " changed " , callable_mp ( this , & Theme : : _emit_theme_changed ) , varray ( ) , CONNECT_REFERENCE_COUNTED ) ;
2018-11-28 01:33:14 +08:00
}
2021-05-31 22:28:02 +08:00
_emit_theme_changed ( ) ;
2014-02-10 09:10:30 +08:00
}
2021-03-31 01:16:33 +08:00
Ref < StyleBox > Theme : : get_stylebox ( const StringName & p_name , const StringName & p_theme_type ) const {
if ( style_map . has ( p_theme_type ) & & style_map [ p_theme_type ] . has ( p_name ) & & style_map [ p_theme_type ] [ p_name ] . is_valid ( ) ) {
return style_map [ p_theme_type ] [ p_name ] ;
2014-02-10 09:10:30 +08:00
} else {
return default_style ;
}
}
2021-03-31 01:16:33 +08:00
bool Theme : : has_stylebox ( const StringName & p_name , const StringName & p_theme_type ) const {
return ( style_map . has ( p_theme_type ) & & style_map [ p_theme_type ] . has ( p_name ) & & style_map [ p_theme_type ] [ p_name ] . is_valid ( ) ) ;
2014-02-10 09:10:30 +08:00
}
2021-03-31 01:16:33 +08:00
bool Theme : : has_stylebox_nocheck ( const StringName & p_name , const StringName & p_theme_type ) const {
return ( style_map . has ( p_theme_type ) & & style_map [ p_theme_type ] . has ( p_name ) ) ;
2021-03-01 23:18:53 +08:00
}
2021-03-31 01:16:33 +08:00
void Theme : : rename_stylebox ( const StringName & p_old_name , const StringName & p_name , const StringName & p_theme_type ) {
ERR_FAIL_COND_MSG ( ! style_map . has ( p_theme_type ) , " Cannot rename the stylebox ' " + String ( p_old_name ) + " ' because the node type ' " + String ( p_theme_type ) + " ' does not exist. " ) ;
ERR_FAIL_COND_MSG ( style_map [ p_theme_type ] . has ( p_name ) , " Cannot rename the stylebox ' " + String ( p_old_name ) + " ' because the new name ' " + String ( p_name ) + " ' already exists. " ) ;
ERR_FAIL_COND_MSG ( ! style_map [ p_theme_type ] . has ( p_old_name ) , " Cannot rename the stylebox ' " + String ( p_old_name ) + " ' because it does not exist. " ) ;
2021-03-22 19:35:58 +08:00
2021-03-31 01:16:33 +08:00
style_map [ p_theme_type ] [ p_name ] = style_map [ p_theme_type ] [ p_old_name ] ;
style_map [ p_theme_type ] . erase ( p_old_name ) ;
2021-03-22 19:35:58 +08:00
2021-05-31 22:28:02 +08:00
_emit_theme_changed ( ) ;
2021-03-22 19:35:58 +08:00
}
2021-03-31 01:16:33 +08:00
void Theme : : clear_stylebox ( const StringName & p_name , const StringName & p_theme_type ) {
ERR_FAIL_COND_MSG ( ! style_map . has ( p_theme_type ) , " Cannot clear the stylebox ' " + String ( p_name ) + " ' because the node type ' " + String ( p_theme_type ) + " ' does not exist. " ) ;
ERR_FAIL_COND_MSG ( ! style_map [ p_theme_type ] . has ( p_name ) , " Cannot clear the stylebox ' " + String ( p_name ) + " ' because it does not exist. " ) ;
2014-02-10 09:10:30 +08:00
2021-03-31 01:16:33 +08:00
if ( style_map [ p_theme_type ] [ p_name ] . is_valid ( ) ) {
style_map [ p_theme_type ] [ p_name ] - > disconnect ( " changed " , callable_mp ( this , & Theme : : _emit_theme_changed ) ) ;
2018-11-28 01:33:14 +08:00
}
2021-03-31 01:16:33 +08:00
style_map [ p_theme_type ] . erase ( p_name ) ;
2018-11-28 01:33:14 +08:00
2021-05-31 22:28:02 +08:00
_emit_theme_changed ( ) ;
2014-02-10 09:10:30 +08:00
}
2021-03-31 01:16:33 +08:00
void Theme : : get_stylebox_list ( StringName p_theme_type , List < StringName > * p_list ) const {
2019-10-23 10:08:23 +08:00
ERR_FAIL_NULL ( p_list ) ;
2021-03-31 01:16:33 +08:00
if ( ! style_map . has ( p_theme_type ) ) {
2014-02-10 09:10:30 +08:00
return ;
2020-05-14 22:41:43 +08:00
}
2014-02-10 09:10:30 +08:00
2020-04-02 07:20:12 +08:00
const StringName * key = nullptr ;
2014-02-10 09:10:30 +08:00
2021-03-31 01:16:33 +08:00
while ( ( key = style_map [ p_theme_type ] . next ( key ) ) ) {
2014-02-10 09:10:30 +08:00
p_list - > push_back ( * key ) ;
}
}
2021-03-31 01:16:33 +08:00
void Theme : : add_stylebox_type ( const StringName & p_theme_type ) {
2021-06-04 21:34:49 +08:00
if ( style_map . has ( p_theme_type ) ) {
return ;
}
2021-03-31 01:16:33 +08:00
style_map [ p_theme_type ] = HashMap < StringName , Ref < StyleBox > > ( ) ;
2021-03-22 19:35:58 +08:00
}
2020-04-10 22:50:28 +08:00
void Theme : : get_stylebox_type_list ( List < StringName > * p_list ) const {
2019-10-23 10:08:23 +08:00
ERR_FAIL_NULL ( p_list ) ;
2020-04-02 07:20:12 +08:00
const StringName * key = nullptr ;
2017-03-05 23:44:50 +08:00
while ( ( key = style_map . next ( key ) ) ) {
2016-04-21 09:58:53 +08:00
p_list - > push_back ( * key ) ;
2016-05-21 21:29:25 +08:00
}
2016-04-21 09:58:53 +08:00
}
2021-03-31 01:16:33 +08:00
void Theme : : set_font ( const StringName & p_name , const StringName & p_theme_type , const Ref < Font > & p_font ) {
if ( font_map [ p_theme_type ] [ p_name ] . is_valid ( ) ) {
font_map [ p_theme_type ] [ p_name ] - > disconnect ( " changed " , callable_mp ( this , & Theme : : _emit_theme_changed ) ) ;
2016-06-18 03:00:27 +08:00
}
2018-11-28 01:33:14 +08:00
2021-03-31 01:16:33 +08:00
font_map [ p_theme_type ] [ p_name ] = p_font ;
2014-02-10 09:10:30 +08:00
2016-06-18 03:00:27 +08:00
if ( p_font . is_valid ( ) ) {
2021-03-31 01:16:33 +08:00
font_map [ p_theme_type ] [ p_name ] - > connect ( " changed " , callable_mp ( this , & Theme : : _emit_theme_changed ) , varray ( ) , CONNECT_REFERENCE_COUNTED ) ;
2016-06-18 03:00:27 +08:00
}
2021-05-31 22:28:02 +08:00
_emit_theme_changed ( ) ;
2014-02-10 09:10:30 +08:00
}
2020-05-14 20:29:06 +08:00
2021-03-31 01:16:33 +08:00
Ref < Font > Theme : : get_font ( const StringName & p_name , const StringName & p_theme_type ) const {
if ( font_map . has ( p_theme_type ) & & font_map [ p_theme_type ] . has ( p_name ) & & font_map [ p_theme_type ] [ p_name ] . is_valid ( ) ) {
return font_map [ p_theme_type ] [ p_name ] ;
2020-05-14 22:41:43 +08:00
} else if ( default_theme_font . is_valid ( ) ) {
2014-02-15 13:01:39 +08:00
return default_theme_font ;
2020-05-14 22:41:43 +08:00
} else {
2014-02-10 09:10:30 +08:00
return default_font ;
2020-05-14 22:41:43 +08:00
}
2014-02-10 09:10:30 +08:00
}
2021-03-31 01:16:33 +08:00
bool Theme : : has_font ( const StringName & p_name , const StringName & p_theme_type ) const {
return ( ( font_map . has ( p_theme_type ) & & font_map [ p_theme_type ] . has ( p_name ) & & font_map [ p_theme_type ] [ p_name ] . is_valid ( ) ) | | default_theme_font . is_valid ( ) ) ;
2014-02-10 09:10:30 +08:00
}
2021-03-31 01:16:33 +08:00
bool Theme : : has_font_nocheck ( const StringName & p_name , const StringName & p_theme_type ) const {
return ( font_map . has ( p_theme_type ) & & font_map [ p_theme_type ] . has ( p_name ) ) ;
2021-03-01 23:18:53 +08:00
}
2021-03-31 01:16:33 +08:00
void Theme : : rename_font ( const StringName & p_old_name , const StringName & p_name , const StringName & p_theme_type ) {
ERR_FAIL_COND_MSG ( ! font_map . has ( p_theme_type ) , " Cannot rename the font ' " + String ( p_old_name ) + " ' because the node type ' " + String ( p_theme_type ) + " ' does not exist. " ) ;
ERR_FAIL_COND_MSG ( font_map [ p_theme_type ] . has ( p_name ) , " Cannot rename the font ' " + String ( p_old_name ) + " ' because the new name ' " + String ( p_name ) + " ' already exists. " ) ;
ERR_FAIL_COND_MSG ( ! font_map [ p_theme_type ] . has ( p_old_name ) , " Cannot rename the font ' " + String ( p_old_name ) + " ' because it does not exist. " ) ;
2021-03-22 19:35:58 +08:00
2021-03-31 01:16:33 +08:00
font_map [ p_theme_type ] [ p_name ] = font_map [ p_theme_type ] [ p_old_name ] ;
font_map [ p_theme_type ] . erase ( p_old_name ) ;
2021-03-22 19:35:58 +08:00
2021-05-31 22:28:02 +08:00
_emit_theme_changed ( ) ;
2021-03-22 19:35:58 +08:00
}
2021-03-31 01:16:33 +08:00
void Theme : : clear_font ( const StringName & p_name , const StringName & p_theme_type ) {
ERR_FAIL_COND_MSG ( ! font_map . has ( p_theme_type ) , " Cannot clear the font ' " + String ( p_name ) + " ' because the node type ' " + String ( p_theme_type ) + " ' does not exist. " ) ;
ERR_FAIL_COND_MSG ( ! font_map [ p_theme_type ] . has ( p_name ) , " Cannot clear the font ' " + String ( p_name ) + " ' because it does not exist. " ) ;
2014-02-10 09:10:30 +08:00
2021-03-31 01:16:33 +08:00
if ( font_map [ p_theme_type ] [ p_name ] . is_valid ( ) ) {
font_map [ p_theme_type ] [ p_name ] - > disconnect ( " changed " , callable_mp ( this , & Theme : : _emit_theme_changed ) ) ;
2016-06-18 03:00:27 +08:00
}
2021-03-31 01:16:33 +08:00
font_map [ p_theme_type ] . erase ( p_name ) ;
2021-05-31 22:28:02 +08:00
_emit_theme_changed ( ) ;
2014-02-10 09:10:30 +08:00
}
2021-03-31 01:16:33 +08:00
void Theme : : get_font_list ( StringName p_theme_type , List < StringName > * p_list ) const {
2019-10-23 10:08:23 +08:00
ERR_FAIL_NULL ( p_list ) ;
2021-03-31 01:16:33 +08:00
if ( ! font_map . has ( p_theme_type ) ) {
2014-02-10 09:10:30 +08:00
return ;
2020-05-14 22:41:43 +08:00
}
2014-02-10 09:10:30 +08:00
2020-04-02 07:20:12 +08:00
const StringName * key = nullptr ;
2014-02-10 09:10:30 +08:00
2021-03-31 01:16:33 +08:00
while ( ( key = font_map [ p_theme_type ] . next ( key ) ) ) {
2014-02-10 09:10:30 +08:00
p_list - > push_back ( * key ) ;
}
}
2021-03-31 01:16:33 +08:00
void Theme : : add_font_type ( const StringName & p_theme_type ) {
2021-06-04 21:34:49 +08:00
if ( font_map . has ( p_theme_type ) ) {
return ;
}
2021-03-31 01:16:33 +08:00
font_map [ p_theme_type ] = HashMap < StringName , Ref < Font > > ( ) ;
2021-03-22 19:35:58 +08:00
}
2020-04-10 22:50:28 +08:00
void Theme : : get_font_type_list ( List < StringName > * p_list ) const {
ERR_FAIL_NULL ( p_list ) ;
const StringName * key = nullptr ;
while ( ( key = font_map . next ( key ) ) ) {
p_list - > push_back ( * key ) ;
}
}
2021-03-31 01:16:33 +08:00
void Theme : : set_font_size ( const StringName & p_name , const StringName & p_theme_type , int p_font_size ) {
font_size_map [ p_theme_type ] [ p_name ] = p_font_size ;
2020-09-03 19:22:16 +08:00
2021-05-31 22:28:02 +08:00
_emit_theme_changed ( ) ;
2020-09-03 19:22:16 +08:00
}
2021-03-31 01:16:33 +08:00
int Theme : : get_font_size ( const StringName & p_name , const StringName & p_theme_type ) const {
if ( font_size_map . has ( p_theme_type ) & & font_size_map [ p_theme_type ] . has ( p_name ) & & ( font_size_map [ p_theme_type ] [ p_name ] > 0 ) ) {
return font_size_map [ p_theme_type ] [ p_name ] ;
2020-09-03 19:22:16 +08:00
} else if ( default_theme_font_size > 0 ) {
return default_theme_font_size ;
} else {
return default_font_size ;
}
}
2021-03-31 01:16:33 +08:00
bool Theme : : has_font_size ( const StringName & p_name , const StringName & p_theme_type ) const {
return ( ( font_size_map . has ( p_theme_type ) & & font_size_map [ p_theme_type ] . has ( p_name ) & & ( font_size_map [ p_theme_type ] [ p_name ] > 0 ) ) | | ( default_theme_font_size > 0 ) ) ;
2020-09-03 19:22:16 +08:00
}
2021-03-31 01:16:33 +08:00
bool Theme : : has_font_size_nocheck ( const StringName & p_name , const StringName & p_theme_type ) const {
return ( font_size_map . has ( p_theme_type ) & & font_size_map [ p_theme_type ] . has ( p_name ) ) ;
2021-03-01 23:18:53 +08:00
}
2021-03-31 01:16:33 +08:00
void Theme : : rename_font_size ( const StringName & p_old_name , const StringName & p_name , const StringName & p_theme_type ) {
ERR_FAIL_COND_MSG ( ! font_size_map . has ( p_theme_type ) , " Cannot rename the font size ' " + String ( p_old_name ) + " ' because the node type ' " + String ( p_theme_type ) + " ' does not exist. " ) ;
ERR_FAIL_COND_MSG ( font_size_map [ p_theme_type ] . has ( p_name ) , " Cannot rename the font size ' " + String ( p_old_name ) + " ' because the new name ' " + String ( p_name ) + " ' already exists. " ) ;
ERR_FAIL_COND_MSG ( ! font_size_map [ p_theme_type ] . has ( p_old_name ) , " Cannot rename the font size ' " + String ( p_old_name ) + " ' because it does not exist. " ) ;
2021-03-22 19:35:58 +08:00
2021-03-31 01:16:33 +08:00
font_size_map [ p_theme_type ] [ p_name ] = font_size_map [ p_theme_type ] [ p_old_name ] ;
font_size_map [ p_theme_type ] . erase ( p_old_name ) ;
2021-03-22 19:35:58 +08:00
2021-05-31 22:28:02 +08:00
_emit_theme_changed ( ) ;
2021-03-22 19:35:58 +08:00
}
2021-03-31 01:16:33 +08:00
void Theme : : clear_font_size ( const StringName & p_name , const StringName & p_theme_type ) {
ERR_FAIL_COND_MSG ( ! font_size_map . has ( p_theme_type ) , " Cannot clear the font size ' " + String ( p_name ) + " ' because the node type ' " + String ( p_theme_type ) + " ' does not exist. " ) ;
ERR_FAIL_COND_MSG ( ! font_size_map [ p_theme_type ] . has ( p_name ) , " Cannot clear the font size ' " + String ( p_name ) + " ' because it does not exist. " ) ;
2020-09-03 19:22:16 +08:00
2021-03-31 01:16:33 +08:00
font_size_map [ p_theme_type ] . erase ( p_name ) ;
2021-05-31 22:28:02 +08:00
_emit_theme_changed ( ) ;
2020-09-03 19:22:16 +08:00
}
2021-03-31 01:16:33 +08:00
void Theme : : get_font_size_list ( StringName p_theme_type , List < StringName > * p_list ) const {
2020-09-03 19:22:16 +08:00
ERR_FAIL_NULL ( p_list ) ;
2021-03-31 01:16:33 +08:00
if ( ! font_size_map . has ( p_theme_type ) ) {
2020-09-03 19:22:16 +08:00
return ;
}
const StringName * key = nullptr ;
2021-03-31 01:16:33 +08:00
while ( ( key = font_size_map [ p_theme_type ] . next ( key ) ) ) {
2020-09-03 19:22:16 +08:00
p_list - > push_back ( * key ) ;
}
}
2021-03-31 01:16:33 +08:00
void Theme : : add_font_size_type ( const StringName & p_theme_type ) {
2021-06-04 21:34:49 +08:00
if ( font_size_map . has ( p_theme_type ) ) {
return ;
}
2021-03-31 01:16:33 +08:00
font_size_map [ p_theme_type ] = HashMap < StringName , int > ( ) ;
2021-03-22 19:35:58 +08:00
}
void Theme : : get_font_size_type_list ( List < StringName > * p_list ) const {
ERR_FAIL_NULL ( p_list ) ;
const StringName * key = nullptr ;
while ( ( key = font_size_map . next ( key ) ) ) {
p_list - > push_back ( * key ) ;
}
}
2021-03-31 01:16:33 +08:00
void Theme : : set_color ( const StringName & p_name , const StringName & p_theme_type , const Color & p_color ) {
color_map [ p_theme_type ] [ p_name ] = p_color ;
2014-02-10 09:10:30 +08:00
2021-05-31 22:28:02 +08:00
_emit_theme_changed ( ) ;
2014-02-10 09:10:30 +08:00
}
2021-03-31 01:16:33 +08:00
Color Theme : : get_color ( const StringName & p_name , const StringName & p_theme_type ) const {
if ( color_map . has ( p_theme_type ) & & color_map [ p_theme_type ] . has ( p_name ) ) {
return color_map [ p_theme_type ] [ p_name ] ;
2020-05-14 22:41:43 +08:00
} else {
2014-02-10 09:10:30 +08:00
return Color ( ) ;
2020-05-14 22:41:43 +08:00
}
2014-02-10 09:10:30 +08:00
}
2021-03-31 01:16:33 +08:00
bool Theme : : has_color ( const StringName & p_name , const StringName & p_theme_type ) const {
return ( color_map . has ( p_theme_type ) & & color_map [ p_theme_type ] . has ( p_name ) ) ;
2014-02-10 09:10:30 +08:00
}
2021-03-31 01:16:33 +08:00
bool Theme : : has_color_nocheck ( const StringName & p_name , const StringName & p_theme_type ) const {
return ( color_map . has ( p_theme_type ) & & color_map [ p_theme_type ] . has ( p_name ) ) ;
2021-03-01 23:18:53 +08:00
}
2021-03-31 01:16:33 +08:00
void Theme : : rename_color ( const StringName & p_old_name , const StringName & p_name , const StringName & p_theme_type ) {
ERR_FAIL_COND_MSG ( ! color_map . has ( p_theme_type ) , " Cannot rename the color ' " + String ( p_old_name ) + " ' because the node type ' " + String ( p_theme_type ) + " ' does not exist. " ) ;
ERR_FAIL_COND_MSG ( color_map [ p_theme_type ] . has ( p_name ) , " Cannot rename the color ' " + String ( p_old_name ) + " ' because the new name ' " + String ( p_name ) + " ' already exists. " ) ;
ERR_FAIL_COND_MSG ( ! color_map [ p_theme_type ] . has ( p_old_name ) , " Cannot rename the color ' " + String ( p_old_name ) + " ' because it does not exist. " ) ;
2021-03-22 19:35:58 +08:00
2021-03-31 01:16:33 +08:00
color_map [ p_theme_type ] [ p_name ] = color_map [ p_theme_type ] [ p_old_name ] ;
color_map [ p_theme_type ] . erase ( p_old_name ) ;
2021-03-22 19:35:58 +08:00
2021-05-31 22:28:02 +08:00
_emit_theme_changed ( ) ;
2021-03-22 19:35:58 +08:00
}
2021-03-31 01:16:33 +08:00
void Theme : : clear_color ( const StringName & p_name , const StringName & p_theme_type ) {
ERR_FAIL_COND_MSG ( ! color_map . has ( p_theme_type ) , " Cannot clear the color ' " + String ( p_name ) + " ' because the node type ' " + String ( p_theme_type ) + " ' does not exist. " ) ;
ERR_FAIL_COND_MSG ( ! color_map [ p_theme_type ] . has ( p_name ) , " Cannot clear the color ' " + String ( p_name ) + " ' because it does not exist. " ) ;
2014-02-10 09:10:30 +08:00
2021-03-31 01:16:33 +08:00
color_map [ p_theme_type ] . erase ( p_name ) ;
2021-05-31 22:28:02 +08:00
_emit_theme_changed ( ) ;
2014-02-10 09:10:30 +08:00
}
2021-03-31 01:16:33 +08:00
void Theme : : get_color_list ( StringName p_theme_type , List < StringName > * p_list ) const {
2019-10-23 10:08:23 +08:00
ERR_FAIL_NULL ( p_list ) ;
2021-03-31 01:16:33 +08:00
if ( ! color_map . has ( p_theme_type ) ) {
2014-02-10 09:10:30 +08:00
return ;
2020-05-14 22:41:43 +08:00
}
2014-02-10 09:10:30 +08:00
2020-04-02 07:20:12 +08:00
const StringName * key = nullptr ;
2014-02-10 09:10:30 +08:00
2021-03-31 01:16:33 +08:00
while ( ( key = color_map [ p_theme_type ] . next ( key ) ) ) {
2014-02-10 09:10:30 +08:00
p_list - > push_back ( * key ) ;
}
}
2021-03-31 01:16:33 +08:00
void Theme : : add_color_type ( const StringName & p_theme_type ) {
2021-06-04 21:34:49 +08:00
if ( color_map . has ( p_theme_type ) ) {
return ;
}
2021-03-31 01:16:33 +08:00
color_map [ p_theme_type ] = HashMap < StringName , Color > ( ) ;
2021-03-22 19:35:58 +08:00
}
2020-04-10 22:50:28 +08:00
void Theme : : get_color_type_list ( List < StringName > * p_list ) const {
ERR_FAIL_NULL ( p_list ) ;
const StringName * key = nullptr ;
while ( ( key = color_map . next ( key ) ) ) {
p_list - > push_back ( * key ) ;
}
}
2021-03-31 01:16:33 +08:00
void Theme : : set_constant ( const StringName & p_name , const StringName & p_theme_type , int p_constant ) {
constant_map [ p_theme_type ] [ p_name ] = p_constant ;
2014-02-10 09:10:30 +08:00
2021-05-31 22:28:02 +08:00
_emit_theme_changed ( ) ;
2014-02-10 09:10:30 +08:00
}
2021-03-31 01:16:33 +08:00
int Theme : : get_constant ( const StringName & p_name , const StringName & p_theme_type ) const {
if ( constant_map . has ( p_theme_type ) & & constant_map [ p_theme_type ] . has ( p_name ) ) {
return constant_map [ p_theme_type ] [ p_name ] ;
2020-05-14 22:41:43 +08:00
} else {
2014-02-10 09:10:30 +08:00
return 0 ;
}
}
2021-03-31 01:16:33 +08:00
bool Theme : : has_constant ( const StringName & p_name , const StringName & p_theme_type ) const {
return ( constant_map . has ( p_theme_type ) & & constant_map [ p_theme_type ] . has ( p_name ) ) ;
2014-02-10 09:10:30 +08:00
}
2021-03-31 01:16:33 +08:00
bool Theme : : has_constant_nocheck ( const StringName & p_name , const StringName & p_theme_type ) const {
return ( constant_map . has ( p_theme_type ) & & constant_map [ p_theme_type ] . has ( p_name ) ) ;
2021-03-01 23:18:53 +08:00
}
2021-03-31 01:16:33 +08:00
void Theme : : rename_constant ( const StringName & p_old_name , const StringName & p_name , const StringName & p_theme_type ) {
ERR_FAIL_COND_MSG ( ! constant_map . has ( p_theme_type ) , " Cannot rename the constant ' " + String ( p_old_name ) + " ' because the node type ' " + String ( p_theme_type ) + " ' does not exist. " ) ;
ERR_FAIL_COND_MSG ( constant_map [ p_theme_type ] . has ( p_name ) , " Cannot rename the constant ' " + String ( p_old_name ) + " ' because the new name ' " + String ( p_name ) + " ' already exists. " ) ;
ERR_FAIL_COND_MSG ( ! constant_map [ p_theme_type ] . has ( p_old_name ) , " Cannot rename the constant ' " + String ( p_old_name ) + " ' because it does not exist. " ) ;
2021-03-22 19:35:58 +08:00
2021-03-31 01:16:33 +08:00
constant_map [ p_theme_type ] [ p_name ] = constant_map [ p_theme_type ] [ p_old_name ] ;
constant_map [ p_theme_type ] . erase ( p_old_name ) ;
2021-03-22 19:35:58 +08:00
2021-05-31 22:28:02 +08:00
_emit_theme_changed ( ) ;
2021-03-22 19:35:58 +08:00
}
2021-03-31 01:16:33 +08:00
void Theme : : clear_constant ( const StringName & p_name , const StringName & p_theme_type ) {
ERR_FAIL_COND_MSG ( ! constant_map . has ( p_theme_type ) , " Cannot clear the constant ' " + String ( p_name ) + " ' because the node type ' " + String ( p_theme_type ) + " ' does not exist. " ) ;
ERR_FAIL_COND_MSG ( ! constant_map [ p_theme_type ] . has ( p_name ) , " Cannot clear the constant ' " + String ( p_name ) + " ' because it does not exist. " ) ;
2014-02-10 09:10:30 +08:00
2021-03-31 01:16:33 +08:00
constant_map [ p_theme_type ] . erase ( p_name ) ;
2021-05-31 22:28:02 +08:00
_emit_theme_changed ( ) ;
2014-02-10 09:10:30 +08:00
}
2021-03-31 01:16:33 +08:00
void Theme : : get_constant_list ( StringName p_theme_type , List < StringName > * p_list ) const {
2019-10-23 10:08:23 +08:00
ERR_FAIL_NULL ( p_list ) ;
2021-03-31 01:16:33 +08:00
if ( ! constant_map . has ( p_theme_type ) ) {
2014-02-10 09:10:30 +08:00
return ;
2020-05-14 22:41:43 +08:00
}
2014-02-10 09:10:30 +08:00
2020-04-02 07:20:12 +08:00
const StringName * key = nullptr ;
2014-02-10 09:10:30 +08:00
2021-03-31 01:16:33 +08:00
while ( ( key = constant_map [ p_theme_type ] . next ( key ) ) ) {
2014-02-10 09:10:30 +08:00
p_list - > push_back ( * key ) ;
}
}
2021-03-31 01:16:33 +08:00
void Theme : : add_constant_type ( const StringName & p_theme_type ) {
2021-06-04 21:34:49 +08:00
if ( constant_map . has ( p_theme_type ) ) {
return ;
}
2021-03-31 01:16:33 +08:00
constant_map [ p_theme_type ] = HashMap < StringName , int > ( ) ;
2021-03-22 19:35:58 +08:00
}
2020-04-10 22:50:28 +08:00
void Theme : : get_constant_type_list ( List < StringName > * p_list ) const {
ERR_FAIL_NULL ( p_list ) ;
const StringName * key = nullptr ;
while ( ( key = constant_map . next ( key ) ) ) {
p_list - > push_back ( * key ) ;
}
}
2021-03-31 01:16:33 +08:00
void Theme : : set_theme_item ( DataType p_data_type , const StringName & p_name , const StringName & p_theme_type , const Variant & p_value ) {
2021-03-22 19:35:58 +08:00
switch ( p_data_type ) {
case DATA_TYPE_COLOR : {
ERR_FAIL_COND_MSG ( p_value . get_type ( ) ! = Variant : : COLOR , " Theme item's data type (Color) does not match Variant's type ( " + Variant : : get_type_name ( p_value . get_type ( ) ) + " ). " ) ;
Color color_value = p_value ;
2021-03-31 01:16:33 +08:00
set_color ( p_name , p_theme_type , color_value ) ;
2021-03-22 19:35:58 +08:00
} break ;
case DATA_TYPE_CONSTANT : {
ERR_FAIL_COND_MSG ( p_value . get_type ( ) ! = Variant : : INT , " Theme item's data type (int) does not match Variant's type ( " + Variant : : get_type_name ( p_value . get_type ( ) ) + " ). " ) ;
int constant_value = p_value ;
2021-03-31 01:16:33 +08:00
set_constant ( p_name , p_theme_type , constant_value ) ;
2021-03-22 19:35:58 +08:00
} break ;
case DATA_TYPE_FONT : {
ERR_FAIL_COND_MSG ( p_value . get_type ( ) ! = Variant : : OBJECT , " Theme item's data type (Object) does not match Variant's type ( " + Variant : : get_type_name ( p_value . get_type ( ) ) + " ). " ) ;
Ref < Font > font_value = Object : : cast_to < Font > ( p_value . get_validated_object ( ) ) ;
2021-03-31 01:16:33 +08:00
set_font ( p_name , p_theme_type , font_value ) ;
2021-03-22 19:35:58 +08:00
} break ;
case DATA_TYPE_FONT_SIZE : {
ERR_FAIL_COND_MSG ( p_value . get_type ( ) ! = Variant : : INT , " Theme item's data type (int) does not match Variant's type ( " + Variant : : get_type_name ( p_value . get_type ( ) ) + " ). " ) ;
int font_size_value = p_value ;
2021-03-31 01:16:33 +08:00
set_font_size ( p_name , p_theme_type , font_size_value ) ;
2021-03-22 19:35:58 +08:00
} break ;
case DATA_TYPE_ICON : {
ERR_FAIL_COND_MSG ( p_value . get_type ( ) ! = Variant : : OBJECT , " Theme item's data type (Object) does not match Variant's type ( " + Variant : : get_type_name ( p_value . get_type ( ) ) + " ). " ) ;
Ref < Texture2D > icon_value = Object : : cast_to < Texture2D > ( p_value . get_validated_object ( ) ) ;
2021-03-31 01:16:33 +08:00
set_icon ( p_name , p_theme_type , icon_value ) ;
2021-03-22 19:35:58 +08:00
} break ;
case DATA_TYPE_STYLEBOX : {
ERR_FAIL_COND_MSG ( p_value . get_type ( ) ! = Variant : : OBJECT , " Theme item's data type (Object) does not match Variant's type ( " + Variant : : get_type_name ( p_value . get_type ( ) ) + " ). " ) ;
Ref < StyleBox > stylebox_value = Object : : cast_to < StyleBox > ( p_value . get_validated_object ( ) ) ;
2021-03-31 01:16:33 +08:00
set_stylebox ( p_name , p_theme_type , stylebox_value ) ;
2021-03-22 19:35:58 +08:00
} break ;
case DATA_TYPE_MAX :
break ; // Can't happen, but silences warning.
}
}
2021-03-31 01:16:33 +08:00
Variant Theme : : get_theme_item ( DataType p_data_type , const StringName & p_name , const StringName & p_theme_type ) const {
2021-03-22 19:35:58 +08:00
switch ( p_data_type ) {
case DATA_TYPE_COLOR :
2021-03-31 01:16:33 +08:00
return get_color ( p_name , p_theme_type ) ;
2021-03-22 19:35:58 +08:00
case DATA_TYPE_CONSTANT :
2021-03-31 01:16:33 +08:00
return get_constant ( p_name , p_theme_type ) ;
2021-03-22 19:35:58 +08:00
case DATA_TYPE_FONT :
2021-03-31 01:16:33 +08:00
return get_font ( p_name , p_theme_type ) ;
2021-03-22 19:35:58 +08:00
case DATA_TYPE_FONT_SIZE :
2021-03-31 01:16:33 +08:00
return get_font_size ( p_name , p_theme_type ) ;
2021-03-22 19:35:58 +08:00
case DATA_TYPE_ICON :
2021-03-31 01:16:33 +08:00
return get_icon ( p_name , p_theme_type ) ;
2021-03-22 19:35:58 +08:00
case DATA_TYPE_STYLEBOX :
2021-03-31 01:16:33 +08:00
return get_stylebox ( p_name , p_theme_type ) ;
2021-03-22 19:35:58 +08:00
case DATA_TYPE_MAX :
break ; // Can't happen, but silences warning.
}
return Variant ( ) ;
}
2021-03-31 01:16:33 +08:00
bool Theme : : has_theme_item ( DataType p_data_type , const StringName & p_name , const StringName & p_theme_type ) const {
2021-03-22 19:35:58 +08:00
switch ( p_data_type ) {
case DATA_TYPE_COLOR :
2021-03-31 01:16:33 +08:00
return has_color ( p_name , p_theme_type ) ;
2021-03-22 19:35:58 +08:00
case DATA_TYPE_CONSTANT :
2021-03-31 01:16:33 +08:00
return has_constant ( p_name , p_theme_type ) ;
2021-03-22 19:35:58 +08:00
case DATA_TYPE_FONT :
2021-03-31 01:16:33 +08:00
return has_font ( p_name , p_theme_type ) ;
2021-03-22 19:35:58 +08:00
case DATA_TYPE_FONT_SIZE :
2021-03-31 01:16:33 +08:00
return has_font_size ( p_name , p_theme_type ) ;
2021-03-22 19:35:58 +08:00
case DATA_TYPE_ICON :
2021-03-31 01:16:33 +08:00
return has_icon ( p_name , p_theme_type ) ;
2021-03-22 19:35:58 +08:00
case DATA_TYPE_STYLEBOX :
2021-03-31 01:16:33 +08:00
return has_stylebox ( p_name , p_theme_type ) ;
2021-03-22 19:35:58 +08:00
case DATA_TYPE_MAX :
break ; // Can't happen, but silences warning.
}
return false ;
}
2021-03-31 01:16:33 +08:00
bool Theme : : has_theme_item_nocheck ( DataType p_data_type , const StringName & p_name , const StringName & p_theme_type ) const {
2021-03-01 23:18:53 +08:00
switch ( p_data_type ) {
case DATA_TYPE_COLOR :
2021-03-31 01:16:33 +08:00
return has_color_nocheck ( p_name , p_theme_type ) ;
2021-03-01 23:18:53 +08:00
case DATA_TYPE_CONSTANT :
2021-03-31 01:16:33 +08:00
return has_constant_nocheck ( p_name , p_theme_type ) ;
2021-03-01 23:18:53 +08:00
case DATA_TYPE_FONT :
2021-03-31 01:16:33 +08:00
return has_font_nocheck ( p_name , p_theme_type ) ;
2021-03-01 23:18:53 +08:00
case DATA_TYPE_FONT_SIZE :
2021-03-31 01:16:33 +08:00
return has_font_size_nocheck ( p_name , p_theme_type ) ;
2021-03-01 23:18:53 +08:00
case DATA_TYPE_ICON :
2021-03-31 01:16:33 +08:00
return has_icon_nocheck ( p_name , p_theme_type ) ;
2021-03-01 23:18:53 +08:00
case DATA_TYPE_STYLEBOX :
2021-03-31 01:16:33 +08:00
return has_stylebox_nocheck ( p_name , p_theme_type ) ;
2021-03-01 23:18:53 +08:00
case DATA_TYPE_MAX :
break ; // Can't happen, but silences warning.
}
return false ;
}
2021-03-31 01:16:33 +08:00
void Theme : : rename_theme_item ( DataType p_data_type , const StringName & p_old_name , const StringName & p_name , const StringName & p_theme_type ) {
2021-03-22 19:35:58 +08:00
switch ( p_data_type ) {
case DATA_TYPE_COLOR :
2021-03-31 01:16:33 +08:00
rename_color ( p_old_name , p_name , p_theme_type ) ;
2021-03-22 19:35:58 +08:00
break ;
case DATA_TYPE_CONSTANT :
2021-03-31 01:16:33 +08:00
rename_constant ( p_old_name , p_name , p_theme_type ) ;
2021-03-22 19:35:58 +08:00
break ;
case DATA_TYPE_FONT :
2021-03-31 01:16:33 +08:00
rename_font ( p_old_name , p_name , p_theme_type ) ;
2021-03-22 19:35:58 +08:00
break ;
case DATA_TYPE_FONT_SIZE :
2021-03-31 01:16:33 +08:00
rename_font_size ( p_old_name , p_name , p_theme_type ) ;
2021-03-22 19:35:58 +08:00
break ;
case DATA_TYPE_ICON :
2021-03-31 01:16:33 +08:00
rename_icon ( p_old_name , p_name , p_theme_type ) ;
2021-03-22 19:35:58 +08:00
break ;
case DATA_TYPE_STYLEBOX :
2021-03-31 01:16:33 +08:00
rename_stylebox ( p_old_name , p_name , p_theme_type ) ;
2021-03-22 19:35:58 +08:00
break ;
case DATA_TYPE_MAX :
break ; // Can't happen, but silences warning.
}
}
2021-03-31 01:16:33 +08:00
void Theme : : clear_theme_item ( DataType p_data_type , const StringName & p_name , const StringName & p_theme_type ) {
2021-03-22 19:35:58 +08:00
switch ( p_data_type ) {
case DATA_TYPE_COLOR :
2021-03-31 01:16:33 +08:00
clear_color ( p_name , p_theme_type ) ;
2021-03-22 19:35:58 +08:00
break ;
case DATA_TYPE_CONSTANT :
2021-03-31 01:16:33 +08:00
clear_constant ( p_name , p_theme_type ) ;
2021-03-22 19:35:58 +08:00
break ;
case DATA_TYPE_FONT :
2021-03-31 01:16:33 +08:00
clear_font ( p_name , p_theme_type ) ;
2021-03-22 19:35:58 +08:00
break ;
case DATA_TYPE_FONT_SIZE :
2021-03-31 01:16:33 +08:00
clear_font_size ( p_name , p_theme_type ) ;
2021-03-22 19:35:58 +08:00
break ;
case DATA_TYPE_ICON :
2021-03-31 01:16:33 +08:00
clear_icon ( p_name , p_theme_type ) ;
2021-03-22 19:35:58 +08:00
break ;
case DATA_TYPE_STYLEBOX :
2021-03-31 01:16:33 +08:00
clear_stylebox ( p_name , p_theme_type ) ;
2021-03-22 19:35:58 +08:00
break ;
case DATA_TYPE_MAX :
break ; // Can't happen, but silences warning.
}
}
2021-03-31 01:16:33 +08:00
void Theme : : get_theme_item_list ( DataType p_data_type , StringName p_theme_type , List < StringName > * p_list ) const {
2021-03-22 19:35:58 +08:00
switch ( p_data_type ) {
case DATA_TYPE_COLOR :
2021-03-31 01:16:33 +08:00
get_color_list ( p_theme_type , p_list ) ;
2021-03-22 19:35:58 +08:00
break ;
case DATA_TYPE_CONSTANT :
2021-03-31 01:16:33 +08:00
get_constant_list ( p_theme_type , p_list ) ;
2021-03-22 19:35:58 +08:00
break ;
case DATA_TYPE_FONT :
2021-03-31 01:16:33 +08:00
get_font_list ( p_theme_type , p_list ) ;
2021-03-22 19:35:58 +08:00
break ;
case DATA_TYPE_FONT_SIZE :
2021-03-31 01:16:33 +08:00
get_font_size_list ( p_theme_type , p_list ) ;
2021-03-22 19:35:58 +08:00
break ;
case DATA_TYPE_ICON :
2021-03-31 01:16:33 +08:00
get_icon_list ( p_theme_type , p_list ) ;
2021-03-22 19:35:58 +08:00
break ;
case DATA_TYPE_STYLEBOX :
2021-03-31 01:16:33 +08:00
get_stylebox_list ( p_theme_type , p_list ) ;
2021-03-22 19:35:58 +08:00
break ;
case DATA_TYPE_MAX :
break ; // Can't happen, but silences warning.
}
}
2021-03-31 01:16:33 +08:00
void Theme : : add_theme_item_type ( DataType p_data_type , const StringName & p_theme_type ) {
2021-03-22 19:35:58 +08:00
switch ( p_data_type ) {
case DATA_TYPE_COLOR :
2021-03-31 01:16:33 +08:00
add_color_type ( p_theme_type ) ;
2021-03-22 19:35:58 +08:00
break ;
case DATA_TYPE_CONSTANT :
2021-03-31 01:16:33 +08:00
add_constant_type ( p_theme_type ) ;
2021-03-22 19:35:58 +08:00
break ;
case DATA_TYPE_FONT :
2021-03-31 01:16:33 +08:00
add_font_type ( p_theme_type ) ;
2021-03-22 19:35:58 +08:00
break ;
case DATA_TYPE_FONT_SIZE :
2021-03-31 01:16:33 +08:00
add_font_size_type ( p_theme_type ) ;
2021-03-22 19:35:58 +08:00
break ;
case DATA_TYPE_ICON :
2021-03-31 01:16:33 +08:00
add_icon_type ( p_theme_type ) ;
2021-03-22 19:35:58 +08:00
break ;
case DATA_TYPE_STYLEBOX :
2021-03-31 01:16:33 +08:00
add_stylebox_type ( p_theme_type ) ;
2021-03-22 19:35:58 +08:00
break ;
case DATA_TYPE_MAX :
break ; // Can't happen, but silences warning.
}
}
void Theme : : get_theme_item_type_list ( DataType p_data_type , List < StringName > * p_list ) const {
switch ( p_data_type ) {
case DATA_TYPE_COLOR :
get_color_type_list ( p_list ) ;
break ;
case DATA_TYPE_CONSTANT :
get_constant_type_list ( p_list ) ;
break ;
case DATA_TYPE_FONT :
get_font_type_list ( p_list ) ;
break ;
case DATA_TYPE_FONT_SIZE :
get_font_size_type_list ( p_list ) ;
break ;
case DATA_TYPE_ICON :
get_icon_type_list ( p_list ) ;
break ;
case DATA_TYPE_STYLEBOX :
get_stylebox_type_list ( p_list ) ;
break ;
case DATA_TYPE_MAX :
break ; // Can't happen, but silences warning.
}
}
2021-05-31 22:28:02 +08:00
void Theme : : _freeze_change_propagation ( ) {
no_change_propagation = true ;
}
void Theme : : _unfreeze_and_propagate_changes ( ) {
no_change_propagation = false ;
_emit_theme_changed ( ) ;
}
2018-11-28 01:33:14 +08:00
void Theme : : clear ( ) {
2021-05-31 22:28:02 +08:00
// These items need disconnecting.
2018-11-28 01:33:14 +08:00
{
2020-04-02 07:20:12 +08:00
const StringName * K = nullptr ;
2018-11-28 01:33:14 +08:00
while ( ( K = icon_map . next ( K ) ) ) {
2020-04-02 07:20:12 +08:00
const StringName * L = nullptr ;
2018-11-28 01:33:14 +08:00
while ( ( L = icon_map [ * K ] . next ( L ) ) ) {
2019-06-12 02:43:37 +08:00
Ref < Texture2D > icon = icon_map [ * K ] [ * L ] ;
2019-12-10 16:31:40 +08:00
if ( icon . is_valid ( ) ) {
2020-02-22 01:28:45 +08:00
icon - > disconnect ( " changed " , callable_mp ( this , & Theme : : _emit_theme_changed ) ) ;
2019-12-10 16:31:40 +08:00
}
2018-11-28 01:33:14 +08:00
}
}
}
{
2020-04-02 07:20:12 +08:00
const StringName * K = nullptr ;
2018-11-28 01:33:14 +08:00
while ( ( K = style_map . next ( K ) ) ) {
2020-04-02 07:20:12 +08:00
const StringName * L = nullptr ;
2018-11-28 01:33:14 +08:00
while ( ( L = style_map [ * K ] . next ( L ) ) ) {
2019-12-10 16:31:40 +08:00
Ref < StyleBox > style = style_map [ * K ] [ * L ] ;
if ( style . is_valid ( ) ) {
2020-02-22 01:28:45 +08:00
style - > disconnect ( " changed " , callable_mp ( this , & Theme : : _emit_theme_changed ) ) ;
2019-12-10 16:31:40 +08:00
}
2018-11-28 01:33:14 +08:00
}
}
}
{
2020-04-02 07:20:12 +08:00
const StringName * K = nullptr ;
2018-11-28 01:33:14 +08:00
while ( ( K = font_map . next ( K ) ) ) {
2020-04-02 07:20:12 +08:00
const StringName * L = nullptr ;
2018-11-28 01:33:14 +08:00
while ( ( L = font_map [ * K ] . next ( L ) ) ) {
2019-12-10 16:31:40 +08:00
Ref < Font > font = font_map [ * K ] [ * L ] ;
if ( font . is_valid ( ) ) {
2020-02-22 01:28:45 +08:00
font - > disconnect ( " changed " , callable_mp ( this , & Theme : : _emit_theme_changed ) ) ;
2019-12-10 16:31:40 +08:00
}
2018-11-28 01:33:14 +08:00
}
}
}
icon_map . clear ( ) ;
style_map . clear ( ) ;
font_map . clear ( ) ;
color_map . clear ( ) ;
constant_map . clear ( ) ;
2021-05-31 22:28:02 +08:00
_emit_theme_changed ( ) ;
2018-11-28 01:33:14 +08:00
}
2014-02-10 09:10:30 +08:00
void Theme : : copy_default_theme ( ) {
2019-02-13 04:10:08 +08:00
Ref < Theme > default_theme2 = get_default ( ) ;
copy_theme ( default_theme2 ) ;
2019-01-25 09:40:56 +08:00
}
void Theme : : copy_theme ( const Ref < Theme > & p_other ) {
2019-10-23 10:08:23 +08:00
if ( p_other . is_null ( ) ) {
clear ( ) ;
return ;
}
2021-05-31 22:28:02 +08:00
_freeze_change_propagation ( ) ;
2021-03-22 19:35:58 +08:00
// These items need reconnecting, so add them normally.
2018-11-28 01:33:14 +08:00
{
2020-04-02 07:20:12 +08:00
const StringName * K = nullptr ;
2019-01-25 09:40:56 +08:00
while ( ( K = p_other - > icon_map . next ( K ) ) ) {
2020-04-02 07:20:12 +08:00
const StringName * L = nullptr ;
2019-01-25 09:40:56 +08:00
while ( ( L = p_other - > icon_map [ * K ] . next ( L ) ) ) {
set_icon ( * L , * K , p_other - > icon_map [ * K ] [ * L ] ) ;
2018-11-28 01:33:14 +08:00
}
}
}
{
2020-04-02 07:20:12 +08:00
const StringName * K = nullptr ;
2019-01-25 09:40:56 +08:00
while ( ( K = p_other - > style_map . next ( K ) ) ) {
2020-04-02 07:20:12 +08:00
const StringName * L = nullptr ;
2019-01-25 09:40:56 +08:00
while ( ( L = p_other - > style_map [ * K ] . next ( L ) ) ) {
set_stylebox ( * L , * K , p_other - > style_map [ * K ] [ * L ] ) ;
2018-11-28 01:33:14 +08:00
}
}
}
{
2020-04-02 07:20:12 +08:00
const StringName * K = nullptr ;
2019-01-25 09:40:56 +08:00
while ( ( K = p_other - > font_map . next ( K ) ) ) {
2020-04-02 07:20:12 +08:00
const StringName * L = nullptr ;
2019-01-25 09:40:56 +08:00
while ( ( L = p_other - > font_map [ * K ] . next ( L ) ) ) {
set_font ( * L , * K , p_other - > font_map [ * K ] [ * L ] ) ;
2018-11-28 01:33:14 +08:00
}
}
}
2021-03-22 19:35:58 +08:00
// These items can be simply copied.
font_size_map = p_other - > font_size_map ;
2019-01-25 09:40:56 +08:00
color_map = p_other - > color_map ;
constant_map = p_other - > constant_map ;
2018-11-28 01:33:14 +08:00
2021-05-31 22:28:02 +08:00
_unfreeze_and_propagate_changes ( ) ;
2014-02-10 09:10:30 +08:00
}
void Theme : : get_type_list ( List < StringName > * p_list ) const {
2019-10-23 10:08:23 +08:00
ERR_FAIL_NULL ( p_list ) ;
2014-02-10 09:10:30 +08:00
2019-10-23 10:08:23 +08:00
Set < StringName > types ;
2020-04-02 07:20:12 +08:00
const StringName * key = nullptr ;
2014-02-10 09:10:30 +08:00
2017-03-05 23:44:50 +08:00
while ( ( key = icon_map . next ( key ) ) ) {
2014-02-10 09:10:30 +08:00
types . insert ( * key ) ;
}
2020-04-02 07:20:12 +08:00
key = nullptr ;
2014-02-10 09:10:30 +08:00
2017-03-05 23:44:50 +08:00
while ( ( key = style_map . next ( key ) ) ) {
2014-02-10 09:10:30 +08:00
types . insert ( * key ) ;
}
2020-04-02 07:20:12 +08:00
key = nullptr ;
2014-02-10 09:10:30 +08:00
2017-03-05 23:44:50 +08:00
while ( ( key = font_map . next ( key ) ) ) {
2014-02-10 09:10:30 +08:00
types . insert ( * key ) ;
}
2020-04-02 07:20:12 +08:00
key = nullptr ;
2014-02-10 09:10:30 +08:00
2017-03-05 23:44:50 +08:00
while ( ( key = color_map . next ( key ) ) ) {
2014-02-10 09:10:30 +08:00
types . insert ( * key ) ;
}
2020-04-02 07:20:12 +08:00
key = nullptr ;
2014-02-10 09:10:30 +08:00
2017-03-05 23:44:50 +08:00
while ( ( key = constant_map . next ( key ) ) ) {
2014-02-10 09:10:30 +08:00
types . insert ( * key ) ;
}
2017-03-05 23:44:50 +08:00
for ( Set < StringName > : : Element * E = types . front ( ) ; E ; E = E - > next ( ) ) {
2014-02-10 09:10:30 +08:00
p_list - > push_back ( E - > get ( ) ) ;
}
}
2021-03-31 01:16:33 +08:00
void Theme : : get_type_dependencies ( const StringName & p_theme_type , List < StringName > * p_list ) {
ERR_FAIL_NULL ( p_list ) ;
StringName class_name = p_theme_type ;
while ( class_name ! = StringName ( ) ) {
p_list - > push_back ( class_name ) ;
class_name = ClassDB : : get_parent_class_nocheck ( class_name ) ;
}
}
2021-02-12 01:18:45 +08:00
void Theme : : reset_state ( ) {
clear ( ) ;
}
2014-02-10 09:10:30 +08:00
void Theme : : _bind_methods ( ) {
2021-03-31 01:16:33 +08:00
ClassDB : : bind_method ( D_METHOD ( " set_icon " , " name " , " theme_type " , " texture " ) , & Theme : : set_icon ) ;
ClassDB : : bind_method ( D_METHOD ( " get_icon " , " name " , " theme_type " ) , & Theme : : get_icon ) ;
ClassDB : : bind_method ( D_METHOD ( " has_icon " , " name " , " theme_type " ) , & Theme : : has_icon ) ;
ClassDB : : bind_method ( D_METHOD ( " rename_icon " , " old_name " , " name " , " theme_type " ) , & Theme : : rename_icon ) ;
ClassDB : : bind_method ( D_METHOD ( " clear_icon " , " name " , " theme_type " ) , & Theme : : clear_icon ) ;
ClassDB : : bind_method ( D_METHOD ( " get_icon_list " , " theme_type " ) , & Theme : : _get_icon_list ) ;
2020-04-10 22:50:28 +08:00
ClassDB : : bind_method ( D_METHOD ( " get_icon_type_list " ) , & Theme : : _get_icon_type_list ) ;
2020-09-13 00:20:11 +08:00
2021-03-31 01:16:33 +08:00
ClassDB : : bind_method ( D_METHOD ( " set_stylebox " , " name " , " theme_type " , " texture " ) , & Theme : : set_stylebox ) ;
ClassDB : : bind_method ( D_METHOD ( " get_stylebox " , " name " , " theme_type " ) , & Theme : : get_stylebox ) ;
ClassDB : : bind_method ( D_METHOD ( " has_stylebox " , " name " , " theme_type " ) , & Theme : : has_stylebox ) ;
ClassDB : : bind_method ( D_METHOD ( " rename_stylebox " , " old_name " , " name " , " theme_type " ) , & Theme : : rename_stylebox ) ;
ClassDB : : bind_method ( D_METHOD ( " clear_stylebox " , " name " , " theme_type " ) , & Theme : : clear_stylebox ) ;
ClassDB : : bind_method ( D_METHOD ( " get_stylebox_list " , " theme_type " ) , & Theme : : _get_stylebox_list ) ;
2020-04-10 22:50:28 +08:00
ClassDB : : bind_method ( D_METHOD ( " get_stylebox_type_list " ) , & Theme : : _get_stylebox_type_list ) ;
2017-02-13 19:47:24 +08:00
2021-03-31 01:16:33 +08:00
ClassDB : : bind_method ( D_METHOD ( " set_font " , " name " , " theme_type " , " font " ) , & Theme : : set_font ) ;
ClassDB : : bind_method ( D_METHOD ( " get_font " , " name " , " theme_type " ) , & Theme : : get_font ) ;
ClassDB : : bind_method ( D_METHOD ( " has_font " , " name " , " theme_type " ) , & Theme : : has_font ) ;
ClassDB : : bind_method ( D_METHOD ( " rename_font " , " old_name " , " name " , " theme_type " ) , & Theme : : rename_font ) ;
ClassDB : : bind_method ( D_METHOD ( " clear_font " , " name " , " theme_type " ) , & Theme : : clear_font ) ;
ClassDB : : bind_method ( D_METHOD ( " get_font_list " , " theme_type " ) , & Theme : : _get_font_list ) ;
2020-04-10 22:50:28 +08:00
ClassDB : : bind_method ( D_METHOD ( " get_font_type_list " ) , & Theme : : _get_font_type_list ) ;
2017-02-13 19:47:24 +08:00
2021-03-31 01:16:33 +08:00
ClassDB : : bind_method ( D_METHOD ( " set_font_size " , " name " , " theme_type " , " font_size " ) , & Theme : : set_font_size ) ;
ClassDB : : bind_method ( D_METHOD ( " get_font_size " , " name " , " theme_type " ) , & Theme : : get_font_size ) ;
ClassDB : : bind_method ( D_METHOD ( " has_font_size " , " name " , " theme_type " ) , & Theme : : has_font_size ) ;
ClassDB : : bind_method ( D_METHOD ( " rename_font_size " , " old_name " , " name " , " theme_type " ) , & Theme : : rename_font_size ) ;
ClassDB : : bind_method ( D_METHOD ( " clear_font_size " , " name " , " theme_type " ) , & Theme : : clear_font_size ) ;
ClassDB : : bind_method ( D_METHOD ( " get_font_size_list " , " theme_type " ) , & Theme : : _get_font_size_list ) ;
2021-03-22 19:35:58 +08:00
ClassDB : : bind_method ( D_METHOD ( " get_font_size_type_list " ) , & Theme : : _get_font_size_type_list ) ;
2020-09-03 19:22:16 +08:00
2021-03-31 01:16:33 +08:00
ClassDB : : bind_method ( D_METHOD ( " set_color " , " name " , " theme_type " , " color " ) , & Theme : : set_color ) ;
ClassDB : : bind_method ( D_METHOD ( " get_color " , " name " , " theme_type " ) , & Theme : : get_color ) ;
ClassDB : : bind_method ( D_METHOD ( " has_color " , " name " , " theme_type " ) , & Theme : : has_color ) ;
ClassDB : : bind_method ( D_METHOD ( " rename_color " , " old_name " , " name " , " theme_type " ) , & Theme : : rename_color ) ;
ClassDB : : bind_method ( D_METHOD ( " clear_color " , " name " , " theme_type " ) , & Theme : : clear_color ) ;
ClassDB : : bind_method ( D_METHOD ( " get_color_list " , " theme_type " ) , & Theme : : _get_color_list ) ;
2020-04-10 22:50:28 +08:00
ClassDB : : bind_method ( D_METHOD ( " get_color_type_list " ) , & Theme : : _get_color_type_list ) ;
2017-02-13 19:47:24 +08:00
2021-03-31 01:16:33 +08:00
ClassDB : : bind_method ( D_METHOD ( " set_constant " , " name " , " theme_type " , " constant " ) , & Theme : : set_constant ) ;
ClassDB : : bind_method ( D_METHOD ( " get_constant " , " name " , " theme_type " ) , & Theme : : get_constant ) ;
ClassDB : : bind_method ( D_METHOD ( " has_constant " , " name " , " theme_type " ) , & Theme : : has_constant ) ;
ClassDB : : bind_method ( D_METHOD ( " rename_constant " , " old_name " , " name " , " theme_type " ) , & Theme : : rename_constant ) ;
ClassDB : : bind_method ( D_METHOD ( " clear_constant " , " name " , " theme_type " ) , & Theme : : clear_constant ) ;
ClassDB : : bind_method ( D_METHOD ( " get_constant_list " , " theme_type " ) , & Theme : : _get_constant_list ) ;
2020-04-10 22:50:28 +08:00
ClassDB : : bind_method ( D_METHOD ( " get_constant_type_list " ) , & Theme : : _get_constant_type_list ) ;
2017-02-13 19:47:24 +08:00
2018-11-28 01:33:14 +08:00
ClassDB : : bind_method ( D_METHOD ( " clear " ) , & Theme : : clear ) ;
2017-08-09 19:19:41 +08:00
ClassDB : : bind_method ( D_METHOD ( " set_default_font " , " font " ) , & Theme : : set_default_theme_font ) ;
ClassDB : : bind_method ( D_METHOD ( " get_default_font " ) , & Theme : : get_default_theme_font ) ;
2017-02-13 19:47:24 +08:00
2020-09-03 19:22:16 +08:00
ClassDB : : bind_method ( D_METHOD ( " set_default_font_size " , " font_size " ) , & Theme : : set_default_theme_font_size ) ;
ClassDB : : bind_method ( D_METHOD ( " get_default_font_size " ) , & Theme : : get_default_theme_font_size ) ;
2021-03-31 01:16:33 +08:00
ClassDB : : bind_method ( D_METHOD ( " set_theme_item " , " data_type " , " name " , " theme_type " , " value " ) , & Theme : : set_theme_item ) ;
ClassDB : : bind_method ( D_METHOD ( " get_theme_item " , " data_type " , " name " , " theme_type " ) , & Theme : : get_theme_item ) ;
ClassDB : : bind_method ( D_METHOD ( " has_theme_item " , " data_type " , " name " , " theme_type " ) , & Theme : : has_theme_item ) ;
ClassDB : : bind_method ( D_METHOD ( " rename_theme_item " , " data_type " , " old_name " , " name " , " theme_type " ) , & Theme : : rename_theme_item ) ;
ClassDB : : bind_method ( D_METHOD ( " clear_theme_item " , " data_type " , " name " , " theme_type " ) , & Theme : : clear_theme_item ) ;
ClassDB : : bind_method ( D_METHOD ( " get_theme_item_list " , " data_type " , " theme_type " ) , & Theme : : _get_theme_item_list ) ;
2021-03-22 19:35:58 +08:00
ClassDB : : bind_method ( D_METHOD ( " get_theme_item_type_list " , " data_type " ) , & Theme : : _get_theme_item_type_list ) ;
2020-04-10 22:50:28 +08:00
ClassDB : : bind_method ( D_METHOD ( " get_type_list " ) , & Theme : : _get_type_list ) ;
2016-06-18 03:00:27 +08:00
2017-03-05 23:44:50 +08:00
ClassDB : : bind_method ( " copy_default_theme " , & Theme : : copy_default_theme ) ;
2019-01-27 05:21:53 +08:00
ClassDB : : bind_method ( D_METHOD ( " copy_theme " , " other " ) , & Theme : : copy_theme ) ;
2016-06-18 03:00:27 +08:00
2017-03-05 23:44:50 +08:00
ADD_PROPERTY ( PropertyInfo ( Variant : : OBJECT , " default_font " , PROPERTY_HINT_RESOURCE_TYPE , " Font " ) , " set_default_font " , " get_default_font " ) ;
2020-09-03 19:22:16 +08:00
ADD_PROPERTY ( PropertyInfo ( Variant : : INT , " default_font_size " ) , " set_default_font_size " , " get_default_font_size " ) ;
2021-03-22 19:35:58 +08:00
BIND_ENUM_CONSTANT ( DATA_TYPE_COLOR ) ;
BIND_ENUM_CONSTANT ( DATA_TYPE_CONSTANT ) ;
2021-03-29 15:51:33 +08:00
BIND_ENUM_CONSTANT ( DATA_TYPE_FONT ) ;
BIND_ENUM_CONSTANT ( DATA_TYPE_FONT_SIZE ) ;
BIND_ENUM_CONSTANT ( DATA_TYPE_ICON ) ;
BIND_ENUM_CONSTANT ( DATA_TYPE_STYLEBOX ) ;
2021-03-22 19:35:58 +08:00
BIND_ENUM_CONSTANT ( DATA_TYPE_MAX ) ;
2014-02-10 09:10:30 +08:00
}
Theme : : Theme ( ) {
}
2017-03-05 23:44:50 +08:00
Theme : : ~ Theme ( ) {
2014-02-10 09:10:30 +08:00
}