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-13 09:45:09 +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"
2017-08-04 20:16:04 +02:00
# include "editor_node.h"
2019-12-24 08:17:23 +01:00
# include "editor_resource_preview.h"
2021-12-25 16:31:36 +01:00
# include "editor_scale.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 :
2017-03-05 16:44:50 +01:00
Map < StringName , Variant > values ;
2017-02-01 13:45:45 +01:00
List < PropertyInfo > properties ;
Ref < ResourceImporter > importer ;
Vector < String > paths ;
2018-10-30 17:11:54 +01:00
Set < StringName > checked ;
bool checking ;
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 ) ;
2020-02-14 02:58:19 +01:00
_change_notify ( ) ;
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 {
for ( const List < PropertyInfo > : : Element * E = properties . front ( ) ; E ; E = E - > next ( ) ) {
2021-05-05 12:44:11 +02:00
if ( ! importer - > get_option_visibility ( E - > get ( ) . name , values ) ) {
2017-02-01 13:45:45 +01:00
continue ;
2021-05-05 12:44:11 +02:00
}
2018-10-30 17:11:54 +01:00
PropertyInfo pi = E - > get ( ) ;
if ( checking ) {
pi . usage | = PROPERTY_USAGE_CHECKABLE ;
if ( checked . has ( E - > get ( ) . name ) ) {
pi . usage | = PROPERTY_USAGE_CHECKED ;
}
}
p_list - > push_back ( pi ) ;
2017-02-01 13:45:45 +01:00
}
}
void update ( ) {
_change_notify ( ) ;
}
2018-10-30 17:11:54 +01:00
ImportDockParameters ( ) {
checking = false ;
}
2017-02-01 13:45:45 +01:00
} ;
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 ;
config . instance ( ) ;
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 ) ;
2017-11-13 20:31:00 +01:00
_update_options ( config ) ;
2017-02-01 13:45:45 +01:00
2021-05-04 14:20:36 +02: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 ) ;
2021-05-04 14:20:36 +02:00
List < Pair < String , String > > importer_names ;
2017-02-01 13:45:45 +01:00
2021-05-04 14:20:36 +02:00
for ( List < Ref < ResourceImporter > > : : Element * E = importers . front ( ) ; E ; E = E - > next ( ) ) {
2017-03-05 16:44:50 +01:00
importer_names . push_back ( Pair < String , String > ( E - > get ( ) - > get_visible_name ( ) , E - > get ( ) - > get_importer_name ( ) ) ) ;
2017-02-01 13:45:45 +01:00
}
2021-05-04 14:20:36 +02:00
importer_names . sort_custom < PairSort < String , String > > ( ) ;
2017-02-01 13:45:45 +01:00
import_as - > clear ( ) ;
2021-05-04 14:20:36 +02:00
for ( List < Pair < String , String > > : : Element * E = importer_names . front ( ) ; E ; E = E - > next ( ) ) {
2017-02-01 13:45:45 +01:00
import_as - > add_item ( E - > get ( ) . first ) ;
2017-03-05 16:44:50 +01:00
import_as - > set_item_metadata ( import_as - > get_item_count ( ) - 1 , E - > get ( ) . second ) ;
2021-03-22 20:41:47 +01:00
if ( E - > get ( ) . 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-10 01:06:05 +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) " ) ) ;
import_as - > set_item_metadata ( import_as - > get_item_count ( ) - 1 , " keep " ) ;
if ( p_importer_name = = " keep " ) {
import_as - > select ( import_as - > get_item_count ( ) - 1 ) ;
}
}
2017-11-13 20:31:00 +01:00
void ImportDock : : _update_options ( const Ref < ConfigFile > & p_config ) {
List < ResourceImporter : : ImportOption > options ;
2021-03-22 20:41:47 +01:00
if ( params - > importer . is_valid ( ) ) {
params - > importer - > get_import_options ( & options ) ;
}
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 ( ) ;
2017-11-13 20:31:00 +01:00
for ( List < ResourceImporter : : ImportOption > : : Element * E = options . front ( ) ; E ; E = E - > next ( ) ) {
params - > properties . push_back ( E - > get ( ) . option ) ;
if ( p_config . is_valid ( ) & & p_config - > has_section_key ( " params " , E - > get ( ) . option . name ) ) {
params - > values [ E - > get ( ) . option . name ] = p_config - > get_value ( " params " , E - > get ( ) . option . name ) ;
} else {
params - > values [ E - > get ( ) . option . name ] = E - > get ( ) . default_value ;
}
}
params - > update ( ) ;
2020-02-14 02:58:19 +01:00
_update_preset_menu ( ) ;
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.
2017-03-05 16:44:50 +01:00
Map < String , Dictionary > value_frequency ;
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 ;
config . instance ( ) ;
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
2017-03-05 16:44:50 +01:00
for ( List < String > : : Element * E = keys . front ( ) ; E ; E = E - > next ( ) ) {
2017-02-01 13:45:45 +01:00
if ( ! value_frequency . has ( E - > get ( ) ) ) {
2017-03-05 16:44:50 +01:00
value_frequency [ E - > get ( ) ] = Dictionary ( ) ;
2017-02-01 13:45:45 +01:00
}
2017-03-05 16:44:50 +01:00
Variant value = config - > get_value ( " params " , E - > get ( ) ) ;
2017-02-01 13:45:45 +01:00
if ( value_frequency [ E - > get ( ) ] . has ( value ) ) {
2017-03-05 16:44:50 +01:00
value_frequency [ E - > get ( ) ] [ value ] = int ( value_frequency [ E - > get ( ) ] [ value ] ) + 1 ;
2017-02-01 13:45:45 +01:00
} else {
2017-03-05 16:44:50 +01:00
value_frequency [ E - > get ( ) ] [ value ] = 1 ;
2017-02-01 13:45:45 +01:00
}
}
}
ERR_FAIL_COND ( params - > importer . is_null ( ) ) ;
List < ResourceImporter : : ImportOption > options ;
params - > importer - > get_import_options ( & options ) ;
params - > properties . clear ( ) ;
params - > values . clear ( ) ;
2018-10-30 17:11:54 +01:00
params - > checking = true ;
params - > checked . clear ( ) ;
2017-02-01 13:45:45 +01:00
2017-03-05 16:44:50 +01:00
for ( List < ResourceImporter : : ImportOption > : : Element * E = options . front ( ) ; E ; E = E - > next ( ) ) {
2017-02-01 13:45:45 +01:00
params - > properties . push_back ( E - > get ( ) . option ) ;
if ( value_frequency . has ( E - > get ( ) . option . name ) ) {
Dictionary d = value_frequency [ E - > get ( ) . 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 ;
2017-03-05 16:44:50 +01:00
for ( List < Variant > : : Element * F = v . front ( ) ; F ; F = F - > next ( ) ) {
2017-02-01 13:45:45 +01:00
int f = d [ F - > get ( ) ] ;
2017-03-05 16:44:50 +01:00
if ( f > freq ) {
value = F - > get ( ) ;
2017-02-01 13:45:45 +01:00
}
}
2017-03-05 16:44:50 +01:00
params - > values [ E - > get ( ) . option . name ] = value ;
2017-02-01 13:45:45 +01:00
} else {
2017-03-05 16:44:50 +01:00
params - > values [ E - > get ( ) . option . name ] = E - > get ( ) . default_value ;
2017-02-01 13:45:45 +01:00
}
}
params - > update ( ) ;
2021-05-04 14:20:36 +02: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 ) ;
2021-05-04 14:20:36 +02:00
List < Pair < String , String > > importer_names ;
2017-02-01 13:45:45 +01:00
2021-05-04 14:20:36 +02:00
for ( List < Ref < ResourceImporter > > : : Element * E = importers . front ( ) ; E ; E = E - > next ( ) ) {
2017-03-05 16:44:50 +01:00
importer_names . push_back ( Pair < String , String > ( E - > get ( ) - > get_visible_name ( ) , E - > get ( ) - > get_importer_name ( ) ) ) ;
2017-02-01 13:45:45 +01:00
}
2021-05-04 14:20:36 +02:00
importer_names . sort_custom < PairSort < String , String > > ( ) ;
2017-02-01 13:45:45 +01:00
import_as - > clear ( ) ;
2021-05-04 14:20:36 +02:00
for ( List < Pair < String , String > > : : Element * E = importer_names . front ( ) ; E ; E = E - > next ( ) ) {
2017-02-01 13:45:45 +01:00
import_as - > add_item ( E - > get ( ) . first ) ;
2017-03-05 16:44:50 +01:00
import_as - > set_item_metadata ( import_as - > get_item_count ( ) - 1 , E - > get ( ) . second ) ;
if ( E - > get ( ) . second = = params - > importer - > get_importer_name ( ) ) {
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-10 01:06:05 +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 16:58:56 +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 ( ) ) ) ;
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 ( ) ;
_update_options ( Ref < ConfigFile > ( ) ) ;
} 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 ;
2017-11-13 20:31:00 +01:00
2021-03-22 20:41:47 +01:00
Ref < ConfigFile > config ;
if ( params - > paths . size ( ) ) {
config . instance ( ) ;
Error err = config - > load ( params - > paths [ 0 ] + " .import " ) ;
if ( err ! = OK ) {
config . unref ( ) ;
}
2017-11-13 20:31:00 +01:00
}
2021-03-22 20:41:47 +01:00
_update_options ( 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
2017-08-31 16:55:54 +02:00
for ( const List < PropertyInfo > : : Element * E = params - > properties . front ( ) ; E ; E = E - > next ( ) ) {
d [ E - > get ( ) . name ] = params - > values [ E - > get ( ) . 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
Dictionary d = ProjectSettings : : get_singleton ( ) - > get ( " importer_defaults/ " + params - > importer - > get_importer_name ( ) ) ;
List < Variant > v ;
d . get_key_list ( & v ) ;
2020-02-14 02:58:19 +01:00
if ( params - > checking ) {
params - > checked . clear ( ) ;
}
2017-07-23 23:48:05 +02:00
for ( List < Variant > : : Element * E = v . front ( ) ; E ; E = E - > next ( ) ) {
params - > values [ E - > get ( ) ] = d [ E - > get ( ) ] ;
2020-02-14 02:58:19 +01:00
if ( params - > checking ) {
params - > checked . insert ( E - > get ( ) ) ;
}
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 ;
params - > importer - > get_import_options ( & options , p_idx ) ;
2020-02-14 02:58:19 +01:00
if ( params - > checking ) {
params - > checked . clear ( ) ;
}
2017-07-23 23:48:05 +02:00
for ( List < ResourceImporter : : ImportOption > : : Element * E = options . front ( ) ; E ; E = E - > next ( ) ) {
params - > values [ E - > get ( ) . option . name ] = E - > get ( ) . default_value ;
2020-02-14 02:58:19 +01:00
if ( params - > checking ) {
params - > checked . insert ( E - > get ( ) . option . name ) ;
}
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 ) {
2021-05-05 12:44:11 +02:00
if ( ! efsd ) {
2019-01-25 21:23:56 +01:00
return false ;
2021-05-05 12:44:11 +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 ) ;
2021-05-05 12:44:11 +02:00
if ( deps . find ( p_path ) ! = - 1 ) {
2019-01-25 21:23:56 +01:00
return true ;
2021-05-05 12:44:11 +02:00
}
2019-01-25 21:23:56 +01:00
}
return false ;
}
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 ;
config . instance ( ) ;
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 ) ;
reimport_confirm - > popup_centered_minsize ( ) ;
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 ( ) ;
}
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 ;
config . instance ( ) ;
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
for ( List < PropertyInfo > : : Element * E = params - > properties . front ( ) ; E ; E = E - > next ( ) ) {
if ( params - > checked . has ( E - > get ( ) . name ) ) {
config - > set_value ( " params " , E - > get ( ) . name , params - > values [ E - > get ( ) . name ] ) ;
}
}
} else {
//override entirely
config - > set_value ( " remap " , " importer " , importer_name ) ;
if ( config - > has_section ( " params " ) ) {
config - > erase_section ( " params " ) ;
}
for ( List < PropertyInfo > : : Element * E = params - > properties . front ( ) ; E ; E = E - > next ( ) ) {
2018-10-30 17:11:54 +01:00
config - > set_value ( " params " , E - > get ( ) . name , params - > values [ E - > get ( ) . name ] ) ;
}
}
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 ( ) ;
if ( group_file_property ! = String ( ) ) {
//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 ) ;
EditorFileSystem : : get_singleton ( ) - > emit_signal ( " filesystem_changed " ) ; //it changed, so force emitting the signal
2021-10-10 01:06:05 +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 : {
imported - > add_style_override ( " normal " , get_stylebox ( " normal " , " LineEdit " ) ) ;
2022-03-19 12:04:49 +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 ) ;
2019-01-25 21:23:56 +01:00
label_warning - > add_color_override ( " font_color " , get_color ( " warning_color " , " 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-10 01:06:05 +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 " ) + " (*) " ) ;
import - > add_color_override ( " font_color " , get_color ( " warning_color " , " Editor " ) ) ;
import - > set_tooltip ( 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. " ) ) ;
} else {
// Remove the dirty marker on the Reimport button.
import - > set_text ( TTR ( " Reimport " ) ) ;
import - > add_color_override ( " font_color " , get_color ( " font_color " , " Editor " ) ) ;
import - > set_tooltip ( " " ) ;
}
}
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 ) ;
}
}
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 ) ;
ClassDB : : bind_method ( D_METHOD ( " _preset_selected " ) , & ImportDock : : _preset_selected ) ;
2017-11-10 21:53:01 +01:00
ClassDB : : bind_method ( D_METHOD ( " _importer_selected " ) , & ImportDock : : _importer_selected ) ;
2021-10-10 01:06:05 +02:00
ClassDB : : bind_method ( D_METHOD ( " _property_edited " ) , & ImportDock : : _property_edited ) ;
2018-10-30 17:11:54 +01:00
ClassDB : : bind_method ( D_METHOD ( " _property_toggled " ) , & ImportDock : : _property_toggled ) ;
2019-01-25 21:23:56 +01:00
ClassDB : : bind_method ( D_METHOD ( " _reimport_and_restart " ) , & ImportDock : : _reimport_and_restart ) ;
ClassDB : : bind_method ( D_METHOD ( " _reimport_attempt " ) , & ImportDock : : _reimport_attempt ) ;
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 ( ) {
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 ) ;
imported - > add_style_override ( " normal " , EditorNode : : get_singleton ( ) - > get_gui_base ( ) - > get_stylebox ( " normal " , " 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 ) ;
2017-11-10 21:53:01 +01:00
import_as - > connect ( " item_selected " , this , " _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 ) ;
2017-03-05 16:44:50 +01:00
preset - > get_popup ( ) - > connect ( " index_pressed " , this , " _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-19 12:04:49 +01:00
import_opts - > set_property_name_style ( EditorPropertyNameProcessor : : get_settings_style ( ) ) ;
2021-10-10 01:06:05 +02:00
import_opts - > connect ( " property_edited " , this , " _property_edited " ) ;
2018-10-30 17:11:54 +01:00
import_opts - > connect ( " property_toggled " , this , " _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 ) ;
2019-01-25 21:23:56 +01:00
import - > connect ( " pressed " , this , " _reimport_attempt " ) ;
2017-02-01 13:45:45 +01:00
hb - > add_spacer ( ) ;
hb - > add_child ( import ) ;
hb - > add_spacer ( ) ;
2019-01-25 21:23:56 +01:00
reimport_confirm = memnew ( ConfirmationDialog ) ;
2020-04-05 20:13:29 +02:00
reimport_confirm - > get_ok ( ) - > set_text ( TTR ( " Save Scenes, Re-Import, and Restart " ) ) ;
2021-12-25 16:31:36 +01:00
content - > add_child ( reimport_confirm ) ;
2019-01-25 21:23:56 +01:00
reimport_confirm - > connect ( " confirmed " , this , " _reimport_and_restart " ) ;
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. " ) ) ;
select_a_resource - > set_autowrap ( true ) ;
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_align ( Label : : ALIGN_CENTER ) ;
select_a_resource - > set_valign ( Label : : VALIGN_CENTER ) ;
add_child ( select_a_resource ) ;
2017-02-01 13:45:45 +01:00
}
ImportDock : : ~ ImportDock ( ) {
memdelete ( params ) ;
}