2017-03-05 15:47:28 +01:00
/*************************************************************************/
/* import_dock.cpp */
/*************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
2017-08-27 14:16:55 +02:00
/* https://godotengine.org */
2017-03-05 15:47:28 +01:00
/*************************************************************************/
2022-01-03 21:27:34 +01:00
/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */
/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */
2017-03-05 15:47:28 +01: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-05 00:50:27 +01:00
2017-02-01 13:45:45 +01:00
# include "import_dock.h"
2022-02-12 02:46:22 +01:00
# include "core/config/project_settings.h"
# include "editor/editor_node.h"
# include "editor/editor_resource_preview.h"
# include "editor/editor_scale.h"
2022-07-31 20:14:15 +02:00
# include "editor/editor_settings.h"
2017-02-01 13:45:45 +01:00
class ImportDockParameters : public Object {
2019-03-19 19:35:57 +01:00
GDCLASS ( ImportDockParameters , Object ) ;
2017-02-01 13:45:45 +01:00
public :
2022-05-13 15:04:37 +02:00
HashMap < StringName , Variant > values ;
2017-02-01 13:45:45 +01:00
List < PropertyInfo > properties ;
Ref < ResourceImporter > importer ;
Vector < String > paths ;
2022-05-19 17:00:06 +02:00
HashSet < StringName > checked ;
2018-10-30 17:11:54 +01:00
bool checking ;
2021-11-14 18:02:38 +01:00
String base_options_path ;
2017-02-01 13:45:45 +01:00
2017-03-05 16:44:50 +01:00
bool _set ( const StringName & p_name , const Variant & p_value ) {
2017-02-01 13:45:45 +01:00
if ( values . has ( p_name ) ) {
2017-03-05 16:44:50 +01:00
values [ p_name ] = p_value ;
2018-10-30 17:11:54 +01:00
if ( checking ) {
checked . insert ( p_name ) ;
2021-02-10 21:18:45 +01:00
notify_property_list_changed ( ) ;
2018-10-30 17:11:54 +01:00
}
2017-02-01 13:45:45 +01:00
return true ;
}
return false ;
}
2017-03-05 16:44:50 +01:00
bool _get ( const StringName & p_name , Variant & r_ret ) const {
2017-02-01 13:45:45 +01:00
if ( values . has ( p_name ) ) {
2017-03-05 16:44:50 +01:00
r_ret = values [ p_name ] ;
2017-02-01 13:45:45 +01:00
return true ;
}
return false ;
}
2017-03-05 16:44:50 +01:00
void _get_property_list ( List < PropertyInfo > * p_list ) const {
2021-07-16 05:45:57 +02:00
for ( const PropertyInfo & E : properties ) {
2021-11-14 18:02:38 +01:00
if ( ! importer - > get_option_visibility ( base_options_path , E . name , values ) ) {
2017-02-01 13:45:45 +01:00
continue ;
2020-05-14 16:41:43 +02:00
}
2021-07-16 05:45:57 +02:00
PropertyInfo pi = E ;
2018-10-30 17:11:54 +01:00
if ( checking ) {
pi . usage | = PROPERTY_USAGE_CHECKABLE ;
2021-07-16 05:45:57 +02:00
if ( checked . has ( E . name ) ) {
2018-10-30 17:11:54 +01:00
pi . usage | = PROPERTY_USAGE_CHECKED ;
}
}
p_list - > push_back ( pi ) ;
2017-02-01 13:45:45 +01:00
}
}
void update ( ) {
2021-02-10 21:18:45 +01:00
notify_property_list_changed ( ) ;
2017-02-01 13:45:45 +01:00
}
2018-10-30 17:11:54 +01:00
ImportDockParameters ( ) {
checking = false ;
}
2017-02-01 13:45:45 +01:00
} ;
2021-11-17 21:08:55 +01:00
ImportDock * ImportDock : : singleton = nullptr ;
2017-03-05 16:44:50 +01:00
void ImportDock : : set_edit_path ( const String & p_path ) {
2017-02-01 13:45:45 +01:00
Ref < ConfigFile > config ;
2021-06-18 00:03:09 +02:00
config . instantiate ( ) ;
2017-03-05 16:44:50 +01:00
Error err = config - > load ( p_path + " .import " ) ;
if ( err ! = OK ) {
2017-02-01 13:45:45 +01:00
clear ( ) ;
return ;
}
2021-03-22 20:41:47 +01:00
String importer_name = config - > get_value ( " remap " , " importer " ) ;
params - > importer = ResourceFormatImporter : : get_singleton ( ) - > get_importer_by_name ( importer_name ) ;
2017-02-01 13:45:45 +01:00
2020-02-28 04:03:55 +01:00
params - > paths . clear ( ) ;
params - > paths . push_back ( p_path ) ;
2021-11-14 18:02:38 +01:00
params - > base_options_path = p_path ;
2020-02-28 04:03:55 +01:00
2021-11-14 18:02:38 +01:00
_update_options ( p_path , config ) ;
2017-02-01 13:45:45 +01:00
2020-03-17 07:33:00 +01:00
List < Ref < ResourceImporter > > importers ;
2017-03-05 16:44:50 +01:00
ResourceFormatImporter : : get_singleton ( ) - > get_importers_for_extension ( p_path . get_extension ( ) , & importers ) ;
2020-03-17 07:33:00 +01:00
List < Pair < String , String > > importer_names ;
2017-02-01 13:45:45 +01:00
2021-07-26 17:50:35 +02:00
for ( const Ref < ResourceImporter > & E : importers ) {
2021-07-16 05:45:57 +02:00
importer_names . push_back ( Pair < String , String > ( E - > get_visible_name ( ) , E - > get_importer_name ( ) ) ) ;
2017-02-01 13:45:45 +01:00
}
2020-03-17 07:33:00 +01:00
importer_names . sort_custom < PairSort < String , String > > ( ) ;
2017-02-01 13:45:45 +01:00
import_as - > clear ( ) ;
2021-07-24 15:46:25 +02:00
for ( const Pair < String , String > & E : importer_names ) {
2021-07-16 05:45:57 +02:00
import_as - > add_item ( E . first ) ;
2022-03-12 01:06:45 +01:00
import_as - > set_item_metadata ( - 1 , E . second ) ;
2021-07-16 05:45:57 +02:00
if ( E . second = = importer_name ) {
2017-03-05 16:44:50 +01:00
import_as - > select ( import_as - > get_item_count ( ) - 1 ) ;
2017-02-01 13:45:45 +01:00
}
}
2021-09-22 07:10:09 +02:00
_add_keep_import_option ( importer_name ) ;
2021-03-22 20:41:47 +01:00
2017-11-13 20:31:00 +01:00
import - > set_disabled ( false ) ;
2021-10-09 12:29:53 +02:00
_set_dirty ( false ) ;
2017-11-13 20:31:00 +01:00
import_as - > set_disabled ( false ) ;
2019-09-04 07:20:57 +02:00
preset - > set_disabled ( false ) ;
2021-12-25 16:31:36 +01:00
content - > show ( ) ;
select_a_resource - > hide ( ) ;
2017-11-13 20:31:00 +01:00
imported - > set_text ( p_path . get_file ( ) ) ;
}
2021-09-22 07:10:09 +02:00
void ImportDock : : _add_keep_import_option ( const String & p_importer_name ) {
import_as - > add_separator ( ) ;
import_as - > add_item ( TTR ( " Keep File (No Import) " ) ) ;
2022-03-12 01:06:45 +01:00
import_as - > set_item_metadata ( - 1 , " keep " ) ;
2021-09-22 07:10:09 +02:00
if ( p_importer_name = = " keep " ) {
import_as - > select ( import_as - > get_item_count ( ) - 1 ) ;
}
}
2021-11-14 18:02:38 +01:00
void ImportDock : : _update_options ( const String & p_path , const Ref < ConfigFile > & p_config ) {
2017-11-13 20:31:00 +01:00
List < ResourceImporter : : ImportOption > options ;
2021-03-22 20:41:47 +01:00
if ( params - > importer . is_valid ( ) ) {
2021-11-14 18:02:38 +01:00
params - > importer - > get_import_options ( p_path , & options ) ;
2021-03-22 20:41:47 +01:00
}
2017-11-13 20:31:00 +01:00
params - > properties . clear ( ) ;
params - > values . clear ( ) ;
2020-02-28 04:03:55 +01:00
params - > checking = params - > paths . size ( ) > 1 ;
2018-10-30 17:11:54 +01:00
params - > checked . clear ( ) ;
2021-11-14 18:02:38 +01:00
params - > base_options_path = p_path ;
2017-11-13 20:31:00 +01:00
2021-07-24 15:46:25 +02:00
for ( const ResourceImporter : : ImportOption & E : options ) {
2021-07-16 05:45:57 +02:00
params - > properties . push_back ( E . option ) ;
if ( p_config . is_valid ( ) & & p_config - > has_section_key ( " params " , E . option . name ) ) {
params - > values [ E . option . name ] = p_config - > get_value ( " params " , E . option . name ) ;
2017-11-13 20:31:00 +01:00
} else {
2021-07-16 05:45:57 +02:00
params - > values [ E . option . name ] = E . default_value ;
2017-11-13 20:31:00 +01:00
}
}
params - > update ( ) ;
2020-02-14 02:58:19 +01:00
_update_preset_menu ( ) ;
2021-03-19 13:57:52 +01:00
2021-03-22 20:41:47 +01:00
if ( params - > importer . is_valid ( ) & & params - > paths . size ( ) = = 1 & & params - > importer - > has_advanced_options ( ) ) {
2021-03-19 13:57:52 +01:00
advanced - > show ( ) ;
advanced_spacer - > show ( ) ;
} else {
advanced - > hide ( ) ;
advanced_spacer - > hide ( ) ;
}
2017-02-01 13:45:45 +01:00
}
2017-03-05 16:44:50 +01:00
void ImportDock : : set_edit_multiple_paths ( const Vector < String > & p_paths ) {
2017-02-01 13:45:45 +01:00
clear ( ) ;
2019-11-22 08:35:03 +01:00
// Use the value that is repeated the most.
2022-05-13 15:04:37 +02:00
HashMap < String , Dictionary > value_frequency ;
2022-05-19 17:00:06 +02:00
HashSet < String > extensions ;
2017-02-01 13:45:45 +01:00
2017-03-05 16:44:50 +01:00
for ( int i = 0 ; i < p_paths . size ( ) ; i + + ) {
2017-02-01 13:45:45 +01:00
Ref < ConfigFile > config ;
2021-06-18 00:03:09 +02:00
config . instantiate ( ) ;
2021-11-14 18:02:38 +01:00
extensions . insert ( p_paths [ i ] . get_extension ( ) ) ;
2017-03-05 16:44:50 +01:00
Error err = config - > load ( p_paths [ i ] + " .import " ) ;
ERR_CONTINUE ( err ! = OK ) ;
2017-02-01 13:45:45 +01:00
2017-03-05 16:44:50 +01:00
if ( i = = 0 ) {
params - > importer = ResourceFormatImporter : : get_singleton ( ) - > get_importer_by_name ( config - > get_value ( " remap " , " importer " ) ) ;
2017-02-01 13:45:45 +01:00
if ( params - > importer . is_null ( ) ) {
clear ( ) ;
return ;
}
}
2021-03-26 03:05:25 +01:00
if ( ! config - > has_section ( " params " ) ) {
continue ;
}
2017-02-01 13:45:45 +01:00
List < String > keys ;
2017-03-05 16:44:50 +01:00
config - > get_section_keys ( " params " , & keys ) ;
2017-02-01 13:45:45 +01:00
2021-07-24 15:46:25 +02:00
for ( const String & E : keys ) {
2021-07-16 05:45:57 +02:00
if ( ! value_frequency . has ( E ) ) {
value_frequency [ E ] = Dictionary ( ) ;
2017-02-01 13:45:45 +01:00
}
2021-07-16 05:45:57 +02:00
Variant value = config - > get_value ( " params " , E ) ;
2017-02-01 13:45:45 +01:00
2021-07-16 05:45:57 +02:00
if ( value_frequency [ E ] . has ( value ) ) {
value_frequency [ E ] [ value ] = int ( value_frequency [ E ] [ value ] ) + 1 ;
2017-02-01 13:45:45 +01:00
} else {
2021-07-16 05:45:57 +02:00
value_frequency [ E ] [ value ] = 1 ;
2017-02-01 13:45:45 +01:00
}
}
}
ERR_FAIL_COND ( params - > importer . is_null ( ) ) ;
2021-11-14 18:02:38 +01:00
String base_path ;
if ( extensions . size ( ) = = 1 & & p_paths . size ( ) > 0 ) {
base_path = p_paths [ 0 ] ;
}
2017-02-01 13:45:45 +01:00
List < ResourceImporter : : ImportOption > options ;
2021-11-14 18:02:38 +01:00
params - > importer - > get_import_options ( base_path , & options ) ;
2017-02-01 13:45:45 +01:00
params - > properties . clear ( ) ;
params - > values . clear ( ) ;
2018-10-30 17:11:54 +01:00
params - > checking = true ;
params - > checked . clear ( ) ;
2021-11-14 18:02:38 +01:00
params - > base_options_path = base_path ;
2017-02-01 13:45:45 +01:00
2021-07-24 15:46:25 +02:00
for ( const ResourceImporter : : ImportOption & E : options ) {
2021-07-16 05:45:57 +02:00
params - > properties . push_back ( E . option ) ;
2017-02-01 13:45:45 +01:00
2021-07-16 05:45:57 +02:00
if ( value_frequency . has ( E . option . name ) ) {
Dictionary d = value_frequency [ E . option . name ] ;
2017-03-05 16:44:50 +01:00
int freq = 0 ;
2017-02-01 13:45:45 +01:00
List < Variant > v ;
d . get_key_list ( & v ) ;
Variant value ;
2021-07-24 15:46:25 +02:00
for ( const Variant & F : v ) {
2021-07-16 05:45:57 +02:00
int f = d [ F ] ;
2017-03-05 16:44:50 +01:00
if ( f > freq ) {
2021-07-16 05:45:57 +02:00
value = F ;
2017-02-01 13:45:45 +01:00
}
}
2021-07-16 05:45:57 +02:00
params - > values [ E . option . name ] = value ;
2017-02-01 13:45:45 +01:00
} else {
2021-07-16 05:45:57 +02:00
params - > values [ E . option . name ] = E . default_value ;
2017-02-01 13:45:45 +01:00
}
}
params - > update ( ) ;
2020-03-17 07:33:00 +01:00
List < Ref < ResourceImporter > > importers ;
2017-03-05 16:44:50 +01:00
ResourceFormatImporter : : get_singleton ( ) - > get_importers_for_extension ( p_paths [ 0 ] . get_extension ( ) , & importers ) ;
2020-03-17 07:33:00 +01:00
List < Pair < String , String > > importer_names ;
2017-02-01 13:45:45 +01:00
2021-07-26 17:50:35 +02:00
for ( const Ref < ResourceImporter > & E : importers ) {
2021-07-16 05:45:57 +02:00
importer_names . push_back ( Pair < String , String > ( E - > get_visible_name ( ) , E - > get_importer_name ( ) ) ) ;
2017-02-01 13:45:45 +01:00
}
2020-03-17 07:33:00 +01:00
importer_names . sort_custom < PairSort < String , String > > ( ) ;
2017-02-01 13:45:45 +01:00
import_as - > clear ( ) ;
2021-07-24 15:46:25 +02:00
for ( const Pair < String , String > & E : importer_names ) {
2021-07-16 05:45:57 +02:00
import_as - > add_item ( E . first ) ;
2022-03-12 01:06:45 +01:00
import_as - > set_item_metadata ( - 1 , E . second ) ;
2021-07-16 05:45:57 +02:00
if ( E . second = = params - > importer - > get_importer_name ( ) ) {
2017-03-05 16:44:50 +01:00
import_as - > select ( import_as - > get_item_count ( ) - 1 ) ;
2017-02-01 13:45:45 +01:00
}
}
2021-09-22 07:10:09 +02:00
_add_keep_import_option ( params - > importer - > get_importer_name ( ) ) ;
2020-02-14 02:58:19 +01:00
_update_preset_menu ( ) ;
params - > paths = p_paths ;
import - > set_disabled ( false ) ;
2021-10-09 12:29:53 +02:00
_set_dirty ( false ) ;
2020-02-14 02:58:19 +01:00
import_as - > set_disabled ( false ) ;
preset - > set_disabled ( false ) ;
2022-01-06 18:32:24 +01:00
content - > show ( ) ;
select_a_resource - > hide ( ) ;
2020-02-14 02:58:19 +01:00
2020-02-19 09:58:34 +01:00
imported - > set_text ( vformat ( TTR ( " %d Files " ) , p_paths . size ( ) ) ) ;
2021-03-19 13:57:52 +01:00
if ( params - > paths . size ( ) = = 1 & & params - > importer - > has_advanced_options ( ) ) {
advanced - > show ( ) ;
advanced_spacer - > show ( ) ;
} else {
advanced - > hide ( ) ;
advanced_spacer - > hide ( ) ;
}
2020-02-14 02:58:19 +01:00
}
void ImportDock : : _update_preset_menu ( ) {
2017-02-01 13:45:45 +01:00
preset - > get_popup ( ) - > clear ( ) ;
2021-03-22 20:41:47 +01:00
if ( params - > importer . is_null ( ) ) {
preset - > get_popup ( ) - > add_item ( TTR ( " Default " ) ) ;
preset - > hide ( ) ;
return ;
}
preset - > show ( ) ;
2017-03-05 16:44:50 +01:00
if ( params - > importer - > get_preset_count ( ) = = 0 ) {
2017-02-01 13:45:45 +01:00
preset - > get_popup ( ) - > add_item ( TTR ( " Default " ) ) ;
} else {
2017-03-05 16:44:50 +01:00
for ( int i = 0 ; i < params - > importer - > get_preset_count ( ) ; i + + ) {
2017-02-01 13:45:45 +01:00
preset - > get_popup ( ) - > add_item ( params - > importer - > get_preset_name ( i ) ) ;
}
}
2020-02-14 02:58:19 +01:00
preset - > get_popup ( ) - > add_separator ( ) ;
preset - > get_popup ( ) - > add_item ( vformat ( TTR ( " Set as Default for '%s' " ) , params - > importer - > get_visible_name ( ) ) , ITEM_SET_AS_DEFAULT ) ;
if ( ProjectSettings : : get_singleton ( ) - > has_setting ( " importer_defaults/ " + params - > importer - > get_importer_name ( ) ) ) {
preset - > get_popup ( ) - > add_item ( TTR ( " Load Default " ) , ITEM_LOAD_DEFAULT ) ;
preset - > get_popup ( ) - > add_separator ( ) ;
preset - > get_popup ( ) - > add_item ( vformat ( TTR ( " Clear Default for '%s' " ) , params - > importer - > get_visible_name ( ) ) , ITEM_CLEAR_DEFAULT ) ;
}
2017-02-01 13:45:45 +01:00
}
2017-11-10 21:53:01 +01:00
void ImportDock : : _importer_selected ( int i_idx ) {
String name = import_as - > get_selected_metadata ( ) ;
2021-03-22 20:41:47 +01:00
if ( name = = " keep " ) {
params - > importer . unref ( ) ;
2021-11-14 18:02:38 +01:00
_update_options ( params - > base_options_path , Ref < ConfigFile > ( ) ) ;
2021-03-22 20:41:47 +01:00
} else {
Ref < ResourceImporter > importer = ResourceFormatImporter : : get_singleton ( ) - > get_importer_by_name ( name ) ;
ERR_FAIL_COND ( importer . is_null ( ) ) ;
2017-11-10 21:53:01 +01:00
2021-03-22 20:41:47 +01:00
params - > importer = importer ;
Ref < ConfigFile > config ;
if ( params - > paths . size ( ) ) {
2021-11-14 18:02:38 +01:00
String path = params - > paths [ 0 ] ;
2021-06-18 00:03:09 +02:00
config . instantiate ( ) ;
2021-11-14 18:02:38 +01:00
Error err = config - > load ( path + " .import " ) ;
2021-03-22 20:41:47 +01:00
if ( err ! = OK ) {
config . unref ( ) ;
}
2017-11-13 20:31:00 +01:00
}
2021-11-14 18:02:38 +01:00
_update_options ( params - > base_options_path , config ) ;
2017-11-13 20:31:00 +01:00
}
2017-11-10 21:53:01 +01:00
}
2017-02-01 13:45:45 +01:00
void ImportDock : : _preset_selected ( int p_idx ) {
2017-08-31 16:55:54 +02:00
int item_id = preset - > get_popup ( ) - > get_item_id ( p_idx ) ;
2017-02-01 13:45:45 +01:00
2017-08-31 16:55:54 +02:00
switch ( item_id ) {
case ITEM_SET_AS_DEFAULT : {
2017-07-23 23:48:05 +02:00
Dictionary d ;
2017-02-01 13:45:45 +01:00
2021-07-16 05:45:57 +02:00
for ( const PropertyInfo & E : params - > properties ) {
d [ E . name ] = params - > values [ E . name ] ;
2017-07-23 23:48:05 +02:00
}
2017-02-01 13:45:45 +01:00
2017-07-23 23:48:05 +02:00
ProjectSettings : : get_singleton ( ) - > set ( " importer_defaults/ " + params - > importer - > get_importer_name ( ) , d ) ;
ProjectSettings : : get_singleton ( ) - > save ( ) ;
2020-02-14 02:58:19 +01:00
_update_preset_menu ( ) ;
2017-07-23 23:48:05 +02:00
} break ;
case ITEM_LOAD_DEFAULT : {
2017-10-05 20:34:34 +02:00
ERR_FAIL_COND ( ! ProjectSettings : : get_singleton ( ) - > has_setting ( " importer_defaults/ " + params - > importer - > get_importer_name ( ) ) ) ;
2017-07-23 23:48:05 +02:00
2022-10-18 16:43:37 +02:00
Dictionary d = GLOBAL_GET ( " importer_defaults/ " + params - > importer - > get_importer_name ( ) ) ;
2017-07-23 23:48:05 +02:00
List < Variant > v ;
d . get_key_list ( & v ) ;
2020-02-14 02:58:19 +01:00
if ( params - > checking ) {
params - > checked . clear ( ) ;
}
2021-07-24 15:46:25 +02:00
for ( const Variant & E : v ) {
2021-07-16 05:45:57 +02:00
params - > values [ E ] = d [ E ] ;
2020-02-14 02:58:19 +01:00
if ( params - > checking ) {
2021-07-16 05:45:57 +02:00
params - > checked . insert ( E ) ;
2020-02-14 02:58:19 +01:00
}
2017-07-23 23:48:05 +02:00
}
params - > update ( ) ;
} break ;
case ITEM_CLEAR_DEFAULT : {
ProjectSettings : : get_singleton ( ) - > set ( " importer_defaults/ " + params - > importer - > get_importer_name ( ) , Variant ( ) ) ;
ProjectSettings : : get_singleton ( ) - > save ( ) ;
2020-02-14 02:58:19 +01:00
_update_preset_menu ( ) ;
2017-07-23 23:48:05 +02:00
} break ;
default : {
List < ResourceImporter : : ImportOption > options ;
2021-11-14 18:02:38 +01:00
params - > importer - > get_import_options ( params - > base_options_path , & options , p_idx ) ;
2017-07-23 23:48:05 +02:00
2020-02-14 02:58:19 +01:00
if ( params - > checking ) {
params - > checked . clear ( ) ;
}
2021-07-24 15:46:25 +02:00
for ( const ResourceImporter : : ImportOption & E : options ) {
2021-07-16 05:45:57 +02:00
params - > values [ E . option . name ] = E . default_value ;
2020-02-14 02:58:19 +01:00
if ( params - > checking ) {
2021-07-16 05:45:57 +02:00
params - > checked . insert ( E . option . name ) ;
2020-02-14 02:58:19 +01:00
}
2017-07-23 23:48:05 +02:00
}
params - > update ( ) ;
} break ;
}
2017-02-01 13:45:45 +01:00
}
void ImportDock : : clear ( ) {
imported - > set_text ( " " ) ;
import - > set_disabled ( true ) ;
import_as - > clear ( ) ;
import_as - > set_disabled ( true ) ;
2019-09-04 07:20:57 +02:00
preset - > set_disabled ( true ) ;
2017-02-01 13:45:45 +01:00
params - > values . clear ( ) ;
params - > properties . clear ( ) ;
params - > update ( ) ;
preset - > get_popup ( ) - > clear ( ) ;
2021-12-25 16:31:36 +01:00
content - > hide ( ) ;
select_a_resource - > show ( ) ;
2017-02-01 13:45:45 +01:00
}
2019-01-25 21:23:56 +01:00
static bool _find_owners ( EditorFileSystemDirectory * efsd , const String & p_path ) {
2020-05-14 16:41:43 +02:00
if ( ! efsd ) {
2019-01-25 21:23:56 +01:00
return false ;
2020-05-14 16:41:43 +02:00
}
2019-01-25 21:23:56 +01:00
for ( int i = 0 ; i < efsd - > get_subdir_count ( ) ; i + + ) {
if ( _find_owners ( efsd - > get_subdir ( i ) , p_path ) ) {
return true ;
}
}
for ( int i = 0 ; i < efsd - > get_file_count ( ) ; i + + ) {
Vector < String > deps = efsd - > get_file_deps ( i ) ;
2022-02-01 19:19:13 +01:00
if ( deps . has ( p_path ) ) {
2019-01-25 21:23:56 +01:00
return true ;
2020-05-14 16:41:43 +02:00
}
2019-01-25 21:23:56 +01:00
}
return false ;
}
2020-05-14 14:29:06 +02:00
2019-01-25 21:23:56 +01:00
void ImportDock : : _reimport_attempt ( ) {
bool need_restart = false ;
bool used_in_resources = false ;
2021-03-22 20:41:47 +01:00
String importer_name ;
if ( params - > importer . is_valid ( ) ) {
importer_name = params - > importer - > get_importer_name ( ) ;
} else {
importer_name = " keep " ;
}
2019-01-25 21:23:56 +01:00
for ( int i = 0 ; i < params - > paths . size ( ) ; i + + ) {
Ref < ConfigFile > config ;
2021-06-18 00:03:09 +02:00
config . instantiate ( ) ;
2019-01-25 21:23:56 +01:00
Error err = config - > load ( params - > paths [ i ] + " .import " ) ;
ERR_CONTINUE ( err ! = OK ) ;
String imported_with = config - > get_value ( " remap " , " importer " ) ;
2021-03-22 20:41:47 +01:00
if ( imported_with ! = importer_name ) {
2019-01-25 21:23:56 +01:00
need_restart = true ;
if ( _find_owners ( EditorFileSystem : : get_singleton ( ) - > get_filesystem ( ) , params - > paths [ i ] ) ) {
used_in_resources = true ;
}
}
}
if ( need_restart ) {
label_warning - > set_visible ( used_in_resources ) ;
2020-03-06 18:00:16 +01:00
reimport_confirm - > popup_centered ( ) ;
2019-01-25 21:23:56 +01:00
return ;
}
_reimport ( ) ;
}
void ImportDock : : _reimport_and_restart ( ) {
EditorNode : : get_singleton ( ) - > save_all_scenes ( ) ;
2019-02-13 09:23:29 +01:00
EditorResourcePreview : : get_singleton ( ) - > stop ( ) ; //don't try to re-create previews after import
2019-01-25 21:23:56 +01:00
_reimport ( ) ;
EditorNode : : get_singleton ( ) - > restart_editor ( ) ;
}
2021-03-19 13:57:52 +01:00
void ImportDock : : _advanced_options ( ) {
if ( params - > paths . size ( ) = = 1 & & params - > importer . is_valid ( ) ) {
params - > importer - > show_advanced_options ( params - > paths [ 0 ] ) ;
}
}
2017-02-01 13:45:45 +01:00
void ImportDock : : _reimport ( ) {
2017-03-05 16:44:50 +01:00
for ( int i = 0 ; i < params - > paths . size ( ) ; i + + ) {
2017-02-01 13:45:45 +01:00
Ref < ConfigFile > config ;
2021-06-18 00:03:09 +02:00
config . instantiate ( ) ;
2017-03-05 16:44:50 +01:00
Error err = config - > load ( params - > paths [ i ] + " .import " ) ;
ERR_CONTINUE ( err ! = OK ) ;
2017-02-01 13:45:45 +01:00
2021-03-22 20:41:47 +01:00
if ( params - > importer . is_valid ( ) ) {
String importer_name = params - > importer - > get_importer_name ( ) ;
2019-04-19 20:54:33 +02:00
2021-03-22 20:41:47 +01:00
if ( params - > checking & & config - > get_value ( " remap " , " importer " ) = = params - > importer - > get_importer_name ( ) ) {
//update only what is edited (checkboxes) if the importer is the same
2021-07-24 15:46:25 +02:00
for ( const PropertyInfo & E : params - > properties ) {
2021-07-16 05:45:57 +02:00
if ( params - > checked . has ( E . name ) ) {
config - > set_value ( " params " , E . name , params - > values [ E . name ] ) ;
2021-03-22 20:41:47 +01:00
}
}
} else {
//override entirely
config - > set_value ( " remap " , " importer " , importer_name ) ;
if ( config - > has_section ( " params " ) ) {
config - > erase_section ( " params " ) ;
}
2021-07-24 15:46:25 +02:00
for ( const PropertyInfo & E : params - > properties ) {
2021-07-16 05:45:57 +02:00
config - > set_value ( " params " , E . name , params - > values [ E . name ] ) ;
2018-10-30 17:11:54 +01:00
}
}
2017-02-01 13:45:45 +01:00
2021-03-22 20:41:47 +01:00
//handle group file
Ref < ResourceImporter > importer = ResourceFormatImporter : : get_singleton ( ) - > get_importer_by_name ( importer_name ) ;
ERR_CONTINUE ( ! importer . is_valid ( ) ) ;
String group_file_property = importer - > get_option_group_file ( ) ;
2021-12-09 10:42:46 +01:00
if ( ! group_file_property . is_empty ( ) ) {
2021-03-22 20:41:47 +01:00
//can import from a group (as in, atlas)
ERR_CONTINUE ( ! params - > values . has ( group_file_property ) ) ;
String group_file = params - > values [ group_file_property ] ;
config - > set_value ( " remap " , " group_file " , group_file ) ;
} else {
config - > set_value ( " remap " , " group_file " , Variant ( ) ) ; //clear group file if unused
2018-10-30 17:11:54 +01:00
}
2017-02-01 13:45:45 +01:00
2019-04-19 20:54:33 +02:00
} else {
2021-03-22 20:41:47 +01:00
//set to no import
config - > clear ( ) ;
config - > set_value ( " remap " , " importer " , " keep " ) ;
2019-04-19 20:54:33 +02:00
}
2017-03-05 16:44:50 +01:00
config - > save ( params - > paths [ i ] + " .import " ) ;
2017-02-01 13:45:45 +01:00
}
EditorFileSystem : : get_singleton ( ) - > reimport_files ( params - > paths ) ;
2021-07-17 23:22:52 +02:00
EditorFileSystem : : get_singleton ( ) - > emit_signal ( SNAME ( " filesystem_changed " ) ) ; //it changed, so force emitting the signal
2021-10-09 12:29:53 +02:00
_set_dirty ( false ) ;
2017-02-01 13:45:45 +01:00
}
2017-08-31 16:58:43 +02:00
void ImportDock : : _notification ( int p_what ) {
switch ( p_what ) {
case EditorSettings : : NOTIFICATION_EDITOR_SETTINGS_CHANGED : {
2022-02-08 10:14:58 +01:00
imported - > add_theme_style_override ( " normal " , get_theme_stylebox ( SNAME ( " normal " ) , SNAME ( " LineEdit " ) ) ) ;
2022-03-23 02:46:59 +01:00
import_opts - > set_property_name_style ( EditorPropertyNameProcessor : : get_settings_style ( ) ) ;
2017-08-31 16:58:43 +02:00
} break ;
2017-11-10 11:16:58 +01:00
case NOTIFICATION_ENTER_TREE : {
import_opts - > edit ( params ) ;
2022-02-08 10:14:58 +01:00
label_warning - > add_theme_color_override ( " font_color " , get_theme_color ( SNAME ( " warning_color " ) , SNAME ( " Editor " ) ) ) ;
2017-11-10 11:16:58 +01:00
} break ;
2017-08-31 16:58:43 +02:00
}
}
2018-10-30 17:11:54 +01:00
2021-10-09 12:29:53 +02:00
void ImportDock : : _property_edited ( const StringName & p_prop ) {
_set_dirty ( true ) ;
}
void ImportDock : : _set_dirty ( bool p_dirty ) {
if ( p_dirty ) {
// Add a dirty marker to notify the user that they should reimport the selected resource to see changes.
import - > set_text ( TTR ( " Reimport " ) + " (*) " ) ;
2022-02-08 10:14:58 +01:00
import - > add_theme_color_override ( " font_color " , get_theme_color ( SNAME ( " warning_color " ) , SNAME ( " Editor " ) ) ) ;
2022-08-25 12:42:17 +02:00
import - > set_tooltip_text ( TTR ( " You have pending changes that haven't been applied yet. Click Reimport to apply changes made to the import options. \n Selecting another resource in the FileSystem dock without clicking Reimport first will discard changes made in the Import dock. " ) ) ;
2021-10-09 12:29:53 +02:00
} else {
// Remove the dirty marker on the Reimport button.
import - > set_text ( TTR ( " Reimport " ) ) ;
2022-02-08 10:14:58 +01:00
import - > remove_theme_color_override ( " font_color " ) ;
2022-08-25 12:42:17 +02:00
import - > set_tooltip_text ( " " ) ;
2021-10-09 12:29:53 +02:00
}
}
2018-10-30 17:11:54 +01:00
void ImportDock : : _property_toggled ( const StringName & p_prop , bool p_checked ) {
if ( p_checked ) {
params - > checked . insert ( p_prop ) ;
} else {
params - > checked . erase ( p_prop ) ;
}
}
2020-05-14 14:29:06 +02:00
2017-02-01 13:45:45 +01:00
void ImportDock : : _bind_methods ( ) {
2017-03-05 16:44:50 +01:00
ClassDB : : bind_method ( D_METHOD ( " _reimport " ) , & ImportDock : : _reimport ) ;
2017-02-01 13:45:45 +01:00
}
2017-07-23 16:44:42 +02:00
void ImportDock : : initialize_import_options ( ) const {
ERR_FAIL_COND ( ! import_opts | | ! params ) ;
import_opts - > edit ( params ) ;
}
2017-02-01 13:45:45 +01:00
ImportDock : : ImportDock ( ) {
2021-11-17 21:08:55 +01:00
singleton = this ;
2017-11-26 02:59:31 +01:00
set_name ( " Import " ) ;
2021-12-25 16:31:36 +01:00
content = memnew ( VBoxContainer ) ;
content - > set_v_size_flags ( SIZE_EXPAND_FILL ) ;
add_child ( content ) ;
content - > hide ( ) ;
2017-08-04 20:16:04 +02:00
imported = memnew ( Label ) ;
2022-02-08 10:14:58 +01:00
imported - > add_theme_style_override ( " normal " , EditorNode : : get_singleton ( ) - > get_gui_base ( ) - > get_theme_stylebox ( SNAME ( " normal " ) , SNAME ( " LineEdit " ) ) ) ;
2018-05-22 09:56:16 +02:00
imported - > set_clip_text ( true ) ;
2021-12-25 16:31:36 +01:00
content - > add_child ( imported ) ;
2017-02-01 13:45:45 +01:00
HBoxContainer * hb = memnew ( HBoxContainer ) ;
2021-12-25 16:31:36 +01:00
content - > add_margin_child ( TTR ( " Import As: " ) , hb ) ;
2017-03-05 16:44:50 +01:00
import_as = memnew ( OptionButton ) ;
2019-09-04 07:20:57 +02:00
import_as - > set_disabled ( true ) ;
2022-08-29 14:28:01 +02:00
import_as - > set_fit_to_longest_item ( false ) ;
import_as - > set_text_overrun_behavior ( TextServer : : OVERRUN_TRIM_ELLIPSIS ) ;
import_as - > set_h_size_flags ( SIZE_EXPAND_FILL ) ;
2020-02-21 18:28:45 +01:00
import_as - > connect ( " item_selected " , callable_mp ( this , & ImportDock : : _importer_selected ) ) ;
2017-02-01 13:45:45 +01:00
hb - > add_child ( import_as ) ;
import_as - > set_h_size_flags ( SIZE_EXPAND_FILL ) ;
2017-03-05 16:44:50 +01:00
preset = memnew ( MenuButton ) ;
2019-09-04 07:20:57 +02:00
preset - > set_text ( TTR ( " Preset " ) ) ;
preset - > set_disabled ( true ) ;
2020-02-21 18:28:45 +01:00
preset - > get_popup ( ) - > connect ( " index_pressed " , callable_mp ( this , & ImportDock : : _preset_selected ) ) ;
2017-02-01 13:45:45 +01:00
hb - > add_child ( preset ) ;
2018-08-18 15:07:23 +02:00
import_opts = memnew ( EditorInspector ) ;
2021-12-25 16:31:36 +01:00
content - > add_child ( import_opts ) ;
2017-02-01 13:45:45 +01:00
import_opts - > set_v_size_flags ( SIZE_EXPAND_FILL ) ;
2022-03-23 02:46:59 +01:00
import_opts - > set_property_name_style ( EditorPropertyNameProcessor : : get_settings_style ( ) ) ;
2021-10-09 12:29:53 +02:00
import_opts - > connect ( " property_edited " , callable_mp ( this , & ImportDock : : _property_edited ) ) ;
2020-02-21 18:28:45 +01:00
import_opts - > connect ( " property_toggled " , callable_mp ( this , & ImportDock : : _property_toggled ) ) ;
2017-02-01 13:45:45 +01:00
2017-03-05 16:44:50 +01:00
hb = memnew ( HBoxContainer ) ;
2021-12-25 16:31:36 +01:00
content - > add_child ( hb ) ;
2017-03-05 16:44:50 +01:00
import = memnew ( Button ) ;
2017-02-01 13:45:45 +01:00
import - > set_text ( TTR ( " Reimport " ) ) ;
2019-09-04 07:20:57 +02:00
import - > set_disabled ( true ) ;
2020-02-21 18:28:45 +01:00
import - > connect ( " pressed " , callable_mp ( this , & ImportDock : : _reimport_attempt ) ) ;
2021-03-19 13:57:52 +01:00
if ( ! DisplayServer : : get_singleton ( ) - > get_swap_cancel_ok ( ) ) {
advanced_spacer = hb - > add_spacer ( ) ;
advanced = memnew ( Button ) ;
advanced - > set_text ( TTR ( " Advanced... " ) ) ;
hb - > add_child ( advanced ) ;
}
2017-02-01 13:45:45 +01:00
hb - > add_spacer ( ) ;
hb - > add_child ( import ) ;
hb - > add_spacer ( ) ;
2021-03-19 13:57:52 +01:00
if ( DisplayServer : : get_singleton ( ) - > get_swap_cancel_ok ( ) ) {
advanced = memnew ( Button ) ;
advanced - > set_text ( TTR ( " Advanced... " ) ) ;
hb - > add_child ( advanced ) ;
advanced_spacer = hb - > add_spacer ( ) ;
}
advanced - > hide ( ) ;
advanced_spacer - > hide ( ) ;
advanced - > connect ( " pressed " , callable_mp ( this , & ImportDock : : _advanced_options ) ) ;
2019-01-25 21:23:56 +01:00
reimport_confirm = memnew ( ConfirmationDialog ) ;
2022-07-08 02:31:19 +02:00
reimport_confirm - > set_ok_button_text ( TTR ( " Save Scenes, Re-Import, and Restart " ) ) ;
2021-12-25 16:31:36 +01:00
content - > add_child ( reimport_confirm ) ;
2020-02-21 18:28:45 +01:00
reimport_confirm - > connect ( " confirmed " , callable_mp ( this , & ImportDock : : _reimport_and_restart ) ) ;
2019-01-25 21:23:56 +01:00
VBoxContainer * vbc_confirm = memnew ( VBoxContainer ( ) ) ;
vbc_confirm - > add_child ( memnew ( Label ( TTR ( " Changing the type of an imported file requires editor restart. " ) ) ) ) ;
label_warning = memnew ( Label ( TTR ( " WARNING: Assets exist that use this resource, they may stop loading properly. " ) ) ) ;
vbc_confirm - > add_child ( label_warning ) ;
reimport_confirm - > add_child ( vbc_confirm ) ;
2017-03-05 16:44:50 +01:00
params = memnew ( ImportDockParameters ) ;
2021-12-25 16:31:36 +01:00
select_a_resource = memnew ( Label ) ;
select_a_resource - > set_text ( TTR ( " Select a resource file in the filesystem or in the inspector to adjust import settings. " ) ) ;
2022-06-15 10:01:45 +02:00
select_a_resource - > set_autowrap_mode ( TextServer : : AUTOWRAP_WORD ) ;
2021-12-25 16:31:36 +01:00
select_a_resource - > set_custom_minimum_size ( Size2 ( 100 * EDSCALE , 0 ) ) ;
select_a_resource - > set_v_size_flags ( SIZE_EXPAND_FILL ) ;
select_a_resource - > set_horizontal_alignment ( HORIZONTAL_ALIGNMENT_CENTER ) ;
select_a_resource - > set_vertical_alignment ( VERTICAL_ALIGNMENT_CENTER ) ;
add_child ( select_a_resource ) ;
2017-02-01 13:45:45 +01:00
}
ImportDock : : ~ ImportDock ( ) {
2021-11-17 21:08:55 +01:00
singleton = nullptr ;
2017-02-01 13:45:45 +01:00
memdelete ( params ) ;
}