100 lines
3.4 KiB
GDScript
100 lines
3.4 KiB
GDScript
@tool
|
|
extends EditorPlugin
|
|
|
|
const Palette := preload("res://addons/PaletteTools/Scripts/palette_tool.gd")
|
|
const CustomPickerPlugin := preload("res://addons/PaletteTools/Scripts/palette_inspector_script.gd")
|
|
|
|
var dock: Control
|
|
var inspector_palette_plugin: CustomPickerPlugin
|
|
var colors: Palette
|
|
var config := ConfigFile.new()
|
|
var config_path := "res://addons/PaletteTools/color_presets.cfg"
|
|
var max_first_load_tries := 100
|
|
|
|
|
|
func _enter_tree() -> void:
|
|
## load configurations if they exist
|
|
var err := config.load(config_path)
|
|
|
|
## If configurations don't exist, it's probably the first plugin load.
|
|
## If installed from the asset library, the plugin is automatically activated.
|
|
## We want to wait for textures to be imported before loading the plugin for this reason.
|
|
## Not doing so will procude log errors and require a project restart
|
|
## before the plugin will work.
|
|
if err != OK:
|
|
## Bool to break out of a loop from sub loop
|
|
var found_import := false
|
|
## Search for first sign that the import has happened
|
|
## Max attempt of 10 seconds(0.1 * 100)
|
|
for try in max_first_load_tries:
|
|
for file in DirAccess.get_files_at("res://addons/PaletteTools/Images/"):
|
|
if ".import" in file:
|
|
found_import = true
|
|
break
|
|
if found_import:
|
|
break
|
|
await get_tree().create_timer(.1).timeout
|
|
if not found_import:
|
|
## Test
|
|
## Plugin will fail to load if this point is somehow reached.
|
|
## Show error, stop load, and disable to prevent error spam before also failing.
|
|
push_error(
|
|
"Palette Tools failed to locate both configuration settings and imported textures. "
|
|
+ "Turning the plugin on again or a project restart may fix this if you have not modified the plugin. "
|
|
+ "Stopping plugin load and deactivating to prevent a less graceful failure. "
|
|
+ "If you are modifying the plugin and running into this error, "
|
|
+ "please edit res://addons/PaletteTools/palette_tools.gd to your needs."
|
|
)
|
|
abort_load()
|
|
return
|
|
|
|
dock = load("res://addons/PaletteTools/Scenes/palette_tools.tscn").instantiate() as Control
|
|
colors = dock.get_node("Colors") as Palette
|
|
inspector_palette_plugin = load("res://addons/PaletteTools/Scripts/palette_inspector_script.gd").new(self)
|
|
|
|
colors.my_plugin = self
|
|
add_control_to_dock(DOCK_SLOT_RIGHT_UL, dock)
|
|
|
|
var json := JSON.new()
|
|
if config.has_section("settings"):
|
|
var toggled: bool = config.get_value("settings", "custom_palette_on")
|
|
if toggled:
|
|
toggle_custom_picker(toggled)
|
|
colors.custom_picker_check_box.button_pressed = toggled
|
|
else:
|
|
config.set_value("settings", "custom_palette_on", false)
|
|
|
|
inspector_palette_plugin.load_palettes()
|
|
inspector_palette_plugin.initial_palette()
|
|
|
|
|
|
func toggle_custom_picker(state: bool):
|
|
config.set_value("settings", "custom_palette_on", state)
|
|
config.save(config_path)
|
|
if state:
|
|
add_inspector_plugin(inspector_palette_plugin)
|
|
else:
|
|
remove_inspector_plugin(inspector_palette_plugin)
|
|
|
|
|
|
func _exit_tree() -> void:
|
|
if dock:
|
|
remove_control_from_docks(dock)
|
|
dock.free()
|
|
|
|
if is_instance_valid(inspector_palette_plugin) and config.get_value("settings", "custom_palette_on"):
|
|
remove_inspector_plugin(inspector_palette_plugin)
|
|
|
|
|
|
func _get_plugin_icon() -> Texture2D:
|
|
return load("res://addons/PaletteTools/icon.png")
|
|
|
|
|
|
func _get_plugin_name() -> String:
|
|
return "Palette Tools"
|
|
|
|
|
|
func abort_load():
|
|
await get_tree().create_timer(.1).timeout
|
|
get_editor_interface().set_plugin_enabled("PaletteTools", false)
|