package world // Functional options for primitive creation. // Defaults are applied first, then user options override. type PointOpt func(*PointOptions) type PointOptions struct { Priority int StyleID StyleID Override StyleOverride Class PointClassID HitSlopPx int hasStyleID bool } func defaultPointOptions() PointOptions { return PointOptions{ Priority: DefaultPriorityPoint, StyleID: StyleIDDefaultPoint, Class: PointClassDefault, } } func PointWithPriority(p int) PointOpt { return func(o *PointOptions) { o.Priority = p } } // PointWithStyleID forces the point to use a pre-registered style. func PointWithStyleID(id StyleID) PointOpt { return func(o *PointOptions) { o.StyleID = id o.hasStyleID = true // Explicit style ID wins over overrides. o.Override = StyleOverride{} } } func PointWithClass(c PointClassID) PointOpt { return func(o *PointOptions) { o.Class = c } } // PointWithStyleOverride derives a style from default point style and applies overrides. // If you also set StyleID, StyleID wins. func PointWithStyleOverride(ov StyleOverride) PointOpt { return func(o *PointOptions) { o.Override = ov } } func PointWithHitSlopPx(px int) PointOpt { return func(o *PointOptions) { o.HitSlopPx = px } } type CircleOpt func(*CircleOptions) type CircleOptions struct { Priority int StyleID StyleID Override StyleOverride Class CircleClassID HitSlopPx int hasStyleID bool } func defaultCircleOptions() CircleOptions { return CircleOptions{ Priority: DefaultPriorityCircle, StyleID: StyleIDDefaultCircle, Class: CircleClassDefault, } } func CircleWithPriority(p int) CircleOpt { return func(o *CircleOptions) { o.Priority = p } } func CircleWithStyleID(id StyleID) CircleOpt { return func(o *CircleOptions) { o.StyleID = id o.hasStyleID = true o.Override = StyleOverride{} } } func CircleWithClass(c CircleClassID) CircleOpt { return func(o *CircleOptions) { o.Class = c } } func CircleWithStyleOverride(ov StyleOverride) CircleOpt { return func(o *CircleOptions) { o.Override = ov } } func CircleWithHitSlopPx(px int) CircleOpt { return func(o *CircleOptions) { o.HitSlopPx = px } } type LineOpt func(*LineOptions) type LineOptions struct { Priority int StyleID StyleID Override StyleOverride Class LineClassID HitSlopPx int hasStyleID bool } func defaultLineOptions() LineOptions { return LineOptions{ Priority: DefaultPriorityLine, StyleID: StyleIDDefaultLine, Class: LineClassDefault, } } func LineWithPriority(p int) LineOpt { return func(o *LineOptions) { o.Priority = p } } func LineWithStyleID(id StyleID) LineOpt { return func(o *LineOptions) { o.StyleID = id o.hasStyleID = true o.Override = StyleOverride{} } } func LineWithClass(c LineClassID) LineOpt { return func(o *LineOptions) { o.Class = c } } func LineWithStyleOverride(ov StyleOverride) LineOpt { return func(o *LineOptions) { o.Override = ov } } func LineWithHitSlopPx(px int) LineOpt { return func(o *LineOptions) { o.HitSlopPx = px } }