forked from mbk-lab/rui_orig
				
			Added some properties and functions
* Added "resize", "grid-auto-flow", "caret-color", and "backdrop-filter" properties * Added BlurView, BlurViewByID, GetResize, GetGridAutoFlow, GetCaretColor, GetBackdropFilter functions * The "warp" property for ListView and ListLayout renamed to "list-warp" * The "warp" property for EditView renamed to "edit-warp" * Added CertFile and KeyFile optional fields to the AppParams struct.If they are set, then an https connection is created, otherwise http.
This commit is contained in:
		
							parent
							
								
									b43bf80856
								
							
						
					
					
						commit
						73cd9318a5
					
				| 
						 | 
				
			
			@ -1,3 +1,11 @@
 | 
			
		|||
# v0.7.0
 | 
			
		||||
 | 
			
		||||
* Added "resize", "grid-auto-flow", "caret-color", and "backdrop-filter" properties 
 | 
			
		||||
* Added BlurView, BlurViewByID, GetResize, GetGridAutoFlow, GetCaretColor, GetBackdropFilter functions
 | 
			
		||||
* The "warp" property for ListView and ListLayout renamed to "list-warp"
 | 
			
		||||
* The "warp" property for EditView renamed to "edit-warp"
 | 
			
		||||
* Added CertFile and KeyFile optional fields to the AppParams struct.If they are set, then an https connection is created, otherwise http.
 | 
			
		||||
 | 
			
		||||
# v0.6.0
 | 
			
		||||
 | 
			
		||||
* Added "user-data" property
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										66
									
								
								README-ru.md
								
								
								
								
							
							
						
						
									
										66
									
								
								README-ru.md
								
								
								
								
							| 
						 | 
				
			
			@ -550,6 +550,25 @@ SizeUnit или имя константы (о константах ниже):
 | 
			
		|||
	func GetMaxWidth(view View, subviewID string) SizeUnit
 | 
			
		||||
	func GetMaxHeight(view View, subviewID string) SizeUnit
 | 
			
		||||
 | 
			
		||||
### Свойство "resize"
 | 
			
		||||
 | 
			
		||||
Свойство "resize" (константа Resize) типа int устанавливает, можно ли изменить размер View, 
 | 
			
		||||
и если да, то в каких направлениях. Допустимые значения
 | 
			
		||||
 | 
			
		||||
| Значение | Константа        | Имя          | Описание                     |
 | 
			
		||||
|:--------:|------------------|--------------|------------------------------|
 | 
			
		||||
| 0        | NoneResize       | "none"       | Нельзя изменять размер View. |
 | 
			
		||||
| 1        | BothResize       | "both"       | Отображается механизм, позволяющий пользователю изменять размер View как по горизонтали, так и по вертикали.   |
 | 
			
		||||
| 2        | HorizontalResize | "horizontal" | Отображается механизм, позволяющий пользователю изменять размер View только по горизонтали. |
 | 
			
		||||
| 3        | VerticalResize   | "vertical"   | Отображается механизм, позволяющий пользователю изменять размер View только по вертикали.   |
 | 
			
		||||
 | 
			
		||||
Значение по умолчанию для всех типов View кроме многострочного редактора текста это NoneResize (0).
 | 
			
		||||
Значение по умолчанию для многострочного редактора текста это BothResize (1).
 | 
			
		||||
 | 
			
		||||
Получить значение данного свойства можно с помощью функции
 | 
			
		||||
 | 
			
		||||
	func GetResize(view View, subviewID string) int
 | 
			
		||||
 | 
			
		||||
### Свойства "margin" и "padding"
 | 
			
		||||
 | 
			
		||||
Свойство "margin" определяет внешние отступы от данного View до соседних.
 | 
			
		||||
| 
						 | 
				
			
			@ -1241,10 +1260,12 @@ radius необходимо передать nil
 | 
			
		|||
 | 
			
		||||
	func GetVisibility(view View, subviewID string) int
 | 
			
		||||
 | 
			
		||||
### Свойство "filter"
 | 
			
		||||
### Свойства "filter" и "backdrop-filter"
 | 
			
		||||
 | 
			
		||||
Свойство "filter" (константа Filter) применяет ко View такие графические эффекты, как размытие и смещение цвета.
 | 
			
		||||
В качестве значения свойства "filter" используется только интерфейс ViewFilter. ViewFilter создается с помощью
 | 
			
		||||
Свойство "filter" (константа Filter) применяет ко View такие графические эффекты, как размытие, смещение цвета, изменение яркости/контрасности и т.п.
 | 
			
		||||
Свойства "backdrop-filter" (константа BackdropFilter) применяет такие же эффекты но к содержимому располагающемося ниже View.
 | 
			
		||||
 | 
			
		||||
В качестве значения свойств "filter" и "backdrop-filter" используется только интерфейс ViewFilter. ViewFilter создается с помощью
 | 
			
		||||
функции
 | 
			
		||||
 | 
			
		||||
	func NewViewFilter(params Params) ViewFilter
 | 
			
		||||
| 
						 | 
				
			
			@ -1264,9 +1285,10 @@ radius необходимо передать nil
 | 
			
		|||
| "saturate"    | Saturate   | float64  0…10000%  | Изменение насыщености            |
 | 
			
		||||
| "sepia"       | Sepia      | float64  0…100%    | Преобразование в серпию          |
 | 
			
		||||
 | 
			
		||||
Получить значение текущего фильтра можно с помощью функции
 | 
			
		||||
Получить значение текущего фильтра можно с помощью функций
 | 
			
		||||
 | 
			
		||||
	func GetFilter(view View, subviewID string) ViewFilter
 | 
			
		||||
	func GetBackdropFilter(view View, subviewID string) ViewFilter
 | 
			
		||||
 | 
			
		||||
### Свойство "semantics"
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -2125,17 +2147,17 @@ ListLayout является контейнером, реализующим ин
 | 
			
		|||
свойства "text-direction". Для языков с письмом справа налево (арабский, иврит) начало находится
 | 
			
		||||
справа, для остальных языков - слева.
 | 
			
		||||
 | 
			
		||||
### "wrap"
 | 
			
		||||
### "list-wrap"
 | 
			
		||||
 | 
			
		||||
Свойство "wrap" (константа Wrap) типа int определяет расположения элементов в случае достижения
 | 
			
		||||
Свойство "list-wrap" (константа ListWrap) типа int определяет расположения элементов в случае достижения
 | 
			
		||||
границы контейнера. Возможны три варианта:
 | 
			
		||||
 | 
			
		||||
* WrapOff (0) - колонка/строка элементов продолжается и выходит за границы видимой области.
 | 
			
		||||
* ListWrapOff (0) - колонка/строка элементов продолжается и выходит за границы видимой области.
 | 
			
		||||
	
 | 
			
		||||
* WrapOn (1) - начинается новая колонка/строка элементов. Новая колонка располагается по направлению
 | 
			
		||||
* ListWrapOn (1) - начинается новая колонка/строка элементов. Новая колонка располагается по направлению
 | 
			
		||||
к концу (о положении начала и конца см. выше), новая строка - снизу.
 | 
			
		||||
	
 | 
			
		||||
* WrapReverse (2) - начинается новая колонка/строка элементов. Новая колонка располагается по направлению
 | 
			
		||||
* ListWrapReverse (2) - начинается новая колонка/строка элементов. Новая колонка располагается по направлению
 | 
			
		||||
к началу (о положении начала и конца см. выше), новая строка - сверху.
 | 
			
		||||
 | 
			
		||||
### "vertical-align"
 | 
			
		||||
| 
						 | 
				
			
			@ -2175,7 +2197,7 @@ GridLayout является контейнером, реализующим ин
 | 
			
		|||
### "column" и "row"
 | 
			
		||||
 | 
			
		||||
Расположение View внутри GridLayout определяется с помощью свойств "column" и "row".
 | 
			
		||||
Данные свойства должны устанавливаться для каждого из дочерних View.
 | 
			
		||||
Данные свойства устанавливаться для каждого из дочерних View.
 | 
			
		||||
Дочерний View может занимать несколько ячеек внутри GridLayout. При этом они могут
 | 
			
		||||
перекрываться.
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -2212,6 +2234,22 @@ GridLayout является контейнером, реализующим ин
 | 
			
		|||
В данном примере view1 занимает в нулевой строке столбцы 1 и 2, а view1 занимает
 | 
			
		||||
в нулевом стобце строки 0, 1 и 2.
 | 
			
		||||
 | 
			
		||||
### "grid-auto-flow"
 | 
			
		||||
 | 
			
		||||
Если для дочерних View не задаются свойства "row" и "column", то используется автоматический алгоритм размещения элементов. 
 | 
			
		||||
Возможны четыре варианта данного алгоритма. Используемый вариант задается с помощью свойства "grid-auto-flow" типа int.
 | 
			
		||||
Cвойство "grid-auto-flow" может принимать следующие значения:
 | 
			
		||||
 | 
			
		||||
* RowAutoFlow (0) (text name "row") - Views размещаются путем заполнения каждой строки по очереди, добавляя новые столбцы по мере необходимости;
 | 
			
		||||
 | 
			
		||||
* ColumnAutoFlow (1) (text name "colunm") - Views размещаются путем заполнения каждого столбца по очереди, добавляя новые столбцы по мере необходимости;
 | 
			
		||||
 | 
			
		||||
* RowDenseAutoFlow (2) (text name "row-dense") - Views размещаются путем заполнения каждой строки и добавления новых строк по мере необходимости.
 | 
			
		||||
Алгоритм «плотной» упаковки пытается заполнить дыры в сетке передвигая более мелкие View вперед очереди.
 | 
			
		||||
 | 
			
		||||
* ColumnDenseAutoFlow (3) (text name "column-dense") - Views размещаются путем заполнения каждого столбца, добавляя новые столбцы по мере необходимости. 
 | 
			
		||||
Алгоритм «плотной» упаковки пытается заполнить дыры в сетке передвигая более мелкие View вперед очереди.
 | 
			
		||||
 | 
			
		||||
### "cell-width" и "cell-height"
 | 
			
		||||
 | 
			
		||||
По умолчанию размеры ячеек вычисляются на основе размеров помещенных в них дочерних View.
 | 
			
		||||
| 
						 | 
				
			
			@ -2699,10 +2737,14 @@ string свойство "edit-view-pattern" (константа EditViewPattern)
 | 
			
		|||
Для этого используется string свойство "hint" (константа Hint).
 | 
			
		||||
 | 
			
		||||
Для многострочного редактора может быть включен режим автоматического переноса. Для
 | 
			
		||||
этого используется bool свойство "wrap" (константа Wrap). Если "wrap" выключен (значение по умолчанию),
 | 
			
		||||
этого используется bool свойство "edit-wrap" (константа EditWrap). Если "edit-wrap" выключен (значение по умолчанию),
 | 
			
		||||
то используется горизонтальная прокрутка. Если включен, то по достижении границы EditView
 | 
			
		||||
текст переносится на новую строку.
 | 
			
		||||
 | 
			
		||||
Для изменения цвета каретки ввода текста используется Color свойство "caret-color" (константа CaretColor).
 | 
			
		||||
Cвойство "caret-color" может быть задано не только для EditView, но и для любого контейнера. В этом случае
 | 
			
		||||
цвет каретки меняется для всех дочерних EditView помещенных в этот контейнер
 | 
			
		||||
 | 
			
		||||
Для получения значений свойств EditView могут использоваться следующие функции:
 | 
			
		||||
 | 
			
		||||
	func GetText(view View, subviewID string) string
 | 
			
		||||
| 
						 | 
				
			
			@ -2713,7 +2755,7 @@ string свойство "edit-view-pattern" (константа EditViewPattern)
 | 
			
		|||
	func IsReadOnly(view View, subviewID string) bool
 | 
			
		||||
	func IsEditViewWrap(view View, subviewID string) bool
 | 
			
		||||
	func IsSpellcheck(view View, subviewID string) bool
 | 
			
		||||
 | 
			
		||||
	func GetCaretColor(view View, subviewID string) Color
 | 
			
		||||
 | 
			
		||||
Для отслеживания изменения текста используется событие "edit-text-changed" (константа
 | 
			
		||||
EditTextChangedEvent). Основной слушатель события имеет следующий формат:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										69
									
								
								README.md
								
								
								
								
							
							
						
						
									
										69
									
								
								README.md
								
								
								
								
							| 
						 | 
				
			
			@ -550,6 +550,25 @@ For the properties "width", "height", "min-width", "min-height", "max-width", "m
 | 
			
		|||
	func GetMaxWidth(view View, subviewID string) SizeUnit
 | 
			
		||||
	func GetMaxHeight(view View, subviewID string) SizeUnit
 | 
			
		||||
 | 
			
		||||
### "resize" property
 | 
			
		||||
 | 
			
		||||
The int "resize" property (Resize constant) sets whether the View can be resized, and if so, in which directions. 
 | 
			
		||||
Valid values
 | 
			
		||||
 | 
			
		||||
|Value     | Constant         | Name         | Description             |
 | 
			
		||||
|:--------:|------------------|--------------|-------------------------|
 | 
			
		||||
| 0        | NoneResize       | "none"       | View cannot be resized. |
 | 
			
		||||
| 1        | BothResize       | "both"       | The View displays a mechanism for allowing the user to resize it, which may be resized both horizontally and vertically. |
 | 
			
		||||
| 2        | HorizontalResize | "horizontal" | The View displays a mechanism for allowing the user to resize it in the horizontal direction. |
 | 
			
		||||
| 3        | VerticalResize   | "vertical"   | The View displays a mechanism for allowing the user to resize it in the vertical direction.   |
 | 
			
		||||
 | 
			
		||||
The default value for all View types except multiline text editor is NoneResize(0).
 | 
			
		||||
The default value for a multiline text editor is BothResize(1).
 | 
			
		||||
 | 
			
		||||
You can get the value of this property using the function
 | 
			
		||||
 | 
			
		||||
	func GetResize(view View, subviewID string) int
 | 
			
		||||
 | 
			
		||||
### "margin" and "padding" properties
 | 
			
		||||
 | 
			
		||||
The "margin" property determines the outer margins from this View to its neighbors.
 | 
			
		||||
| 
						 | 
				
			
			@ -1207,7 +1226,7 @@ You can get the value of this property using the function
 | 
			
		|||
 | 
			
		||||
### "visibility" property
 | 
			
		||||
 | 
			
		||||
The "visibility" property (constant Visibility) of type int specifies the visibility of the View. Valid values
 | 
			
		||||
The "visibility" int property (constant Visibility) specifies the visibility of the View. Valid values
 | 
			
		||||
 | 
			
		||||
| Value | Constant  | Name        | Visibility                                     |
 | 
			
		||||
|:-----:|-----------|-------------|------------------------------------------------|
 | 
			
		||||
| 
						 | 
				
			
			@ -1219,10 +1238,12 @@ You can get the value of this property using the function
 | 
			
		|||
 | 
			
		||||
	func GetVisibility(view View, subviewID string) int
 | 
			
		||||
 | 
			
		||||
### "filter" property
 | 
			
		||||
### "filter" and "backdrop-filter" properties
 | 
			
		||||
 | 
			
		||||
The "filter" property (Filter constant) applies graphical effects such as blur and color shift to the View.
 | 
			
		||||
Only the ViewFilter interface is used as the value of the "filter" property. 
 | 
			
		||||
The "filter" property (Filter constant) applies graphical effects to the View, such as blurring, color shifting, changing brightness/contrast, etc.
 | 
			
		||||
The "backdrop-filter" property (BackdropFilter constant) applies the same effects but to the area behind a View.
 | 
			
		||||
 | 
			
		||||
Only the ViewFilter interface is used as the value of the "filter" properties. 
 | 
			
		||||
ViewFilter is created using the function
 | 
			
		||||
 | 
			
		||||
	func NewViewFilter(params Params) ViewFilter
 | 
			
		||||
| 
						 | 
				
			
			@ -1249,9 +1270,10 @@ Example
 | 
			
		|||
        rui.Contrast: 150,
 | 
			
		||||
    }))
 | 
			
		||||
 | 
			
		||||
You can get the value of the current filter using the function
 | 
			
		||||
You can get the value of the current filter using functions
 | 
			
		||||
 | 
			
		||||
	func GetFilter(view View, subviewID string) ViewFilter
 | 
			
		||||
	func GetBackdropFilter(view View, subviewID string) ViewFilter
 | 
			
		||||
 | 
			
		||||
### "semantics" property
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -2103,17 +2125,17 @@ The start and end positions for StartToEndOrientation and EndToStartOrientation
 | 
			
		|||
of the "text-direction" property. For languages written from right to left (Arabic, Hebrew), 
 | 
			
		||||
the beginning is on the right, for other languages - on the left.
 | 
			
		||||
 | 
			
		||||
### "wrap" property
 | 
			
		||||
### "list-wrap" property
 | 
			
		||||
 | 
			
		||||
The "wrap" int property (Wrap constant) defines the position of elements in case of reaching 
 | 
			
		||||
The "list-wrap" int property (ListWrap constant) defines the position of elements in case of reaching 
 | 
			
		||||
the border of the container. There are three options:
 | 
			
		||||
 | 
			
		||||
* WrapOff (0) - the column / row of elements continues and goes beyond the bounds of the visible area.
 | 
			
		||||
* ListWrapOff (0) - the column / row of elements continues and goes beyond the bounds of the visible area.
 | 
			
		||||
 | 
			
		||||
* WrapOn (1) - starts a new column / row of items. The new column is positioned towards the end 
 | 
			
		||||
* ListWrapOn (1) - starts a new column / row of items. The new column is positioned towards the end 
 | 
			
		||||
(for the position of the beginning and end, see above), the new line is at the bottom.
 | 
			
		||||
 | 
			
		||||
* WrapReverse (2) - starts a new column / row of elements. The new column is positioned towards the beginning 
 | 
			
		||||
* ListWrapReverse (2) - starts a new column / row of elements. The new column is positioned towards the beginning 
 | 
			
		||||
(for the position of the beginning and end, see above), the new line is at the top.
 | 
			
		||||
 | 
			
		||||
### "vertical-align" property
 | 
			
		||||
| 
						 | 
				
			
			@ -2192,6 +2214,24 @@ Example
 | 
			
		|||
 | 
			
		||||
In this example, view1 occupies columns 1 and 2 in row 0, and view1 occupies rows 0, 1, and 2 in column 0.
 | 
			
		||||
 | 
			
		||||
### "grid-auto-flow"
 | 
			
		||||
 | 
			
		||||
If the "row" and "column" properties are not set for child Views, then the automatic View placement algorithm is used.
 | 
			
		||||
There are four variants of this algorithm. The variant to use is specified using the "grid-auto-flow" int property.
 | 
			
		||||
The "grid-auto-flow" property can take the following values:
 | 
			
		||||
 | 
			
		||||
* RowAutoFlow (0) (text name "row") - Views are placed by filling each row in turn, adding new columns as necessary;
 | 
			
		||||
 | 
			
		||||
* ColumnAutoFlow (1) (text name "colunm") - Views are placed by filling each column in turn, adding new columns as necessary;
 | 
			
		||||
 | 
			
		||||
* RowDenseAutoFlow (2) (text name "row-dense") - Views are placed by filling each row, adding new rows as necessary.
 | 
			
		||||
"dense" packing algorithm attempts to fill in holes earlier in the grid, if smaller items come up later.
 | 
			
		||||
This may cause views to appear out-of-order, when doing so would fill in holes left by larger views.
 | 
			
		||||
 | 
			
		||||
* ColumnDenseAutoFlow (3) (text name "column-dense") - Views are placed by filling each column, adding new columns as necessary. 
 | 
			
		||||
"dense" packing algorithm attempts to fill in holes earlier in the grid, if smaller items come up later.
 | 
			
		||||
This may cause views to appear out-of-order, when doing so would fill in holes left by larger views.
 | 
			
		||||
 | 
			
		||||
### "cell-width" and "cell-height" properties
 | 
			
		||||
 | 
			
		||||
By default, the sizes of the cells are calculated based on the sizes of the child Views placed in them.
 | 
			
		||||
| 
						 | 
				
			
			@ -2668,10 +2708,14 @@ Spell checking can only be enabled if the editor type is set to SingleLineText o
 | 
			
		|||
For the editor, you can set a hint that will be shown while the editor is empty.
 | 
			
		||||
To do this, use the string property "hint" (Hint constant).
 | 
			
		||||
 | 
			
		||||
For a multi-line editor, auto-wrap mode can be enabled. The bool property "wrap" (constant Wrap) is used for this. 
 | 
			
		||||
If "wrap" is off (default), then horizontal scrolling is used. 
 | 
			
		||||
For a multi-line editor, auto-wrap mode can be enabled. The bool property "edit-wrap" (EditWrap constant) is used for this. 
 | 
			
		||||
If "edit-wrap" is false (default), then horizontal scrolling is used. 
 | 
			
		||||
If enabled, the text wraps to a new line when the EditView border is reached.
 | 
			
		||||
 | 
			
		||||
To change the color of the text input caret, use the Color property "caret-color" (CaretColor constant).
 | 
			
		||||
The "caret-color" property can be set not only for EditView, but for any container. 
 | 
			
		||||
In this case, the color of the caret changes for all child EditViews placed in this container.
 | 
			
		||||
 | 
			
		||||
The following functions can be used to get the values of the properties of an EditView:
 | 
			
		||||
 | 
			
		||||
	func GetText(view View, subviewID string) string
 | 
			
		||||
| 
						 | 
				
			
			@ -2682,6 +2726,7 @@ The following functions can be used to get the values of the properties of an Ed
 | 
			
		|||
	func IsReadOnly(view View, subviewID string) bool
 | 
			
		||||
	func IsEditViewWrap(view View, subviewID string) bool
 | 
			
		||||
	func IsSpellcheck(view View, subviewID string) bool
 | 
			
		||||
	func GetCaretColor(view View, subviewID string) Color
 | 
			
		||||
 | 
			
		||||
The "edit-text-changed" event (EditTextChangedEvent constant) is used to track changes to the text. 
 | 
			
		||||
The main event listener has the following format:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -92,14 +92,6 @@ function socketClose(event) {
 | 
			
		|||
	if (!event.wasClean && windowFocus) {
 | 
			
		||||
		window.setTimeout(socketReconnect, 10000);
 | 
			
		||||
	}
 | 
			
		||||
	/*
 | 
			
		||||
	if (event.wasClean) {
 | 
			
		||||
		alert('Connection was clean closed');
 | 
			
		||||
	} else {
 | 
			
		||||
		alert('Connection was lost');
 | 
			
		||||
	}
 | 
			
		||||
	alert('Code: ' + event.code + ' reason: ' + event.reason);
 | 
			
		||||
	*/
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function socketError(error) {
 | 
			
		||||
| 
						 | 
				
			
			@ -318,28 +310,34 @@ function activateTab(layoutId, tabNumber) {
 | 
			
		|||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function tabClickEvent(layoutId, tabNumber, event) {
 | 
			
		||||
function tabClickEvent(tab, layoutId, tabNumber, event) {
 | 
			
		||||
	event.stopPropagation();
 | 
			
		||||
	event.preventDefault();
 | 
			
		||||
	activateTab(layoutId, tabNumber)
 | 
			
		||||
	if (tab) {
 | 
			
		||||
		tab.blur()
 | 
			
		||||
	}
 | 
			
		||||
	sendMessage("tabClick{session=" + sessionID + ",id=" + layoutId + ",number=" + tabNumber + "}");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function tabKeyClickEvent(layoutId, tabNumber, event) {
 | 
			
		||||
	if (enterOrSpaceKeyClickEvent(event)) {
 | 
			
		||||
		tabClickEvent(layoutId, tabNumber, event)
 | 
			
		||||
		tabClickEvent(null, layoutId, tabNumber, event)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function tabCloseClickEvent(layoutId, tabNumber, event) {
 | 
			
		||||
function tabCloseClickEvent(button, layoutId, tabNumber, event) {
 | 
			
		||||
	event.stopPropagation();
 | 
			
		||||
	event.preventDefault();
 | 
			
		||||
	if (button) {
 | 
			
		||||
		button.blur()
 | 
			
		||||
	}
 | 
			
		||||
	sendMessage("tabCloseClick{session=" + sessionID + ",id=" + layoutId + ",number=" + tabNumber + "}");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function tabCloseKeyClickEvent(layoutId, tabNumber, event) {
 | 
			
		||||
	if (enterOrSpaceKeyClickEvent(event)) {
 | 
			
		||||
		tabCloseClickEvent(layoutId, tabNumber, event)
 | 
			
		||||
		tabCloseClickEvent(null, layoutId, tabNumber, event)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1260,6 +1258,13 @@ function focus(elementId) {
 | 
			
		|||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function blur(elementId) {
 | 
			
		||||
	var element = document.getElementById(elementId);
 | 
			
		||||
	if (element) {
 | 
			
		||||
		element.blur();
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function playerEvent(element, tag) {
 | 
			
		||||
	//event.stopPropagation();
 | 
			
		||||
	sendMessage(tag + "{session=" + sessionID + ",id=" + element.id + "}");
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,6 +2,7 @@ package rui
 | 
			
		|||
 | 
			
		||||
import (
 | 
			
		||||
	"bytes"
 | 
			
		||||
	"context"
 | 
			
		||||
	_ "embed"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"io"
 | 
			
		||||
| 
						 | 
				
			
			@ -13,6 +14,7 @@ import (
 | 
			
		|||
	"path/filepath"
 | 
			
		||||
	"runtime"
 | 
			
		||||
	"strconv"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"time"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -33,6 +35,7 @@ type Application interface {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
type application struct {
 | 
			
		||||
	server            *http.Server
 | 
			
		||||
	params            AppParams
 | 
			
		||||
	createContentFunc func(Session) SessionContent
 | 
			
		||||
	sessions          map[int]Session
 | 
			
		||||
| 
						 | 
				
			
			@ -40,9 +43,22 @@ type application struct {
 | 
			
		|||
 | 
			
		||||
// AppParams defines parameters of the app
 | 
			
		||||
type AppParams struct {
 | 
			
		||||
	Title      string
 | 
			
		||||
	// Title - title of the app window/tab
 | 
			
		||||
	Title string
 | 
			
		||||
	// TitleColor - background color of the app window/tab (applied only for Safari and Chrome for Android)
 | 
			
		||||
	TitleColor Color
 | 
			
		||||
	Icon       string
 | 
			
		||||
	// Icon - the icon file name
 | 
			
		||||
	Icon string
 | 
			
		||||
	// CertFile - path of a certificate for the server must be provided
 | 
			
		||||
	// if neither the Server's TLSConfig.Certificates nor TLSConfig.GetCertificate are populated.
 | 
			
		||||
	// If the certificate is signed by a certificate authority, the certFile should be the concatenation
 | 
			
		||||
	// of the server's certificate, any intermediates, and the CA's certificate.
 | 
			
		||||
	CertFile string
 | 
			
		||||
	// KeyFile - path of a private key for the server must be provided
 | 
			
		||||
	// if neither the Server's TLSConfig.Certificates nor TLSConfig.GetCertificate are populated.
 | 
			
		||||
	KeyFile string
 | 
			
		||||
	// Redirect80 - if true then the function of redirect from port 80 to 443 is created
 | 
			
		||||
	Redirect80 bool
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (app *application) getStartPage() string {
 | 
			
		||||
| 
						 | 
				
			
			@ -90,15 +106,17 @@ func (app *application) getStartPage() string {
 | 
			
		|||
	return buffer.String()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (app *application) Start(addr string) {
 | 
			
		||||
	http.Handle("/", app)
 | 
			
		||||
	log.Fatal(http.ListenAndServe(addr, nil))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (app *application) Finish() {
 | 
			
		||||
	for _, session := range app.sessions {
 | 
			
		||||
		session.close()
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
 | 
			
		||||
	defer cancel()
 | 
			
		||||
 | 
			
		||||
	if err := app.server.Shutdown(ctx); err != nil {
 | 
			
		||||
		log.Println(err.Error())
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (app *application) nextSessionID() int {
 | 
			
		||||
| 
						 | 
				
			
			@ -285,15 +303,62 @@ func (app *application) startSession(params DataObject, events chan DataObject,
 | 
			
		|||
	return session, answerText
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewApplication - create the new application and start it
 | 
			
		||||
var apps = []*application{}
 | 
			
		||||
 | 
			
		||||
// StartApp - create the new application and start it
 | 
			
		||||
func StartApp(addr string, createContentFunc func(Session) SessionContent, params AppParams) {
 | 
			
		||||
	app := new(application)
 | 
			
		||||
	app.params = params
 | 
			
		||||
	app.sessions = map[int]Session{}
 | 
			
		||||
	app.createContentFunc = createContentFunc
 | 
			
		||||
	apps = append(apps, app)
 | 
			
		||||
 | 
			
		||||
	redirectAddr := ""
 | 
			
		||||
	if index := strings.IndexRune(addr, ':'); index >= 0 {
 | 
			
		||||
		redirectAddr = addr[:index] + ":80"
 | 
			
		||||
	} else {
 | 
			
		||||
		redirectAddr = addr + ":80"
 | 
			
		||||
		if params.CertFile != "" && params.KeyFile != "" {
 | 
			
		||||
			addr += ":443"
 | 
			
		||||
		} else {
 | 
			
		||||
			addr += ":80"
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	app.server = &http.Server{Addr: addr}
 | 
			
		||||
	http.Handle("/", app)
 | 
			
		||||
	log.Fatal(http.ListenAndServe(addr, nil))
 | 
			
		||||
 | 
			
		||||
	serverRun := func(err error) {
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			if err == http.ErrServerClosed {
 | 
			
		||||
				log.Println(err)
 | 
			
		||||
			} else {
 | 
			
		||||
				log.Fatal(err)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if params.CertFile != "" && params.KeyFile != "" {
 | 
			
		||||
		if params.Redirect80 {
 | 
			
		||||
			redirectTLS := func(w http.ResponseWriter, r *http.Request) {
 | 
			
		||||
				http.Redirect(w, r, "https://"+addr+r.RequestURI, http.StatusMovedPermanently)
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			go func() {
 | 
			
		||||
				serverRun(http.ListenAndServe(redirectAddr, http.HandlerFunc(redirectTLS)))
 | 
			
		||||
			}()
 | 
			
		||||
		}
 | 
			
		||||
		serverRun(app.server.ListenAndServeTLS(params.CertFile, params.KeyFile))
 | 
			
		||||
	} else {
 | 
			
		||||
		serverRun(app.server.ListenAndServe())
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func FinishApp() {
 | 
			
		||||
	for _, app := range apps {
 | 
			
		||||
		app.Finish()
 | 
			
		||||
	}
 | 
			
		||||
	apps = []*application{}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func OpenBrowser(url string) bool {
 | 
			
		||||
| 
						 | 
				
			
			@ -301,11 +366,20 @@ func OpenBrowser(url string) bool {
 | 
			
		|||
 | 
			
		||||
	switch runtime.GOOS {
 | 
			
		||||
	case "linux":
 | 
			
		||||
		err = exec.Command("xdg-open", url).Start()
 | 
			
		||||
		for _, provider := range []string{"xdg-open", "x-www-browser", "www-browser"} {
 | 
			
		||||
			if _, err = exec.LookPath(provider); err == nil {
 | 
			
		||||
				if exec.Command(provider, url).Start(); err == nil {
 | 
			
		||||
					return true
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	case "windows":
 | 
			
		||||
		err = exec.Command("rundll32", "url.dll,FileProtocolHandler", url).Start()
 | 
			
		||||
 | 
			
		||||
	case "darwin":
 | 
			
		||||
		err = exec.Command("open", url).Start()
 | 
			
		||||
 | 
			
		||||
	default:
 | 
			
		||||
		err = fmt.Errorf("unsupported platform")
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -195,6 +195,7 @@ func (button *checkboxData) changedCheckboxState(state bool) {
 | 
			
		|||
 | 
			
		||||
func checkboxClickListener(view View) {
 | 
			
		||||
	view.Set(Checked, !IsCheckboxChecked(view, ""))
 | 
			
		||||
	BlurView(view)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func checkboxKeyListener(view View, event KeyEvent) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -20,7 +20,7 @@ theme {
 | 
			
		|||
 | 
			
		||||
		ruiTabBarBackgroundColor = #FFEEEEEE,
 | 
			
		||||
		ruiTabColor = #FFD0D0D0,
 | 
			
		||||
		ruiTabTextColor = #FF808080,
 | 
			
		||||
		ruiTabTextColor = #FF404040,
 | 
			
		||||
		ruiCurrentTabColor = #FFFFFFFF,
 | 
			
		||||
		ruiCurrentTabTextColor = #FF000000,
 | 
			
		||||
	},
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -63,7 +63,7 @@ func createEditDemo(session rui.Session) rui.View {
 | 
			
		|||
	})
 | 
			
		||||
 | 
			
		||||
	rui.Set(view, "editMultiLineWrap", rui.CheckboxChangedEvent, func(checkbox rui.Checkbox, checked bool) {
 | 
			
		||||
		rui.Set(view, "editMultiLine", rui.Wrap, checked)
 | 
			
		||||
		rui.Set(view, "editMultiLine", rui.EditWrap, checked)
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	return view
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -44,7 +44,7 @@ func createKeyEventsDemo(session rui.Session) rui.View {
 | 
			
		|||
		rui.Width:        rui.Percent(100),
 | 
			
		||||
		rui.Height:       rui.Percent(100),
 | 
			
		||||
		rui.ReadOnly:     true,
 | 
			
		||||
		rui.Wrap:         true,
 | 
			
		||||
		rui.EditWrap:     true,
 | 
			
		||||
		rui.Hint:         "Set the focus and press a key",
 | 
			
		||||
		rui.EditViewType: rui.MultiLineText,
 | 
			
		||||
		rui.KeyDownEvent: func(view rui.View, event rui.KeyEvent) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -75,7 +75,7 @@ func createListLayoutDemo(session rui.Session) rui.View {
 | 
			
		|||
	})
 | 
			
		||||
 | 
			
		||||
	rui.Set(view, "listWrap", rui.DropDownEvent, func(list rui.DropDownList, number int) {
 | 
			
		||||
		rui.Set(view, "listLayout", rui.Wrap, number)
 | 
			
		||||
		rui.Set(view, "listLayout", rui.ListWrap, number)
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	rui.Set(view, "listHAlign", rui.DropDownEvent, func(list rui.DropDownList, number int) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -55,7 +55,7 @@ func createListViewDemo(session rui.Session) rui.View {
 | 
			
		|||
	})
 | 
			
		||||
 | 
			
		||||
	rui.Set(view, "listWrap", rui.DropDownEvent, func(list rui.DropDownList, number int) {
 | 
			
		||||
		rui.Set(view, "listView", rui.Wrap, number)
 | 
			
		||||
		rui.Set(view, "listView", rui.ListWrap, number)
 | 
			
		||||
	})
 | 
			
		||||
 | 
			
		||||
	setItemSize := func(tag string, number int, values []rui.SizeUnit) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										26
									
								
								editView.go
								
								
								
								
							
							
						
						
									
										26
									
								
								editView.go
								
								
								
								
							| 
						 | 
				
			
			@ -82,6 +82,9 @@ func (edit *editViewData) normalizeTag(tag string) string {
 | 
			
		|||
 | 
			
		||||
	case "maxlength", "maxlen":
 | 
			
		||||
		return MaxLength
 | 
			
		||||
 | 
			
		||||
	case "wrap":
 | 
			
		||||
		return EditWrap
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return tag
 | 
			
		||||
| 
						 | 
				
			
			@ -163,7 +166,7 @@ func (edit *editViewData) remove(tag string) {
 | 
			
		|||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	case Wrap:
 | 
			
		||||
	case EditWrap:
 | 
			
		||||
		if exists {
 | 
			
		||||
			oldWrap := IsEditViewWrap(edit, "")
 | 
			
		||||
			delete(edit.properties, tag)
 | 
			
		||||
| 
						 | 
				
			
			@ -310,9 +313,9 @@ func (edit *editViewData) set(tag string, value interface{}) bool {
 | 
			
		|||
		}
 | 
			
		||||
		return false
 | 
			
		||||
 | 
			
		||||
	case Wrap:
 | 
			
		||||
	case EditWrap:
 | 
			
		||||
		oldWrap := IsEditViewWrap(edit, "")
 | 
			
		||||
		if edit.setBoolProperty(Wrap, value) {
 | 
			
		||||
		if edit.setBoolProperty(EditWrap, value) {
 | 
			
		||||
			if GetEditViewType(edit, "") == MultiLineText {
 | 
			
		||||
				if wrap := IsEditViewWrap(edit, ""); wrap != oldWrap {
 | 
			
		||||
					if edit.created {
 | 
			
		||||
| 
						 | 
				
			
			@ -679,14 +682,14 @@ func GetEditViewPattern(view View, subviewID string) string {
 | 
			
		|||
	return ""
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IsEditViewWrap returns a value of the Wrap property of MultiLineEditView.
 | 
			
		||||
// IsEditViewWrap returns a value of the EditWrap property of MultiLineEditView.
 | 
			
		||||
// If the second argument (subviewID) is "" then a value from the first argument (view) is returned.
 | 
			
		||||
func IsEditViewWrap(view View, subviewID string) bool {
 | 
			
		||||
	if subviewID != "" {
 | 
			
		||||
		view = ViewByID(view, subviewID)
 | 
			
		||||
	}
 | 
			
		||||
	if view != nil {
 | 
			
		||||
		if wrap, ok := boolStyledProperty(view, Wrap); ok {
 | 
			
		||||
		if wrap, ok := boolStyledProperty(view, EditWrap); ok {
 | 
			
		||||
			return wrap
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -708,3 +711,16 @@ func AppendEditText(view View, subviewID string, text string) {
 | 
			
		|||
		edit.AppendText(text)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetCaretColor returns the color of the text input carret.
 | 
			
		||||
// If the second argument (subviewID) is "" then a value from the first argument (view) is returned.
 | 
			
		||||
func GetCaretColor(view View, subviewID string) Color {
 | 
			
		||||
	if subviewID != "" {
 | 
			
		||||
		view = ViewByID(view, subviewID)
 | 
			
		||||
	}
 | 
			
		||||
	if view == nil {
 | 
			
		||||
		return 0
 | 
			
		||||
	}
 | 
			
		||||
	t, _ := colorStyledProperty(view, CaretColor)
 | 
			
		||||
	return t
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										5
									
								
								go.mod
								
								
								
								
							
							
						
						
									
										5
									
								
								go.mod
								
								
								
								
							| 
						 | 
				
			
			@ -2,4 +2,7 @@ module github.com/anoshenko/rui
 | 
			
		|||
 | 
			
		||||
go 1.17
 | 
			
		||||
 | 
			
		||||
require github.com/gorilla/websocket v1.5.0
 | 
			
		||||
require (
 | 
			
		||||
	github.com/gorilla/websocket v1.5.0
 | 
			
		||||
	github.com/webview/webview v0.0.0-20220603044542-dc41cdcc2961
 | 
			
		||||
)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										4
									
								
								go.sum
								
								
								
								
							
							
						
						
									
										4
									
								
								go.sum
								
								
								
								
							| 
						 | 
				
			
			@ -1,4 +1,4 @@
 | 
			
		|||
github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc=
 | 
			
		||||
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
 | 
			
		||||
github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc=
 | 
			
		||||
github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
 | 
			
		||||
github.com/webview/webview v0.0.0-20220603044542-dc41cdcc2961 h1:T+zDKQvVOtbfrJwy8H1yn3ZtWuwbGu07aLih+qwFCsQ=
 | 
			
		||||
github.com/webview/webview v0.0.0-20220603044542-dc41cdcc2961/go.mod h1:rpXAuuHgyEJb6kXcXldlkOjU6y4x+YcASKKXJNUhh0Y=
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -329,7 +329,7 @@ func GetCellVerticalAlign(view View, subviewID string) int {
 | 
			
		|||
		view = ViewByID(view, subviewID)
 | 
			
		||||
	}
 | 
			
		||||
	if view != nil {
 | 
			
		||||
		if align, ok := enumProperty(view, CellVerticalAlign, view.Session(), StretchAlign); ok {
 | 
			
		||||
		if align, ok := enumStyledProperty(view, CellVerticalAlign, StretchAlign); ok {
 | 
			
		||||
			return align
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -343,13 +343,27 @@ func GetCellHorizontalAlign(view View, subviewID string) int {
 | 
			
		|||
		view = ViewByID(view, subviewID)
 | 
			
		||||
	}
 | 
			
		||||
	if view != nil {
 | 
			
		||||
		if align, ok := enumProperty(view, CellHorizontalAlign, view.Session(), StretchAlign); ok {
 | 
			
		||||
		if align, ok := enumStyledProperty(view, CellHorizontalAlign, StretchAlign); ok {
 | 
			
		||||
			return align
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return StretchAlign
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetGridAutoFlow returns the value of the  "grid-auto-flow" property
 | 
			
		||||
// If the second argument (subviewID) is "" then a value from the first argument (view) is returned.
 | 
			
		||||
func GetGridAutoFlow(view View, subviewID string) int {
 | 
			
		||||
	if subviewID != "" {
 | 
			
		||||
		view = ViewByID(view, subviewID)
 | 
			
		||||
	}
 | 
			
		||||
	if view != nil {
 | 
			
		||||
		if align, ok := enumStyledProperty(view, GridAutoFlow, 0); ok {
 | 
			
		||||
			return align
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetCellWidth returns the width of a GridLayout cell. If the result is an empty array, then the width is not set.
 | 
			
		||||
// If the result is a single value array, then the width of all cell is equal.
 | 
			
		||||
// If the second argument (subviewID) is "" then a value from the first argument (view) is returned.
 | 
			
		||||
| 
						 | 
				
			
			@ -383,7 +397,7 @@ func GetGridRowGap(view View, subviewID string) SizeUnit {
 | 
			
		|||
		view = ViewByID(view, subviewID)
 | 
			
		||||
	}
 | 
			
		||||
	if view != nil {
 | 
			
		||||
		if result, ok := sizeProperty(view, GridRowGap, view.Session()); ok {
 | 
			
		||||
		if result, ok := sizeStyledProperty(view, GridRowGap); ok {
 | 
			
		||||
			return result
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -397,7 +411,7 @@ func GetGridColumnGap(view View, subviewID string) SizeUnit {
 | 
			
		|||
		view = ViewByID(view, subviewID)
 | 
			
		||||
	}
 | 
			
		||||
	if view != nil {
 | 
			
		||||
		if result, ok := sizeProperty(view, GridColumnGap, view.Session()); ok {
 | 
			
		||||
		if result, ok := sizeStyledProperty(view, GridColumnGap); ok {
 | 
			
		||||
			return result
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -13,12 +13,12 @@ const (
 | 
			
		|||
	BottomUpOrientation = 2
 | 
			
		||||
	// EndToStartOrientation - subviews are arranged from right to left
 | 
			
		||||
	EndToStartOrientation = 3
 | 
			
		||||
	// WrapOff - subviews are scrolled and "true" if a new row/column starts
 | 
			
		||||
	WrapOff = 0
 | 
			
		||||
	// WrapOn - the new row/column starts at bottom/right
 | 
			
		||||
	WrapOn = 1
 | 
			
		||||
	// WrapReverse - the new row/column starts at top/left
 | 
			
		||||
	WrapReverse = 2
 | 
			
		||||
	// ListWrapOff - subviews are scrolled and "true" if a new row/column starts
 | 
			
		||||
	ListWrapOff = 0
 | 
			
		||||
	// ListWrapOn - the new row/column starts at bottom/right
 | 
			
		||||
	ListWrapOn = 1
 | 
			
		||||
	// ListWrapReverse - the new row/column starts at top/left
 | 
			
		||||
	ListWrapReverse = 2
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// ListLayout - list-container of View
 | 
			
		||||
| 
						 | 
				
			
			@ -53,22 +53,35 @@ func (listLayout *listLayoutData) String() string {
 | 
			
		|||
	return getViewString(listLayout)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (listLayout *listLayoutData) normalizeTag(tag string) string {
 | 
			
		||||
	tag = strings.ToLower(tag)
 | 
			
		||||
	switch tag {
 | 
			
		||||
	case "wrap":
 | 
			
		||||
		tag = ListWrap
 | 
			
		||||
	}
 | 
			
		||||
	return tag
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (listLayout *listLayoutData) Get(tag string) interface{} {
 | 
			
		||||
	return listLayout.get(listLayout.normalizeTag(tag))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (listLayout *listLayoutData) Remove(tag string) {
 | 
			
		||||
	listLayout.remove(strings.ToLower(tag))
 | 
			
		||||
	listLayout.remove(listLayout.normalizeTag(tag))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (listLayout *listLayoutData) remove(tag string) {
 | 
			
		||||
	listLayout.viewsContainerData.remove(tag)
 | 
			
		||||
	if listLayout.created {
 | 
			
		||||
		switch tag {
 | 
			
		||||
		case Orientation, Wrap, HorizontalAlign, VerticalAlign:
 | 
			
		||||
		case Orientation, ListWrap, HorizontalAlign, VerticalAlign:
 | 
			
		||||
			updateCSSStyle(listLayout.htmlID(), listLayout.session)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (listLayout *listLayoutData) Set(tag string, value interface{}) bool {
 | 
			
		||||
	return listLayout.set(strings.ToLower(tag), value)
 | 
			
		||||
	return listLayout.set(listLayout.normalizeTag(tag), value)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (listLayout *listLayoutData) set(tag string, value interface{}) bool {
 | 
			
		||||
| 
						 | 
				
			
			@ -80,7 +93,7 @@ func (listLayout *listLayoutData) set(tag string, value interface{}) bool {
 | 
			
		|||
	if listLayout.viewsContainerData.set(tag, value) {
 | 
			
		||||
		if listLayout.created {
 | 
			
		||||
			switch tag {
 | 
			
		||||
			case Orientation, Wrap, HorizontalAlign, VerticalAlign:
 | 
			
		||||
			case Orientation, ListWrap, HorizontalAlign, VerticalAlign:
 | 
			
		||||
				updateCSSStyle(listLayout.htmlID(), listLayout.session)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			@ -157,9 +170,9 @@ func GetListWrap(view View, subviewID string) int {
 | 
			
		|||
		view = ViewByID(view, subviewID)
 | 
			
		||||
	}
 | 
			
		||||
	if view != nil {
 | 
			
		||||
		if result, ok := enumStyledProperty(view, Wrap, 0); ok {
 | 
			
		||||
		if result, ok := enumStyledProperty(view, ListWrap, 0); ok {
 | 
			
		||||
			return result
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return WrapOff
 | 
			
		||||
	return ListWrapOff
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										58
									
								
								listView.go
								
								
								
								
							
							
						
						
									
										58
									
								
								listView.go
								
								
								
								
							| 
						 | 
				
			
			@ -107,6 +107,9 @@ func (listView *listViewData) normalizeTag(tag string) string {
 | 
			
		|||
 | 
			
		||||
	case VerticalAlign:
 | 
			
		||||
		tag = ItemVerticalAlign
 | 
			
		||||
 | 
			
		||||
	case "wrap":
 | 
			
		||||
		tag = ListWrap
 | 
			
		||||
	}
 | 
			
		||||
	return tag
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -135,7 +138,7 @@ func (listView *listViewData) remove(tag string) {
 | 
			
		|||
			listView.propertyChangedEvent(tag)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	case Orientation, Wrap:
 | 
			
		||||
	case Orientation, ListWrap:
 | 
			
		||||
		if _, ok := listView.properties[tag]; ok {
 | 
			
		||||
			delete(listView.properties, tag)
 | 
			
		||||
			if listView.created {
 | 
			
		||||
| 
						 | 
				
			
			@ -252,7 +255,7 @@ func (listView *listViewData) set(tag string, value interface{}) bool {
 | 
			
		|||
			listener(listView, current)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	case Orientation, Wrap, VerticalAlign, HorizontalAlign, Style, StyleDisabled, ItemWidth, ItemHeight:
 | 
			
		||||
	case Orientation, ListWrap, VerticalAlign, HorizontalAlign, Style, StyleDisabled, ItemWidth, ItemHeight:
 | 
			
		||||
		result := listView.viewData.set(tag, value)
 | 
			
		||||
		if result && listView.created {
 | 
			
		||||
			updateInnerHTML(listView.htmlID(), listView.session)
 | 
			
		||||
| 
						 | 
				
			
			@ -764,37 +767,34 @@ func (listView *listViewData) getItemView(index int) View {
 | 
			
		|||
	return listView.items[index]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (listView *listViewData) listItemStyle() string {
 | 
			
		||||
	if value := listView.getRaw(ListItemStyle); value != nil {
 | 
			
		||||
func (listView *listViewData) itemStyle(tag, defaultStyle string) string {
 | 
			
		||||
	if value := listView.getRaw(tag); value != nil {
 | 
			
		||||
		if style, ok := value.(string); ok {
 | 
			
		||||
			if style, ok = listView.session.resolveConstants(style); ok {
 | 
			
		||||
				return style
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return "ruiListItem"
 | 
			
		||||
	if value := valueFromStyle(listView, tag); value != nil {
 | 
			
		||||
		if style, ok := value.(string); ok {
 | 
			
		||||
			if style, ok = listView.session.resolveConstants(style); ok {
 | 
			
		||||
				return style
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return defaultStyle
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (listView *listViewData) listItemStyle() string {
 | 
			
		||||
	return listView.itemStyle(ListItemStyle, "ruiListItem")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (listView *listViewData) currentStyle() string {
 | 
			
		||||
	if value := listView.getRaw(CurrentStyle); value != nil {
 | 
			
		||||
		if style, ok := value.(string); ok {
 | 
			
		||||
			if style, ok = listView.session.resolveConstants(style); ok {
 | 
			
		||||
				return style
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return "ruiListItemFocused"
 | 
			
		||||
	return listView.itemStyle(CurrentStyle, "ruiListItemFocused")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (listView *listViewData) currentInactiveStyle() string {
 | 
			
		||||
	if value := listView.getRaw(CurrentInactiveStyle); value != nil {
 | 
			
		||||
		if style, ok := value.(string); ok {
 | 
			
		||||
			if style, ok = listView.session.resolveConstants(style); ok {
 | 
			
		||||
				return style
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return "ruiListItemSelected"
 | 
			
		||||
	return listView.itemStyle(CurrentInactiveStyle, "ruiListItemSelected")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (listView *listViewData) checkboxSubviews(self View, buffer *strings.Builder, checkbox int) {
 | 
			
		||||
| 
						 | 
				
			
			@ -981,13 +981,13 @@ func (listView *listViewData) htmlSubviews(self View, buffer *strings.Builder) {
 | 
			
		|||
	rows := (orientation == StartToEndOrientation || orientation == EndToStartOrientation)
 | 
			
		||||
 | 
			
		||||
	if rows {
 | 
			
		||||
		if wrap == WrapOff {
 | 
			
		||||
		if wrap == ListWrapOff {
 | 
			
		||||
			buffer.WriteString(` min-width: 100%; height: 100%;`)
 | 
			
		||||
		} else {
 | 
			
		||||
			buffer.WriteString(` width: 100%; min-height: 100%;`)
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		if wrap == WrapOff {
 | 
			
		||||
		if wrap == ListWrapOff {
 | 
			
		||||
			buffer.WriteString(` width: 100%; min-height: 100%;`)
 | 
			
		||||
		} else {
 | 
			
		||||
			buffer.WriteString(` min-width: 100%; height: 100%;`)
 | 
			
		||||
| 
						 | 
				
			
			@ -998,10 +998,10 @@ func (listView *listViewData) htmlSubviews(self View, buffer *strings.Builder) {
 | 
			
		|||
	buffer.WriteString(enumProperties[Orientation].cssValues[orientation])
 | 
			
		||||
 | 
			
		||||
	switch wrap {
 | 
			
		||||
	case WrapOn:
 | 
			
		||||
	case ListWrapOn:
 | 
			
		||||
		buffer.WriteString(` wrap;`)
 | 
			
		||||
 | 
			
		||||
	case WrapReverse:
 | 
			
		||||
	case ListWrapReverse:
 | 
			
		||||
		buffer.WriteString(` wrap-reverse;`)
 | 
			
		||||
 | 
			
		||||
	default:
 | 
			
		||||
| 
						 | 
				
			
			@ -1021,13 +1021,13 @@ func (listView *listViewData) htmlSubviews(self View, buffer *strings.Builder) {
 | 
			
		|||
	if align, ok := enumStyledProperty(listView, HorizontalAlign, LeftAlign); ok {
 | 
			
		||||
		switch align {
 | 
			
		||||
		case LeftAlign:
 | 
			
		||||
			if (!rows && wrap == WrapReverse) || orientation == EndToStartOrientation {
 | 
			
		||||
			if (!rows && wrap == ListWrapReverse) || orientation == EndToStartOrientation {
 | 
			
		||||
				value = `flex-end`
 | 
			
		||||
			} else {
 | 
			
		||||
				value = `flex-start`
 | 
			
		||||
			}
 | 
			
		||||
		case RightAlign:
 | 
			
		||||
			if (!rows && wrap == WrapReverse) || orientation == EndToStartOrientation {
 | 
			
		||||
			if (!rows && wrap == ListWrapReverse) || orientation == EndToStartOrientation {
 | 
			
		||||
				value = `flex-start`
 | 
			
		||||
			} else {
 | 
			
		||||
				value = `flex-end`
 | 
			
		||||
| 
						 | 
				
			
			@ -1056,13 +1056,13 @@ func (listView *listViewData) htmlSubviews(self View, buffer *strings.Builder) {
 | 
			
		|||
	if align, ok := enumStyledProperty(listView, VerticalAlign, TopAlign); ok {
 | 
			
		||||
		switch align {
 | 
			
		||||
		case TopAlign:
 | 
			
		||||
			if (rows && wrap == WrapReverse) || orientation == BottomUpOrientation {
 | 
			
		||||
			if (rows && wrap == ListWrapReverse) || orientation == BottomUpOrientation {
 | 
			
		||||
				value = `flex-end`
 | 
			
		||||
			} else {
 | 
			
		||||
				value = `flex-start`
 | 
			
		||||
			}
 | 
			
		||||
		case BottomAlign:
 | 
			
		||||
			if (rows && wrap == WrapReverse) || orientation == BottomUpOrientation {
 | 
			
		||||
			if (rows && wrap == ListWrapReverse) || orientation == BottomUpOrientation {
 | 
			
		||||
				value = `flex-start`
 | 
			
		||||
			} else {
 | 
			
		||||
				value = `flex-end`
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										204
									
								
								propertyNames.go
								
								
								
								
							
							
						
						
									
										204
									
								
								propertyNames.go
								
								
								
								
							| 
						 | 
				
			
			@ -2,109 +2,154 @@ package rui
 | 
			
		|||
 | 
			
		||||
const (
 | 
			
		||||
	// ID is the constant for the "id" property tag.
 | 
			
		||||
	// The "id" property is an optional textual identifier for the View.
 | 
			
		||||
	ID = "id"
 | 
			
		||||
 | 
			
		||||
	// Style is the constant for the "style" property tag.
 | 
			
		||||
	// The string "style" property sets the name of the style that is applied to the View when the "disabled" property is set to false
 | 
			
		||||
	// or "style-disabled" property is not defined.
 | 
			
		||||
	Style = "style"
 | 
			
		||||
 | 
			
		||||
	// StyleDisabled is the constant for the "style-disabled" property tag.
 | 
			
		||||
	// The string "style-disabled" property sets the name of the style that is applied to the View when the "disabled" property is set to true.
 | 
			
		||||
	StyleDisabled = "style-disabled"
 | 
			
		||||
 | 
			
		||||
	// Disabled is the constant for the "disabled" property tag.
 | 
			
		||||
	// The bool "disabled" property allows/denies the View to receive focus.
 | 
			
		||||
	Disabled = "disabled"
 | 
			
		||||
 | 
			
		||||
	// Focusable is the constant for the "disabled" property tag.
 | 
			
		||||
	// The bool "focusable" determines whether the view will receive focus.
 | 
			
		||||
	Focusable = "focusable"
 | 
			
		||||
 | 
			
		||||
	// Semantics is the constant for the "semantics" property tag.
 | 
			
		||||
	// The "semantics" property defines the semantic meaning of the View.
 | 
			
		||||
	// This property may have no visible effect, but it allows search engines to understand the structure of your application.
 | 
			
		||||
	// It also helps to voice the interface to systems for people with disabilities.
 | 
			
		||||
	Semantics = "semantics"
 | 
			
		||||
 | 
			
		||||
	// Visibility is the constant for the "visibility" property tag.
 | 
			
		||||
	// The "visibility" int property specifies the visibility of the View. Valid values are
 | 
			
		||||
	// * Visible (0) - the View is visible (default value);
 | 
			
		||||
	// * Invisible (1) - the View is invisible but takes up space;
 | 
			
		||||
	// * Gone (2) - the View is invisible and does not take up space.
 | 
			
		||||
	Visibility = "visibility"
 | 
			
		||||
 | 
			
		||||
	// ZIndex is the constant for the "z-index" property tag.
 | 
			
		||||
	// The int "z-index" property sets the z-order of a positioned view.
 | 
			
		||||
	// Overlapping views with a larger z-index cover those with a smaller one.
 | 
			
		||||
	ZIndex = "z-index"
 | 
			
		||||
 | 
			
		||||
	// Opacity is the constant for the "opacity" property tag.
 | 
			
		||||
	// The float "opacity" property in [1..0] range sets the opacity of an element.
 | 
			
		||||
	// Opacity is the degree to which content behind an element is hidden, and is the opposite of transparency.
 | 
			
		||||
	Opacity = "opacity"
 | 
			
		||||
 | 
			
		||||
	// Row is the constant for the "row" property tag.
 | 
			
		||||
	Row = "row"
 | 
			
		||||
 | 
			
		||||
	// Column is the constant for the "column" property tag.
 | 
			
		||||
	Column = "column"
 | 
			
		||||
 | 
			
		||||
	// Left is the constant for the "left" property tag.
 | 
			
		||||
	// The "left" SizeUnit property participates in specifying the left border position of a positioned view.
 | 
			
		||||
	// Used only for views placed in an AbsoluteLayout.
 | 
			
		||||
	Left = "left"
 | 
			
		||||
 | 
			
		||||
	// Right is the constant for the "right" property tag.
 | 
			
		||||
	// The "right" SizeUnit property participates in specifying the right border position of a positioned view.
 | 
			
		||||
	// Used only for views placed in an AbsoluteLayout.
 | 
			
		||||
	Right = "right"
 | 
			
		||||
 | 
			
		||||
	// Top is the constant for the "top" property tag.
 | 
			
		||||
	// The "top" SizeUnit property participates in specifying the top border position of a positioned view.
 | 
			
		||||
	// Used only for views placed in an AbsoluteLayout.
 | 
			
		||||
	Top = "top"
 | 
			
		||||
 | 
			
		||||
	// Bottom is the constant for the "bottom" property tag.
 | 
			
		||||
	// The "bottom" SizeUnit property participates in specifying the bottom border position of a positioned view.
 | 
			
		||||
	// Used only for views placed in an AbsoluteLayout.
 | 
			
		||||
	Bottom = "bottom"
 | 
			
		||||
 | 
			
		||||
	// Width is the constant for the "width" property tag.
 | 
			
		||||
	// The "width" SizeUnit property sets an view's width.
 | 
			
		||||
	Width = "width"
 | 
			
		||||
 | 
			
		||||
	// Height is the constant for the "height" property tag.
 | 
			
		||||
	// The "height" SizeUnit property sets an view's height.
 | 
			
		||||
	Height = "height"
 | 
			
		||||
 | 
			
		||||
	// MinWidth is the constant for the "min-width" property tag.
 | 
			
		||||
	// The "width" SizeUnit property sets an view's minimal width.
 | 
			
		||||
	MinWidth = "min-width"
 | 
			
		||||
 | 
			
		||||
	// MinHeight is the constant for the "min-height" property tag.
 | 
			
		||||
	// The "height" SizeUnit property sets an view's minimal height.
 | 
			
		||||
	MinHeight = "min-height"
 | 
			
		||||
 | 
			
		||||
	// MaxWidth is the constant for the "max-width" property tag.
 | 
			
		||||
	// The "width" SizeUnit property sets an view's maximal width.
 | 
			
		||||
	MaxWidth = "max-width"
 | 
			
		||||
 | 
			
		||||
	// MaxHeight is the constant for the "max-height" property tag.
 | 
			
		||||
	// The "height" SizeUnit property sets an view's maximal height.
 | 
			
		||||
	MaxHeight = "max-height"
 | 
			
		||||
 | 
			
		||||
	// Margin is the constant for the "margin" property tag.
 | 
			
		||||
	// The "margin" property sets the margin area on all four sides of an element.
 | 
			
		||||
	// ...
 | 
			
		||||
	Margin = "margin"
 | 
			
		||||
 | 
			
		||||
	// MarginLeft is the constant for the "margin-left" property tag.
 | 
			
		||||
	// The "margin-left" SizeUnit property sets the margin area on the left of a view.
 | 
			
		||||
	// A positive value places it farther from its neighbors, while a negative value places it closer.
 | 
			
		||||
	MarginLeft = "margin-left"
 | 
			
		||||
 | 
			
		||||
	// MarginRight is the constant for the "margin-right" property tag.
 | 
			
		||||
	// The "margin-right" SizeUnit property sets the margin area on the right of a view.
 | 
			
		||||
	// A positive value places it farther from its neighbors, while a negative value places it closer.
 | 
			
		||||
	MarginRight = "margin-right"
 | 
			
		||||
 | 
			
		||||
	// MarginTop is the constant for the "margin-top" property tag.
 | 
			
		||||
	// The "margin-top" SizeUnit property sets the margin area on the top of a view.
 | 
			
		||||
	// A positive value places it farther from its neighbors, while a negative value places it closer.
 | 
			
		||||
	MarginTop = "margin-top"
 | 
			
		||||
 | 
			
		||||
	// MarginBottom is the constant for the "margin-bottom" property tag.
 | 
			
		||||
	// The "margin-bottom" SizeUnit property sets the margin area on the bottom of a view.
 | 
			
		||||
	// A positive value places it farther from its neighbors, while a negative value places it closer.
 | 
			
		||||
	MarginBottom = "margin-bottom"
 | 
			
		||||
 | 
			
		||||
	// Padding is the constant for the "padding" property tag.
 | 
			
		||||
	// The "padding" Bounds property sets the padding area on all four sides of a view at once.
 | 
			
		||||
	// An element's padding area is the space between its content and its border.
 | 
			
		||||
	Padding = "padding"
 | 
			
		||||
 | 
			
		||||
	// PaddingLeft is the constant for the "padding-left" property tag.
 | 
			
		||||
	// The "padding-left" SizeUnit property sets the width of the padding area to the left of a view.
 | 
			
		||||
	PaddingLeft = "padding-left"
 | 
			
		||||
 | 
			
		||||
	// PaddingRight is the constant for the "padding-right" property tag.
 | 
			
		||||
	// The "padding-right" SizeUnit property sets the width of the padding area to the right of a view.
 | 
			
		||||
	PaddingRight = "padding-right"
 | 
			
		||||
 | 
			
		||||
	// PaddingTop is the constant for the "padding-top" property tag.
 | 
			
		||||
	// The "padding-top" SizeUnit property sets the height of the padding area to the top of a view.
 | 
			
		||||
	PaddingTop = "padding-top"
 | 
			
		||||
 | 
			
		||||
	// PaddingBottom is the constant for the "padding-bottom" property tag.
 | 
			
		||||
	// The "padding-bottom" SizeUnit property sets the height of the padding area to the bottom of a view.
 | 
			
		||||
	PaddingBottom = "padding-bottom"
 | 
			
		||||
 | 
			
		||||
	// BackgroundColor is the constant for the "background-color" property tag.
 | 
			
		||||
	// The "background-color" property sets the background color of a view.
 | 
			
		||||
	BackgroundColor = "background-color"
 | 
			
		||||
 | 
			
		||||
	// Background is the constant for the "background" property tag.
 | 
			
		||||
	// The "background" property sets one or more background images and/or gradients on a view.
 | 
			
		||||
	// ...
 | 
			
		||||
	Background = "background"
 | 
			
		||||
 | 
			
		||||
	// Cursor is the constant for the "cursor" property tag.
 | 
			
		||||
	// The "cursor" int property sets the type of mouse cursor, if any, to show when the mouse pointer is over a view
 | 
			
		||||
	// Valid values are "auto" (0), "default" (1), "none" (2), "context-menu" (3), "help" (4), "pointer" (5),
 | 
			
		||||
| 
						 | 
				
			
			@ -114,155 +159,196 @@ const (
 | 
			
		|||
	// "ew-resize" (25), "ns-resize" (26), "nesw-resize" (27), "nwse-resize" (28), "col-resize" (29),
 | 
			
		||||
	// "row-resize" (30), "all-scroll" (31), "zoom-in" (32), "zoom-out" (33), "grab" (34), "grabbing" (35).
 | 
			
		||||
	Cursor = "cursor"
 | 
			
		||||
 | 
			
		||||
	// Border is the constant for the "border" property tag.
 | 
			
		||||
	// The "border" property sets a view's border. It sets the values of a border width, style, and color.
 | 
			
		||||
	// This property can be assigned a value of BorderProperty type, or ViewBorder type, or BorderProperty text representation.
 | 
			
		||||
	Border = "border"
 | 
			
		||||
 | 
			
		||||
	// BorderLeft is the constant for the "border-left" property tag.
 | 
			
		||||
	// The "border-left" property sets a view's left border. It sets the values of a border width, style, and color.
 | 
			
		||||
	// This property can be assigned a value of BorderProperty type, or ViewBorder type, or BorderProperty text representation.
 | 
			
		||||
	BorderLeft = "border-left"
 | 
			
		||||
 | 
			
		||||
	// BorderRight is the constant for the "border-right" property tag.
 | 
			
		||||
	// The "border-right" property sets a view's right border. It sets the values of a border width, style, and color.
 | 
			
		||||
	// This property can be assigned a value of BorderProperty type, or ViewBorder type, or BorderProperty text representation.
 | 
			
		||||
	BorderRight = "border-right"
 | 
			
		||||
 | 
			
		||||
	// BorderTop is the constant for the "border-top" property tag.
 | 
			
		||||
	// The "border-top" property sets a view's top border. It sets the values of a border width, style, and color.
 | 
			
		||||
	// This property can be assigned a value of BorderProperty type, or ViewBorder type, or BorderProperty text representation.
 | 
			
		||||
	BorderTop = "border-top"
 | 
			
		||||
 | 
			
		||||
	// BorderBottom is the constant for the "border-bottom" property tag.
 | 
			
		||||
	// The "border-bottom" property sets a view's bottom border. It sets the values of a border width, style, and color.
 | 
			
		||||
	// This property can be assigned a value of BorderProperty type, or ViewBorder type, or BorderProperty text representation.
 | 
			
		||||
	BorderBottom = "border-bottom"
 | 
			
		||||
 | 
			
		||||
	// BorderStyle is the constant for the "border-style" property tag.
 | 
			
		||||
	// The "border-style" property sets the line style for all four sides of a view's border.
 | 
			
		||||
	// Valid values are NoneLine (0), SolidLine (1), DashedLine (2), DottedLine (3), and DoubleLine (4).
 | 
			
		||||
	BorderStyle = "border-style"
 | 
			
		||||
 | 
			
		||||
	// BorderLeftStyle is the constant for the "border-left-style" property tag.
 | 
			
		||||
	// The "border-left-style" int property sets the line style of a view's left border.
 | 
			
		||||
	// Valid values are NoneLine (0), SolidLine (1), DashedLine (2), DottedLine (3), and DoubleLine (4).
 | 
			
		||||
	BorderLeftStyle = "border-left-style"
 | 
			
		||||
 | 
			
		||||
	// BorderRightStyle is the constant for the "border-right-style" property tag.
 | 
			
		||||
	// The "border-right-style" int property sets the line style of a view's right border.
 | 
			
		||||
	// Valid values are NoneLine (0), SolidLine (1), DashedLine (2), DottedLine (3), and DoubleLine (4).
 | 
			
		||||
	BorderRightStyle = "border-right-style"
 | 
			
		||||
 | 
			
		||||
	// BorderTopStyle is the constant for the "border-top-style" property tag.
 | 
			
		||||
	// The "border-top-style" int property sets the line style of a view's top border.
 | 
			
		||||
	// Valid values are NoneLine (0), SolidLine (1), DashedLine (2), DottedLine (3), and DoubleLine (4).
 | 
			
		||||
	BorderTopStyle = "border-top-style"
 | 
			
		||||
 | 
			
		||||
	// BorderBottomStyle is the constant for the "border-bottom-style" property tag.
 | 
			
		||||
	// The "border-bottom-style" int property sets the line style of a view's bottom border.
 | 
			
		||||
	// Valid values are NoneLine (0), SolidLine (1), DashedLine (2), DottedLine (3), and DoubleLine (4).
 | 
			
		||||
	BorderBottomStyle = "border-bottom-style"
 | 
			
		||||
 | 
			
		||||
	// BorderWidth is the constant for the "border-width" property tag.
 | 
			
		||||
	// The "border-width" property sets the line width for all four sides of a view's border.
 | 
			
		||||
	BorderWidth = "border-width"
 | 
			
		||||
 | 
			
		||||
	// BorderLeftWidth is the constant for the "border-left-width" property tag.
 | 
			
		||||
	// The "border-left-width" SizeUnit property sets the line width of a view's left border.
 | 
			
		||||
	BorderLeftWidth = "border-left-width"
 | 
			
		||||
 | 
			
		||||
	// BorderRightWidth is the constant for the "border-right-width" property tag.
 | 
			
		||||
	// The "border-right-width" SizeUnit property sets the line width of a view's right border.
 | 
			
		||||
	BorderRightWidth = "border-right-width"
 | 
			
		||||
 | 
			
		||||
	// BorderTopWidth is the constant for the "border-top-width" property tag.
 | 
			
		||||
	// The "border-top-width" SizeUnit property sets the line width of a view's top border.
 | 
			
		||||
	BorderTopWidth = "border-top-width"
 | 
			
		||||
 | 
			
		||||
	// BorderBottomWidth is the constant for the "border-bottom-width" property tag.
 | 
			
		||||
	// The "border-bottom-width" SizeUnit property sets the line width of a view's bottom border.
 | 
			
		||||
	BorderBottomWidth = "border-bottom-width"
 | 
			
		||||
 | 
			
		||||
	// BorderColor is the constant for the "border-color" property tag.
 | 
			
		||||
	// The "border-color" property sets the line color for all four sides of a view's border.
 | 
			
		||||
	BorderColor = "border-color"
 | 
			
		||||
 | 
			
		||||
	// BorderLeftColor is the constant for the "border-left-color" property tag.
 | 
			
		||||
	// The "border-left-color" property sets the line color of a view's left border.
 | 
			
		||||
	BorderLeftColor = "border-left-color"
 | 
			
		||||
 | 
			
		||||
	// BorderRightColor is the constant for the "border-right-color" property tag.
 | 
			
		||||
	// The "border-right-color" property sets the line color of a view's right border.
 | 
			
		||||
	BorderRightColor = "border-right-color"
 | 
			
		||||
 | 
			
		||||
	// BorderTopColor is the constant for the "border-top-color" property tag.
 | 
			
		||||
	// The "border-top-color" property sets the line color of a view's top border.
 | 
			
		||||
	BorderTopColor = "border-top-color"
 | 
			
		||||
 | 
			
		||||
	// BorderBottomColor is the constant for the "border-bottom-color" property tag.
 | 
			
		||||
	// The "border-bottom-color" property sets the line color of a view's bottom border.
 | 
			
		||||
	BorderBottomColor = "border-bottom-color"
 | 
			
		||||
 | 
			
		||||
	// Outline is the constant for the "outline" property tag.
 | 
			
		||||
	// The "border" property sets a view's outline. It sets the values of an outline width, style, and color.
 | 
			
		||||
	Outline = "outline"
 | 
			
		||||
 | 
			
		||||
	// OutlineStyle is the constant for the "outline-style" property tag.
 | 
			
		||||
	// The "outline-style" int property sets the style of an view's outline.
 | 
			
		||||
	// Valid values are NoneLine (0), SolidLine (1), DashedLine (2), DottedLine (3), and DoubleLine (4).
 | 
			
		||||
	OutlineStyle = "outline-style"
 | 
			
		||||
 | 
			
		||||
	// OutlineColor is the constant for the "outline-color" property tag.
 | 
			
		||||
	// The "outline-color" property sets the color of an view's outline.
 | 
			
		||||
	OutlineColor = "outline-color"
 | 
			
		||||
 | 
			
		||||
	// OutlineWidth is the constant for the "outline-width" property tag.
 | 
			
		||||
	// The "outline-width" SizeUnit property sets the width of an view's outline.
 | 
			
		||||
	OutlineWidth = "outline-width"
 | 
			
		||||
 | 
			
		||||
	// Shadow is the constant for the "shadow" property tag.
 | 
			
		||||
	// 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.
 | 
			
		||||
	// ...
 | 
			
		||||
	Shadow = "shadow"
 | 
			
		||||
 | 
			
		||||
	// FontName is the constant for the "font-name" property tag.
 | 
			
		||||
	// The "font-name" string property specifies a prioritized list of one or more font family names and/or
 | 
			
		||||
	// generic family names for the selected view. Values are separated by commas to indicate that they are alternatives.
 | 
			
		||||
	// This is an inherited property, i.e. if it is not defined, then the value of the parent view is used.
 | 
			
		||||
	FontName = "font-name"
 | 
			
		||||
 | 
			
		||||
	// TextColor is the constant for the "text-color" property tag.
 | 
			
		||||
	// The "color" property sets the foreground color value of a view's text and text decorations.
 | 
			
		||||
	// This is an inherited property, i.e. if it is not defined, then the value of the parent view is used.
 | 
			
		||||
	TextColor = "text-color"
 | 
			
		||||
 | 
			
		||||
	// TextSize is the constant for the "text-size" property tag.
 | 
			
		||||
	// The "text-size" SizeUnit property sets the size of the font.
 | 
			
		||||
	// This is an inherited property, i.e. if it is not defined, then the value of the parent view is used.
 | 
			
		||||
	TextSize = "text-size"
 | 
			
		||||
 | 
			
		||||
	// Italic is the constant for the "italic" property tag.
 | 
			
		||||
	// The "italic" is the bool property. If it is "true" then a text is displayed in italics.
 | 
			
		||||
	// This is an inherited property, i.e. if it is not defined, then the value of the parent view is used.
 | 
			
		||||
	Italic = "italic"
 | 
			
		||||
 | 
			
		||||
	// SmallCaps is the constant for the "small-caps" property tag.
 | 
			
		||||
	// The "small-caps" is the bool property. If it is "true" then a text is displayed in small caps.
 | 
			
		||||
	// This is an inherited property, i.e. if it is not defined, then the value of the parent view is used.
 | 
			
		||||
	SmallCaps = "small-caps"
 | 
			
		||||
 | 
			
		||||
	// Strikethrough is the constant for the "strikethrough" property tag.
 | 
			
		||||
	// The "strikethrough" is the bool property. If it is "true" then a text is displayed strikethrough.
 | 
			
		||||
	// This is an inherited property, i.e. if it is not defined, then the value of the parent view is used.
 | 
			
		||||
	Strikethrough = "strikethrough"
 | 
			
		||||
 | 
			
		||||
	// Overline is the constant for the "overline" property tag.
 | 
			
		||||
	// The "overline" is the bool property. If it is "true" then a text is displayed overlined.
 | 
			
		||||
	// This is an inherited property, i.e. if it is not defined, then the value of the parent view is used.
 | 
			
		||||
	Overline = "overline"
 | 
			
		||||
 | 
			
		||||
	// Underline is the constant for the "underline" property tag.
 | 
			
		||||
	// The "underline" is the bool property. If it is "true" then a text is displayed underlined.
 | 
			
		||||
	// This is an inherited property, i.e. if it is not defined, then the value of the parent view is used.
 | 
			
		||||
	Underline = "underline"
 | 
			
		||||
 | 
			
		||||
	// TextLineThickness is the constant for the "text-decoration-thickness" property tag.
 | 
			
		||||
	// The "text-decoration-thickness" SizeUnit property sets the stroke thickness of the decoration line that
 | 
			
		||||
	// is used on text in an element, such as a line-through, underline, or overline.
 | 
			
		||||
	// This is an inherited property, i.e. if it is not defined, then the value of the parent view is used.
 | 
			
		||||
	TextLineThickness = "text-line-thickness"
 | 
			
		||||
 | 
			
		||||
	// TextLineStyle is the constant for the "text-decoration-style" property tag.
 | 
			
		||||
	// The "text-decoration-style" int property sets the style of the lines specified by "text-decoration" property.
 | 
			
		||||
	// The style applies to all lines that are set with "text-decoration" property.
 | 
			
		||||
	// This is an inherited property, i.e. if it is not defined, then the value of the parent view is used.
 | 
			
		||||
	TextLineStyle = "text-line-style"
 | 
			
		||||
 | 
			
		||||
	// TextLineColor is the constant for the "text-decoration-color" property tag.
 | 
			
		||||
	// The "text-decoration-color" Color property sets the color of the lines specified by "text-decoration" property.
 | 
			
		||||
	// The color applies to all lines that are set with "text-decoration" property.
 | 
			
		||||
	// This is an inherited property, i.e. if it is not defined, then the value of the parent view is used.
 | 
			
		||||
	TextLineColor = "text-line-color"
 | 
			
		||||
 | 
			
		||||
	// TextWeight is the constant for the "text-weight" property tag.
 | 
			
		||||
	// Valid values are SolidLine (1), DashedLine (2), DottedLine (3), DoubleLine (4) and WavyLine (5).
 | 
			
		||||
	// This is an inherited property, i.e. if it is not defined, then the value of the parent view is used.
 | 
			
		||||
	TextWeight = "text-weight"
 | 
			
		||||
 | 
			
		||||
	// TextAlign is the constant for the "text-align" property tag.
 | 
			
		||||
	// This is an inherited property, i.e. if it is not defined, then the value of the parent view is used.
 | 
			
		||||
	TextAlign = "text-align"
 | 
			
		||||
 | 
			
		||||
	// TextIndent is the constant for the "text-indent" property tag.
 | 
			
		||||
	// This is an inherited property, i.e. if it is not defined, then the value of the parent view is used.
 | 
			
		||||
	TextIndent = "text-indent"
 | 
			
		||||
 | 
			
		||||
	// TextShadow is the constant for the "text-shadow" property tag.
 | 
			
		||||
	// This is an inherited property, i.e. if it is not defined, then the value of the parent view is used.
 | 
			
		||||
	TextShadow = "text-shadow"
 | 
			
		||||
 | 
			
		||||
	// LetterSpacing is the constant for the "letter-spacing" property tag.
 | 
			
		||||
	// The "letter-spacing" SizeUnit property sets the horizontal spacing behavior between text characters.
 | 
			
		||||
	// This value is added to the natural spacing between characters while rendering the text.
 | 
			
		||||
| 
						 | 
				
			
			@ -270,30 +356,36 @@ const (
 | 
			
		|||
	// while negative values of letter-spacing bring characters closer together.
 | 
			
		||||
	// This is an inherited property, i.e. if it is not defined, then the value of the parent view is used.
 | 
			
		||||
	LetterSpacing = "letter-spacing"
 | 
			
		||||
 | 
			
		||||
	// WordSpacing is the constant for the "word-spacing" property tag.
 | 
			
		||||
	// The "word-spacing" SizeUnit property sets the length of space between words and between tags.
 | 
			
		||||
	// This is an inherited property, i.e. if it is not defined, then the value of the parent view is used.
 | 
			
		||||
	WordSpacing = "word-spacing"
 | 
			
		||||
 | 
			
		||||
	// LineHeight is the constant for the "line-height" property tag.
 | 
			
		||||
	// The "line-height" SizeUnit property sets the height of a line box.
 | 
			
		||||
	// It's commonly used to set the distance between lines of text.
 | 
			
		||||
	// This is an inherited property, i.e. if it is not defined, then the value of the parent view is used.
 | 
			
		||||
	LineHeight = "line-height"
 | 
			
		||||
 | 
			
		||||
	// WhiteSpace is the constant for the "white-space" property tag.
 | 
			
		||||
	// The "white-space" int property sets how white space inside an element is handled.
 | 
			
		||||
	// Valid values are WhiteSpaceNormal (0),  WhiteSpaceNowrap (1), WhiteSpacePre (2),
 | 
			
		||||
	// WhiteSpacePreWrap (3), WhiteSpacePreLine (4), WhiteSpaceBreakSpaces (5)
 | 
			
		||||
	// This is an inherited property, i.e. if it is not defined, then the value of the parent view is used.
 | 
			
		||||
	WhiteSpace = "white-space"
 | 
			
		||||
 | 
			
		||||
	// WordBreak is the constant for the "word-break" property tag.
 | 
			
		||||
	// The "word-break" int property sets whether line breaks appear wherever the text would otherwise overflow its content box.
 | 
			
		||||
	// This is an inherited property, i.e. if it is not defined, then the value of the parent view is used.
 | 
			
		||||
	WordBreak = "word-break"
 | 
			
		||||
 | 
			
		||||
	// TextTransform is the constant for the "text-transform" property tag.
 | 
			
		||||
	// The "text-transform" int property specifies how to capitalize an element's text.
 | 
			
		||||
	// It can be used to make text appear in all-uppercase or all-lowercase, or with each word capitalized.
 | 
			
		||||
	// This is an inherited property, i.e. if it is not defined, then the value of the parent view is used.
 | 
			
		||||
	TextTransform = "text-transform"
 | 
			
		||||
 | 
			
		||||
	// TextDirection is the constant for the "text-direction" property tag.
 | 
			
		||||
	// The "text-direction" int property sets the direction of text, table columns, and horizontal overflow.
 | 
			
		||||
	// Use 1 (LeftToRightDirection) for languages written from right to left (like Hebrew or Arabic),
 | 
			
		||||
| 
						 | 
				
			
			@ -301,151 +393,249 @@ const (
 | 
			
		|||
	// The default value of the property is 0 (SystemTextDirection): use the system text direction.
 | 
			
		||||
	// This is an inherited property, i.e. if it is not defined, then the value of the parent view is used.
 | 
			
		||||
	TextDirection = "text-direction"
 | 
			
		||||
 | 
			
		||||
	// WritingMode is the constant for the "writing-mode" property tag.
 | 
			
		||||
	// The "writing-mode" int property sets whether lines of text are laid out horizontally or vertically,
 | 
			
		||||
	// as well as the direction in which blocks progress
 | 
			
		||||
	// This is an inherited property, i.e. if it is not defined, then the value of the parent view is used.
 | 
			
		||||
	WritingMode = "writing-mode"
 | 
			
		||||
 | 
			
		||||
	// VerticalTextOrientation is the constant for the "vertical-text-orientation" property tag.
 | 
			
		||||
	// The "vertical-text-orientation" int property sets the orientation of the text characters in a line.
 | 
			
		||||
	// It only affects text in vertical mode ("writing-mode" property).
 | 
			
		||||
	// This is an inherited property, i.e. if it is not defined, then the value of the parent view is used.
 | 
			
		||||
	VerticalTextOrientation = "vertical-text-orientation"
 | 
			
		||||
 | 
			
		||||
	// TextTverflow is the constant for the "text-overflow" property tag.
 | 
			
		||||
	// The "text-overflow" int property sets how hidden overflow content is signaled to users.
 | 
			
		||||
	// It can be clipped or display an ellipsis ('…'). Valid values are
 | 
			
		||||
	TextOverflow = "text-overflow"
 | 
			
		||||
 | 
			
		||||
	// Hint is the constant for the "hint" property tag.
 | 
			
		||||
	// The "hint" string property sets a hint to the user of what can be entered in the control.
 | 
			
		||||
	Hint = "hint"
 | 
			
		||||
 | 
			
		||||
	// MaxLength is the constant for the "max-length" property tag.
 | 
			
		||||
	// The "max-length" int property sets the maximum number of characters that the user can enter
 | 
			
		||||
	MaxLength = "max-length"
 | 
			
		||||
 | 
			
		||||
	// ReadOnly is the constant for the "readonly" property tag.
 | 
			
		||||
	// This bool property indicates that the user cannot modify the value of the EditView.
 | 
			
		||||
	ReadOnly = "readonly"
 | 
			
		||||
 | 
			
		||||
	// Content is the constant for the "content" property tag.
 | 
			
		||||
	Content = "content"
 | 
			
		||||
 | 
			
		||||
	// Items is the constant for the "items" property tag.
 | 
			
		||||
	Items = "items"
 | 
			
		||||
 | 
			
		||||
	// DisabledItems is the constant for the "disabled-items" property tag.
 | 
			
		||||
	DisabledItems = "disabled-items"
 | 
			
		||||
 | 
			
		||||
	// Current is the constant for the "current" property tag.
 | 
			
		||||
	Current = "current"
 | 
			
		||||
 | 
			
		||||
	// Type is the constant for the "type" property tag.
 | 
			
		||||
	Type = "type"
 | 
			
		||||
 | 
			
		||||
	// Pattern is the constant for the "pattern" property tag.
 | 
			
		||||
	Pattern = "pattern"
 | 
			
		||||
 | 
			
		||||
	// GridAutoFlow is the constant for the "grid-auto-flow" property tag.
 | 
			
		||||
	// The "grid-auto-flow" int property controls how the GridLayout auto-placement algorithm works,
 | 
			
		||||
	// specifying exactly how auto-placed items get flowed into the grid.
 | 
			
		||||
	// Valid values are RowAutoFlow (0), ColumnAutoFlow (1), RowDenseAutoFlow (2), and ColumnDenseAutoFlow (3)
 | 
			
		||||
	GridAutoFlow = "grid-auto-flow"
 | 
			
		||||
 | 
			
		||||
	// CellWidth is the constant for the "cell-width" property tag.
 | 
			
		||||
	// The "cell-width" properties allow to set a fixed width of GridLayout cells regardless of the size of the child elements.
 | 
			
		||||
	// These properties are of type []SizeUnit. Each element in the array determines the size of the corresponding column.
 | 
			
		||||
	CellWidth = "cell-width"
 | 
			
		||||
 | 
			
		||||
	// CellHeight is the constant for the "cell-height" property tag.
 | 
			
		||||
	// The "cell-height" properties allow to set a fixed height of GridLayout cells regardless of the size of the child elements.
 | 
			
		||||
	// These properties are of type []SizeUnit. Each element in the array determines the size of the corresponding row.
 | 
			
		||||
	CellHeight = "cell-height"
 | 
			
		||||
	// RowGap is the constant for the "row-gap" property tag.
 | 
			
		||||
 | 
			
		||||
	// GridRowGap is the constant for the "grid-row-gap" property tag.
 | 
			
		||||
	// The "grid-row-gap" SizeUnit properties allow to set the distance between the rows of the GridLayout container.
 | 
			
		||||
	// The default is 0px.
 | 
			
		||||
	GridRowGap = "grid-row-gap"
 | 
			
		||||
	// ColumnGap is the constant for the "column-gap" property tag.
 | 
			
		||||
 | 
			
		||||
	// GridColumnGap is the constant for the "grid-column-gap" property tag.
 | 
			
		||||
	// The "grid-column-gap" SizeUnit properties allow to set the distance between the columns of the GridLayout container.
 | 
			
		||||
	// The default is 0px.
 | 
			
		||||
	GridColumnGap = "grid-column-gap"
 | 
			
		||||
	/*
 | 
			
		||||
		// GridAutoRows is the constant for the "grid-auto-rows" property tag.
 | 
			
		||||
		GridAutoRows = "grid-auto-rows"
 | 
			
		||||
 | 
			
		||||
		// GridAutoColumns is the constant for the "grid-auto-columns" property tag.
 | 
			
		||||
		GridAutoColumns = "grid-auto-columns"
 | 
			
		||||
	*/
 | 
			
		||||
	// Source is the constant for the "src" property tag.
 | 
			
		||||
	Source = "src"
 | 
			
		||||
 | 
			
		||||
	// Fit is the constant for the "fit" property tag.
 | 
			
		||||
	Fit           = "fit"
 | 
			
		||||
	backgroundFit = "background-fit"
 | 
			
		||||
 | 
			
		||||
	// Repeat is the constant for the "repeat" property tag.
 | 
			
		||||
	Repeat = "repeat"
 | 
			
		||||
 | 
			
		||||
	// Attachment is the constant for the "attachment" property tag.
 | 
			
		||||
	Attachment = "attachment"
 | 
			
		||||
	// Clip is the constant for the "clip" property tag.
 | 
			
		||||
 | 
			
		||||
	// BackgroundClip is the constant for the "background-clip" property tag.
 | 
			
		||||
	BackgroundClip = "background-clip"
 | 
			
		||||
 | 
			
		||||
	// Gradient is the constant for the "gradient" property tag.
 | 
			
		||||
	Gradient = "gradient"
 | 
			
		||||
 | 
			
		||||
	// Direction is the constant for the "direction" property tag.
 | 
			
		||||
	Direction = "direction"
 | 
			
		||||
 | 
			
		||||
	// Repeating is the constant for the "repeating" property tag.
 | 
			
		||||
	Repeating = "repeating"
 | 
			
		||||
 | 
			
		||||
	// Repeating is the constant for the "repeating" property tag.
 | 
			
		||||
	From = "from"
 | 
			
		||||
 | 
			
		||||
	// RadialGradientRadius is the constant for the "radial-gradient-radius" property tag.
 | 
			
		||||
	RadialGradientRadius = "radial-gradient-radius"
 | 
			
		||||
 | 
			
		||||
	// RadialGradientShape is the constant for the "radial-gradient-shape" property tag.
 | 
			
		||||
	RadialGradientShape = "radial-gradient-shape"
 | 
			
		||||
 | 
			
		||||
	// Shape is the constant for the "shape" property tag. It's a short form of "radial-gradient-shape"
 | 
			
		||||
	Shape = "shape"
 | 
			
		||||
 | 
			
		||||
	// CenterX is the constant for the "center-x" property tag.
 | 
			
		||||
	CenterX = "center-x"
 | 
			
		||||
 | 
			
		||||
	// CenterY is the constant for the "center-x" property tag.
 | 
			
		||||
	CenterY = "center-y"
 | 
			
		||||
 | 
			
		||||
	// AltText is the constant for the "alt-text" property tag.
 | 
			
		||||
	AltText = "alt-text"
 | 
			
		||||
	altTag  = "alt"
 | 
			
		||||
 | 
			
		||||
	// AvoidBreak is the constant for the "avoid-break" property tag.
 | 
			
		||||
	// The "avoid-break" bool property sets how region breaks should behave inside a generated box.
 | 
			
		||||
	// If the property value is "true" then fvoids any break from being inserted within the principal box.
 | 
			
		||||
	// If the property value is "false" then allows, but does not force, any break to be inserted within
 | 
			
		||||
	// the principal box.
 | 
			
		||||
	AvoidBreak = "avoid-break"
 | 
			
		||||
 | 
			
		||||
	// ItemWidth is the constant for the "item-width" property tag.
 | 
			
		||||
	ItemWidth = "item-width"
 | 
			
		||||
 | 
			
		||||
	// ItemHeight is the constant for the "item-height" property tag.
 | 
			
		||||
	ItemHeight = "item-height"
 | 
			
		||||
	// Wrap is the constant for the "wrap" property tag.
 | 
			
		||||
	Wrap = "wrap"
 | 
			
		||||
 | 
			
		||||
	// ListWrap is the constant for the "wrap" property tag.
 | 
			
		||||
	ListWrap = "list-wrap"
 | 
			
		||||
 | 
			
		||||
	// EditWrap is the constant for the "wrap" property tag.
 | 
			
		||||
	EditWrap = "edit-wrap"
 | 
			
		||||
 | 
			
		||||
	// CaretColor is the constant for the "caret-color" property tag.
 | 
			
		||||
	// The "caret-color" Color property sets the color of the insertion caret, the visible marker
 | 
			
		||||
	// where the next character typed will be inserted. This is sometimes referred to as the text input cursor.
 | 
			
		||||
	CaretColor = "caret-color"
 | 
			
		||||
 | 
			
		||||
	// Min is the constant for the "min" property tag.
 | 
			
		||||
	Min = "min"
 | 
			
		||||
 | 
			
		||||
	// Max is the constant for the "max" property tag.
 | 
			
		||||
	Max = "max"
 | 
			
		||||
 | 
			
		||||
	// Step is the constant for the "step" property tag.
 | 
			
		||||
	Step = "step"
 | 
			
		||||
 | 
			
		||||
	// Value is the constant for the "value" property tag.
 | 
			
		||||
	Value = "value"
 | 
			
		||||
 | 
			
		||||
	// Orientation is the constant for the "orientation" property tag.
 | 
			
		||||
	Orientation = "orientation"
 | 
			
		||||
 | 
			
		||||
	// Gap is the constant for the "gap" property tag.
 | 
			
		||||
	Gap = "gap"
 | 
			
		||||
 | 
			
		||||
	// Text is the constant for the "text" property tag.
 | 
			
		||||
	Text = "text"
 | 
			
		||||
 | 
			
		||||
	// VerticalAlign is the constant for the "vertical-align" property tag.
 | 
			
		||||
	VerticalAlign = "vertical-align"
 | 
			
		||||
 | 
			
		||||
	// HorizontalAlign is the constant for the "horizontal-align" property tag.
 | 
			
		||||
	// The "horizontal-align" int property sets the horizontal alignment of the content inside a block element
 | 
			
		||||
	HorizontalAlign = "horizontal-align"
 | 
			
		||||
 | 
			
		||||
	// ImageVerticalAlign is the constant for the "image-vertical-align" property tag.
 | 
			
		||||
	ImageVerticalAlign = "image-vertical-align"
 | 
			
		||||
 | 
			
		||||
	// ImageHorizontalAlign is the constant for the "image-horizontal-align" property tag.
 | 
			
		||||
	ImageHorizontalAlign = "image-horizontal-align"
 | 
			
		||||
 | 
			
		||||
	// Checked is the constant for the "checked" property tag.
 | 
			
		||||
	Checked = "checked"
 | 
			
		||||
 | 
			
		||||
	// ItemVerticalAlign is the constant for the "item-vertical-align" property tag.
 | 
			
		||||
	ItemVerticalAlign = "item-vertical-align"
 | 
			
		||||
 | 
			
		||||
	// ItemHorizontalAlign is the constant for the "item-horizontal-align" property tag.
 | 
			
		||||
	ItemHorizontalAlign = "item-horizontal-align"
 | 
			
		||||
 | 
			
		||||
	// ItemCheckbox is the constant for the "checkbox" property tag.
 | 
			
		||||
	ItemCheckbox = "checkbox"
 | 
			
		||||
 | 
			
		||||
	// CheckboxHorizontalAlign is the constant for the "checkbox-horizontal-align" property tag.
 | 
			
		||||
	CheckboxHorizontalAlign = "checkbox-horizontal-align"
 | 
			
		||||
 | 
			
		||||
	// CheckboxVerticalAlign is the constant for the "checkbox-vertical-align" property tag.
 | 
			
		||||
	CheckboxVerticalAlign = "checkbox-vertical-align"
 | 
			
		||||
 | 
			
		||||
	// NotTranslate is the constant for the "not-translate" property tag.
 | 
			
		||||
	// This bool property indicates that no need to translate the text.
 | 
			
		||||
	// This is an inherited property, i.e. if it is not defined, then the value of the parent view is used.
 | 
			
		||||
	NotTranslate = "not-translate"
 | 
			
		||||
 | 
			
		||||
	// Filter is the constant for the "filter" property tag.
 | 
			
		||||
	// The "filter" property applies graphical effects like blur or color shift to a View.
 | 
			
		||||
	// The "filter" property applies graphical effects to a View,
 | 
			
		||||
	// such as such as blurring, color shifting, changing brightness/contrast, etc.
 | 
			
		||||
	Filter = "filter"
 | 
			
		||||
 | 
			
		||||
	// BackdropFilter is the constant for the "backdrop-filter" property tag.
 | 
			
		||||
	// The "backdrop-filter" property applies graphical effects to the area behind a View,
 | 
			
		||||
	// such as such as blurring, color shifting, changing brightness/contrast, etc.
 | 
			
		||||
	BackdropFilter = "backdrop-filter"
 | 
			
		||||
 | 
			
		||||
	// Clip is the constant for the "clip" property tag.
 | 
			
		||||
	// The "clip" property creates a clipping region that sets what part of a View should be shown.
 | 
			
		||||
	Clip = "clip"
 | 
			
		||||
 | 
			
		||||
	// Points is the constant for the "points" property tag.
 | 
			
		||||
	Points = "points"
 | 
			
		||||
 | 
			
		||||
	// ShapeOutside is the constant for the "shape-outside" property tag.
 | 
			
		||||
	// The "shape-outside" property defines a shape (which may be non-rectangular) around which adjacent
 | 
			
		||||
	// inline content should wrap. By default, inline content wraps around its margin box;
 | 
			
		||||
	// "shape-outside" provides a way to customize this wrapping, making it possible to wrap text around
 | 
			
		||||
	// complex objects rather than simple boxes.
 | 
			
		||||
	ShapeOutside = "shape-outside"
 | 
			
		||||
 | 
			
		||||
	// Float is the constant for the "float" property tag.
 | 
			
		||||
	// The "float" property places a View on the left or right side of its container,
 | 
			
		||||
	// allowing text and inline Views to wrap around it.
 | 
			
		||||
	Float = "float"
 | 
			
		||||
 | 
			
		||||
	// UsetData is the constant for the "user-data" property tag.
 | 
			
		||||
	// This property can contain any user data
 | 
			
		||||
	// The "user-data" property can contain any user data
 | 
			
		||||
	UserData = "user-data"
 | 
			
		||||
 | 
			
		||||
	// Resize is the constant for the "resize" property tag.
 | 
			
		||||
	// The "resize" int property sets whether an element is resizable, and if so, in which directions.
 | 
			
		||||
	// Valid values are "none" (0), "both" (1), horizontal (2), and "vertical" (3)
 | 
			
		||||
	Resize = "resize"
 | 
			
		||||
)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -10,6 +10,7 @@ var colorProperties = []string{
 | 
			
		|||
	ColorTag,
 | 
			
		||||
	BackgroundColor,
 | 
			
		||||
	TextColor,
 | 
			
		||||
	CaretColor,
 | 
			
		||||
	BorderColor,
 | 
			
		||||
	BorderLeftColor,
 | 
			
		||||
	BorderRightColor,
 | 
			
		||||
| 
						 | 
				
			
			@ -42,6 +43,7 @@ var boolProperties = []string{
 | 
			
		|||
	Inset,
 | 
			
		||||
	BackfaceVisible,
 | 
			
		||||
	ReadOnly,
 | 
			
		||||
	EditWrap,
 | 
			
		||||
	Spellcheck,
 | 
			
		||||
	CloseButton,
 | 
			
		||||
	OutsideClose,
 | 
			
		||||
| 
						 | 
				
			
			@ -276,7 +278,7 @@ var enumProperties = map[string]struct {
 | 
			
		|||
		"",
 | 
			
		||||
		[]string{"column", "row", "column-reverse", "row-reverse"},
 | 
			
		||||
	},
 | 
			
		||||
	Wrap: {
 | 
			
		||||
	ListWrap: {
 | 
			
		||||
		[]string{"off", "on", "reverse"},
 | 
			
		||||
		"",
 | 
			
		||||
		[]string{"nowrap", "wrap", "wrap-reverse"},
 | 
			
		||||
| 
						 | 
				
			
			@ -311,6 +313,11 @@ var enumProperties = map[string]struct {
 | 
			
		|||
		"justify-items",
 | 
			
		||||
		[]string{"start", "end", "center", "stretch"},
 | 
			
		||||
	},
 | 
			
		||||
	GridAutoFlow: {
 | 
			
		||||
		[]string{"row", "column", "row-dense", "column-dense"},
 | 
			
		||||
		GridAutoFlow,
 | 
			
		||||
		[]string{"row", "column", "row dense", "column dense"},
 | 
			
		||||
	},
 | 
			
		||||
	ImageVerticalAlign: {
 | 
			
		||||
		[]string{"top", "bottom", "center"},
 | 
			
		||||
		"",
 | 
			
		||||
| 
						 | 
				
			
			@ -416,6 +423,11 @@ var enumProperties = map[string]struct {
 | 
			
		|||
		"",
 | 
			
		||||
		[]string{"none", "cell", "row"},
 | 
			
		||||
	},
 | 
			
		||||
	Resize: {
 | 
			
		||||
		[]string{"none", "both", "horizontal", "vertical"},
 | 
			
		||||
		"resize",
 | 
			
		||||
		[]string{"none", "both", "horizontal", "vertical"},
 | 
			
		||||
	},
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func notCompatibleType(tag string, value interface{}) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -196,4 +196,33 @@ const (
 | 
			
		|||
	LeftFloat = 1
 | 
			
		||||
	// RightFloat - value of the view "float" property: the View must float on the right side of its containing block.
 | 
			
		||||
	RightFloat = 2
 | 
			
		||||
 | 
			
		||||
	// NoneResize - value of the view "resize" property: the View The offers no user-controllable method for resizing it.
 | 
			
		||||
	NoneResize = 0
 | 
			
		||||
	// BothResize - value of the view "resize" property: the View displays a mechanism for allowing
 | 
			
		||||
	// the user to resize it, which may be resized both horizontally and vertically.
 | 
			
		||||
	BothResize = 1
 | 
			
		||||
	// HorizontalResize - value of the view "resize" property: the View displays a mechanism for allowing
 | 
			
		||||
	// the user to resize it in the horizontal direction.
 | 
			
		||||
	HorizontalResize = 2
 | 
			
		||||
	// VerticalResize - value of the view "resize" property: the View displays a mechanism for allowing
 | 
			
		||||
	// the user to resize it in the vertical direction.
 | 
			
		||||
	VerticalResize = 3
 | 
			
		||||
 | 
			
		||||
	// RowAutoFlow - value of the "grid-auto-flow" property of the GridLayout:
 | 
			
		||||
	// Views are placed by filling each row in turn, adding new rows as necessary.
 | 
			
		||||
	RowAutoFlow = 0
 | 
			
		||||
	// ColumnAutoFlow - value of the "grid-auto-flow" property of the GridLayout:
 | 
			
		||||
	// Views are placed by filling each column in turn, adding new columns as necessary.
 | 
			
		||||
	ColumnAutoFlow = 1
 | 
			
		||||
	// RowDenseAutoFlow - value of the "grid-auto-flow" property of the GridLayout:
 | 
			
		||||
	// Views are placed by filling each row, adding new rows as necessary.
 | 
			
		||||
	// "dense" packing algorithm attempts to fill in holes earlier in the grid, if smaller items come up later.
 | 
			
		||||
	// This may cause views to appear out-of-order, when doing so would fill in holes left by larger views.
 | 
			
		||||
	RowDenseAutoFlow = 2
 | 
			
		||||
	// ColumnDenseAutoFlow - value of the "grid-auto-flow" property of the GridLayout:
 | 
			
		||||
	// Views are placed by filling each column, adding new columns as necessary.
 | 
			
		||||
	// "dense" packing algorithm attempts to fill in holes earlier in the grid, if smaller items come up later.
 | 
			
		||||
	// This may cause views to appear out-of-order, when doing so would fill in holes left by larger views.
 | 
			
		||||
	ColumnDenseAutoFlow = 3
 | 
			
		||||
)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -400,13 +400,13 @@ func (session *sessionData) handleResize(data DataObject) {
 | 
			
		|||
						if view := session.viewByHTMLID(viewID[:n]); view != nil {
 | 
			
		||||
							view.onItemResize(view, viewID[n+1:], getFloat("x"), getFloat("y"), getFloat("width"), getFloat("height"))
 | 
			
		||||
						} else {
 | 
			
		||||
							ErrorLogF(`View with id == %s not found`, viewID[:n])
 | 
			
		||||
							DebugLogF(`View with id == %s not found`, viewID[:n])
 | 
			
		||||
						}
 | 
			
		||||
					} else if view := session.viewByHTMLID(viewID); view != nil {
 | 
			
		||||
						view.onResize(view, getFloat("x"), getFloat("y"), getFloat("width"), getFloat("height"))
 | 
			
		||||
						view.setScroll(getFloat("scroll-x"), getFloat("scroll-y"), getFloat("scroll-width"), getFloat("scroll-height"))
 | 
			
		||||
					} else {
 | 
			
		||||
						ErrorLogF(`View with id == %s not found`, viewID)
 | 
			
		||||
						DebugLogF(`View with id == %s not found`, viewID)
 | 
			
		||||
					}
 | 
			
		||||
				} else {
 | 
			
		||||
					ErrorLog(`"id" property not found`)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -45,7 +45,7 @@ func scanStringsDir(path string) {
 | 
			
		|||
			}
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		ErrorLog(err.Error())
 | 
			
		||||
		DebugLog(err.Error())
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										22
									
								
								tableView.go
								
								
								
								
							
							
						
						
									
										22
									
								
								tableView.go
								
								
								
								
							| 
						 | 
				
			
			@ -579,7 +579,7 @@ func (table *tableViewData) propertyChanged(tag string) {
 | 
			
		|||
			CellBorder, HeadHeight, HeadStyle, FootHeight, FootStyle,
 | 
			
		||||
			CellPaddingTop, CellPaddingRight, CellPaddingBottom, CellPaddingLeft,
 | 
			
		||||
			TableCellClickedEvent, TableCellSelectedEvent, TableRowClickedEvent,
 | 
			
		||||
			TableRowSelectedEvent, AllowSelection:
 | 
			
		||||
			TableRowSelectedEvent, AllowSelection, Current:
 | 
			
		||||
			table.ReloadTableData()
 | 
			
		||||
 | 
			
		||||
		case Gap:
 | 
			
		||||
| 
						 | 
				
			
			@ -648,6 +648,13 @@ func (table *tableViewData) currentStyle() string {
 | 
			
		|||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if value := valueFromStyle(table, CurrentStyle); value != nil {
 | 
			
		||||
		if style, ok := value.(string); ok {
 | 
			
		||||
			if style, ok = table.session.resolveConstants(style); ok {
 | 
			
		||||
				return style
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return "ruiCurrentTableCellFocused"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -659,6 +666,13 @@ func (table *tableViewData) currentInactiveStyle() string {
 | 
			
		|||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if value := valueFromStyle(table, CurrentInactiveStyle); value != nil {
 | 
			
		||||
		if style, ok := value.(string); ok {
 | 
			
		||||
			if style, ok = table.session.resolveConstants(style); ok {
 | 
			
		||||
				return style
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return "ruiCurrentTableCell"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1161,7 +1175,11 @@ func (table *tableViewData) htmlSubviews(self View, buffer *strings.Builder) {
 | 
			
		|||
	headFootStart := func(htmlTag, styleTag string) (BorderProperty, BoundsProperty) {
 | 
			
		||||
		buffer.WriteRune('<')
 | 
			
		||||
		buffer.WriteString(htmlTag)
 | 
			
		||||
		if value := table.getRaw(styleTag); value != nil {
 | 
			
		||||
		value := table.getRaw(styleTag)
 | 
			
		||||
		if value == nil {
 | 
			
		||||
			value = valueFromStyle(table, styleTag)
 | 
			
		||||
		}
 | 
			
		||||
		if value != nil {
 | 
			
		||||
			switch value := value.(type) {
 | 
			
		||||
			case string:
 | 
			
		||||
				if style, ok := session.resolveConstants(value); ok {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -103,8 +103,8 @@ func (tabsLayout *tabsLayoutData) String() string {
 | 
			
		|||
	return getViewString(tabsLayout)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (tabsLayout *tabsLayoutData) currentItem() int {
 | 
			
		||||
	result, _ := intProperty(tabsLayout, Current, tabsLayout.session, 0)
 | 
			
		||||
func (tabsLayout *tabsLayoutData) currentItem(defaultValue int) int {
 | 
			
		||||
	result, _ := intProperty(tabsLayout, Current, tabsLayout.session, defaultValue)
 | 
			
		||||
	return result
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -145,7 +145,7 @@ func (tabsLayout *tabsLayoutData) remove(tag string) {
 | 
			
		|||
		return
 | 
			
		||||
 | 
			
		||||
	case Current:
 | 
			
		||||
		oldCurrent := tabsLayout.currentItem()
 | 
			
		||||
		oldCurrent := tabsLayout.currentItem(0)
 | 
			
		||||
		delete(tabsLayout.properties, Current)
 | 
			
		||||
		if oldCurrent == 0 {
 | 
			
		||||
			return
 | 
			
		||||
| 
						 | 
				
			
			@ -223,12 +223,12 @@ func (tabsLayout *tabsLayoutData) set(tag string, value interface{}) bool {
 | 
			
		|||
			return true
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		oldCurrent := tabsLayout.currentItem()
 | 
			
		||||
		oldCurrent := tabsLayout.currentItem(-1)
 | 
			
		||||
		if !tabsLayout.setIntProperty(Current, value) {
 | 
			
		||||
			return false
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		current := tabsLayout.currentItem()
 | 
			
		||||
		current := tabsLayout.currentItem(0)
 | 
			
		||||
		if oldCurrent == current {
 | 
			
		||||
			return true
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			@ -497,6 +497,13 @@ func (tabsLayout *tabsLayoutData) tabBarStyle() string {
 | 
			
		|||
	if style, ok := stringProperty(tabsLayout, TabBarStyle, tabsLayout.session); ok {
 | 
			
		||||
		return style
 | 
			
		||||
	}
 | 
			
		||||
	if value := valueFromStyle(tabsLayout, TabBarStyle); value != nil {
 | 
			
		||||
		if style, ok := value.(string); ok {
 | 
			
		||||
			if style, ok = tabsLayout.session.resolveConstants(style); ok {
 | 
			
		||||
				return style
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return "ruiTabBar"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -504,6 +511,13 @@ func (tabsLayout *tabsLayoutData) inactiveTabStyle() string {
 | 
			
		|||
	if style, ok := stringProperty(tabsLayout, TabStyle, tabsLayout.session); ok {
 | 
			
		||||
		return style
 | 
			
		||||
	}
 | 
			
		||||
	if value := valueFromStyle(tabsLayout, TabStyle); value != nil {
 | 
			
		||||
		if style, ok := value.(string); ok {
 | 
			
		||||
			if style, ok = tabsLayout.session.resolveConstants(style); ok {
 | 
			
		||||
				return style
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	switch tabsLayout.tabsLocation() {
 | 
			
		||||
	case LeftTabs, RightTabs:
 | 
			
		||||
		return "ruiVerticalTab"
 | 
			
		||||
| 
						 | 
				
			
			@ -515,6 +529,13 @@ func (tabsLayout *tabsLayoutData) activeTabStyle() string {
 | 
			
		|||
	if style, ok := stringProperty(tabsLayout, CurrentTabStyle, tabsLayout.session); ok {
 | 
			
		||||
		return style
 | 
			
		||||
	}
 | 
			
		||||
	if value := valueFromStyle(tabsLayout, CurrentTabStyle); value != nil {
 | 
			
		||||
		if style, ok := value.(string); ok {
 | 
			
		||||
			if style, ok = tabsLayout.session.resolveConstants(style); ok {
 | 
			
		||||
				return style
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	switch tabsLayout.tabsLocation() {
 | 
			
		||||
	case LeftTabs, RightTabs:
 | 
			
		||||
		return "ruiCurrentVerticalTab"
 | 
			
		||||
| 
						 | 
				
			
			@ -629,7 +650,7 @@ func (tabsLayout *tabsLayoutData) Insert(view View, index int) {
 | 
			
		|||
		tabsLayout.views = []View{}
 | 
			
		||||
	}
 | 
			
		||||
	if view != nil {
 | 
			
		||||
		if current := tabsLayout.currentItem(); current >= index {
 | 
			
		||||
		if current := tabsLayout.currentItem(0); current >= index {
 | 
			
		||||
			tabsLayout.properties[Current] = current + 1
 | 
			
		||||
			defer tabsLayout.propertyChangedEvent(Current)
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			@ -658,7 +679,7 @@ func (tabsLayout *tabsLayoutData) RemoveView(index int) View {
 | 
			
		|||
	view.SetChangeListener(Icon, nil)
 | 
			
		||||
	view.SetChangeListener(TabCloseButton, nil)
 | 
			
		||||
 | 
			
		||||
	current := tabsLayout.currentItem()
 | 
			
		||||
	current := tabsLayout.currentItem(0)
 | 
			
		||||
	if index < current || (index == current && current > 0) {
 | 
			
		||||
		current--
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -683,7 +704,7 @@ func (tabsLayout *tabsLayoutData) RemoveView(index int) View {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
func (tabsLayout *tabsLayoutData) currentID() string {
 | 
			
		||||
	return fmt.Sprintf("%s-%d", tabsLayout.htmlID(), tabsLayout.currentItem())
 | 
			
		||||
	return fmt.Sprintf("%s-%d", tabsLayout.htmlID(), tabsLayout.currentItem(0))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (tabsLayout *tabsLayoutData) htmlProperties(self View, buffer *strings.Builder) {
 | 
			
		||||
| 
						 | 
				
			
			@ -720,7 +741,7 @@ func (tabsLayout *tabsLayoutData) htmlSubviews(self View, buffer *strings.Builde
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	//viewCount := len(tabsLayout.views)
 | 
			
		||||
	current := tabsLayout.currentItem()
 | 
			
		||||
	current := tabsLayout.currentItem(0)
 | 
			
		||||
	location := tabsLayout.tabsLocation()
 | 
			
		||||
	tabsLayoutID := tabsLayout.htmlID()
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -798,7 +819,7 @@ func (tabsLayout *tabsLayoutData) htmlSubviews(self View, buffer *strings.Builde
 | 
			
		|||
			} else {
 | 
			
		||||
				buffer.WriteString(inactiveStyle)
 | 
			
		||||
			}
 | 
			
		||||
			buffer.WriteString(`" tabindex="0" onclick="tabClickEvent(\'`)
 | 
			
		||||
			buffer.WriteString(`" tabindex="0" onclick="tabClickEvent(this, \'`)
 | 
			
		||||
			buffer.WriteString(tabsLayoutID)
 | 
			
		||||
			buffer.WriteString(`\', `)
 | 
			
		||||
			buffer.WriteString(strconv.Itoa(n))
 | 
			
		||||
| 
						 | 
				
			
			@ -840,7 +861,7 @@ func (tabsLayout *tabsLayoutData) htmlSubviews(self View, buffer *strings.Builde
 | 
			
		|||
				close = closeButton
 | 
			
		||||
			}
 | 
			
		||||
			if close {
 | 
			
		||||
				buffer.WriteString(`<div class="ruiTabCloseButton" tabindex="0" onclick="tabCloseClickEvent(\'`)
 | 
			
		||||
				buffer.WriteString(`<div class="ruiTabCloseButton" tabindex="0" onclick="tabCloseClickEvent(this, \'`)
 | 
			
		||||
				buffer.WriteString(tabsLayoutID)
 | 
			
		||||
				buffer.WriteString(`\', `)
 | 
			
		||||
				buffer.WriteString(strconv.Itoa(n))
 | 
			
		||||
| 
						 | 
				
			
			@ -903,7 +924,7 @@ func (tabsLayout *tabsLayoutData) handleCommand(self View, command string, data
 | 
			
		|||
	case "tabClick":
 | 
			
		||||
		if numberText, ok := data.PropertyValue("number"); ok {
 | 
			
		||||
			if number, err := strconv.Atoi(numberText); err == nil {
 | 
			
		||||
				current := tabsLayout.currentItem()
 | 
			
		||||
				current := tabsLayout.currentItem(0)
 | 
			
		||||
				if current != number {
 | 
			
		||||
					tabsLayout.properties[Current] = number
 | 
			
		||||
					for _, listener := range tabsLayout.tabListener {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										62
									
								
								theme.go
								
								
								
								
							
							
						
						
									
										62
									
								
								theme.go
								
								
								
								
							| 
						 | 
				
			
			@ -52,6 +52,10 @@ type Theme interface {
 | 
			
		|||
	MediaStyle(tag string, orientation, maxWidth, maxHeight int) ViewStyle
 | 
			
		||||
	SetMediaStyle(tag string, orientation, maxWidth, maxHeight int, style ViewStyle)
 | 
			
		||||
	StyleTags() []string
 | 
			
		||||
	MediaStyles(tag string) []struct {
 | 
			
		||||
		Selectors                        string
 | 
			
		||||
		Orientation, MaxWidth, MaxHeight int
 | 
			
		||||
	}
 | 
			
		||||
	Append(anotherTheme Theme)
 | 
			
		||||
 | 
			
		||||
	constant(tag string, touchUI bool) string
 | 
			
		||||
| 
						 | 
				
			
			@ -268,6 +272,10 @@ func (theme *theme) MediaStyle(tag string, orientation, maxWidth, maxHeight int)
 | 
			
		|||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if orientation == 0 && maxWidth <= 0 && maxHeight <= 0 {
 | 
			
		||||
		return theme.style(tag)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -397,6 +405,60 @@ func (theme *theme) StyleTags() []string {
 | 
			
		|||
	return keys
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (theme *theme) MediaStyles(tag string) []struct {
 | 
			
		||||
	Selectors                        string
 | 
			
		||||
	Orientation, MaxWidth, MaxHeight int
 | 
			
		||||
} {
 | 
			
		||||
	result := []struct {
 | 
			
		||||
		Selectors                        string
 | 
			
		||||
		Orientation, MaxWidth, MaxHeight int
 | 
			
		||||
	}{}
 | 
			
		||||
 | 
			
		||||
	prefix := tag + ":"
 | 
			
		||||
	prefixLen := len(prefix)
 | 
			
		||||
	for themeTag := range theme.styles {
 | 
			
		||||
		if strings.HasPrefix(themeTag, prefix) {
 | 
			
		||||
			result = append(result, struct {
 | 
			
		||||
				Selectors                        string
 | 
			
		||||
				Orientation, MaxWidth, MaxHeight int
 | 
			
		||||
			}{
 | 
			
		||||
				Selectors:   themeTag[prefixLen:],
 | 
			
		||||
				Orientation: DefaultMedia,
 | 
			
		||||
				MaxWidth:    0,
 | 
			
		||||
				MaxHeight:   0,
 | 
			
		||||
			})
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, media := range theme.mediaStyles {
 | 
			
		||||
		if _, ok := media.styles[tag]; ok {
 | 
			
		||||
			result = append(result, struct {
 | 
			
		||||
				Selectors                        string
 | 
			
		||||
				Orientation, MaxWidth, MaxHeight int
 | 
			
		||||
			}{
 | 
			
		||||
				Selectors:   "",
 | 
			
		||||
				Orientation: media.orientation,
 | 
			
		||||
				MaxWidth:    media.maxWidth,
 | 
			
		||||
				MaxHeight:   media.maxHeight,
 | 
			
		||||
			})
 | 
			
		||||
		}
 | 
			
		||||
		for themeTag := range media.styles {
 | 
			
		||||
			if strings.HasPrefix(themeTag, prefix) {
 | 
			
		||||
				result = append(result, struct {
 | 
			
		||||
					Selectors                        string
 | 
			
		||||
					Orientation, MaxWidth, MaxHeight int
 | 
			
		||||
				}{
 | 
			
		||||
					Selectors:   themeTag[prefixLen:],
 | 
			
		||||
					Orientation: media.orientation,
 | 
			
		||||
					MaxWidth:    media.maxWidth,
 | 
			
		||||
					MaxHeight:   media.maxHeight,
 | 
			
		||||
				})
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return result
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (theme *theme) data() *theme {
 | 
			
		||||
	return theme
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										16
									
								
								view.go
								
								
								
								
							
							
						
						
									
										16
									
								
								view.go
								
								
								
								
							| 
						 | 
				
			
			@ -495,12 +495,23 @@ func viewPropertyChanged(view *viewData, tag string) {
 | 
			
		|||
 | 
			
		||||
	case Filter:
 | 
			
		||||
		text := ""
 | 
			
		||||
		if value := view.getRaw(Filter); value != nil {
 | 
			
		||||
		if value := view.getRaw(tag); value != nil {
 | 
			
		||||
			if filter, ok := value.(ViewFilter); ok {
 | 
			
		||||
				text = filter.cssStyle(session)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		updateCSSProperty(htmlID, Filter, text, session)
 | 
			
		||||
		updateCSSProperty(htmlID, tag, text, session)
 | 
			
		||||
		return
 | 
			
		||||
 | 
			
		||||
	case BackdropFilter:
 | 
			
		||||
		text := ""
 | 
			
		||||
		if value := view.getRaw(tag); value != nil {
 | 
			
		||||
			if filter, ok := value.(ViewFilter); ok {
 | 
			
		||||
				text = filter.cssStyle(session)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		updateCSSProperty(htmlID, "-webkit-backdrop-filter", text, session)
 | 
			
		||||
		updateCSSProperty(htmlID, tag, text, session)
 | 
			
		||||
		return
 | 
			
		||||
 | 
			
		||||
	case FontName:
 | 
			
		||||
| 
						 | 
				
			
			@ -584,6 +595,7 @@ func viewPropertyChanged(view *viewData, tag string) {
 | 
			
		|||
		BackgroundColor: BackgroundColor,
 | 
			
		||||
		TextColor:       "color",
 | 
			
		||||
		TextLineColor:   "text-decoration-color",
 | 
			
		||||
		CaretColor:      CaretColor,
 | 
			
		||||
	}
 | 
			
		||||
	if cssTag, ok := colorTags[tag]; ok {
 | 
			
		||||
		if color, ok := colorProperty(view, tag, session); ok {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -224,35 +224,35 @@ func (filter *viewFilter) cssStyle(session Session) string {
 | 
			
		|||
	return buffer.String()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (style *viewStyle) setFilter(value interface{}) bool {
 | 
			
		||||
func (style *viewStyle) setFilter(tag string, value interface{}) bool {
 | 
			
		||||
	switch value := value.(type) {
 | 
			
		||||
	case ViewFilter:
 | 
			
		||||
		style.properties[Filter] = value
 | 
			
		||||
		style.properties[tag] = value
 | 
			
		||||
		return true
 | 
			
		||||
 | 
			
		||||
	case string:
 | 
			
		||||
		if obj := NewDataObject(value); obj == nil {
 | 
			
		||||
			if filter := newViewFilter(obj); filter != nil {
 | 
			
		||||
				style.properties[Filter] = filter
 | 
			
		||||
				style.properties[tag] = filter
 | 
			
		||||
				return true
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	case DataObject:
 | 
			
		||||
		if filter := newViewFilter(value); filter != nil {
 | 
			
		||||
			style.properties[Filter] = filter
 | 
			
		||||
			style.properties[tag] = filter
 | 
			
		||||
			return true
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	case DataValue:
 | 
			
		||||
		if value.IsObject() {
 | 
			
		||||
			if filter := newViewFilter(value.Object()); filter != nil {
 | 
			
		||||
				style.properties[Filter] = filter
 | 
			
		||||
				style.properties[tag] = filter
 | 
			
		||||
				return true
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	notCompatibleType(Filter, value)
 | 
			
		||||
	notCompatibleType(tag, value)
 | 
			
		||||
	return false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -272,3 +272,20 @@ func GetFilter(view View, subviewID string) ViewFilter {
 | 
			
		|||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetBackdropFilter returns the area behind a View graphical effects like blur or color shift.
 | 
			
		||||
// If the second argument (subviewID) is "" then a top position of the first argument (view) is returned
 | 
			
		||||
func GetBackdropFilter(view View, subviewID string) ViewFilter {
 | 
			
		||||
	if subviewID != "" {
 | 
			
		||||
		view = ViewByID(view, subviewID)
 | 
			
		||||
	}
 | 
			
		||||
	if view != nil {
 | 
			
		||||
		if value := view.getRaw(BackdropFilter); value != nil {
 | 
			
		||||
			if filter, ok := value.(ViewFilter); ok {
 | 
			
		||||
				return filter
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										36
									
								
								viewStyle.go
								
								
								
								
							
							
						
						
									
										36
									
								
								viewStyle.go
								
								
								
								
							| 
						 | 
				
			
			@ -213,6 +213,7 @@ func (style *viewStyle) cssViewStyle(builder cssBuilder, session Session) {
 | 
			
		|||
		{BackgroundColor, BackgroundColor},
 | 
			
		||||
		{TextColor, "color"},
 | 
			
		||||
		{TextLineColor, "text-decoration-color"},
 | 
			
		||||
		{CaretColor, CaretColor},
 | 
			
		||||
	}
 | 
			
		||||
	for _, p := range colorProperties {
 | 
			
		||||
		if color, ok := colorProperty(style, p.property, session); ok && color != 0 {
 | 
			
		||||
| 
						 | 
				
			
			@ -235,8 +236,8 @@ func (style *viewStyle) cssViewStyle(builder cssBuilder, session Session) {
 | 
			
		|||
	writingMode := 0
 | 
			
		||||
	for _, tag := range []string{
 | 
			
		||||
		TextAlign, TextTransform, TextWeight, TextLineStyle, WritingMode, TextDirection,
 | 
			
		||||
		VerticalTextOrientation, CellVerticalAlign, CellHorizontalAlign, Cursor, WhiteSpace,
 | 
			
		||||
		WordBreak, TextOverflow, Float, TableVerticalAlign} {
 | 
			
		||||
		VerticalTextOrientation, CellVerticalAlign, CellHorizontalAlign, GridAutoFlow, Cursor,
 | 
			
		||||
		WhiteSpace, WordBreak, TextOverflow, Float, TableVerticalAlign, Resize} {
 | 
			
		||||
 | 
			
		||||
		if data, ok := enumProperties[tag]; ok {
 | 
			
		||||
			if tag != VerticalTextOrientation || (writingMode != VerticalLeftToRight && writingMode != VerticalRightToLeft) {
 | 
			
		||||
| 
						 | 
				
			
			@ -295,15 +296,15 @@ func (style *viewStyle) cssViewStyle(builder cssBuilder, session Session) {
 | 
			
		|||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	wrap, _ := enumProperty(style, Wrap, session, 0)
 | 
			
		||||
	wrap, _ := enumProperty(style, ListWrap, session, 0)
 | 
			
		||||
	orientation, ok := valueToOrientation(style.Get(Orientation), session)
 | 
			
		||||
	if ok || wrap > 0 {
 | 
			
		||||
		cssText := enumProperties[Orientation].cssValues[orientation]
 | 
			
		||||
		switch wrap {
 | 
			
		||||
		case WrapOn:
 | 
			
		||||
		case ListWrapOn:
 | 
			
		||||
			cssText += " wrap"
 | 
			
		||||
 | 
			
		||||
		case WrapReverse:
 | 
			
		||||
		case ListWrapReverse:
 | 
			
		||||
			cssText += " wrap-reverse"
 | 
			
		||||
		}
 | 
			
		||||
		builder.add(`flex-flow`, cssText)
 | 
			
		||||
| 
						 | 
				
			
			@ -323,13 +324,13 @@ func (style *viewStyle) cssViewStyle(builder cssBuilder, session Session) {
 | 
			
		|||
	if align, ok := enumProperty(style, HorizontalAlign, session, LeftAlign); ok {
 | 
			
		||||
		switch align {
 | 
			
		||||
		case LeftAlign:
 | 
			
		||||
			if (!rows && wrap == WrapReverse) || orientation == EndToStartOrientation {
 | 
			
		||||
			if (!rows && wrap == ListWrapReverse) || orientation == EndToStartOrientation {
 | 
			
		||||
				builder.add(hAlignTag, `flex-end`)
 | 
			
		||||
			} else {
 | 
			
		||||
				builder.add(hAlignTag, `flex-start`)
 | 
			
		||||
			}
 | 
			
		||||
		case RightAlign:
 | 
			
		||||
			if (!rows && wrap == WrapReverse) || orientation == EndToStartOrientation {
 | 
			
		||||
			if (!rows && wrap == ListWrapReverse) || orientation == EndToStartOrientation {
 | 
			
		||||
				builder.add(hAlignTag, `flex-start`)
 | 
			
		||||
			} else {
 | 
			
		||||
				builder.add(hAlignTag, `flex-end`)
 | 
			
		||||
| 
						 | 
				
			
			@ -349,13 +350,13 @@ func (style *viewStyle) cssViewStyle(builder cssBuilder, session Session) {
 | 
			
		|||
	if align, ok := enumProperty(style, VerticalAlign, session, LeftAlign); ok {
 | 
			
		||||
		switch align {
 | 
			
		||||
		case TopAlign:
 | 
			
		||||
			if (rows && wrap == WrapReverse) || orientation == BottomUpOrientation {
 | 
			
		||||
			if (rows && wrap == ListWrapReverse) || orientation == BottomUpOrientation {
 | 
			
		||||
				builder.add(vAlignTag, `flex-end`)
 | 
			
		||||
			} else {
 | 
			
		||||
				builder.add(vAlignTag, `flex-start`)
 | 
			
		||||
			}
 | 
			
		||||
		case BottomAlign:
 | 
			
		||||
			if (rows && wrap == WrapReverse) || orientation == BottomUpOrientation {
 | 
			
		||||
			if (rows && wrap == ListWrapReverse) || orientation == BottomUpOrientation {
 | 
			
		||||
				builder.add(vAlignTag, `flex-start`)
 | 
			
		||||
			} else {
 | 
			
		||||
				builder.add(vAlignTag, `flex-end`)
 | 
			
		||||
| 
						 | 
				
			
			@ -400,7 +401,16 @@ func (style *viewStyle) cssViewStyle(builder cssBuilder, session Session) {
 | 
			
		|||
	if value := style.getRaw(Filter); value != nil {
 | 
			
		||||
		if filter, ok := value.(ViewFilter); ok {
 | 
			
		||||
			if text := filter.cssStyle(session); text != "" {
 | 
			
		||||
				builder.add(`filter`, text)
 | 
			
		||||
				builder.add(Filter, text)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if value := style.getRaw(BackdropFilter); value != nil {
 | 
			
		||||
		if filter, ok := value.(ViewFilter); ok {
 | 
			
		||||
			if text := filter.cssStyle(session); text != "" {
 | 
			
		||||
				builder.add(`-webkit-backdrop-filter`, text)
 | 
			
		||||
				builder.add(BackdropFilter, text)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -765,10 +775,10 @@ func writeViewStyle(name string, view ViewStyle, buffer *strings.Builder, indent
 | 
			
		|||
		ID, Row, Column, Top, Right, Bottom, Left, Semantics, Cursor, Visibility,
 | 
			
		||||
		Opacity, ZIndex, Width, Height, MinWidth, MinHeight, MaxWidth, MaxHeight,
 | 
			
		||||
		Margin, Padding, BackgroundClip, BackgroundColor, Background, Border, Radius, Outline, Shadow,
 | 
			
		||||
		Orientation, Wrap, VerticalAlign, HorizontalAlign, CellWidth, CellHeight,
 | 
			
		||||
		Orientation, ListWrap, VerticalAlign, HorizontalAlign, CellWidth, CellHeight,
 | 
			
		||||
		CellVerticalAlign, CellHorizontalAlign, GridRowGap, GridColumnGap,
 | 
			
		||||
		ColumnCount, ColumnWidth, ColumnSeparator, ColumnGap, AvoidBreak,
 | 
			
		||||
		Current, Expanded, Side, ResizeBorderWidth, EditViewType, MaxLength, Hint, Text,
 | 
			
		||||
		Current, Expanded, Side, ResizeBorderWidth, EditViewType, MaxLength, Hint, Text, EditWrap,
 | 
			
		||||
		TextOverflow, FontName, TextSize, TextColor, TextWeight, Italic, SmallCaps,
 | 
			
		||||
		Strikethrough, Overline, Underline, TextLineStyle, TextLineThickness,
 | 
			
		||||
		TextLineColor, TextTransform, TextAlign, WhiteSpace, WordBreak, TextShadow, TextIndent,
 | 
			
		||||
| 
						 | 
				
			
			@ -785,7 +795,7 @@ func writeViewStyle(name string, view ViewStyle, buffer *strings.Builder, indent
 | 
			
		|||
	finalTags := []string{
 | 
			
		||||
		Perspective, PerspectiveOriginX, PerspectiveOriginY, BackfaceVisible, OriginX, OriginY, OriginZ,
 | 
			
		||||
		TranslateX, TranslateY, TranslateZ, ScaleX, ScaleY, ScaleZ, Rotate, RotateX, RotateY, RotateZ,
 | 
			
		||||
		SkewX, SkewY, Clip, Filter, Summary, Content, Transition}
 | 
			
		||||
		SkewX, SkewY, Clip, Filter, BackdropFilter, Summary, Content, Transition}
 | 
			
		||||
	for _, tag := range finalTags {
 | 
			
		||||
		removeTag(tag)
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -265,8 +265,8 @@ func (style *viewStyle) set(tag string, value interface{}) bool {
 | 
			
		|||
	case Clip, ShapeOutside:
 | 
			
		||||
		return style.setClipShape(tag, value)
 | 
			
		||||
 | 
			
		||||
	case Filter:
 | 
			
		||||
		return style.setFilter(value)
 | 
			
		||||
	case Filter, BackdropFilter:
 | 
			
		||||
		return style.setFilter(tag, value)
 | 
			
		||||
 | 
			
		||||
	case Transition:
 | 
			
		||||
		setObject := func(obj DataObject) bool {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										32
									
								
								viewUtils.go
								
								
								
								
							
							
						
						
									
										32
									
								
								viewUtils.go
								
								
								
								
							| 
						 | 
				
			
			@ -241,6 +241,20 @@ func GetMaxHeight(view View, subviewID string) SizeUnit {
 | 
			
		|||
	return result
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetResize returns the "resize" property value if the subview. One of the following values is returned:
 | 
			
		||||
// NoneResize (0), BothResize (1), HorizontalResize (2), or VerticalResize (3)
 | 
			
		||||
// If the second argument (subviewID) is "" then a value of the first argument (view) is returned
 | 
			
		||||
func GetResize(view View, subviewID string) int {
 | 
			
		||||
	if subviewID != "" {
 | 
			
		||||
		view = ViewByID(view, subviewID)
 | 
			
		||||
	}
 | 
			
		||||
	if view == nil {
 | 
			
		||||
		return 0
 | 
			
		||||
	}
 | 
			
		||||
	result, _ := enumStyledProperty(view, Resize, 0)
 | 
			
		||||
	return result
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetLeft returns a left position of the subview in an AbsoluteLayout container.
 | 
			
		||||
// If a parent view is not an AbsoluteLayout container then this value is ignored.
 | 
			
		||||
// If the second argument (subviewID) is "" then a left position of the first argument (view) is returned
 | 
			
		||||
| 
						 | 
				
			
			@ -1036,18 +1050,36 @@ func colorStyledProperty(view View, tag string) (Color, bool) {
 | 
			
		|||
	return Color(0), false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// FocusView sets focus on the specified View, if it can be focused.
 | 
			
		||||
// The focused View is the View which will receive keyboard events by default.
 | 
			
		||||
func FocusView(view View) {
 | 
			
		||||
	if view != nil {
 | 
			
		||||
		view.Session().runScript("focus('" + view.htmlID() + "')")
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// FocusView sets focus on the View with the specified viewID, if it can be focused.
 | 
			
		||||
// The focused View is the View which will receive keyboard events by default.
 | 
			
		||||
func FocusViewByID(viewID string, session Session) {
 | 
			
		||||
	if viewID != "" {
 | 
			
		||||
		session.runScript("focus('" + viewID + "')")
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// BlurView removes keyboard focus from the specified View.
 | 
			
		||||
func BlurView(view View) {
 | 
			
		||||
	if view != nil {
 | 
			
		||||
		view.Session().runScript("blur('" + view.htmlID() + "')")
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// BlurViewByID removes keyboard focus from the View with the specified viewID.
 | 
			
		||||
func BlurViewByID(viewID string, session Session) {
 | 
			
		||||
	if viewID != "" {
 | 
			
		||||
		session.runScript("blur('" + viewID + "')")
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetCurrent returns the index of the selected item (<0 if there is no a selected item) or the current view index (StackLayout, TabsLayout).
 | 
			
		||||
// If the second argument (subviewID) is "" then a value from the first argument (view) is returned.
 | 
			
		||||
func GetCurrent(view View, subviewID string) int {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue