Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix export formatter not working for attributes #1112

Merged
merged 1 commit into from
Feb 2, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 4 additions & 8 deletions src/autoload/State.gd
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ var _update_pending := false
# which doesn't happen while dragging handles or typing in the code editor for example.
var unstable_svg_text := ""
var svg_text := ""
var root_element: ElementRoot
var root_element := ElementRoot.new()

# Temporary unsaved tab, set to the file path string when importing an SVG.
var transient_tab_path := "":
Expand All @@ -59,8 +59,6 @@ var transient_tab_path := "":
setup_from_tab()

func _enter_tree() -> void:
root_element = ElementRoot.new(Configs.savedata.editor_formatter)

get_window().mouse_exited.connect(clear_all_hovered)

xnodes_added.connect(_on_xnodes_added)
Expand Down Expand Up @@ -133,7 +131,7 @@ func _update() -> void:
if not _update_pending:
return
_update_pending = false
svg_text = SVGParser.root_to_text(root_element, Configs.savedata.editor_formatter)
svg_text = SVGParser.root_to_editor_text(root_element)
svg_changed.emit()

# Ensure the save happens after the update.
Expand All @@ -147,8 +145,7 @@ func _svg_save() -> void:

func sync_elements() -> void:
var text_to_parse := svg_text if unstable_svg_text.is_empty() else unstable_svg_text
var svg_parse_result := SVGParser.text_to_root(text_to_parse,
Configs.savedata.editor_formatter)
var svg_parse_result := SVGParser.text_to_root(text_to_parse)
parsing_finished.emit(svg_parse_result.error)
if svg_parse_result.error == SVGParser.ParseError.OK:
svg_text = unstable_svg_text
Expand Down Expand Up @@ -189,8 +186,7 @@ func optimize() -> void:
queue_svg_save()

func get_export_text() -> String:
return SVGParser.root_to_text(root_element, Configs.savedata.export_formatter)

return SVGParser.root_to_export_text(root_element)


signal hover_changed
Expand Down
10 changes: 7 additions & 3 deletions src/data_classes/Attribute.gd
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ class_name Attribute extends RefCounted
signal value_changed

var name: String
var formatter: Formatter
var _value: String

func set_value(new_value: String) -> void:
Expand All @@ -25,9 +24,14 @@ func _sync() -> void:
pass

func format(text: String) -> String:
return _format(text, Configs.savedata.editor_formatter)

func get_export_value() -> String:
return _format(_value, Configs.savedata.export_formatter)

func _format(text: String, _formatter: Formatter) -> String:
return text

func _init(new_name: String, new_formatter: Formatter, init_value := "") -> void:
func _init(new_name: String, init_value := "") -> void:
name = new_name
formatter = new_formatter
set_value(init_value)
2 changes: 1 addition & 1 deletion src/data_classes/AttributeColor.gd
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ func set_value(new_value: String) -> void:
name in DB.attribute_color_url_allowed, name in DB.attribute_color_none_allowed,
name in DB.attribute_color_current_color_allowed) else "")

func format(text: String) -> String:
func _format(text: String, formatter: Formatter) -> String:
text = text.strip_edges()

if text.is_empty() or text in ["none", "currentColor"]:
Expand Down
7 changes: 4 additions & 3 deletions src/data_classes/AttributeList.gd
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@ var _list: PackedFloat64Array
func _sync() -> void:
_list = text_to_list(get_value())

func format(text: String) -> String:
return list_to_text(text_to_list(text))
func _format(text: String, formatter: Formatter) -> String:
return list_to_text(text_to_list(text), formatter)


func set_list(new_list: PackedFloat64Array) -> void:
Expand Down Expand Up @@ -81,7 +81,8 @@ static func text_to_list(string: String) -> PackedFloat64Array:

return nums_parsed

func list_to_text(list: PackedFloat64Array) -> String:
func list_to_text(list: PackedFloat64Array,
formatter := Configs.savedata.editor_formatter) -> String:
var params := PackedStringArray()
for element in list:
# It's fine to use this parser, AttributeList is just a list of numbers.
Expand Down
8 changes: 4 additions & 4 deletions src/data_classes/AttributeNumeric.gd
Original file line number Diff line number Diff line change
Expand Up @@ -20,14 +20,14 @@ func is_percentage() -> bool:
return _percentage


func format(text: String) -> String:
func _format(text: String, formatter: Formatter) -> String:
var num := text_to_num(text)
if text_check_percentage(text):
return num_to_text(num * 100.0) + "%"
return num_to_text(num * 100.0, formatter) + "%"
else:
return num_to_text(num)
return num_to_text(num, formatter)

func num_to_text(number: float) -> String:
func num_to_text(number: float, formatter := Configs.savedata.editor_formatter) -> String:
return NumberParser.num_to_text(number, formatter)

static func text_to_num(text: String) -> float:
Expand Down
7 changes: 4 additions & 3 deletions src/data_classes/AttributePathdata.gd
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ func _sync() -> void:
_commands = parse_pathdata(get_value())
locate_start_points()

func format(text: String) -> String:
return path_commands_to_text(parse_pathdata(text))
func _format(text: String, formatter: Formatter) -> String:
return path_commands_to_text(parse_pathdata(text), formatter)


func get_commands() -> Array[PathCommand]:
Expand Down Expand Up @@ -405,7 +405,8 @@ static func path_commands_from_parsed_data(data: Array[Array]) -> Array[PathComm
return cmds


func path_commands_to_text(commands_arr: Array[PathCommand]) -> String:
func path_commands_to_text(commands_arr: Array[PathCommand],
formatter := Configs.savedata.editor_formatter) -> String:
var output := ""
var num_parser := NumstringParser.new()
num_parser.compress_numbers = formatter.pathdata_compress_numbers
Expand Down
7 changes: 4 additions & 3 deletions src/data_classes/AttributeTransformList.gd
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@ func _sync() -> void:
func sync_after_transforms_change() -> void:
set_value(transform_list_to_text(_transform_list))

func format(text: String) -> String:
return transform_list_to_text(text_to_transform_list(text))
func _format(text: String, formatter: Formatter) -> String:
return transform_list_to_text(text_to_transform_list(text), formatter)

func set_transform_list(new_transform_list: Array[Transform]) -> void:
_transform_list = new_transform_list
Expand Down Expand Up @@ -61,7 +61,8 @@ func insert_transform(idx: int, type: String) -> void:
sync_after_transforms_change()


func transform_list_to_text(transform_list: Array[Transform]) -> String:
func transform_list_to_text(transform_list: Array[Transform],
formatter := Configs.savedata.editor_formatter) -> String:
var output := ""
var num_parser := NumstringParser.new()
num_parser.compress_numbers = formatter.transform_list_compress_numbers
Expand Down
18 changes: 9 additions & 9 deletions src/data_classes/DB.gd
Original file line number Diff line number Diff line change
Expand Up @@ -220,16 +220,16 @@ static func element(name: String) -> Element:
"stop": return ElementStop.new()
_: return ElementUnrecognized.new(name)

static func attribute(name: String, formatter: Formatter, value: String) -> Attribute:
static func attribute(name: String, value: String) -> Attribute:
match DB.get_attribute_type(name):
DB.AttributeType.NUMERIC: return AttributeNumeric.new(name, formatter, value)
DB.AttributeType.COLOR: return AttributeColor.new(name, formatter, value)
DB.AttributeType.LIST: return AttributeList.new(name, formatter, value)
DB.AttributeType.PATHDATA: return AttributePathdata.new(name, formatter, value)
DB.AttributeType.ENUM: return AttributeEnum.new(name, formatter, value)
DB.AttributeType.TRANSFORM_LIST: return AttributeTransformList.new(name, formatter, value)
DB.AttributeType.ID: return AttributeID.new(name, formatter, value)
_: return Attribute.new(name, formatter, value)
DB.AttributeType.NUMERIC: return AttributeNumeric.new(name, value)
DB.AttributeType.COLOR: return AttributeColor.new(name, value)
DB.AttributeType.LIST: return AttributeList.new(name, value)
DB.AttributeType.PATHDATA: return AttributePathdata.new(name, value)
DB.AttributeType.ENUM: return AttributeEnum.new(name, value)
DB.AttributeType.TRANSFORM_LIST: return AttributeTransformList.new(name, value)
DB.AttributeType.ID: return AttributeID.new(name, value)
_: return Attribute.new(name, value)


static func is_element_gradient(checked_element: Element) -> bool:
Expand Down
32 changes: 10 additions & 22 deletions src/data_classes/Element.gd
Original file line number Diff line number Diff line change
Expand Up @@ -202,21 +202,19 @@ func get_attribute_final_precise_transform(attribute_name: String) -> PackedFloa
return attrib.get_final_precise_transform()


func set_attribute(attribute_name: String, value: Variant) -> void:
func set_attribute(attrib_name: String, value: Variant) -> void:
var value_type := typeof(value)

var has_attrib := has_attribute(attribute_name)
var has_attrib := has_attribute(attrib_name)
if not has_attrib and value_type == TYPE_STRING and value.is_empty():
return

var attrib := _attributes[attribute_name] if has_attrib else\
new_attribute(attribute_name)

var attrib := _attributes[attrib_name] if has_attrib else new_attribute(attrib_name)

if value_type == TYPE_STRING:
attrib.set_value(value)
else:
match DB.get_attribute_type(attribute_name):
match DB.get_attribute_type(attrib_name):
DB.AttributeType.NUMERIC:
if value_type in [TYPE_FLOAT, TYPE_INT]: attrib.set_num(value)
else: push_error("Invalid value set to attribute.")
Expand Down Expand Up @@ -249,14 +247,9 @@ func duplicate(include_children := true) -> Element:
var new_element: Element
if type == ElementUnrecognized:
new_element = ElementUnrecognized.new(self.name)
elif type == ElementRoot:
new_element = ElementRoot.new(self.formatter)
else:
new_element = type.new()

if type == ElementRoot:
new_element.formatter = self.formatter

for attribute in _attributes:
new_element.set_attribute(attribute, get_attribute_value(attribute))

Expand All @@ -274,11 +267,11 @@ func apply_to(element: Element, dropped_attributes: PackedStringArray) -> void:

# Converts a percentage numeric attribute to absolute.
# TODO this is no longer used, but might become useful again in the future.
func make_attribute_absolute(attribute_name: String) -> void:
if is_attribute_percentage(attribute_name):
var new_attrib := new_attribute(attribute_name)
new_attrib.set_num(get_attribute_num(attribute_name))
_attributes[attribute_name] = new_attrib
func make_attribute_absolute(attrib_name: String) -> void:
if is_attribute_percentage(attrib_name):
var new_attrib := new_attribute(attrib_name)
new_attrib.set_num(get_attribute_num(attrib_name))
_attributes[attrib_name] = new_attrib


# To be overridden in extending classes.
Expand Down Expand Up @@ -332,9 +325,4 @@ func new_default_attribute(name: String) -> Attribute:
return _create_attribute(name, get_default(name))

func _create_attribute(name: String, value := "") -> Attribute:
if root != null:
return DB.attribute(name, root.formatter, value)
elif root == self:
return DB.attribute(name, self.formatter, value)
else:
return DB.attribute(name, Formatter.new(), value)
return DB.attribute(name, value)
7 changes: 2 additions & 5 deletions src/data_classes/ElementRoot.gd
Original file line number Diff line number Diff line change
Expand Up @@ -7,20 +7,17 @@ signal xnodes_added(xids: Array[PackedInt32Array])
signal xnodes_deleted(xids: Array[PackedInt32Array])
signal xnodes_moved_in_parent(parent_xid: PackedInt32Array, old_indices: Array[int])
signal xnodes_moved_to(xids: Array[PackedInt32Array], location: PackedInt32Array)
signal xnode_layout_changed # Emitted together with any of the above 4.
signal xnode_layout_changed # Emitted together with any of the above four.

@warning_ignore("unused_signal")
signal basic_xnode_text_changed(xid: PackedInt32Array)
@warning_ignore("unused_signal")
signal basic_xnode_rendered_text_changed(xid: PackedInt32Array)

var formatter: Formatter

func _init(new_formatter: Formatter) -> void:
func _init() -> void:
super()
xid = PackedInt32Array()
root = self
formatter = new_formatter

func get_xnode(loc: PackedInt32Array) -> XNode:
var current_element: XNode = self
Expand Down
Loading