Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
godotengine
GitHub Repository: godotengine/godot
Path: blob/master/editor/run/editor_run_native.cpp
20843 views
1
/**************************************************************************/
2
/* editor_run_native.cpp */
3
/**************************************************************************/
4
/* This file is part of: */
5
/* GODOT ENGINE */
6
/* https://godotengine.org */
7
/**************************************************************************/
8
/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */
9
/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */
10
/* */
11
/* Permission is hereby granted, free of charge, to any person obtaining */
12
/* a copy of this software and associated documentation files (the */
13
/* "Software"), to deal in the Software without restriction, including */
14
/* without limitation the rights to use, copy, modify, merge, publish, */
15
/* distribute, sublicense, and/or sell copies of the Software, and to */
16
/* permit persons to whom the Software is furnished to do so, subject to */
17
/* the following conditions: */
18
/* */
19
/* The above copyright notice and this permission notice shall be */
20
/* included in all copies or substantial portions of the Software. */
21
/* */
22
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
23
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
24
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */
25
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
26
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
27
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
28
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
29
/**************************************************************************/
30
31
#include "editor_run_native.h"
32
33
#include "editor/editor_node.h"
34
#include "editor/export/editor_export.h"
35
#include "editor/export/editor_export_platform.h"
36
#include "editor/settings/editor_settings.h"
37
#include "editor/themes/editor_scale.h"
38
39
void EditorRunNative::_notification(int p_what) {
40
switch (p_what) {
41
case NOTIFICATION_THEME_CHANGED: {
42
remote_debug->set_button_icon(get_editor_theme_icon(SNAME("PlayRemote")));
43
} break;
44
45
case NOTIFICATION_PROCESS: {
46
bool changed = EditorExport::get_singleton()->poll_export_platforms() || first;
47
48
if (changed) {
49
PopupMenu *popup = remote_debug->get_popup();
50
popup->clear();
51
int device_shortcut_id = 1;
52
for (int i = 0; i < EditorExport::get_singleton()->get_export_platform_count(); i++) {
53
Ref<EditorExportPlatform> eep = EditorExport::get_singleton()->get_export_platform(i);
54
Ref<EditorExportPreset> preset = EditorExport::get_singleton()->get_runnable_preset_for_platform(eep);
55
if (preset.is_null()) {
56
continue;
57
}
58
const int device_count = MIN(eep->get_options_count(), 9000);
59
String error;
60
if (device_count > 0) {
61
popup->add_icon_item(eep->get_run_icon(), eep->get_name(), -1);
62
popup->set_item_disabled(-1, true);
63
for (int j = 0; j < device_count; j++) {
64
popup->add_icon_item(eep->get_option_icon(j), eep->get_option_label(j), EditorExport::encode_platform_device_id(i, j));
65
popup->set_item_tooltip(-1, eep->get_option_tooltip(j));
66
popup->set_item_indent(-1, 2);
67
if (device_shortcut_id <= 4 && eep->is_option_runnable(j)) {
68
// Assign shortcuts for the first 4 devices added in the list.
69
popup->set_item_shortcut(-1, ED_GET_SHORTCUT(vformat("remote_deploy/deploy_to_device_%d", device_shortcut_id)), true);
70
device_shortcut_id += 1;
71
}
72
}
73
}
74
}
75
if (popup->get_item_count() == 0) {
76
remote_debug->set_disabled(true);
77
remote_debug->set_tooltip_text(TTRC("No Remote Deploy export presets configured."));
78
} else {
79
remote_debug->set_disabled(false);
80
remote_debug->set_tooltip_text(TTRC("Remote Deploy"));
81
}
82
83
first = false;
84
}
85
} break;
86
}
87
}
88
89
void EditorRunNative::_confirm_run_native() {
90
run_confirmed = true;
91
resume_run_native();
92
}
93
94
Error EditorRunNative::start_run_native(int p_id) {
95
ERR_FAIL_COND_V(p_id < 0, FAILED);
96
97
const int platform = EditorExport::decode_platform_from_id(p_id);
98
const int idx = EditorExport::decode_device_from_id(p_id);
99
resume_id = p_id;
100
101
if (!EditorNode::get_singleton()->ensure_main_scene(true)) {
102
return OK;
103
}
104
105
Ref<EditorExportPlatform> eep = EditorExport::get_singleton()->get_export_platform(platform);
106
ERR_FAIL_COND_V(eep.is_null(), ERR_UNAVAILABLE);
107
108
Ref<EditorExportPreset> preset = EditorExport::get_singleton()->get_runnable_preset_for_platform(eep);
109
if (preset.is_null()) {
110
EditorNode::get_singleton()->show_warning(TTR("No runnable export preset found for this platform.\nPlease add a runnable preset in the Export menu or define an existing preset as runnable."));
111
return ERR_UNAVAILABLE;
112
}
113
114
String architecture = eep->get_device_architecture(idx);
115
if (!run_confirmed && !architecture.is_empty()) {
116
String preset_arch = "architectures/" + architecture;
117
bool is_arch_enabled = preset->get(preset_arch);
118
119
if (!is_arch_enabled) {
120
run_native_confirm->set_text(vformat(TTR("Warning: The CPU architecture \"%s\" is not active in your export preset.\n\nRun \"Remote Deploy\" anyway?"), architecture));
121
run_native_confirm->popup_centered();
122
return OK;
123
}
124
}
125
run_confirmed = false;
126
127
preset->update_value_overrides();
128
129
if (eep->is_option_runnable(idx)) {
130
emit_signal(SNAME("native_run"), preset);
131
}
132
133
BitField<EditorExportPlatform::DebugFlags> flags = 0;
134
135
bool deploy_debug_remote = is_deploy_debug_remote_enabled();
136
bool deploy_dumb = EditorSettings::get_singleton()->get_project_metadata("debug_options", "run_file_server", false);
137
bool debug_collisions = EditorSettings::get_singleton()->get_project_metadata("debug_options", "run_debug_collisions", false);
138
bool debug_navigation = EditorSettings::get_singleton()->get_project_metadata("debug_options", "run_debug_navigation", false);
139
140
if (deploy_debug_remote) {
141
flags.set_flag(EditorExportPlatform::DEBUG_FLAG_REMOTE_DEBUG);
142
}
143
if (deploy_dumb) {
144
flags.set_flag(EditorExportPlatform::DEBUG_FLAG_DUMB_CLIENT);
145
}
146
if (debug_collisions) {
147
flags.set_flag(EditorExportPlatform::DEBUG_FLAG_VIEW_COLLISIONS);
148
}
149
if (debug_navigation) {
150
flags.set_flag(EditorExportPlatform::DEBUG_FLAG_VIEW_NAVIGATION);
151
}
152
153
eep->clear_messages();
154
Error err = eep->run(preset, idx, flags);
155
result_dialog_log->clear();
156
if (eep->fill_log_messages(result_dialog_log, err)) {
157
if (eep->get_worst_message_type() >= EditorExportPlatform::EXPORT_MESSAGE_ERROR) {
158
result_dialog->popup_centered_ratio(0.5);
159
}
160
}
161
return err;
162
}
163
164
void EditorRunNative::resume_run_native() {
165
start_run_native(resume_id);
166
}
167
168
void EditorRunNative::_bind_methods() {
169
ADD_SIGNAL(MethodInfo("native_run", PropertyInfo(Variant::OBJECT, "preset", PROPERTY_HINT_RESOURCE_TYPE, EditorExportPreset::get_class_static())));
170
}
171
172
bool EditorRunNative::is_deploy_debug_remote_enabled() const {
173
return EditorSettings::get_singleton()->get_project_metadata("debug_options", "run_deploy_remote_debug", true);
174
}
175
176
EditorRunNative::EditorRunNative() {
177
ED_SHORTCUT("remote_deploy/deploy_to_device_1", TTRC("Deploy to First Device in List"), KeyModifierMask::SHIFT | Key::F5);
178
ED_SHORTCUT_OVERRIDE("remote_deploy/deploy_to_device_1", "macos", KeyModifierMask::META | KeyModifierMask::SHIFT | Key::B);
179
ED_SHORTCUT("remote_deploy/deploy_to_device_2", TTRC("Deploy to Second Device in List"));
180
ED_SHORTCUT("remote_deploy/deploy_to_device_3", TTRC("Deploy to Third Device in List"));
181
ED_SHORTCUT("remote_deploy/deploy_to_device_4", TTRC("Deploy to Fourth Device in List"));
182
183
remote_debug = memnew(MenuButton);
184
remote_debug->set_flat(false);
185
remote_debug->set_theme_type_variation("RunBarButton");
186
remote_debug->get_popup()->set_auto_translate_mode(AUTO_TRANSLATE_MODE_DISABLED);
187
remote_debug->get_popup()->connect(SceneStringName(id_pressed), callable_mp(this, &EditorRunNative::start_run_native));
188
remote_debug->set_tooltip_text(TTRC("Remote Deploy"));
189
remote_debug->set_disabled(true);
190
191
add_child(remote_debug);
192
193
result_dialog = memnew(AcceptDialog);
194
result_dialog->set_title(TTR("Project Run"));
195
result_dialog_log = memnew(RichTextLabel);
196
result_dialog_log->set_custom_minimum_size(Size2(300, 80) * EDSCALE);
197
result_dialog->add_child(result_dialog_log);
198
199
add_child(result_dialog);
200
result_dialog->hide();
201
202
run_native_confirm = memnew(ConfirmationDialog);
203
add_child(run_native_confirm);
204
run_native_confirm->connect(SceneStringName(confirmed), callable_mp(this, &EditorRunNative::_confirm_run_native));
205
206
set_process(true);
207
}
208
209