Added New...Gradient functions

This commit is contained in:
Alexei Anoshenko 2024-12-04 18:45:08 +03:00
parent 5f55d30443
commit 7bb90e5b2a
3 changed files with 132 additions and 15 deletions

View File

@ -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

View File

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

View File

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