Property definitions

gamnit $ TextSprites :: defaultinit
# Manage a set of sprites to display some text
class TextSprites

	# Font used to draw text
	var font: Font

	# Reference coordinates of this block of text
	#
	# When left aligned, the default at `align == 0.0`, the anchor is the
	# left coordinate of the first character of the first line.
	# When right aligned, at `align == 1.0`, the anchor is the right
	# coordinate of the last character.
	# When centered, at `align == 0.5`, the anchor is at the center.
	#
	# When top aligned, the default at `valign == 0.0`, the anchor is at the
	# top of this block of text.
	# When bottom aligned, at `valign == 1.0`, the anchor is at the bottom.
	var anchor: Point3d[Float]

	# Last set of sprites generated to display `text=`
	var sprites = new Array[Sprite]

	# Sprite set where to put created sprites
	#
	# Defaults to `app::ui_sprites`, but it could also be set to a
	# `app::sprites` or a custom collection.
	var target_sprite_set: Set[Sprite] = app.ui_sprites is lazy, writable

	private var cached_text: nullable Text = null

	private var init_complete = false

	# Last text drawn
	fun text: nullable Text do return cached_text

	# Update the text displayed by inserting new sprites into `app.ui_sprites`
	#
	# Does not redraw if `text` has not changed.
	fun text=(text: nullable Text)
	is autoinit do
		# Don't redraw if text hasn't changed
		if text == cached_text then return
		cached_text = text

		if not init_complete then return

		# Clean up last used sprites
		for s in sprites do if target_sprite_set.has(s) then target_sprite_set.remove s
		sprites.clear

		if text == null then return

		font.write_into(self, text)

		# Register sprites to be drawn by `app.ui_camera`
		target_sprite_set.add_all sprites
	end

	# Horizontal text alignment
	#
	# Use 0.0 to align left (the default), 0.5 to align in the center or
	# 1.0 to align on the right.
	#
	# See: `valign`
	var align = 0.0 is optional, writable

	# Vertical text alignment
	#
	# Use 0.0 for top alignment (the default) where the text is under the `anchor`,
	# 0.5 to vertically center the text on the `anchor` or
	# or 1.0 to bottom align the text above the `anchor`.
	#
	# See: `align`
	var valign = 0.0 is optional, writable

	# Maximum width of each line of text
	#
	# The first word of each line is exempt and may overflow.
	#
	# The behavior when a line overflow depends on `wrap`.
	var max_width: nullable Float is writable

	# Maximum height of this block of text
	#
	# The first line is exempt and may overflow.
	# Overflowing lines are cut.
	var max_height: nullable Float is writable

	# Should overflowing lines wrap to the next line?
	#
	# If `true`, the default, overflowing lines continue on the next line.
	# Otherwise, lines are cut before overflowing.
	var wrap = true is optional, writable

	# Scale applied to all sprites and spacing
	#
	# Defaults to 1.0.
	var scale = 1.0 is optional, writable

	# Links in the currently displayed text
	#
	# Links are declared in a Markdown-like format:
	#
	# * `[my link]` creates a link with the name `my link`.
	# * `[pretty name](internal name)` creates a link with the
	#   name `internal_name` while showing the text `pretty name`.
	#
	# This `Map` lists the sprites composing each link.
	# These sprites can be modified as desired by the clients,
	# by changing their tints or anything else.
	var links = new Map[String, Array[Sprite]] is lazy

	# Width of the currently displayed text
	var width = 0.0

	# Height of the currently displayed text
	var height = 0.0

	# Force drawing of the text sprites
	#
	# This method may be called after changing a setting (`align`, `wrap`, etc.)
	# to update the displayed text.
	fun force_redraw
	do
		var t = cached_text
		cached_text = null
		text = t
	end

	init
	do
		init_complete = true
		force_redraw
	end
end
lib/gamnit/font.nit:33,1--167,3