2023-01-05 13:25:55 +01:00
/**************************************************************************/
/* project_export.cpp */
/**************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
/* https://godotengine.org */
/**************************************************************************/
/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */
/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */
/* */
/* 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
2014-02-10 02:10:30 +01:00
# include "project_export.h"
2018-08-18 15:07:23 +02:00
2020-11-07 23:33:38 +01:00
# include "core/config/project_settings.h"
2022-07-21 00:45:01 +02:00
# include "core/version.h"
# include "editor/editor_file_system.h"
2022-02-12 02:46:22 +01:00
# include "editor/editor_node.h"
2022-07-21 00:45:01 +02:00
# include "editor/editor_properties.h"
2022-11-19 12:45:49 +01:00
# include "editor/editor_settings.h"
2023-08-13 02:33:39 +02:00
# include "editor/editor_string_names.h"
2022-07-21 00:45:01 +02:00
# include "editor/export/editor_export.h"
2023-04-07 18:59:49 +02:00
# include "editor/gui/editor_file_dialog.h"
2023-06-20 04:50:09 +02:00
# include "editor/import/resource_importer_texture_settings.h"
2024-01-15 13:14:55 +01:00
# include "editor/themes/editor_scale.h"
2022-11-19 12:45:49 +01:00
# include "scene/gui/check_box.h"
2022-08-01 16:04:35 +02:00
# include "scene/gui/check_button.h"
2022-11-19 12:45:49 +01:00
# include "scene/gui/item_list.h"
2022-07-21 00:45:01 +02:00
# include "scene/gui/link_button.h"
2024-02-23 14:51:47 +01:00
# include "scene/gui/margin_container.h"
2022-11-19 12:45:49 +01:00
# include "scene/gui/menu_button.h"
# include "scene/gui/option_button.h"
2022-12-20 22:49:11 +01:00
# include "scene/gui/popup_menu.h"
2022-11-19 12:45:49 +01:00
# include "scene/gui/split_container.h"
2023-04-07 18:59:49 +02:00
# include "scene/gui/tab_container.h"
2022-11-19 12:45:49 +01:00
# include "scene/gui/texture_rect.h"
2022-07-21 00:45:01 +02:00
# include "scene/gui/tree.h"
2014-02-10 02:10:30 +01:00
2023-06-20 04:50:09 +02:00
void ProjectExportTextureFormatError : : _on_fix_texture_format_pressed ( ) {
ProjectSettings : : get_singleton ( ) - > set_setting ( setting_identifier , true ) ;
ProjectSettings : : get_singleton ( ) - > save ( ) ;
EditorFileSystem : : get_singleton ( ) - > scan_changes ( ) ;
emit_signal ( " texture_format_enabled " ) ;
}
void ProjectExportTextureFormatError : : _bind_methods ( ) {
ADD_SIGNAL ( MethodInfo ( " texture_format_enabled " ) ) ;
}
void ProjectExportTextureFormatError : : _notification ( int p_what ) {
switch ( p_what ) {
case NOTIFICATION_THEME_CHANGED : {
2024-05-14 15:57:29 +02:00
texture_format_error_label - > add_theme_color_override ( SceneStringName ( font_color ) , get_theme_color ( SNAME ( " error_color " ) , EditorStringName ( Editor ) ) ) ;
2023-06-20 04:50:09 +02:00
} break ;
}
}
void ProjectExportTextureFormatError : : show_for_texture_format ( const String & p_friendly_name , const String & p_setting_identifier ) {
texture_format_error_label - > set_text ( vformat ( TTR ( " Target platform requires '%s' texture compression. Enable 'Import %s' to fix. " ) , p_friendly_name , p_friendly_name . replace ( " / " , " " ) ) ) ;
setting_identifier = p_setting_identifier ;
show ( ) ;
}
ProjectExportTextureFormatError : : ProjectExportTextureFormatError ( ) {
// Set up the label.
texture_format_error_label = memnew ( Label ) ;
add_child ( texture_format_error_label ) ;
// Set up the fix button.
fix_texture_format_button = memnew ( LinkButton ) ;
fix_texture_format_button - > set_v_size_flags ( Control : : SIZE_SHRINK_CENTER ) ;
fix_texture_format_button - > set_text ( TTR ( " Fix Import " ) ) ;
add_child ( fix_texture_format_button ) ;
2024-05-14 09:40:21 +02:00
fix_texture_format_button - > connect ( SceneStringName ( pressed ) , callable_mp ( this , & ProjectExportTextureFormatError : : _on_fix_texture_format_pressed ) ) ;
2023-06-20 04:50:09 +02:00
}
2017-02-20 03:19:30 +01:00
void ProjectExportDialog : : _notification ( int p_what ) {
2017-03-02 22:43:56 +01:00
switch ( p_what ) {
2020-03-06 18:00:16 +01:00
case NOTIFICATION_VISIBILITY_CHANGED : {
if ( ! is_visible ( ) ) {
EditorSettings : : get_singleton ( ) - > set_project_metadata ( " dialog_bounds " , " export " , Rect2 ( get_position ( ) , get_size ( ) ) ) ;
}
} break ;
2022-02-16 15:17:55 +01:00
2023-12-04 13:18:48 +01:00
case NOTIFICATION_THEME_CHANGED : {
duplicate_preset - > set_icon ( presets - > get_editor_theme_icon ( SNAME ( " Duplicate " ) ) ) ;
delete_preset - > set_icon ( presets - > get_editor_theme_icon ( SNAME ( " Remove " ) ) ) ;
2024-09-17 12:48:10 +02:00
patch_add_btn - > set_icon ( get_editor_theme_icon ( SNAME ( " Add " ) ) ) ;
2023-12-04 13:18:48 +01:00
} break ;
2017-03-02 22:43:56 +01:00
case NOTIFICATION_READY : {
2023-08-13 02:33:39 +02:00
duplicate_preset - > set_icon ( presets - > get_editor_theme_icon ( SNAME ( " Duplicate " ) ) ) ;
delete_preset - > set_icon ( presets - > get_editor_theme_icon ( SNAME ( " Remove " ) ) ) ;
2024-09-17 12:48:10 +02:00
patch_add_btn - > set_icon ( get_editor_theme_icon ( SNAME ( " Add " ) ) ) ;
2024-05-14 14:28:18 +02:00
connect ( SceneStringName ( confirmed ) , callable_mp ( this , & ProjectExportDialog : : _export_pck_zip ) ) ;
2019-11-04 16:29:09 +01:00
_update_export_all ( ) ;
2018-02-25 17:04:16 +01:00
} break ;
2014-02-10 02:10:30 +01:00
}
}
2016-01-27 11:23:12 +01:00
void ProjectExportDialog : : popup_export ( ) {
2017-02-20 03:19:30 +01:00
add_preset - > get_popup ( ) - > clear ( ) ;
2017-03-05 16:44:50 +01:00
for ( int i = 0 ; i < EditorExport : : get_singleton ( ) - > get_export_platform_count ( ) ; i + + ) {
2017-02-20 03:19:30 +01:00
Ref < EditorExportPlatform > plat = EditorExport : : get_singleton ( ) - > get_export_platform ( i ) ;
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
add_preset - > get_popup ( ) - > add_icon_item ( plat - > get_logo ( ) , plat - > get_name ( ) ) ;
2014-02-10 02:10:30 +01:00
}
2017-02-20 03:19:30 +01:00
_update_presets ( ) ;
2018-07-18 13:46:02 +02:00
if ( presets - > get_current ( ) > = 0 ) {
2018-12-23 19:28:29 +01:00
_update_current_preset ( ) ; // triggers rescan for templates if newly installed
2018-07-18 13:46:02 +02:00
}
2017-03-02 22:43:56 +01:00
// Restore valid window bounds or pop up at default size.
2018-12-04 16:52:56 +01:00
Rect2 saved_size = EditorSettings : : get_singleton ( ) - > get_project_metadata ( " dialog_bounds " , " export " , Rect2 ( ) ) ;
if ( saved_size ! = Rect2 ( ) ) {
popup ( saved_size ) ;
2017-03-02 22:43:56 +01:00
} else {
2024-04-29 01:37:41 +02:00
popup_centered_clamped ( Size2 ( 900 , 500 ) * EDSCALE , 0.7 ) ;
2017-03-02 22:43:56 +01:00
}
2014-02-10 02:10:30 +01:00
}
2017-02-20 03:19:30 +01:00
void ProjectExportDialog : : _add_preset ( int p_platform ) {
Ref < EditorExportPreset > preset = EditorExport : : get_singleton ( ) - > get_export_platform ( p_platform ) - > create_preset ( ) ;
ERR_FAIL_COND ( ! preset . is_valid ( ) ) ;
2014-02-10 02:10:30 +01:00
2022-09-29 11:53:28 +02:00
String preset_name = EditorExport : : get_singleton ( ) - > get_export_platform ( p_platform ) - > get_name ( ) ;
2017-03-05 16:44:50 +01:00
bool make_runnable = true ;
int attempt = 1 ;
while ( true ) {
bool valid = true ;
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
for ( int i = 0 ; i < EditorExport : : get_singleton ( ) - > get_export_preset_count ( ) ; i + + ) {
2017-02-20 03:19:30 +01:00
Ref < EditorExportPreset > p = EditorExport : : get_singleton ( ) - > get_export_preset ( i ) ;
2017-03-05 16:44:50 +01:00
if ( p - > get_platform ( ) = = preset - > get_platform ( ) & & p - > is_runnable ( ) ) {
make_runnable = false ;
2017-02-20 03:19:30 +01:00
}
2022-09-29 11:53:28 +02:00
if ( p - > get_name ( ) = = preset_name ) {
2017-03-05 16:44:50 +01:00
valid = false ;
2017-02-20 03:19:30 +01:00
break ;
}
}
2014-02-10 02:10:30 +01:00
2020-05-14 16:41:43 +02:00
if ( valid ) {
2017-02-20 03:19:30 +01:00
break ;
2020-05-14 16:41:43 +02:00
}
2014-02-10 02:10:30 +01:00
2017-02-20 03:19:30 +01:00
attempt + + ;
2022-09-29 11:53:28 +02:00
preset_name = EditorExport : : get_singleton ( ) - > get_export_platform ( p_platform ) - > get_name ( ) + " " + itos ( attempt ) ;
2016-01-27 11:23:12 +01:00
}
2022-09-29 11:53:28 +02:00
preset - > set_name ( preset_name ) ;
2020-05-14 16:41:43 +02:00
if ( make_runnable ) {
2017-02-20 03:19:30 +01:00
preset - > set_runnable ( make_runnable ) ;
2020-05-14 16:41:43 +02:00
}
2017-02-20 03:19:30 +01:00
EditorExport : : get_singleton ( ) - > add_export_preset ( preset ) ;
_update_presets ( ) ;
2017-03-05 16:44:50 +01:00
_edit_preset ( EditorExport : : get_singleton ( ) - > get_export_preset_count ( ) - 1 ) ;
2014-02-10 02:10:30 +01:00
}
2020-04-24 09:45:14 +02:00
void ProjectExportDialog : : _force_update_current_preset_parameters ( ) {
// Force the parameters section to refresh its UI.
parameters - > edit ( nullptr ) ;
_update_current_preset ( ) ;
}
2018-12-23 19:28:29 +01:00
void ProjectExportDialog : : _update_current_preset ( ) {
_edit_preset ( presets - > get_current ( ) ) ;
}
2017-02-20 03:19:30 +01:00
void ProjectExportDialog : : _update_presets ( ) {
2017-03-05 16:44:50 +01:00
updating = true ;
2014-02-10 02:10:30 +01:00
2017-02-20 03:19:30 +01:00
Ref < EditorExportPreset > current ;
2020-05-14 16:41:43 +02:00
if ( presets - > get_current ( ) > = 0 & & presets - > get_current ( ) < presets - > get_item_count ( ) ) {
2018-12-23 19:28:29 +01:00
current = get_current_preset ( ) ;
2020-05-14 16:41:43 +02:00
}
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
int current_idx = - 1 ;
2017-02-20 03:19:30 +01:00
presets - > clear ( ) ;
2017-03-05 16:44:50 +01:00
for ( int i = 0 ; i < EditorExport : : get_singleton ( ) - > get_export_preset_count ( ) ; i + + ) {
2017-02-20 03:19:30 +01:00
Ref < EditorExportPreset > preset = EditorExport : : get_singleton ( ) - > get_export_preset ( i ) ;
2017-03-05 16:44:50 +01:00
if ( preset = = current ) {
current_idx = i ;
2017-02-20 03:19:30 +01:00
}
2014-02-10 02:10:30 +01:00
2022-09-29 11:53:28 +02:00
String preset_name = preset - > get_name ( ) ;
2020-05-14 16:41:43 +02:00
if ( preset - > is_runnable ( ) ) {
2022-09-29 11:53:28 +02:00
preset_name + = " ( " + TTR ( " Runnable " ) + " ) " ;
2020-05-14 16:41:43 +02:00
}
2022-12-20 22:49:11 +01:00
preset - > update_files ( ) ;
2022-09-29 11:53:28 +02:00
presets - > add_item ( preset_name , preset - > get_platform ( ) - > get_logo ( ) ) ;
2017-02-20 03:19:30 +01:00
}
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
if ( current_idx ! = - 1 ) {
2017-02-20 03:19:30 +01:00
presets - > select ( current_idx ) ;
}
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
updating = false ;
2014-02-10 02:10:30 +01:00
}
2018-11-03 16:56:31 +01:00
void ProjectExportDialog : : _update_export_all ( ) {
2019-06-26 15:08:25 +02:00
bool can_export = EditorExport : : get_singleton ( ) - > get_export_preset_count ( ) > 0 ;
2018-11-03 16:56:31 +01:00
for ( int i = 0 ; i < EditorExport : : get_singleton ( ) - > get_export_preset_count ( ) ; i + + ) {
Ref < EditorExportPreset > preset = EditorExport : : get_singleton ( ) - > get_export_preset ( i ) ;
bool needs_templates ;
String error ;
2021-12-09 10:42:46 +01:00
if ( preset - > get_export_path ( ) . is_empty ( ) | | ! preset - > get_platform ( ) - > can_export ( preset , error , needs_templates ) ) {
2018-11-03 16:56:31 +01:00
can_export = false ;
break ;
}
}
2019-11-04 16:29:09 +01:00
export_all_button - > set_disabled ( ! can_export ) ;
2018-11-03 16:56:31 +01:00
if ( can_export ) {
2022-08-25 12:42:17 +02:00
export_all_button - > set_tooltip_text ( TTR ( " Export the project for all the presets defined. " ) ) ;
2018-11-03 16:56:31 +01:00
} else {
2022-08-25 12:42:17 +02:00
export_all_button - > set_tooltip_text ( TTR ( " All presets must have an export path defined for Export All to work. " ) ) ;
2018-11-03 16:56:31 +01:00
}
}
2017-02-20 03:19:30 +01:00
void ProjectExportDialog : : _edit_preset ( int p_index ) {
2017-03-05 16:44:50 +01:00
if ( p_index < 0 | | p_index > = presets - > get_item_count ( ) ) {
2017-02-20 03:19:30 +01:00
name - > set_text ( " " ) ;
name - > set_editable ( false ) ;
2018-11-12 20:04:58 +01:00
export_path - > hide ( ) ;
2024-02-16 23:05:50 +01:00
advanced_options - > set_disabled ( true ) ;
2017-02-20 03:19:30 +01:00
runnable - > set_disabled ( true ) ;
2020-04-02 01:20:12 +02:00
parameters - > edit ( nullptr ) ;
2020-12-21 11:26:41 +01:00
presets - > deselect_all ( ) ;
2018-10-28 19:13:38 +01:00
duplicate_preset - > set_disabled ( true ) ;
2017-02-20 03:19:30 +01:00
delete_preset - > set_disabled ( true ) ;
sections - > hide ( ) ;
2024-09-17 12:48:10 +02:00
patches - > clear ( ) ;
2017-03-21 03:31:41 +01:00
export_error - > hide ( ) ;
export_templates_error - > hide ( ) ;
2017-02-20 03:19:30 +01:00
return ;
}
2014-02-10 02:10:30 +01:00
2017-02-20 03:19:30 +01:00
Ref < EditorExportPreset > current = EditorExport : : get_singleton ( ) - > get_export_preset ( p_index ) ;
ERR_FAIL_COND ( current . is_null ( ) ) ;
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
updating = true ;
2014-02-10 02:10:30 +01:00
2017-02-20 03:19:30 +01:00
presets - > select ( p_index ) ;
sections - > show ( ) ;
name - > set_editable ( true ) ;
2018-11-12 20:04:58 +01:00
export_path - > show ( ) ;
2018-10-28 19:13:38 +01:00
duplicate_preset - > set_disabled ( false ) ;
2017-02-20 03:19:30 +01:00
delete_preset - > set_disabled ( false ) ;
2022-07-12 00:13:38 +02:00
get_ok_button ( ) - > set_disabled ( false ) ;
2017-02-20 03:19:30 +01:00
name - > set_text ( current - > get_name ( ) ) ;
2018-11-12 20:04:58 +01:00
List < String > extension_list = current - > get_platform ( ) - > get_binary_extensions ( current ) ;
Vector < String > extension_vector ;
2024-04-15 15:18:34 +02:00
for ( const String & extension : extension_list ) {
extension_vector . push_back ( " *. " + extension ) ;
2018-11-12 20:04:58 +01:00
}
export_path - > setup ( extension_vector , false , true ) ;
export_path - > update_property ( ) ;
2024-02-16 23:05:50 +01:00
advanced_options - > set_disabled ( false ) ;
advanced_options - > set_pressed ( current - > are_advanced_options_enabled ( ) ) ;
2017-02-20 03:19:30 +01:00
runnable - > set_disabled ( false ) ;
runnable - > set_pressed ( current - > is_runnable ( ) ) ;
2024-02-12 23:16:48 +01:00
if ( parameters - > get_edited_object ( ) ! = current . ptr ( ) ) {
current - > update_value_overrides ( ) ;
}
2023-03-09 09:41:52 +01:00
parameters - > set_object_class ( current - > get_platform ( ) - > get_class_name ( ) ) ;
2017-02-20 03:19:30 +01:00
parameters - > edit ( current . ptr ( ) ) ;
export_filter - > select ( current - > get_export_filter ( ) ) ;
include_filters - > set_text ( current - > get_include_filter ( ) ) ;
2023-07-20 23:27:40 +02:00
include_label - > set_text ( _get_resource_export_header ( current - > get_export_filter ( ) ) ) ;
2017-02-20 03:19:30 +01:00
exclude_filters - > set_text ( current - > get_exclude_filter ( ) ) ;
2022-12-20 22:49:11 +01:00
server_strip_message - > set_visible ( current - > get_export_filter ( ) = = EditorExportPreset : : EXPORT_CUSTOMIZED ) ;
2017-02-20 03:19:30 +01:00
2024-09-17 12:48:10 +02:00
patches - > clear ( ) ;
TreeItem * patch_root = patches - > create_item ( ) ;
Vector < String > patch_list = current - > get_patches ( ) ;
for ( int i = 0 ; i < patch_list . size ( ) ; i + + ) {
TreeItem * patch = patches - > create_item ( patch_root ) ;
const String & patch_path = patch_list [ i ] ;
patch - > set_cell_mode ( 0 , TreeItem : : CELL_MODE_STRING ) ;
patch - > set_editable ( 0 , true ) ;
patch - > set_text ( 0 , patch_path . get_file ( ) ) ;
patch - > set_tooltip_text ( 0 , patch_path ) ;
patch - > set_metadata ( 0 , i ) ;
patch - > add_button ( 0 , get_editor_theme_icon ( SNAME ( " Remove " ) ) , 0 ) ;
patch - > add_button ( 0 , get_editor_theme_icon ( SNAME ( " FileBrowse " ) ) , 1 ) ;
}
2017-02-20 03:19:30 +01:00
_fill_resource_tree ( ) ;
2014-02-10 02:10:30 +01:00
2017-03-21 03:31:41 +01:00
bool needs_templates ;
String error ;
if ( ! current - > get_platform ( ) - > can_export ( current , error , needs_templates ) ) {
2021-12-09 10:42:46 +01:00
if ( ! error . is_empty ( ) ) {
2018-08-17 11:27:26 +02:00
Vector < String > items = error . split ( " \n " , false ) ;
2017-03-21 03:31:41 +01:00
error = " " ;
for ( int i = 0 ; i < items . size ( ) ; i + + ) {
2020-05-14 16:41:43 +02:00
if ( i > 0 ) {
2017-03-21 03:31:41 +01:00
error + = " \n " ;
2020-05-14 16:41:43 +02:00
}
2017-03-21 03:31:41 +01:00
error + = " - " + items [ i ] ;
}
export_error - > set_text ( error ) ;
export_error - > show ( ) ;
} else {
export_error - > hide ( ) ;
}
2020-05-14 16:41:43 +02:00
if ( needs_templates ) {
2017-03-21 03:31:41 +01:00
export_templates_error - > show ( ) ;
2020-05-14 16:41:43 +02:00
} else {
2017-04-22 01:15:42 +02:00
export_templates_error - > hide ( ) ;
2020-05-14 16:41:43 +02:00
}
2017-03-21 03:31:41 +01:00
2022-01-10 12:18:59 +01:00
export_warning - > hide ( ) ;
2017-03-28 03:21:21 +02:00
export_button - > set_disabled ( true ) ;
2017-03-21 03:31:41 +01:00
} else {
2022-01-10 12:18:59 +01:00
if ( error ! = String ( ) ) {
Vector < String > items = error . split ( " \n " , false ) ;
error = " " ;
for ( int i = 0 ; i < items . size ( ) ; i + + ) {
if ( i > 0 ) {
error + = " \n " ;
}
error + = " - " + items [ i ] ;
}
export_warning - > set_text ( error ) ;
export_warning - > show ( ) ;
} else {
export_warning - > hide ( ) ;
}
2017-06-21 11:11:38 +02:00
export_error - > hide ( ) ;
2017-03-21 03:31:41 +01:00
export_templates_error - > hide ( ) ;
2017-03-28 03:21:21 +02:00
export_button - > set_disabled ( false ) ;
2017-03-21 03:31:41 +01:00
}
2017-07-19 22:00:46 +02:00
custom_features - > set_text ( current - > get_custom_features ( ) ) ;
_update_feature_list ( ) ;
2018-11-03 16:56:31 +01:00
_update_export_all ( ) ;
2020-03-06 18:00:16 +01:00
child_controls_changed ( ) ;
2017-07-19 22:00:46 +02:00
2023-06-20 04:50:09 +02:00
if ( ( feature_set . has ( " s3tc " ) | | feature_set . has ( " bptc " ) ) & & ! ResourceImporterTextureSettings : : should_import_s3tc_bptc ( ) ) {
export_texture_format_error - > show_for_texture_format ( " S3TC/BPTC " , " rendering/textures/vram_compression/import_s3tc_bptc " ) ;
} else if ( ( feature_set . has ( " etc2 " ) | | feature_set . has ( " astc " ) ) & & ! ResourceImporterTextureSettings : : should_import_etc2_astc ( ) ) {
export_texture_format_error - > show_for_texture_format ( " ETC2/ASTC " , " rendering/textures/vram_compression/import_etc2_astc " ) ;
} else {
export_texture_format_error - > hide ( ) ;
}
2020-04-28 19:51:29 +02:00
String enc_in_filters_str = current - > get_enc_in_filter ( ) ;
String enc_ex_filters_str = current - > get_enc_ex_filter ( ) ;
if ( ! updating_enc_filters ) {
enc_in_filters - > set_text ( enc_in_filters_str ) ;
enc_ex_filters - > set_text ( enc_ex_filters_str ) ;
}
bool enc_pck_mode = current - > get_enc_pck ( ) ;
enc_pck - > set_pressed ( enc_pck_mode ) ;
enc_directory - > set_disabled ( ! enc_pck_mode ) ;
enc_in_filters - > set_editable ( enc_pck_mode ) ;
enc_ex_filters - > set_editable ( enc_pck_mode ) ;
script_key - > set_editable ( enc_pck_mode ) ;
bool enc_directory_mode = current - > get_enc_directory ( ) ;
enc_directory - > set_pressed ( enc_directory_mode ) ;
2018-12-23 19:28:29 +01:00
String key = current - > get_script_encryption_key ( ) ;
if ( ! updating_script_key ) {
script_key - > set_text ( key ) ;
}
2020-04-28 19:51:29 +02:00
if ( enc_pck_mode ) {
2018-12-23 19:28:29 +01:00
script_key - > set_editable ( true ) ;
bool key_valid = _validate_script_encryption_key ( key ) ;
if ( key_valid ) {
script_key_error - > hide ( ) ;
} else {
script_key_error - > show ( ) ;
}
} else {
script_key - > set_editable ( false ) ;
script_key_error - > hide ( ) ;
}
2024-01-22 15:31:55 +01:00
int script_export_mode = current - > get_script_export_mode ( ) ;
script_mode - > select ( script_export_mode ) ;
2017-03-05 16:44:50 +01:00
updating = false ;
2014-02-26 14:08:17 +01:00
}
2017-07-19 22:00:46 +02:00
void ProjectExportDialog : : _update_feature_list ( ) {
2018-12-23 19:28:29 +01:00
Ref < EditorExportPreset > current = get_current_preset ( ) ;
2017-07-19 22:00:46 +02:00
ERR_FAIL_COND ( current . is_null ( ) ) ;
2023-06-20 04:50:09 +02:00
List < String > features_list ;
2017-07-19 22:00:46 +02:00
2023-06-20 04:50:09 +02:00
current - > get_platform ( ) - > get_platform_features ( & features_list ) ;
current - > get_platform ( ) - > get_preset_features ( current , & features_list ) ;
2017-07-19 22:00:46 +02:00
String custom = current - > get_custom_features ( ) ;
Vector < String > custom_list = custom . split ( " , " ) ;
for ( int i = 0 ; i < custom_list . size ( ) ; i + + ) {
String f = custom_list [ i ] . strip_edges ( ) ;
2021-12-09 10:42:46 +01:00
if ( ! f . is_empty ( ) ) {
2023-06-20 04:50:09 +02:00
features_list . push_back ( f ) ;
2017-07-19 22:00:46 +02:00
}
}
2023-06-20 04:50:09 +02:00
feature_set . clear ( ) ;
for ( const String & E : features_list ) {
feature_set . insert ( E ) ;
2017-07-19 22:00:46 +02:00
}
2023-11-10 13:35:03 +01:00
# ifdef REAL_T_IS_DOUBLE
feature_set . insert ( " double " ) ;
# else
feature_set . insert ( " single " ) ;
# endif // REAL_T_IS_DOUBLE
2017-07-19 22:00:46 +02:00
custom_feature_display - > clear ( ) ;
2022-07-07 13:38:12 +02:00
String text ;
2022-05-19 17:00:06 +02:00
bool first = true ;
2023-06-20 04:50:09 +02:00
for ( const String & E : feature_set ) {
2022-05-19 17:00:06 +02:00
if ( ! first ) {
2022-07-07 13:38:12 +02:00
text + = " , " ;
2022-05-19 17:00:06 +02:00
} else {
first = false ;
2017-07-19 22:00:46 +02:00
}
2022-07-07 13:38:12 +02:00
text + = E ;
2017-07-19 22:00:46 +02:00
}
2022-07-07 13:38:12 +02:00
custom_feature_display - > add_text ( text ) ;
2017-07-19 22:00:46 +02:00
}
void ProjectExportDialog : : _custom_features_changed ( const String & p_text ) {
2020-05-14 16:41:43 +02:00
if ( updating ) {
2017-07-19 22:00:46 +02:00
return ;
2020-05-14 16:41:43 +02:00
}
2017-07-19 22:00:46 +02:00
2018-12-23 19:28:29 +01:00
Ref < EditorExportPreset > current = get_current_preset ( ) ;
2017-07-19 22:00:46 +02:00
ERR_FAIL_COND ( current . is_null ( ) ) ;
current - > set_custom_features ( p_text ) ;
_update_feature_list ( ) ;
}
void ProjectExportDialog : : _tab_changed ( int ) {
_update_feature_list ( ) ;
}
2017-03-28 03:21:21 +02:00
void ProjectExportDialog : : _update_parameters ( const String & p_edited_property ) {
2018-12-23 19:28:29 +01:00
_update_current_preset ( ) ;
2017-03-28 03:21:21 +02:00
}
2024-02-16 23:05:50 +01:00
void ProjectExportDialog : : _advanced_options_pressed ( ) {
if ( updating ) {
return ;
}
Ref < EditorExportPreset > current = get_current_preset ( ) ;
ERR_FAIL_COND ( current . is_null ( ) ) ;
current - > set_advanced_options_enabled ( advanced_options - > is_pressed ( ) ) ;
_update_presets ( ) ;
}
2017-02-20 03:19:30 +01:00
void ProjectExportDialog : : _runnable_pressed ( ) {
2020-05-14 16:41:43 +02:00
if ( updating ) {
2017-02-20 03:19:30 +01:00
return ;
2020-05-14 16:41:43 +02:00
}
2014-02-15 06:01:39 +01:00
2018-12-23 19:28:29 +01:00
Ref < EditorExportPreset > current = get_current_preset ( ) ;
2017-02-20 03:19:30 +01:00
ERR_FAIL_COND ( current . is_null ( ) ) ;
2014-02-15 06:01:39 +01:00
2017-02-20 03:19:30 +01:00
if ( runnable - > is_pressed ( ) ) {
2017-03-05 16:44:50 +01:00
for ( int i = 0 ; i < EditorExport : : get_singleton ( ) - > get_export_preset_count ( ) ; i + + ) {
2017-02-20 03:19:30 +01:00
Ref < EditorExportPreset > p = EditorExport : : get_singleton ( ) - > get_export_preset ( i ) ;
2017-03-05 16:44:50 +01:00
if ( p - > get_platform ( ) = = current - > get_platform ( ) ) {
p - > set_runnable ( current = = p ) ;
2017-02-20 03:19:30 +01:00
}
2014-02-15 06:01:39 +01:00
}
2017-02-20 03:19:30 +01:00
} else {
current - > set_runnable ( false ) ;
2014-02-10 02:10:30 +01:00
}
2017-02-20 03:19:30 +01:00
_update_presets ( ) ;
2014-02-10 02:10:30 +01:00
}
2017-03-05 16:44:50 +01:00
void ProjectExportDialog : : _name_changed ( const String & p_string ) {
2020-05-14 16:41:43 +02:00
if ( updating ) {
2014-02-13 22:03:28 +01:00
return ;
2020-05-14 16:41:43 +02:00
}
2014-02-13 22:03:28 +01:00
2018-12-23 19:28:29 +01:00
Ref < EditorExportPreset > current = get_current_preset ( ) ;
2017-02-20 03:19:30 +01:00
ERR_FAIL_COND ( current . is_null ( ) ) ;
2015-12-13 05:08:36 +01:00
2017-02-20 03:19:30 +01:00
current - > set_name ( p_string ) ;
_update_presets ( ) ;
2014-02-13 22:03:28 +01:00
}
2018-11-12 20:04:58 +01:00
void ProjectExportDialog : : set_export_path ( const String & p_value ) {
2018-12-23 19:28:29 +01:00
Ref < EditorExportPreset > current = get_current_preset ( ) ;
2018-11-12 20:04:58 +01:00
ERR_FAIL_COND ( current . is_null ( ) ) ;
current - > set_export_path ( p_value ) ;
}
String ProjectExportDialog : : get_export_path ( ) {
2018-12-23 19:28:29 +01:00
Ref < EditorExportPreset > current = get_current_preset ( ) ;
2018-11-12 20:04:58 +01:00
ERR_FAIL_COND_V ( current . is_null ( ) , String ( " " ) ) ;
return current - > get_export_path ( ) ;
}
2018-12-23 19:28:29 +01:00
Ref < EditorExportPreset > ProjectExportDialog : : get_current_preset ( ) const {
return EditorExport : : get_singleton ( ) - > get_export_preset ( presets - > get_current ( ) ) ;
}
2019-01-18 17:01:24 +01:00
void ProjectExportDialog : : _export_path_changed ( const StringName & p_property , const Variant & p_value , const String & p_field , bool p_changing ) {
2020-05-14 16:41:43 +02:00
if ( updating ) {
2018-11-06 02:01:34 +01:00
return ;
2020-05-14 16:41:43 +02:00
}
2018-11-06 02:01:34 +01:00
2018-12-23 19:28:29 +01:00
Ref < EditorExportPreset > current = get_current_preset ( ) ;
2018-11-06 02:01:34 +01:00
ERR_FAIL_COND ( current . is_null ( ) ) ;
2018-11-12 20:04:58 +01:00
current - > set_export_path ( p_value ) ;
2018-11-06 02:01:34 +01:00
_update_presets ( ) ;
2019-11-04 16:29:09 +01:00
_update_export_all ( ) ;
2018-11-06 02:01:34 +01:00
}
2020-04-28 19:51:29 +02:00
void ProjectExportDialog : : _enc_filters_changed ( const String & p_filters ) {
if ( updating ) {
return ;
}
Ref < EditorExportPreset > current = get_current_preset ( ) ;
ERR_FAIL_COND ( current . is_null ( ) ) ;
current - > set_enc_in_filter ( enc_in_filters - > get_text ( ) ) ;
current - > set_enc_ex_filter ( enc_ex_filters - > get_text ( ) ) ;
updating_enc_filters = true ;
_update_current_preset ( ) ;
updating_enc_filters = false ;
}
void ProjectExportDialog : : _open_key_help_link ( ) {
2023-01-14 17:38:00 +01:00
OS : : get_singleton ( ) - > shell_open ( vformat ( " %s/contributing/development/compiling/compiling_with_script_encryption_key.html " , VERSION_DOCS_URL ) ) ;
2020-04-28 19:51:29 +02:00
}
void ProjectExportDialog : : _enc_pck_changed ( bool p_pressed ) {
if ( updating ) {
return ;
}
Ref < EditorExportPreset > current = get_current_preset ( ) ;
ERR_FAIL_COND ( current . is_null ( ) ) ;
current - > set_enc_pck ( p_pressed ) ;
enc_directory - > set_disabled ( ! p_pressed ) ;
enc_in_filters - > set_editable ( p_pressed ) ;
enc_ex_filters - > set_editable ( p_pressed ) ;
script_key - > set_editable ( p_pressed ) ;
_update_current_preset ( ) ;
}
void ProjectExportDialog : : _enc_directory_changed ( bool p_pressed ) {
if ( updating ) {
return ;
}
Ref < EditorExportPreset > current = get_current_preset ( ) ;
ERR_FAIL_COND ( current . is_null ( ) ) ;
current - > set_enc_directory ( p_pressed ) ;
_update_current_preset ( ) ;
}
2018-12-23 19:28:29 +01:00
void ProjectExportDialog : : _script_encryption_key_changed ( const String & p_key ) {
2020-05-14 16:41:43 +02:00
if ( updating ) {
2018-12-23 19:28:29 +01:00
return ;
2020-05-14 16:41:43 +02:00
}
2018-12-23 19:28:29 +01:00
Ref < EditorExportPreset > current = get_current_preset ( ) ;
ERR_FAIL_COND ( current . is_null ( ) ) ;
current - > set_script_encryption_key ( p_key ) ;
updating_script_key = true ;
_update_current_preset ( ) ;
updating_script_key = false ;
}
bool ProjectExportDialog : : _validate_script_encryption_key ( const String & p_key ) {
bool is_valid = false ;
2020-12-15 13:04:21 +01:00
if ( ! p_key . is_empty ( ) & & p_key . is_valid_hex_number ( false ) & & p_key . length ( ) = = 64 ) {
2018-12-23 19:28:29 +01:00
is_valid = true ;
}
return is_valid ;
}
2024-01-22 15:31:55 +01:00
void ProjectExportDialog : : _script_export_mode_changed ( int p_mode ) {
if ( updating ) {
return ;
}
Ref < EditorExportPreset > current = get_current_preset ( ) ;
ERR_FAIL_COND ( current . is_null ( ) ) ;
current - > set_script_export_mode ( p_mode ) ;
_update_current_preset ( ) ;
}
2018-10-28 19:13:38 +01:00
void ProjectExportDialog : : _duplicate_preset ( ) {
2018-12-23 19:28:29 +01:00
Ref < EditorExportPreset > current = get_current_preset ( ) ;
2020-05-14 16:41:43 +02:00
if ( current . is_null ( ) ) {
2018-10-28 19:13:38 +01:00
return ;
2020-05-14 16:41:43 +02:00
}
2018-10-28 19:13:38 +01:00
Ref < EditorExportPreset > preset = current - > get_platform ( ) - > create_preset ( ) ;
ERR_FAIL_COND ( ! preset . is_valid ( ) ) ;
2022-09-29 11:53:28 +02:00
String preset_name = current - > get_name ( ) + " (copy) " ;
2018-10-28 19:13:38 +01:00
bool make_runnable = true ;
while ( true ) {
bool valid = true ;
for ( int i = 0 ; i < EditorExport : : get_singleton ( ) - > get_export_preset_count ( ) ; i + + ) {
Ref < EditorExportPreset > p = EditorExport : : get_singleton ( ) - > get_export_preset ( i ) ;
if ( p - > get_platform ( ) = = preset - > get_platform ( ) & & p - > is_runnable ( ) ) {
make_runnable = false ;
}
2022-09-29 11:53:28 +02:00
if ( p - > get_name ( ) = = preset_name ) {
2018-10-28 19:13:38 +01:00
valid = false ;
break ;
}
}
2020-05-14 16:41:43 +02:00
if ( valid ) {
2018-10-28 19:13:38 +01:00
break ;
2020-05-14 16:41:43 +02:00
}
2018-10-28 19:13:38 +01:00
2022-09-29 11:53:28 +02:00
preset_name + = " (copy) " ;
2018-10-28 19:13:38 +01:00
}
2022-09-29 11:53:28 +02:00
preset - > set_name ( preset_name ) ;
2020-05-14 16:41:43 +02:00
if ( make_runnable ) {
2018-10-28 19:13:38 +01:00
preset - > set_runnable ( make_runnable ) ;
2020-05-14 16:41:43 +02:00
}
2024-02-16 23:05:50 +01:00
preset - > set_advanced_options_enabled ( current - > are_advanced_options_enabled ( ) ) ;
2022-12-20 22:49:11 +01:00
preset - > set_dedicated_server ( current - > is_dedicated_server ( ) ) ;
2018-10-28 19:13:38 +01:00
preset - > set_export_filter ( current - > get_export_filter ( ) ) ;
preset - > set_include_filter ( current - > get_include_filter ( ) ) ;
preset - > set_exclude_filter ( current - > get_exclude_filter ( ) ) ;
2024-09-17 12:48:10 +02:00
preset - > set_patches ( current - > get_patches ( ) ) ;
2018-10-28 19:13:38 +01:00
preset - > set_custom_features ( current - > get_custom_features ( ) ) ;
2023-07-04 15:39:23 +02:00
for ( const KeyValue < StringName , Variant > & E : current - > get_values ( ) ) {
preset - > set ( E . key , E . value ) ;
2018-10-28 19:13:38 +01:00
}
EditorExport : : get_singleton ( ) - > add_export_preset ( preset ) ;
_update_presets ( ) ;
_edit_preset ( EditorExport : : get_singleton ( ) - > get_export_preset_count ( ) - 1 ) ;
}
2017-02-20 03:19:30 +01:00
void ProjectExportDialog : : _delete_preset ( ) {
2018-12-23 19:28:29 +01:00
Ref < EditorExportPreset > current = get_current_preset ( ) ;
2020-05-14 16:41:43 +02:00
if ( current . is_null ( ) ) {
2017-02-20 03:19:30 +01:00
return ;
2020-05-14 16:41:43 +02:00
}
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
delete_confirm - > set_text ( vformat ( TTR ( " Delete preset '%s'? " ) , current - > get_name ( ) ) ) ;
2020-03-06 18:00:16 +01:00
delete_confirm - > popup_centered ( ) ;
2014-02-10 02:10:30 +01:00
}
2017-02-20 03:19:30 +01:00
void ProjectExportDialog : : _delete_preset_confirm ( ) {
int idx = presets - > get_current ( ) ;
2017-09-04 20:45:18 +02:00
_edit_preset ( - 1 ) ;
2019-04-23 17:49:15 +02:00
export_button - > set_disabled ( true ) ;
2020-12-14 19:37:30 +01:00
get_ok_button ( ) - > set_disabled ( true ) ;
2017-02-20 03:19:30 +01:00
EditorExport : : get_singleton ( ) - > remove_export_preset ( idx ) ;
_update_presets ( ) ;
2019-11-04 16:29:09 +01:00
// The Export All button might become enabled (if all other presets have an export path defined),
// or it could be disabled (if there are no presets anymore).
_update_export_all ( ) ;
2014-02-13 22:03:28 +01:00
}
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
Variant ProjectExportDialog : : get_drag_data_fw ( const Point2 & p_point , Control * p_from ) {
if ( p_from = = presets ) {
2017-09-10 15:37:49 +02:00
int pos = presets - > get_item_at_position ( p_point , true ) ;
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
if ( pos > = 0 ) {
2017-02-20 03:19:30 +01:00
Dictionary d ;
2017-03-05 16:44:50 +01:00
d [ " type " ] = " export_preset " ;
d [ " preset " ] = pos ;
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
HBoxContainer * drag = memnew ( HBoxContainer ) ;
2017-02-20 03:19:30 +01:00
TextureRect * tr = memnew ( TextureRect ) ;
tr - > set_texture ( presets - > get_item_icon ( pos ) ) ;
drag - > add_child ( tr ) ;
2017-03-05 16:44:50 +01:00
Label * label = memnew ( Label ) ;
2017-02-20 03:19:30 +01:00
label - > set_text ( presets - > get_item_text ( pos ) ) ;
2024-09-19 02:14:00 +02:00
label - > set_auto_translate_mode ( AUTO_TRANSLATE_MODE_DISABLED ) ; // Don't translate user input.
2017-02-20 03:19:30 +01:00
drag - > add_child ( label ) ;
2014-02-10 02:10:30 +01:00
2020-03-06 18:00:16 +01:00
presets - > set_drag_preview ( drag ) ;
2014-02-10 02:10:30 +01:00
2017-02-20 03:19:30 +01:00
return d ;
}
2024-09-17 12:48:10 +02:00
} else if ( p_from = = patches ) {
TreeItem * item = patches - > get_item_at_position ( p_point ) ;
if ( item ) {
int item_metadata = item - > get_metadata ( 0 ) ;
Dictionary d ;
d [ " type " ] = " export_patch " ;
d [ " patch " ] = item_metadata ;
2016-11-26 15:30:46 +01:00
2024-09-17 12:48:10 +02:00
Label * label = memnew ( Label ) ;
label - > set_text ( item - > get_text ( 0 ) ) ;
patches - > set_drag_preview ( label ) ;
return d ;
}
}
2017-02-20 03:19:30 +01:00
return Variant ( ) ;
2016-11-26 15:30:46 +01:00
}
2017-03-05 16:44:50 +01:00
bool ProjectExportDialog : : can_drop_data_fw ( const Point2 & p_point , const Variant & p_data , Control * p_from ) const {
if ( p_from = = presets ) {
2017-02-20 03:19:30 +01:00
Dictionary d = p_data ;
2020-05-14 16:41:43 +02:00
if ( ! d . has ( " type " ) | | String ( d [ " type " ] ) ! = " export_preset " ) {
2017-02-20 03:19:30 +01:00
return false ;
2020-05-14 16:41:43 +02:00
}
2016-11-26 15:30:46 +01:00
2020-05-14 16:41:43 +02:00
if ( presets - > get_item_at_position ( p_point , true ) < 0 & & ! presets - > is_pos_at_end_of_items ( p_point ) ) {
2017-02-20 03:19:30 +01:00
return false ;
2020-05-14 16:41:43 +02:00
}
2024-09-17 12:48:10 +02:00
} else if ( p_from = = patches ) {
Dictionary d = p_data ;
if ( d . get ( " type " , " " ) ! = " export_patch " ) {
return false ;
}
TreeItem * item = patches - > get_item_at_position ( p_point ) ;
if ( ! item ) {
return false ;
}
patches - > set_drop_mode_flags ( Tree : : DROP_MODE_INBETWEEN ) ;
2016-11-26 15:30:46 +01:00
}
2017-02-20 03:19:30 +01:00
return true ;
2016-11-26 15:30:46 +01:00
}
2017-03-05 16:44:50 +01:00
void ProjectExportDialog : : drop_data_fw ( const Point2 & p_point , const Variant & p_data , Control * p_from ) {
if ( p_from = = presets ) {
Dictionary d = p_data ;
2017-02-20 03:19:30 +01:00
int from_pos = d [ " preset " ] ;
2016-11-26 15:30:46 +01:00
2017-03-05 16:44:50 +01:00
int to_pos = - 1 ;
2016-11-26 15:30:46 +01:00
2017-09-10 15:37:49 +02:00
if ( presets - > get_item_at_position ( p_point , true ) > = 0 ) {
to_pos = presets - > get_item_at_position ( p_point , true ) ;
2016-11-26 15:30:46 +01:00
}
2014-02-10 02:10:30 +01:00
2020-05-14 16:41:43 +02:00
if ( to_pos = = - 1 & & ! presets - > is_pos_at_end_of_items ( p_point ) ) {
2017-02-20 03:19:30 +01:00
return ;
2020-05-14 16:41:43 +02:00
}
2014-02-10 02:10:30 +01:00
2020-05-14 16:41:43 +02:00
if ( to_pos = = from_pos ) {
2017-02-20 03:19:30 +01:00
return ;
2020-05-14 16:41:43 +02:00
} else if ( to_pos > from_pos ) {
2017-02-20 03:19:30 +01:00
to_pos - - ;
}
2014-10-23 12:04:21 +02:00
2017-02-20 03:19:30 +01:00
Ref < EditorExportPreset > preset = EditorExport : : get_singleton ( ) - > get_export_preset ( from_pos ) ;
EditorExport : : get_singleton ( ) - > remove_export_preset ( from_pos ) ;
2017-03-05 16:44:50 +01:00
EditorExport : : get_singleton ( ) - > add_export_preset ( preset , to_pos ) ;
2014-02-10 02:10:30 +01:00
2017-02-20 03:19:30 +01:00
_update_presets ( ) ;
2020-05-14 16:41:43 +02:00
if ( to_pos > = 0 ) {
2017-02-20 03:19:30 +01:00
_edit_preset ( to_pos ) ;
2020-05-14 16:41:43 +02:00
} else {
2017-03-05 16:44:50 +01:00
_edit_preset ( presets - > get_item_count ( ) - 1 ) ;
2020-05-14 16:41:43 +02:00
}
2024-09-17 12:48:10 +02:00
} else if ( p_from = = patches ) {
Dictionary d = p_data ;
int from_pos = d [ " patch " ] ;
TreeItem * item = patches - > get_item_at_position ( p_point ) ;
if ( ! item ) {
return ;
}
int to_pos = item - > get_metadata ( 0 ) ;
if ( patches - > get_drop_section_at_position ( p_point ) > 0 ) {
to_pos + + ;
}
if ( to_pos > from_pos ) {
to_pos - - ;
}
Ref < EditorExportPreset > preset = get_current_preset ( ) ;
String patch = preset - > get_patch ( from_pos ) ;
preset - > remove_patch ( from_pos ) ;
preset - > add_patch ( patch , to_pos ) ;
_update_current_preset ( ) ;
2014-02-10 02:10:30 +01:00
}
}
2017-02-20 03:19:30 +01:00
void ProjectExportDialog : : _export_type_changed ( int p_which ) {
2020-05-14 16:41:43 +02:00
if ( updating ) {
2014-02-10 02:10:30 +01:00
return ;
2020-05-14 16:41:43 +02:00
}
2014-02-10 02:10:30 +01:00
2018-12-23 19:28:29 +01:00
Ref < EditorExportPreset > current = get_current_preset ( ) ;
2020-05-14 16:41:43 +02:00
if ( current . is_null ( ) ) {
2014-02-10 02:10:30 +01:00
return ;
2020-05-14 16:41:43 +02:00
}
2014-02-10 02:10:30 +01:00
2022-12-20 22:49:11 +01:00
EditorExportPreset : : ExportFilter filter_type = ( EditorExportPreset : : ExportFilter ) p_which ;
current - > set_export_filter ( filter_type ) ;
current - > set_dedicated_server ( filter_type = = EditorExportPreset : : EXPORT_CUSTOMIZED ) ;
server_strip_message - > set_visible ( filter_type = = EditorExportPreset : : EXPORT_CUSTOMIZED ) ;
// Default to stripping everything when first switching to server build.
if ( filter_type = = EditorExportPreset : : EXPORT_CUSTOMIZED & & current - > get_customized_files_count ( ) = = 0 ) {
current - > set_file_export_mode ( " res:// " , EditorExportPreset : : MODE_FILE_STRIP ) ;
}
2023-07-20 23:27:40 +02:00
include_label - > set_text ( _get_resource_export_header ( current - > get_export_filter ( ) ) ) ;
2022-12-20 22:49:11 +01:00
2017-03-05 16:44:50 +01:00
updating = true ;
2017-02-20 03:19:30 +01:00
_fill_resource_tree ( ) ;
2017-03-05 16:44:50 +01:00
updating = false ;
2014-02-10 02:10:30 +01:00
}
2023-07-20 23:27:40 +02:00
String ProjectExportDialog : : _get_resource_export_header ( EditorExportPreset : : ExportFilter p_filter ) const {
switch ( p_filter ) {
case EditorExportPreset : : EXCLUDE_SELECTED_RESOURCES :
return TTR ( " Resources to exclude: " ) ;
case EditorExportPreset : : EXPORT_CUSTOMIZED :
return TTR ( " Resources to override export behavior: " ) ;
default :
return TTR ( " Resources to export: " ) ;
}
}
2017-03-05 16:44:50 +01:00
void ProjectExportDialog : : _filter_changed ( const String & p_filter ) {
2020-05-14 16:41:43 +02:00
if ( updating ) {
2014-02-10 02:10:30 +01:00
return ;
2020-05-14 16:41:43 +02:00
}
2014-02-10 02:10:30 +01:00
2018-12-23 19:28:29 +01:00
Ref < EditorExportPreset > current = get_current_preset ( ) ;
2020-05-14 16:41:43 +02:00
if ( current . is_null ( ) ) {
2017-02-20 03:19:30 +01:00
return ;
2020-05-14 16:41:43 +02:00
}
2014-02-10 02:10:30 +01:00
2017-02-20 03:19:30 +01:00
current - > set_include_filter ( include_filters - > get_text ( ) ) ;
current - > set_exclude_filter ( exclude_filters - > get_text ( ) ) ;
}
2014-02-10 02:10:30 +01:00
2017-02-20 03:19:30 +01:00
void ProjectExportDialog : : _fill_resource_tree ( ) {
include_files - > clear ( ) ;
include_label - > hide ( ) ;
include_margin - > hide ( ) ;
2014-02-10 02:10:30 +01:00
2018-12-23 19:28:29 +01:00
Ref < EditorExportPreset > current = get_current_preset ( ) ;
2020-05-14 16:41:43 +02:00
if ( current . is_null ( ) ) {
2017-02-20 03:19:30 +01:00
return ;
2020-05-14 16:41:43 +02:00
}
2014-02-10 02:10:30 +01:00
2017-02-20 03:19:30 +01:00
EditorExportPreset : : ExportFilter f = current - > get_export_filter ( ) ;
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
if ( f = = EditorExportPreset : : EXPORT_ALL_RESOURCES ) {
2017-02-20 03:19:30 +01:00
return ;
2014-02-10 02:10:30 +01:00
}
2022-12-20 22:49:11 +01:00
TreeItem * root = include_files - > create_item ( ) ;
if ( f = = EditorExportPreset : : EXPORT_CUSTOMIZED ) {
include_files - > set_columns ( 2 ) ;
include_files - > set_column_expand ( 1 , false ) ;
include_files - > set_column_custom_minimum_width ( 1 , 250 * EDSCALE ) ;
} else {
include_files - > set_columns ( 1 ) ;
}
2017-02-20 03:19:30 +01:00
include_label - > show ( ) ;
include_margin - > show ( ) ;
2014-02-10 02:10:30 +01:00
2022-12-20 22:49:11 +01:00
_fill_tree ( EditorFileSystem : : get_singleton ( ) - > get_filesystem ( ) , root , current , f ) ;
2023-01-30 21:34:05 +01:00
if ( f = = EditorExportPreset : : EXPORT_CUSTOMIZED ) {
_propagate_file_export_mode ( include_files - > get_root ( ) , EditorExportPreset : : MODE_FILE_NOT_CUSTOMIZED ) ;
}
2022-12-20 22:49:11 +01:00
}
2014-02-10 02:10:30 +01:00
2022-12-20 22:49:11 +01:00
void ProjectExportDialog : : _setup_item_for_file_mode ( TreeItem * p_item , EditorExportPreset : : FileExportMode p_mode ) {
if ( p_mode = = EditorExportPreset : : MODE_FILE_NOT_CUSTOMIZED ) {
p_item - > set_checked ( 0 , false ) ;
p_item - > set_cell_mode ( 1 , TreeItem : : CELL_MODE_STRING ) ;
p_item - > set_editable ( 1 , false ) ;
p_item - > set_selectable ( 1 , false ) ;
2024-01-15 13:14:55 +01:00
p_item - > set_custom_color ( 1 , get_theme_color ( SNAME ( " font_disabled_color " ) , EditorStringName ( Editor ) ) ) ;
2022-12-20 22:49:11 +01:00
} else {
p_item - > set_checked ( 0 , true ) ;
p_item - > set_cell_mode ( 1 , TreeItem : : CELL_MODE_CUSTOM ) ;
p_item - > set_editable ( 1 , true ) ;
p_item - > set_selectable ( 1 , true ) ;
2023-01-30 21:34:05 +01:00
p_item - > clear_custom_color ( 1 ) ;
2022-12-20 22:49:11 +01:00
}
2023-01-30 21:34:05 +01:00
p_item - > set_metadata ( 1 , p_mode ) ;
2017-02-20 03:19:30 +01:00
}
2014-02-10 02:10:30 +01:00
2022-12-20 22:49:11 +01:00
bool ProjectExportDialog : : _fill_tree ( EditorFileSystemDirectory * p_dir , TreeItem * p_item , Ref < EditorExportPreset > & current , EditorExportPreset : : ExportFilter p_export_filter ) {
2020-11-14 16:02:14 +01:00
p_item - > set_cell_mode ( 0 , TreeItem : : CELL_MODE_CHECK ) ;
2021-07-17 23:22:52 +02:00
p_item - > set_icon ( 0 , presets - > get_theme_icon ( SNAME ( " folder " ) , SNAME ( " FileDialog " ) ) ) ;
2017-03-05 16:44:50 +01:00
p_item - > set_text ( 0 , p_dir - > get_name ( ) + " / " ) ;
2020-11-14 16:02:14 +01:00
p_item - > set_editable ( 0 , true ) ;
p_item - > set_metadata ( 0 , p_dir - > get_path ( ) ) ;
2014-02-10 02:10:30 +01:00
2022-12-20 22:49:11 +01:00
if ( p_export_filter = = EditorExportPreset : : EXPORT_CUSTOMIZED ) {
_setup_item_for_file_mode ( p_item , current - > get_file_export_mode ( p_dir - > get_path ( ) ) ) ;
}
2017-03-05 16:44:50 +01:00
bool used = false ;
for ( int i = 0 ; i < p_dir - > get_subdir_count ( ) ; i + + ) {
2017-02-20 03:19:30 +01:00
TreeItem * subdir = include_files - > create_item ( p_item ) ;
2022-12-20 22:49:11 +01:00
if ( _fill_tree ( p_dir - > get_subdir ( i ) , subdir , current , p_export_filter ) ) {
2017-03-05 16:44:50 +01:00
used = true ;
2018-10-06 22:20:41 +02:00
} else {
memdelete ( subdir ) ;
2014-02-10 02:10:30 +01:00
}
}
2017-03-05 16:44:50 +01:00
for ( int i = 0 ; i < p_dir - > get_file_count ( ) ; i + + ) {
2017-02-20 03:19:30 +01:00
String type = p_dir - > get_file_type ( i ) ;
2022-12-20 22:49:11 +01:00
if ( p_export_filter = = EditorExportPreset : : EXPORT_SELECTED_SCENES & & type ! = " PackedScene " ) {
2017-02-20 03:19:30 +01:00
continue ;
2020-05-14 16:41:43 +02:00
}
2024-09-05 11:12:59 +02:00
if ( type = = " TextFile " | | type = = " OtherFile " ) {
2021-09-23 23:09:15 +02:00
continue ;
}
2014-06-11 15:41:03 +02:00
2017-02-20 03:19:30 +01:00
TreeItem * file = include_files - > create_item ( p_item ) ;
2017-03-05 16:44:50 +01:00
file - > set_cell_mode ( 0 , TreeItem : : CELL_MODE_CHECK ) ;
file - > set_text ( 0 , p_dir - > get_file ( i ) ) ;
2014-02-10 02:10:30 +01:00
2017-02-20 03:19:30 +01:00
String path = p_dir - > get_file_path ( i ) ;
2014-02-10 02:10:30 +01:00
2018-09-02 23:40:51 +02:00
file - > set_icon ( 0 , EditorNode : : get_singleton ( ) - > get_class_icon ( type ) ) ;
2017-03-05 16:44:50 +01:00
file - > set_editable ( 0 , true ) ;
file - > set_metadata ( 0 , path ) ;
2022-12-20 22:49:11 +01:00
if ( p_export_filter = = EditorExportPreset : : EXPORT_CUSTOMIZED ) {
_setup_item_for_file_mode ( file , current - > get_file_export_mode ( path ) ) ;
} else {
file - > set_checked ( 0 , current - > has_export_file ( path ) ) ;
file - > propagate_check ( 0 ) ;
}
2014-02-10 02:10:30 +01:00
2017-03-05 16:44:50 +01:00
used = true ;
2017-02-20 03:19:30 +01:00
}
return used ;
2014-02-10 02:10:30 +01:00
}
2023-01-30 21:34:05 +01:00
void ProjectExportDialog : : _propagate_file_export_mode ( TreeItem * p_item , EditorExportPreset : : FileExportMode p_inherited_export_mode ) {
EditorExportPreset : : FileExportMode file_export_mode = ( EditorExportPreset : : FileExportMode ) ( int ) p_item - > get_metadata ( 1 ) ;
2023-05-03 16:47:33 +02:00
bool is_inherited = false ;
2023-01-30 21:34:05 +01:00
if ( file_export_mode = = EditorExportPreset : : MODE_FILE_NOT_CUSTOMIZED ) {
file_export_mode = p_inherited_export_mode ;
2023-05-03 16:47:33 +02:00
is_inherited = true ;
2023-01-30 21:34:05 +01:00
}
if ( file_export_mode = = EditorExportPreset : : MODE_FILE_NOT_CUSTOMIZED ) {
p_item - > set_text ( 1 , " " ) ;
} else {
2023-05-03 16:47:33 +02:00
String text = file_mode_popup - > get_item_text ( file_mode_popup - > get_item_index ( file_export_mode ) ) ;
if ( is_inherited ) {
text + = " " + TTR ( " (Inherited) " ) ;
}
p_item - > set_text ( 1 , text ) ;
2023-01-30 21:34:05 +01:00
}
for ( int i = 0 ; i < p_item - > get_child_count ( ) ; i + + ) {
_propagate_file_export_mode ( p_item - > get_child ( i ) , file_export_mode ) ;
}
}
2017-02-20 03:19:30 +01:00
void ProjectExportDialog : : _tree_changed ( ) {
2020-05-14 16:41:43 +02:00
if ( updating ) {
2014-02-10 02:10:30 +01:00
return ;
2020-05-14 16:41:43 +02:00
}
2014-02-10 02:10:30 +01:00
2018-12-23 19:28:29 +01:00
Ref < EditorExportPreset > current = get_current_preset ( ) ;
2020-05-14 16:41:43 +02:00
if ( current . is_null ( ) ) {
2017-02-20 03:19:30 +01:00
return ;
2020-05-14 16:41:43 +02:00
}
2014-02-10 02:10:30 +01:00
2017-02-20 03:19:30 +01:00
TreeItem * item = include_files - > get_edited ( ) ;
2020-05-14 16:41:43 +02:00
if ( ! item ) {
2014-02-10 02:10:30 +01:00
return ;
2020-05-14 16:41:43 +02:00
}
2014-02-10 02:10:30 +01:00
2022-12-20 22:49:11 +01:00
if ( current - > get_export_filter ( ) = = EditorExportPreset : : EXPORT_CUSTOMIZED ) {
EditorExportPreset : : FileExportMode file_mode = EditorExportPreset : : MODE_FILE_NOT_CUSTOMIZED ;
String path = item - > get_metadata ( 0 ) ;
if ( item - > is_checked ( 0 ) ) {
file_mode = current - > get_file_export_mode ( path , EditorExportPreset : : MODE_FILE_STRIP ) ;
}
current - > set_file_export_mode ( path , file_mode ) ;
2023-01-30 21:34:05 +01:00
_setup_item_for_file_mode ( item , file_mode ) ;
_propagate_file_export_mode ( include_files - > get_root ( ) , EditorExportPreset : : MODE_FILE_NOT_CUSTOMIZED ) ;
2022-12-20 22:49:11 +01:00
} else {
item - > propagate_check ( 0 ) ;
}
2021-09-17 17:50:24 +02:00
}
2014-02-10 02:10:30 +01:00
2021-09-17 17:50:24 +02:00
void ProjectExportDialog : : _check_propagated_to_item ( Object * p_obj , int column ) {
Ref < EditorExportPreset > current = get_current_preset ( ) ;
if ( current . is_null ( ) ) {
return ;
}
TreeItem * item = Object : : cast_to < TreeItem > ( p_obj ) ;
String path = item - > get_metadata ( 0 ) ;
if ( item & & ! path . ends_with ( " / " ) ) {
bool added = item - > is_checked ( 0 ) ;
2020-11-14 16:02:14 +01:00
if ( added ) {
current - > add_export_file ( path ) ;
} else {
current - > remove_export_file ( path ) ;
}
}
}
2022-12-20 22:49:11 +01:00
void ProjectExportDialog : : _tree_popup_edited ( bool p_arrow_clicked ) {
Rect2 bounds = include_files - > get_custom_popup_rect ( ) ;
bounds . position + = get_global_canvas_transform ( ) . get_origin ( ) ;
bounds . size * = get_global_canvas_transform ( ) . get_scale ( ) ;
if ( ! is_embedding_subwindows ( ) ) {
bounds . position + = get_position ( ) ;
}
file_mode_popup - > popup ( bounds ) ;
}
void ProjectExportDialog : : _set_file_export_mode ( int p_id ) {
Ref < EditorExportPreset > current = get_current_preset ( ) ;
if ( current . is_null ( ) ) {
return ;
}
TreeItem * item = include_files - > get_edited ( ) ;
String path = item - > get_metadata ( 0 ) ;
2023-01-30 21:34:05 +01:00
EditorExportPreset : : FileExportMode file_export_mode = ( EditorExportPreset : : FileExportMode ) p_id ;
current - > set_file_export_mode ( path , file_export_mode ) ;
item - > set_metadata ( 1 , file_export_mode ) ;
_propagate_file_export_mode ( include_files - > get_root ( ) , EditorExportPreset : : MODE_FILE_NOT_CUSTOMIZED ) ;
2022-12-20 22:49:11 +01:00
}
2024-09-17 12:48:10 +02:00
void ProjectExportDialog : : _patch_tree_button_clicked ( Object * p_item , int p_column , int p_id , int p_mouse_button_index ) {
TreeItem * ti = Object : : cast_to < TreeItem > ( p_item ) ;
patch_index = ti - > get_metadata ( 0 ) ;
Ref < EditorExportPreset > current = get_current_preset ( ) ;
ERR_FAIL_COND ( current . is_null ( ) ) ;
if ( p_id = = 0 ) {
Vector < String > preset_patches = current - > get_patches ( ) ;
ERR_FAIL_INDEX ( patch_index , preset_patches . size ( ) ) ;
patch_erase - > set_text ( vformat ( TTR ( " Delete patch '%s' from list? " ) , preset_patches [ patch_index ] . get_file ( ) ) ) ;
patch_erase - > popup_centered ( ) ;
} else {
patch_dialog - > popup_file_dialog ( ) ;
}
}
void ProjectExportDialog : : _patch_tree_item_edited ( ) {
TreeItem * item = patches - > get_edited ( ) ;
if ( ! item ) {
return ;
}
Ref < EditorExportPreset > current = get_current_preset ( ) ;
ERR_FAIL_COND ( current . is_null ( ) ) ;
int index = item - > get_metadata ( 0 ) ;
String patch_path = item - > get_text ( 0 ) ;
current - > set_patch ( index , patch_path ) ;
item - > set_tooltip_text ( 0 , patch_path ) ;
}
void ProjectExportDialog : : _patch_file_selected ( const String & p_path ) {
Ref < EditorExportPreset > current = get_current_preset ( ) ;
ERR_FAIL_COND ( current . is_null ( ) ) ;
String relative_path = ProjectSettings : : get_singleton ( ) - > get_resource_path ( ) . path_to_file ( p_path ) ;
Vector < String > preset_patches = current - > get_patches ( ) ;
if ( patch_index > = preset_patches . size ( ) ) {
current - > add_patch ( relative_path ) ;
} else {
current - > set_patch ( patch_index , relative_path ) ;
}
_update_current_preset ( ) ;
}
void ProjectExportDialog : : _patch_delete_confirmed ( ) {
Ref < EditorExportPreset > current = get_current_preset ( ) ;
ERR_FAIL_COND ( current . is_null ( ) ) ;
Vector < String > preset_patches = current - > get_patches ( ) ;
if ( patch_index < preset_patches . size ( ) ) {
current - > remove_patch ( patch_index ) ;
_update_current_preset ( ) ;
}
}
void ProjectExportDialog : : _patch_add_pack_pressed ( ) {
Ref < EditorExportPreset > current = get_current_preset ( ) ;
ERR_FAIL_COND ( current . is_null ( ) ) ;
patch_index = current - > get_patches ( ) . size ( ) ;
patch_dialog - > popup_file_dialog ( ) ;
}
2017-02-21 04:05:15 +01:00
void ProjectExportDialog : : _export_pck_zip ( ) {
2020-06-26 13:53:18 +02:00
Ref < EditorExportPreset > current = get_current_preset ( ) ;
ERR_FAIL_COND ( current . is_null ( ) ) ;
String dir = current - > get_export_path ( ) . get_base_dir ( ) ;
export_pck_zip - > set_current_dir ( dir ) ;
2020-07-11 18:45:19 +02:00
export_pck_zip - > popup_file_dialog ( ) ;
2017-02-21 04:05:15 +01:00
}
2017-03-05 16:44:50 +01:00
void ProjectExportDialog : : _export_pck_zip_selected ( const String & p_path ) {
2018-12-23 19:28:29 +01:00
Ref < EditorExportPreset > current = get_current_preset ( ) ;
2017-03-05 16:44:50 +01:00
ERR_FAIL_COND ( current . is_null ( ) ) ;
2017-02-21 04:05:15 +01:00
Ref < EditorExportPlatform > platform = current - > get_platform ( ) ;
2017-03-05 16:44:50 +01:00
ERR_FAIL_COND ( platform . is_null ( ) ) ;
2017-02-21 04:05:15 +01:00
2024-03-21 09:42:38 +01:00
const Dictionary & fd_option = export_pck_zip - > get_selected_options ( ) ;
bool export_debug = fd_option . get ( TTR ( " Export With Debug " ) , true ) ;
2024-09-17 12:48:10 +02:00
bool export_as_patch = fd_option . get ( TTR ( " Export As Patch " ) , true ) ;
2024-03-21 09:42:38 +01:00
2017-02-21 04:05:15 +01:00
if ( p_path . ends_with ( " .zip " ) ) {
2024-09-17 12:48:10 +02:00
if ( export_as_patch ) {
platform - > export_zip_patch ( current , export_debug , p_path ) ;
} else {
platform - > export_zip ( current , export_debug , p_path ) ;
}
2017-02-21 04:05:15 +01:00
} else if ( p_path . ends_with ( " .pck " ) ) {
2024-09-17 12:48:10 +02:00
if ( export_as_patch ) {
platform - > export_pack_patch ( current , export_debug , p_path ) ;
} else {
platform - > export_pack ( current , export_debug , p_path ) ;
}
2024-03-06 18:14:21 +01:00
} else {
ERR_FAIL_MSG ( " Path must end with .pck or .zip " ) ;
2017-02-21 04:05:15 +01:00
}
}
2017-03-21 03:31:41 +01:00
void ProjectExportDialog : : _open_export_template_manager ( ) {
hide ( ) ;
2023-02-15 15:35:16 +01:00
EditorNode : : get_singleton ( ) - > open_export_template_manager ( ) ;
2017-03-21 03:31:41 +01:00
}
2018-08-31 10:48:40 +02:00
void ProjectExportDialog : : _validate_export_path ( const String & p_path ) {
// Disable export via OK button or Enter key if LineEdit has an empty filename
2021-12-09 10:42:46 +01:00
bool invalid_path = ( p_path . get_file ( ) . get_basename ( ) . is_empty ( ) ) ;
2018-08-31 10:48:40 +02:00
// Check if state change before needlessly messing with signals
2020-12-14 19:37:30 +01:00
if ( invalid_path & & export_project - > get_ok_button ( ) - > is_disabled ( ) ) {
2018-08-31 10:48:40 +02:00
return ;
2020-05-14 16:41:43 +02:00
}
2020-12-14 19:37:30 +01:00
if ( ! invalid_path & & ! export_project - > get_ok_button ( ) - > is_disabled ( ) ) {
2018-08-31 10:48:40 +02:00
return ;
2020-05-14 16:41:43 +02:00
}
2018-08-31 10:48:40 +02:00
if ( invalid_path ) {
2020-12-14 19:37:30 +01:00
export_project - > get_ok_button ( ) - > set_disabled ( true ) ;
2020-12-06 16:09:18 +01:00
export_project - > get_line_edit ( ) - > disconnect ( " text_submitted " , callable_mp ( export_project , & EditorFileDialog : : _file_submitted ) ) ;
2018-08-31 10:48:40 +02:00
} else {
2020-12-14 19:37:30 +01:00
export_project - > get_ok_button ( ) - > set_disabled ( false ) ;
2020-12-06 16:09:18 +01:00
export_project - > get_line_edit ( ) - > connect ( " text_submitted " , callable_mp ( export_project , & EditorFileDialog : : _file_submitted ) ) ;
2018-08-31 10:48:40 +02:00
}
}
2017-03-21 23:34:26 +01:00
void ProjectExportDialog : : _export_project ( ) {
2018-12-23 19:28:29 +01:00
Ref < EditorExportPreset > current = get_current_preset ( ) ;
2017-03-21 23:34:26 +01:00
ERR_FAIL_COND ( current . is_null ( ) ) ;
Ref < EditorExportPlatform > platform = current - > get_platform ( ) ;
ERR_FAIL_COND ( platform . is_null ( ) ) ;
2019-04-24 20:52:15 +02:00
export_project - > set_access ( EditorFileDialog : : ACCESS_FILESYSTEM ) ;
2017-03-21 23:34:26 +01:00
export_project - > clear_filters ( ) ;
2017-12-12 22:09:48 +01:00
2018-10-29 22:18:49 +01:00
List < String > extension_list = platform - > get_binary_extensions ( current ) ;
2024-04-15 15:18:34 +02:00
for ( const String & extension : extension_list ) {
2022-03-05 05:32:38 +01:00
// TRANSLATORS: This is the name of a project export file format. %s will be replaced by the platform name.
2024-04-15 15:18:34 +02:00
export_project - > add_filter ( " *. " + extension , vformat ( TTR ( " %s Export " ) , platform - > get_name ( ) ) ) ;
2018-10-29 22:18:49 +01:00
}
2021-12-09 10:42:46 +01:00
if ( ! current - > get_export_path ( ) . is_empty ( ) ) {
2019-08-22 22:14:45 +02:00
export_project - > set_current_path ( current - > get_export_path ( ) ) ;
2018-08-31 10:48:40 +02:00
} else {
2018-10-29 22:18:49 +01:00
if ( extension_list . size ( ) > = 1 ) {
2024-04-15 15:18:34 +02:00
export_project - > set_current_file ( default_filename + " . " + extension_list . front ( ) - > get ( ) ) ;
2018-10-27 15:53:05 +02:00
} else {
export_project - > set_current_file ( default_filename ) ;
}
2018-08-31 10:48:40 +02:00
}
2020-02-27 22:49:16 +01:00
// Ensure that signal is connected if previous attempt left it disconnected
// with _validate_export_path.
// FIXME: This is a hack, we should instead change EditorFileDialog to allow
2021-06-16 18:43:34 +02:00
// disabling validation by the "text_submitted" signal.
2020-12-06 16:09:18 +01:00
if ( ! export_project - > get_line_edit ( ) - > is_connected ( " text_submitted " , callable_mp ( export_project , & EditorFileDialog : : _file_submitted ) ) ) {
2020-12-14 19:37:30 +01:00
export_project - > get_ok_button ( ) - > set_disabled ( false ) ;
2020-12-06 16:09:18 +01:00
export_project - > get_line_edit ( ) - > connect ( " text_submitted " , callable_mp ( export_project , & EditorFileDialog : : _file_submitted ) ) ;
2017-03-21 23:34:26 +01:00
}
2020-03-06 18:00:16 +01:00
export_project - > set_file_mode ( EditorFileDialog : : FILE_MODE_SAVE_FILE ) ;
2020-07-11 18:45:19 +02:00
export_project - > popup_file_dialog ( ) ;
2017-03-21 23:34:26 +01:00
}
void ProjectExportDialog : : _export_project_to_path ( const String & p_path ) {
2017-10-28 10:57:29 +02:00
// Save this name for use in future exports (but drop the file extension)
2018-08-31 10:48:40 +02:00
default_filename = p_path . get_file ( ) . get_basename ( ) ;
2017-10-28 10:57:29 +02:00
EditorSettings : : get_singleton ( ) - > set_project_metadata ( " export_options " , " default_filename " , default_filename ) ;
2017-03-21 23:34:26 +01:00
2018-12-23 19:28:29 +01:00
Ref < EditorExportPreset > current = get_current_preset ( ) ;
2023-11-20 14:44:38 +01:00
ERR_FAIL_COND_MSG ( current . is_null ( ) , " Failed to start the export: current preset is invalid. " ) ;
2017-03-21 23:34:26 +01:00
Ref < EditorExportPlatform > platform = current - > get_platform ( ) ;
2023-11-20 14:44:38 +01:00
ERR_FAIL_COND_MSG ( platform . is_null ( ) , " Failed to start the export: current preset has no valid platform. " ) ;
2018-10-27 15:53:05 +02:00
current - > set_export_path ( p_path ) ;
2017-03-21 23:34:26 +01:00
2023-11-20 14:44:38 +01:00
exporting = true ;
2022-06-03 17:34:24 +02:00
platform - > clear_messages ( ) ;
2024-02-12 23:16:48 +01:00
current - > update_value_overrides ( ) ;
2024-03-21 09:42:38 +01:00
Dictionary fd_option = export_project - > get_selected_options ( ) ;
bool export_debug = fd_option . get ( TTR ( " Export With Debug " ) , true ) ;
Error err = platform - > export_project ( current , export_debug , current - > get_export_path ( ) , 0 ) ;
2022-06-03 17:34:24 +02:00
result_dialog_log - > clear ( ) ;
if ( err ! = ERR_SKIP ) {
if ( platform - > fill_log_messages ( result_dialog_log , err ) ) {
result_dialog - > popup_centered_ratio ( 0.5 ) ;
2019-02-22 10:21:34 +01:00
}
2017-10-13 00:38:42 +02:00
}
2023-11-20 14:44:38 +01:00
exporting = false ;
2017-03-21 23:34:26 +01:00
}
2018-11-03 16:56:31 +01:00
void ProjectExportDialog : : _export_all_dialog ( ) {
export_all_dialog - > show ( ) ;
2020-03-06 18:00:16 +01:00
export_all_dialog - > popup_centered ( Size2 ( 300 , 80 ) ) ;
2018-11-03 16:56:31 +01:00
}
void ProjectExportDialog : : _export_all_dialog_action ( const String & p_str ) {
export_all_dialog - > hide ( ) ;
2019-06-26 15:08:25 +02:00
_export_all ( p_str ! = " release " ) ;
2018-11-03 16:56:31 +01:00
}
void ProjectExportDialog : : _export_all ( bool p_debug ) {
2023-11-20 14:44:38 +01:00
exporting = true ;
2022-06-03 17:34:24 +02:00
bool show_dialog = false ;
2023-11-20 14:44:38 +01:00
2023-12-06 15:18:35 +01:00
{ // Scope for the editor progress, we must free it before showing the dialog at the end.
String export_target = p_debug ? TTR ( " Debug " ) : TTR ( " Release " ) ;
EditorProgress ep ( " exportall " , TTR ( " Exporting All " ) + " " + export_target , EditorExport : : get_singleton ( ) - > get_export_preset_count ( ) , true ) ;
2018-11-03 16:56:31 +01:00
2023-12-06 15:18:35 +01:00
result_dialog_log - > clear ( ) ;
for ( int i = 0 ; i < EditorExport : : get_singleton ( ) - > get_export_preset_count ( ) ; i + + ) {
Ref < EditorExportPreset > preset = EditorExport : : get_singleton ( ) - > get_export_preset ( i ) ;
if ( preset . is_null ( ) ) {
exporting = false ;
ERR_FAIL_MSG ( " Failed to start the export: one of the presets is invalid. " ) ;
}
2018-11-03 16:56:31 +01:00
2023-12-06 15:18:35 +01:00
Ref < EditorExportPlatform > platform = preset - > get_platform ( ) ;
if ( platform . is_null ( ) ) {
exporting = false ;
ERR_FAIL_MSG ( " Failed to start the export: one of the presets has no valid platform. " ) ;
}
ep . step ( preset - > get_name ( ) , i ) ;
platform - > clear_messages ( ) ;
2024-02-12 23:16:48 +01:00
preset - > update_value_overrides ( ) ;
2023-12-06 15:18:35 +01:00
Error err = platform - > export_project ( preset , p_debug , preset - > get_export_path ( ) , 0 ) ;
if ( err = = ERR_SKIP ) {
exporting = false ;
return ;
}
bool has_messages = platform - > fill_log_messages ( result_dialog_log , err ) ;
show_dialog = show_dialog | | has_messages ;
2018-11-03 16:56:31 +01:00
}
2022-06-03 17:34:24 +02:00
}
2023-12-06 15:18:35 +01:00
2022-06-03 17:34:24 +02:00
if ( show_dialog ) {
result_dialog - > popup_centered_ratio ( 0.5 ) ;
2018-11-03 16:56:31 +01:00
}
2023-11-20 14:44:38 +01:00
exporting = false ;
2018-11-03 16:56:31 +01:00
}
2017-02-20 03:19:30 +01:00
void ProjectExportDialog : : _bind_methods ( ) {
2018-11-12 20:04:58 +01:00
ClassDB : : bind_method ( " set_export_path " , & ProjectExportDialog : : set_export_path ) ;
ClassDB : : bind_method ( " get_export_path " , & ProjectExportDialog : : get_export_path ) ;
2018-12-23 19:28:29 +01:00
ClassDB : : bind_method ( " get_current_preset " , & ProjectExportDialog : : get_current_preset ) ;
2018-11-12 20:04:58 +01:00
ADD_PROPERTY ( PropertyInfo ( Variant : : STRING , " export_path " ) , " set_export_path " , " get_export_path " ) ;
2017-02-20 03:19:30 +01:00
}
2018-08-31 10:48:40 +02:00
2017-02-20 03:19:30 +01:00
ProjectExportDialog : : ProjectExportDialog ( ) {
2017-03-02 22:43:56 +01:00
set_title ( TTR ( " Export " ) ) ;
2023-03-19 17:26:22 +01:00
set_clamp_to_embedder ( true ) ;
2017-03-02 22:43:56 +01:00
2017-03-21 03:31:41 +01:00
VBoxContainer * main_vb = memnew ( VBoxContainer ) ;
add_child ( main_vb ) ;
2023-12-04 13:18:48 +01:00
2019-01-11 17:54:00 +01:00
HSplitContainer * hbox = memnew ( HSplitContainer ) ;
2017-03-21 03:31:41 +01:00
main_vb - > add_child ( hbox ) ;
2020-03-06 18:00:16 +01:00
hbox - > set_v_size_flags ( Control : : SIZE_EXPAND_FILL ) ;
2017-02-20 03:19:30 +01:00
2020-01-08 13:29:49 +01:00
// Presets list.
2017-03-05 16:44:50 +01:00
VBoxContainer * preset_vb = memnew ( VBoxContainer ) ;
2017-02-20 03:19:30 +01:00
preset_vb - > set_h_size_flags ( Control : : SIZE_EXPAND_FILL ) ;
hbox - > add_child ( preset_vb ) ;
2021-07-08 15:29:15 +02:00
Label * l = memnew ( Label ( TTR ( " Presets " ) ) ) ;
l - > set_theme_type_variation ( " HeaderSmall " ) ;
2017-03-05 16:44:50 +01:00
HBoxContainer * preset_hb = memnew ( HBoxContainer ) ;
2021-07-08 15:29:15 +02:00
preset_hb - > add_child ( l ) ;
2017-02-20 03:19:30 +01:00
preset_hb - > add_spacer ( ) ;
preset_vb - > add_child ( preset_hb ) ;
2017-03-05 16:44:50 +01:00
add_preset = memnew ( MenuButton ) ;
2018-04-22 19:36:01 +02:00
add_preset - > set_text ( TTR ( " Add... " ) ) ;
2020-02-21 18:28:45 +01:00
add_preset - > get_popup ( ) - > connect ( " index_pressed " , callable_mp ( this , & ProjectExportDialog : : _add_preset ) ) ;
2017-02-20 03:19:30 +01:00
preset_hb - > add_child ( add_preset ) ;
2017-03-05 16:44:50 +01:00
MarginContainer * mc = memnew ( MarginContainer ) ;
2017-02-20 03:19:30 +01:00
preset_vb - > add_child ( mc ) ;
2020-03-06 18:00:16 +01:00
mc - > set_v_size_flags ( Control : : SIZE_EXPAND_FILL ) ;
2017-03-05 16:44:50 +01:00
presets = memnew ( ItemList ) ;
2024-01-23 22:29:45 +01:00
presets - > set_auto_translate_mode ( AUTO_TRANSLATE_MODE_DISABLED ) ;
2023-01-14 03:37:19 +01:00
SET_DRAG_FORWARDING_GCD ( presets , ProjectExportDialog ) ;
2017-02-20 03:19:30 +01:00
mc - > add_child ( presets ) ;
2024-05-14 14:21:31 +02:00
presets - > connect ( SceneStringName ( item_selected ) , callable_mp ( this , & ProjectExportDialog : : _edit_preset ) ) ;
2020-06-19 20:49:04 +02:00
duplicate_preset = memnew ( Button ) ;
2022-08-25 12:42:17 +02:00
duplicate_preset - > set_tooltip_text ( TTR ( " Duplicate " ) ) ;
2020-06-19 20:49:04 +02:00
duplicate_preset - > set_flat ( true ) ;
2018-10-28 19:13:38 +01:00
preset_hb - > add_child ( duplicate_preset ) ;
2024-05-14 09:40:21 +02:00
duplicate_preset - > connect ( SceneStringName ( pressed ) , callable_mp ( this , & ProjectExportDialog : : _duplicate_preset ) ) ;
2020-06-19 20:49:04 +02:00
delete_preset = memnew ( Button ) ;
2022-08-25 12:42:17 +02:00
delete_preset - > set_tooltip_text ( TTR ( " Delete " ) ) ;
2020-06-19 20:49:04 +02:00
delete_preset - > set_flat ( true ) ;
2017-02-20 03:19:30 +01:00
preset_hb - > add_child ( delete_preset ) ;
2024-05-14 09:40:21 +02:00
delete_preset - > connect ( SceneStringName ( pressed ) , callable_mp ( this , & ProjectExportDialog : : _delete_preset ) ) ;
2017-02-20 03:19:30 +01:00
2020-01-08 13:29:49 +01:00
// Preset settings.
2017-03-05 16:44:50 +01:00
VBoxContainer * settings_vb = memnew ( VBoxContainer ) ;
2017-02-20 03:19:30 +01:00
settings_vb - > set_h_size_flags ( Control : : SIZE_EXPAND_FILL ) ;
hbox - > add_child ( settings_vb ) ;
name = memnew ( LineEdit ) ;
2017-03-05 16:44:50 +01:00
settings_vb - > add_margin_child ( TTR ( " Name: " ) , name ) ;
2024-05-14 11:42:00 +02:00
name - > connect ( SceneStringName ( text_changed ) , callable_mp ( this , & ProjectExportDialog : : _name_changed ) ) ;
2024-02-16 23:05:50 +01:00
2017-02-20 03:19:30 +01:00
runnable = memnew ( CheckButton ) ;
runnable - > set_text ( TTR ( " Runnable " ) ) ;
2022-08-25 12:42:17 +02:00
runnable - > set_tooltip_text ( TTR ( " If checked, the preset will be available for use in one-click deploy. \n Only one preset per platform may be marked as runnable. " ) ) ;
2024-05-14 09:40:21 +02:00
runnable - > connect ( SceneStringName ( pressed ) , callable_mp ( this , & ProjectExportDialog : : _runnable_pressed ) ) ;
2024-02-16 23:05:50 +01:00
advanced_options = memnew ( CheckButton ) ;
advanced_options - > set_text ( TTR ( " Advanced Options " ) ) ;
advanced_options - > set_tooltip_text ( TTR ( " If checked, the advanced options will be shown. " ) ) ;
2024-05-14 09:40:21 +02:00
advanced_options - > connect ( SceneStringName ( pressed ) , callable_mp ( this , & ProjectExportDialog : : _advanced_options_pressed ) ) ;
2024-02-16 23:05:50 +01:00
HBoxContainer * preset_configs_container = memnew ( HBoxContainer ) ;
preset_configs_container - > add_spacer ( true ) ;
preset_configs_container - > add_child ( advanced_options ) ;
preset_configs_container - > add_child ( runnable ) ;
settings_vb - > add_child ( preset_configs_container ) ;
2017-02-20 03:19:30 +01:00
2018-11-12 20:04:58 +01:00
export_path = memnew ( EditorPropertyPath ) ;
settings_vb - > add_child ( export_path ) ;
export_path - > set_label ( TTR ( " Export Path " ) ) ;
export_path - > set_object_and_property ( this , " export_path " ) ;
export_path - > set_save_mode ( ) ;
2020-02-21 18:28:45 +01:00
export_path - > connect ( " property_changed " , callable_mp ( this , & ProjectExportDialog : : _export_path_changed ) ) ;
2018-11-06 02:01:34 +01:00
2020-01-08 13:29:49 +01:00
// Subsections.
2017-03-05 16:44:50 +01:00
sections = memnew ( TabContainer ) ;
2019-01-26 19:41:36 +01:00
sections - > set_use_hidden_tabs_for_min_size ( true ) ;
2022-05-27 04:12:09 +02:00
sections - > set_theme_type_variation ( " TabContainerOdd " ) ;
2017-02-20 03:19:30 +01:00
settings_vb - > add_child ( sections ) ;
2020-03-06 18:00:16 +01:00
sections - > set_v_size_flags ( Control : : SIZE_EXPAND_FILL ) ;
2017-02-20 03:19:30 +01:00
2020-01-08 13:29:49 +01:00
// Main preset parameters.
2018-08-18 15:07:23 +02:00
parameters = memnew ( EditorInspector ) ;
2017-02-20 03:19:30 +01:00
sections - > add_child ( parameters ) ;
parameters - > set_name ( TTR ( " Options " ) ) ;
2020-03-06 18:00:16 +01:00
parameters - > set_v_size_flags ( Control : : SIZE_EXPAND_FILL ) ;
2023-03-09 09:41:52 +01:00
parameters - > set_use_doc_hints ( true ) ;
2020-02-21 18:28:45 +01:00
parameters - > connect ( " property_edited " , callable_mp ( this , & ProjectExportDialog : : _update_parameters ) ) ;
2020-04-24 09:45:14 +02:00
EditorExport : : get_singleton ( ) - > connect ( " export_presets_updated " , callable_mp ( this , & ProjectExportDialog : : _force_update_current_preset_parameters ) ) ;
2017-02-20 03:19:30 +01:00
2020-01-08 13:29:49 +01:00
// Resources export parameters.
2024-04-29 01:37:41 +02:00
ScrollContainer * resources_scroll_container = memnew ( ScrollContainer ) ;
resources_scroll_container - > set_name ( TTR ( " Resources " ) ) ;
resources_scroll_container - > set_horizontal_scroll_mode ( ScrollContainer : : SCROLL_MODE_DISABLED ) ;
sections - > add_child ( resources_scroll_container ) ;
2017-03-05 16:44:50 +01:00
VBoxContainer * resources_vb = memnew ( VBoxContainer ) ;
2024-04-29 01:37:41 +02:00
resources_vb - > set_h_size_flags ( Control : : SIZE_EXPAND_FILL ) ;
resources_vb - > set_v_size_flags ( Control : : SIZE_EXPAND_FILL ) ;
resources_scroll_container - > add_child ( resources_vb ) ;
2017-02-20 03:19:30 +01:00
2017-03-05 16:44:50 +01:00
export_filter = memnew ( OptionButton ) ;
2017-02-20 03:19:30 +01:00
export_filter - > add_item ( TTR ( " Export all resources in the project " ) ) ;
export_filter - > add_item ( TTR ( " Export selected scenes (and dependencies) " ) ) ;
export_filter - > add_item ( TTR ( " Export selected resources (and dependencies) " ) ) ;
2020-11-15 01:54:24 +01:00
export_filter - > add_item ( TTR ( " Export all resources in the project except resources checked below " ) ) ;
2022-12-20 22:49:11 +01:00
export_filter - > add_item ( TTR ( " Export as dedicated server " ) ) ;
2017-03-05 16:44:50 +01:00
resources_vb - > add_margin_child ( TTR ( " Export Mode: " ) , export_filter ) ;
2024-05-14 14:21:31 +02:00
export_filter - > connect ( SceneStringName ( item_selected ) , callable_mp ( this , & ProjectExportDialog : : _export_type_changed ) ) ;
2017-02-20 03:19:30 +01:00
2017-03-05 16:44:50 +01:00
include_label = memnew ( Label ) ;
2017-02-20 03:19:30 +01:00
include_label - > set_text ( TTR ( " Resources to export: " ) ) ;
resources_vb - > add_child ( include_label ) ;
2017-03-05 16:44:50 +01:00
include_margin = memnew ( MarginContainer ) ;
2020-03-06 18:00:16 +01:00
include_margin - > set_v_size_flags ( Control : : SIZE_EXPAND_FILL ) ;
2017-02-20 03:19:30 +01:00
resources_vb - > add_child ( include_margin ) ;
include_files = memnew ( Tree ) ;
2024-04-29 01:37:41 +02:00
include_files - > set_custom_minimum_size ( Size2 ( 1 , 75 * EDSCALE ) ) ;
2017-02-20 03:19:30 +01:00
include_margin - > add_child ( include_files ) ;
2024-03-17 09:28:18 +01:00
include_files - > set_auto_translate_mode ( AUTO_TRANSLATE_MODE_DISABLED ) ;
2020-02-21 18:28:45 +01:00
include_files - > connect ( " item_edited " , callable_mp ( this , & ProjectExportDialog : : _tree_changed ) ) ;
2021-09-17 17:50:24 +02:00
include_files - > connect ( " check_propagated_to_item " , callable_mp ( this , & ProjectExportDialog : : _check_propagated_to_item ) ) ;
2022-12-20 22:49:11 +01:00
include_files - > connect ( " custom_popup_edited " , callable_mp ( this , & ProjectExportDialog : : _tree_popup_edited ) ) ;
server_strip_message = memnew ( Label ) ;
server_strip_message - > set_visible ( false ) ;
server_strip_message - > set_autowrap_mode ( TextServer : : AUTOWRAP_WORD_SMART ) ;
2023-12-14 03:41:22 +01:00
server_strip_message - > set_custom_minimum_size ( Size2 ( 300 * EDSCALE , 1 ) ) ;
2022-12-20 22:49:11 +01:00
resources_vb - > add_child ( server_strip_message ) ;
{
List < StringName > resource_names ;
ClassDB : : get_inheriters_from_class ( " Resource " , & resource_names ) ;
PackedStringArray strippable ;
2021-08-01 21:47:20 +02:00
for ( const StringName & resource_name : resource_names ) {
2022-12-20 22:49:11 +01:00
if ( ClassDB : : has_method ( resource_name , " create_placeholder " , true ) ) {
strippable . push_back ( resource_name ) ;
}
}
strippable . sort ( ) ;
String message = TTR ( " \" Strip Visuals \" will replace the following resources with placeholders: " ) + " " ;
message + = String ( " , " ) . join ( strippable ) ;
server_strip_message - > set_text ( message ) ;
}
file_mode_popup = memnew ( PopupMenu ) ;
add_child ( file_mode_popup ) ;
file_mode_popup - > add_item ( TTR ( " Strip Visuals " ) , EditorExportPreset : : MODE_FILE_STRIP ) ;
file_mode_popup - > add_item ( TTR ( " Keep " ) , EditorExportPreset : : MODE_FILE_KEEP ) ;
file_mode_popup - > add_item ( TTR ( " Remove " ) , EditorExportPreset : : MODE_FILE_REMOVE ) ;
2024-05-14 14:13:31 +02:00
file_mode_popup - > connect ( SceneStringName ( id_pressed ) , callable_mp ( this , & ProjectExportDialog : : _set_file_export_mode ) ) ;
2017-02-20 03:19:30 +01:00
2017-03-05 16:44:50 +01:00
include_filters = memnew ( LineEdit ) ;
2019-10-05 16:45:12 +02:00
resources_vb - > add_margin_child (
TTR ( " Filters to export non-resource files/folders \n (comma-separated, e.g: *.json, *.txt, docs/*) " ) ,
include_filters ) ;
2024-05-14 11:42:00 +02:00
include_filters - > connect ( SceneStringName ( text_changed ) , callable_mp ( this , & ProjectExportDialog : : _filter_changed ) ) ;
2017-02-20 03:19:30 +01:00
2017-03-05 16:44:50 +01:00
exclude_filters = memnew ( LineEdit ) ;
2019-10-05 16:45:12 +02:00
resources_vb - > add_margin_child (
TTR ( " Filters to exclude files/folders from project \n (comma-separated, e.g: *.json, *.txt, docs/*) " ) ,
exclude_filters ) ;
2024-05-14 11:42:00 +02:00
exclude_filters - > connect ( SceneStringName ( text_changed ) , callable_mp ( this , & ProjectExportDialog : : _filter_changed ) ) ;
2017-02-20 03:19:30 +01:00
2024-09-17 12:48:10 +02:00
// Patch packages.
VBoxContainer * patch_vb = memnew ( VBoxContainer ) ;
sections - > add_child ( patch_vb ) ;
patch_vb - > set_name ( TTR ( " Patches " ) ) ;
patches = memnew ( Tree ) ;
patches - > set_v_size_flags ( Control : : SIZE_EXPAND_FILL ) ;
patches - > set_hide_root ( true ) ;
patches - > set_auto_translate_mode ( AUTO_TRANSLATE_MODE_DISABLED ) ;
patches - > connect ( " button_clicked " , callable_mp ( this , & ProjectExportDialog : : _patch_tree_button_clicked ) ) ;
patches - > connect ( " item_edited " , callable_mp ( this , & ProjectExportDialog : : _patch_tree_item_edited ) ) ;
SET_DRAG_FORWARDING_GCD ( patches , ProjectExportDialog ) ;
patches - > set_edit_checkbox_cell_only_when_checkbox_is_pressed ( true ) ;
patch_vb - > add_margin_child ( TTR ( " Base Packs: " ) , patches , true ) ;
patch_dialog = memnew ( EditorFileDialog ) ;
patch_dialog - > add_filter ( " *.pck " , TTR ( " Godot Project Pack " ) ) ;
patch_dialog - > set_access ( EditorFileDialog : : ACCESS_FILESYSTEM ) ;
patch_dialog - > set_file_mode ( EditorFileDialog : : FILE_MODE_OPEN_FILE ) ;
patch_dialog - > connect ( " file_selected " , callable_mp ( this , & ProjectExportDialog : : _patch_file_selected ) ) ;
add_child ( patch_dialog ) ;
patch_erase = memnew ( ConfirmationDialog ) ;
patch_erase - > set_ok_button_text ( TTR ( " Delete " ) ) ;
patch_erase - > connect ( SceneStringName ( confirmed ) , callable_mp ( this , & ProjectExportDialog : : _patch_delete_confirmed ) ) ;
add_child ( patch_erase ) ;
patch_add_btn = memnew ( Button ) ;
patch_add_btn - > set_text ( TTR ( " Add Pack " ) ) ;
patch_add_btn - > set_h_size_flags ( Control : : SIZE_SHRINK_CENTER ) ;
patch_add_btn - > connect ( SceneStringName ( pressed ) , callable_mp ( this , & ProjectExportDialog : : _patch_add_pack_pressed ) ) ;
patch_vb - > add_child ( patch_add_btn ) ;
2020-01-08 13:29:49 +01:00
// Feature tags.
2017-07-19 22:00:46 +02:00
VBoxContainer * feature_vb = memnew ( VBoxContainer ) ;
feature_vb - > set_name ( TTR ( " Features " ) ) ;
2024-04-29 01:37:41 +02:00
feature_vb - > set_h_size_flags ( Control : : SIZE_EXPAND_FILL ) ;
2017-07-19 22:00:46 +02:00
custom_features = memnew ( LineEdit ) ;
2024-05-14 11:42:00 +02:00
custom_features - > connect ( SceneStringName ( text_changed ) , callable_mp ( this , & ProjectExportDialog : : _custom_features_changed ) ) ;
2017-07-19 22:00:46 +02:00
feature_vb - > add_margin_child ( TTR ( " Custom (comma-separated): " ) , custom_features ) ;
custom_feature_display = memnew ( RichTextLabel ) ;
2024-04-29 01:37:41 +02:00
custom_feature_display - > set_custom_minimum_size ( Size2 ( 1 , 75 * EDSCALE ) ) ;
2020-03-06 18:00:16 +01:00
custom_feature_display - > set_v_size_flags ( Control : : SIZE_EXPAND_FILL ) ;
2020-04-05 05:08:53 +02:00
feature_vb - > add_margin_child ( TTR ( " Feature List: " ) , custom_feature_display , true ) ;
2017-07-19 22:00:46 +02:00
sections - > add_child ( feature_vb ) ;
2024-01-22 15:31:55 +01:00
// Encryption export parameters.
2020-01-08 13:29:49 +01:00
2024-04-29 01:37:41 +02:00
ScrollContainer * sec_scroll_container = memnew ( ScrollContainer ) ;
sec_scroll_container - > set_name ( TTR ( " Encryption " ) ) ;
sec_scroll_container - > set_horizontal_scroll_mode ( ScrollContainer : : SCROLL_MODE_DISABLED ) ;
2020-04-28 19:51:29 +02:00
VBoxContainer * sec_vb = memnew ( VBoxContainer ) ;
2024-04-29 01:37:41 +02:00
sec_vb - > set_h_size_flags ( Control : : SIZE_EXPAND_FILL ) ;
sec_scroll_container - > add_child ( sec_vb ) ;
2020-04-28 19:51:29 +02:00
enc_pck = memnew ( CheckButton ) ;
2024-06-01 12:15:13 +02:00
enc_pck - > connect ( SceneStringName ( toggled ) , callable_mp ( this , & ProjectExportDialog : : _enc_pck_changed ) ) ;
2021-06-24 10:00:48 +02:00
enc_pck - > set_text ( TTR ( " Encrypt Exported PCK " ) ) ;
2020-04-28 19:51:29 +02:00
sec_vb - > add_child ( enc_pck ) ;
enc_directory = memnew ( CheckButton ) ;
2024-06-01 12:15:13 +02:00
enc_directory - > connect ( SceneStringName ( toggled ) , callable_mp ( this , & ProjectExportDialog : : _enc_directory_changed ) ) ;
2021-07-19 21:10:05 +02:00
enc_directory - > set_text ( TTR ( " Encrypt Index (File Names and Info) " ) ) ;
2020-04-28 19:51:29 +02:00
sec_vb - > add_child ( enc_directory ) ;
enc_in_filters = memnew ( LineEdit ) ;
2024-05-14 11:42:00 +02:00
enc_in_filters - > connect ( SceneStringName ( text_changed ) , callable_mp ( this , & ProjectExportDialog : : _enc_filters_changed ) ) ;
2020-04-28 19:51:29 +02:00
sec_vb - > add_margin_child (
TTR ( " Filters to include files/folders \n (comma-separated, e.g: *.tscn, *.tres, scenes/*) " ) ,
enc_in_filters ) ;
enc_ex_filters = memnew ( LineEdit ) ;
2024-05-14 11:42:00 +02:00
enc_ex_filters - > connect ( SceneStringName ( text_changed ) , callable_mp ( this , & ProjectExportDialog : : _enc_filters_changed ) ) ;
2020-04-28 19:51:29 +02:00
sec_vb - > add_margin_child (
2022-03-10 04:22:36 +01:00
TTR ( " Filters to exclude files/folders \n (comma-separated, e.g: *.ctex, *.import, music/*) " ) ,
2020-04-28 19:51:29 +02:00
enc_ex_filters ) ;
2018-12-23 19:28:29 +01:00
script_key = memnew ( LineEdit ) ;
2024-05-14 11:42:00 +02:00
script_key - > connect ( SceneStringName ( text_changed ) , callable_mp ( this , & ProjectExportDialog : : _script_encryption_key_changed ) ) ;
2018-12-23 19:28:29 +01:00
script_key_error = memnew ( Label ) ;
2021-07-28 19:40:45 +02:00
script_key_error - > set_text ( String : : utf8 ( " • " ) + TTR ( " Invalid Encryption Key (must be 64 hexadecimal characters long) " ) ) ;
2024-05-14 15:57:29 +02:00
script_key_error - > add_theme_color_override ( SceneStringName ( font_color ) , EditorNode : : get_singleton ( ) - > get_editor_theme ( ) - > get_color ( SNAME ( " error_color " ) , EditorStringName ( Editor ) ) ) ;
2021-06-24 10:00:48 +02:00
sec_vb - > add_margin_child ( TTR ( " Encryption Key (256-bits as hexadecimal): " ) , script_key ) ;
2020-04-28 19:51:29 +02:00
sec_vb - > add_child ( script_key_error ) ;
2024-04-29 01:37:41 +02:00
sections - > add_child ( sec_scroll_container ) ;
2020-04-28 19:51:29 +02:00
Label * sec_info = memnew ( Label ) ;
sec_info - > set_text ( TTR ( " Note: Encryption key needs to be stored in the binary, \n you need to build the export templates from source. " ) ) ;
sec_vb - > add_child ( sec_info ) ;
LinkButton * sec_more_info = memnew ( LinkButton ) ;
sec_more_info - > set_text ( TTR ( " More Info... " ) ) ;
2024-05-14 09:40:21 +02:00
sec_more_info - > connect ( SceneStringName ( pressed ) , callable_mp ( this , & ProjectExportDialog : : _open_key_help_link ) ) ;
2020-04-28 19:51:29 +02:00
sec_vb - > add_child ( sec_more_info ) ;
2018-12-23 19:28:29 +01:00
2024-01-22 15:31:55 +01:00
// Script export parameters.
VBoxContainer * script_vb = memnew ( VBoxContainer ) ;
script_vb - > set_name ( TTR ( " Scripts " ) ) ;
script_mode = memnew ( OptionButton ) ;
script_vb - > add_margin_child ( TTR ( " GDScript Export Mode: " ) , script_mode ) ;
script_mode - > add_item ( TTR ( " Text (easier debugging) " ) , ( int ) EditorExportPreset : : MODE_SCRIPT_TEXT ) ;
script_mode - > add_item ( TTR ( " Binary tokens (faster loading) " ) , ( int ) EditorExportPreset : : MODE_SCRIPT_BINARY_TOKENS ) ;
2024-01-26 18:49:31 +01:00
script_mode - > add_item ( TTR ( " Compressed binary tokens (smaller files) " ) , ( int ) EditorExportPreset : : MODE_SCRIPT_BINARY_TOKENS_COMPRESSED ) ;
2024-05-14 14:21:31 +02:00
script_mode - > connect ( SceneStringName ( item_selected ) , callable_mp ( this , & ProjectExportDialog : : _script_export_mode_changed ) ) ;
2024-01-26 18:49:31 +01:00
2024-01-22 15:31:55 +01:00
sections - > add_child ( script_vb ) ;
2020-02-21 18:28:45 +01:00
sections - > connect ( " tab_changed " , callable_mp ( this , & ProjectExportDialog : : _tab_changed ) ) ;
2017-07-19 22:00:46 +02:00
2020-01-08 13:29:49 +01:00
// Disable by default.
2017-02-20 03:19:30 +01:00
name - > set_editable ( false ) ;
2018-11-12 20:04:58 +01:00
export_path - > hide ( ) ;
2024-02-16 23:05:50 +01:00
advanced_options - > set_disabled ( true ) ;
2017-02-20 03:19:30 +01:00
runnable - > set_disabled ( true ) ;
2018-10-28 19:13:38 +01:00
duplicate_preset - > set_disabled ( true ) ;
2017-02-20 03:19:30 +01:00
delete_preset - > set_disabled ( true ) ;
2018-12-23 19:28:29 +01:00
script_key_error - > hide ( ) ;
2017-02-20 03:19:30 +01:00
sections - > hide ( ) ;
2020-04-02 01:20:12 +02:00
parameters - > edit ( nullptr ) ;
2017-02-20 03:19:30 +01:00
2020-01-08 13:29:49 +01:00
// Deletion dialog.
2017-03-05 16:44:50 +01:00
delete_confirm = memnew ( ConfirmationDialog ) ;
2017-02-20 03:19:30 +01:00
add_child ( delete_confirm ) ;
2022-07-08 02:31:19 +02:00
delete_confirm - > set_ok_button_text ( TTR ( " Delete " ) ) ;
2024-05-14 14:28:18 +02:00
delete_confirm - > connect ( SceneStringName ( confirmed ) , callable_mp ( this , & ProjectExportDialog : : _delete_preset_confirm ) ) ;
2014-02-10 02:10:30 +01:00
2020-01-08 13:29:49 +01:00
// Export buttons, dialogs and errors.
2022-07-08 02:31:19 +02:00
set_cancel_button_text ( TTR ( " Close " ) ) ;
set_ok_button_text ( TTR ( " Export PCK/ZIP... " ) ) ;
2024-01-14 20:16:57 +01:00
get_ok_button ( ) - > set_tooltip_text ( TTR ( " Export the project resources as a PCK or ZIP package. This is not a playable build, only the project data without a Godot executable. " ) ) ;
2022-09-14 05:48:33 +02:00
get_ok_button ( ) - > set_disabled ( true ) ;
2024-06-16 21:14:34 +02:00
2019-11-04 16:29:09 +01:00
export_button = add_button ( TTR ( " Export Project... " ) , ! DisplayServer : : get_singleton ( ) - > get_swap_cancel_ok ( ) , " export " ) ;
2024-01-14 20:16:57 +01:00
export_button - > set_tooltip_text ( TTR ( " Export the project as a playable build (Godot executable and project data) for the selected preset. " ) ) ;
2024-05-14 09:40:21 +02:00
export_button - > connect ( SceneStringName ( pressed ) , callable_mp ( this , & ProjectExportDialog : : _export_project ) ) ;
2018-08-31 10:48:40 +02:00
// Disable initially before we select a valid preset
export_button - > set_disabled ( true ) ;
2017-02-21 04:05:15 +01:00
2018-11-03 16:56:31 +01:00
export_all_dialog = memnew ( ConfirmationDialog ) ;
add_child ( export_all_dialog ) ;
2021-07-19 21:10:05 +02:00
export_all_dialog - > set_title ( TTR ( " Export All " ) ) ;
2019-11-04 16:29:09 +01:00
export_all_dialog - > set_text ( TTR ( " Choose an export mode: " ) ) ;
2020-12-14 19:37:30 +01:00
export_all_dialog - > get_ok_button ( ) - > hide ( ) ;
2018-11-03 16:56:31 +01:00
export_all_dialog - > add_button ( TTR ( " Debug " ) , true , " debug " ) ;
export_all_dialog - > add_button ( TTR ( " Release " ) , true , " release " ) ;
2020-02-21 18:28:45 +01:00
export_all_dialog - > connect ( " custom_action " , callable_mp ( this , & ProjectExportDialog : : _export_all_dialog_action ) ) ;
2018-11-03 16:56:31 +01:00
2019-11-04 16:29:09 +01:00
export_all_button = add_button ( TTR ( " Export All... " ) , ! DisplayServer : : get_singleton ( ) - > get_swap_cancel_ok ( ) , " export " ) ;
2024-05-14 09:40:21 +02:00
export_all_button - > connect ( SceneStringName ( pressed ) , callable_mp ( this , & ProjectExportDialog : : _export_all_dialog ) ) ;
2018-11-03 16:56:31 +01:00
export_all_button - > set_disabled ( true ) ;
2019-04-24 20:52:15 +02:00
export_pck_zip = memnew ( EditorFileDialog ) ;
2022-07-04 23:26:26 +02:00
export_pck_zip - > add_filter ( " *.zip " , TTR ( " ZIP File " ) ) ;
export_pck_zip - > add_filter ( " *.pck " , TTR ( " Godot Project Pack " ) ) ;
2019-04-24 20:52:15 +02:00
export_pck_zip - > set_access ( EditorFileDialog : : ACCESS_FILESYSTEM ) ;
2020-03-06 18:00:16 +01:00
export_pck_zip - > set_file_mode ( EditorFileDialog : : FILE_MODE_SAVE_FILE ) ;
2017-02-21 04:05:15 +01:00
add_child ( export_pck_zip ) ;
2020-02-21 18:28:45 +01:00
export_pck_zip - > connect ( " file_selected " , callable_mp ( this , & ProjectExportDialog : : _export_pck_zip_selected ) ) ;
2017-02-21 04:05:15 +01:00
2023-06-20 04:50:09 +02:00
// Export warnings and errors bottom section.
export_texture_format_error = memnew ( ProjectExportTextureFormatError ) ;
main_vb - > add_child ( export_texture_format_error ) ;
export_texture_format_error - > hide ( ) ;
export_texture_format_error - > connect ( " texture_format_enabled " , callable_mp ( this , & ProjectExportDialog : : _update_current_preset ) ) ;
2017-03-21 03:31:41 +01:00
export_error = memnew ( Label ) ;
main_vb - > add_child ( export_error ) ;
export_error - > hide ( ) ;
2024-05-14 15:57:29 +02:00
export_error - > add_theme_color_override ( SceneStringName ( font_color ) , EditorNode : : get_singleton ( ) - > get_editor_theme ( ) - > get_color ( SNAME ( " error_color " ) , EditorStringName ( Editor ) ) ) ;
2017-03-21 03:31:41 +01:00
2022-01-10 12:18:59 +01:00
export_warning = memnew ( Label ) ;
main_vb - > add_child ( export_warning ) ;
export_warning - > hide ( ) ;
2024-05-14 15:57:29 +02:00
export_warning - > add_theme_color_override ( SceneStringName ( font_color ) , EditorNode : : get_singleton ( ) - > get_editor_theme ( ) - > get_color ( SNAME ( " warning_color " ) , EditorStringName ( Editor ) ) ) ;
2022-01-10 12:18:59 +01:00
2017-03-21 03:31:41 +01:00
export_templates_error = memnew ( HBoxContainer ) ;
main_vb - > add_child ( export_templates_error ) ;
export_templates_error - > hide ( ) ;
Label * export_error2 = memnew ( Label ) ;
export_templates_error - > add_child ( export_error2 ) ;
2024-05-14 15:57:29 +02:00
export_error2 - > add_theme_color_override ( SceneStringName ( font_color ) , EditorNode : : get_singleton ( ) - > get_editor_theme ( ) - > get_color ( SNAME ( " error_color " ) , EditorStringName ( Editor ) ) ) ;
2021-07-28 19:40:45 +02:00
export_error2 - > set_text ( String : : utf8 ( " • " ) + TTR ( " Export templates for this platform are missing: " ) + " " ) ;
2017-03-21 03:31:41 +01:00
2022-06-03 17:34:24 +02:00
result_dialog = memnew ( AcceptDialog ) ;
result_dialog - > set_title ( TTR ( " Project Export " ) ) ;
result_dialog_log = memnew ( RichTextLabel ) ;
result_dialog_log - > set_custom_minimum_size ( Size2 ( 300 , 80 ) * EDSCALE ) ;
result_dialog - > add_child ( result_dialog_log ) ;
main_vb - > add_child ( result_dialog ) ;
result_dialog - > hide ( ) ;
2017-10-13 00:38:42 +02:00
2017-03-21 03:31:41 +01:00
LinkButton * download_templates = memnew ( LinkButton ) ;
download_templates - > set_text ( TTR ( " Manage Export Templates " ) ) ;
2020-03-06 18:00:16 +01:00
download_templates - > set_v_size_flags ( Control : : SIZE_SHRINK_CENTER ) ;
2017-03-21 03:31:41 +01:00
export_templates_error - > add_child ( download_templates ) ;
2024-05-14 09:40:21 +02:00
download_templates - > connect ( SceneStringName ( pressed ) , callable_mp ( this , & ProjectExportDialog : : _open_export_template_manager ) ) ;
2017-03-21 03:31:41 +01:00
2023-06-20 04:50:09 +02:00
// Export project file dialog.
2019-04-24 20:52:15 +02:00
export_project = memnew ( EditorFileDialog ) ;
export_project - > set_access ( EditorFileDialog : : ACCESS_FILESYSTEM ) ;
2017-03-21 23:34:26 +01:00
add_child ( export_project ) ;
2020-02-21 18:28:45 +01:00
export_project - > connect ( " file_selected " , callable_mp ( this , & ProjectExportDialog : : _export_project_to_path ) ) ;
2024-05-14 11:42:00 +02:00
export_project - > get_line_edit ( ) - > connect ( SceneStringName ( text_changed ) , callable_mp ( this , & ProjectExportDialog : : _validate_export_path ) ) ;
2017-03-21 23:34:26 +01:00
2024-03-21 09:42:38 +01:00
export_project - > add_option ( TTR ( " Export With Debug " ) , Vector < String > ( ) , true ) ;
export_pck_zip - > add_option ( TTR ( " Export With Debug " ) , Vector < String > ( ) , true ) ;
2024-09-17 12:48:10 +02:00
export_pck_zip - > add_option ( TTR ( " Export As Patch " ) , Vector < String > ( ) , true ) ;
2018-04-26 23:08:19 +02:00
2017-02-21 04:05:15 +01:00
set_hide_on_ok ( false ) ;
2018-08-31 10:48:40 +02:00
default_filename = EditorSettings : : get_singleton ( ) - > get_project_metadata ( " export_options " , " default_filename " , " " ) ;
// If no default set, use project name
2021-12-09 10:42:46 +01:00
if ( default_filename . is_empty ( ) ) {
2018-08-31 10:48:40 +02:00
// If no project name defined, use a sane default
2022-10-18 16:43:37 +02:00
default_filename = GLOBAL_GET ( " application/config/name " ) ;
2021-12-09 10:42:46 +01:00
if ( default_filename . is_empty ( ) ) {
2018-08-31 10:48:40 +02:00
default_filename = " UnnamedProject " ;
}
2018-04-17 23:10:30 +02:00
}
2014-02-10 02:10:30 +01:00
}
ProjectExportDialog : : ~ ProjectExportDialog ( ) {
}