2023-01-05 12:25:55 +00:00
/**************************************************************************/
/* editor_run_native.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-04 23:50:27 +00:00
2014-02-10 01:10:30 +00:00
# include "editor_run_native.h"
2022-02-12 01:46:22 +00:00
# include "editor/editor_node.h"
2022-07-31 18:14:15 +00:00
# include "editor/editor_settings.h"
2023-04-12 19:02:28 +00:00
# include "editor/export/editor_export.h"
2022-07-17 17:24:37 +00:00
# include "editor/export/editor_export_platform.h"
2024-01-15 12:14:55 +00:00
# include "editor/themes/editor_scale.h"
2014-02-10 01:10:30 +00:00
void EditorRunNative : : _notification ( int p_what ) {
2022-02-15 23:52:32 +00:00
switch ( p_what ) {
2022-12-29 09:21:39 +00:00
case NOTIFICATION_THEME_CHANGED : {
2023-08-13 00:33:39 +00:00
remote_debug - > set_icon ( get_editor_theme_icon ( SNAME ( " PlayRemote " ) ) ) ;
2022-02-15 23:52:32 +00:00
} break ;
2023-04-03 16:01:11 +00:00
2022-02-15 23:52:32 +00:00
case NOTIFICATION_PROCESS : {
bool changed = EditorExport : : get_singleton ( ) - > poll_export_platforms ( ) | | first ;
2014-02-10 01:10:30 +00:00
2022-02-15 23:52:32 +00:00
if ( changed ) {
2023-01-17 21:15:01 +00:00
PopupMenu * popup = remote_debug - > get_popup ( ) ;
popup - > clear ( ) ;
2024-05-16 20:16:30 +00:00
for ( int i = 0 ; i < EditorExport : : get_singleton ( ) - > get_export_preset_count ( ) ; i + + ) {
Ref < EditorExportPreset > preset = EditorExport : : get_singleton ( ) - > get_export_preset ( i ) ;
Ref < EditorExportPlatform > eep = preset - > get_platform ( ) ;
2022-12-29 09:21:39 +00:00
if ( eep . is_null ( ) ) {
continue ;
}
2024-05-16 20:16:30 +00:00
int platform_idx = - 1 ;
for ( int j = 0 ; j < EditorExport : : get_singleton ( ) - > get_export_platform_count ( ) ; j + + ) {
if ( eep - > get_name ( ) = = EditorExport : : get_singleton ( ) - > get_export_platform ( j ) - > get_name ( ) ) {
platform_idx = j ;
2024-07-16 07:25:16 +00:00
break ;
2024-05-16 20:16:30 +00:00
}
}
2022-12-29 09:21:39 +00:00
int dc = MIN ( eep - > get_options_count ( ) , 9000 ) ;
2024-05-16 20:16:30 +00:00
String error ;
2024-07-16 07:25:16 +00:00
if ( dc > 0 & & preset - > is_runnable ( ) ) {
2023-01-17 21:15:01 +00:00
popup - > add_icon_item ( eep - > get_run_icon ( ) , eep - > get_name ( ) , - 1 ) ;
popup - > set_item_disabled ( - 1 , true ) ;
2022-12-29 09:21:39 +00:00
for ( int j = 0 ; j < dc ; j + + ) {
2024-05-16 20:16:30 +00:00
popup - > add_icon_item ( eep - > get_option_icon ( j ) , eep - > get_option_label ( j ) , 10000 * platform_idx + j ) ;
2023-01-17 21:15:01 +00:00
popup - > set_item_tooltip ( - 1 , eep - > get_option_tooltip ( j ) ) ;
popup - > set_item_indent ( - 1 , 2 ) ;
2019-04-20 15:01:16 +00:00
}
2014-02-10 01:10:30 +00:00
}
}
2023-01-17 21:15:01 +00:00
if ( popup - > get_item_count ( ) = = 0 ) {
remote_debug - > set_disabled ( true ) ;
remote_debug - > set_tooltip_text ( TTR ( " No Remote Debug export presets configured. " ) ) ;
} else {
remote_debug - > set_disabled ( false ) ;
remote_debug - > set_tooltip_text ( TTR ( " Remote Debug " ) ) ;
}
2014-02-10 01:10:30 +00:00
2022-02-15 23:52:32 +00:00
first = false ;
}
} break ;
2014-02-10 01:10:30 +00:00
}
}
2024-02-20 23:01:33 +00:00
void EditorRunNative : : _confirm_run_native ( ) {
run_confirmed = true ;
resume_run_native ( ) ;
}
2023-04-12 19:02:28 +00:00
Error EditorRunNative : : start_run_native ( int p_id ) {
2022-12-29 09:21:39 +00:00
if ( p_id < 0 ) {
2021-07-20 11:24:56 +00:00
return OK ;
2019-03-22 01:08:28 +00:00
}
2022-12-29 09:21:39 +00:00
int platform = p_id / 10000 ;
int idx = p_id % 10000 ;
2024-02-20 23:01:33 +00:00
resume_id = p_id ;
2019-04-20 15:01:16 +00:00
2022-12-29 09:21:39 +00:00
if ( ! EditorNode : : get_singleton ( ) - > ensure_main_scene ( true ) ) {
return OK ;
2019-04-20 15:01:16 +00:00
}
2017-03-23 23:14:12 +00:00
2022-12-29 09:21:39 +00:00
Ref < EditorExportPlatform > eep = EditorExport : : get_singleton ( ) - > get_export_platform ( platform ) ;
ERR_FAIL_COND_V ( eep . is_null ( ) , ERR_UNAVAILABLE ) ;
2017-03-23 23:14:12 +00:00
Ref < EditorExportPreset > preset ;
for ( int i = 0 ; i < EditorExport : : get_singleton ( ) - > get_export_preset_count ( ) ; i + + ) {
Ref < EditorExportPreset > ep = EditorExport : : get_singleton ( ) - > get_export_preset ( i ) ;
if ( ep - > is_runnable ( ) & & ep - > get_platform ( ) = = eep ) {
preset = ep ;
break ;
}
}
if ( preset . is_null ( ) ) {
2020-08-03 12:14:59 +00:00
EditorNode : : get_singleton ( ) - > show_warning ( TTR ( " No runnable export preset found for this platform. \n Please add a runnable preset in the Export menu or define an existing preset as runnable. " ) ) ;
2021-07-20 11:24:56 +00:00
return ERR_UNAVAILABLE ;
2016-11-08 19:08:07 +00:00
}
2017-03-23 23:14:12 +00:00
2024-02-20 23:01:33 +00:00
String architecture = eep - > get_device_architecture ( idx ) ;
if ( ! run_confirmed & & ! architecture . is_empty ( ) ) {
String preset_arch = " architectures/ " + architecture ;
bool is_arch_enabled = preset - > get ( preset_arch ) ;
if ( ! is_arch_enabled ) {
String warning_message = vformat ( TTR ( " Warning: The CPU architecture '%s' is not active in your export preset. \n \n " ) , Variant ( architecture ) ) ;
warning_message + = TTR ( " Run 'Remote Debug' anyway? " ) ;
run_native_confirm - > set_text ( warning_message ) ;
run_native_confirm - > popup_centered ( ) ;
return OK ;
}
}
run_confirmed = false ;
2021-07-17 21:22:52 +00:00
emit_signal ( SNAME ( " native_run " ) , preset ) ;
2015-08-06 05:37:40 +00:00
2017-03-23 23:14:12 +00:00
int flags = 0 ;
2020-03-08 17:58:31 +00:00
bool deploy_debug_remote = is_deploy_debug_remote_enabled ( ) ;
bool deploy_dumb = EditorSettings : : get_singleton ( ) - > get_project_metadata ( " debug_options " , " run_file_server " , false ) ;
2022-09-29 21:56:26 +00:00
bool debug_collisions = EditorSettings : : get_singleton ( ) - > get_project_metadata ( " debug_options " , " run_debug_collisions " , false ) ;
2020-03-08 17:58:31 +00:00
bool debug_navigation = EditorSettings : : get_singleton ( ) - > get_project_metadata ( " debug_options " , " run_debug_navigation " , false ) ;
2020-05-14 14:41:43 +00:00
if ( deploy_debug_remote ) {
2017-03-23 23:14:12 +00:00
flags | = EditorExportPlatform : : DEBUG_FLAG_REMOTE_DEBUG ;
2020-05-14 14:41:43 +00:00
}
if ( deploy_dumb ) {
2017-03-23 23:14:12 +00:00
flags | = EditorExportPlatform : : DEBUG_FLAG_DUMB_CLIENT ;
2020-05-14 14:41:43 +00:00
}
if ( debug_collisions ) {
2022-09-29 21:56:26 +00:00
flags | = EditorExportPlatform : : DEBUG_FLAG_VIEW_COLLISIONS ;
2020-05-14 14:41:43 +00:00
}
if ( debug_navigation ) {
2017-03-23 23:14:12 +00:00
flags | = EditorExportPlatform : : DEBUG_FLAG_VIEW_NAVIGATION ;
2020-05-14 14:41:43 +00:00
}
2017-01-26 00:55:59 +00:00
2022-06-03 15:34:24 +00:00
eep - > clear_messages ( ) ;
2022-12-29 09:21:39 +00:00
Error err = eep - > run ( preset , idx , flags ) ;
2022-06-03 15:34:24 +00:00
result_dialog_log - > clear ( ) ;
if ( eep - > fill_log_messages ( result_dialog_log , err ) ) {
2022-05-08 07:46:53 +00:00
if ( eep - > get_worst_message_type ( ) > = EditorExportPlatform : : EXPORT_MESSAGE_ERROR ) {
result_dialog - > popup_centered_ratio ( 0.5 ) ;
}
2022-06-03 15:34:24 +00:00
}
return err ;
2014-02-10 01:10:30 +00:00
}
2019-03-22 01:08:28 +00:00
void EditorRunNative : : resume_run_native ( ) {
2023-04-12 19:02:28 +00:00
start_run_native ( resume_id ) ;
2019-03-22 01:08:28 +00:00
}
2014-02-10 01:10:30 +00:00
void EditorRunNative : : _bind_methods ( ) {
2020-03-16 08:37:43 +00:00
ADD_SIGNAL ( MethodInfo ( " native_run " , PropertyInfo ( Variant : : OBJECT , " preset " , PROPERTY_HINT_RESOURCE_TYPE , " EditorExportPreset " ) ) ) ;
2014-02-10 01:10:30 +00:00
}
2017-03-05 15:44:50 +00:00
bool EditorRunNative : : is_deploy_debug_remote_enabled ( ) const {
2020-03-08 17:58:31 +00:00
return EditorSettings : : get_singleton ( ) - > get_project_metadata ( " debug_options " , " run_deploy_remote_debug " , false ) ;
2015-09-20 16:03:46 +00:00
}
2014-05-29 13:56:39 +00:00
2017-03-05 15:44:50 +00:00
EditorRunNative : : EditorRunNative ( ) {
2022-12-29 09:21:39 +00:00
remote_debug = memnew ( MenuButton ) ;
2023-12-21 00:52:20 +00:00
remote_debug - > set_flat ( false ) ;
remote_debug - > set_theme_type_variation ( " RunBarButton " ) ;
2024-05-14 12:13:31 +00:00
remote_debug - > get_popup ( ) - > connect ( SceneStringName ( id_pressed ) , callable_mp ( this , & EditorRunNative : : start_run_native ) ) ;
2022-12-29 09:21:39 +00:00
remote_debug - > set_tooltip_text ( TTR ( " Remote Debug " ) ) ;
2023-01-17 21:15:01 +00:00
remote_debug - > set_disabled ( true ) ;
2022-12-29 09:21:39 +00:00
add_child ( remote_debug ) ;
2022-06-03 15:34:24 +00:00
result_dialog = memnew ( AcceptDialog ) ;
result_dialog - > set_title ( TTR ( " Project Run " ) ) ;
result_dialog_log = memnew ( RichTextLabel ) ;
result_dialog_log - > set_custom_minimum_size ( Size2 ( 300 , 80 ) * EDSCALE ) ;
result_dialog - > add_child ( result_dialog_log ) ;
add_child ( result_dialog ) ;
result_dialog - > hide ( ) ;
2024-02-20 23:01:33 +00:00
run_native_confirm = memnew ( ConfirmationDialog ) ;
add_child ( run_native_confirm ) ;
2024-05-14 12:28:18 +00:00
run_native_confirm - > connect ( SceneStringName ( confirmed ) , callable_mp ( this , & EditorRunNative : : _confirm_run_native ) ) ;
2024-02-20 23:01:33 +00:00
2014-02-10 01:10:30 +00:00
set_process ( true ) ;
}