mirror of https://github.com/anoshenko/rui.git
Added New...Gradient functions
This commit is contained in:
parent
5f55d30443
commit
7bb90e5b2a
|
@ -143,6 +143,46 @@ func parseBackgroundValue(value any) []BackgroundElement {
|
||||||
return []BackgroundElement{element}
|
return []BackgroundElement{element}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case []string:
|
||||||
|
elements := make([]BackgroundElement, 0, len(value))
|
||||||
|
for _, element := range value {
|
||||||
|
if obj := ParseDataText(element); obj != nil {
|
||||||
|
if element := createBackground(obj); element != nil {
|
||||||
|
elements = append(elements, element)
|
||||||
|
} else {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return elements
|
||||||
|
|
||||||
|
case []any:
|
||||||
|
elements := make([]BackgroundElement, 0, len(value))
|
||||||
|
for _, element := range value {
|
||||||
|
switch element := element.(type) {
|
||||||
|
case BackgroundElement:
|
||||||
|
elements = append(elements, element)
|
||||||
|
|
||||||
|
case string:
|
||||||
|
if obj := ParseDataText(element); obj != nil {
|
||||||
|
if element := createBackground(obj); element != nil {
|
||||||
|
elements = append(elements, element)
|
||||||
|
} else {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return elements
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
|
|
@ -2,31 +2,33 @@ package rui
|
||||||
|
|
||||||
import "strings"
|
import "strings"
|
||||||
|
|
||||||
|
type LinearGradientDirectionType int
|
||||||
|
|
||||||
// Constants related to view's background gradient description
|
// Constants related to view's background gradient description
|
||||||
const (
|
const (
|
||||||
// ToTopGradient is value of the Direction property of a linear gradient. The value is equivalent to the 0deg angle
|
// ToTopGradient is value of the Direction property of a linear gradient. The value is equivalent to the 0deg angle
|
||||||
ToTopGradient = 0
|
ToTopGradient LinearGradientDirectionType = 0
|
||||||
|
|
||||||
// ToRightTopGradient is value of the Direction property of a linear gradient.
|
// ToRightTopGradient is value of the Direction property of a linear gradient.
|
||||||
ToRightTopGradient = 1
|
ToRightTopGradient LinearGradientDirectionType = 1
|
||||||
|
|
||||||
// ToRightGradient is value of the Direction property of a linear gradient. The value is equivalent to the 90deg angle
|
// ToRightGradient is value of the Direction property of a linear gradient. The value is equivalent to the 90deg angle
|
||||||
ToRightGradient = 2
|
ToRightGradient LinearGradientDirectionType = 2
|
||||||
|
|
||||||
// ToRightBottomGradient is value of the Direction property of a linear gradient.
|
// ToRightBottomGradient is value of the Direction property of a linear gradient.
|
||||||
ToRightBottomGradient = 3
|
ToRightBottomGradient LinearGradientDirectionType = 3
|
||||||
|
|
||||||
// ToBottomGradient is value of the Direction property of a linear gradient. The value is equivalent to the 180deg angle
|
// ToBottomGradient is value of the Direction property of a linear gradient. The value is equivalent to the 180deg angle
|
||||||
ToBottomGradient = 4
|
ToBottomGradient LinearGradientDirectionType = 4
|
||||||
|
|
||||||
// ToLeftBottomGradient is value of the Direction property of a linear gradient.
|
// ToLeftBottomGradient is value of the Direction property of a linear gradient.
|
||||||
ToLeftBottomGradient = 5
|
ToLeftBottomGradient LinearGradientDirectionType = 5
|
||||||
|
|
||||||
// ToLeftGradient is value of the Direction property of a linear gradient. The value is equivalent to the 270deg angle
|
// ToLeftGradient is value of the Direction property of a linear gradient. The value is equivalent to the 270deg angle
|
||||||
ToLeftGradient = 6
|
ToLeftGradient LinearGradientDirectionType = 6
|
||||||
|
|
||||||
// ToLeftTopGradient is value of the Direction property of a linear gradient.
|
// ToLeftTopGradient is value of the Direction property of a linear gradient.
|
||||||
ToLeftTopGradient = 7
|
ToLeftTopGradient LinearGradientDirectionType = 7
|
||||||
)
|
)
|
||||||
|
|
||||||
// BackgroundGradientPoint define point on gradient straight line
|
// BackgroundGradientPoint define point on gradient straight line
|
||||||
|
@ -47,7 +49,14 @@ type backgroundLinearGradient struct {
|
||||||
backgroundGradient
|
backgroundGradient
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewBackgroundLinearGradient creates the new background linear gradient
|
// NewBackgroundLinearGradient creates the new background linear gradient.
|
||||||
|
// The following properties can be used:
|
||||||
|
//
|
||||||
|
// "gradient" (Gradient) - Describes gradient stop points. This is a mandatory property while describing background gradients.
|
||||||
|
//
|
||||||
|
// "direction" (Direction) - Defines the direction of the gradient line.
|
||||||
|
//
|
||||||
|
// "repeating" (Repeating) - Defines whether stop points needs to be repeated after the last one.
|
||||||
func NewBackgroundLinearGradient(params Params) BackgroundElement {
|
func NewBackgroundLinearGradient(params Params) BackgroundElement {
|
||||||
result := new(backgroundLinearGradient)
|
result := new(backgroundLinearGradient)
|
||||||
result.init()
|
result.init()
|
||||||
|
@ -57,6 +66,18 @@ func NewBackgroundLinearGradient(params Params) BackgroundElement {
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NewLinearGradient creates the new background linear gradient.
|
||||||
|
func NewLinearGradient[DirectionType LinearGradientDirectionType | AngleUnit](direction DirectionType, repeating bool, point1 GradientPoint, point2 GradientPoint, points ...GradientPoint) BackgroundElement {
|
||||||
|
params := Params{
|
||||||
|
Direction: direction,
|
||||||
|
Gradient: append([]GradientPoint{point1, point2}, points...),
|
||||||
|
}
|
||||||
|
if repeating {
|
||||||
|
params[Repeating] = true
|
||||||
|
}
|
||||||
|
return NewBackgroundLinearGradient(params)
|
||||||
|
}
|
||||||
|
|
||||||
func parseGradientText(value string) []BackgroundGradientPoint {
|
func parseGradientText(value string) []BackgroundGradientPoint {
|
||||||
elements := strings.Split(value, ",")
|
elements := strings.Split(value, ",")
|
||||||
count := len(elements)
|
count := len(elements)
|
||||||
|
@ -289,7 +310,6 @@ func (gradient *backgroundLinearGradient) init() {
|
||||||
gradient.backgroundElement.init()
|
gradient.backgroundElement.init()
|
||||||
gradient.set = backgroundLinearGradientSet
|
gradient.set = backgroundLinearGradientSet
|
||||||
gradient.supportedProperties = []PropertyName{Direction, Repeating, Gradient}
|
gradient.supportedProperties = []PropertyName{Direction, Repeating, Gradient}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (gradient *backgroundLinearGradient) Tag() string {
|
func (gradient *backgroundLinearGradient) Tag() string {
|
||||||
|
@ -319,6 +339,9 @@ func backgroundLinearGradientSet(properties Properties, tag PropertyName, value
|
||||||
properties.setRaw(Direction, angle)
|
properties.setRaw(Direction, angle)
|
||||||
return []PropertyName{tag}
|
return []PropertyName{tag}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case LinearGradientDirectionType:
|
||||||
|
return setEnumProperty(properties, tag, int(value), enumProperties[Direction].values)
|
||||||
}
|
}
|
||||||
return setEnumProperty(properties, tag, value, enumProperties[Direction].values)
|
return setEnumProperty(properties, tag, value, enumProperties[Direction].values)
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,8 @@ package rui
|
||||||
|
|
||||||
import "strings"
|
import "strings"
|
||||||
|
|
||||||
|
type RadialGradientRadiusType int
|
||||||
|
|
||||||
// Constants related to view's background gradient description
|
// Constants related to view's background gradient description
|
||||||
const (
|
const (
|
||||||
// EllipseGradient is value of the Shape property of a radial gradient background:
|
// EllipseGradient is value of the Shape property of a radial gradient background:
|
||||||
|
@ -15,29 +17,40 @@ const (
|
||||||
// ClosestSideGradient is value of the Radius property of a radial gradient background:
|
// ClosestSideGradient is value of the Radius property of a radial gradient background:
|
||||||
// The gradient's ending shape meets the side of the box closest to its center (for circles)
|
// The gradient's ending shape meets the side of the box closest to its center (for circles)
|
||||||
// or meets both the vertical and horizontal sides closest to the center (for ellipses).
|
// or meets both the vertical and horizontal sides closest to the center (for ellipses).
|
||||||
ClosestSideGradient = 0
|
ClosestSideGradient RadialGradientRadiusType = 0
|
||||||
|
|
||||||
// ClosestCornerGradient is value of the Radius property of a radial gradient background:
|
// ClosestCornerGradient is value of the Radius property of a radial gradient background:
|
||||||
// The gradient's ending shape is sized so that it exactly meets the closest corner
|
// The gradient's ending shape is sized so that it exactly meets the closest corner
|
||||||
// of the box from its center.
|
// of the box from its center.
|
||||||
ClosestCornerGradient = 1
|
ClosestCornerGradient RadialGradientRadiusType = 1
|
||||||
|
|
||||||
// FarthestSideGradient is value of the Radius property of a radial gradient background:
|
// FarthestSideGradient is value of the Radius property of a radial gradient background:
|
||||||
// Similar to closest-side, except the ending shape is sized to meet the side of the box
|
// Similar to closest-side, except the ending shape is sized to meet the side of the box
|
||||||
// farthest from its center (or vertical and horizontal sides).
|
// farthest from its center (or vertical and horizontal sides).
|
||||||
FarthestSideGradient = 2
|
FarthestSideGradient RadialGradientRadiusType = 2
|
||||||
|
|
||||||
// FarthestCornerGradient is value of the Radius property of a radial gradient background:
|
// FarthestCornerGradient is value of the Radius property of a radial gradient background:
|
||||||
// The default value, the gradient's ending shape is sized so that it exactly meets
|
// The default value, the gradient's ending shape is sized so that it exactly meets
|
||||||
// the farthest corner of the box from its center.
|
// the farthest corner of the box from its center.
|
||||||
FarthestCornerGradient = 3
|
FarthestCornerGradient RadialGradientRadiusType = 3
|
||||||
)
|
)
|
||||||
|
|
||||||
type backgroundRadialGradient struct {
|
type backgroundRadialGradient struct {
|
||||||
backgroundGradient
|
backgroundGradient
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewBackgroundRadialGradient creates the new background radial gradient
|
// NewBackgroundRadialGradient creates the new background radial gradient.
|
||||||
|
// The following properties can be used:
|
||||||
|
//
|
||||||
|
// "gradient" (Gradient) - Describes gradient stop points. This is a mandatory property while describing background gradients.
|
||||||
|
//
|
||||||
|
// "center-x" (CenterX), "center-y" (CenterY) - Defines the gradient center point cooordinates.
|
||||||
|
//
|
||||||
|
// "radial-gradient-radius" (RadialGradientRadius) - Defines radius of the radial gradient.
|
||||||
|
//
|
||||||
|
// "radial-gradient-shape" (RadialGradientShape) - Defines shape of the radial gradient.
|
||||||
|
//
|
||||||
|
// "repeating" (Repeating) - Defines whether stop points needs to be repeated after the last one.
|
||||||
func NewBackgroundRadialGradient(params Params) BackgroundElement {
|
func NewBackgroundRadialGradient(params Params) BackgroundElement {
|
||||||
result := new(backgroundRadialGradient)
|
result := new(backgroundRadialGradient)
|
||||||
result.init()
|
result.init()
|
||||||
|
@ -47,6 +60,44 @@ func NewBackgroundRadialGradient(params Params) BackgroundElement {
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NewCircleRadialGradient creates the new background circle radial gradient.
|
||||||
|
func NewCircleRadialGradient[radiusType SizeUnit | RadialGradientRadiusType](xCenter, yCenter SizeUnit, radius radiusType, repeating bool, point1 GradientPoint, point2 GradientPoint, points ...GradientPoint) BackgroundElement {
|
||||||
|
params := Params{
|
||||||
|
RadialGradientShape: CircleGradient,
|
||||||
|
Gradient: append([]GradientPoint{point1, point2}, points...),
|
||||||
|
RadialGradientRadius: radius,
|
||||||
|
}
|
||||||
|
if xCenter.Type != Auto {
|
||||||
|
params[CenterX] = xCenter
|
||||||
|
}
|
||||||
|
if yCenter.Type != Auto {
|
||||||
|
params[CenterY] = yCenter
|
||||||
|
}
|
||||||
|
if repeating {
|
||||||
|
params[Repeating] = true
|
||||||
|
}
|
||||||
|
return NewBackgroundRadialGradient(params)
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewCircleRadialGradient creates the new background ellipse radial gradient.
|
||||||
|
func NewEllipseRadialGradient[radiusType []SizeUnit | RadialGradientRadiusType](xCenter, yCenter SizeUnit, radius radiusType, repeating bool, point1 GradientPoint, point2 GradientPoint, points ...GradientPoint) BackgroundElement {
|
||||||
|
params := Params{
|
||||||
|
RadialGradientShape: EllipseGradient,
|
||||||
|
Gradient: append([]GradientPoint{point1, point2}, points...),
|
||||||
|
RadialGradientRadius: radius,
|
||||||
|
}
|
||||||
|
if xCenter.Type != Auto {
|
||||||
|
params[CenterX] = xCenter
|
||||||
|
}
|
||||||
|
if yCenter.Type != Auto {
|
||||||
|
params[CenterY] = yCenter
|
||||||
|
}
|
||||||
|
if repeating {
|
||||||
|
params[Repeating] = true
|
||||||
|
}
|
||||||
|
return NewBackgroundRadialGradient(params)
|
||||||
|
}
|
||||||
|
|
||||||
func (gradient *backgroundRadialGradient) init() {
|
func (gradient *backgroundRadialGradient) init() {
|
||||||
gradient.backgroundElement.init()
|
gradient.backgroundElement.init()
|
||||||
gradient.normalize = normalizeRadialGradientTag
|
gradient.normalize = normalizeRadialGradientTag
|
||||||
|
@ -144,6 +195,9 @@ func backgroundRadialGradientSet(properties Properties, tag PropertyName, value
|
||||||
}
|
}
|
||||||
return []PropertyName{tag}
|
return []PropertyName{tag}
|
||||||
|
|
||||||
|
case RadialGradientRadiusType:
|
||||||
|
return setEnumProperty(properties, RadialGradientRadius, int(value), enumProperties[RadialGradientRadius].values)
|
||||||
|
|
||||||
case int:
|
case int:
|
||||||
return setEnumProperty(properties, RadialGradientRadius, value, enumProperties[RadialGradientRadius].values)
|
return setEnumProperty(properties, RadialGradientRadius, value, enumProperties[RadialGradientRadius].values)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue