Added "outline-offset" property

This commit is contained in:
anoshenko 2023-04-23 13:41:26 +03:00
parent 372f5971e8
commit eac3379fb1
6 changed files with 434 additions and 335 deletions

File diff suppressed because it is too large Load Diff

View File

@ -745,7 +745,7 @@ If all the lines of the frame are the same, then the following properties can be
|-----------|----------|----------|---------------------| |-----------|----------|----------|---------------------|
| "style" | Style | int | Border line style | | "style" | Style | int | Border line style |
| "width" | Width | SizeUnit | Border line width | | "width" | Width | SizeUnit | Border line width |
| "color" | Color | Color | Border line color | | "color" | ColorTag | Color | Border line color |
Example Example
@ -836,6 +836,48 @@ equivalent to
rui.ColorProperty: rui.Black, rui.ColorProperty: rui.Black,
})) }))
### "outline" and "outline-offset" properties
The "outline" property defines the border outside the View.
A frame line is described by three attributes: line style, thickness, and color.
The "outline" property is similar to the "border" property. The three main differences between an "outline" frame and a "border" frame are:
1) the "border" frame is always located inside the boundaries of the View, and the "outline" frame can be located both inside the View and outside it;
2) all sides of the "outline" frame are the same, while the sides of the "border" frame can have different color, style and thickness.
3) "border" thickness is added to "padding" and "outline" thickness does not affect "padding".
The value of the "border" property is stored as an OutlineProperty interface that implements the Properties interface (see above).
OutlineProperty can contain the following properties:
| Property | Constant | Type | Description |
|-----------|----------|----------|---------------------|
| "style" | Style | int | Border line style |
| "width" | Width | SizeUnit | Border line width |
| "color" | ColorTag | Color | Border line color |
Line style can take the following values:
| Value | Constant | Name | Description |
|:-----:|------------|----------|---------------------|
| 0 | NoneLine | "none" | No frame |
| 1 | SolidLine | "solid" | Solid line |
| 2 | DashedLine | "dashed" | Dashed line |
| 3 | DottedLine | "dotted" | Dotted line |
| 4 | DoubleLine | "double" | Double solid line |
All other style values are ignored.
The NewOutline function is used to create the OutlineProperty interface.
By default, the inner border of the "outline" border is the same as the border of the View (i.e. the border is drawn around the View).
To change this behavior, use the "outline-offset" SizeUnit property (OutlineOffset constant).
This property defines the distance between the inner border of the frame and the border of the View.
A positive value moves the frame away from the View's boundaries, while a negative value forces the frame to be inside the View
(in this case, the frame is drawn on top of the contents of the View).
### "radius" property ### "radius" property
The "radius" property sets the elliptical corner radius of the View. Radii are specified by the RadiusProperty The "radius" property sets the elliptical corner radius of the View. Radii are specified by the RadiusProperty

View File

@ -277,6 +277,10 @@ const (
// The "outline-width" SizeUnit property sets the width of an view's outline. // The "outline-width" SizeUnit property sets the width of an view's outline.
OutlineWidth = "outline-width" OutlineWidth = "outline-width"
// OutlineWidth is the constant for the "outline-offset" property tag.
// The "outline-offset" SizeUnit property sets the amount of space between an outline and the edge or border of an element..
OutlineOffset = "outline-offset"
// Shadow is the constant for the "shadow" property tag. // Shadow is the constant for the "shadow" property tag.
// The "shadow" property adds shadow effects around a view's frame. A shadow is described // The "shadow" property adds shadow effects around a view's frame. A shadow is described
// by X and Y offsets relative to the element, blur and spread radius, and color. // by X and Y offsets relative to the element, blur and spread radius, and color.

View File

@ -136,6 +136,7 @@ var sizeProperties = map[string]string{
BorderTopWidth: BorderTopWidth, BorderTopWidth: BorderTopWidth,
BorderBottomWidth: BorderBottomWidth, BorderBottomWidth: BorderBottomWidth,
OutlineWidth: OutlineWidth, OutlineWidth: OutlineWidth,
OutlineOffset: OutlineOffset,
XOffset: XOffset, XOffset: XOffset,
YOffset: YOffset, YOffset: YOffset,
BlurRadius: BlurRadius, BlurRadius: BlurRadius,

View File

@ -212,7 +212,7 @@ func (style *viewStyle) cssViewStyle(builder cssBuilder, session Session) {
for _, tag := range []string{ for _, tag := range []string{
Width, Height, MinWidth, MinHeight, MaxWidth, MaxHeight, Left, Right, Top, Bottom, Width, Height, MinWidth, MinHeight, MaxWidth, MaxHeight, Left, Right, Top, Bottom,
TextSize, TextIndent, LetterSpacing, WordSpacing, LineHeight, TextLineThickness, TextSize, TextIndent, LetterSpacing, WordSpacing, LineHeight, TextLineThickness,
ListRowGap, ListColumnGap, GridRowGap, GridColumnGap, ColumnGap, ColumnWidth} { ListRowGap, ListColumnGap, GridRowGap, GridColumnGap, ColumnGap, ColumnWidth, OutlineOffset} {
if size, ok := sizeProperty(style, tag, session); ok && size.Type != Auto { if size, ok := sizeProperty(style, tag, session); ok && size.Type != Auto {
cssTag, ok := sizeProperties[tag] cssTag, ok := sizeProperties[tag]

View File

@ -321,6 +321,12 @@ func GetOutline(view View, subviewID ...string) ViewOutline {
return ViewOutline{Style: NoneLine, Width: AutoSize(), Color: 0} return ViewOutline{Style: NoneLine, Width: AutoSize(), Color: 0}
} }
// GetOutlineOffset returns the subview outline offset.
// If the second argument (subviewID) is not specified or it is "" then a offset of the first argument (view) is returned
func GetOutlineOffset(view View, subviewID ...string) SizeUnit {
return sizeStyledProperty(view, subviewID, OutlineOffset, false)
}
// GetViewShadows returns shadows of the subview. // GetViewShadows returns shadows of the subview.
// If the second argument (subviewID) is not specified or it is "" then shadows of the first argument (view) is returned. // If the second argument (subviewID) is not specified or it is "" then shadows of the first argument (view) is returned.
func GetViewShadows(view View, subviewID ...string) []ViewShadow { func GetViewShadows(view View, subviewID ...string) []ViewShadow {