311 lines
9.3 KiB
GDScript
311 lines
9.3 KiB
GDScript
@tool
|
|
extends Control
|
|
|
|
const Alert := preload("res://addons/PaletteTools/Scripts/alert_popup_panel.gd")
|
|
const URLHTTP := preload("res://addons/PaletteTools/Scripts/get_from_url.gd")
|
|
const BrowsePalettes := preload("res://addons/PaletteTools/Scripts/browse_popup.gd")
|
|
const PalettePlugin := preload("res://addons/PaletteTools/palette_tools.gd")
|
|
const ColorSample := preload("res://addons/PaletteTools/Scripts/color_sample.gd")
|
|
|
|
signal palette_list_updated
|
|
|
|
@export var http: URLHTTP
|
|
@export var url: LineEdit
|
|
@export var color_preview: HFlowContainer
|
|
@export var editor_swatch_save: Control
|
|
@export var restart_editor: Control
|
|
@export var alert: Alert
|
|
@export var p_name_text: LineEdit
|
|
@export var p_author_text: LineEdit
|
|
@export var saved_palettes: ItemList
|
|
@export var clear_preview_button: Button
|
|
@export var col_pick_popup: PopupPanel
|
|
@export var browse_popup_panel: BrowsePalettes
|
|
@export var add_color_scene: PackedScene
|
|
@export var color_sample: PackedScene
|
|
@export var custom_picker_check_box: CheckBox
|
|
var my_plugin: PalettePlugin
|
|
var my_palettes: Array[Dictionary] = []
|
|
var config := ConfigFile.new()
|
|
var config_path := "res://addons/PaletteTools/color_presets.cfg"
|
|
var editing_color_on: ColorPickerButton
|
|
var four_k_plus: bool = false
|
|
|
|
|
|
func _ready() -> void:
|
|
if DisplayServer.screen_get_size().x > 2000:
|
|
four_k_plus = true
|
|
load_palettes()
|
|
_on_new_palette_pressed()
|
|
iterate_for_control_sizing(self)
|
|
|
|
|
|
## We want to size the plugin to look good in both 1080p and 4k
|
|
func iterate_for_control_sizing(node: Node) -> void:
|
|
##TODO: See if there's anything to do about this if/else abomination
|
|
if node is Window:
|
|
return
|
|
|
|
if node is Label and node.label_settings:
|
|
if "Title" in node.name:
|
|
if node.name == "Title":
|
|
if four_k_plus:
|
|
node.label_settings.font_size = 80
|
|
else:
|
|
node.label_settings.font_size = 40
|
|
else:
|
|
if four_k_plus:
|
|
node.label_settings.font_size = 50
|
|
else:
|
|
node.label_settings.font_size = 25
|
|
else:
|
|
if four_k_plus:
|
|
node.label_settings.font_size = 40
|
|
else:
|
|
node.label_settings.font_size = 22
|
|
|
|
if node is CheckBox:
|
|
if four_k_plus:
|
|
node.add_theme_icon_override("checked", load("res://addons/PaletteTools/Images/checked_4k.png"))
|
|
node.add_theme_icon_override("unchecked", load("res://addons/PaletteTools/Images/unchecked_4k.png"))
|
|
else:
|
|
node.add_theme_icon_override("checked", load("res://addons/PaletteTools/Images/checked.png"))
|
|
node.add_theme_icon_override("unchecked", load("res://addons/PaletteTools/Images/unchecked.png"))
|
|
|
|
if node is RichTextLabel:
|
|
if four_k_plus:
|
|
node.add_theme_font_size_override("normal_font_size", 40)
|
|
else:
|
|
node.add_theme_font_size_override("normal_font_size", 20)
|
|
|
|
if node is Button or node is TextureButton or node is LineEdit or node is ItemList:
|
|
if (node is Button and node.icon) or node is TextureButton:
|
|
if four_k_plus:
|
|
node.custom_minimum_size = Vector2i(80, node.get_minimum_size().y)
|
|
else:
|
|
node.custom_minimum_size = Vector2i(40, node.get_minimum_size().y)
|
|
node.update_minimum_size()
|
|
else:
|
|
if four_k_plus:
|
|
node.add_theme_font_size_override("font_size", 30)
|
|
else:
|
|
node.add_theme_font_size_override("font_size", 16)
|
|
for c in node.get_children():
|
|
iterate_for_control_sizing(c)
|
|
|
|
|
|
func size_color_sample(cs: ColorSample) -> void:
|
|
if four_k_plus:
|
|
cs.custom_minimum_size = Vector2i(95, 95)
|
|
cs.remove_button.custom_minimum_size = Vector2i(30, 30)
|
|
cs.remove_button_text.label_settings.font_size = 20
|
|
else:
|
|
cs.custom_minimum_size = Vector2i(40, 40)
|
|
cs.remove_button.custom_minimum_size = Vector2i(10, 10)
|
|
cs.remove_button_text.label_settings.font_size = 10
|
|
cs.update_minimum_size()
|
|
cs.remove_button.update_minimum_size()
|
|
|
|
|
|
func preview_colors(p_colors: PackedStringArray) -> void:
|
|
for c in color_preview.get_children():
|
|
c.queue_free()
|
|
|
|
for pc: String in p_colors:
|
|
var cs: ColorSample = color_sample.instantiate()
|
|
var col_pick_btn := cs.color_picker_button as ColorPickerButton
|
|
col_pick_btn.color = Color.from_string(pc, Color.RED)
|
|
col_pick_btn.get_picker().presets_visible = false
|
|
col_pick_btn.get_picker().picker_shape = ColorPicker.SHAPE_OKHSL_CIRCLE
|
|
|
|
if four_k_plus:
|
|
cs.remove_button.size = Vector2i(20, 20)
|
|
else:
|
|
cs.remove_button.size = Vector2i(10, 10)
|
|
|
|
cs.remove_button.pressed.connect(remove_color.bind(cs))
|
|
color_preview.add_child(cs)
|
|
size_color_sample(cs)
|
|
|
|
var add_box := add_color_scene.instantiate()
|
|
if four_k_plus:
|
|
add_box.custom_minimum_size = Vector2i(95, 95)
|
|
else:
|
|
add_box.custom_minimum_size = Vector2i(40, 40)
|
|
color_preview.add_child(add_box)
|
|
add_box.update_minimum_size()
|
|
add_box.get_child(0).pressed.connect(add_color_to_palette)
|
|
|
|
await get_tree().create_timer(.01).timeout
|
|
|
|
if color_preview.get_child_count() > 2:
|
|
editor_swatch_save.visible = true
|
|
clear_preview_button.visible = true
|
|
else:
|
|
editor_swatch_save.visible = false
|
|
clear_preview_button.visible = false
|
|
|
|
|
|
func _on_line_edit_text_submitted(new_text: String) -> void:
|
|
if new_text.length() > 0:
|
|
http.get_palette(new_text)
|
|
else:
|
|
alert.alert("Please enter a URL")
|
|
|
|
|
|
func load_palettes() -> void:
|
|
my_palettes.clear()
|
|
config.load(config_path)
|
|
var json := JSON.new()
|
|
if config.has_section("color_picker"):
|
|
for sec in config.get_section_keys("color_picker"):
|
|
my_palettes.append(json.parse_string(config.get_value("color_picker", sec)))
|
|
|
|
if my_palettes.size() > 0:
|
|
saved_palettes.clear()
|
|
for p in my_palettes:
|
|
saved_palettes.add_item(p.name)
|
|
else:
|
|
saved_palettes.clear()
|
|
saved_palettes.add_item("No Palettes")
|
|
|
|
|
|
func save_new_palette() -> void:
|
|
if color_preview.get_child_count() < 2:
|
|
alert.alert("Please add at least one color to save a palette")
|
|
return
|
|
if p_name_text.text.length() <= 0:
|
|
alert.alert("Please add a name to save a palette")
|
|
return
|
|
|
|
var temp_pca: Array[String] = []
|
|
for c in color_preview.get_children():
|
|
if c == color_preview.get_child(-1):
|
|
continue
|
|
var color = (c as ColorSample).color_picker_button.color
|
|
temp_pca.append(color.to_html())
|
|
|
|
var json := JSON.new()
|
|
var new_pal := json.stringify({
|
|
"name": p_name_text.text,
|
|
"author": p_author_text.text,
|
|
"colors": temp_pca
|
|
})
|
|
config.set_value("color_picker", p_name_text.text, new_pal)
|
|
config.save(config_path)
|
|
|
|
load_palettes()
|
|
palette_list_updated.emit()
|
|
|
|
|
|
func _on_save_to_editor_button_pressed() -> void:
|
|
restart_editor.visible = true
|
|
var settings = my_plugin.get_editor_interface().get_editor_settings()
|
|
var temp_pca: Array[String] = []
|
|
for c in color_preview.get_children():
|
|
if c == color_preview.get_child(-1):
|
|
continue
|
|
var color := c.get_node("Color").color as Color
|
|
temp_pca.append(color.to_html())
|
|
|
|
settings.set_project_metadata("color_picker", "presets", temp_pca)
|
|
|
|
|
|
func _on_restart_editor_pressed() -> void:
|
|
my_plugin.get_editor_interface().restart_editor()
|
|
|
|
|
|
func _on_search_pressed() -> void:
|
|
if url.text.length() > 0:
|
|
http.get_palette(url.text)
|
|
else:
|
|
alert.alert("Please enter a URL")
|
|
|
|
|
|
func _on_save_palette_pressed() -> void:
|
|
save_new_palette()
|
|
|
|
|
|
func _on_load_palette_pressed() -> void:
|
|
if saved_palettes.get_selected_items().size() <= 0:
|
|
await get_tree().process_frame
|
|
alert.alert("Please select a palette")
|
|
return
|
|
|
|
if not config.has_section("color_picker"):
|
|
alert.alert("No palettes saved")
|
|
return
|
|
var load_color := JSON.parse_string(config.get_value("color_picker", saved_palettes.get_item_text(saved_palettes.get_selected_items()[0])))
|
|
p_name_text.text = load_color.name
|
|
p_author_text.text = load_color.author
|
|
preview_colors(load_color.colors)
|
|
|
|
|
|
func add_color_to_palette() -> void:
|
|
var cs: ColorSample = color_sample.instantiate() as ColorSample
|
|
editor_swatch_save.visible = true
|
|
clear_preview_button.visible = true
|
|
color_preview.add_child(cs)
|
|
color_preview.move_child(cs, -2)
|
|
size_color_sample(cs)
|
|
editing_color_on = cs.color_picker_button as ColorPickerButton
|
|
editing_color_on.get_picker().presets_visible = false
|
|
editing_color_on.get_picker().picker_shape = ColorPicker.SHAPE_OKHSL_CIRCLE
|
|
cs.remove_button.pressed.connect(remove_color.bind(cs))
|
|
cs.color_picker_button.get_popup().popup(
|
|
Rect2(
|
|
get_global_mouse_position() - Vector2(size.x, size.y * 20),
|
|
cs.color_picker_button.get_popup().size
|
|
)
|
|
)
|
|
|
|
|
|
func remove_color(obj: Node) -> void:
|
|
obj.queue_free()
|
|
if color_preview.get_child_count() < 3:
|
|
editor_swatch_save.visible = false
|
|
clear_preview_button.visible = false
|
|
|
|
|
|
func _on_delete_palette_pressed() -> void:
|
|
if config.has_section("color_picker"):
|
|
config.erase_section_key("color_picker", saved_palettes.get_item_text(saved_palettes.get_selected_items()[0]))
|
|
config.save(config_path)
|
|
load_palettes()
|
|
palette_list_updated.emit()
|
|
|
|
|
|
func _on_new_palette_pressed() -> void:
|
|
p_name_text.text = ""
|
|
p_author_text.text = ""
|
|
saved_palettes.deselect_all()
|
|
preview_colors([])
|
|
|
|
|
|
func _on_color_picker_color_changed(color: Color) -> void:
|
|
editing_color_on.color = color
|
|
|
|
|
|
func _on_saved_palettes_item_activated(_index: int) -> void:
|
|
_on_load_palette_pressed()
|
|
|
|
|
|
func _on_clear_pressed() -> void:
|
|
p_name_text.text = ""
|
|
p_author_text.text = ""
|
|
preview_colors([])
|
|
|
|
|
|
func import_palette_from_browse(palette_obj: Dictionary) -> void:
|
|
p_name_text.text = palette_obj.name
|
|
p_author_text.text = palette_obj.author
|
|
preview_colors(palette_obj.colors)
|
|
|
|
|
|
func _on_browse_palettes_button_pressed() -> void:
|
|
browse_popup_panel.visible = true
|
|
|
|
|
|
func _on_custom_picker_check_box_toggled(toggled_on: bool) -> void:
|
|
my_plugin.toggle_custom_picker(toggled_on)
|