Skip to content

Commit b453d1b

Browse files
Merge pull request #33 from willnationsdev/multidir
Fix Edge cases where config files >1 dir deep.
2 parents 09452b7 + 55a49cb commit b453d1b

File tree

2 files changed

+80
-57
lines changed

2 files changed

+80
-57
lines changed

addons/godot-plugin-refresher/plugin_refresher.gd

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,21 +9,29 @@ signal confirm_refresh_plugin(p_name: String)
99

1010
func _ready() -> void:
1111
if get_tree().edited_scene_root == self:
12-
return # This is the scene opened in the editor!
12+
return # This is the scene opened in the editor!
1313
$RefreshButton.icon = EditorInterface.get_editor_theme().get_icon("Reload", "EditorIcons")
1414

1515

16-
func update_items(p_plugins: Dictionary) -> void:
16+
func update_items(p_plugins_info: Array) -> void:
1717
if not options:
1818
return
1919
options.clear()
20+
21+
var plugins := p_plugins_info[0] as Dictionary
22+
var display_names_map := p_plugins_info[1] as Dictionary
23+
2024
var plugin_dirs: Array[String] = []
21-
plugin_dirs.assign(p_plugins.keys())
25+
plugin_dirs.assign(plugins.keys())
2226
for idx in plugin_dirs.size():
23-
var plugin_dirname := plugin_dirs[idx] as String
24-
var plugin_name := p_plugins[plugin_dirname] as String
25-
options.add_item(plugin_name, idx)
26-
options.set_item_metadata(idx, plugin_dirname)
27+
var plugin_dirname := plugin_dirs[idx]
28+
var plugin_data = plugins[plugin_dirname] # Array[String] used as a Tuple<String, String>.
29+
var plugin_name := plugin_data[0] as String
30+
var plugin_path := plugin_data[1] as String
31+
var display_name := display_names_map[plugin_path] as String
32+
33+
options.add_item(display_name, idx)
34+
options.set_item_metadata(idx, plugin_path)
2735

2836

2937
# Note: For whatever reason, statically typing `p_name` inexplicably causes
@@ -41,7 +49,7 @@ func select_plugin(p_name) -> void:
4149

4250
func _on_RefreshButton_pressed() -> void:
4351
if options.selected == -1:
44-
return # nothing selected
52+
return # nothing selected
4553

4654
var plugin := str(options.get_item_metadata(options.selected))
4755
if not plugin:

addons/godot-plugin-refresher/plugin_refresher_plugin.gd

Lines changed: 64 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ extends EditorPlugin
44
const ADDONS_PATH := "res://addons/"
55
const PLUGIN_CONFIG_DIR := "plugins/plugin_refresher"
66
const PLUGIN_CONFIG := "settings.cfg"
7+
const PLUGIN_NAME := "Godot Plugin Refresher"
78
const SETTINGS := "settings"
89
const SETTING_RECENT := "recently_used"
910
const Refresher := preload("plugin_refresher.gd")
@@ -33,45 +34,57 @@ func _exit_tree() -> void:
3334

3435

3536
func _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

7386
func _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

8598
func _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:
99112
func _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

105120
func 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

127142
func 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

Comments
 (0)