From 7bb90e5b2a19e8a678401c683c38f1c1c74b54f3 Mon Sep 17 00:00:00 2001 From: Alexei Anoshenko <2277098+anoshenko@users.noreply.github.com> Date: Wed, 4 Dec 2024 18:45:08 +0300 Subject: [PATCH] Added New...Gradient functions --- background.go | 40 +++++++++++++++++++++++ backgroundLinearGradient.go | 43 +++++++++++++++++++------ backgroundRadialGradient.go | 64 ++++++++++++++++++++++++++++++++++--- 3 files changed, 132 insertions(+), 15 deletions(-) diff --git a/background.go b/background.go index 68e6b8f..235cb4e 100644 --- a/background.go +++ b/background.go @@ -143,6 +143,46 @@ func parseBackgroundValue(value any) []BackgroundElement { 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 diff --git a/backgroundLinearGradient.go b/backgroundLinearGradient.go index 1760b9c..e93b00b 100644 --- a/backgroundLinearGradient.go +++ b/backgroundLinearGradient.go @@ -2,31 +2,33 @@ package rui import "strings" +type LinearGradientDirectionType int + // Constants related to view's background gradient description const ( // 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 = 1 + ToRightTopGradient LinearGradientDirectionType = 1 // 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 = 3 + ToRightBottomGradient LinearGradientDirectionType = 3 // 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 = 5 + ToLeftBottomGradient LinearGradientDirectionType = 5 // 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 = 7 + ToLeftTopGradient LinearGradientDirectionType = 7 ) // BackgroundGradientPoint define point on gradient straight line @@ -47,7 +49,14 @@ type backgroundLinearGradient struct { 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 { result := new(backgroundLinearGradient) result.init() @@ -57,6 +66,18 @@ func NewBackgroundLinearGradient(params Params) BackgroundElement { 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 { elements := strings.Split(value, ",") count := len(elements) @@ -289,7 +310,6 @@ func (gradient *backgroundLinearGradient) init() { gradient.backgroundElement.init() gradient.set = backgroundLinearGradientSet gradient.supportedProperties = []PropertyName{Direction, Repeating, Gradient} - } func (gradient *backgroundLinearGradient) Tag() string { @@ -319,6 +339,9 @@ func backgroundLinearGradientSet(properties Properties, tag PropertyName, value properties.setRaw(Direction, angle) return []PropertyName{tag} } + + case LinearGradientDirectionType: + return setEnumProperty(properties, tag, int(value), enumProperties[Direction].values) } return setEnumProperty(properties, tag, value, enumProperties[Direction].values) } diff --git a/backgroundRadialGradient.go b/backgroundRadialGradient.go index 85956c6..acad729 100644 --- a/backgroundRadialGradient.go +++ b/backgroundRadialGradient.go @@ -2,6 +2,8 @@ package rui import "strings" +type RadialGradientRadiusType int + // Constants related to view's background gradient description const ( // 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: // 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). - ClosestSideGradient = 0 + ClosestSideGradient RadialGradientRadiusType = 0 // 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 // of the box from its center. - ClosestCornerGradient = 1 + ClosestCornerGradient RadialGradientRadiusType = 1 // 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 // 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: // The default value, the gradient's ending shape is sized so that it exactly meets // the farthest corner of the box from its center. - FarthestCornerGradient = 3 + FarthestCornerGradient RadialGradientRadiusType = 3 ) type backgroundRadialGradient struct { 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 { result := new(backgroundRadialGradient) result.init() @@ -47,6 +60,44 @@ func NewBackgroundRadialGradient(params Params) BackgroundElement { 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() { gradient.backgroundElement.init() gradient.normalize = normalizeRadialGradientTag @@ -144,6 +195,9 @@ func backgroundRadialGradientSet(properties Properties, tag PropertyName, value } return []PropertyName{tag} + case RadialGradientRadiusType: + return setEnumProperty(properties, RadialGradientRadius, int(value), enumProperties[RadialGradientRadius].values) + case int: return setEnumProperty(properties, RadialGradientRadius, value, enumProperties[RadialGradientRadius].values) }