Skip to content

Commit 61546ab

Browse files
Update from upstream (#31)
Sync selection rects with the new drawing logic (1349) Poedit view source workaround (1350) Fix tab bar empty space right click popup when pressing buttons (1352) Update de.po (1353) Optimize camera grid drawing and multiple parses (1354) Somewhat fix instabilities at big coordinates (1355) Multi imports on web (1356)
1 parent 190b6cc commit 61546ab

File tree

23 files changed

+4207
-4006
lines changed

23 files changed

+4207
-4006
lines changed

godot_only/scripts/update_translations.gd

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,10 +84,10 @@ func search_directory(dir: String) -> void:
8484
for msg in messages:
8585
if msg.msgid == msgid:
8686
already_exists = true
87-
msg.files.append(full_file_name)
87+
msg.files.append(full_file_name + ":")
8888
break
8989
if not already_exists:
90-
messages.append(Message.new(msgid, PackedStringArray([full_file_name])))
90+
messages.append(Message.new(msgid, PackedStringArray([full_file_name + ":"])))
9191

9292

9393
func update_translations() -> void:

src/autoload/HandlerGUI.gd

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ func _notification(what: int) -> void:
4242
# Drag-and-drop of files.
4343
func _on_files_dropped(files: PackedStringArray) -> void:
4444
if menu_stack.is_empty():
45+
get_window().grab_focus()
4546
FileUtils.apply_svgs_from_paths(files)
4647

4748

@@ -359,15 +360,14 @@ func get_usable_rect() -> Vector2i:
359360
DisplayServer.window_get_current_screen()).size -\
360361
window.get_size_with_decorations() + window.size)
361362

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

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

372372
func get_auto_ui_scale() -> float:
373373
var dpi := DisplayServer.screen_get_dpi(DisplayServer.window_get_current_screen())

src/autoload/State.gd

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,10 @@ func _svg_save() -> void:
140140
last_saved_svg_text = ""
141141

142142

143+
func sync_to_editor_formatter() -> void:
144+
if not svg_text.is_empty():
145+
sync_elements()
146+
143147
func sync_elements() -> void:
144148
var text_to_parse := svg_text if unstable_svg_text.is_empty() else unstable_svg_text
145149
var svg_parse_result := SVGParser.text_to_root(text_to_parse)

src/config_classes/SaveData.gd

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -511,7 +511,7 @@ func set_palettes(new_palettes: Array[Palette]) -> void:
511511
editor_formatter = new_value
512512
emit_changed()
513513
editor_formatter.changed.connect(emit_changed)
514-
editor_formatter.changed_deferred.connect(State.sync_elements)
514+
editor_formatter.changed_deferred.connect(State.sync_to_editor_formatter)
515515

516516
@export var export_formatter: Formatter = null:
517517
set(new_value):

src/ui_parts/code_editor.gd

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,20 +52,22 @@ func setup_theme() -> void:
5252
# Make it so the scrollbar doesn't overlap with the code editor's border.
5353
var scrollbar := code_edit.get_v_scroll_bar()
5454
scrollbar.begin_bulk_theme_override()
55-
const CONST_ARR_2: PackedStringArray = ["normal", "focus", "hover"]
55+
const CONST_ARR_2: PackedStringArray = ["grabber", "grabber_highlight", "grabber_pressed"]
5656
for theme_type in CONST_ARR_2:
5757
var stylebox := get_theme_stylebox(theme_type, "VScrollBar").duplicate()
58+
# TODO No idea why I need to adjust it for the TextEdit, maybe a Godot issue.
5859
stylebox.expand_margin_right = -2.0
60+
stylebox.expand_margin_bottom = 2.0
5961
scrollbar.add_theme_stylebox_override(theme_type, stylebox)
6062
var bg_stylebox := get_theme_stylebox("scroll", "VScrollBar").duplicate()
6163
bg_stylebox.expand_margin_right = -2.0
64+
bg_stylebox.expand_margin_bottom = 2.0
6265
bg_stylebox.content_margin_left += 1.0
6366
bg_stylebox.content_margin_right += 1.0
6467
scrollbar.add_theme_stylebox_override("scroll", bg_stylebox)
6568
scrollbar.end_bulk_theme_override()
6669

67-
error_label.add_theme_color_override("default_color",
68-
Configs.savedata.basic_color_error)
70+
error_label.add_theme_color_override("default_color", Configs.savedata.basic_color_error)
6971
var panel_stylebox := get_theme_stylebox("panel", "PanelContainer")
7072
# Set up the top panel.
7173
var top_stylebox := panel_stylebox.duplicate()

src/ui_parts/display_texture.gd

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,6 @@ func _update() -> void:
4747
var img := Image.new()
4848
var err := img.load_svg_from_string(svg_text, image_zoom)
4949
if err == OK:
50-
position = display_rect.position
50+
Utils.set_control_position_fixed(self, display_rect.position)
5151
set_deferred("size", display_rect.size)
5252
texture = ImageTexture.create_from_image(img)

src/ui_parts/handles_manager.gd

Lines changed: 92 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,9 @@ func _draw() -> void:
196196
var selected_multiline := PackedVector2Array()
197197
var hovered_multiline := PackedVector2Array()
198198
var hovered_selected_multiline := PackedVector2Array()
199+
# Store bounding rects and the transforms needed for them.
200+
var selection_transforms: Array[Transform2D] = []
201+
var selection_rects: Array[Rect2] = []
199202

200203
for element: Element in State.root_element.get_all_valid_element_descendants():
201204
# Determine if the element is hovered/selected or has a hovered/selected parent.
@@ -231,6 +234,20 @@ func _draw() -> void:
231234
else:
232235
normal_polylines.append(points)
233236
normal_multiline += extras
237+
238+
if element_selected:
239+
var bounding_box: Rect2 = element.get_bounding_box()
240+
if bounding_box.has_area():
241+
var element_transform := element.get_transform()
242+
var canvas_transform := State.root_element.canvas_transform
243+
var canvas_scale := canvas_transform.get_scale().x
244+
var element_scale := element_transform.get_scale()
245+
var grow_amount_unscaled := 4.0 / State.zoom / canvas_scale
246+
var grow_amount_x := grow_amount_unscaled / element_scale.x
247+
var grow_amount_y := grow_amount_unscaled / element_scale.y
248+
selection_transforms.append(canvas_transform * element_transform)
249+
selection_rects.append(bounding_box.grow_individual(grow_amount_x,
250+
grow_amount_y, grow_amount_x, grow_amount_y))
234251

235252
"ellipse":
236253
var c := Vector2(element.get_attribute_num("cx"),
@@ -260,6 +277,20 @@ func _draw() -> void:
260277
else:
261278
normal_polylines.append(points)
262279
normal_multiline += extras
280+
281+
if element_selected:
282+
var bounding_box: Rect2 = element.get_bounding_box()
283+
if bounding_box.has_area():
284+
var element_transform := element.get_transform()
285+
var canvas_transform := State.root_element.canvas_transform
286+
var canvas_scale := canvas_transform.get_scale().x
287+
var element_scale := element_transform.get_scale()
288+
var grow_amount_unscaled := 4.0 / State.zoom / canvas_scale
289+
var grow_amount_x := grow_amount_unscaled / element_scale.x
290+
var grow_amount_y := grow_amount_unscaled / element_scale.y
291+
selection_transforms.append(canvas_transform * element_transform)
292+
selection_rects.append(bounding_box.grow_individual(grow_amount_x,
293+
grow_amount_y, grow_amount_x, grow_amount_y))
263294

264295
"rect":
265296
var x := element.get_attribute_num("x")
@@ -323,6 +354,20 @@ func _draw() -> void:
323354
else:
324355
normal_polylines.append(points)
325356
normal_multiline += extras
357+
358+
if element_selected:
359+
var bounding_box: Rect2 = element.get_bounding_box()
360+
if bounding_box.has_area():
361+
var element_transform := element.get_transform()
362+
var canvas_transform := State.root_element.canvas_transform
363+
var canvas_scale := canvas_transform.get_scale().x
364+
var element_scale := element_transform.get_scale()
365+
var grow_amount_unscaled := 4.0 / State.zoom / canvas_scale
366+
var grow_amount_x := grow_amount_unscaled / element_scale.x
367+
var grow_amount_y := grow_amount_unscaled / element_scale.y
368+
selection_transforms.append(canvas_transform * element_transform)
369+
selection_rects.append(bounding_box.grow_individual(grow_amount_x,
370+
grow_amount_y, grow_amount_x, grow_amount_y))
326371

327372
"line":
328373
var x1 := element.get_attribute_num("x1")
@@ -341,6 +386,20 @@ func _draw() -> void:
341386
selected_polylines.append(points)
342387
else:
343388
normal_polylines.append(points)
389+
390+
if element_selected:
391+
var bounding_box: Rect2 = element.get_bounding_box()
392+
if bounding_box.has_area():
393+
var element_transform := element.get_transform()
394+
var canvas_transform := State.root_element.canvas_transform
395+
var canvas_scale := canvas_transform.get_scale().x
396+
var element_scale := element_transform.get_scale()
397+
var grow_amount_unscaled := 4.0 / State.zoom / canvas_scale
398+
var grow_amount_x := grow_amount_unscaled / element_scale.x
399+
var grow_amount_y := grow_amount_unscaled / element_scale.y
400+
selection_transforms.append(canvas_transform * element_transform)
401+
selection_rects.append(bounding_box.grow_individual(grow_amount_x,
402+
grow_amount_y, grow_amount_x, grow_amount_y))
344403

345404
"polygon", "polyline":
346405
var point_list := ListParser.list_to_points(element.get_attribute_list("points"))
@@ -387,6 +446,20 @@ func _draw() -> void:
387446
selected_polylines.append(points)
388447
Utils.InteractionType.HOVERED_SELECTED:
389448
hovered_selected_polylines.append(points)
449+
450+
if element_selected:
451+
var bounding_box: Rect2 = element.get_bounding_box()
452+
if bounding_box.has_area():
453+
var element_transform := element.get_transform()
454+
var canvas_transform := State.root_element.canvas_transform
455+
var canvas_scale := canvas_transform.get_scale().x
456+
var element_scale := element_transform.get_scale()
457+
var grow_amount_unscaled := 4.0 / State.zoom / canvas_scale
458+
var grow_amount_x := grow_amount_unscaled / element_scale.x
459+
var grow_amount_y := grow_amount_unscaled / element_scale.y
460+
selection_transforms.append(canvas_transform * element_transform)
461+
selection_rects.append(bounding_box.grow_individual(grow_amount_x,
462+
grow_amount_y, grow_amount_x, grow_amount_y))
390463

391464
"path":
392465
var pathdata: AttributePathdata = element.get_attribute("d")
@@ -593,6 +666,20 @@ func _draw() -> void:
593666
Utils.InteractionType.HOVERED_SELECTED:
594667
hovered_selected_polylines.append(points)
595668
hovered_selected_multiline += tangent_points
669+
670+
if element_selected:
671+
var bounding_box: Rect2 = element.get_bounding_box()
672+
if bounding_box.has_area():
673+
var element_transform := element.get_transform()
674+
var canvas_transform := State.root_element.canvas_transform
675+
var canvas_scale := canvas_transform.get_scale().x
676+
var element_scale := element_transform.get_scale()
677+
var grow_amount_unscaled := 4.0 / State.zoom / canvas_scale
678+
var grow_amount_x := grow_amount_unscaled / element_scale.x
679+
var grow_amount_y := grow_amount_unscaled / element_scale.y
680+
selection_transforms.append(canvas_transform * element_transform)
681+
selection_rects.append(bounding_box.grow_individual(grow_amount_x,
682+
grow_amount_y, grow_amount_x, grow_amount_y))
596683

597684
draw_set_transform_matrix(State.root_element.canvas_transform)
598685
RenderingServer.canvas_item_set_transform(surface, Transform2D(0.0,
@@ -634,19 +721,11 @@ func _draw() -> void:
634721
hovered_selected_multiline, hovered_selected_handles,
635722
hovered_selected_handle_textures)
636723

637-
for xid in State.selected_xids:
638-
var xnode := State.root_element.get_xnode(xid)
639-
if xnode.is_element() and DB.is_attribute_recognized(xnode.name, "transform"):
640-
var bounding_box: Rect2 = xnode.get_bounding_box()
641-
if bounding_box.has_area():
642-
RenderingServer.canvas_item_add_set_transform(selections_surface,
643-
State.root_element.canvas_transform * xnode.get_transform())
644-
var grow_amount := Vector2(4, 4) / State.zoom
645-
grow_amount /= State.root_element.canvas_transform.get_scale()
646-
grow_amount /= xnode.get_transform().get_scale()
647-
RenderingServer.canvas_item_add_rect(selections_surface,
648-
bounding_box.grow_individual(grow_amount.x, grow_amount.y,
649-
grow_amount.x, grow_amount.y), Color.WHITE)
724+
for idx in selection_rects.size():
725+
RenderingServer.canvas_item_add_set_transform(selections_surface,
726+
selection_transforms[idx])
727+
RenderingServer.canvas_item_add_rect(selections_surface, selection_rects[idx],
728+
Color.WHITE)
650729

651730
func draw_objects_of_type(color: Color, polylines: Array[PackedVector2Array],
652731
multiline: PackedVector2Array, handles_array: Array[Handle],

src/ui_parts/tab_bar.gd

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,10 @@ func _gui_input(event: InputEvent) -> void:
192192
var btn_arr: Array[Button] = []
193193

194194
if hovered_idx == -1:
195+
if get_add_button_rect().has_point(event.position) or\
196+
get_scroll_forwards_area_rect().has_point(event.position) or\
197+
get_scroll_backwards_area_rect().has_point(event.position):
198+
return
195199
btn_arr.append(ContextPopup.create_shortcut_button("new_tab"))
196200
else:
197201
var new_active_tab := Configs.savedata.get_tab(hovered_idx)

src/ui_widgets/camera.gd

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
extends Control
22

3-
const ticks_interval = 4
3+
const TICKS_INTERVAL = 4
4+
const TICK_DISTANCE = float(TICKS_INTERVAL)
45

56
var axis_line_color: Color
67
var major_grid_color: Color
@@ -21,13 +22,12 @@ var unsnapped_position: Vector2
2122
func _ready() -> void:
2223
Configs.grid_color_changed.connect(setup_grid_color)
2324
setup_grid_color()
25+
State.show_grid_changed.connect(update_show_grid)
26+
update_show_grid()
2427
RenderingServer.canvas_item_set_parent(surface, ci)
2528
State.svg_resized.connect(queue_redraw)
2629
State.zoom_changed.connect(change_zoom)
2730
State.zoom_changed.connect(queue_redraw)
28-
29-
State.show_grid_changed.connect(update_show_grid)
30-
update_show_grid()
3131

3232
func exit_tree() -> void:
3333
RenderingServer.free_rid(surface)
@@ -42,7 +42,7 @@ func update_show_grid() -> void:
4242
func update() -> void:
4343
var new_position := unsnapped_position.snapped(Vector2(1, 1) / zoom)
4444
if position != new_position:
45-
position = unsnapped_position.snapped(Vector2(1, 1) / zoom)
45+
Utils.set_control_position_fixed(self, new_position)
4646
State.view_changed.emit()
4747

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

6161
var major_points := PackedVector2Array()
6262
var minor_points := PackedVector2Array()
63-
var x_offset := fmod(-position.x, 1.0)
64-
var y_offset := fmod(-position.y, 1.0)
65-
var tick_distance := float(ticks_interval)
6663
var draw_minor_lines := zoom >= 8.0
6764
var mark_pixel_lines := zoom >= 128.0
68-
var rate := nearest_po2(roundi(maxf(64.0 / (ticks_interval * zoom), 1.0)))
65+
@warning_ignore("integer_division")
66+
var rate := nearest_po2(roundi(maxf(128.0 / (TICKS_INTERVAL * zoom), 2.0))) / 2
6967

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

75-
var i := x_offset
73+
var i := fmod(-position.x, 1.0)
74+
var major_line_h_offset := fposmod(-position.x, TICK_DISTANCE)
7675
# Horizontal offset.
7776
while i <= grid_size.x:
78-
if fposmod(-position.x, tick_distance) != fposmod(i, tick_distance):
77+
if major_line_h_offset != fposmod(i, TICK_DISTANCE):
7978
if draw_minor_lines:
8079
minor_points.append(Vector2(i, 0))
8180
minor_points.append(Vector2(i, grid_size.y))
@@ -84,8 +83,8 @@ func _draw() -> void:
8483
String.num_int64(floori(i + position.x)),
8584
HORIZONTAL_ALIGNMENT_LEFT, -1, 14, axis_line_color)
8685
else:
87-
var coord := snappedi(i + position.x, ticks_interval)
88-
if int(float(coord) / ticks_interval) % rate == 0:
86+
var coord := snappedi(i + position.x, TICKS_INTERVAL)
87+
if int(coord / TICK_DISTANCE) % rate == 0:
8988
major_points.append(Vector2(i, 0))
9089
major_points.append(Vector2(i, grid_size.y))
9190
ThemeUtils.regular_font.draw_string(surface, Vector2(i * zoom + 4, 14),
@@ -95,10 +94,12 @@ func _draw() -> void:
9594
minor_points.append(Vector2(i, 0))
9695
minor_points.append(Vector2(i, grid_size.y))
9796
i += 1.0
98-
i = y_offset
97+
98+
i = fmod(-position.y, 1.0)
99+
var major_line_v_offset := fposmod(-position.y, TICK_DISTANCE)
99100
# Vertical offset.
100101
while i < grid_size.y:
101-
if fposmod(-position.y, tick_distance) != fposmod(i, tick_distance):
102+
if major_line_v_offset != fposmod(i, TICK_DISTANCE):
102103
if draw_minor_lines:
103104
minor_points.append(Vector2(0, i))
104105
minor_points.append(Vector2(grid_size.x, i))
@@ -107,8 +108,8 @@ func _draw() -> void:
107108
String.num_int64(floori(i + position.y)),
108109
HORIZONTAL_ALIGNMENT_LEFT, -1, 14, axis_line_color)
109110
else:
110-
var coord := snappedi(i + position.y, ticks_interval)
111-
if int(coord / float(ticks_interval)) % rate == 0:
111+
var coord := snappedi(i + position.y, TICKS_INTERVAL)
112+
if int(coord / TICK_DISTANCE) % rate == 0:
112113
major_points.append(Vector2(0, i))
113114
major_points.append(Vector2(grid_size.x, i))
114115
ThemeUtils.regular_font.draw_string(surface, Vector2(4, i * zoom + 14),
@@ -118,6 +119,7 @@ func _draw() -> void:
118119
minor_points.append(Vector2(0, i))
119120
minor_points.append(Vector2(grid_size.x, i))
120121
i += 1.0
122+
121123
if not major_points.is_empty():
122124
draw_multiline(major_points, major_grid_color)
123125
if not minor_points.is_empty():

0 commit comments

Comments
 (0)