wpgtk-godot/addons/wpgtk_theme/wpgtk_theme.gd
2025-01-13 15:44:59 -06:00

98 lines
3.0 KiB
GDScript

@tool
extends EditorPlugin
# Colors file format example:
#{
# "color0": "#121212",
# "color1": "#6D6253",
# "color2": "#756755",
# "color3": "#85725A",
# "color4": "#897A67",
# "color5": "#958774",
# "color6": "#A4917A",
# "color7": "#cbc6be",
# "color8": "#8e8a85",
# "color9": "#6D6253",
# "color10": "#756755",
# "color11": "#85725A",
# "color12": "#897A67",
# "color13": "#958774",
# "color14": "#A4917A",
# "color15": "#cbc6be",
# "active": "#6a5b48",
# "inactive": "#493e31",
#}
var _menu_item_name: String = " Update WPGTK Theme"
var _colors_file_path: String = "res://addons/wpgtk_theme/config/wpgtk-colors.txt"
var _cache_colors_file_path: String = "res://addons/wpgtk_theme/config/wpgtk-colors-cache.txt"
var _config_colors: Dictionary = {}
var auto_update: bool = true
var _last_modified_time: int = 0
func _enter_tree() -> void:
add_tool_menu_item(_menu_item_name, _button_pressed)
set_process(true)
_last_modified_time = FileAccess.get_modified_time(_colors_file_path)
func _exit_tree() -> void:
remove_tool_menu_item(_menu_item_name)
set_process(false)
func _process(delta: float) -> void:
if !auto_update: return
var current_modified_time: int = FileAccess.get_modified_time(_colors_file_path)
#print("Previous modified time: ", _last_modified_time, " Current modified time: ", current_modified_time)
if current_modified_time != _last_modified_time:
print("Colors file has been modified")
_last_modified_time = current_modified_time
_load_colors()
func _button_pressed() -> void:
_load_colors()
func _load_colors() -> void:
var file: FileAccess = FileAccess.open(_colors_file_path, FileAccess.READ)
if file == null:
printerr("Error loading colors file: ", FileAccess.get_open_error())
return
var cache_file: FileAccess = FileAccess.open(_cache_colors_file_path, FileAccess.READ_WRITE)
if cache_file == null:
printerr("Error loading cache colors file: ", FileAccess.get_open_error())
return
_config_colors.clear()
_config_colors = JSON.parse_string(file.get_as_text())
var _config_colors_cache: Dictionary = JSON.parse_string(cache_file.get_as_text())
# Check if the colors from the cache are the same
if str(_config_colors_cache) == str(_config_colors):
print("Colors are the same, no need to update")
return
# Save the new colors to the cache file
_config_colors_cache = _config_colors.duplicate()
cache_file.store_string(JSON.stringify(_config_colors_cache))
file.close()
cache_file.close()
# Convert hex colors to Color objects
var colors_copy: Dictionary = _config_colors.duplicate()
for key: String in colors_copy.keys():
_config_colors[key] = Color(_config_colors[key])
_update_theme()
func _update_theme() -> void:
var editor_settings: EditorSettings = EditorInterface.get_editor_settings()
editor_settings.set("interface/theme/base_color", _config_colors["inactive"])
editor_settings.set("interface/theme/accent_color", _config_colors["active"])
EditorInterface.restart_editor() # Restart the editor to apply the new colors, not sure why this is needed, but its the only way I found to make it work