2014-02-10 01:10:30 +00:00
/*************************************************************************/
/* editor_run_native.cpp */
/*************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
2017-08-27 12:16:55 +00:00
/* https://godotengine.org */
2014-02-10 01:10:30 +00:00
/*************************************************************************/
2022-01-13 08:45:09 +00:00
/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */
/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */
2014-02-10 01:10:30 +00:00
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
/* "Software"), to deal in the Software without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of the Software, and to */
/* permit persons to whom the Software is furnished to do so, subject to */
/* the following conditions: */
/* */
/* The above copyright notice and this permission notice shall be */
/* included in all copies or substantial portions of the Software. */
/* */
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
2018-01-04 23:50:27 +00:00
2014-02-10 01:10:30 +00:00
# include "editor_run_native.h"
2017-02-20 02:19:30 +00:00
# include "editor_export.h"
2017-03-23 23:14:12 +00:00
# include "editor_node.h"
2019-02-26 15:26:24 +00:00
# include "editor_scale.h"
2014-02-10 01:10:30 +00:00
void EditorRunNative : : _notification ( int p_what ) {
2017-03-23 23:14:12 +00:00
if ( p_what = = NOTIFICATION_ENTER_TREE ) {
for ( int i = 0 ; i < EditorExport : : get_singleton ( ) - > get_export_platform_count ( ) ; i + + ) {
Ref < EditorExportPlatform > eep = EditorExport : : get_singleton ( ) - > get_export_platform ( i ) ;
2021-05-05 10:44:11 +00:00
if ( eep . is_null ( ) ) {
2014-02-10 01:10:30 +00:00
continue ;
2021-05-05 10:44:11 +00:00
}
2017-05-25 18:57:13 +00:00
Ref < ImageTexture > icon = eep - > get_run_icon ( ) ;
2014-02-10 01:10:30 +00:00
if ( ! icon . is_null ( ) ) {
2017-05-17 10:36:47 +00:00
Ref < Image > im = icon - > get_data ( ) ;
im = im - > duplicate ( ) ;
im - > clear_mipmaps ( ) ;
if ( ! im - > empty ( ) ) {
2019-02-26 15:26:24 +00:00
im - > resize ( 16 * EDSCALE , 16 * EDSCALE ) ;
2017-03-23 23:14:12 +00:00
Ref < ImageTexture > small_icon ;
small_icon . instance ( ) ;
small_icon - > create_from_image ( im , 0 ) ;
MenuButton * mb = memnew ( MenuButton ) ;
mb - > get_popup ( ) - > connect ( " id_pressed " , this , " _run_native " , varray ( i ) ) ;
2019-04-20 15:01:16 +00:00
mb - > connect ( " pressed " , this , " _run_native " , varray ( - 1 , i ) ) ;
2014-02-10 01:10:30 +00:00
mb - > set_icon ( small_icon ) ;
add_child ( mb ) ;
2017-03-23 23:14:12 +00:00
menus [ i ] = mb ;
2014-02-10 01:10:30 +00:00
}
}
}
}
2017-03-23 23:14:12 +00:00
if ( p_what = = NOTIFICATION_PROCESS ) {
bool changed = EditorExport : : get_singleton ( ) - > poll_export_platforms ( ) | | first ;
2014-02-10 01:10:30 +00:00
if ( changed ) {
2017-03-23 23:14:12 +00:00
for ( Map < int , MenuButton * > : : Element * E = menus . front ( ) ; E ; E = E - > next ( ) ) {
Ref < EditorExportPlatform > eep = EditorExport : : get_singleton ( ) - > get_export_platform ( E - > key ( ) ) ;
2014-02-10 01:10:30 +00:00
MenuButton * mb = E - > get ( ) ;
2019-10-11 11:47:28 +00:00
int dc = eep - > get_options_count ( ) ;
2014-02-10 01:10:30 +00:00
2017-03-23 23:14:12 +00:00
if ( dc = = 0 ) {
2014-02-10 01:10:30 +00:00
mb - > hide ( ) ;
} else {
mb - > get_popup ( ) - > clear ( ) ;
mb - > show ( ) ;
2020-10-12 12:47:00 +00:00
if ( dc = = 1 ) {
mb - > set_tooltip ( eep - > get_option_tooltip ( 0 ) ) ;
} else {
mb - > set_tooltip ( eep - > get_options_tooltip ( ) ) ;
2019-04-20 15:01:16 +00:00
for ( int i = 0 ; i < dc ; i + + ) {
2019-10-11 11:47:28 +00:00
mb - > get_popup ( ) - > add_icon_item ( eep - > get_option_icon ( i ) , eep - > get_option_label ( i ) ) ;
mb - > get_popup ( ) - > set_item_tooltip ( mb - > get_popup ( ) - > get_item_count ( ) - 1 , eep - > get_option_tooltip ( i ) ) ;
2019-04-20 15:01:16 +00:00
}
2014-02-10 01:10:30 +00:00
}
}
}
2017-03-23 23:14:12 +00:00
first = false ;
2014-02-10 01:10:30 +00:00
}
}
}
2017-03-23 23:14:12 +00:00
void EditorRunNative : : _run_native ( int p_idx , int p_platform ) {
2019-03-22 01:08:28 +00:00
if ( ! EditorNode : : get_singleton ( ) - > ensure_main_scene ( true ) ) {
resume_idx = p_idx ;
resume_platform = p_platform ;
return ;
}
2017-03-23 23:14:12 +00:00
Ref < EditorExportPlatform > eep = EditorExport : : get_singleton ( ) - > get_export_platform ( p_platform ) ;
2014-02-10 01:10:30 +00:00
ERR_FAIL_COND ( eep . is_null ( ) ) ;
2019-04-20 15:01:16 +00:00
if ( p_idx = = - 1 ) {
2019-10-11 11:47:28 +00:00
if ( eep - > get_options_count ( ) = = 1 ) {
2016-11-08 19:08:07 +00:00
menus [ p_platform ] - > get_popup ( ) - > hide ( ) ;
p_idx = 0 ;
} else {
return ;
}
2019-04-20 15:01:16 +00:00
}
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. " ) ) ;
2017-03-23 23:14:12 +00:00
return ;
2016-11-08 19:08:07 +00:00
}
2017-03-23 23:14:12 +00:00
2016-06-24 12:20:43 +00:00
emit_signal ( " native_run " ) ;
2015-08-06 05:37:40 +00:00
2017-03-23 23:14:12 +00:00
int flags = 0 ;
2021-05-05 10:44:11 +00:00
if ( deploy_debug_remote ) {
2017-03-23 23:14:12 +00:00
flags | = EditorExportPlatform : : DEBUG_FLAG_REMOTE_DEBUG ;
2021-05-05 10:44:11 +00:00
}
if ( deploy_dumb ) {
2017-03-23 23:14:12 +00:00
flags | = EditorExportPlatform : : DEBUG_FLAG_DUMB_CLIENT ;
2021-05-05 10:44:11 +00:00
}
if ( debug_collisions ) {
2017-03-23 23:14:12 +00:00
flags | = EditorExportPlatform : : DEBUG_FLAG_VIEW_COLLISONS ;
2021-05-05 10:44:11 +00:00
}
if ( debug_navigation ) {
2017-03-23 23:14:12 +00:00
flags | = EditorExportPlatform : : DEBUG_FLAG_VIEW_NAVIGATION ;
2021-05-05 10:44:11 +00:00
}
2021-09-26 19:31:17 +00:00
if ( debug_shader_fallbacks ) {
flags | = EditorExportPlatform : : DEBUG_FLAG_SHADER_FALLBACKS ;
}
2017-01-26 00:55:59 +00:00
2022-06-02 08:12:50 +00:00
eep - > clear_messages ( ) ;
Error err = eep - > run ( preset , p_idx , flags ) ;
result_dialog_log - > clear ( ) ;
if ( eep - > fill_log_messages ( result_dialog_log , err ) ) {
result_dialog - > popup_centered_ratio ( 0.5 ) ;
}
2014-02-10 01:10:30 +00:00
}
2019-03-22 01:08:28 +00:00
void EditorRunNative : : resume_run_native ( ) {
_run_native ( resume_idx , resume_platform ) ;
}
2014-02-10 01:10:30 +00:00
void EditorRunNative : : _bind_methods ( ) {
2017-03-05 15:44:50 +00:00
ClassDB : : bind_method ( " _run_native " , & EditorRunNative : : _run_native ) ;
2015-08-06 05:37:40 +00:00
ADD_SIGNAL ( MethodInfo ( " native_run " ) ) ;
2014-02-10 01:10:30 +00:00
}
2014-05-29 13:56:39 +00:00
void EditorRunNative : : set_deploy_dumb ( bool p_enabled ) {
2017-03-05 15:44:50 +00:00
deploy_dumb = p_enabled ;
2014-05-29 13:56:39 +00:00
}
2017-03-05 15:44:50 +00:00
bool EditorRunNative : : is_deploy_dumb_enabled ( ) const {
2014-05-29 13:56:39 +00:00
return deploy_dumb ;
}
2015-08-06 05:37:40 +00:00
void EditorRunNative : : set_deploy_debug_remote ( bool p_enabled ) {
2017-03-05 15:44:50 +00:00
deploy_debug_remote = p_enabled ;
2015-08-06 05:37:40 +00:00
}
2017-03-05 15:44:50 +00:00
bool EditorRunNative : : is_deploy_debug_remote_enabled ( ) const {
2015-08-06 05:37:40 +00:00
return deploy_debug_remote ;
}
2015-09-20 16:03:46 +00:00
void EditorRunNative : : set_debug_collisions ( bool p_debug ) {
2017-03-05 15:44:50 +00:00
debug_collisions = p_debug ;
2015-09-20 16:03:46 +00:00
}
2017-03-05 15:44:50 +00:00
bool EditorRunNative : : get_debug_collisions ( ) const {
2015-09-20 16:03:46 +00:00
return debug_collisions ;
}
void EditorRunNative : : set_debug_navigation ( bool p_debug ) {
2017-03-05 15:44:50 +00:00
debug_navigation = p_debug ;
2015-09-20 16:03:46 +00:00
}
2017-03-05 15:44:50 +00:00
bool EditorRunNative : : get_debug_navigation ( ) const {
2015-09-20 16:03:46 +00:00
return debug_navigation ;
}
2014-05-29 13:56:39 +00:00
2021-09-26 19:31:17 +00:00
void EditorRunNative : : set_debug_shader_fallbacks ( bool p_debug ) {
debug_shader_fallbacks = p_debug ;
}
bool EditorRunNative : : get_debug_shader_fallbacks ( ) const {
return debug_shader_fallbacks ;
}
2017-03-05 15:44:50 +00:00
EditorRunNative : : EditorRunNative ( ) {
2022-06-02 08:12:50 +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 ( ) ;
2014-02-10 01:10:30 +00:00
set_process ( true ) ;
2017-03-05 15:44:50 +00:00
first = true ;
deploy_dumb = false ;
deploy_debug_remote = false ;
debug_collisions = false ;
debug_navigation = false ;
2021-09-26 19:31:17 +00:00
debug_shader_fallbacks = false ;
2019-03-22 01:08:28 +00:00
resume_idx = 0 ;
resume_platform = 0 ;
2014-02-10 01:10:30 +00:00
}