@@ -4,6 +4,7 @@ extends EditorPlugin
44const ADDONS_PATH := "res://addons/"
55const PLUGIN_CONFIG_DIR := "plugins/plugin_refresher"
66const PLUGIN_CONFIG := "settings.cfg"
7+ const PLUGIN_NAME := "Godot Plugin Refresher"
78const SETTINGS := "settings"
89const SETTING_RECENT := "recently_used"
910const Refresher := preload ("plugin_refresher.gd" )
@@ -33,45 +34,57 @@ func _exit_tree() -> void:
3334
3435
3536func _reload_plugins_list () -> void :
36- var refresher_dir := get_plugin_path (). get_file ()
37+ var cfg_paths : Array [ String ] = []
3738 var plugins := {}
38- var origins := {}
39+ var display_names_map := {} # full path to display name
40+
41+ find_cfgs (ADDONS_PATH , cfg_paths )
42+
43+ for cfg_path in cfg_paths :
44+ var plugin_cfg := ConfigFile .new ()
45+ var err := plugin_cfg .load (cfg_path )
46+ if err :
47+ push_error ("ERROR LOADING PLUGIN FILE: %s " % err )
48+ else :
49+ var plugin_name := plugin_cfg .get_value ("plugin" , "name" )
50+ if plugin_name != PLUGIN_NAME :
51+ var addon_dir_name = cfg_path .split ("addons/" )[- 1 ].split ("/plugin.cfg" )[0 ]
52+ plugins [addon_dir_name ] = [plugin_name , cfg_path ]
53+
54+ # This will be an array of the addon/* directory names.
55+ var plugin_dirs : Array [String ] = []
56+ plugin_dirs .assign (plugins .keys ()) # typed array "casting"
57+
58+ var plugin_names : Array [String ] = []
59+ plugin_names .assign (plugin_dirs .map (func (k ): return plugins [k ][0 ]))
60+
61+ for plugin_dirname in plugin_dirs :
62+ var plugin_name = plugins [plugin_dirname ][0 ]
63+ var display_name = plugin_name if plugin_names .count (plugin_name ) == 1 else "%s (%s )" % [plugin_name , plugin_dirname ]
64+ display_names_map [plugins [plugin_dirname ][1 ]] = display_name
65+
66+ refresher .update_items ([plugins , display_names_map ])
67+
68+
69+ func find_cfgs (dir_path : String , cfgs : Array ):
70+ var dir := DirAccess .open (dir_path )
71+ var cfg_path := dir_path .path_join ("plugin.cfg" )
72+
73+ if dir .file_exists (cfg_path ):
74+ cfgs .append (cfg_path )
75+ return
3976
40- var dir := DirAccess .open (ADDONS_PATH )
4177 if dir :
4278 dir .list_dir_begin ()
4379 var file_name := dir .get_next ()
4480 while file_name != "" :
45- var addon_dir := ADDONS_PATH .path_join (file_name )
46- if dir .dir_exists (addon_dir ) and file_name != refresher_dir :
47- var display_name := file_name
48-
49- var plugin_config_path := addon_dir .path_join ("plugin.cfg" )
50- if not dir .file_exists (plugin_config_path ):
51- file_name = dir .get_next ()
52- continue # not a plugin
53- var plugin_cfg := ConfigFile .new ()
54- plugin_cfg .load (plugin_config_path )
55- display_name = plugin_cfg .get_value ("plugin" , "name" , file_name )
56- if not display_name in origins :
57- origins [display_name ] = [file_name ]
58- else :
59- origins [display_name ].append (file_name )
60- plugins [file_name ] = display_name
81+ if dir .current_is_dir ():
82+ find_cfgs (dir_path .path_join (file_name ), cfgs )
6183 file_name = dir .get_next ()
6284
63- # Specify the exact plugin name in parenthesis in case of naming collisions.
64- for display_name in origins :
65- var plugin_names = origins [display_name ]
66- if plugin_names .size () > 1 :
67- for n in plugin_names :
68- plugins [n ] = "%s (%s )" % [display_name , n ]
69-
70- refresher .update_items (plugins )
71-
7285
7386func _load_settings () -> void :
74- var path := get_config_path ()
87+ var path := get_settings_path ()
7588
7689 if not FileAccess .file_exists (path ):
7790 # Create new if running for the first time
@@ -83,10 +96,10 @@ func _load_settings() -> void:
8396
8497
8598func _save_settings () -> void :
86- plugin_config .save (get_config_path ())
99+ plugin_config .save (get_settings_path ())
87100
88101
89- func get_config_path () -> String :
102+ func get_settings_path () -> String :
90103 var editor_paths := EditorInterface .get_editor_paths ()
91104 var dir := editor_paths .get_project_settings_dir ()
92105
@@ -99,43 +112,45 @@ func get_config_path() -> String:
99112func _on_filesystem_changed () -> void :
100113 if refresher :
101114 _reload_plugins_list ()
102- refresher .select_plugin (get_recent_plugin ())
115+ var recent = get_recent_plugin ()
116+ if recent :
117+ refresher .select_plugin (recent )
103118
104119
105120func get_recent_plugin () -> String :
106121 if not plugin_config .has_section_key (SETTINGS , SETTING_RECENT ):
107- return "" # not saved yet
122+ return "" # not saved yet
108123
109- var recent = plugin_config .get_value (SETTINGS , SETTING_RECENT )
110- return recent if recent != null and not recent . is_empty () else ""
124+ var recent = str ( plugin_config .get_value (SETTINGS , SETTING_RECENT ) )
125+ return recent
111126
112127
113- func _on_request_refresh_plugin (p_name : String ) -> void :
114- assert (not p_name .is_empty ())
128+ func _on_request_refresh_plugin (p_path : String ) -> void :
129+ assert (not p_path .is_empty ())
115130
116- var disabled := not EditorInterface .is_plugin_enabled (p_name )
131+ var disabled := not EditorInterface .is_plugin_enabled (p_path )
117132 if disabled :
118- refresher .show_warning (p_name )
133+ refresher .show_warning (p_path )
119134 else :
120- refresh_plugin (p_name )
135+ refresh_plugin (p_path )
121136
122137
123- func _on_confirm_refresh_plugin (p_name : String ) -> void :
124- refresh_plugin (p_name )
138+ func _on_confirm_refresh_plugin (p_path : String ) -> void :
139+ refresh_plugin (p_path )
125140
126141
127142func get_plugin_path () -> String :
128143 return get_script ().resource_path .get_base_dir ()
129144
130145
131- func refresh_plugin (p_name : String ) -> void :
132- print ("Refreshing plugin: " , p_name )
146+ func refresh_plugin (p_path : String ) -> void :
147+ print ("Refreshing plugin: " , p_path )
133148
134- var enabled := EditorInterface .is_plugin_enabled (p_name )
135- if enabled : # can only disable an active plugin
136- EditorInterface .set_plugin_enabled (p_name , false )
149+ var enabled := EditorInterface .is_plugin_enabled (p_path )
150+ if enabled : # can only disable an active plugin
151+ EditorInterface .set_plugin_enabled (p_path , false )
137152
138- EditorInterface .set_plugin_enabled (p_name , true )
153+ EditorInterface .set_plugin_enabled (p_path , true )
139154
140- plugin_config .set_value (SETTINGS , SETTING_RECENT , p_name )
155+ plugin_config .set_value (SETTINGS , SETTING_RECENT , p_path )
141156 _save_settings ()
0 commit comments