71 lines
1.7 KiB
Go
71 lines
1.7 KiB
Go
package style
|
|
|
|
import "image/color"
|
|
import "git.tebibyte.media/tomo/tomo"
|
|
|
|
// Style can apply a visual style to different objects.
|
|
type Style struct {
|
|
// Rules determines which styles get applied to which Objects.
|
|
Rules []Rule
|
|
|
|
// Colors maps tomo.Color values to color.RGBA values.
|
|
Colors map[tomo.Color] color.Color
|
|
}
|
|
|
|
// Rule describes under what circumstances should certain style attributes be
|
|
// active.
|
|
type Rule struct {
|
|
Role tomo.Role
|
|
Tags []string
|
|
Set AttrSet
|
|
}
|
|
|
|
// Ru is shorthand for creating a rule structure
|
|
func Ru (set AttrSet, role tomo.Role, tags ...string) Rule {
|
|
return Rule {
|
|
Role: role,
|
|
Tags: tags,
|
|
Set: set,
|
|
}
|
|
}
|
|
|
|
// AttrSet is a set of attributes wherein only one/zero of each attribute type
|
|
// can exist. It is keyed by the AttrKind of each attribute and must not be
|
|
// modified directly.
|
|
type AttrSet map[tomo.AttrKind] tomo.Attr
|
|
|
|
// AS builds an AttrSet out of a vararg list of Attr values. If multiple Attrs
|
|
// of the same kind are specified, the last one will override the others.
|
|
func AS (attrs ...tomo.Attr) AttrSet {
|
|
set := AttrSet { }
|
|
set.Add(attrs...)
|
|
return set
|
|
}
|
|
|
|
// Add adds attributes to the set.
|
|
func (this AttrSet) Add (attrs ...tomo.Attr) {
|
|
for _, attr := range attrs {
|
|
this[attr.Kind()] = attr
|
|
}
|
|
}
|
|
|
|
// MergeUnder takes attributes from another set and adds them if they don't
|
|
// already exist in this one.
|
|
func (this AttrSet) MergeUnder (other AttrSet) {
|
|
if other == nil { return }
|
|
for _, attr := range other {
|
|
if _, exists := this[attr.Kind()]; !exists {
|
|
this.Add(attr)
|
|
}
|
|
}
|
|
}
|
|
|
|
// MergeOver takes attributes from another set and adds them, overriding this
|
|
// one.
|
|
func (this AttrSet) MergeOver (other AttrSet) {
|
|
if other == nil { return }
|
|
for _, attr := range other {
|
|
this.Add(attr)
|
|
}
|
|
}
|