1
0
Fork 0
mirror of https://github.com/Orama-Interactive/Pixelorama.git synced 2025-01-18 17:19:50 +00:00

Implement the ability to change the font of a 3D text

This code will also be useful for the text tool
This commit is contained in:
Emmanouil Papadeas 2024-10-12 16:30:16 +03:00
parent b52cdc6e7b
commit 1ed52903b3
5 changed files with 79 additions and 19 deletions

View file

@ -828,6 +828,10 @@ msgstr ""
msgid "Display scale:" msgid "Display scale:"
msgstr "" msgstr ""
#. Refers to the font of a text.
msgid "Font:"
msgstr ""
#. Found in the preferences, under the interface section. Allows users to set the size of the font, ie the text. #. Found in the preferences, under the interface section. Allows users to set the size of the font, ie the text.
msgid "Font size:" msgid "Font size:"
msgstr "" msgstr ""

View file

@ -163,6 +163,9 @@ var default_layouts: Array[DockableLayout] = [
preload("res://assets/layouts/Tallscreen.tres"), preload("res://assets/layouts/Tallscreen.tres"),
] ]
var layouts: Array[DockableLayout] = [] var layouts: Array[DockableLayout] = []
var loaded_fonts: Array[Font] = [
ThemeDB.fallback_font, preload("res://assets/fonts/Roboto-Regular.ttf")
]
# Canvas related stuff # Canvas related stuff
## Tells if the user allowed to draw on the canvas. Usually it is temporarily set to ## Tells if the user allowed to draw on the canvas. Usually it is temporarily set to
@ -604,7 +607,6 @@ var cel_button_scene: PackedScene = load("res://src/UI/Timeline/CelButton.tscn")
## The control node (aka Main node). It has the [param Main.gd] script attached. ## The control node (aka Main node). It has the [param Main.gd] script attached.
@onready var control := get_tree().current_scene as Control @onready var control := get_tree().current_scene as Control
## The project tabs bar. It has the [param Tabs.gd] script attached. ## The project tabs bar. It has the [param Tabs.gd] script attached.
@onready var tabs: TabBar = control.find_child("TabBar") @onready var tabs: TabBar = control.find_child("TabBar")
## Contains viewport of the main canvas. It has the [param ViewportContainer.gd] script attached. ## Contains viewport of the main canvas. It has the [param ViewportContainer.gd] script attached.
@ -617,7 +619,6 @@ var cel_button_scene: PackedScene = load("res://src/UI/Timeline/CelButton.tscn")
@onready var camera: CanvasCamera = main_viewport.find_child("Camera2D") @onready var camera: CanvasCamera = main_viewport.find_child("Camera2D")
## Transparent checker of the main canvas. It has the [param TransparentChecker.gd] script attached. ## Transparent checker of the main canvas. It has the [param TransparentChecker.gd] script attached.
@onready var transparent_checker: ColorRect = control.find_child("TransparentChecker") @onready var transparent_checker: ColorRect = control.find_child("TransparentChecker")
## The perspective editor. It has the [param PerspectiveEditor.gd] script attached. ## The perspective editor. It has the [param PerspectiveEditor.gd] script attached.
@onready var perspective_editor := control.find_child("Perspective Editor") @onready var perspective_editor := control.find_child("Perspective Editor")
## The top menu container. It has the [param TopMenuContainer.gd] script attached. ## The top menu container. It has the [param TopMenuContainer.gd] script attached.
@ -634,7 +635,6 @@ var cel_button_scene: PackedScene = load("res://src/UI/Timeline/CelButton.tscn")
@onready var cel_vbox: VBoxContainer = animation_timeline.find_child("CelVBox") @onready var cel_vbox: VBoxContainer = animation_timeline.find_child("CelVBox")
## The container of animation tags. ## The container of animation tags.
@onready var tag_container: Control = animation_timeline.find_child("TagContainer") @onready var tag_container: Control = animation_timeline.find_child("TagContainer")
## The brushes popup dialog used to display brushes. ## The brushes popup dialog used to display brushes.
## It has the [param BrushesPopup.gd] script attached. ## It has the [param BrushesPopup.gd] script attached.
@onready var brushes_popup: Popup = control.find_child("BrushesPopup") @onready var brushes_popup: Popup = control.find_child("BrushesPopup")
@ -1028,6 +1028,32 @@ func find_nearest_locale(locale: String) -> String:
return closest_locale return closest_locale
func get_available_font_names() -> PackedStringArray:
var font_names := PackedStringArray()
for font in loaded_fonts:
var font_name := font.get_font_name()
if font_name in font_names:
continue
font_names.append(font_name)
for system_font_name in OS.get_system_fonts():
if system_font_name in font_names:
continue
font_names.append(system_font_name)
return font_names
func find_font_from_name(font_name: String) -> Font:
for font in loaded_fonts:
if font.get_font_name() == font_name:
return font
for system_font_name in OS.get_system_fonts():
if system_font_name == font_name:
var system_font := SystemFont.new()
system_font.font_names = [font_name]
return system_font
return ThemeDB.fallback_font
## Used by undo/redo operations to store compressed images in memory. ## Used by undo/redo operations to store compressed images in memory.
## [param redo_data] and [param undo_data] are Dictionaries, ## [param redo_data] and [param undo_data] are Dictionaries,
## with keys of type [Image] and [Dictionary] values, coming from [member Image.data]. ## with keys of type [Image] and [Dictionary] values, coming from [member Image.data].

View file

@ -93,6 +93,7 @@ func serialize() -> Dictionary:
dict["mesh_ring_segments"] = mesh.ring_segments dict["mesh_ring_segments"] = mesh.ring_segments
dict["mesh_rings"] = mesh.rings dict["mesh_rings"] = mesh.rings
Type.TEXT: Type.TEXT:
dict["mesh_font_name"] = mesh.font.get_font_name()
dict["mesh_text"] = mesh.text dict["mesh_text"] = mesh.text
dict["mesh_pixel_size"] = mesh.pixel_size dict["mesh_pixel_size"] = mesh.pixel_size
dict["mesh_font_size"] = mesh.font_size dict["mesh_font_size"] = mesh.font_size
@ -156,6 +157,7 @@ func deserialize(dict: Dictionary) -> void:
mesh.ring_segments = dict["mesh_ring_segments"] mesh.ring_segments = dict["mesh_ring_segments"]
mesh.rings = dict["mesh_rings"] mesh.rings = dict["mesh_rings"]
Type.TEXT: Type.TEXT:
mesh.font = Global.find_font_from_name(dict["mesh_font_name"])
mesh.text = dict["mesh_text"] mesh.text = dict["mesh_text"]
mesh.pixel_size = dict["mesh_pixel_size"] mesh.pixel_size = dict["mesh_pixel_size"]
mesh.font_size = dict["mesh_font_size"] mesh.font_size = dict["mesh_font_size"]

View file

@ -58,6 +58,7 @@ var _object_names := {
"node3d_type:mesh:top_radius": $"%MeshTopRadius", "node3d_type:mesh:top_radius": $"%MeshTopRadius",
"node3d_type:mesh:bottom_radius": $"%MeshBottomRadius", "node3d_type:mesh:bottom_radius": $"%MeshBottomRadius",
"node3d_type:mesh:text": $"%MeshText", "node3d_type:mesh:text": $"%MeshText",
"node3d_type:mesh:font": $"%MeshFont",
"node3d_type:mesh:pixel_size": $"%MeshPixelSize", "node3d_type:mesh:pixel_size": $"%MeshPixelSize",
"node3d_type:mesh:font_size": $"%MeshFontSize", "node3d_type:mesh:font_size": $"%MeshFontSize",
"node3d_type:mesh:offset": $"%MeshOffsetV2", "node3d_type:mesh:offset": $"%MeshOffsetV2",
@ -98,6 +99,10 @@ func _ready() -> void:
for object in _object_names: for object in _object_names:
new_object_popup.add_item(_object_names[object], object) new_object_popup.add_item(_object_names[object], object)
new_object_popup.id_pressed.connect(_new_object_popup_id_pressed) new_object_popup.id_pressed.connect(_new_object_popup_id_pressed)
# Load font names
for font_name in Global.get_available_font_names():
$"%MeshFont".add_item(font_name)
# Connect the signals of the cel property nodes
for prop in cel_properties: for prop in cel_properties:
var node: Control = cel_properties[prop] var node: Control = cel_properties[prop]
if node is ValueSliderV3: if node is ValueSliderV3:
@ -108,6 +113,7 @@ func _ready() -> void:
node.item_selected.connect(_cel_property_item_selected.bind(prop)) node.item_selected.connect(_cel_property_item_selected.bind(prop))
elif node is ColorPickerButton: elif node is ColorPickerButton:
node.color_changed.connect(_cel_property_color_changed.bind(prop)) node.color_changed.connect(_cel_property_color_changed.bind(prop))
# Connect the signals of the object property nodes
for prop in object_properties: for prop in object_properties:
var node: Control = object_properties[prop] var node: Control = object_properties[prop]
if node is ValueSliderV3: if node is ValueSliderV3:
@ -365,6 +371,13 @@ func _set_node_values(to_edit: Object, properties: Dictionary) -> void:
continue continue
if "scale" in prop: if "scale" in prop:
value *= 100 value *= 100
if value is Font:
var font_name: String = value.get_font_name()
value = 0
for i in %MeshFont.item_count:
var item_name: String = %MeshFont.get_item_text(i)
if font_name == item_name:
value = i
var node: Control = properties[prop] var node: Control = properties[prop]
if node is Range or node is ValueSliderV3 or node is ValueSliderV2: if node is Range or node is ValueSliderV3 or node is ValueSliderV2:
if typeof(node.value) != typeof(value) and typeof(value) != TYPE_INT: if typeof(node.value) != typeof(value) and typeof(value) != TYPE_INT:
@ -393,6 +406,8 @@ func _set_value_from_node(to_edit: Object, value, prop: String) -> void:
to_edit = to_edit.node3d_type.mesh to_edit = to_edit.node3d_type.mesh
if "scale" in prop: if "scale" in prop:
value /= 100 value /= 100
if "font" in prop and not "font_" in prop:
value = Global.find_font_from_name(%MeshFont.get_item_text(value))
to_edit.set_indexed(prop, value) to_edit.set_indexed(prop, value)

View file

@ -510,13 +510,26 @@ custom_minimum_size = Vector2(150, 50)
layout_mode = 2 layout_mode = 2
size_flags_horizontal = 3 size_flags_horizontal = 3
[node name="MeshPixelSizeLabel" type="Label" parent="ObjectOptions/MeshOptions/GridContainer" index="22"] [node name="MeshFontLabel" type="Label" parent="ObjectOptions/MeshOptions/GridContainer" index="22"]
layout_mode = 2
size_flags_horizontal = 3
text = "Font:"
clip_text = true
[node name="MeshFont" type="OptionButton" parent="ObjectOptions/MeshOptions/GridContainer" index="23"]
unique_name_in_owner = true
layout_mode = 2
size_flags_horizontal = 3
mouse_default_cursor_shape = 2
selected = 0
[node name="MeshPixelSizeLabel" type="Label" parent="ObjectOptions/MeshOptions/GridContainer" index="24"]
layout_mode = 2 layout_mode = 2
size_flags_horizontal = 3 size_flags_horizontal = 3
text = "Pixel size:" text = "Pixel size:"
clip_text = true clip_text = true
[node name="MeshPixelSize" type="TextureProgressBar" parent="ObjectOptions/MeshOptions/GridContainer" index="23"] [node name="MeshPixelSize" type="TextureProgressBar" parent="ObjectOptions/MeshOptions/GridContainer" index="25"]
unique_name_in_owner = true unique_name_in_owner = true
layout_mode = 2 layout_mode = 2
size_flags_horizontal = 3 size_flags_horizontal = 3
@ -536,13 +549,13 @@ stretch_margin_bottom = 3
script = ExtResource("5") script = ExtResource("5")
snap_step = 0.01 snap_step = 0.01
[node name="MeshFontSizeLabel" type="Label" parent="ObjectOptions/MeshOptions/GridContainer" index="24"] [node name="MeshFontSizeLabel" type="Label" parent="ObjectOptions/MeshOptions/GridContainer" index="26"]
layout_mode = 2 layout_mode = 2
size_flags_horizontal = 3 size_flags_horizontal = 3
text = "Font size:" text = "Font size:"
clip_text = true clip_text = true
[node name="MeshFontSize" type="TextureProgressBar" parent="ObjectOptions/MeshOptions/GridContainer" index="25"] [node name="MeshFontSize" type="TextureProgressBar" parent="ObjectOptions/MeshOptions/GridContainer" index="27"]
unique_name_in_owner = true unique_name_in_owner = true
layout_mode = 2 layout_mode = 2
size_flags_horizontal = 3 size_flags_horizontal = 3
@ -561,13 +574,13 @@ stretch_margin_bottom = 3
script = ExtResource("5") script = ExtResource("5")
snap_step = 2.0 snap_step = 2.0
[node name="MeshDepthLabel" type="Label" parent="ObjectOptions/MeshOptions/GridContainer" index="26"] [node name="MeshDepthLabel" type="Label" parent="ObjectOptions/MeshOptions/GridContainer" index="28"]
layout_mode = 2 layout_mode = 2
size_flags_horizontal = 3 size_flags_horizontal = 3
text = "Depth:" text = "Depth:"
clip_text = true clip_text = true
[node name="MeshDepth" type="TextureProgressBar" parent="ObjectOptions/MeshOptions/GridContainer" index="27"] [node name="MeshDepth" type="TextureProgressBar" parent="ObjectOptions/MeshOptions/GridContainer" index="29"]
unique_name_in_owner = true unique_name_in_owner = true
layout_mode = 2 layout_mode = 2
size_flags_horizontal = 3 size_flags_horizontal = 3
@ -585,13 +598,13 @@ stretch_margin_bottom = 3
script = ExtResource("5") script = ExtResource("5")
snap_step = 2.0 snap_step = 2.0
[node name="MeshOffsetLabel" type="Label" parent="ObjectOptions/MeshOptions/GridContainer" index="28"] [node name="MeshOffsetLabel" type="Label" parent="ObjectOptions/MeshOptions/GridContainer" index="30"]
layout_mode = 2 layout_mode = 2
size_flags_horizontal = 3 size_flags_horizontal = 3
text = "Offset:" text = "Offset:"
clip_text = true clip_text = true
[node name="MeshOffsetV2" parent="ObjectOptions/MeshOptions/GridContainer" index="29" instance=ExtResource("3")] [node name="MeshOffsetV2" parent="ObjectOptions/MeshOptions/GridContainer" index="31" instance=ExtResource("3")]
unique_name_in_owner = true unique_name_in_owner = true
layout_mode = 2 layout_mode = 2
size_flags_horizontal = 3 size_flags_horizontal = 3
@ -601,13 +614,13 @@ allow_lesser = true
show_ratio = true show_ratio = true
snap_step = 0.01 snap_step = 0.01
[node name="MeshCurveStepLabel" type="Label" parent="ObjectOptions/MeshOptions/GridContainer" index="30"] [node name="MeshCurveStepLabel" type="Label" parent="ObjectOptions/MeshOptions/GridContainer" index="32"]
layout_mode = 2 layout_mode = 2
size_flags_horizontal = 3 size_flags_horizontal = 3
text = "Curve step:" text = "Curve step:"
clip_text = true clip_text = true
[node name="MeshCurveStep" type="TextureProgressBar" parent="ObjectOptions/MeshOptions/GridContainer" index="31"] [node name="MeshCurveStep" type="TextureProgressBar" parent="ObjectOptions/MeshOptions/GridContainer" index="33"]
unique_name_in_owner = true unique_name_in_owner = true
layout_mode = 2 layout_mode = 2
size_flags_horizontal = 3 size_flags_horizontal = 3
@ -626,13 +639,13 @@ stretch_margin_right = 3
stretch_margin_bottom = 3 stretch_margin_bottom = 3
script = ExtResource("5") script = ExtResource("5")
[node name="MeshHorizontalAlignmentLabel" type="Label" parent="ObjectOptions/MeshOptions/GridContainer" index="32"] [node name="MeshHorizontalAlignmentLabel" type="Label" parent="ObjectOptions/MeshOptions/GridContainer" index="34"]
layout_mode = 2 layout_mode = 2
size_flags_horizontal = 3 size_flags_horizontal = 3
text = "Horizontal alignment:" text = "Horizontal alignment:"
clip_text = true clip_text = true
[node name="MeshHorizontalAlignment" type="OptionButton" parent="ObjectOptions/MeshOptions/GridContainer" index="33"] [node name="MeshHorizontalAlignment" type="OptionButton" parent="ObjectOptions/MeshOptions/GridContainer" index="35"]
unique_name_in_owner = true unique_name_in_owner = true
layout_mode = 2 layout_mode = 2
size_flags_horizontal = 3 size_flags_horizontal = 3
@ -647,13 +660,13 @@ popup/item_2/id = 2
popup/item_3/text = "Fill" popup/item_3/text = "Fill"
popup/item_3/id = 3 popup/item_3/id = 3
[node name="MeshVerticalAlignmentLabel" type="Label" parent="ObjectOptions/MeshOptions/GridContainer" index="34"] [node name="MeshVerticalAlignmentLabel" type="Label" parent="ObjectOptions/MeshOptions/GridContainer" index="36"]
layout_mode = 2 layout_mode = 2
size_flags_horizontal = 3 size_flags_horizontal = 3
text = "Vertical alignment:" text = "Vertical alignment:"
clip_text = true clip_text = true
[node name="MeshVerticalAlignment" type="OptionButton" parent="ObjectOptions/MeshOptions/GridContainer" index="35"] [node name="MeshVerticalAlignment" type="OptionButton" parent="ObjectOptions/MeshOptions/GridContainer" index="37"]
unique_name_in_owner = true unique_name_in_owner = true
layout_mode = 2 layout_mode = 2
size_flags_horizontal = 3 size_flags_horizontal = 3
@ -666,13 +679,13 @@ popup/item_1/id = 1
popup/item_2/text = "Bottom" popup/item_2/text = "Bottom"
popup/item_2/id = 2 popup/item_2/id = 2
[node name="MeshLineSpacingLabel" type="Label" parent="ObjectOptions/MeshOptions/GridContainer" index="36"] [node name="MeshLineSpacingLabel" type="Label" parent="ObjectOptions/MeshOptions/GridContainer" index="38"]
layout_mode = 2 layout_mode = 2
size_flags_horizontal = 3 size_flags_horizontal = 3
text = "Line spacing:" text = "Line spacing:"
clip_text = true clip_text = true
[node name="MeshLineSpacing" type="TextureProgressBar" parent="ObjectOptions/MeshOptions/GridContainer" index="37"] [node name="MeshLineSpacing" type="TextureProgressBar" parent="ObjectOptions/MeshOptions/GridContainer" index="39"]
unique_name_in_owner = true unique_name_in_owner = true
layout_mode = 2 layout_mode = 2
size_flags_horizontal = 3 size_flags_horizontal = 3