#
# Created by Boyd Multerer April 30, 2018.
# Copyright © 2018 Kry10 Industries. All rights reserved.
#
# convenience functions for adding basic components to a graph.
# this module should be updated as new base components are added
defmodule Scenic.Clock.Components do
alias Scenic.Graph
alias Scenic.Primitive
# alias Scenic.Primitive.SceneRef
alias Scenic.Clock
# import IEx
@moduledoc """
A set of helper functions to make it easy to add, or modify, clocks
to a graph.
"""
# --------------------------------------------------------
@doc """
Add an analog clock to a graph.
There is no required data, only styles.
### Styles
Analog Clocks honor the following styles
* `:hidden` - If `false` the clock is rendered. If true, it is skipped. The default
is `false`.
* `:theme` - The color set used to draw. See below. The default is `:dark`
### Additional Options
Analog clocks follow the following list of additional options.
* `:radius` - the radius of the clock's main circle.
* `:seconds` - `true` or `false`. Show the seconds hand. Note: Showing the seconds hand uses more energy by rendering the scene every second. The default is `false`.
* `:ticks` - `true` or `false`. Show ticks marking the hour positions. Default is `true` if the radius is >= 30.
## Theme
To pass in a custom theme, supply a map with at least the following entries:
* `:border` - the color of the ring around the clock
* `:background` - the normal background of the clock
The following theme colors are optional. If they are not supplied, `:border` will be used.
* `:hours` - the color of the hours hand
* `:minutes` - the color of the minutes hand
* `:seconds` - the color of the seconds hand
### Examples
The following example creates an analog clock it on the screen.
graph
|> analog_clock( translate: {20, 20} )
The next example makes the same clock as before, but shows the seconds hand.
graph
|> analog_clock( seconds: true, translate: {20, 20} )
"""
@spec analog_clock(
source :: Graph.t() | Primitive.t(),
options :: list
) :: Graph.t() | Primitive.t()
def analog_clock(graph, options \\ [])
def analog_clock(%Graph{} = g, options) do
add_to_graph(g, Clock.Analog, options)
end
def analog_clock(
%Primitive{module: Primitive.Component, data: {Clock.Analog, _, _}} = p,
options
) do
modify(p, options)
end
# --------------------------------------------------------
@doc """
Add an digital clock to a graph.
There is no required data, only configuration options.
### Styles
Digital Clocks honors all the styles you would expect to render text.
This includes
* :font
* :font_size
* :text_align
* :text_base
Note that you must set the font/text styles directly on the component when
you use it in a graph. They are not automatically inherited.
### Additional Options
Digital clocks support the following list of options.
* `:format` - `:hours_12` or `:hours_24`. The default is `:hours_12`.
## Theme
The Digital clock does not use the current theme for coloring. Add a :fill style
instead, just as you would for a text primitive.
### Examples
The following example creates an analog clock it on the screen.
graph
|> digital_clock( translate: {20, 20} )
"""
@spec digital_clock(
source :: Graph.t() | Primitive.t(),
options :: list
) :: Graph.t() | Primitive.t()
def digital_clock(graph, options \\ [])
def digital_clock(%Graph{} = g, options) do
add_to_graph(g, Clock.Digital, options)
end
def digital_clock(
%Primitive{module: Primitive.Component, data: {Clock.Digital, _, _}} = p,
options
) do
modify(p, options)
end
# ============================================================================
# internal utilities
defp add_to_graph(%Graph{} = g, mod, options) do
mod.add_to_graph(g, nil, options)
end
defp modify(%Primitive{module: Primitive.Component, data: {mod, nil, id}} = p, options) do
Primitive.put(p, {mod, nil, id}, options)
end
end