ExportDialog: Validate path before allowing export

Otherwise one could quite easily end up with the exported game
being hidden files named ".x86_64" and ".pck" for example.

Also improved the default filename logic a bit to also include
extension, and never fallback to an empty string.

Also fixed being able to click "Export project" without selecting
a preset.
This commit is contained in:
Rémi Verschelde 2018-08-31 10:48:40 +02:00
parent fc01c79356
commit 51dfdf549e
2 changed files with 42 additions and 6 deletions

View file

@ -723,6 +723,25 @@ void ProjectExportDialog::_open_export_template_manager() {
hide();
}
void ProjectExportDialog::_validate_export_path(const String &p_path) {
// Disable export via OK button or Enter key if LineEdit has an empty filename
bool invalid_path = (p_path.get_file().get_basename() == "");
// Check if state change before needlessly messing with signals
if (invalid_path && export_project->get_ok()->is_disabled())
return;
if (!invalid_path && !export_project->get_ok()->is_disabled())
return;
if (invalid_path) {
export_project->get_ok()->set_disabled(true);
export_project->get_line_edit()->disconnect("text_entered", export_project, "_file_entered");
} else {
export_project->get_ok()->set_disabled(false);
export_project->get_line_edit()->connect("text_entered", export_project, "_file_entered");
}
}
void ProjectExportDialog::_export_project() {
Ref<EditorExportPreset> current = EditorExport::get_singleton()->get_export_preset(presets->get_current());
@ -732,12 +751,19 @@ void ProjectExportDialog::_export_project() {
export_project->set_access(FileDialog::ACCESS_FILESYSTEM);
export_project->clear_filters();
export_project->set_current_file(default_filename);
String extension = platform->get_binary_extension(current);
if (extension != String()) {
export_project->add_filter("*." + extension + " ; " + platform->get_name() + " Export");
export_project->set_current_file(default_filename + "." + extension);
} else {
export_project->set_current_file(default_filename);
}
// Ensure that signal is connected if previous attempt left it disconnected with _validate_export_path
if (!export_project->get_line_edit()->is_connected("text_entered", export_project, "_file_entered")) {
export_project->get_ok()->set_disabled(false);
export_project->get_line_edit()->connect("text_entered", export_project, "_file_entered");
}
export_project->set_mode(FileDialog::MODE_SAVE_FILE);
@ -746,7 +772,7 @@ void ProjectExportDialog::_export_project() {
void ProjectExportDialog::_export_project_to_path(const String &p_path) {
// Save this name for use in future exports (but drop the file extension)
default_filename = p_path.get_basename().get_file();
default_filename = p_path.get_file().get_basename();
EditorSettings::get_singleton()->set_project_metadata("export_options", "default_filename", default_filename);
Ref<EditorExportPreset> current = EditorExport::get_singleton()->get_export_preset(presets->get_current());
@ -785,11 +811,13 @@ void ProjectExportDialog::_bind_methods() {
ClassDB::bind_method("_export_pck_zip", &ProjectExportDialog::_export_pck_zip);
ClassDB::bind_method("_export_pck_zip_selected", &ProjectExportDialog::_export_pck_zip_selected);
ClassDB::bind_method("_open_export_template_manager", &ProjectExportDialog::_open_export_template_manager);
ClassDB::bind_method("_validate_export_path", &ProjectExportDialog::_validate_export_path);
ClassDB::bind_method("_export_project", &ProjectExportDialog::_export_project);
ClassDB::bind_method("_export_project_to_path", &ProjectExportDialog::_export_project_to_path);
ClassDB::bind_method("_custom_features_changed", &ProjectExportDialog::_custom_features_changed);
ClassDB::bind_method("_tab_changed", &ProjectExportDialog::_tab_changed);
}
ProjectExportDialog::ProjectExportDialog() {
set_title(TTR("Export"));
@ -942,6 +970,9 @@ ProjectExportDialog::ProjectExportDialog() {
get_cancel()->set_text(TTR("Close"));
get_ok()->set_text(TTR("Export PCK/Zip"));
export_button = add_button(TTR("Export Project"), !OS::get_singleton()->get_swap_ok_cancel(), "export");
export_button->connect("pressed", this, "_export_project");
// Disable initially before we select a valid preset
export_button->set_disabled(true);
export_pck_zip = memnew(FileDialog);
export_pck_zip->add_filter("*.zip ; ZIP File");
@ -981,7 +1012,7 @@ ProjectExportDialog::ProjectExportDialog() {
export_project->set_access(FileDialog::ACCESS_FILESYSTEM);
add_child(export_project);
export_project->connect("file_selected", this, "_export_project_to_path");
export_button->connect("pressed", this, "_export_project");
export_project->get_line_edit()->connect("text_changed", this, "_validate_export_path");
export_debug = memnew(CheckButton);
export_debug->set_text(TTR("Export With Debug"));
@ -997,10 +1028,14 @@ ProjectExportDialog::ProjectExportDialog() {
editor_icons = "EditorIcons";
default_filename = EditorSettings::get_singleton()->get_project_metadata("export_options", "default_filename", String());
default_filename = EditorSettings::get_singleton()->get_project_metadata("export_options", "default_filename", "");
// If no default set, use project name
if (default_filename == "") {
// If no project name defined, use a sane default
default_filename = ProjectSettings::get_singleton()->get("application/config/name");
if (default_filename == "") {
default_filename = "UnnamedProject";
}
}
}

View file

@ -136,6 +136,7 @@ private:
void _export_pck_zip();
void _export_pck_zip_selected(const String &p_path);
void _validate_export_path(const String &p_path);
void _export_project();
void _export_project_to_path(const String &p_path);