Skip to content
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
4 changes: 2 additions & 2 deletions godot_only/scripts/update_translations.gd
Original file line number Diff line number Diff line change
Expand Up @@ -84,10 +84,10 @@ func search_directory(dir: String) -> void:
for msg in messages:
if msg.msgid == msgid:
already_exists = true
msg.files.append(full_file_name)
msg.files.append(full_file_name + ":")
break
if not already_exists:
messages.append(Message.new(msgid, PackedStringArray([full_file_name])))
messages.append(Message.new(msgid, PackedStringArray([full_file_name + ":"])))


func update_translations() -> void:
Expand Down
8 changes: 4 additions & 4 deletions src/autoload/HandlerGUI.gd
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ func _notification(what: int) -> void:
# Drag-and-drop of files.
func _on_files_dropped(files: PackedStringArray) -> void:
if menu_stack.is_empty():
get_window().grab_focus()
FileUtils.apply_svgs_from_paths(files)


Expand Down Expand Up @@ -359,15 +360,14 @@ func get_usable_rect() -> Vector2i:
DisplayServer.window_get_current_screen()).size -\
window.get_size_with_decorations() + window.size)

func get_max_ui_scale() -> float:
var usable_screen_size := get_usable_rect()
func get_max_ui_scale(usable_screen_size: Vector2i) -> float:
var window_default_size := get_window_default_size()
# How much can the default size be increased before it takes all usable screen space.
var max_expansion := Vector2(usable_screen_size) / Vector2(window_default_size)
return clampf(snappedf(minf(max_expansion.x, max_expansion.y) - 0.005, 0.01), 0.75, 4.0)

func get_min_ui_scale() -> float:
return maxf(snappedf(get_max_ui_scale() / 2.0 - 0.125, 0.25), 0.75)
func get_min_ui_scale(usable_screen_size: Vector2i) -> float:
return maxf(snappedf(get_max_ui_scale(usable_screen_size) / 2.0 - 0.125, 0.25), 0.75)

func get_auto_ui_scale() -> float:
var dpi := DisplayServer.screen_get_dpi(DisplayServer.window_get_current_screen())
Expand Down
4 changes: 4 additions & 0 deletions src/autoload/State.gd
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,10 @@ func _svg_save() -> void:
last_saved_svg_text = ""


func sync_to_editor_formatter() -> void:
if not svg_text.is_empty():
sync_elements()

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)
Expand Down
2 changes: 1 addition & 1 deletion src/config_classes/SaveData.gd
Original file line number Diff line number Diff line change
Expand Up @@ -511,7 +511,7 @@ func set_palettes(new_palettes: Array[Palette]) -> void:
editor_formatter = new_value
emit_changed()
editor_formatter.changed.connect(emit_changed)
editor_formatter.changed_deferred.connect(State.sync_elements)
editor_formatter.changed_deferred.connect(State.sync_to_editor_formatter)

@export var export_formatter: Formatter = null:
set(new_value):
Expand Down
8 changes: 5 additions & 3 deletions src/ui_parts/code_editor.gd
Original file line number Diff line number Diff line change
Expand Up @@ -52,20 +52,22 @@ func setup_theme() -> void:
# Make it so the scrollbar doesn't overlap with the code editor's border.
var scrollbar := code_edit.get_v_scroll_bar()
scrollbar.begin_bulk_theme_override()
const CONST_ARR_2: PackedStringArray = ["normal", "focus", "hover"]
const CONST_ARR_2: PackedStringArray = ["grabber", "grabber_highlight", "grabber_pressed"]
for theme_type in CONST_ARR_2:
var stylebox := get_theme_stylebox(theme_type, "VScrollBar").duplicate()
# TODO No idea why I need to adjust it for the TextEdit, maybe a Godot issue.
stylebox.expand_margin_right = -2.0
stylebox.expand_margin_bottom = 2.0
scrollbar.add_theme_stylebox_override(theme_type, stylebox)
var bg_stylebox := get_theme_stylebox("scroll", "VScrollBar").duplicate()
bg_stylebox.expand_margin_right = -2.0
bg_stylebox.expand_margin_bottom = 2.0
bg_stylebox.content_margin_left += 1.0
bg_stylebox.content_margin_right += 1.0
scrollbar.add_theme_stylebox_override("scroll", bg_stylebox)
scrollbar.end_bulk_theme_override()

error_label.add_theme_color_override("default_color",
Configs.savedata.basic_color_error)
error_label.add_theme_color_override("default_color", Configs.savedata.basic_color_error)
var panel_stylebox := get_theme_stylebox("panel", "PanelContainer")
# Set up the top panel.
var top_stylebox := panel_stylebox.duplicate()
Expand Down
2 changes: 1 addition & 1 deletion src/ui_parts/display_texture.gd
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,6 @@ func _update() -> void:
var img := Image.new()
var err := img.load_svg_from_string(svg_text, image_zoom)
if err == OK:
position = display_rect.position
Utils.set_control_position_fixed(self, display_rect.position)
set_deferred("size", display_rect.size)
texture = ImageTexture.create_from_image(img)
105 changes: 92 additions & 13 deletions src/ui_parts/handles_manager.gd
Original file line number Diff line number Diff line change
Expand Up @@ -196,6 +196,9 @@ func _draw() -> void:
var selected_multiline := PackedVector2Array()
var hovered_multiline := PackedVector2Array()
var hovered_selected_multiline := PackedVector2Array()
# Store bounding rects and the transforms needed for them.
var selection_transforms: Array[Transform2D] = []
var selection_rects: Array[Rect2] = []

for element: Element in State.root_element.get_all_valid_element_descendants():
# Determine if the element is hovered/selected or has a hovered/selected parent.
Expand Down Expand Up @@ -231,6 +234,20 @@ func _draw() -> void:
else:
normal_polylines.append(points)
normal_multiline += extras

if element_selected:
var bounding_box: Rect2 = element.get_bounding_box()
if bounding_box.has_area():
var element_transform := element.get_transform()
var canvas_transform := State.root_element.canvas_transform
var canvas_scale := canvas_transform.get_scale().x
var element_scale := element_transform.get_scale()
var grow_amount_unscaled := 4.0 / State.zoom / canvas_scale
var grow_amount_x := grow_amount_unscaled / element_scale.x
var grow_amount_y := grow_amount_unscaled / element_scale.y
selection_transforms.append(canvas_transform * element_transform)
selection_rects.append(bounding_box.grow_individual(grow_amount_x,
grow_amount_y, grow_amount_x, grow_amount_y))

"ellipse":
var c := Vector2(element.get_attribute_num("cx"),
Expand Down Expand Up @@ -260,6 +277,20 @@ func _draw() -> void:
else:
normal_polylines.append(points)
normal_multiline += extras

if element_selected:
var bounding_box: Rect2 = element.get_bounding_box()
if bounding_box.has_area():
var element_transform := element.get_transform()
var canvas_transform := State.root_element.canvas_transform
var canvas_scale := canvas_transform.get_scale().x
var element_scale := element_transform.get_scale()
var grow_amount_unscaled := 4.0 / State.zoom / canvas_scale
var grow_amount_x := grow_amount_unscaled / element_scale.x
var grow_amount_y := grow_amount_unscaled / element_scale.y
selection_transforms.append(canvas_transform * element_transform)
selection_rects.append(bounding_box.grow_individual(grow_amount_x,
grow_amount_y, grow_amount_x, grow_amount_y))

"rect":
var x := element.get_attribute_num("x")
Expand Down Expand Up @@ -323,6 +354,20 @@ func _draw() -> void:
else:
normal_polylines.append(points)
normal_multiline += extras

if element_selected:
var bounding_box: Rect2 = element.get_bounding_box()
if bounding_box.has_area():
var element_transform := element.get_transform()
var canvas_transform := State.root_element.canvas_transform
var canvas_scale := canvas_transform.get_scale().x
var element_scale := element_transform.get_scale()
var grow_amount_unscaled := 4.0 / State.zoom / canvas_scale
var grow_amount_x := grow_amount_unscaled / element_scale.x
var grow_amount_y := grow_amount_unscaled / element_scale.y
selection_transforms.append(canvas_transform * element_transform)
selection_rects.append(bounding_box.grow_individual(grow_amount_x,
grow_amount_y, grow_amount_x, grow_amount_y))

"line":
var x1 := element.get_attribute_num("x1")
Expand All @@ -341,6 +386,20 @@ func _draw() -> void:
selected_polylines.append(points)
else:
normal_polylines.append(points)

if element_selected:
var bounding_box: Rect2 = element.get_bounding_box()
if bounding_box.has_area():
var element_transform := element.get_transform()
var canvas_transform := State.root_element.canvas_transform
var canvas_scale := canvas_transform.get_scale().x
var element_scale := element_transform.get_scale()
var grow_amount_unscaled := 4.0 / State.zoom / canvas_scale
var grow_amount_x := grow_amount_unscaled / element_scale.x
var grow_amount_y := grow_amount_unscaled / element_scale.y
selection_transforms.append(canvas_transform * element_transform)
selection_rects.append(bounding_box.grow_individual(grow_amount_x,
grow_amount_y, grow_amount_x, grow_amount_y))

"polygon", "polyline":
var point_list := ListParser.list_to_points(element.get_attribute_list("points"))
Expand Down Expand Up @@ -387,6 +446,20 @@ func _draw() -> void:
selected_polylines.append(points)
Utils.InteractionType.HOVERED_SELECTED:
hovered_selected_polylines.append(points)

if element_selected:
var bounding_box: Rect2 = element.get_bounding_box()
if bounding_box.has_area():
var element_transform := element.get_transform()
var canvas_transform := State.root_element.canvas_transform
var canvas_scale := canvas_transform.get_scale().x
var element_scale := element_transform.get_scale()
var grow_amount_unscaled := 4.0 / State.zoom / canvas_scale
var grow_amount_x := grow_amount_unscaled / element_scale.x
var grow_amount_y := grow_amount_unscaled / element_scale.y
selection_transforms.append(canvas_transform * element_transform)
selection_rects.append(bounding_box.grow_individual(grow_amount_x,
grow_amount_y, grow_amount_x, grow_amount_y))

"path":
var pathdata: AttributePathdata = element.get_attribute("d")
Expand Down Expand Up @@ -593,6 +666,20 @@ func _draw() -> void:
Utils.InteractionType.HOVERED_SELECTED:
hovered_selected_polylines.append(points)
hovered_selected_multiline += tangent_points

if element_selected:
var bounding_box: Rect2 = element.get_bounding_box()
if bounding_box.has_area():
var element_transform := element.get_transform()
var canvas_transform := State.root_element.canvas_transform
var canvas_scale := canvas_transform.get_scale().x
var element_scale := element_transform.get_scale()
var grow_amount_unscaled := 4.0 / State.zoom / canvas_scale
var grow_amount_x := grow_amount_unscaled / element_scale.x
var grow_amount_y := grow_amount_unscaled / element_scale.y
selection_transforms.append(canvas_transform * element_transform)
selection_rects.append(bounding_box.grow_individual(grow_amount_x,
grow_amount_y, grow_amount_x, grow_amount_y))

draw_set_transform_matrix(State.root_element.canvas_transform)
RenderingServer.canvas_item_set_transform(surface, Transform2D(0.0,
Expand Down Expand Up @@ -634,19 +721,11 @@ func _draw() -> void:
hovered_selected_multiline, hovered_selected_handles,
hovered_selected_handle_textures)

for xid in State.selected_xids:
var xnode := State.root_element.get_xnode(xid)
if xnode.is_element() and DB.is_attribute_recognized(xnode.name, "transform"):
var bounding_box: Rect2 = xnode.get_bounding_box()
if bounding_box.has_area():
RenderingServer.canvas_item_add_set_transform(selections_surface,
State.root_element.canvas_transform * xnode.get_transform())
var grow_amount := Vector2(4, 4) / State.zoom
grow_amount /= State.root_element.canvas_transform.get_scale()
grow_amount /= xnode.get_transform().get_scale()
RenderingServer.canvas_item_add_rect(selections_surface,
bounding_box.grow_individual(grow_amount.x, grow_amount.y,
grow_amount.x, grow_amount.y), Color.WHITE)
for idx in selection_rects.size():
RenderingServer.canvas_item_add_set_transform(selections_surface,
selection_transforms[idx])
RenderingServer.canvas_item_add_rect(selections_surface, selection_rects[idx],
Color.WHITE)

func draw_objects_of_type(color: Color, polylines: Array[PackedVector2Array],
multiline: PackedVector2Array, handles_array: Array[Handle],
Expand Down
4 changes: 4 additions & 0 deletions src/ui_parts/tab_bar.gd
Original file line number Diff line number Diff line change
Expand Up @@ -192,6 +192,10 @@ func _gui_input(event: InputEvent) -> void:
var btn_arr: Array[Button] = []

if hovered_idx == -1:
if get_add_button_rect().has_point(event.position) or\
get_scroll_forwards_area_rect().has_point(event.position) or\
get_scroll_backwards_area_rect().has_point(event.position):
return
btn_arr.append(ContextPopup.create_shortcut_button("new_tab"))
else:
var new_active_tab := Configs.savedata.get_tab(hovered_idx)
Expand Down
36 changes: 19 additions & 17 deletions src/ui_widgets/camera.gd
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
extends Control

const ticks_interval = 4
const TICKS_INTERVAL = 4
const TICK_DISTANCE = float(TICKS_INTERVAL)

var axis_line_color: Color
var major_grid_color: Color
Expand All @@ -21,13 +22,12 @@ var unsnapped_position: Vector2
func _ready() -> void:
Configs.grid_color_changed.connect(setup_grid_color)
setup_grid_color()
State.show_grid_changed.connect(update_show_grid)
update_show_grid()
RenderingServer.canvas_item_set_parent(surface, ci)
State.svg_resized.connect(queue_redraw)
State.zoom_changed.connect(change_zoom)
State.zoom_changed.connect(queue_redraw)

State.show_grid_changed.connect(update_show_grid)
update_show_grid()

func exit_tree() -> void:
RenderingServer.free_rid(surface)
Expand All @@ -42,7 +42,7 @@ func update_show_grid() -> void:
func update() -> void:
var new_position := unsnapped_position.snapped(Vector2(1, 1) / zoom)
if position != new_position:
position = unsnapped_position.snapped(Vector2(1, 1) / zoom)
Utils.set_control_position_fixed(self, new_position)
State.view_changed.emit()

get_viewport().canvas_transform = Transform2D(0.0, Vector2(zoom, zoom),
Expand All @@ -60,22 +60,21 @@ func _draw() -> void:

var major_points := PackedVector2Array()
var minor_points := PackedVector2Array()
var x_offset := fmod(-position.x, 1.0)
var y_offset := fmod(-position.y, 1.0)
var tick_distance := float(ticks_interval)
var draw_minor_lines := zoom >= 8.0
var mark_pixel_lines := zoom >= 128.0
var rate := nearest_po2(roundi(maxf(64.0 / (ticks_interval * zoom), 1.0)))
@warning_ignore("integer_division")
var rate := nearest_po2(roundi(maxf(128.0 / (TICKS_INTERVAL * zoom), 2.0))) / 2

# The grid lines are always 1px wide, but the numbers need to be resized.
RenderingServer.canvas_item_clear(surface)
RenderingServer.canvas_item_set_transform(surface,
Transform2D(0, Vector2(1, 1) / zoom, 0, Vector2.ZERO))

var i := x_offset
var i := fmod(-position.x, 1.0)
var major_line_h_offset := fposmod(-position.x, TICK_DISTANCE)
# Horizontal offset.
while i <= grid_size.x:
if fposmod(-position.x, tick_distance) != fposmod(i, tick_distance):
if major_line_h_offset != fposmod(i, TICK_DISTANCE):
if draw_minor_lines:
minor_points.append(Vector2(i, 0))
minor_points.append(Vector2(i, grid_size.y))
Expand All @@ -84,8 +83,8 @@ func _draw() -> void:
String.num_int64(floori(i + position.x)),
HORIZONTAL_ALIGNMENT_LEFT, -1, 14, axis_line_color)
else:
var coord := snappedi(i + position.x, ticks_interval)
if int(float(coord) / ticks_interval) % rate == 0:
var coord := snappedi(i + position.x, TICKS_INTERVAL)
if int(coord / TICK_DISTANCE) % rate == 0:
major_points.append(Vector2(i, 0))
major_points.append(Vector2(i, grid_size.y))
ThemeUtils.regular_font.draw_string(surface, Vector2(i * zoom + 4, 14),
Expand All @@ -95,10 +94,12 @@ func _draw() -> void:
minor_points.append(Vector2(i, 0))
minor_points.append(Vector2(i, grid_size.y))
i += 1.0
i = y_offset

i = fmod(-position.y, 1.0)
var major_line_v_offset := fposmod(-position.y, TICK_DISTANCE)
# Vertical offset.
while i < grid_size.y:
if fposmod(-position.y, tick_distance) != fposmod(i, tick_distance):
if major_line_v_offset != fposmod(i, TICK_DISTANCE):
if draw_minor_lines:
minor_points.append(Vector2(0, i))
minor_points.append(Vector2(grid_size.x, i))
Expand All @@ -107,8 +108,8 @@ func _draw() -> void:
String.num_int64(floori(i + position.y)),
HORIZONTAL_ALIGNMENT_LEFT, -1, 14, axis_line_color)
else:
var coord := snappedi(i + position.y, ticks_interval)
if int(coord / float(ticks_interval)) % rate == 0:
var coord := snappedi(i + position.y, TICKS_INTERVAL)
if int(coord / TICK_DISTANCE) % rate == 0:
major_points.append(Vector2(0, i))
major_points.append(Vector2(grid_size.x, i))
ThemeUtils.regular_font.draw_string(surface, Vector2(4, i * zoom + 14),
Expand All @@ -118,6 +119,7 @@ func _draw() -> void:
minor_points.append(Vector2(0, i))
minor_points.append(Vector2(grid_size.x, i))
i += 1.0

if not major_points.is_empty():
draw_multiline(major_points, major_grid_color)
if not minor_points.is_empty():
Expand Down
Loading