Added rider plugin and turned Empowered Action into a forge-resources-managed ability
This commit is contained in:
112
addons/rider-plugin/scripts/locator/rider_locator_service.gd
Normal file
112
addons/rider-plugin/scripts/locator/rider_locator_service.gd
Normal file
@@ -0,0 +1,112 @@
|
||||
@tool
|
||||
extends RefCounted
|
||||
class_name RiderLocatorService
|
||||
|
||||
var _installations_found: Array = []
|
||||
var _thread: Thread = null
|
||||
|
||||
func get_installations() -> Array:
|
||||
var result: Array = RiderLocator.new().get_installations() # from the gdextension
|
||||
return result
|
||||
|
||||
# todo
|
||||
func fix_external_editor_if_supplied_in_commandline(_settings_service: EditorSettingsService, editor_settings: EditorSettings) -> bool:
|
||||
# When Godot is started from Rider (or vice versa), we may receive the Rider path
|
||||
# via command-line so we can keep Godot's external editor setting in sync.
|
||||
# Supported form (only this one):
|
||||
# --my_rider_path="/absolute/path/to/rider with possible spaces"
|
||||
var args : Array = OS.get_cmdline_args()
|
||||
var provided_rider_path := ""
|
||||
for a_raw in args:
|
||||
var a: String = str(a_raw)
|
||||
if a.begins_with("--my_rider_path="):
|
||||
provided_rider_path = a.substr("--my_rider_path=".length())
|
||||
break
|
||||
|
||||
if provided_rider_path.is_empty():
|
||||
return false
|
||||
|
||||
provided_rider_path = trim_quotes(provided_rider_path)
|
||||
|
||||
# Validate existence (file or dir)
|
||||
var looks_existing := FileAccess.file_exists(provided_rider_path) || DirAccess.dir_exists_absolute(provided_rider_path)
|
||||
if looks_existing:
|
||||
_settings_service.set_external_editor_path(editor_settings, provided_rider_path)
|
||||
print("Rider path provided via CLI (my_rider_path): ", provided_rider_path)
|
||||
return true
|
||||
else:
|
||||
push_warning("my_rider_path was provided but does not exist: %s" % [provided_rider_path])
|
||||
return false
|
||||
|
||||
func trim_quotes(s: String) -> String:
|
||||
if s.begins_with('"') and s.ends_with('"') and s.length() >= 2:
|
||||
return s.substr(1, s.length() - 2)
|
||||
return s
|
||||
|
||||
|
||||
func add_selector_in_editor_interface(_settings_service: EditorSettingsService):
|
||||
_update_selector(_installations_found)
|
||||
|
||||
if _installations_found.is_empty() and _thread == null:
|
||||
_thread = Thread.new()
|
||||
_thread.start(_load_installations)
|
||||
|
||||
func _load_installations() -> void:
|
||||
var array: Array = get_installations()
|
||||
call_deferred("_on_installations_loaded", array)
|
||||
|
||||
func _on_installations_loaded(array: Array):
|
||||
_installations_found = array
|
||||
if _thread:
|
||||
_thread.wait_to_finish()
|
||||
_thread = null
|
||||
_update_selector(_installations_found)
|
||||
|
||||
func _notification(what: int) -> void:
|
||||
if what == NOTIFICATION_PREDELETE and _thread != null:
|
||||
_thread.wait_to_finish()
|
||||
|
||||
func _update_selector(array: Array):
|
||||
var name := "text_editor/external/editor"
|
||||
var settings := EditorInterface.get_editor_settings()
|
||||
|
||||
if !(settings.has_setting(name)):
|
||||
settings.set(name, 0)
|
||||
|
||||
var installations: Array = ["Custom"]
|
||||
for element in array:
|
||||
var display_name: String = element.get("display", "")
|
||||
# Replace special characters that break PROPERTY_HINT_ENUM format
|
||||
# Comma is the enum delimiter, colon is used for explicit value assignment
|
||||
display_name = display_name.replace(",", " •").replace(":", " -")
|
||||
installations.append(display_name)
|
||||
var options :String = ",".join(installations)
|
||||
|
||||
settings.add_property_info({
|
||||
"name": name,
|
||||
"type":TYPE_INT,
|
||||
"hint":PROPERTY_HINT_ENUM,
|
||||
"hint_string": options
|
||||
})
|
||||
|
||||
# Connect to settings changes to update external editor path when selection changes
|
||||
if not settings.settings_changed.is_connected(_on_selection_changed):
|
||||
settings.settings_changed.connect(_on_selection_changed.bind())
|
||||
|
||||
func _on_selection_changed() -> void:
|
||||
var name := "text_editor/external/editor"
|
||||
var settings := EditorInterface.get_editor_settings()
|
||||
var selected_index: int = settings.get_setting(name)
|
||||
|
||||
# Index 0 is "Custom", so user manages the path manually
|
||||
if selected_index == 0:
|
||||
return
|
||||
|
||||
# Map to actual installation (offset by 1 because of "Custom" at index 0)
|
||||
var installation_index := selected_index - 1
|
||||
var installations_array = _installations_found
|
||||
if installation_index >= 0 and installation_index < installations_array.size():
|
||||
var installation = installations_array[installation_index]
|
||||
var new_path: String = installation.get("path", "")
|
||||
if not new_path.is_empty():
|
||||
EditorSettingsService.new().set_external_editor_path(settings, new_path)
|
||||
Reference in New Issue
Block a user