forked from mbk-lab/rui_orig
2
0
Fork 0

GetDropDownCurrent and GetListViewCurrent functions replaced by the GetCurrent function. Updated readme

This commit is contained in:
anoshenko 2021-11-20 19:51:51 +03:00
parent 9b3816f049
commit 59acf03260
11 changed files with 320 additions and 82 deletions

View File

@ -3,6 +3,7 @@
* Added SetTitle and SetTitleColor function to the Session interface * Added SetTitle and SetTitleColor function to the Session interface
* Added a listener for changing a view property value * Added a listener for changing a view property value
* Added the "current" property to StackLayout * Added the "current" property to StackLayout
* GetDropDownCurrent and GetListViewCurrent functions replaced by the GetCurrent function
* Updated TabsLayout * Updated TabsLayout
* Bug fixing * Bug fixing

View File

@ -317,7 +317,7 @@ Value - угловая величина
Для более наглядного и простого задания переменных типа AngleUnit могут использоваться функции приведенные ниже Для более наглядного и простого задания переменных типа AngleUnit могут использоваться функции приведенные ниже
| Функция | Эквивалентное определение | | Функция | Эквивалентное определение |
|---------------|-------------------------------------------------| |---------------|-----------------------------------------------|
| rui.Rad(n) | rui.AngleUnit{ Type: rui.Radian, Value: n } | | rui.Rad(n) | rui.AngleUnit{ Type: rui.Radian, Value: n } |
| rui.PiRad(n) | rui.AngleUnit{ Type: rui.PiRadian, Value: n } | | rui.PiRad(n) | rui.AngleUnit{ Type: rui.PiRadian, Value: n } |
| rui.Deg(n) | rui.AngleUnit{ Type: rui.Degree, Value: n } | | rui.Deg(n) | rui.AngleUnit{ Type: rui.Degree, Value: n } |
@ -374,6 +374,22 @@ View имеет ряд свойств, таких как высота, шири
Данные функции возвращают/устанавливают значение дочернего View Данные функции возвращают/устанавливают значение дочернего View
### Отслеживание изменения свойств
Вы можете установить функцию для отслеживания изменения абсолютно любого свойства View (исключений нет).
Для установки слушателя изменений интерфейс View содержит функцию:
SetChangeListener(tag string, listener func(View, string))
где первый параметр это имя отслеживаемого свойства, а второй - функция которая будет вызываться
какждый раз когда значение свойства изменится.
Например
view.SetChangeListener(rui.BackgroundColor, listener func(view View, tag string) {
// The background color changed
})
### События ### События
При взаимодействии с приложением возникаю различные события: клики, изменение размеров, При взаимодействии с приложением возникаю различные события: клики, изменение размеров,
@ -2372,6 +2388,24 @@ StackLayout является контейнером, реализующим ин
Peek() View Peek() View
Так же получить текущий View можно используя его индекс. Для получения индекса используется
свойство "current" (константа Current). Пример
func peek(layout rui.StackLayout) {
views := layout.Views()
if index := rui.GetCurrent(layout, ""); index >= 0 && index < len(views) {
return views[index]
}
return nil
}
Конечно это менее удобно по сравнению с функцией Peek. Однако свойство "current" может быть использовано
для отслеживания изменения текущего View:
layout.SetChangeListener(rui.Current, func(view rui.View, tag string) {
// current view changed
})
Для того чтобы сделать любой дочерний View текущим (видимым) используются функции интерфейса: Для того чтобы сделать любой дочерний View текущим (видимым) используются функции интерфейса:
MoveToFront(view View) bool MoveToFront(view View) bool
@ -2380,6 +2414,101 @@ StackLayout является контейнером, реализующим ин
Данная функция вернет true в случае успеха и false если дочерний View или View с таким id не существует и в Данная функция вернет true в случае успеха и false если дочерний View или View с таким id не существует и в
лог будет записано сообщение об ошибке. лог будет записано сообщение об ошибке.
Также чтобы сделать любой дочерний View текущим (видимым) можно использовать свойство "current".
## TabsLayout
TabsLayout является контейнером, реализующим интерфейс ViewsContainer. Все дочерние View
располагаются друг над другом и каждый занимает все пространство контейнера. В каждый момент времени
доступен только один дочерний View (текущий). Для выбора текущего View используются вкладки которые располагаются
вдоль одной из сторон контейнера
Для создания TabsLayout используется функция
func NewTabsLayout(session Session, params Params) TabsLayout
Для каждого View создается закладка. На закладке может отображаться заголовок, иконка и кнопка закрытия.
Заголовок задается с помощью текстового свойства "title" (константа Title) дочернего View.
Свойство "title" опционально. Если оно не задано, то на вкладке не будет текста.
Иконка задается с помощью текстового свойства "icon" (константа Icon) дочернего View.
В качестве значения ему присваивается имя файла иконки (если иконка располагается
в ресурсах приложения) или url. Свойство "icon" опционально. Если оно не задано, то на вкладке не будет иконки.
Отображение кнопки закрытия вкладки управляется с помощью булевского свойства "tab-close-button" (константа TabCloseButton).
Значение "true" включает отображение кнопки закрытия вкладки. Значение по умолчанию "false".
ойства "tab-close-button" может быть задано как для дочернего View так и для самого TabsLayout.
Установка значения свойства "tab-close-button" для TabsLayout включает/выключает отображение
кнопки закрытия сразу для всех вкладок. Значение "tab-close-button" установленое для дочернего
элемента имеет более высокий приоритет по сравнению со значением установленным для TabsLayout.
Кнопка закрытия вкладки не закрывает вкладку, а только генерирует событие "tab-close-event" (константа TabCloseEvent).
Основной обработчик данного события имеет формат
func(layout TabsLayout, index int)
где второй элемент это индекс дочернего View.
Как уже было сказано, нажатие на кнопку закрытия вкладки не закрывает вкладку.
Вы сами должны закрывать вкладку. Это делается следующим образом
tabsView.Set(rui.TabCloseEvent, func(layout rui.TabsLayout, index int) {
layout.RemoveView(index)
})
Управлять текущим View можно с помощью целочисленного свойства "current" (константа Current).
Для программного переключания вкладок присвойте данному свойству значение индекса новой текущего View.
Прочитать значение свойства "current" можно с помощью функции
func GetCurrent(view View, subviewID string) int
Также свойство "current" может быть использовано для отслеживания изменения текущего View:
tabsView.SetChangeListener(rui.Current, func(view rui.View, tag string) {
// current view changed
})
Вкладки располагаются вдоль одной из сторон контейнера TabsLayout. Расположение вкладок
задается с помощью целочисленного свойства "tabs" (константа Tabs). Данное свойство может
принимать следующие значения
| Значение | Константа | Имя | Расположение вкладок |
|:--------:|---------------|--------------|----------------------------------------------------------------|
| 0 | TopTabs | "top" | Сверху. Значение по умолчанию. |
| 1 | BottomTabs | "bottom" | Снизу. |
| 2 | LeftTabs | "left" | Слева. Каждая вкладка повернута на 90° против часовой стрелки. |
| 3 | RightTabs | "right" | Справа. Каждая вкладка повернута на 90° по часовой стрелки. |
| 4 | LeftListTabs | "left-list" | Слева. Вкладки отображаются в виде списка. |
| 5 | RightListTabs | "right-list" | Справа. Вкладки отображаются в виде списка. |
| 6 | HiddenTabs | "hidden" | Вкладки скрыты. |
Зачем нужно значение HiddenTabs. Дело в том, что TabsLayout реализует интерфейс ListAdapter.
Что позволяет легко реализовать вкладки с помощью ListView. Именно в этом случаи и применяется значение HiddenTabs.
При отображении текущей (выбранной) вкладки типа TopTabs, BottomTabs, LeftListTabs и RightListTabs используется
стиль "ruiActiveTab", а для вкладки типа LeftTabs и RightTabs используется стиль "ruiActiveVerticalTab".
Если вы хотите кастомизировать отображение вкладок, то вы можите либо переопределить данные стили, либо
назначить свой стиль с помощью свойства "current-tab-style" (константа CurrentTabStyle).
Соответственно, для неактивной вкладки используются стили "ruiInactiveTab" и "ruiInactiveVerticalTab", а
назначить свой стиль можно с помощью свойства "tab-style" (константа TabStyle).
Также при отображении вкладок используется следующие константы и стили:
* "ruiTabHeight" - SizeUnit константа задает высоту панели вкладок;
* "ruiTabSpace" - SizeUnit константа задает расстояние между вкладками;
* "ruiTabsPadding" - SizeUnit или BoundsProperty константа задает отступ от внутри панели вкладок;
* "ruiTabsBackgroundColor" - цвет фона панели закладок;
* "ruiTabCloseButton" - стиль кнопки закрытия вкладки.
Вы можете переопределять данные константы и стили для кастимизации панели вкладок
## AbsoluteLayout ## AbsoluteLayout
AbsoluteLayout является контейнером, реализующим интерфейс ViewsContainer. Дочерние View AbsoluteLayout является контейнером, реализующим интерфейс ViewsContainer. Дочерние View
@ -2840,7 +2969,7 @@ float32, float64, int, int8…int64, uint, uint8…uint64.
Выбранное значение определяется int свойством "current" (константа Current). Значение по умолчанию 0. Выбранное значение определяется int свойством "current" (константа Current). Значение по умолчанию 0.
Прочитать значение данного свойства можно с помощью функции Прочитать значение данного свойства можно с помощью функции
func GetDropDownCurrent(view View, subviewID string) int func GetCurrent(view View, subviewID string) int
Для отслеживания изменения свойства "current" используется событие "drop-down-event" (константа Для отслеживания изменения свойства "current" используется событие "drop-down-event" (константа
DropDownEvent). Основной слушатель события имеет следующий формат: DropDownEvent). Основной слушатель события имеет следующий формат:
@ -3023,7 +3152,7 @@ int свойство "current" (константа Current). Значение "c
Получить значение данного свойства можно с помощью функции Получить значение данного свойства можно с помощью функции
func GetListViewCurrent(view View, subviewID string) int func GetCurrent(view View, subviewID string) int
### Свойства "list-item-style", "current-style" и "current-inactive-style" ### Свойства "list-item-style", "current-style" и "current-inactive-style"

131
README.md
View File

@ -377,6 +377,22 @@ To simplify setting / reading properties, there are also two global functions Ge
These functions get/set the value of the child View These functions get/set the value of the child View
### Tracking property changes
You can set a function to track the change of absolutely any View property (there are no exceptions).
To set up a change listener, the View interface contains a function:
SetChangeListener(tag string, listener func(View, string))
where the first parameter is the name of the tracked property, and the second is the function
that will be called every time the property value changes.
For example
view.SetChangeListener(rui.BackgroundColor, listener func(view View, tag string) {
// The background color changed
})
### Events ### Events
When interacting with the application, various events arise: clicks, resizing, changing input data, etc. When interacting with the application, various events arise: clicks, resizing, changing input data, etc.
@ -2342,6 +2358,23 @@ The function will return false if the StackLayout is empty and true if the curre
Peek() View Peek() View
You can also get the current View using its index. The "current" property (constant Current) is used to get the index.
Example
func peek(layout rui.StackLayout) {
views := layout.Views()
if index := rui.GetCurrent(layout, ""); index >= 0 && index < len(views) {
return views[index]
}
return nil
}
Of course, this is less convenient than the Peek function. However, the "current" property can be used to track changes to the current View:
layout.SetChangeListener(rui.Current, func(view rui.View, tag string) {
// current view changed
})
In order to make any child View current (visible), the interface functions are used: In order to make any child View current (visible), the interface functions are used:
MoveToFront(view View) bool MoveToFront(view View) bool
@ -2350,6 +2383,100 @@ In order to make any child View current (visible), the interface functions are u
This function will return true if successful and false if the child View or This function will return true if successful and false if the child View or
View with id does not exist and an error message will be written to the log. View with id does not exist and an error message will be written to the log.
You can also use the "current" property to make any child View current (visible).
## TabsLayout
TabsLayout is a container that implements the ViewsContainer interface. All child Views are stacked
on top of each other and each takes up the entire container space.
Only one child View (current) is available at a time. Tabs, that are located along one of the sides of the container,
are used to select the current View.
To create a TabsLayout, use the function
func NewTabsLayout(session Session, params Params) TabsLayout
A bookmark is created for each View. A bookmark can display a title, an icon, and a close button.
The title is set using the "title" text property (constant Title) of the child View.
The "title" property is optional. If it is not specified, then there will be no text on the tab.
The icon is set using the "icon" text property (constant Icon) of the child View.
As a value, it is assigned the name of the icon file (if the icon is located in the application resources) or url.
The "icon" property is optional. If it is not specified, then there will be no icon on the tab.
The display of the tab close button is controlled by the "tab-close-button" boolean property (constant TabCloseButton).
"true" enables the display of the close button for the tab. The default is "false".
The "tab-close-button" properties can be set for both the child View and the TabsLayout itself.
Setting the value of the "tab-close-button" property for the TabsLayout enables/disables the display
of the close button for all tabs at once. The "tab-close-button" value set on the child View
takes precedence over the value set on the TabsLayout.
The tab close button does not close the tab, but only generates the "tab-close-event" event (constant TabCloseEvent).
The main handler for this event has the format
func(layout TabsLayout, index int)
where the second element is the index of the child View.
As already mentioned, clicking on the close tab button does not close the tab.
You must close the tab yourself. This is done as follows
tabsView.Set(rui.TabCloseEvent, func(layout rui.TabsLayout, index int) {
layout.RemoveView(index)
})
You can control the current View using the "current" integer property (constant Current).
To programmatically switch tabs, set this property to the index of the new current View.
You can read the value of the "current" property using the function
func GetCurrent(view View, subviewID string) int
Also, the "current" property can be used to track changes to the current View:
tabsView.SetChangeListener(rui.Current, func(view rui.View, tag string) {
// current view changed
})
Tabs are positioned along one side of the TabsLayout container. The tabs are positioned using
the "tabs" integer property (the Tabs constant). This property can take on the following values:
| Value | Constant | Name | Placement of tabs |
|:--------:|---------------|--------------|--------------------------------------------------|
| 0 | TopTabs | "top" | Top. Default value. |
| 1 | BottomTabs | "bottom" | Bottom. |
| 2 | LeftTabs | "left" | Left. Each tab is rotated 90 ° counterclockwise. |
| 3 | RightTabs | "right" | On right. Each tab is rotated 90 ° clockwise. |
| 4 | LeftListTabs | "left-list" | Left. The tabs are displayed as a list. |
| 5 | RightListTabs | "right-list" | On right. The tabs are displayed as a list. |
| 6 | HiddenTabs | "hidden" | The tabs are hidden. |
Why do I need the value HiddenTabs. The point is that TabsLayout implements the ListAdapter interface.
Which makes it easy to implement tabs with a ListView. This is where the HiddenTabs value comes in.
When displaying the current (selected) tabs of type TopTabs, BottomTabs, LeftListTabs and RightListTabs,
the style is "ruiActiveTab", and for tabs of type LeftTabs and RightTabs, the style is "ruiActiveVerticalTab".
If you want to customize the display of tabs, you can either override these styles, or assign your own style using
the "current-tab-style" property (constant CurrentTabStyle).
Accordingly, for an inactive tab, the "ruiInactiveTab" and "ruiInactiveVerticalTab" styles are used,
and you can assign your own style using the "tab-style" property (constant TabStyle).
Also, when displaying tabs, the following constants and styles are used:
* "ruiTabHeight" - the SizeUnit constant sets the height of the tab bar;
* "ruiTabSpace" - the SizeUnit constant sets the distance between tabs;
* "ruiTabsPadding" - the SizeUnit or BoundsProperty constant sets the indentation from the inside of the tab bar;
* "ruiTabsBackgroundColor" - background color of the tabs bar;
* "ruiTabCloseButton" - style of the button for closing the tab.
You can override these constants and styles to customize the tab bar
## AbsoluteLayout ## AbsoluteLayout
AbsoluteLayout is a container that implements the ViewsContainer interface. AbsoluteLayout is a container that implements the ViewsContainer interface.
@ -2809,7 +2936,7 @@ You can read the value of the "items" property using the function
The selected value is determined by the int property "current" (Current constant). The default is 0. The selected value is determined by the int property "current" (Current constant). The default is 0.
You can read the value of this property using the function You can read the value of this property using the function
func GetDropDownCurrent(view View, subviewID string) int func GetCurrent(view View, subviewID string) int
To track the change of the "current" property, the "drop-down-event" event (DropDownEvent constant) is used. To track the change of the "current" property, the "drop-down-event" event (DropDownEvent constant) is used.
The main event listener has the following format: The main event listener has the following format:
@ -2990,7 +3117,7 @@ The value "current" is less than 0 means that no item is selected
You can get the value of this property using the function You can get the value of this property using the function
func GetListViewCurrent(view View, subviewID string) int func GetCurrent(view View, subviewID string) int
### "list-item-style", "current-style", and "current-inactive-style" properties ### "list-item-style", "current-style", and "current-inactive-style" properties

View File

@ -80,12 +80,12 @@ func createAnimationDemo(session rui.Session) rui.View {
params := rui.Params{ params := rui.Params{
rui.PropertyTag: []rui.AnimatedProperty{prop1, prop2, prop3}, rui.PropertyTag: []rui.AnimatedProperty{prop1, prop2, prop3},
rui.Duration: rui.GetDropDownCurrent(view, "animationDuration") * 4, rui.Duration: rui.GetCurrent(view, "animationDuration") * 4,
rui.Delay: rui.GetDropDownCurrent(view, "animationDelay"), rui.Delay: rui.GetCurrent(view, "animationDelay"),
rui.AnimationDirection: rui.GetDropDownCurrent(view, "animationDirection"), rui.AnimationDirection: rui.GetCurrent(view, "animationDirection"),
} }
switch rui.GetDropDownCurrent(view, "animationTimingFunction") { switch rui.GetCurrent(view, "animationTimingFunction") {
case 0: case 0:
params[rui.TimingFunction] = rui.EaseTiming params[rui.TimingFunction] = rui.EaseTiming
@ -96,7 +96,7 @@ func createAnimationDemo(session rui.Session) rui.View {
params[rui.TimingFunction] = rui.StepsTiming(40) params[rui.TimingFunction] = rui.StepsTiming(40)
} }
switch rui.GetDropDownCurrent(view, "animationIterationCount") { switch rui.GetCurrent(view, "animationIterationCount") {
case 0: case 0:
params[rui.IterationCount] = 1 params[rui.IterationCount] = 1

View File

@ -54,13 +54,13 @@ func createBackgroundDemo(session rui.Session) rui.View {
updateBackground1 := func(list rui.DropDownList, number int) { updateBackground1 := func(list rui.DropDownList, number int) {
images := []string{"cat.jpg", "winds.png", "gifsInEmail.gif", "mountain.svg"} images := []string{"cat.jpg", "winds.png", "gifsInEmail.gif", "mountain.svg"}
image := rui.NewBackgroundImage(rui.Params{ image := rui.NewBackgroundImage(rui.Params{
rui.Source: images[rui.GetDropDownCurrent(view, "backgroundImage1")], rui.Source: images[rui.GetCurrent(view, "backgroundImage1")],
rui.Fit: rui.GetDropDownCurrent(view, "backgroundFit1"), rui.Fit: rui.GetCurrent(view, "backgroundFit1"),
rui.HorizontalAlign: rui.GetDropDownCurrent(view, "backgroundHAlign1"), rui.HorizontalAlign: rui.GetCurrent(view, "backgroundHAlign1"),
rui.VerticalAlign: rui.GetDropDownCurrent(view, "backgroundVAlign1"), rui.VerticalAlign: rui.GetCurrent(view, "backgroundVAlign1"),
rui.Repeat: rui.GetDropDownCurrent(view, "backgroundRepeat1"), rui.Repeat: rui.GetCurrent(view, "backgroundRepeat1"),
rui.BackgroundClip: rui.GetDropDownCurrent(view, "backgroundClip1"), rui.BackgroundClip: rui.GetCurrent(view, "backgroundClip1"),
rui.Attachment: rui.GetDropDownCurrent(view, "backgroundAttachment1"), rui.Attachment: rui.GetCurrent(view, "backgroundAttachment1"),
}) })
rui.Set(view, "backgroundView", rui.Background, image) rui.Set(view, "backgroundView", rui.Background, image)
} }

View File

@ -40,20 +40,20 @@ func createStackLayoutDemo(session rui.Session) rui.View {
} }
animation := func() int { animation := func() int {
return rui.GetDropDownCurrent(view, "pushAnimation") return rui.GetCurrent(view, "pushAnimation")
} }
/* /*
transition := func() rui.ViewTransition { transition := func() rui.ViewTransition {
timing := rui.EaseTiming timing := rui.EaseTiming
timings := []string{rui.EaseTiming, rui.LinearTiming} timings := []string{rui.EaseTiming, rui.LinearTiming}
if n := rui.GetDropDownCurrent(view, "pushTiming"); n >= 0 && n < len(timings) { if n := rui.GetCurrent(view, "pushTiming"); n >= 0 && n < len(timings) {
timing = timings[n] timing = timings[n]
} }
duration := float64(0.5) duration := float64(0.5)
durations := []float64{0.5, 1, 2} durations := []float64{0.5, 1, 2}
if n := rui.GetDropDownCurrent(view, "pushDuration"); n >= 0 && n < len(durations) { if n := rui.GetCurrent(view, "pushDuration"); n >= 0 && n < len(durations) {
duration = durations[n] duration = durations[n]
} }

View File

@ -59,7 +59,7 @@ func createTextStyleDemo(session rui.Session) rui.View {
rui.SetChangeListener(view, "textStyleFont", rui.Current, func(v rui.View, tag string) { rui.SetChangeListener(view, "textStyleFont", rui.Current, func(v rui.View, tag string) {
fonts := []string{"", "serif", "sans-serif", "\"Courier new\", monospace", "cursive", "fantasy"} fonts := []string{"", "serif", "sans-serif", "\"Courier new\", monospace", "cursive", "fantasy"}
if number := rui.GetDropDownCurrent(v, ""); number > 0 && number < len(fonts) { if number := rui.GetCurrent(v, ""); number > 0 && number < len(fonts) {
rui.Set(view, "textStyleText", rui.FontName, fonts[number]) rui.Set(view, "textStyleText", rui.FontName, fonts[number])
} else { } else {
rui.Set(view, "textStyleText", rui.FontName, nil) rui.Set(view, "textStyleText", rui.FontName, nil)

View File

@ -61,7 +61,7 @@ func (list *dropDownListData) remove(tag string) {
} }
case Current: case Current:
oldCurrent := GetDropDownCurrent(list, "") oldCurrent := GetCurrent(list, "")
delete(list.properties, Current) delete(list.properties, Current)
if oldCurrent != 0 { if oldCurrent != 0 {
if list.created { if list.created {
@ -89,12 +89,12 @@ func (list *dropDownListData) set(tag string, value interface{}) bool {
return list.setDropDownListener(value) return list.setDropDownListener(value)
case Current: case Current:
oldCurrent := GetDropDownCurrent(list, "") oldCurrent := GetCurrent(list, "")
if !list.setIntProperty(Current, value) { if !list.setIntProperty(Current, value) {
return false return false
} }
if current := GetDropDownCurrent(list, ""); oldCurrent != current { if current := GetCurrent(list, ""); oldCurrent != current {
if list.created { if list.created {
list.session.runScript(fmt.Sprintf(`selectDropDownListItem('%s', %d)`, list.htmlID(), current)) list.session.runScript(fmt.Sprintf(`selectDropDownListItem('%s', %d)`, list.htmlID(), current))
} }
@ -267,7 +267,7 @@ func (list *dropDownListData) htmlTag() string {
func (list *dropDownListData) htmlSubviews(self View, buffer *strings.Builder) { func (list *dropDownListData) htmlSubviews(self View, buffer *strings.Builder) {
if list.items != nil { if list.items != nil {
current := GetDropDownCurrent(list, "") current := GetCurrent(list, "")
notTranslate := GetNotTranslate(list, "") notTranslate := GetNotTranslate(list, "")
for i, item := range list.items { for i, item := range list.items {
if i == current { if i == current {
@ -309,7 +309,7 @@ func (list *dropDownListData) handleCommand(self View, command string, data Data
case "itemSelected": case "itemSelected":
if text, ok := data.PropertyValue("number"); ok { if text, ok := data.PropertyValue("number"); ok {
if number, err := strconv.Atoi(text); err == nil { if number, err := strconv.Atoi(text); err == nil {
if GetDropDownCurrent(list, "") != number && number >= 0 && number < len(list.items) { if GetCurrent(list, "") != number && number >= 0 && number < len(list.items) {
list.properties[Current] = number list.properties[Current] = number
list.onSelectedItemChanged(number) list.onSelectedItemChanged(number)
} }
@ -345,15 +345,3 @@ func GetDropDownItems(view View, subviewID string) []string {
} }
return []string{} return []string{}
} }
// func GetDropDownCurrentItem return the number of the selected item
func GetDropDownCurrent(view View, subviewID string) int {
if subviewID != "" {
view = ViewByID(view, subviewID)
}
if view != nil {
result, _ := intProperty(view, Current, view.Session(), 0)
return result
}
return 0
}

View File

@ -141,7 +141,7 @@ func (listView *listViewData) remove(tag string) {
} }
case Current: case Current:
current := GetListViewCurrent(listView, "") current := GetCurrent(listView, "")
delete(listView.properties, tag) delete(listView.properties, tag)
if listView.created { if listView.created {
updateInnerHTML(listView.htmlID(), listView.session) updateInnerHTML(listView.htmlID(), listView.session)
@ -235,11 +235,11 @@ func (listView *listViewData) set(tag string, value interface{}) bool {
} }
case Current: case Current:
oldCurrent := GetListViewCurrent(listView, "") oldCurrent := GetCurrent(listView, "")
if !listView.setIntProperty(Current, value) { if !listView.setIntProperty(Current, value) {
return false return false
} }
current := GetListViewCurrent(listView, "") current := GetCurrent(listView, "")
if oldCurrent == current { if oldCurrent == current {
return true return true
} }
@ -791,7 +791,7 @@ func (listView *listViewData) checkboxSubviews(self View, buffer *strings.Builde
itemDiv := listView.checkboxItemDiv(self, checkbox, hCheckboxAlign, vCheckboxAlign) itemDiv := listView.checkboxItemDiv(self, checkbox, hCheckboxAlign, vCheckboxAlign)
onDiv, offDiv, contentDiv := listView.getDivs(self, checkbox, hCheckboxAlign, vCheckboxAlign) onDiv, offDiv, contentDiv := listView.getDivs(self, checkbox, hCheckboxAlign, vCheckboxAlign)
current := GetListViewCurrent(listView, "") current := GetCurrent(listView, "")
checkedItems := GetListViewCheckedItems(listView, "") checkedItems := GetListViewCheckedItems(listView, "")
for i := 0; i < count; i++ { for i := 0; i < count; i++ {
buffer.WriteString(`<div id="`) buffer.WriteString(`<div id="`)
@ -848,7 +848,7 @@ func (listView *listViewData) noneCheckboxSubviews(self View, buffer *strings.Bu
itemStyleBuilder.WriteString(`" onclick="listItemClickEvent(this, event)"`) itemStyleBuilder.WriteString(`" onclick="listItemClickEvent(this, event)"`)
itemStyle := itemStyleBuilder.String() itemStyle := itemStyleBuilder.String()
current := GetListViewCurrent(listView, "") current := GetCurrent(listView, "")
for i := 0; i < count; i++ { for i := 0; i < count; i++ {
buffer.WriteString(`<div id="`) buffer.WriteString(`<div id="`)
buffer.WriteString(listViewID) buffer.WriteString(listViewID)
@ -920,7 +920,7 @@ func (listView *listViewData) htmlProperties(self View, buffer *strings.Builder)
buffer.WriteString(`" data-bluritemstyle="`) buffer.WriteString(`" data-bluritemstyle="`)
buffer.WriteString(listView.currentInactiveStyle()) buffer.WriteString(listView.currentInactiveStyle())
buffer.WriteString(`"`) buffer.WriteString(`"`)
current := GetListViewCurrent(listView, "") current := GetCurrent(listView, "")
if listView.adapter != nil && current >= 0 && current < listView.adapter.ListSize() { if listView.adapter != nil && current >= 0 && current < listView.adapter.ListSize() {
buffer.WriteString(` data-current="`) buffer.WriteString(` data-current="`)
buffer.WriteString(listView.htmlID()) buffer.WriteString(listView.htmlID())
@ -1113,7 +1113,7 @@ func (listView *listViewData) handleCommand(self View, command string, data Data
} }
func (listView *listViewData) onItemClick() { func (listView *listViewData) onItemClick() {
current := GetListViewCurrent(listView, "") current := GetCurrent(listView, "")
if current >= 0 && !IsDisabled(listView, "") { if current >= 0 && !IsDisabled(listView, "") {
checkbox := GetListViewCheckbox(listView, "") checkbox := GetListViewCheckbox(listView, "")
m: m:
@ -1235,20 +1235,6 @@ func GetListItemCheckedListeners(view View, subviewID string) []func(ListView, [
return []func(ListView, []int){} return []func(ListView, []int){}
} }
// GetListViewCurrent returns the index of the ListView selected item or <0 if there is no a selected item.
// If the second argument (subviewID) is "" then a value from the first argument (view) is returned.
func GetListViewCurrent(view View, subviewID string) int {
if subviewID != "" {
view = ViewByID(view, subviewID)
}
if view != nil {
if result, ok := intProperty(view, Current, view.Session(), -1); ok {
return result
}
}
return -1
}
// GetListItemWidth returns the width of a ListView item. // GetListItemWidth returns the width of a ListView item.
// If the second argument (subviewID) is "" then a value from the first argument (view) is returned. // If the second argument (subviewID) is "" then a value from the first argument (view) is returned.
func GetListItemWidth(view View, subviewID string) SizeUnit { func GetListItemWidth(view View, subviewID string) SizeUnit {

View File

@ -50,27 +50,10 @@ const (
type TabsLayout interface { type TabsLayout interface {
ViewsContainer ViewsContainer
ListAdapter ListAdapter
/*
// Current return the index of active tab
currentItem() int
// SetCurrent set the index of active tab
SetCurrent(current int)
// TabsLocation return the location of tabs. It returns one of the following values: HiddenTabs (0),
// TopTabs (1), BottomTabs (2), LeftTabs (3), RightTabs (4), LeftListTabs (5), RightListTabs (6)
tabsLocation() int
// TabsLocation set the location of tabs. Valid values: HiddenTabs (0), TopTabs (1),
// BottomTabs (2), LeftTabs (3), RightTabs (4), LeftListTabs (5), RightListTabs (6)
SetTabsLocation(location int)
// TabStyle() return styles of tab in the passive and the active state
TabStyle() (string, string)
SetTabStyle(tabStyle string, activeTabStyle string)
*/
} }
type tabsLayoutData struct { type tabsLayoutData struct {
viewsContainerData viewsContainerData
//currentTab, tabsLocation int
//tabStyle, activeTabStyle string
tabListener []func(TabsLayout, int, int) tabListener []func(TabsLayout, int, int)
tabCloseListener []func(TabsLayout, int) tabCloseListener []func(TabsLayout, int)
} }

View File

@ -1045,3 +1045,27 @@ func FocusViewByID(viewID string, session Session) {
session.runScript("focus('" + viewID + "')") session.runScript("focus('" + 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 {
if subviewID != "" {
view = ViewByID(view, subviewID)
}
var defaultValue int
switch view.Tag() {
case "ListView":
defaultValue = -1
default:
defaultValue = 0
}
if view != nil {
if result, ok := intProperty(view, Current, view.Session(), defaultValue); ok {
return result
}
}
return -1
}