lib/metro/models/ui/model_labeler.rb
module Metro
module UI
#
# The model labeler will draw a bounding box and label around all the
# scene's drawers.
#
# The model labeler is used in the edit transition scene to generate
# the bounding boxes and labeles around all the actors within the scene
# being edited.
#
class ModelLabeler < Model
# @attribute
# The color use for the border surrounding each actor and the background
# behind the model's name.
property :color, default: "rgba(255,0,0,0.5)"
# @attribute
# Sets whether to draw the bounding boxes around the actors.
property :should_draw_bounding_boxes, type: :boolean, default: true
# @attribute
# The color of the model name text.
property :label_color, default: "rgba(255,255,255,1.0)"
# @attribute
# The font of the model name label.
property :font, default: { name: 'Arial', size: 16 }
# @attribute
# Sets whether to draw the model name labels
property :should_draw_labels, type: :boolean, default: true
# @attribute
# For actors that have no bounds, like sound or custom models without
# a position, they are normally hidden but can be shown. Currently they
# appear all overlapped in the upper-left corner of the screen.
#
# @todo when enabled the boundless actors should be presented in a cleaner
# way to allow for easier viewing of them.
property :should_hide_boundless_actors, type: :boolean, default: true
# Store the labels that are being drawn in the scene. This hash of labels
# acts as a cache around the items that are being labeled based on the
# name of the objects that are being labeled.
def labels
@labels ||= {}
end
def show
self.saveable_to_view = false
end
def update
scene.drawers.each do |drawer|
next if (drawer.bounds == Bounds.none and should_hide_boundless_actors)
label = labels[drawer.name]
unless label
label = create "metro::ui::model_label", target: drawer
labels[drawer.name] = label
end
label.should_draw_label = should_draw_labels
label.should_draw_bounding_box = should_draw_bounding_boxes
label.bounds = drawer.bounds
end
end
def draw
labels.values.each { |label| label.draw }
end
end
end
end