mirror of
https://github.com/Insality/druid
synced 2025-06-27 18:37:45 +02:00
136 lines
5.4 KiB
Python
136 lines
5.4 KiB
Python
# @license MIT, Insality 2021
|
|
# @source https://github.com/Insality/druid
|
|
|
|
import os
|
|
import sys
|
|
import deftree
|
|
|
|
current_filepath = os.path.abspath(os.path.dirname(__file__))
|
|
TEMPLATE_PATH = current_filepath + "/component.lua_template"
|
|
|
|
component_annotations = ""
|
|
component_functions = ""
|
|
component_define = ""
|
|
|
|
def to_camel_case(snake_str):
|
|
components = snake_str.split('_')
|
|
return ''.join(x.title() for x in components[0:])
|
|
|
|
|
|
def get_id(node_name):
|
|
return node_name.upper().replace("/", "_")
|
|
|
|
|
|
def process_component(node_name, component_name):
|
|
global component_annotations
|
|
global component_functions
|
|
global component_define
|
|
|
|
if node_name == "root":
|
|
component_annotations += "\n---@field root node"
|
|
component_define += "\n\tself.root = self:get_node(\"root\")"
|
|
|
|
if node_name.startswith("button"):
|
|
component_annotations += "\n---@field {0} druid.button".format(node_name)
|
|
component_functions += "\nfunction M:_on_{0}()\n\tprint(\"Click on {0}\")\nend\n\n".format(node_name)
|
|
component_define += "\n\tself.{0} = self.druid:new_button(\"{1}\", self._on_{0})".format(node_name, node_name)
|
|
|
|
if node_name.startswith("text"):
|
|
component_annotations += "\n---@field {0} druid.text".format(node_name)
|
|
component_define += "\n\tself.{0} = self.druid:new_text(\"{1}\")".format(node_name, node_name)
|
|
|
|
if node_name.startswith("lang_text"):
|
|
component_annotations += "\n---@field {0} druid.text".format(node_name)
|
|
component_define += "\n\tself.{0} = self.druid:new_lang_text(\"{1}\", \"lang_id\")".format(node_name, node_name)
|
|
|
|
if node_name.startswith("grid") or node_name.startswith("static_grid"):
|
|
component_annotations += "\n---@field {0} druid.static_grid".format(node_name)
|
|
component_define += "\n--TODO: Replace prefab_name with grid element prefab"
|
|
component_define += "\n\tself.{0} = self.druid:new_static_grid(\"{1}\", \"prefab_name\", 1)".format(node_name, node_name)
|
|
|
|
if node_name.startswith("scroll_view"):
|
|
field_name = node_name.replace("_view", "")
|
|
content_name = node_name.replace("_view", "_content")
|
|
component_annotations += "\n---@field {0} druid.scroll".format(field_name)
|
|
component_define += "\n\tself.{0} = self.druid:new_scroll(\"{1}\", \"{2}\")".format(field_name, node_name, content_name)
|
|
|
|
if node_name.startswith("blocker"):
|
|
component_annotations += "\n---@field {0} druid.blocker".format(node_name)
|
|
component_define += "\n\tself.{0} = self.druid:new_blocker(\"{1}\")".format(node_name, node_name)
|
|
|
|
if node_name.startswith("slider"):
|
|
component_annotations += "\n---@field {0} druid.slider".format(node_name)
|
|
component_define += "\n--TODO: Replace slider end position. It should be only vertical or horizontal"
|
|
component_define += "\n\tself.{0} = self.druid:new_slider(\"{1}\", vmath.vector3(100, 0, 0), self._on_{0}_change)".format(node_name, node_name)
|
|
component_functions += "\nfunction M:_on_{0}_change(value)\n\tprint(\"Slider change:\", value)\nend\n\n".format(node_name)
|
|
|
|
if node_name.startswith("progress"):
|
|
component_annotations += "\n---@field {0} druid.progress".format(node_name)
|
|
component_define += "\n\tself.{0} = self.druid:new_progress(\"{1}\", \"x\")".format(node_name, get_id(node_name))
|
|
|
|
if node_name.startswith("timer"):
|
|
component_annotations += "\n---@field {0} druid.timer".format(node_name)
|
|
component_define += "\n\tself.{0} = self.druid:new_timer(\"{1}\", 59, 0, self._on_{0}_end)".format(node_name, get_id(node_name))
|
|
component_functions += "\nfunction M:_on_{0}_end()\n\tprint(\"Timer {0} trigger\")\nend\n\n".format(node_name)
|
|
|
|
|
|
def main():
|
|
global component_annotations
|
|
global component_functions
|
|
global component_define
|
|
|
|
filename = sys.argv[1]
|
|
print("Create Druid component from gui file", filename)
|
|
tree = deftree.parse(filename)
|
|
root = tree.get_root()
|
|
|
|
output_directory = os.path.dirname(filename)
|
|
output_filename = os.path.splitext(os.path.basename(filename))[0]
|
|
|
|
output_full_path = os.path.join(output_directory, output_filename + ".lua")
|
|
is_already_exists = os.path.exists(output_full_path)
|
|
if is_already_exists:
|
|
print("Error: The file is already exists")
|
|
print("File:", output_full_path)
|
|
return
|
|
|
|
component_require_path = os.path.join(output_directory, output_filename).replace("/", ".").replace("..", "")
|
|
component_name = to_camel_case(output_filename)
|
|
component_type = output_filename
|
|
scheme_list = []
|
|
|
|
# Gather nodes from GUI scene
|
|
for node in root.iter_elements("nodes"):
|
|
node_name = node.get_attribute("id").value
|
|
scheme_list.append("\t" + get_id(node_name) + " = \"" + node_name + "\"")
|
|
|
|
is_template = node.get_attribute("template")
|
|
is_in_template = "/" in node_name
|
|
if not is_template and not is_in_template:
|
|
process_component(node_name, component_name)
|
|
|
|
if len(component_define) > 2:
|
|
component_define = "\n" + component_define
|
|
|
|
template_file = open(TEMPLATE_PATH, "r")
|
|
filedata = template_file.read()
|
|
template_file.close()
|
|
|
|
filedata = filedata.replace("{COMPONENT_NAME}", component_name)
|
|
filedata = filedata.replace("{COMPONENT_TYPE}", component_type)
|
|
filedata = filedata.replace("{COMPONENT_PATH}", component_require_path)
|
|
filedata = filedata.replace("{COMPONENT_DEFINE}", component_define)
|
|
filedata = filedata.replace("{COMPONENT_FUNCTIONS}", component_functions)
|
|
filedata = filedata.replace("{COMPONENT_ANNOTATIONS}", component_annotations)
|
|
#filedata = filedata.replace("{SCHEME_LIST}", ",\n".join(scheme_list))
|
|
|
|
output_file = open(output_full_path, "w")
|
|
output_file.write(filedata)
|
|
output_file.close()
|
|
|
|
print("Success: The file is created")
|
|
print("File:", output_full_path)
|
|
|
|
|
|
main()
|