71 lines
1.5 KiB
Go
71 lines
1.5 KiB
Go
package system
|
|
|
|
import "git.tebibyte.media/tomo/tomo"
|
|
import "git.tebibyte.media/sashakoshka/goutil/container"
|
|
|
|
type attrHierarchy [T tomo.Attr] struct {
|
|
fallback T
|
|
style ucontainer.Optional[T]
|
|
user ucontainer.Optional[T]
|
|
}
|
|
|
|
func (this *attrHierarchy[T]) SetFallback (fallback T) {
|
|
this.fallback = fallback
|
|
}
|
|
|
|
func (this *attrHierarchy[T]) SetStyle (style T) (different bool) {
|
|
styleEquals := false
|
|
if previous, ok := this.style.Value(); ok {
|
|
styleEquals = previous.Equals(style)
|
|
}
|
|
this.style.Set(style)
|
|
return !styleEquals && !this.user.Exists()
|
|
}
|
|
|
|
func (this *attrHierarchy[T]) UnsetStyle () (different bool) {
|
|
different = this.style.Exists()
|
|
this.style.Unset()
|
|
return different
|
|
}
|
|
|
|
func (this *attrHierarchy[T]) SetUser (user T) (different bool) {
|
|
userEquals := false
|
|
if previous, ok := this.user.Value(); ok {
|
|
userEquals = previous.Equals(user)
|
|
}
|
|
this.user.Set(user)
|
|
return !userEquals
|
|
}
|
|
|
|
func (this *attrHierarchy[T]) UnsetUser () (different bool) {
|
|
different = this.user.Exists()
|
|
this.user.Unset()
|
|
return different
|
|
}
|
|
|
|
func (this *attrHierarchy[T]) Set (attr T, user bool) (different bool) {
|
|
if user {
|
|
return this.SetUser(attr)
|
|
} else {
|
|
return this.SetStyle(attr)
|
|
}
|
|
}
|
|
|
|
func (this *attrHierarchy[T]) Unset (user bool) (different bool) {
|
|
if user {
|
|
return this.UnsetUser()
|
|
} else {
|
|
return this.UnsetStyle()
|
|
}
|
|
}
|
|
|
|
func (this *attrHierarchy[T]) Value () T {
|
|
if user, ok := this.user.Value(); ok {
|
|
return user
|
|
} else if style, ok := this.style.Value(); ok{
|
|
return style
|
|
} else {
|
|
return this.fallback
|
|
}
|
|
}
|