2021-09-07 17:36:50 +03:00
|
|
|
package rui
|
|
|
|
|
2022-07-31 15:37:26 +03:00
|
|
|
import (
|
|
|
|
"strings"
|
|
|
|
)
|
2021-09-07 17:36:50 +03:00
|
|
|
|
|
|
|
const (
|
2022-07-08 13:16:42 +03:00
|
|
|
// Title is the constant for the "title" property tag.
|
|
|
|
// The "title" property is defined the Popup/Tabs title
|
2021-09-07 17:36:50 +03:00
|
|
|
Title = "title"
|
2022-07-08 13:16:42 +03:00
|
|
|
|
|
|
|
// TitleStyle is the constant for the "title-style" property tag.
|
|
|
|
// The "title-style" string property is used to set the title style of the Popup.
|
2021-09-07 17:36:50 +03:00
|
|
|
TitleStyle = "title-style"
|
2022-07-08 13:16:42 +03:00
|
|
|
|
|
|
|
// CloseButton is the constant for the "close-button" property tag.
|
|
|
|
// The "close-button" bool property allow to add the close button to the Popup.
|
|
|
|
// Setting this property to "true" adds a window close button to the title bar (the default value is "false").
|
2021-09-07 17:36:50 +03:00
|
|
|
CloseButton = "close-button"
|
2022-07-08 13:16:42 +03:00
|
|
|
|
|
|
|
// OutsideClose is the constant for the "outside-close" property tag.
|
|
|
|
// The "outside-close" is a bool property. If it is set to "true",
|
|
|
|
// then clicking outside the popup window automatically calls the Dismiss() method.
|
2021-09-07 17:36:50 +03:00
|
|
|
OutsideClose = "outside-close"
|
2022-07-08 13:16:42 +03:00
|
|
|
|
|
|
|
// Buttons is the constant for the "buttons" property tag.
|
|
|
|
// Using the "buttons" property you can add buttons that will be placed at the bottom of the Popup.
|
|
|
|
// The "buttons" property can be assigned the following data types: PopupButton and []PopupButton
|
|
|
|
Buttons = "buttons"
|
|
|
|
|
|
|
|
// ButtonsAlign is the constant for the "buttons-align" property tag.
|
|
|
|
// The "buttons-align" int property is used for set the horizontal alignment of Popup buttons.
|
|
|
|
// Valid values: LeftAlign (0), RightAlign (1), CenterAlign (2), and StretchAlign (3)
|
2021-09-07 17:36:50 +03:00
|
|
|
ButtonsAlign = "buttons-align"
|
2022-07-08 13:16:42 +03:00
|
|
|
|
|
|
|
// DismissEvent is the constant for the "dismiss-event" property tag.
|
|
|
|
// The "dismiss-event" event is used to track the closing of the Popup.
|
|
|
|
// It occurs after the Popup disappears from the screen.
|
|
|
|
// The main listener for this event has the following format: func(Popup)
|
2021-11-17 12:32:37 +03:00
|
|
|
DismissEvent = "dismiss-event"
|
2022-07-27 20:31:57 +03:00
|
|
|
|
2022-07-31 15:37:26 +03:00
|
|
|
// Arrow is the constant for the "arrow" property tag.
|
|
|
|
// Using the "popup-arrow" int property you can add ...
|
|
|
|
Arrow = "arrow"
|
|
|
|
|
|
|
|
// ArrowAlign is the constant for the "arrow-align" property tag.
|
|
|
|
// The "arrow-align" int property is used for set the horizontal alignment of Popup arrow.
|
|
|
|
// Valid values: LeftAlign (0), RightAlign (1), TopAlign (0), BottomAlign (1), CenterAlign (2)
|
|
|
|
ArrowAlign = "arrow-align"
|
|
|
|
|
|
|
|
// ArrowSize is the constant for the "arrow-size" property tag.
|
|
|
|
// The "arrow-size" SizeUnit property is used for set the size of Popup arrow.
|
|
|
|
ArrowSize = "arrow-size"
|
|
|
|
|
|
|
|
// ArrowOffset is the constant for the "arrow-offset" property tag.
|
|
|
|
// The "arrow-offset" SizeUnit property is used for set the offset of Popup arrow.
|
|
|
|
ArrowOffset = "arrow-offset"
|
|
|
|
|
|
|
|
NoneArrow = 0
|
|
|
|
TopArrow = 1
|
|
|
|
RightArrow = 2
|
|
|
|
BottomArrow = 3
|
|
|
|
LeftArrow = 4
|
2021-09-07 17:36:50 +03:00
|
|
|
)
|
|
|
|
|
2022-07-08 13:16:42 +03:00
|
|
|
// PopupButton describes a button that will be placed at the bottom of the window.
|
2021-09-07 17:36:50 +03:00
|
|
|
type PopupButton struct {
|
|
|
|
Title string
|
|
|
|
OnClick func(Popup)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Popup interface
|
|
|
|
type Popup interface {
|
|
|
|
View() View
|
|
|
|
Session() Session
|
|
|
|
Show()
|
|
|
|
Dismiss()
|
2022-07-08 13:16:42 +03:00
|
|
|
onDismiss()
|
2021-09-07 17:36:50 +03:00
|
|
|
html(buffer *strings.Builder)
|
|
|
|
viewByHTMLID(id string) View
|
|
|
|
}
|
|
|
|
|
|
|
|
type popupData struct {
|
2021-11-17 12:32:37 +03:00
|
|
|
layerView View
|
|
|
|
view View
|
|
|
|
dismissListener []func(Popup)
|
2021-09-07 17:36:50 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
type popupManager struct {
|
|
|
|
popups []Popup
|
|
|
|
}
|
|
|
|
|
2022-07-31 15:37:26 +03:00
|
|
|
func (popup *popupData) init(view View, popupParams Params) {
|
2021-09-07 17:36:50 +03:00
|
|
|
popup.view = view
|
|
|
|
session := view.Session()
|
|
|
|
|
2022-07-31 15:37:26 +03:00
|
|
|
params := Params{
|
|
|
|
Style: "ruiPopup",
|
|
|
|
MaxWidth: Percent(100),
|
|
|
|
MaxHeight: Percent(100),
|
|
|
|
CellVerticalAlign: StretchAlign,
|
|
|
|
CellHorizontalAlign: StretchAlign,
|
|
|
|
ClickEvent: func(View) {},
|
2022-07-08 13:16:42 +03:00
|
|
|
}
|
|
|
|
|
2022-07-31 15:37:26 +03:00
|
|
|
closeButton := false
|
|
|
|
outsideClose := false
|
|
|
|
vAlign := CenterAlign
|
|
|
|
hAlign := CenterAlign
|
|
|
|
arrow := 0
|
|
|
|
arrowAlign := CenterAlign
|
|
|
|
arrowSize := AutoSize()
|
|
|
|
arrowOff := AutoSize()
|
|
|
|
buttons := []PopupButton{}
|
|
|
|
titleStyle := "ruiPopupTitle"
|
|
|
|
var title View = nil
|
2021-11-17 12:32:37 +03:00
|
|
|
|
2022-07-31 15:37:26 +03:00
|
|
|
for tag, value := range popupParams {
|
|
|
|
if value != nil {
|
|
|
|
switch tag {
|
|
|
|
case CloseButton:
|
|
|
|
closeButton, _ = boolProperty(popupParams, CloseButton, session)
|
2021-11-17 12:32:37 +03:00
|
|
|
|
2022-07-31 15:37:26 +03:00
|
|
|
case OutsideClose:
|
|
|
|
outsideClose, _ = boolProperty(popupParams, OutsideClose, session)
|
|
|
|
|
|
|
|
case VerticalAlign:
|
|
|
|
vAlign, _ = enumProperty(popupParams, VerticalAlign, session, CenterAlign)
|
|
|
|
|
|
|
|
case HorizontalAlign:
|
|
|
|
hAlign, _ = enumProperty(popupParams, HorizontalAlign, session, CenterAlign)
|
|
|
|
|
|
|
|
case Buttons:
|
|
|
|
switch value := value.(type) {
|
|
|
|
case PopupButton:
|
|
|
|
buttons = []PopupButton{value}
|
2021-11-17 12:32:37 +03:00
|
|
|
|
2022-07-31 15:37:26 +03:00
|
|
|
case []PopupButton:
|
|
|
|
buttons = value
|
2021-11-17 12:32:37 +03:00
|
|
|
}
|
|
|
|
|
2022-07-31 15:37:26 +03:00
|
|
|
case Title:
|
|
|
|
switch value := value.(type) {
|
|
|
|
case string:
|
|
|
|
title = NewTextView(view.Session(), Params{Text: value})
|
|
|
|
|
|
|
|
case View:
|
|
|
|
title = value
|
|
|
|
|
|
|
|
default:
|
|
|
|
notCompatibleType(Title, value)
|
2021-11-17 12:32:37 +03:00
|
|
|
}
|
|
|
|
|
2022-07-31 15:37:26 +03:00
|
|
|
case TitleStyle:
|
|
|
|
switch value := value.(type) {
|
|
|
|
case string:
|
|
|
|
titleStyle = value
|
2021-09-07 17:36:50 +03:00
|
|
|
|
2022-07-31 15:37:26 +03:00
|
|
|
default:
|
|
|
|
notCompatibleType(TitleStyle, value)
|
|
|
|
}
|
2021-09-07 17:36:50 +03:00
|
|
|
|
2022-07-31 15:37:26 +03:00
|
|
|
case DismissEvent:
|
|
|
|
if listeners, ok := valueToNoParamListeners[Popup](value); ok {
|
|
|
|
if listeners != nil {
|
|
|
|
popup.dismissListener = listeners
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
notCompatibleType(tag, value)
|
|
|
|
}
|
2021-09-07 17:36:50 +03:00
|
|
|
|
2022-07-31 15:37:26 +03:00
|
|
|
case Arrow:
|
|
|
|
arrow, _ = enumProperty(popupParams, Arrow, session, NoneArrow)
|
2021-09-07 17:36:50 +03:00
|
|
|
|
2022-07-31 15:37:26 +03:00
|
|
|
case ArrowAlign:
|
|
|
|
switch text := value.(type) {
|
|
|
|
case string:
|
|
|
|
switch text {
|
|
|
|
case "top":
|
|
|
|
value = "left"
|
2021-09-07 17:36:50 +03:00
|
|
|
|
2022-07-31 15:37:26 +03:00
|
|
|
case "bottom":
|
|
|
|
value = "right"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
arrowAlign, _ = enumProperty(popupParams, ArrowAlign, session, CenterAlign)
|
2021-09-07 17:36:50 +03:00
|
|
|
|
2022-07-31 15:37:26 +03:00
|
|
|
case ArrowSize:
|
|
|
|
arrowSize, _ = sizeProperty(popupParams, ArrowSize, session)
|
2021-09-07 17:36:50 +03:00
|
|
|
|
2022-07-31 15:37:26 +03:00
|
|
|
case ArrowOffset:
|
|
|
|
arrowOff, _ = sizeProperty(popupParams, ArrowOffset, session)
|
2021-09-07 17:36:50 +03:00
|
|
|
|
|
|
|
default:
|
2022-07-31 15:37:26 +03:00
|
|
|
params[tag] = value
|
2021-09-07 17:36:50 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-07-31 15:37:26 +03:00
|
|
|
popupView := NewGridLayout(view.Session(), params)
|
|
|
|
|
2021-09-07 17:36:50 +03:00
|
|
|
var cellHeight []SizeUnit
|
|
|
|
viewRow := 0
|
|
|
|
if title != nil || closeButton {
|
|
|
|
viewRow = 1
|
|
|
|
titleView := NewGridLayout(session, Params{
|
|
|
|
Row: 0,
|
|
|
|
Style: titleStyle,
|
2022-07-27 20:31:57 +03:00
|
|
|
CellWidth: []any{Fr(1), "@ruiPopupTitleHeight"},
|
2021-09-07 17:36:50 +03:00
|
|
|
CellVerticalAlign: CenterAlign,
|
|
|
|
PaddingLeft: Px(12),
|
|
|
|
})
|
|
|
|
if title != nil {
|
|
|
|
titleView.Append(title)
|
|
|
|
}
|
|
|
|
if closeButton {
|
|
|
|
titleView.Append(NewGridLayout(session, Params{
|
|
|
|
Column: 1,
|
2022-07-27 20:31:57 +03:00
|
|
|
Height: "@ruiPopupTitleHeight",
|
|
|
|
Width: "@ruiPopupTitleHeight",
|
2021-09-07 17:36:50 +03:00
|
|
|
CellHorizontalAlign: CenterAlign,
|
|
|
|
CellVerticalAlign: CenterAlign,
|
|
|
|
TextSize: Px(20),
|
|
|
|
Content: "✕",
|
2022-07-26 18:24:04 +03:00
|
|
|
NotTranslate: true,
|
2021-09-07 17:36:50 +03:00
|
|
|
ClickEvent: func(View) {
|
|
|
|
popup.Dismiss()
|
|
|
|
},
|
|
|
|
}))
|
|
|
|
}
|
|
|
|
|
|
|
|
popupView.Append(titleView)
|
|
|
|
cellHeight = []SizeUnit{AutoSize(), Fr(1)}
|
|
|
|
} else {
|
|
|
|
cellHeight = []SizeUnit{Fr(1)}
|
|
|
|
}
|
|
|
|
|
|
|
|
view.Set(Row, viewRow)
|
|
|
|
popupView.Append(view)
|
|
|
|
|
|
|
|
if buttonCount := len(buttons); buttonCount > 0 {
|
2022-07-08 13:16:42 +03:00
|
|
|
buttonsAlign, _ := enumProperty(params, ButtonsAlign, session, RightAlign)
|
2021-09-07 17:36:50 +03:00
|
|
|
cellHeight = append(cellHeight, AutoSize())
|
2021-11-17 12:32:37 +03:00
|
|
|
gap, _ := sizeConstant(session, "ruiPopupButtonGap")
|
2021-09-07 17:36:50 +03:00
|
|
|
cellWidth := []SizeUnit{}
|
|
|
|
for i := 0; i < buttonCount; i++ {
|
|
|
|
cellWidth = append(cellWidth, Fr(1))
|
|
|
|
}
|
|
|
|
|
|
|
|
buttonsPanel := NewGridLayout(session, Params{
|
|
|
|
CellWidth: cellWidth,
|
|
|
|
})
|
|
|
|
if gap.Type != Auto && gap.Value > 0 {
|
|
|
|
buttonsPanel.Set(Gap, gap)
|
|
|
|
buttonsPanel.Set(Margin, gap)
|
|
|
|
}
|
|
|
|
|
|
|
|
createButton := func(n int, button PopupButton) Button {
|
|
|
|
return NewButton(session, Params{
|
|
|
|
Column: n,
|
|
|
|
Content: button.Title,
|
|
|
|
ClickEvent: func() {
|
|
|
|
if button.OnClick != nil {
|
|
|
|
button.OnClick(popup)
|
|
|
|
} else {
|
|
|
|
popup.Dismiss()
|
|
|
|
}
|
|
|
|
},
|
|
|
|
})
|
|
|
|
}
|
|
|
|
for i, button := range buttons {
|
|
|
|
buttonsPanel.Append(createButton(i, button))
|
|
|
|
}
|
|
|
|
|
|
|
|
popupView.Append(NewGridLayout(session, Params{
|
|
|
|
Row: viewRow + 1,
|
|
|
|
CellHorizontalAlign: buttonsAlign,
|
|
|
|
Content: buttonsPanel,
|
|
|
|
}))
|
|
|
|
}
|
|
|
|
popupView.Set(CellHeight, cellHeight)
|
|
|
|
|
|
|
|
popup.layerView = NewGridLayout(session, Params{
|
|
|
|
Style: "ruiPopupLayer",
|
|
|
|
CellVerticalAlign: vAlign,
|
|
|
|
CellHorizontalAlign: hAlign,
|
|
|
|
MaxWidth: Percent(100),
|
|
|
|
MaxHeight: Percent(100),
|
2022-07-31 15:37:26 +03:00
|
|
|
Filter: NewViewFilter(Params{
|
|
|
|
DropShadow: NewShadowWithParams(Params{
|
|
|
|
SpreadRadius: Px(4),
|
|
|
|
Blur: Px(16),
|
|
|
|
ColorTag: "@ruiPopupShadow",
|
|
|
|
}),
|
|
|
|
}),
|
|
|
|
Content: NewColumnLayout(session, Params{
|
|
|
|
Content: popup.createArrow(arrow, arrowAlign, arrowSize, arrowOff, popupView),
|
|
|
|
}),
|
2021-09-07 17:36:50 +03:00
|
|
|
})
|
|
|
|
|
|
|
|
if outsideClose {
|
|
|
|
popup.layerView.Set(ClickEvent, func(View) {
|
|
|
|
popup.Dismiss()
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-07-31 15:37:26 +03:00
|
|
|
func (popup popupData) createArrow(arrow int, align int, size SizeUnit, off SizeUnit, popupView View) View {
|
|
|
|
if arrow == NoneArrow {
|
|
|
|
return popupView
|
|
|
|
}
|
|
|
|
|
|
|
|
session := popupView.Session()
|
|
|
|
|
|
|
|
if size.Type == Auto {
|
|
|
|
size = Px(16)
|
|
|
|
if value, ok := session.Constant("ruiArrowSize"); ok {
|
|
|
|
size, _ = StringToSizeUnit(value)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
color := GetBackgroundColor(popupView, "")
|
|
|
|
border := NewBorder(Params{
|
|
|
|
Style: SolidLine,
|
|
|
|
ColorTag: color,
|
|
|
|
Width: size,
|
|
|
|
})
|
|
|
|
border2 := NewBorder(Params{
|
|
|
|
Style: SolidLine,
|
|
|
|
ColorTag: 1,
|
|
|
|
Width: SizeUnit{Type: size.Type, Value: size.Value / 2},
|
|
|
|
})
|
|
|
|
|
|
|
|
popupParams := Params{
|
|
|
|
MaxWidth: Percent(100),
|
|
|
|
MaxHeight: Percent(100),
|
2022-08-02 12:21:53 +03:00
|
|
|
Row: 1,
|
|
|
|
Column: 1,
|
2022-07-31 15:37:26 +03:00
|
|
|
Content: popupView,
|
|
|
|
}
|
2022-08-02 12:21:53 +03:00
|
|
|
|
2022-07-31 15:37:26 +03:00
|
|
|
arrowParams := Params{
|
|
|
|
Width: size,
|
|
|
|
Height: size,
|
|
|
|
}
|
|
|
|
containerParams := Params{
|
2022-08-02 12:21:53 +03:00
|
|
|
MaxWidth: Percent(100),
|
|
|
|
MaxHeight: Percent(100),
|
|
|
|
CellWidth: []SizeUnit{AutoSize(), Fr(1), AutoSize()},
|
|
|
|
CellHeight: []SizeUnit{AutoSize(), Fr(1), AutoSize()},
|
2022-07-31 15:37:26 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
switch arrow {
|
|
|
|
case TopArrow:
|
2022-08-02 12:21:53 +03:00
|
|
|
arrowParams[Column] = 1
|
2022-07-31 15:37:26 +03:00
|
|
|
arrowParams[BorderBottom] = border
|
|
|
|
arrowParams[BorderLeft] = border2
|
|
|
|
arrowParams[BorderRight] = border2
|
|
|
|
|
|
|
|
case RightArrow:
|
2022-08-02 12:21:53 +03:00
|
|
|
arrowParams[Column] = 2
|
|
|
|
arrowParams[Row] = 1
|
2022-07-31 15:37:26 +03:00
|
|
|
arrowParams[BorderLeft] = border
|
|
|
|
arrowParams[BorderTop] = border2
|
|
|
|
arrowParams[BorderBottom] = border2
|
|
|
|
|
|
|
|
case BottomArrow:
|
2022-08-02 12:21:53 +03:00
|
|
|
arrowParams[Column] = 1
|
|
|
|
arrowParams[Row] = 2
|
2022-07-31 15:37:26 +03:00
|
|
|
arrowParams[BorderTop] = border
|
|
|
|
arrowParams[BorderLeft] = border2
|
|
|
|
arrowParams[BorderRight] = border2
|
|
|
|
|
|
|
|
case LeftArrow:
|
2022-08-02 12:21:53 +03:00
|
|
|
arrowParams[Row] = 1
|
2022-07-31 15:37:26 +03:00
|
|
|
arrowParams[BorderRight] = border
|
|
|
|
arrowParams[BorderTop] = border2
|
|
|
|
arrowParams[BorderBottom] = border2
|
|
|
|
|
|
|
|
default:
|
|
|
|
return popupView
|
|
|
|
}
|
|
|
|
|
|
|
|
switch align {
|
|
|
|
case LeftAlign:
|
|
|
|
switch arrow {
|
|
|
|
case TopArrow:
|
|
|
|
if off.Type == Auto {
|
|
|
|
off = GetRadius(popupView, "").TopLeftX
|
|
|
|
}
|
|
|
|
if off.Type != Auto {
|
|
|
|
arrowParams[MarginLeft] = off
|
|
|
|
}
|
|
|
|
|
|
|
|
case RightArrow:
|
|
|
|
if off.Type == Auto {
|
|
|
|
off = GetRadius(popupView, "").TopRightY
|
|
|
|
}
|
|
|
|
if off.Type != Auto {
|
|
|
|
arrowParams[MarginTop] = off
|
|
|
|
}
|
|
|
|
|
|
|
|
case BottomArrow:
|
|
|
|
if off.Type == Auto {
|
|
|
|
off = GetRadius(popupView, "").BottomLeftX
|
|
|
|
}
|
|
|
|
if off.Type != Auto {
|
|
|
|
arrowParams[MarginLeft] = off
|
|
|
|
}
|
|
|
|
|
|
|
|
case LeftArrow:
|
|
|
|
if off.Type == Auto {
|
|
|
|
off = GetRadius(popupView, "").TopLeftY
|
|
|
|
}
|
|
|
|
if off.Type != Auto {
|
|
|
|
arrowParams[MarginTop] = off
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
case RightAlign:
|
|
|
|
switch arrow {
|
|
|
|
case TopArrow:
|
|
|
|
if off.Type == Auto {
|
|
|
|
off = GetRadius(popupView, "").TopRightX
|
|
|
|
}
|
|
|
|
if off.Type != Auto {
|
|
|
|
arrowParams[MarginRight] = off
|
|
|
|
}
|
|
|
|
|
|
|
|
case RightArrow:
|
|
|
|
if off.Type == Auto {
|
|
|
|
off = GetRadius(popupView, "").BottomRightY
|
|
|
|
}
|
|
|
|
if off.Type != Auto {
|
|
|
|
arrowParams[MarginBottom] = off
|
|
|
|
}
|
|
|
|
|
|
|
|
case BottomArrow:
|
|
|
|
if off.Type == Auto {
|
|
|
|
off = GetRadius(popupView, "").BottomRightX
|
|
|
|
}
|
|
|
|
if off.Type != Auto {
|
|
|
|
arrowParams[MarginRight] = off
|
|
|
|
}
|
|
|
|
|
|
|
|
case LeftArrow:
|
|
|
|
if off.Type == Auto {
|
|
|
|
off = GetRadius(popupView, "").BottomLeftY
|
|
|
|
}
|
|
|
|
if off.Type != Auto {
|
|
|
|
arrowParams[MarginBottom] = off
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
default:
|
|
|
|
align = CenterAlign
|
|
|
|
if off.Type != Auto {
|
|
|
|
switch arrow {
|
|
|
|
case TopArrow, BottomArrow:
|
|
|
|
if off.Value < 0 {
|
|
|
|
off.Value = -off.Value
|
|
|
|
arrowParams[MarginRight] = off
|
|
|
|
} else {
|
|
|
|
arrowParams[MarginLeft] = off
|
|
|
|
}
|
|
|
|
|
|
|
|
case RightArrow, LeftArrow:
|
|
|
|
if off.Value < 0 {
|
|
|
|
off.Value = -off.Value
|
|
|
|
arrowParams[MarginBottom] = off
|
|
|
|
} else {
|
|
|
|
arrowParams[MarginTop] = off
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if margin := popupView.Get(Margin); margin != nil {
|
|
|
|
popupView.Remove(Margin)
|
|
|
|
containerParams[Padding] = margin
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
for key, value := range popupParams {
|
|
|
|
if key != Content {
|
|
|
|
popupView.Set(key, value)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
*/
|
|
|
|
|
|
|
|
containerParams[CellVerticalAlign] = align
|
|
|
|
containerParams[CellHorizontalAlign] = align
|
|
|
|
containerParams[Content] = []View{
|
|
|
|
NewView(session, arrowParams),
|
|
|
|
//popupView,
|
|
|
|
NewColumnLayout(session, popupParams),
|
|
|
|
}
|
|
|
|
|
|
|
|
return NewGridLayout(session, containerParams)
|
|
|
|
}
|
|
|
|
|
2021-09-07 17:36:50 +03:00
|
|
|
func (popup popupData) View() View {
|
|
|
|
return popup.view
|
|
|
|
}
|
|
|
|
|
|
|
|
func (popup *popupData) Session() Session {
|
|
|
|
return popup.view.Session()
|
|
|
|
}
|
|
|
|
|
|
|
|
func (popup *popupData) Dismiss() {
|
|
|
|
popup.Session().popupManager().dismissPopup(popup)
|
2021-11-17 12:32:37 +03:00
|
|
|
for _, listener := range popup.dismissListener {
|
|
|
|
listener(popup)
|
|
|
|
}
|
2021-09-07 17:36:50 +03:00
|
|
|
// TODO
|
|
|
|
}
|
|
|
|
|
|
|
|
func (popup *popupData) Show() {
|
|
|
|
popup.Session().popupManager().showPopup(popup)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (popup *popupData) html(buffer *strings.Builder) {
|
|
|
|
|
|
|
|
viewHTML(popup.layerView, buffer)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (popup *popupData) viewByHTMLID(id string) View {
|
|
|
|
return viewByHTMLID(id, popup.layerView)
|
|
|
|
}
|
|
|
|
|
2022-07-08 13:16:42 +03:00
|
|
|
func (popup *popupData) onDismiss() {
|
|
|
|
for _, listener := range popup.dismissListener {
|
|
|
|
listener(popup)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-09-07 17:36:50 +03:00
|
|
|
// NewPopup creates a new Popup
|
|
|
|
func NewPopup(view View, param Params) Popup {
|
|
|
|
if view == nil {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
popup := new(popupData)
|
|
|
|
popup.init(view, param)
|
|
|
|
return popup
|
|
|
|
}
|
|
|
|
|
2022-07-08 13:16:42 +03:00
|
|
|
// ShowPopup creates a new Popup and shows it
|
|
|
|
func ShowPopup(view View, param Params) Popup {
|
|
|
|
popup := NewPopup(view, param)
|
|
|
|
if popup != nil {
|
|
|
|
popup.Show()
|
|
|
|
}
|
|
|
|
return popup
|
|
|
|
}
|
|
|
|
|
2021-09-07 17:36:50 +03:00
|
|
|
func (manager *popupManager) updatePopupLayerInnerHTML(session Session) {
|
|
|
|
if manager.popups == nil {
|
|
|
|
manager.popups = []Popup{}
|
|
|
|
session.runScript(`updateInnerHTML('ruiPopupLayer', '');`)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
buffer := allocStringBuilder()
|
|
|
|
defer freeStringBuilder(buffer)
|
|
|
|
|
|
|
|
buffer.WriteString(`updateInnerHTML('ruiPopupLayer', '`)
|
|
|
|
for _, p := range manager.popups {
|
|
|
|
p.html(buffer)
|
|
|
|
}
|
|
|
|
buffer.WriteString(`');`)
|
|
|
|
session.runScript(buffer.String())
|
|
|
|
}
|
|
|
|
|
|
|
|
func (manager *popupManager) showPopup(popup Popup) {
|
|
|
|
if popup == nil {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
session := popup.Session()
|
|
|
|
if manager.popups == nil || len(manager.popups) == 0 {
|
|
|
|
manager.popups = []Popup{popup}
|
|
|
|
} else {
|
|
|
|
manager.popups = append(manager.popups, popup)
|
|
|
|
}
|
2021-11-21 18:30:46 +03:00
|
|
|
|
|
|
|
session.runScript(`if (document.activeElement != document.body) document.activeElement.blur();`)
|
2021-09-07 17:36:50 +03:00
|
|
|
manager.updatePopupLayerInnerHTML(session)
|
|
|
|
updateCSSProperty("ruiPopupLayer", "visibility", "visible", session)
|
2022-07-09 13:45:10 +03:00
|
|
|
updateCSSProperty("ruiRoot", "pointer-events", "none", session)
|
2021-09-07 17:36:50 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
func (manager *popupManager) dismissPopup(popup Popup) {
|
|
|
|
if manager.popups == nil {
|
|
|
|
manager.popups = []Popup{}
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
count := len(manager.popups)
|
|
|
|
if count <= 0 || popup == nil {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
session := popup.Session()
|
|
|
|
if manager.popups[count-1] == popup {
|
|
|
|
if count == 1 {
|
|
|
|
manager.popups = []Popup{}
|
2022-07-09 13:45:10 +03:00
|
|
|
updateCSSProperty("ruiRoot", "pointer-events", "auto", session)
|
2021-09-07 17:36:50 +03:00
|
|
|
updateCSSProperty("ruiPopupLayer", "visibility", "hidden", session)
|
|
|
|
session.runScript(`updateInnerHTML('ruiPopupLayer', '');`)
|
|
|
|
} else {
|
|
|
|
manager.popups = manager.popups[:count-1]
|
|
|
|
manager.updatePopupLayerInnerHTML(session)
|
|
|
|
}
|
2022-07-08 13:16:42 +03:00
|
|
|
popup.onDismiss()
|
2021-09-07 17:36:50 +03:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
for n, p := range manager.popups {
|
|
|
|
if p == popup {
|
|
|
|
if n == 0 {
|
|
|
|
manager.popups = manager.popups[1:]
|
|
|
|
} else {
|
|
|
|
manager.popups = append(manager.popups[:n], manager.popups[n+1:]...)
|
|
|
|
}
|
|
|
|
manager.updatePopupLayerInnerHTML(session)
|
2022-07-08 13:16:42 +03:00
|
|
|
popup.onDismiss()
|
2021-09-07 17:36:50 +03:00
|
|
|
return
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|