2017-07-22 19:14:44 +02:00
/*************************************************************************/
/* editor_about.cpp */
/*************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
2017-08-27 14:16:55 +02:00
/* https://godotengine.org */
2017-07-22 19:14:44 +02:00
/*************************************************************************/
2022-01-03 21:27:34 +01:00
/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */
/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */
2017-07-22 19:14:44 +02: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 00:50:27 +01:00
2017-07-22 19:14:44 +02:00
# include "editor_about.h"
2018-05-16 06:54:22 +02:00
# include "core/authors.gen.h"
# include "core/donors.gen.h"
# include "core/license.gen.h"
# include "core/version.h"
2017-07-22 19:14:44 +02:00
2019-12-24 01:20:54 +01:00
// The metadata key used to store and retrieve the version text to copy to the clipboard.
static const String META_TEXT_TO_COPY = " text_to_copy " ;
2020-03-06 18:00:16 +01:00
void EditorAbout : : _theme_changed ( ) {
2021-07-17 23:22:52 +02:00
const Ref < Font > font = get_theme_font ( SNAME ( " source " ) , SNAME ( " EditorFonts " ) ) ;
const int font_size = get_theme_font_size ( SNAME ( " source_size " ) , SNAME ( " EditorFonts " ) ) ;
2022-02-08 10:14:58 +01:00
_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 ) ;
2021-07-17 23:22:52 +02:00
_logo - > set_texture ( get_theme_icon ( SNAME ( " Logo " ) , SNAME ( " EditorIcons " ) ) ) ;
2020-03-06 18:00:16 +01:00
}
2017-11-27 16:51:12 +01:00
void EditorAbout : : _notification ( int p_what ) {
switch ( p_what ) {
2020-03-06 18:00:16 +01:00
case NOTIFICATION_ENTER_TREE : {
_theme_changed ( ) ;
2017-11-27 16:51:12 +01:00
} break ;
}
}
2017-07-22 19:14:44 +02:00
void EditorAbout : : _license_tree_selected ( ) {
TreeItem * selected = _tpl_tree - > get_selected ( ) ;
2019-11-05 15:57:36 +01:00
_tpl_text - > scroll_to_line ( 0 ) ;
2017-07-22 19:14:44 +02:00
_tpl_text - > set_text ( selected - > get_metadata ( 0 ) ) ;
}
2019-12-24 01:20:54 +01:00
void EditorAbout : : _version_button_pressed ( ) {
DisplayServer : : get_singleton ( ) - > clipboard_set ( version_btn - > get_meta ( META_TEXT_TO_COPY ) ) ;
}
2017-07-22 19:14:44 +02:00
void EditorAbout : : _bind_methods ( ) {
2019-12-24 01:20:54 +01:00
ClassDB : : bind_method ( D_METHOD ( " _version_button_pressed " ) , & EditorAbout : : _version_button_pressed ) ;
2017-07-22 19:14:44 +02:00
}
TextureRect * EditorAbout : : get_logo ( ) const {
return _logo ;
}
2018-05-16 06:54:22 +02:00
ScrollContainer * EditorAbout : : _populate_list ( const String & p_name , const List < String > & p_sections , const char * const * const p_src [ ] , const int p_flag_single_column ) {
2017-09-03 17:06:32 +02:00
ScrollContainer * sc = memnew ( ScrollContainer ) ;
sc - > set_name ( p_name ) ;
sc - > set_v_size_flags ( Control : : SIZE_EXPAND ) ;
VBoxContainer * vbc = memnew ( VBoxContainer ) ;
vbc - > set_h_size_flags ( Control : : SIZE_EXPAND_FILL ) ;
sc - > add_child ( vbc ) ;
for ( int i = 0 ; i < p_sections . size ( ) ; i + + ) {
2017-11-27 16:51:12 +01:00
bool single_column = p_flag_single_column & 1 < < i ;
2018-05-16 06:54:22 +02:00
const char * const * names_ptr = p_src [ i ] ;
2017-09-03 17:06:32 +02:00
if ( * names_ptr ) {
Label * lbl = memnew ( Label ) ;
2021-07-08 15:29:15 +02:00
lbl - > set_theme_type_variation ( " HeaderSmall " ) ;
2017-09-03 17:06:32 +02:00
lbl - > set_text ( p_sections [ i ] ) ;
vbc - > add_child ( lbl ) ;
ItemList * il = memnew ( ItemList ) ;
il - > set_h_size_flags ( Control : : SIZE_EXPAND_FILL ) ;
il - > set_same_column_width ( true ) ;
il - > set_auto_height ( true ) ;
2017-11-27 16:51:12 +01:00
il - > set_mouse_filter ( Control : : MOUSE_FILTER_IGNORE ) ;
2022-02-08 10:14:58 +01:00
il - > add_theme_constant_override ( " hseparation " , 16 * EDSCALE ) ;
2017-09-03 17:06:32 +02:00
while ( * names_ptr ) {
2020-04-02 01:20:12 +02:00
il - > add_item ( String : : utf8 ( * names_ptr + + ) , nullptr , false ) ;
2017-09-03 17:06:32 +02:00
}
2017-11-27 16:51:12 +01:00
il - > set_max_columns ( il - > get_item_count ( ) < 4 | | single_column ? 1 : 16 ) ;
2017-09-03 17:06:32 +02:00
vbc - > add_child ( il ) ;
HSeparator * hs = memnew ( HSeparator ) ;
hs - > set_modulate ( Color ( 0 , 0 , 0 , 0 ) ) ;
vbc - > add_child ( hs ) ;
}
}
return sc ;
}
2017-07-22 19:14:44 +02:00
EditorAbout : : EditorAbout ( ) {
set_title ( TTR ( " Thanks from the Godot community! " ) ) ;
set_hide_on_ok ( true ) ;
VBoxContainer * vbc = memnew ( VBoxContainer ) ;
2020-03-06 18:00:16 +01:00
vbc - > connect ( " theme_changed " , callable_mp ( this , & EditorAbout : : _theme_changed ) ) ;
2017-07-22 19:14:44 +02:00
HBoxContainer * hbc = memnew ( HBoxContainer ) ;
hbc - > set_h_size_flags ( Control : : SIZE_EXPAND_FILL ) ;
2021-11-25 03:58:47 +01:00
hbc - > set_alignment ( BoxContainer : : ALIGNMENT_CENTER ) ;
2022-02-08 10:14:58 +01:00
hbc - > add_theme_constant_override ( " separation " , 30 * EDSCALE ) ;
2017-07-22 19:14:44 +02:00
add_child ( vbc ) ;
vbc - > add_child ( hbc ) ;
_logo = memnew ( TextureRect ) ;
hbc - > add_child ( _logo ) ;
2019-12-24 01:20:54 +01:00
VBoxContainer * version_info_vbc = memnew ( VBoxContainer ) ;
// Add a dummy control node for spacing.
Control * v_spacer = memnew ( Control ) ;
version_info_vbc - > add_child ( v_spacer ) ;
version_btn = memnew ( LinkButton ) ;
2017-07-22 19:14:44 +02:00
String hash = String ( VERSION_HASH ) ;
2020-05-14 16:41:43 +02:00
if ( hash . length ( ) ! = 0 ) {
2021-06-07 23:51:18 +02:00
hash = " " + vformat ( " [%s] " , hash . left ( 9 ) ) ;
2020-05-14 16:41:43 +02:00
}
2019-12-24 01:20:54 +01:00
version_btn - > set_text ( VERSION_FULL_NAME + hash ) ;
// Set the text to copy in metadata as it slightly differs from the button's text.
version_btn - > set_meta ( META_TEXT_TO_COPY , " v " VERSION_FULL_BUILD + hash ) ;
version_btn - > set_underline_mode ( LinkButton : : UNDERLINE_MODE_ON_HOVER ) ;
version_btn - > set_tooltip ( TTR ( " Click to copy. " ) ) ;
version_btn - > connect ( " pressed " , callable_mp ( this , & EditorAbout : : _version_button_pressed ) ) ;
version_info_vbc - > add_child ( version_btn ) ;
2017-07-22 19:14:44 +02:00
Label * about_text = memnew ( Label ) ;
about_text - > set_v_size_flags ( Control : : SIZE_SHRINK_CENTER ) ;
2022-01-03 21:27:34 +01:00
about_text - > set_text ( String : : utf8 ( " \xc2 \xa9 2007-2022 Juan Linietsky, Ariel Manzur. \n \xc2 \xa9 2014-2022 " ) +
2021-10-28 15:19:35 +02:00
TTR ( " Godot Engine contributors " ) + " \n " ) ;
2019-12-24 01:20:54 +01:00
version_info_vbc - > add_child ( about_text ) ;
hbc - > add_child ( version_info_vbc ) ;
2017-07-22 19:14:44 +02:00
TabContainer * tc = memnew ( TabContainer ) ;
2019-10-05 17:18:25 +02:00
tc - > set_custom_minimum_size ( Size2 ( 950 , 400 ) * EDSCALE ) ;
2017-07-22 19:14:44 +02:00
tc - > set_v_size_flags ( Control : : SIZE_EXPAND_FILL ) ;
vbc - > add_child ( tc ) ;
2017-09-03 17:06:32 +02:00
// Authors
2017-07-22 19:14:44 +02:00
List < String > dev_sections ;
dev_sections . push_back ( TTR ( " Project Founders " ) ) ;
dev_sections . push_back ( TTR ( " Lead Developer " ) ) ;
2020-09-08 13:56:08 +02:00
// TRANSLATORS: This refers to a job title.
// The trailing space is used to distinguish with the project list application,
// you do not have to keep it in your translation.
dev_sections . push_back ( TTR ( " Project Manager " ) ) ;
2017-07-22 19:14:44 +02:00
dev_sections . push_back ( TTR ( " Developers " ) ) ;
2018-05-16 06:54:22 +02:00
const char * const * dev_src [ ] = { AUTHORS_FOUNDERS , AUTHORS_LEAD_DEVELOPERS ,
AUTHORS_PROJECT_MANAGERS , AUTHORS_DEVELOPERS } ;
2017-11-27 16:51:12 +01:00
tc - > add_child ( _populate_list ( TTR ( " Authors " ) , dev_sections , dev_src , 1 ) ) ;
2017-07-22 19:14:44 +02:00
2017-09-03 17:06:32 +02:00
// Donors
List < String > donor_sections ;
donor_sections . push_back ( TTR ( " Platinum Sponsors " ) ) ;
donor_sections . push_back ( TTR ( " Gold Sponsors " ) ) ;
2020-08-13 23:54:30 +02:00
donor_sections . push_back ( TTR ( " Silver Sponsors " ) ) ;
donor_sections . push_back ( TTR ( " Bronze Sponsors " ) ) ;
2017-09-03 17:06:32 +02:00
donor_sections . push_back ( TTR ( " Mini Sponsors " ) ) ;
donor_sections . push_back ( TTR ( " Gold Donors " ) ) ;
donor_sections . push_back ( TTR ( " Silver Donors " ) ) ;
donor_sections . push_back ( TTR ( " Bronze Donors " ) ) ;
2020-08-13 23:54:30 +02:00
const char * const * donor_src [ ] = { DONORS_SPONSOR_PLATINUM , DONORS_SPONSOR_GOLD ,
DONORS_SPONSOR_SILVER , DONORS_SPONSOR_BRONZE , DONORS_SPONSOR_MINI ,
DONORS_GOLD , DONORS_SILVER , DONORS_BRONZE } ;
2017-11-27 16:51:12 +01:00
tc - > add_child ( _populate_list ( TTR ( " Donors " ) , donor_sections , donor_src , 3 ) ) ;
2017-09-03 17:06:32 +02:00
// License
2017-07-22 19:14:44 +02:00
2017-12-01 15:37:25 +01:00
_license_text = memnew ( RichTextLabel ) ;
2017-11-27 16:51:12 +01:00
_license_text - > set_name ( TTR ( " License " ) ) ;
_license_text - > set_h_size_flags ( Control : : SIZE_EXPAND_FILL ) ;
_license_text - > set_v_size_flags ( Control : : SIZE_EXPAND_FILL ) ;
2018-05-16 06:54:22 +02:00
_license_text - > set_text ( String : : utf8 ( GODOT_LICENSE_TEXT ) ) ;
2017-11-27 16:51:12 +01:00
tc - > add_child ( _license_text ) ;
2017-07-22 19:14:44 +02:00
2017-09-03 17:06:32 +02:00
// Thirdparty License
2017-07-22 19:14:44 +02:00
VBoxContainer * license_thirdparty = memnew ( VBoxContainer ) ;
2019-08-21 19:32:58 +02:00
license_thirdparty - > set_name ( TTR ( " Third-party Licenses " ) ) ;
2017-07-22 19:14:44 +02:00
license_thirdparty - > set_h_size_flags ( Control : : SIZE_EXPAND_FILL ) ;
tc - > add_child ( license_thirdparty ) ;
Label * tpl_label = memnew ( Label ) ;
tpl_label - > set_h_size_flags ( Control : : SIZE_EXPAND_FILL ) ;
2021-07-04 16:43:55 +02:00
tpl_label - > set_autowrap_mode ( Label : : AUTOWRAP_WORD_SMART ) ;
2019-08-21 19:32:58 +02:00
tpl_label - > set_text ( TTR ( " Godot Engine relies on a number of third-party free and open source libraries, all compatible with the terms of its MIT license. The following is an exhaustive list of all such third-party components with their respective copyright statements and license terms. " ) ) ;
2018-06-02 02:28:49 +02:00
tpl_label - > set_size ( Size2 ( 630 , 1 ) * EDSCALE ) ;
2017-07-22 19:14:44 +02:00
license_thirdparty - > add_child ( tpl_label ) ;
HSplitContainer * tpl_hbc = memnew ( HSplitContainer ) ;
tpl_hbc - > set_h_size_flags ( Control : : SIZE_EXPAND_FILL ) ;
tpl_hbc - > set_v_size_flags ( Control : : SIZE_EXPAND_FILL ) ;
tpl_hbc - > set_split_offset ( 240 * EDSCALE ) ;
license_thirdparty - > add_child ( tpl_hbc ) ;
_tpl_tree = memnew ( Tree ) ;
_tpl_tree - > set_hide_root ( true ) ;
TreeItem * root = _tpl_tree - > create_item ( ) ;
TreeItem * tpl_ti_all = _tpl_tree - > create_item ( root ) ;
tpl_ti_all - > set_text ( 0 , TTR ( " All Components " ) ) ;
TreeItem * tpl_ti_tp = _tpl_tree - > create_item ( root ) ;
tpl_ti_tp - > set_text ( 0 , TTR ( " Components " ) ) ;
tpl_ti_tp - > set_selectable ( 0 , false ) ;
TreeItem * tpl_ti_lc = _tpl_tree - > create_item ( root ) ;
tpl_ti_lc - > set_text ( 0 , TTR ( " Licenses " ) ) ;
tpl_ti_lc - > set_selectable ( 0 , false ) ;
String long_text = " " ;
2018-05-16 06:54:22 +02:00
for ( int component_index = 0 ; component_index < COPYRIGHT_INFO_COUNT ; component_index + + ) {
const ComponentCopyright & component = COPYRIGHT_INFO [ component_index ] ;
2017-07-22 19:14:44 +02:00
TreeItem * ti = _tpl_tree - > create_item ( tpl_ti_tp ) ;
2020-09-03 13:22:16 +02:00
String component_name = String : : utf8 ( component . name ) ;
2018-05-16 06:54:22 +02:00
ti - > set_text ( 0 , component_name ) ;
String text = component_name + " \n " ;
long_text + = " - " + component_name + " \n " ;
for ( int part_index = 0 ; part_index < component . part_count ; part_index + + ) {
const ComponentCopyrightPart & part = component . parts [ part_index ] ;
text + = " \n Files: " ;
for ( int file_num = 0 ; file_num < part . file_count ; file_num + + ) {
2020-09-03 13:22:16 +02:00
text + = " \n " + String : : utf8 ( part . files [ file_num ] ) ;
2018-05-16 06:54:22 +02:00
}
String copyright ;
for ( int copyright_index = 0 ; copyright_index < part . copyright_count ; copyright_index + + ) {
copyright + = String : : utf8 ( " \n \xc2 \xa9 " ) + String : : utf8 ( part . copyright_statements [ copyright_index ] ) ;
}
2017-07-22 19:14:44 +02:00
text + = copyright ;
long_text + = copyright ;
2020-09-03 13:22:16 +02:00
String license = " \n License: " + String : : utf8 ( part . license ) + " \n " ;
2017-07-22 19:14:44 +02:00
text + = license ;
long_text + = license + " \n " ;
}
ti - > set_metadata ( 0 , text ) ;
}
for ( int i = 0 ; i < LICENSE_COUNT ; i + + ) {
TreeItem * ti = _tpl_tree - > create_item ( tpl_ti_lc ) ;
2020-09-03 13:22:16 +02:00
String licensename = String : : utf8 ( LICENSE_NAMES [ i ] ) ;
2017-07-22 19:14:44 +02:00
ti - > set_text ( 0 , licensename ) ;
long_text + = " - " + licensename + " \n \n " ;
2020-09-03 13:22:16 +02:00
String licensebody = String : : utf8 ( LICENSE_BODIES [ i ] ) ;
2017-07-22 19:14:44 +02:00
ti - > set_metadata ( 0 , licensebody ) ;
long_text + = " " + licensebody . replace ( " \n " , " \n " ) + " \n \n " ;
}
tpl_ti_all - > set_metadata ( 0 , long_text ) ;
tpl_hbc - > add_child ( _tpl_tree ) ;
2017-12-01 15:37:25 +01:00
_tpl_text = memnew ( RichTextLabel ) ;
2017-07-22 19:14:44 +02:00
_tpl_text - > set_h_size_flags ( Control : : SIZE_EXPAND_FILL ) ;
_tpl_text - > set_v_size_flags ( Control : : SIZE_EXPAND_FILL ) ;
tpl_hbc - > add_child ( _tpl_text ) ;
2020-02-21 18:28:45 +01:00
_tpl_tree - > connect ( " item_selected " , callable_mp ( this , & EditorAbout : : _license_tree_selected ) ) ;
2017-07-22 19:14:44 +02:00
tpl_ti_all - > select ( 0 ) ;
_tpl_text - > set_text ( tpl_ti_all - > get_metadata ( 0 ) ) ;
}
EditorAbout : : ~ EditorAbout ( ) { }