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) } }