2022-03-15 13:29:32 +01:00
/*************************************************************************/
/* editor_about.cpp */
/*************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
/* https://godotengine.org */
/*************************************************************************/
/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */
/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
/* "Software"), to deal in the Software without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of the Software, and to */
/* permit persons to whom the Software is furnished to do so, subject to */
/* the following conditions: */
/* */
/* The above copyright notice and this permission notice shall be */
/* included in all copies or substantial portions of the Software. */
/* */
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
# include "editor_about.h"
# include "core/authors.gen.h"
# include "core/donors.gen.h"
# include "core/license.gen.h"
# include "core/version.h"
2022-08-17 13:45:14 +02:00
# include "core/object/class_db.h"
2022-08-17 11:38:15 +02:00
# include "core/math/color.h"
2022-03-19 00:01:30 +01:00
# include "core/math/vector2.h"
# include "core/os/memory.h"
# include "core/os/os.h"
2022-08-17 13:45:14 +02:00
# include "core/object/reference.h"
2022-08-17 13:17:12 +02:00
# include "core/variant/variant.h"
2022-03-19 00:01:30 +01:00
# include "editor/editor_scale.h"
# include "scene/gui/box_container.h"
# include "scene/gui/control.h"
# include "scene/gui/item_list.h"
# include "scene/gui/label.h"
# include "scene/gui/link_button.h"
# include "scene/gui/rich_text_label.h"
# include "scene/gui/scroll_container.h"
# include "scene/gui/separator.h"
# include "scene/gui/split_container.h"
# include "scene/gui/tab_container.h"
# include "scene/gui/texture_rect.h"
# include "scene/gui/tree.h"
# include "scene/main/node.h"
2023-12-10 14:42:30 +01:00
# include "scene/resources/font/font.h"
2022-03-19 00:01:30 +01:00
# include "scene/resources/texture.h"
2022-03-15 13:29:32 +01:00
// The metadata key used to store and retrieve the version text to copy to the clipboard.
2023-07-11 16:07:36 +02:00
const String EditorAbout : : META_TEXT_TO_COPY = " text_to_copy " ;
2022-03-15 13:29:32 +01:00
void EditorAbout : : _notification ( int p_what ) {
switch ( p_what ) {
case NOTIFICATION_ENTER_TREE :
case NOTIFICATION_THEME_CHANGED : {
2022-08-17 20:57:16 +02:00
Ref < Font > font = get_theme_font ( " source " , " EditorFonts " ) ;
_tpl_text - > add_theme_font_override ( " normal_font " , font ) ;
_tpl_text - > add_theme_constant_override ( " line_separation " , 6 * EDSCALE ) ;
_license_text - > add_theme_font_override ( " normal_font " , font ) ;
_license_text - > add_theme_constant_override ( " line_separation " , 6 * EDSCALE ) ;
_logo - > set_texture ( get_theme_icon ( " Logo " , " EditorIcons " ) ) ;
2022-03-15 13:29:32 +01:00
} break ;
}
}
void EditorAbout : : _license_tree_selected ( ) {
TreeItem * selected = _tpl_tree - > get_selected ( ) ;
_tpl_text - > scroll_to_line ( 0 ) ;
_tpl_text - > set_text ( selected - > get_metadata ( 0 ) ) ;
}
void EditorAbout : : _version_button_pressed ( ) {
OS : : get_singleton ( ) - > set_clipboard ( version_btn - > get_meta ( META_TEXT_TO_COPY ) ) ;
}
void EditorAbout : : _bind_methods ( ) {
ClassDB : : bind_method ( " _version_button_pressed " , & EditorAbout : : _version_button_pressed ) ;
ClassDB : : bind_method ( D_METHOD ( " _license_tree_selected " ) , & EditorAbout : : _license_tree_selected ) ;
}
TextureRect * EditorAbout : : get_logo ( ) const {
return _logo ;
}
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 ) {
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 + + ) {
bool single_column = p_flag_single_column & 1 < < i ;
const char * const * names_ptr = p_src [ i ] ;
if ( * names_ptr ) {
Label * lbl = memnew ( Label ) ;
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 ) ;
il - > set_mouse_filter ( Control : : MOUSE_FILTER_IGNORE ) ;
2022-08-17 20:57:16 +02:00
il - > add_theme_constant_override ( " hseparation " , 16 * EDSCALE ) ;
2022-03-15 13:29:32 +01:00
while ( * names_ptr ) {
il - > add_item ( String : : utf8 ( * names_ptr + + ) , nullptr , false ) ;
}
il - > set_max_columns ( il - > get_item_count ( ) < 4 | | single_column ? 1 : 16 ) ;
vbc - > add_child ( il ) ;
HSeparator * hs = memnew ( HSeparator ) ;
hs - > set_modulate ( Color ( 0 , 0 , 0 , 0 ) ) ;
vbc - > add_child ( hs ) ;
}
}
return sc ;
}
EditorAbout : : EditorAbout ( ) {
2022-03-20 13:30:49 +01:00
set_title ( TTR ( " About Pandemonium " ) ) ;
2022-03-15 13:29:32 +01:00
set_hide_on_ok ( true ) ;
set_resizable ( true ) ;
VBoxContainer * vbc = memnew ( VBoxContainer ) ;
HBoxContainer * hbc = memnew ( HBoxContainer ) ;
hbc - > set_h_size_flags ( Control : : SIZE_EXPAND_FILL ) ;
hbc - > set_alignment ( BoxContainer : : ALIGN_CENTER ) ;
2022-08-17 20:57:16 +02:00
hbc - > add_theme_constant_override ( " separation " , 30 * EDSCALE ) ;
2022-03-15 13:29:32 +01:00
add_child ( vbc ) ;
vbc - > add_child ( hbc ) ;
_logo = memnew ( TextureRect ) ;
hbc - > add_child ( _logo ) ;
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 ) ;
String hash = String ( VERSION_HASH ) ;
if ( hash . length ( ) ! = 0 ) {
hash = " " + vformat ( " [%s] " , hash . left ( 9 ) ) ;
}
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 " , this , " _version_button_pressed " ) ;
version_info_vbc - > add_child ( version_btn ) ;
Label * about_text = memnew ( Label ) ;
about_text - > set_v_size_flags ( Control : : SIZE_SHRINK_CENTER ) ;
2022-12-31 21:07:05 +01:00
about_text - > set_text ( String : : utf8 ( " \xc2 \xa9 2007-2022 Juan Linietsky, Ariel Manzur. \n \xc2 \xa9 2014-2022 " ) +
TTR ( " Godot Engine contributors " ) + String : : utf8 ( " \n \xc2 \xa9 2022-2023 Péter Magyar. \n " ) ) ;
2022-03-15 13:29:32 +01:00
version_info_vbc - > add_child ( about_text ) ;
hbc - > add_child ( version_info_vbc ) ;
TabContainer * tc = memnew ( TabContainer ) ;
tc - > set_custom_minimum_size ( Size2 ( 950 , 400 ) * EDSCALE ) ;
tc - > set_v_size_flags ( Control : : SIZE_EXPAND_FILL ) ;
vbc - > add_child ( tc ) ;
// Authors
List < String > dev_sections ;
2022-03-20 13:30:49 +01:00
dev_sections . push_back ( TTR ( " Pandemonium Founder / Lead Developer " ) ) ;
dev_sections . push_back ( TTR ( " Godot Project Founders " ) ) ;
dev_sections . push_back ( TTR ( " Godot Lead Developer " ) ) ;
2022-03-15 13:29:32 +01: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.
2022-03-20 13:30:49 +01:00
dev_sections . push_back ( TTR ( " Godot Project Manager " ) ) ;
dev_sections . push_back ( TTR ( " Godot Developers " ) ) ;
const char * const * dev_src [ ] = { PANDEMONIUM_AUTHORS_FOUNDERS , GODOT_AUTHORS_FOUNDERS , GODOT_AUTHORS_LEAD_DEVELOPERS ,
GODOT_AUTHORS_PROJECT_MANAGERS , GODOT_AUTHORS_DEVELOPERS } ;
2022-03-15 13:29:32 +01:00
tc - > add_child ( _populate_list ( TTR ( " Authors " ) , dev_sections , dev_src , 1 ) ) ;
// Donors
List < String > donor_sections ;
donor_sections . push_back ( TTR ( " Platinum Sponsors " ) ) ;
donor_sections . push_back ( TTR ( " Gold Sponsors " ) ) ;
donor_sections . push_back ( TTR ( " Silver Sponsors " ) ) ;
donor_sections . push_back ( TTR ( " Bronze Sponsors " ) ) ;
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 " ) ) ;
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 } ;
tc - > add_child ( _populate_list ( TTR ( " Donors " ) , donor_sections , donor_src , 3 ) ) ;
// License
_license_text = memnew ( RichTextLabel ) ;
_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 ) ;
_license_text - > set_text ( String : : utf8 ( GODOT_LICENSE_TEXT ) ) ;
tc - > add_child ( _license_text ) ;
// Thirdparty License
VBoxContainer * license_thirdparty = memnew ( VBoxContainer ) ;
license_thirdparty - > set_name ( TTR ( " Third-party Licenses " ) ) ;
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 ) ;
tpl_label - > set_autowrap ( true ) ;
2022-03-20 13:30:49 +01:00
tpl_label - > set_text ( TTR ( " Pandemonium 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. " ) ) ;
2022-03-15 13:29:32 +01:00
tpl_label - > set_size ( Size2 ( 630 , 1 ) * EDSCALE ) ;
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 = " " ;
for ( int component_index = 0 ; component_index < COPYRIGHT_INFO_COUNT ; component_index + + ) {
const ComponentCopyright & component = COPYRIGHT_INFO [ component_index ] ;
TreeItem * ti = _tpl_tree - > create_item ( tpl_ti_tp ) ;
String component_name = component . name ;
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 + + ) {
text + = " \n " + String ( part . files [ file_num ] ) ;
}
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 ] ) ;
}
text + = copyright ;
long_text + = copyright ;
String license = " \n License: " + String ( part . license ) + " \n " ;
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 ) ;
String licensename = String ( LICENSE_NAMES [ i ] ) ;
ti - > set_text ( 0 , licensename ) ;
long_text + = " - " + licensename + " \n \n " ;
String licensebody = String ( LICENSE_BODIES [ i ] ) ;
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 ) ;
_tpl_text = memnew ( RichTextLabel ) ;
_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 ) ;
_tpl_tree - > connect ( " item_selected " , this , " _license_tree_selected " ) ;
tpl_ti_all - > select ( 0 ) ;
_tpl_text - > set_text ( tpl_ti_all - > get_metadata ( 0 ) ) ;
}
EditorAbout : : ~ EditorAbout ( ) { }