53 lines
1020 B
Go
53 lines
1020 B
Go
package gizmo
|
|
|
|
import (
|
|
"aego/core/errs"
|
|
"aego/scene"
|
|
"aego/schema"
|
|
)
|
|
|
|
type Registry struct {
|
|
byType map[schema.TypeID]Gizmo
|
|
order []schema.TypeID
|
|
}
|
|
|
|
func NewRegistry() *Registry {
|
|
return &Registry{byType: map[schema.TypeID]Gizmo{}}
|
|
}
|
|
|
|
func (r *Registry) Register(t schema.TypeID, g Gizmo) error {
|
|
if g == nil {
|
|
return errs.New(errs.EditorPanel, "gizmo is nil")
|
|
}
|
|
if _, dup := r.byType[t]; dup {
|
|
return errs.New(errs.EditorPanel, "a gizmo is already registered for this component")
|
|
}
|
|
r.byType[t] = g
|
|
r.order = append(r.order, t)
|
|
return nil
|
|
}
|
|
|
|
func (r *Registry) Unregister(t schema.TypeID) {
|
|
if _, ok := r.byType[t]; !ok {
|
|
return
|
|
}
|
|
delete(r.byType, t)
|
|
for i, o := range r.order {
|
|
if o == t {
|
|
r.order = append(r.order[:i], r.order[i+1:]...)
|
|
return
|
|
}
|
|
}
|
|
}
|
|
|
|
func (r *Registry) Each(s *scene.Scene, h scene.NodeHandle, fn func(Gizmo)) {
|
|
if s == nil || h.IsZero() || !s.IsAlive(h) {
|
|
return
|
|
}
|
|
for _, t := range r.order {
|
|
if _, ok := s.GetByType(h, t); ok {
|
|
fn(r.byType[t])
|
|
}
|
|
}
|
|
}
|