mirror of https://github.com/anoshenko/rui.git
				
				
				
			Optimisation
This commit is contained in:
		
							parent
							
								
									76413c931a
								
							
						
					
					
						commit
						f8d797a4c1
					
				|  | @ -624,8 +624,8 @@ func (view *viewData) SetAnimated(tag string, value any, animation Animation) bo | |||
| 	htmlID := view.htmlID() | ||||
| 	session.startUpdateScript(htmlID) | ||||
| 
 | ||||
| 	updateProperty(htmlID, "ontransitionend", "transitionEndEvent(this, event)", view.session) | ||||
| 	updateProperty(htmlID, "ontransitioncancel", "transitionCancelEvent(this, event)", view.session) | ||||
| 	session.updateProperty(htmlID, "ontransitionend", "transitionEndEvent(this, event)") | ||||
| 	session.updateProperty(htmlID, "ontransitioncancel", "transitionCancelEvent(this, event)") | ||||
| 
 | ||||
| 	if prevAnimation, ok := view.transitions[tag]; ok { | ||||
| 		view.singleTransition[tag] = prevAnimation | ||||
|  | @ -701,7 +701,7 @@ func (style *viewStyle) transitionCSS(session Session) string { | |||
| } | ||||
| 
 | ||||
| func (view *viewData) updateTransitionCSS() { | ||||
| 	updateCSSProperty(view.htmlID(), "transition", view.transitionCSS(view.Session()), view.Session()) | ||||
| 	view.session.updateCSSProperty(view.htmlID(), "transition", view.transitionCSS(view.session)) | ||||
| } | ||||
| 
 | ||||
| func (style *viewStyle) Transition(tag string) Animation { | ||||
|  | @ -732,7 +732,7 @@ func (style *viewStyle) SetTransition(tag string, animation Animation) { | |||
| func (view *viewData) SetTransition(tag string, animation Animation) { | ||||
| 	view.viewStyle.SetTransition(tag, animation) | ||||
| 	if view.created { | ||||
| 		updateCSSProperty(view.htmlID(), "transition", view.transitionCSS(view.Session()), view.Session()) | ||||
| 		view.session.updateCSSProperty(view.htmlID(), "transition", view.transitionCSS(view.session)) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -70,7 +70,7 @@ func (view *viewData) setTransitionListener(tag string, value any) bool { | |||
| 	} else if js, ok := transitionEvents[tag]; ok { | ||||
| 		view.properties[tag] = listeners | ||||
| 		if view.created { | ||||
| 			updateProperty(view.htmlID(), js.jsEvent, js.jsFunc+"(this, event)", view.Session()) | ||||
| 			view.session.updateProperty(view.htmlID(), js.jsEvent, js.jsFunc+"(this, event)") | ||||
| 		} | ||||
| 	} else { | ||||
| 		return false | ||||
|  | @ -82,7 +82,7 @@ func (view *viewData) removeTransitionListener(tag string) { | |||
| 	delete(view.properties, tag) | ||||
| 	if view.created { | ||||
| 		if js, ok := transitionEvents[tag]; ok { | ||||
| 			removeProperty(view.htmlID(), js.jsEvent, view.Session()) | ||||
| 			view.session.removeProperty(view.htmlID(), js.jsEvent) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | @ -136,7 +136,7 @@ func (view *viewData) setAnimationListener(tag string, value any) bool { | |||
| 	} else if js, ok := animationEvents[tag]; ok { | ||||
| 		view.properties[tag] = listeners | ||||
| 		if view.created { | ||||
| 			updateProperty(view.htmlID(), js.jsEvent, js.jsFunc+"(this, event)", view.Session()) | ||||
| 			view.session.updateProperty(view.htmlID(), js.jsEvent, js.jsFunc+"(this, event)") | ||||
| 		} | ||||
| 	} else { | ||||
| 		return false | ||||
|  | @ -148,7 +148,7 @@ func (view *viewData) removeAnimationListener(tag string) { | |||
| 	delete(view.properties, tag) | ||||
| 	if view.created { | ||||
| 		if js, ok := animationEvents[tag]; ok { | ||||
| 			removeProperty(view.htmlID(), js.jsEvent, view.Session()) | ||||
| 			view.session.removeProperty(view.htmlID(), js.jsEvent) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  |  | |||
							
								
								
									
										10
									
								
								checkbox.go
								
								
								
								
							
							
						
						
									
										10
									
								
								checkbox.go
								
								
								
								
							|  | @ -98,7 +98,7 @@ func (button *checkboxData) set(tag string, value any) bool { | |||
| 			return false | ||||
| 		} | ||||
| 		if button.created { | ||||
| 			updateCSSProperty(button.htmlID()+"content", "align-items", button.cssVerticalAlign(), button.session) | ||||
| 			button.session.updateCSSProperty(button.htmlID()+"content", "align-items", button.cssVerticalAlign()) | ||||
| 		} | ||||
| 
 | ||||
| 	case HorizontalAlign: | ||||
|  | @ -106,7 +106,7 @@ func (button *checkboxData) set(tag string, value any) bool { | |||
| 			return false | ||||
| 		} | ||||
| 		if button.created { | ||||
| 			updateCSSProperty(button.htmlID()+"content", "justify-items", button.cssHorizontalAlign(), button.session) | ||||
| 			button.session.updateCSSProperty(button.htmlID()+"content", "justify-items", button.cssHorizontalAlign()) | ||||
| 		} | ||||
| 
 | ||||
| 	case CellVerticalAlign, CellHorizontalAlign, CellWidth, CellHeight: | ||||
|  | @ -159,13 +159,13 @@ func (button *checkboxData) remove(tag string) { | |||
| 	case VerticalAlign: | ||||
| 		delete(button.properties, tag) | ||||
| 		if button.created { | ||||
| 			updateCSSProperty(button.htmlID()+"content", "align-items", button.cssVerticalAlign(), button.session) | ||||
| 			button.session.updateCSSProperty(button.htmlID()+"content", "align-items", button.cssVerticalAlign()) | ||||
| 		} | ||||
| 
 | ||||
| 	case HorizontalAlign: | ||||
| 		delete(button.properties, tag) | ||||
| 		if button.created { | ||||
| 			updateCSSProperty(button.htmlID()+"content", "justify-items", button.cssHorizontalAlign(), button.session) | ||||
| 			button.session.updateCSSProperty(button.htmlID()+"content", "justify-items", button.cssHorizontalAlign()) | ||||
| 		} | ||||
| 
 | ||||
| 	default: | ||||
|  | @ -189,7 +189,7 @@ func (button *checkboxData) changedCheckboxState(state bool) { | |||
| 	defer freeStringBuilder(buffer) | ||||
| 
 | ||||
| 	button.htmlCheckbox(buffer, state) | ||||
| 	button.Session().runFunc("updateInnerHTML", button.htmlID()+"checkbox", buffer.String()) | ||||
| 	button.Session().updateInnerHTML(button.htmlID()+"checkbox", buffer.String()) | ||||
| } | ||||
| 
 | ||||
| func checkboxClickListener(view View) { | ||||
|  |  | |||
|  | @ -89,10 +89,10 @@ func (columnLayout *columnLayoutData) remove(tag string) { | |||
| 	if columnLayout.created { | ||||
| 		switch tag { | ||||
| 		case ColumnCount, ColumnWidth, ColumnGap: | ||||
| 			updateCSSProperty(columnLayout.htmlID(), tag, "", columnLayout.Session()) | ||||
| 			columnLayout.session.updateCSSProperty(columnLayout.htmlID(), tag, "") | ||||
| 
 | ||||
| 		case ColumnSeparator: | ||||
| 			updateCSSProperty(columnLayout.htmlID(), "column-rule", "", columnLayout.Session()) | ||||
| 			columnLayout.session.updateCSSProperty(columnLayout.htmlID(), "column-rule", "") | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | @ -120,14 +120,14 @@ func (columnLayout *columnLayoutData) set(tag string, value any) bool { | |||
| 				separator := val.(ColumnSeparatorProperty) | ||||
| 				css = separator.cssValue(columnLayout.Session()) | ||||
| 			} | ||||
| 			updateCSSProperty(columnLayout.htmlID(), "column-rule", css, session) | ||||
| 			session.updateCSSProperty(columnLayout.htmlID(), "column-rule", css) | ||||
| 
 | ||||
| 		case ColumnCount: | ||||
| 			session := columnLayout.Session() | ||||
| 			if count, ok := intProperty(columnLayout, tag, session, 0); ok && count > 0 { | ||||
| 				updateCSSProperty(columnLayout.htmlID(), tag, strconv.Itoa(count), session) | ||||
| 				session.updateCSSProperty(columnLayout.htmlID(), tag, strconv.Itoa(count)) | ||||
| 			} else { | ||||
| 				updateCSSProperty(columnLayout.htmlID(), tag, "auto", session) | ||||
| 				session.updateCSSProperty(columnLayout.htmlID(), tag, "auto") | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  |  | |||
|  | @ -77,19 +77,19 @@ func (picker *datePickerData) remove(tag string) { | |||
| 	case DatePickerMin: | ||||
| 		delete(picker.properties, DatePickerMin) | ||||
| 		if picker.created { | ||||
| 			removeProperty(picker.htmlID(), Min, picker.session) | ||||
| 			picker.session.removeProperty(picker.htmlID(), Min) | ||||
| 		} | ||||
| 
 | ||||
| 	case DatePickerMax: | ||||
| 		delete(picker.properties, DatePickerMax) | ||||
| 		if picker.created { | ||||
| 			removeProperty(picker.htmlID(), Max, picker.session) | ||||
| 			picker.session.removeProperty(picker.htmlID(), Max) | ||||
| 		} | ||||
| 
 | ||||
| 	case DatePickerStep: | ||||
| 		delete(picker.properties, DatePickerStep) | ||||
| 		if picker.created { | ||||
| 			removeProperty(picker.htmlID(), Step, picker.session) | ||||
| 			picker.session.removeProperty(picker.htmlID(), Step) | ||||
| 		} | ||||
| 
 | ||||
| 	case DatePickerValue: | ||||
|  | @ -183,7 +183,7 @@ func (picker *datePickerData) set(tag string, value any) bool { | |||
| 		if date, ok := setTimeValue(DatePickerMin); ok { | ||||
| 			if !oldOK || date != old { | ||||
| 				if picker.created { | ||||
| 					updateProperty(picker.htmlID(), Min, date.Format(dateFormat), picker.session) | ||||
| 					picker.session.updateProperty(picker.htmlID(), Min, date.Format(dateFormat)) | ||||
| 				} | ||||
| 				picker.propertyChangedEvent(tag) | ||||
| 			} | ||||
|  | @ -195,7 +195,7 @@ func (picker *datePickerData) set(tag string, value any) bool { | |||
| 		if date, ok := setTimeValue(DatePickerMax); ok { | ||||
| 			if !oldOK || date != old { | ||||
| 				if picker.created { | ||||
| 					updateProperty(picker.htmlID(), Max, date.Format(dateFormat), picker.session) | ||||
| 					picker.session.updateProperty(picker.htmlID(), Max, date.Format(dateFormat)) | ||||
| 				} | ||||
| 				picker.propertyChangedEvent(tag) | ||||
| 			} | ||||
|  | @ -208,9 +208,9 @@ func (picker *datePickerData) set(tag string, value any) bool { | |||
| 			if step := GetDatePickerStep(picker); oldStep != step { | ||||
| 				if picker.created { | ||||
| 					if step > 0 { | ||||
| 						updateProperty(picker.htmlID(), Step, strconv.Itoa(step), picker.session) | ||||
| 						picker.session.updateProperty(picker.htmlID(), Step, strconv.Itoa(step)) | ||||
| 					} else { | ||||
| 						removeProperty(picker.htmlID(), Step, picker.session) | ||||
| 						picker.session.removeProperty(picker.htmlID(), Step) | ||||
| 					} | ||||
| 				} | ||||
| 				picker.propertyChangedEvent(tag) | ||||
|  |  | |||
|  | @ -63,7 +63,7 @@ func (detailsView *detailsViewData) remove(tag string) { | |||
| 			updateInnerHTML(detailsView.htmlID(), detailsView.Session()) | ||||
| 
 | ||||
| 		case Expanded: | ||||
| 			removeProperty(detailsView.htmlID(), "open", detailsView.Session()) | ||||
| 			detailsView.session.removeProperty(detailsView.htmlID(), "open") | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | @ -111,9 +111,9 @@ func (detailsView *detailsViewData) set(tag string, value any) bool { | |||
| 		} | ||||
| 		if detailsView.created { | ||||
| 			if IsDetailsExpanded(detailsView) { | ||||
| 				updateProperty(detailsView.htmlID(), "open", "", detailsView.Session()) | ||||
| 				detailsView.session.updateProperty(detailsView.htmlID(), "open", "") | ||||
| 			} else { | ||||
| 				removeProperty(detailsView.htmlID(), "open", detailsView.Session()) | ||||
| 				detailsView.session.removeProperty(detailsView.htmlID(), "open") | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
|  |  | |||
							
								
								
									
										34
									
								
								editView.go
								
								
								
								
							
							
						
						
									
										34
									
								
								editView.go
								
								
								
								
							|  | @ -100,7 +100,7 @@ func (edit *editViewData) remove(tag string) { | |||
| 		if exists { | ||||
| 			delete(edit.properties, Hint) | ||||
| 			if edit.created { | ||||
| 				removeProperty(edit.htmlID(), "placeholder", edit.session) | ||||
| 				edit.session.removeProperty(edit.htmlID(), "placeholder") | ||||
| 			} | ||||
| 			edit.propertyChangedEvent(tag) | ||||
| 		} | ||||
|  | @ -109,7 +109,7 @@ func (edit *editViewData) remove(tag string) { | |||
| 		if exists { | ||||
| 			delete(edit.properties, MaxLength) | ||||
| 			if edit.created { | ||||
| 				removeProperty(edit.htmlID(), "maxlength", edit.session) | ||||
| 				edit.session.removeProperty(edit.htmlID(), "maxlength") | ||||
| 			} | ||||
| 			edit.propertyChangedEvent(tag) | ||||
| 		} | ||||
|  | @ -118,7 +118,7 @@ func (edit *editViewData) remove(tag string) { | |||
| 		if exists { | ||||
| 			delete(edit.properties, tag) | ||||
| 			if edit.created { | ||||
| 				updateBoolProperty(edit.htmlID(), tag, false, edit.session) | ||||
| 				edit.session.updateBoolProperty(edit.htmlID(), tag, false) | ||||
| 			} | ||||
| 			edit.propertyChangedEvent(tag) | ||||
| 		} | ||||
|  | @ -147,7 +147,7 @@ func (edit *editViewData) remove(tag string) { | |||
| 			delete(edit.properties, tag) | ||||
| 			if oldText != "" { | ||||
| 				if edit.created { | ||||
| 					removeProperty(edit.htmlID(), Pattern, edit.session) | ||||
| 					edit.session.removeProperty(edit.htmlID(), Pattern) | ||||
| 				} | ||||
| 				edit.propertyChangedEvent(tag) | ||||
| 			} | ||||
|  | @ -173,9 +173,9 @@ func (edit *editViewData) remove(tag string) { | |||
| 				if wrap := IsEditViewWrap(edit); wrap != oldWrap { | ||||
| 					if edit.created { | ||||
| 						if wrap { | ||||
| 							updateProperty(edit.htmlID(), "wrap", "soft", edit.session) | ||||
| 							edit.session.updateProperty(edit.htmlID(), "wrap", "soft") | ||||
| 						} else { | ||||
| 							updateProperty(edit.htmlID(), "wrap", "off", edit.session) | ||||
| 							edit.session.updateProperty(edit.htmlID(), "wrap", "off") | ||||
| 						} | ||||
| 					} | ||||
| 					edit.propertyChangedEvent(tag) | ||||
|  | @ -225,9 +225,9 @@ func (edit *editViewData) set(tag string, value any) bool { | |||
| 			if text = GetHint(edit); oldText != text { | ||||
| 				if edit.created { | ||||
| 					if text != "" { | ||||
| 						updateProperty(edit.htmlID(), "placeholder", text, edit.session) | ||||
| 						edit.session.updateProperty(edit.htmlID(), "placeholder", text) | ||||
| 					} else { | ||||
| 						removeProperty(edit.htmlID(), "placeholder", edit.session) | ||||
| 						edit.session.removeProperty(edit.htmlID(), "placeholder") | ||||
| 					} | ||||
| 				} | ||||
| 				edit.propertyChangedEvent(tag) | ||||
|  | @ -242,9 +242,9 @@ func (edit *editViewData) set(tag string, value any) bool { | |||
| 			if maxLength := GetMaxLength(edit); maxLength != oldMaxLength { | ||||
| 				if edit.created { | ||||
| 					if maxLength > 0 { | ||||
| 						updateProperty(edit.htmlID(), "maxlength", strconv.Itoa(maxLength), edit.session) | ||||
| 						edit.session.updateProperty(edit.htmlID(), "maxlength", strconv.Itoa(maxLength)) | ||||
| 					} else { | ||||
| 						removeProperty(edit.htmlID(), "maxlength", edit.session) | ||||
| 						edit.session.removeProperty(edit.htmlID(), "maxlength") | ||||
| 					} | ||||
| 				} | ||||
| 				edit.propertyChangedEvent(tag) | ||||
|  | @ -257,9 +257,9 @@ func (edit *editViewData) set(tag string, value any) bool { | |||
| 		if edit.setBoolProperty(ReadOnly, value) { | ||||
| 			if edit.created { | ||||
| 				if IsReadOnly(edit) { | ||||
| 					updateProperty(edit.htmlID(), ReadOnly, "", edit.session) | ||||
| 					edit.session.updateProperty(edit.htmlID(), ReadOnly, "") | ||||
| 				} else { | ||||
| 					removeProperty(edit.htmlID(), ReadOnly, edit.session) | ||||
| 					edit.session.removeProperty(edit.htmlID(), ReadOnly) | ||||
| 				} | ||||
| 			} | ||||
| 			edit.propertyChangedEvent(tag) | ||||
|  | @ -270,7 +270,7 @@ func (edit *editViewData) set(tag string, value any) bool { | |||
| 	case Spellcheck: | ||||
| 		if edit.setBoolProperty(Spellcheck, value) { | ||||
| 			if edit.created { | ||||
| 				updateBoolProperty(edit.htmlID(), Spellcheck, IsSpellcheck(edit), edit.session) | ||||
| 				edit.session.updateBoolProperty(edit.htmlID(), Spellcheck, IsSpellcheck(edit)) | ||||
| 			} | ||||
| 			edit.propertyChangedEvent(tag) | ||||
| 			return true | ||||
|  | @ -284,9 +284,9 @@ func (edit *editViewData) set(tag string, value any) bool { | |||
| 			if text = GetEditViewPattern(edit); oldText != text { | ||||
| 				if edit.created { | ||||
| 					if text != "" { | ||||
| 						updateProperty(edit.htmlID(), Pattern, text, edit.session) | ||||
| 						edit.session.updateProperty(edit.htmlID(), Pattern, text) | ||||
| 					} else { | ||||
| 						removeProperty(edit.htmlID(), Pattern, edit.session) | ||||
| 						edit.session.removeProperty(edit.htmlID(), Pattern) | ||||
| 					} | ||||
| 				} | ||||
| 				edit.propertyChangedEvent(tag) | ||||
|  | @ -315,9 +315,9 @@ func (edit *editViewData) set(tag string, value any) bool { | |||
| 				if wrap := IsEditViewWrap(edit); wrap != oldWrap { | ||||
| 					if edit.created { | ||||
| 						if wrap { | ||||
| 							updateProperty(edit.htmlID(), "wrap", "soft", edit.session) | ||||
| 							edit.session.updateProperty(edit.htmlID(), "wrap", "soft") | ||||
| 						} else { | ||||
| 							updateProperty(edit.htmlID(), "wrap", "off", edit.session) | ||||
| 							edit.session.updateProperty(edit.htmlID(), "wrap", "off") | ||||
| 						} | ||||
| 					} | ||||
| 					edit.propertyChangedEvent(tag) | ||||
|  |  | |||
|  | @ -129,7 +129,7 @@ func (picker *filePickerData) remove(tag string) { | |||
| 	case Accept: | ||||
| 		delete(picker.properties, tag) | ||||
| 		if picker.created { | ||||
| 			removeProperty(picker.htmlID(), "accept", picker.Session()) | ||||
| 			picker.session.removeProperty(picker.htmlID(), "accept") | ||||
| 		} | ||||
| 		picker.propertyChangedEvent(tag) | ||||
| 
 | ||||
|  | @ -196,9 +196,9 @@ func (picker *filePickerData) set(tag string, value any) bool { | |||
| 
 | ||||
| 		if picker.created { | ||||
| 			if css := picker.acceptCSS(); css != "" { | ||||
| 				updateProperty(picker.htmlID(), "accept", css, picker.Session()) | ||||
| 				picker.session.updateProperty(picker.htmlID(), "accept", css) | ||||
| 			} else { | ||||
| 				removeProperty(picker.htmlID(), "accept", picker.Session()) | ||||
| 				picker.session.removeProperty(picker.htmlID(), "accept") | ||||
| 			} | ||||
| 		} | ||||
| 		picker.propertyChangedEvent(tag) | ||||
|  |  | |||
|  | @ -108,7 +108,7 @@ func (view *viewData) setFocusListener(tag string, value any) bool { | |||
| 	} else if js, ok := focusEvents[tag]; ok { | ||||
| 		view.properties[tag] = listeners | ||||
| 		if view.created { | ||||
| 			updateProperty(view.htmlID(), js.jsEvent, js.jsFunc+"(this, event)", view.Session()) | ||||
| 			view.session.updateProperty(view.htmlID(), js.jsEvent, js.jsFunc+"(this, event)") | ||||
| 		} | ||||
| 	} else { | ||||
| 		return false | ||||
|  | @ -120,7 +120,7 @@ func (view *viewData) removeFocusListener(tag string) { | |||
| 	delete(view.properties, tag) | ||||
| 	if view.created { | ||||
| 		if js, ok := focusEvents[tag]; ok { | ||||
| 			removeProperty(view.htmlID(), js.jsEvent, view.Session()) | ||||
| 			view.session.removeProperty(view.htmlID(), js.jsEvent) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  |  | |||
|  | @ -230,12 +230,12 @@ func (gridLayout *gridLayoutData) remove(tag string) { | |||
| 	if gridLayout.created { | ||||
| 		switch tag { | ||||
| 		case CellWidth: | ||||
| 			updateCSSProperty(gridLayout.htmlID(), `grid-template-columns`, | ||||
| 				gridLayout.gridCellSizesCSS(CellWidth, gridLayout.session), gridLayout.session) | ||||
| 			gridLayout.session.updateCSSProperty(gridLayout.htmlID(), `grid-template-columns`, | ||||
| 				gridLayout.gridCellSizesCSS(CellWidth, gridLayout.session)) | ||||
| 
 | ||||
| 		case CellHeight: | ||||
| 			updateCSSProperty(gridLayout.htmlID(), `grid-template-rows`, | ||||
| 				gridLayout.gridCellSizesCSS(CellHeight, gridLayout.session), gridLayout.session) | ||||
| 			gridLayout.session.updateCSSProperty(gridLayout.htmlID(), `grid-template-rows`, | ||||
| 				gridLayout.gridCellSizesCSS(CellHeight, gridLayout.session)) | ||||
| 
 | ||||
| 		} | ||||
| 	} | ||||
|  | @ -259,12 +259,12 @@ func (gridLayout *gridLayoutData) set(tag string, value any) bool { | |||
| 		if gridLayout.created { | ||||
| 			switch tag { | ||||
| 			case CellWidth: | ||||
| 				updateCSSProperty(gridLayout.htmlID(), `grid-template-columns`, | ||||
| 					gridLayout.gridCellSizesCSS(CellWidth, gridLayout.session), gridLayout.session) | ||||
| 				gridLayout.session.updateCSSProperty(gridLayout.htmlID(), `grid-template-columns`, | ||||
| 					gridLayout.gridCellSizesCSS(CellWidth, gridLayout.session)) | ||||
| 
 | ||||
| 			case CellHeight: | ||||
| 				updateCSSProperty(gridLayout.htmlID(), `grid-template-rows`, | ||||
| 					gridLayout.gridCellSizesCSS(CellHeight, gridLayout.session), gridLayout.session) | ||||
| 				gridLayout.session.updateCSSProperty(gridLayout.htmlID(), `grid-template-rows`, | ||||
| 					gridLayout.gridCellSizesCSS(CellHeight, gridLayout.session)) | ||||
| 
 | ||||
| 			} | ||||
| 		} | ||||
|  |  | |||
							
								
								
									
										10
									
								
								imageView.go
								
								
								
								
							
							
						
						
									
										10
									
								
								imageView.go
								
								
								
								
							|  | @ -102,8 +102,8 @@ func (imageView *imageViewData) remove(tag string) { | |||
| 	if imageView.created { | ||||
| 		switch tag { | ||||
| 		case Source: | ||||
| 			updateProperty(imageView.htmlID(), "src", "", imageView.session) | ||||
| 			removeProperty(imageView.htmlID(), "srcset", imageView.session) | ||||
| 			imageView.session.updateProperty(imageView.htmlID(), "src", "") | ||||
| 			imageView.session.removeProperty(imageView.htmlID(), "srcset") | ||||
| 
 | ||||
| 		case AltText: | ||||
| 			updateInnerHTML(imageView.htmlID(), imageView.session) | ||||
|  | @ -133,11 +133,11 @@ func (imageView *imageViewData) set(tag string, value any) bool { | |||
| 				if src != "" && src[0] == '@' { | ||||
| 					src, _ = imageProperty(imageView, Source, imageView.session) | ||||
| 				} | ||||
| 				updateProperty(imageView.htmlID(), "src", src, imageView.session) | ||||
| 				imageView.session.updateProperty(imageView.htmlID(), "src", src) | ||||
| 				if srcset := imageView.srcSet(src); srcset != "" { | ||||
| 					updateProperty(imageView.htmlID(), "srcset", srcset, imageView.session) | ||||
| 					imageView.session.updateProperty(imageView.htmlID(), "srcset", srcset) | ||||
| 				} else { | ||||
| 					removeProperty(imageView.htmlID(), "srcset", imageView.session) | ||||
| 					imageView.session.removeProperty(imageView.htmlID(), "srcset") | ||||
| 				} | ||||
| 			} | ||||
| 			imageView.propertyChangedEvent(Source) | ||||
|  |  | |||
|  | @ -210,7 +210,7 @@ func (view *viewData) setKeyListener(tag string, value any) bool { | |||
| 	} else if js, ok := keyEvents[tag]; ok { | ||||
| 		view.properties[tag] = listeners | ||||
| 		if view.created { | ||||
| 			updateProperty(view.htmlID(), js.jsEvent, js.jsFunc+"(this, event)", view.Session()) | ||||
| 			view.session.updateProperty(view.htmlID(), js.jsEvent, js.jsFunc+"(this, event)") | ||||
| 		} | ||||
| 	} else { | ||||
| 		return false | ||||
|  | @ -222,7 +222,7 @@ func (view *viewData) removeKeyListener(tag string) { | |||
| 	delete(view.properties, tag) | ||||
| 	if view.created { | ||||
| 		if js, ok := keyEvents[tag]; ok { | ||||
| 			removeProperty(view.htmlID(), js.jsEvent, view.Session()) | ||||
| 			view.session.removeProperty(view.htmlID(), js.jsEvent) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  |  | |||
|  | @ -837,7 +837,7 @@ func (listView *listViewData) updateCheckboxItem(index int, checked bool) { | |||
| 		} | ||||
| 	} | ||||
| 	buffer.WriteString(`</div></div>`) | ||||
| 	session.runFunc("updateInnerHTML", listView.htmlID()+"-"+strconv.Itoa(index), buffer.String()) | ||||
| 	session.updateInnerHTML(listView.htmlID()+"-"+strconv.Itoa(index), buffer.String()) | ||||
| } | ||||
| 
 | ||||
| func (listView *listViewData) htmlProperties(self View, buffer *strings.Builder) { | ||||
|  |  | |||
|  | @ -463,21 +463,21 @@ func (player *mediaPlayerData) propertyChanged(tag string) { | |||
| 	if player.created { | ||||
| 		switch tag { | ||||
| 		case Controls, Loop: | ||||
| 			value, _ := boolProperty(player, tag, player.Session()) | ||||
| 			value, _ := boolProperty(player, tag, player.session) | ||||
| 			if value { | ||||
| 				updateBoolProperty(player.htmlID(), tag, value, player.Session()) | ||||
| 				player.session.updateBoolProperty(player.htmlID(), tag, value) | ||||
| 			} else { | ||||
| 				removeProperty(player.htmlID(), tag, player.Session()) | ||||
| 				player.session.removeProperty(player.htmlID(), tag) | ||||
| 			} | ||||
| 
 | ||||
| 		case Muted: | ||||
| 			value, _ := boolProperty(player, tag, player.Session()) | ||||
| 			player.Session().runFunc("setMediaMuted", player.htmlID(), value) | ||||
| 			value, _ := boolProperty(player, tag, player.session) | ||||
| 			player.session.runFunc("setMediaMuted", player.htmlID(), value) | ||||
| 
 | ||||
| 		case Preload: | ||||
| 			value, _ := enumProperty(player, tag, player.Session(), 0) | ||||
| 			value, _ := enumProperty(player, tag, player.session, 0) | ||||
| 			values := enumProperties[Preload].values | ||||
| 			updateProperty(player.htmlID(), tag, values[value], player.Session()) | ||||
| 			player.session.updateProperty(player.htmlID(), tag, values[value]) | ||||
| 
 | ||||
| 		case AbortEvent, CanPlayEvent, CanPlayThroughEvent, CompleteEvent, EmptiedEvent, | ||||
| 			EndedEvent, LoadedDataEvent, LoadedMetadataEvent, PauseEvent, PlayEvent, PlayingEvent, ProgressEvent, | ||||
|  | @ -490,53 +490,53 @@ func (player *mediaPlayerData) propertyChanged(tag string) { | |||
| 						case []func(MediaPlayer): | ||||
| 							if len(value) > 0 { | ||||
| 								fn := fmt.Sprintf(`playerEvent(this, "%s")`, event.tag) | ||||
| 								updateProperty(player.htmlID(), event.cssTag, fn, player.Session()) | ||||
| 								player.session.updateProperty(player.htmlID(), event.cssTag, fn) | ||||
| 								return | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 					updateProperty(player.htmlID(), tag, "", player.Session()) | ||||
| 					player.session.updateProperty(player.htmlID(), tag, "") | ||||
| 					break | ||||
| 				} | ||||
| 
 | ||||
| 			} | ||||
| 		case TimeUpdateEvent: | ||||
| 			if value := player.getRaw(tag); value != nil { | ||||
| 				updateProperty(player.htmlID(), "ontimeupdate", "playerTimeUpdatedEvent(this)", player.Session()) | ||||
| 				player.session.updateProperty(player.htmlID(), "ontimeupdate", "playerTimeUpdatedEvent(this)") | ||||
| 			} else { | ||||
| 				updateProperty(player.htmlID(), "ontimeupdate", "", player.Session()) | ||||
| 				player.session.updateProperty(player.htmlID(), "ontimeupdate", "") | ||||
| 			} | ||||
| 
 | ||||
| 		case VolumeChangedEvent: | ||||
| 			if value := player.getRaw(tag); value != nil { | ||||
| 				updateProperty(player.htmlID(), "onvolumechange", "playerVolumeChangedEvent(this)", player.Session()) | ||||
| 				player.session.updateProperty(player.htmlID(), "onvolumechange", "playerVolumeChangedEvent(this)") | ||||
| 			} else { | ||||
| 				updateProperty(player.htmlID(), "onvolumechange", "", player.Session()) | ||||
| 				player.session.updateProperty(player.htmlID(), "onvolumechange", "") | ||||
| 			} | ||||
| 
 | ||||
| 		case DurationChangedEvent: | ||||
| 			if value := player.getRaw(tag); value != nil { | ||||
| 				updateProperty(player.htmlID(), "ondurationchange", "playerDurationChangedEvent(this)", player.Session()) | ||||
| 				player.session.updateProperty(player.htmlID(), "ondurationchange", "playerDurationChangedEvent(this)") | ||||
| 			} else { | ||||
| 				updateProperty(player.htmlID(), "ondurationchange", "", player.Session()) | ||||
| 				player.session.updateProperty(player.htmlID(), "ondurationchange", "") | ||||
| 			} | ||||
| 
 | ||||
| 		case RateChangedEvent: | ||||
| 			if value := player.getRaw(tag); value != nil { | ||||
| 				updateProperty(player.htmlID(), "onratechange", "playerRateChangedEvent(this)", player.Session()) | ||||
| 				player.session.updateProperty(player.htmlID(), "onratechange", "playerRateChangedEvent(this)") | ||||
| 			} else { | ||||
| 				updateProperty(player.htmlID(), "onratechange", "", player.Session()) | ||||
| 				player.session.updateProperty(player.htmlID(), "onratechange", "") | ||||
| 			} | ||||
| 
 | ||||
| 		case PlayerErrorEvent: | ||||
| 			if value := player.getRaw(tag); value != nil { | ||||
| 				updateProperty(player.htmlID(), "onerror", "playerErrorEvent(this)", player.Session()) | ||||
| 				player.session.updateProperty(player.htmlID(), "onerror", "playerErrorEvent(this)") | ||||
| 			} else { | ||||
| 				updateProperty(player.htmlID(), "onerror", "", player.Session()) | ||||
| 				player.session.updateProperty(player.htmlID(), "onerror", "") | ||||
| 			} | ||||
| 
 | ||||
| 		case Source: | ||||
| 			updateInnerHTML(player.htmlID(), player.Session()) | ||||
| 			updateInnerHTML(player.htmlID(), player.session) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | @ -544,7 +544,7 @@ func (player *mediaPlayerData) propertyChanged(tag string) { | |||
| func (player *mediaPlayerData) htmlSubviews(self View, buffer *strings.Builder) { | ||||
| 	if value := player.getRaw(Source); value != nil { | ||||
| 		if sources, ok := value.([]MediaSource); ok && len(sources) > 0 { | ||||
| 			session := player.Session() | ||||
| 			session := player.session | ||||
| 			for _, src := range sources { | ||||
| 				if url, ok := session.resolveConstants(src.Url); ok && url != "" { | ||||
| 					buffer.WriteString(`<source src="`) | ||||
|  | @ -565,13 +565,13 @@ func (player *mediaPlayerData) htmlSubviews(self View, buffer *strings.Builder) | |||
| func (player *mediaPlayerData) htmlProperties(self View, buffer *strings.Builder) { | ||||
| 	player.viewData.htmlProperties(self, buffer) | ||||
| 	for _, tag := range []string{Controls, Loop, Muted, Preload} { | ||||
| 		if value, _ := boolProperty(player, tag, player.Session()); value { | ||||
| 		if value, _ := boolProperty(player, tag, player.session); value { | ||||
| 			buffer.WriteRune(' ') | ||||
| 			buffer.WriteString(tag) | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	if value, ok := enumProperty(player, Preload, player.Session(), 0); ok { | ||||
| 	if value, ok := enumProperty(player, Preload, player.session, 0); ok { | ||||
| 		values := enumProperties[Preload].values | ||||
| 		buffer.WriteString(` preload="`) | ||||
| 		buffer.WriteString(values[value]) | ||||
|  | @ -667,7 +667,7 @@ func (player *mediaPlayerData) SetCurrentTime(seconds float64) { | |||
| } | ||||
| 
 | ||||
| func (player *mediaPlayerData) getFloatPlayerProperty(tag string) (float64, bool) { | ||||
| 	value := player.Session().htmlPropertyValue(player.htmlID(), tag) | ||||
| 	value := player.session.htmlPropertyValue(player.htmlID(), tag) | ||||
| 	if value != "" { | ||||
| 		result, err := strconv.ParseFloat(value, 32) | ||||
| 		if err == nil { | ||||
|  | @ -718,7 +718,7 @@ func (player *mediaPlayerData) Volume() float64 { | |||
| } | ||||
| 
 | ||||
| func (player *mediaPlayerData) getBoolPlayerProperty(tag string) (bool, bool) { | ||||
| 	switch value := player.Session().htmlPropertyValue(player.htmlID(), tag); strings.ToLower(value) { | ||||
| 	switch value := player.session.htmlPropertyValue(player.htmlID(), tag); strings.ToLower(value) { | ||||
| 	case "0", "false", "off": | ||||
| 		return false, true | ||||
| 
 | ||||
|  |  | |||
|  | @ -167,7 +167,7 @@ func (view *viewData) setMouseListener(tag string, value any) bool { | |||
| 	} else if js, ok := mouseEvents[tag]; ok { | ||||
| 		view.properties[tag] = listeners | ||||
| 		if view.created { | ||||
| 			updateProperty(view.htmlID(), js.jsEvent, js.jsFunc+"(this, event)", view.Session()) | ||||
| 			view.session.updateProperty(view.htmlID(), js.jsEvent, js.jsFunc+"(this, event)") | ||||
| 		} | ||||
| 	} else { | ||||
| 		return false | ||||
|  | @ -179,7 +179,7 @@ func (view *viewData) removeMouseListener(tag string) { | |||
| 	delete(view.properties, tag) | ||||
| 	if view.created { | ||||
| 		if js, ok := mouseEvents[tag]; ok { | ||||
| 			removeProperty(view.htmlID(), js.jsEvent, view.Session()) | ||||
| 			view.session.removeProperty(view.htmlID(), js.jsEvent) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  |  | |||
|  | @ -140,24 +140,24 @@ func (picker *numberPickerData) propertyChanged(tag string) { | |||
| 		switch tag { | ||||
| 		case NumberPickerType: | ||||
| 			if GetNumberPickerType(picker) == NumberSlider { | ||||
| 				updateProperty(picker.htmlID(), "type", "range", picker.session) | ||||
| 				picker.session.updateProperty(picker.htmlID(), "type", "range") | ||||
| 			} else { | ||||
| 				updateProperty(picker.htmlID(), "type", "number", picker.session) | ||||
| 				picker.session.updateProperty(picker.htmlID(), "type", "number") | ||||
| 			} | ||||
| 
 | ||||
| 		case NumberPickerMin: | ||||
| 			min, _ := GetNumberPickerMinMax(picker) | ||||
| 			updateProperty(picker.htmlID(), Min, strconv.FormatFloat(min, 'f', -1, 32), picker.session) | ||||
| 			picker.session.updateProperty(picker.htmlID(), Min, strconv.FormatFloat(min, 'f', -1, 32)) | ||||
| 
 | ||||
| 		case NumberPickerMax: | ||||
| 			_, max := GetNumberPickerMinMax(picker) | ||||
| 			updateProperty(picker.htmlID(), Max, strconv.FormatFloat(max, 'f', -1, 32), picker.session) | ||||
| 			picker.session.updateProperty(picker.htmlID(), Max, strconv.FormatFloat(max, 'f', -1, 32)) | ||||
| 
 | ||||
| 		case NumberPickerStep: | ||||
| 			if step := GetNumberPickerStep(picker); step > 0 { | ||||
| 				updateProperty(picker.htmlID(), Step, strconv.FormatFloat(step, 'f', -1, 32), picker.session) | ||||
| 				picker.session.updateProperty(picker.htmlID(), Step, strconv.FormatFloat(step, 'f', -1, 32)) | ||||
| 			} else { | ||||
| 				updateProperty(picker.htmlID(), Step, "any", picker.session) | ||||
| 				picker.session.updateProperty(picker.htmlID(), Step, "any") | ||||
| 			} | ||||
| 
 | ||||
| 		case NumberPickerValue: | ||||
|  |  | |||
|  | @ -108,7 +108,7 @@ func (view *viewData) setPointerListener(tag string, value any) bool { | |||
| 	} else if js, ok := pointerEvents[tag]; ok { | ||||
| 		view.properties[tag] = listeners | ||||
| 		if view.created { | ||||
| 			updateProperty(view.htmlID(), js.jsEvent, js.jsFunc+"(this, event)", view.Session()) | ||||
| 			view.session.updateProperty(view.htmlID(), js.jsEvent, js.jsFunc+"(this, event)") | ||||
| 		} | ||||
| 	} else { | ||||
| 		return false | ||||
|  | @ -120,7 +120,7 @@ func (view *viewData) removePointerListener(tag string) { | |||
| 	delete(view.properties, tag) | ||||
| 	if view.created { | ||||
| 		if js, ok := pointerEvents[tag]; ok { | ||||
| 			removeProperty(view.htmlID(), js.jsEvent, view.Session()) | ||||
| 			view.session.removeProperty(view.htmlID(), js.jsEvent) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  |  | |||
							
								
								
									
										14
									
								
								popup.go
								
								
								
								
							
							
						
						
									
										14
									
								
								popup.go
								
								
								
								
							|  | @ -610,7 +610,7 @@ func ShowPopup(view View, param Params) Popup { | |||
| func (manager *popupManager) updatePopupLayerInnerHTML(session Session) { | ||||
| 	if manager.popups == nil { | ||||
| 		manager.popups = []Popup{} | ||||
| 		session.runFunc("updateInnerHTML", "ruiPopupLayer", "") | ||||
| 		session.updateInnerHTML("ruiPopupLayer", "") | ||||
| 		return | ||||
| 	} | ||||
| 
 | ||||
|  | @ -620,7 +620,7 @@ func (manager *popupManager) updatePopupLayerInnerHTML(session Session) { | |||
| 	for _, popup := range manager.popups { | ||||
| 		popup.html(buffer) | ||||
| 	} | ||||
| 	session.runFunc("updateInnerHTML", "ruiPopupLayer", buffer.String()) | ||||
| 	session.updateInnerHTML("ruiPopupLayer", buffer.String()) | ||||
| } | ||||
| 
 | ||||
| func (manager *popupManager) showPopup(popup Popup) { | ||||
|  | @ -637,8 +637,8 @@ func (manager *popupManager) showPopup(popup Popup) { | |||
| 
 | ||||
| 	session.runFunc("blurCurrent") | ||||
| 	manager.updatePopupLayerInnerHTML(session) | ||||
| 	updateCSSProperty("ruiPopupLayer", "visibility", "visible", session) | ||||
| 	updateCSSProperty("ruiRoot", "pointer-events", "none", session) | ||||
| 	session.updateCSSProperty("ruiPopupLayer", "visibility", "visible") | ||||
| 	session.updateCSSProperty("ruiRoot", "pointer-events", "none") | ||||
| } | ||||
| 
 | ||||
| func (manager *popupManager) dismissPopup(popup Popup) { | ||||
|  | @ -656,9 +656,9 @@ func (manager *popupManager) dismissPopup(popup Popup) { | |||
| 	if manager.popups[count-1] == popup { | ||||
| 		if count == 1 { | ||||
| 			manager.popups = []Popup{} | ||||
| 			updateCSSProperty("ruiRoot", "pointer-events", "auto", session) | ||||
| 			updateCSSProperty("ruiPopupLayer", "visibility", "hidden", session) | ||||
| 			session.runFunc("updateInnerHTML", "ruiPopupLayer", "") | ||||
| 			session.updateCSSProperty("ruiRoot", "pointer-events", "auto") | ||||
| 			session.updateCSSProperty("ruiPopupLayer", "visibility", "hidden") | ||||
| 			session.updateInnerHTML("ruiPopupLayer", "") | ||||
| 		} else { | ||||
| 			manager.popups = manager.popups[:count-1] | ||||
| 			manager.updatePopupLayerInnerHTML(session) | ||||
|  |  | |||
|  | @ -65,10 +65,12 @@ func (progress *progressBarData) propertyChanged(tag string) { | |||
| 	if progress.created { | ||||
| 		switch tag { | ||||
| 		case ProgressBarMax: | ||||
| 			updateProperty(progress.htmlID(), Max, strconv.FormatFloat(GetProgressBarMax(progress), 'f', -1, 32), progress.session) | ||||
| 			progress.session.updateProperty(progress.htmlID(), Max, | ||||
| 				strconv.FormatFloat(GetProgressBarMax(progress), 'f', -1, 32)) | ||||
| 
 | ||||
| 		case ProgressBarValue: | ||||
| 			updateProperty(progress.htmlID(), Value, strconv.FormatFloat(GetProgressBarValue(progress), 'f', -1, 32), progress.session) | ||||
| 			progress.session.updateProperty(progress.htmlID(), Value, | ||||
| 				strconv.FormatFloat(GetProgressBarValue(progress), 'f', -1, 32)) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  |  | |||
|  | @ -334,8 +334,8 @@ func (resizable *resizableData) updateResizeBorderWidth() { | |||
| 		session := resizable.Session() | ||||
| 		column, row := resizable.cellSizeCSS() | ||||
| 
 | ||||
| 		updateCSSProperty(htmlID, "grid-template-columns", column, session) | ||||
| 		updateCSSProperty(htmlID, "grid-template-rows", row, session) | ||||
| 		session.updateCSSProperty(htmlID, "grid-template-columns", column) | ||||
| 		session.updateCSSProperty(htmlID, "grid-template-rows", row) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
|  |  | |||
							
								
								
									
										79
									
								
								session.go
								
								
								
								
							
							
						
						
									
										79
									
								
								session.go
								
								
								
								
							|  | @ -9,6 +9,11 @@ import ( | |||
| 
 | ||||
| type webBrige interface { | ||||
| 	runFunc(funcName string, args ...any) bool | ||||
| 	updateInnerHTML(htmlID, html string) | ||||
| 	appendToInnerHTML(htmlID, html string) | ||||
| 	updateCSSProperty(htmlID, property, value string) | ||||
| 	updateProperty(htmlID, property, value any) | ||||
| 	removeProperty(htmlID, property string) | ||||
| 	readMessage() (string, bool) | ||||
| 	writeMessage(text string) bool | ||||
| 	canvasTextMetrics(htmlID, font, text string) TextMetrics | ||||
|  | @ -99,6 +104,12 @@ type Session interface { | |||
| 	setBrige(events chan DataObject, brige webBrige) | ||||
| 	writeInitScript(writer *strings.Builder) | ||||
| 	runFunc(funcName string, args ...any) | ||||
| 	updateInnerHTML(htmlID, html string) | ||||
| 	appendToInnerHTML(htmlID, html string) | ||||
| 	updateCSSProperty(htmlID, property, value string) | ||||
| 	updateProperty(htmlID, property, value string) | ||||
| 	updateBoolProperty(htmlID, property string, value bool) | ||||
| 	removeProperty(htmlID, property string) | ||||
| 	runScript(script string) | ||||
| 	canvasTextMetrics(htmlID, font, text string) TextMetrics | ||||
| 	htmlPropertyValue(htmlID, name string) string | ||||
|  | @ -333,6 +344,74 @@ func (session *sessionData) runFunc(funcName string, args ...any) { | |||
| 	} | ||||
| } | ||||
| 
 | ||||
| func (session *sessionData) updateInnerHTML(htmlID, html string) { | ||||
| 	if !session.ignoreViewUpdates() { | ||||
| 		if session.brige != nil { | ||||
| 			session.brige.updateInnerHTML(htmlID, html) | ||||
| 		} else { | ||||
| 			ErrorLog("No connection") | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func (session *sessionData) appendToInnerHTML(htmlID, html string) { | ||||
| 	if !session.ignoreViewUpdates() { | ||||
| 		if session.brige != nil { | ||||
| 			session.brige.appendToInnerHTML(htmlID, html) | ||||
| 		} else { | ||||
| 			ErrorLog("No connection") | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func (session *sessionData) updateCSSProperty(htmlID, property, value string) { | ||||
| 	if !session.ignoreViewUpdates() { | ||||
| 		if buffer := session.updateScript(htmlID); buffer != nil { | ||||
| 			buffer.WriteString(fmt.Sprintf(`element.style['%v'] = '%v';`, property, value)) | ||||
| 			buffer.WriteRune('\n') | ||||
| 		} else { | ||||
| 			session.runFunc("updateCSSProperty", htmlID, property, value) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func (session *sessionData) updateProperty(htmlID, property, value string) { | ||||
| 	if !session.ignoreViewUpdates() { | ||||
| 		if buffer := session.updateScript(htmlID); buffer != nil { | ||||
| 			buffer.WriteString(fmt.Sprintf(`element.setAttribute('%v', '%v');`, property, value)) | ||||
| 			buffer.WriteRune('\n') | ||||
| 		} else { | ||||
| 			session.runFunc("updateProperty", htmlID, property, value) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func (session *sessionData) updateBoolProperty(htmlID, property string, value bool) { | ||||
| 	if !session.ignoreViewUpdates() { | ||||
| 		if buffer := session.updateScript(htmlID); buffer != nil { | ||||
| 			if value { | ||||
| 				buffer.WriteString(fmt.Sprintf(`element.setAttribute('%v', true);`, property)) | ||||
| 			} else { | ||||
| 				buffer.WriteString(fmt.Sprintf(`element.setAttribute('%v', false);`, property)) | ||||
| 			} | ||||
| 			buffer.WriteRune('\n') | ||||
| 		} else { | ||||
| 			session.runFunc("updateProperty", htmlID, property, value) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func (session *sessionData) removeProperty(htmlID, property string) { | ||||
| 	if !session.ignoreViewUpdates() { | ||||
| 		if buffer := session.updateScript(htmlID); buffer != nil { | ||||
| 			buffer.WriteString(fmt.Sprintf(`if (element.hasAttribute('%v')) { element.removeAttribute('%v');}`, property, property)) | ||||
| 			buffer.WriteRune('\n') | ||||
| 		} else { | ||||
| 			session.runFunc("removeProperty", htmlID, property) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func (session *sessionData) runScript(script string) { | ||||
| 	if session.brige != nil { | ||||
| 		session.brige.writeMessage(script) | ||||
|  |  | |||
|  | @ -1,7 +1,6 @@ | |||
| package rui | ||||
| 
 | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"strings" | ||||
| ) | ||||
| 
 | ||||
|  | @ -60,19 +59,12 @@ func updateInnerHTML(htmlID string, session Session) { | |||
| 
 | ||||
| 			script.Grow(32 * 1024) | ||||
| 			view.htmlSubviews(view, script) | ||||
| 			session.runFunc("updateInnerHTML", view.htmlID(), script.String()) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func appendToInnerHTML(htmlID, content string, session Session) { | ||||
| 	if !session.ignoreViewUpdates() { | ||||
| 		if view := session.viewByHTMLID(htmlID); view != nil { | ||||
| 			session.runFunc("appendToInnerHTML", view.htmlID(), content) | ||||
| 			session.updateInnerHTML(view.htmlID(), script.String()) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| /* | ||||
| func updateProperty(htmlID, property, value string, session Session) { | ||||
| 	if !session.ignoreViewUpdates() { | ||||
| 		if buffer := session.updateScript(htmlID); buffer != nil { | ||||
|  | @ -120,7 +112,7 @@ func removeProperty(htmlID, property string, session Session) { | |||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| */ | ||||
| /* | ||||
| func setDisabled(htmlID string, disabled bool, session Session) { | ||||
| 	if !session.ignoreViewUpdates() { | ||||
|  |  | |||
|  | @ -122,11 +122,11 @@ func (layout *stackLayoutData) set(tag string, value any) bool { | |||
| 		setCurrent := func(index int) { | ||||
| 			if index != layout.peek { | ||||
| 				if layout.peek < len(layout.views) { | ||||
| 					updateCSSProperty(layout.htmlID()+"page"+strconv.Itoa(layout.peek), "visibility", "hidden", layout.Session()) | ||||
| 					layout.Session().updateCSSProperty(layout.htmlID()+"page"+strconv.Itoa(layout.peek), "visibility", "hidden") | ||||
| 				} | ||||
| 
 | ||||
| 				layout.peek = index | ||||
| 				updateCSSProperty(layout.htmlID()+"page"+strconv.Itoa(index), "visibility", "visible", layout.Session()) | ||||
| 				layout.Session().updateCSSProperty(layout.htmlID()+"page"+strconv.Itoa(index), "visibility", "visible") | ||||
| 				layout.propertyChangedEvent(Current) | ||||
| 			} | ||||
| 		} | ||||
|  | @ -204,11 +204,11 @@ func (layout *stackLayoutData) MoveToFront(view View) bool { | |||
| 		if view2.htmlID() == htmlID { | ||||
| 			if i != peek { | ||||
| 				if peek < len(layout.views) { | ||||
| 					updateCSSProperty(layout.htmlID()+"page"+strconv.Itoa(peek), "visibility", "hidden", layout.Session()) | ||||
| 					layout.Session().updateCSSProperty(layout.htmlID()+"page"+strconv.Itoa(peek), "visibility", "hidden") | ||||
| 				} | ||||
| 
 | ||||
| 				layout.peek = i | ||||
| 				updateCSSProperty(layout.htmlID()+"page"+strconv.Itoa(i), "visibility", "visible", layout.Session()) | ||||
| 				layout.Session().updateCSSProperty(layout.htmlID()+"page"+strconv.Itoa(i), "visibility", "visible") | ||||
| 				layout.propertyChangedEvent(Current) | ||||
| 			} | ||||
| 			return true | ||||
|  | @ -225,11 +225,11 @@ func (layout *stackLayoutData) MoveToFrontByID(viewID string) bool { | |||
| 		if view.ID() == viewID { | ||||
| 			if i != peek { | ||||
| 				if peek < len(layout.views) { | ||||
| 					updateCSSProperty(layout.htmlID()+"page"+strconv.Itoa(peek), "visibility", "hidden", layout.Session()) | ||||
| 					layout.Session().updateCSSProperty(layout.htmlID()+"page"+strconv.Itoa(peek), "visibility", "hidden") | ||||
| 				} | ||||
| 
 | ||||
| 				layout.peek = i | ||||
| 				updateCSSProperty(layout.htmlID()+"page"+strconv.Itoa(i), "visibility", "visible", layout.Session()) | ||||
| 				layout.Session().updateCSSProperty(layout.htmlID()+"page"+strconv.Itoa(i), "visibility", "visible") | ||||
| 				layout.propertyChangedEvent(Current) | ||||
| 			} | ||||
| 			return true | ||||
|  | @ -319,8 +319,8 @@ func (layout *stackLayoutData) Push(view View, animation int, onPushFinished fun | |||
| 	viewHTML(layout.pushView, buffer) | ||||
| 	buffer.WriteString(`</div>`) | ||||
| 
 | ||||
| 	appendToInnerHTML(htmlID, buffer.String(), session) | ||||
| 	updateCSSProperty(htmlID+"push", "transform", "translate(0px, 0px)", layout.session) | ||||
| 	session.appendToInnerHTML(htmlID, buffer.String()) | ||||
| 	layout.session.updateCSSProperty(htmlID+"push", "transform", "translate(0px, 0px)") | ||||
| 
 | ||||
| 	layout.views = append(layout.views, view) | ||||
| 	view.setParentID(htmlID) | ||||
|  | @ -357,7 +357,7 @@ func (layout *stackLayoutData) Pop(animation int, onPopFinished func(View)) bool | |||
| 	viewHTML(layout.popView, buffer) | ||||
| 	buffer.WriteString(`</div>`) | ||||
| 
 | ||||
| 	appendToInnerHTML(htmlID, buffer.String(), session) | ||||
| 	session.appendToInnerHTML(htmlID, buffer.String()) | ||||
| 
 | ||||
| 	var value string | ||||
| 	switch layout.animationType { | ||||
|  | @ -374,7 +374,7 @@ func (layout *stackLayoutData) Pop(animation int, onPopFinished func(View)) bool | |||
| 		value = fmt.Sprintf("translate(%gpx, 0px)", layout.frame.Width) | ||||
| 	} | ||||
| 
 | ||||
| 	updateCSSProperty(htmlID+"pop", "transform", value, layout.session) | ||||
| 	layout.session.updateCSSProperty(htmlID+"pop", "transform", value) | ||||
| 	return true | ||||
| } | ||||
| 
 | ||||
|  |  | |||
							
								
								
									
										53
									
								
								tableView.go
								
								
								
								
							
							
						
						
									
										53
									
								
								tableView.go
								
								
								
								
							|  | @ -593,11 +593,11 @@ func (table *tableViewData) propertyChanged(tag string) { | |||
| 			session := table.Session() | ||||
| 			gap, ok := sizeProperty(table, Gap, session) | ||||
| 			if !ok || gap.Type == Auto || gap.Value <= 0 { | ||||
| 				updateCSSProperty(htmlID, "border-spacing", "0", session) | ||||
| 				updateCSSProperty(htmlID, "border-collapse", "collapse", session) | ||||
| 				session.updateCSSProperty(htmlID, "border-spacing", "0") | ||||
| 				session.updateCSSProperty(htmlID, "border-collapse", "collapse") | ||||
| 			} else { | ||||
| 				updateCSSProperty(htmlID, "border-spacing", gap.cssString("0", session), session) | ||||
| 				updateCSSProperty(htmlID, "border-collapse", "separate", session) | ||||
| 				session.updateCSSProperty(htmlID, "border-spacing", gap.cssString("0", session)) | ||||
| 				session.updateCSSProperty(htmlID, "border-collapse", "separate") | ||||
| 			} | ||||
| 
 | ||||
| 		case SelectionMode: | ||||
|  | @ -606,38 +606,38 @@ func (table *tableViewData) propertyChanged(tag string) { | |||
| 
 | ||||
| 			switch GetTableSelectionMode(table) { | ||||
| 			case CellSelection: | ||||
| 				updateProperty(htmlID, "tabindex", "0", session) | ||||
| 				updateProperty(htmlID, "onfocus", "tableViewFocusEvent(this, event)", session) | ||||
| 				updateProperty(htmlID, "onblur", "tableViewBlurEvent(this, event)", session) | ||||
| 				updateProperty(htmlID, "data-selection", "cell", session) | ||||
| 				updateProperty(htmlID, "data-focusitemstyle", table.currentStyle(), session) | ||||
| 				updateProperty(htmlID, "data-bluritemstyle", table.currentInactiveStyle(), session) | ||||
| 				session.updateProperty(htmlID, "tabindex", "0") | ||||
| 				session.updateProperty(htmlID, "onfocus", "tableViewFocusEvent(this, event)") | ||||
| 				session.updateProperty(htmlID, "onblur", "tableViewBlurEvent(this, event)") | ||||
| 				session.updateProperty(htmlID, "data-selection", "cell") | ||||
| 				session.updateProperty(htmlID, "data-focusitemstyle", table.currentStyle()) | ||||
| 				session.updateProperty(htmlID, "data-bluritemstyle", table.currentInactiveStyle()) | ||||
| 
 | ||||
| 				if table.current.Row >= 0 && table.current.Column >= 0 { | ||||
| 					updateProperty(htmlID, "data-current", table.cellID(table.current.Row, table.current.Column), session) | ||||
| 					session.updateProperty(htmlID, "data-current", table.cellID(table.current.Row, table.current.Column)) | ||||
| 				} else { | ||||
| 					removeProperty(htmlID, "data-current", session) | ||||
| 					session.removeProperty(htmlID, "data-current") | ||||
| 				} | ||||
| 				updateProperty(htmlID, "onkeydown", "tableViewCellKeyDownEvent(this, event)", session) | ||||
| 				session.updateProperty(htmlID, "onkeydown", "tableViewCellKeyDownEvent(this, event)") | ||||
| 
 | ||||
| 			case RowSelection: | ||||
| 				updateProperty(htmlID, "tabindex", "0", session) | ||||
| 				updateProperty(htmlID, "onfocus", "tableViewFocusEvent(this, event)", session) | ||||
| 				updateProperty(htmlID, "onblur", "tableViewBlurEvent(this, event)", session) | ||||
| 				updateProperty(htmlID, "data-selection", "row", session) | ||||
| 				updateProperty(htmlID, "data-focusitemstyle", table.currentStyle(), session) | ||||
| 				updateProperty(htmlID, "data-bluritemstyle", table.currentInactiveStyle(), session) | ||||
| 				session.updateProperty(htmlID, "tabindex", "0") | ||||
| 				session.updateProperty(htmlID, "onfocus", "tableViewFocusEvent(this, event)") | ||||
| 				session.updateProperty(htmlID, "onblur", "tableViewBlurEvent(this, event)") | ||||
| 				session.updateProperty(htmlID, "data-selection", "row") | ||||
| 				session.updateProperty(htmlID, "data-focusitemstyle", table.currentStyle()) | ||||
| 				session.updateProperty(htmlID, "data-bluritemstyle", table.currentInactiveStyle()) | ||||
| 
 | ||||
| 				if table.current.Row >= 0 { | ||||
| 					updateProperty(htmlID, "data-current", table.rowID(table.current.Row), session) | ||||
| 					session.updateProperty(htmlID, "data-current", table.rowID(table.current.Row)) | ||||
| 				} else { | ||||
| 					removeProperty(htmlID, "data-current", session) | ||||
| 					session.removeProperty(htmlID, "data-current") | ||||
| 				} | ||||
| 				updateProperty(htmlID, "onkeydown", "tableViewRowKeyDownEvent(this, event)", session) | ||||
| 				session.updateProperty(htmlID, "onkeydown", "tableViewRowKeyDownEvent(this, event)") | ||||
| 
 | ||||
| 			default: // NoneSelection
 | ||||
| 				for _, prop := range []string{"tabindex", "data-current", "onfocus", "onblur", "onkeydown", "data-selection"} { | ||||
| 					removeProperty(htmlID, prop, session) | ||||
| 					session.removeProperty(htmlID, prop) | ||||
| 				} | ||||
| 			} | ||||
| 			updateInnerHTML(htmlID, session) | ||||
|  | @ -1335,11 +1335,12 @@ func (table *tableViewData) cssStyle(self View, builder cssBuilder) { | |||
| 
 | ||||
| func (table *tableViewData) ReloadTableData() { | ||||
| 	session := table.Session() | ||||
| 	htmlID := table.htmlID() | ||||
| 	if content := table.content(); content != nil { | ||||
| 		updateProperty(table.htmlID(), "data-rows", strconv.Itoa(content.RowCount()), session) | ||||
| 		updateProperty(table.htmlID(), "data-columns", strconv.Itoa(content.ColumnCount()), session) | ||||
| 		session.updateProperty(htmlID, "data-rows", strconv.Itoa(content.RowCount())) | ||||
| 		session.updateProperty(htmlID, "data-columns", strconv.Itoa(content.ColumnCount())) | ||||
| 	} | ||||
| 	updateInnerHTML(table.htmlID(), session) | ||||
| 	updateInnerHTML(htmlID, session) | ||||
| } | ||||
| 
 | ||||
| func (table *tableViewData) onItemResize(self View, index string, x, y, width, height float64) { | ||||
|  |  | |||
|  | @ -161,8 +161,8 @@ func (tabsLayout *tabsLayoutData) remove(tag string) { | |||
| 		delete(tabsLayout.properties, Tabs) | ||||
| 		if tabsLayout.created { | ||||
| 			htmlID := tabsLayout.htmlID() | ||||
| 			updateProperty(htmlID, inactiveTabStyle, tabsLayout.inactiveTabStyle(), tabsLayout.session) | ||||
| 			updateProperty(htmlID, activeTabStyle, tabsLayout.activeTabStyle(), tabsLayout.session) | ||||
| 			tabsLayout.session.updateProperty(htmlID, inactiveTabStyle, tabsLayout.inactiveTabStyle()) | ||||
| 			tabsLayout.session.updateProperty(htmlID, activeTabStyle, tabsLayout.activeTabStyle()) | ||||
| 			updateCSSStyle(htmlID, tabsLayout.session) | ||||
| 			updateInnerHTML(htmlID, tabsLayout.session) | ||||
| 		} | ||||
|  | @ -171,8 +171,8 @@ func (tabsLayout *tabsLayoutData) remove(tag string) { | |||
| 		delete(tabsLayout.properties, tag) | ||||
| 		if tabsLayout.created { | ||||
| 			htmlID := tabsLayout.htmlID() | ||||
| 			updateProperty(htmlID, inactiveTabStyle, tabsLayout.inactiveTabStyle(), tabsLayout.session) | ||||
| 			updateProperty(htmlID, activeTabStyle, tabsLayout.activeTabStyle(), tabsLayout.session) | ||||
| 			tabsLayout.session.updateProperty(htmlID, inactiveTabStyle, tabsLayout.inactiveTabStyle()) | ||||
| 			tabsLayout.session.updateProperty(htmlID, activeTabStyle, tabsLayout.activeTabStyle()) | ||||
| 			updateInnerHTML(htmlID, tabsLayout.session) | ||||
| 		} | ||||
| 
 | ||||
|  | @ -247,8 +247,8 @@ func (tabsLayout *tabsLayoutData) set(tag string, value any) bool { | |||
| 		} | ||||
| 		if tabsLayout.created { | ||||
| 			htmlID := tabsLayout.htmlID() | ||||
| 			updateProperty(htmlID, inactiveTabStyle, tabsLayout.inactiveTabStyle(), tabsLayout.session) | ||||
| 			updateProperty(htmlID, activeTabStyle, tabsLayout.activeTabStyle(), tabsLayout.session) | ||||
| 			tabsLayout.session.updateProperty(htmlID, inactiveTabStyle, tabsLayout.inactiveTabStyle()) | ||||
| 			tabsLayout.session.updateProperty(htmlID, activeTabStyle, tabsLayout.activeTabStyle()) | ||||
| 			updateCSSStyle(htmlID, tabsLayout.session) | ||||
| 			updateInnerHTML(htmlID, tabsLayout.session) | ||||
| 		} | ||||
|  | @ -267,8 +267,8 @@ func (tabsLayout *tabsLayoutData) set(tag string, value any) bool { | |||
| 
 | ||||
| 		if tabsLayout.created { | ||||
| 			htmlID := tabsLayout.htmlID() | ||||
| 			updateProperty(htmlID, inactiveTabStyle, tabsLayout.inactiveTabStyle(), tabsLayout.session) | ||||
| 			updateProperty(htmlID, activeTabStyle, tabsLayout.activeTabStyle(), tabsLayout.session) | ||||
| 			tabsLayout.session.updateProperty(htmlID, inactiveTabStyle, tabsLayout.inactiveTabStyle()) | ||||
| 			tabsLayout.session.updateProperty(htmlID, activeTabStyle, tabsLayout.activeTabStyle()) | ||||
| 			updateInnerHTML(htmlID, tabsLayout.session) | ||||
| 		} | ||||
| 
 | ||||
|  |  | |||
|  | @ -125,14 +125,14 @@ func (textView *textViewData) set(tag string, value any) bool { | |||
| 
 | ||||
| func (textView *textViewData) textOverflowUpdated() { | ||||
| 	session := textView.Session() | ||||
| 	if n, ok := enumProperty(textView, TextOverflow, textView.session, 0); ok { | ||||
| 	if n, ok := enumProperty(textView, TextOverflow, session, 0); ok { | ||||
| 		values := enumProperties[TextOverflow].cssValues | ||||
| 		if n >= 0 && n < len(values) { | ||||
| 			updateCSSProperty(textView.htmlID(), TextOverflow, values[n], session) | ||||
| 			session.updateCSSProperty(textView.htmlID(), TextOverflow, values[n]) | ||||
| 			return | ||||
| 		} | ||||
| 	} | ||||
| 	updateCSSProperty(textView.htmlID(), TextOverflow, "", session) | ||||
| 	session.updateCSSProperty(textView.htmlID(), TextOverflow, "") | ||||
| } | ||||
| 
 | ||||
| func (textView *textViewData) htmlSubviews(self View, buffer *strings.Builder) { | ||||
|  |  | |||
|  | @ -77,19 +77,19 @@ func (picker *timePickerData) remove(tag string) { | |||
| 	case TimePickerMin: | ||||
| 		delete(picker.properties, TimePickerMin) | ||||
| 		if picker.created { | ||||
| 			removeProperty(picker.htmlID(), Min, picker.session) | ||||
| 			picker.session.removeProperty(picker.htmlID(), Min) | ||||
| 		} | ||||
| 
 | ||||
| 	case TimePickerMax: | ||||
| 		delete(picker.properties, TimePickerMax) | ||||
| 		if picker.created { | ||||
| 			removeProperty(picker.htmlID(), Max, picker.session) | ||||
| 			picker.session.removeProperty(picker.htmlID(), Max) | ||||
| 		} | ||||
| 
 | ||||
| 	case TimePickerStep: | ||||
| 		delete(picker.properties, TimePickerStep) | ||||
| 		if picker.created { | ||||
| 			removeProperty(picker.htmlID(), Step, picker.session) | ||||
| 			picker.session.removeProperty(picker.htmlID(), Step) | ||||
| 		} | ||||
| 
 | ||||
| 	case TimePickerValue: | ||||
|  | @ -171,7 +171,7 @@ func (picker *timePickerData) set(tag string, value any) bool { | |||
| 		if time, ok := setTimeValue(TimePickerMin); ok { | ||||
| 			if !oldOK || time != old { | ||||
| 				if picker.created { | ||||
| 					updateProperty(picker.htmlID(), Min, time.Format(timeFormat), picker.session) | ||||
| 					picker.session.updateProperty(picker.htmlID(), Min, time.Format(timeFormat)) | ||||
| 				} | ||||
| 				picker.propertyChangedEvent(tag) | ||||
| 			} | ||||
|  | @ -183,7 +183,7 @@ func (picker *timePickerData) set(tag string, value any) bool { | |||
| 		if time, ok := setTimeValue(TimePickerMax); ok { | ||||
| 			if !oldOK || time != old { | ||||
| 				if picker.created { | ||||
| 					updateProperty(picker.htmlID(), Max, time.Format(timeFormat), picker.session) | ||||
| 					picker.session.updateProperty(picker.htmlID(), Max, time.Format(timeFormat)) | ||||
| 				} | ||||
| 				picker.propertyChangedEvent(tag) | ||||
| 			} | ||||
|  | @ -196,9 +196,9 @@ func (picker *timePickerData) set(tag string, value any) bool { | |||
| 			if step := GetTimePickerStep(picker); oldStep != step { | ||||
| 				if picker.created { | ||||
| 					if step > 0 { | ||||
| 						updateProperty(picker.htmlID(), Step, strconv.Itoa(step), picker.session) | ||||
| 						picker.session.updateProperty(picker.htmlID(), Step, strconv.Itoa(step)) | ||||
| 					} else { | ||||
| 						removeProperty(picker.htmlID(), Step, picker.session) | ||||
| 						picker.session.removeProperty(picker.htmlID(), Step) | ||||
| 					} | ||||
| 				} | ||||
| 				picker.propertyChangedEvent(tag) | ||||
|  |  | |||
|  | @ -109,7 +109,7 @@ func (view *viewData) setTouchListener(tag string, value any) bool { | |||
| 	} else if js, ok := touchEvents[tag]; ok { | ||||
| 		view.properties[tag] = listeners | ||||
| 		if view.created { | ||||
| 			updateProperty(view.htmlID(), js.jsEvent, js.jsFunc+"(this, event)", view.Session()) | ||||
| 			view.session.updateProperty(view.htmlID(), js.jsEvent, js.jsFunc+"(this, event)") | ||||
| 		} | ||||
| 	} else { | ||||
| 		return false | ||||
|  | @ -121,7 +121,7 @@ func (view *viewData) removeTouchListener(tag string) { | |||
| 	delete(view.properties, tag) | ||||
| 	if view.created { | ||||
| 		if js, ok := touchEvents[tag]; ok { | ||||
| 			removeProperty(view.htmlID(), js.jsEvent, view.Session()) | ||||
| 			view.session.removeProperty(view.htmlID(), js.jsEvent) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  |  | |||
|  | @ -61,15 +61,15 @@ func (player *videoPlayerData) remove(tag string) { | |||
| 
 | ||||
| 	case VideoWidth: | ||||
| 		delete(player.properties, tag) | ||||
| 		removeProperty(player.htmlID(), "width", player.Session()) | ||||
| 		player.session.removeProperty(player.htmlID(), "width") | ||||
| 
 | ||||
| 	case VideoHeight: | ||||
| 		delete(player.properties, tag) | ||||
| 		removeProperty(player.htmlID(), "height", player.Session()) | ||||
| 		player.session.removeProperty(player.htmlID(), "height") | ||||
| 
 | ||||
| 	case Poster: | ||||
| 		delete(player.properties, tag) | ||||
| 		removeProperty(player.htmlID(), Poster, player.Session()) | ||||
| 		player.session.removeProperty(player.htmlID(), Poster) | ||||
| 
 | ||||
| 	default: | ||||
| 		player.mediaPlayerData.remove(tag) | ||||
|  | @ -91,9 +91,9 @@ func (player *videoPlayerData) set(tag string, value any) bool { | |||
| 		updateSize := func(cssTag string) { | ||||
| 			if size, ok := floatTextProperty(player, tag, session, 0); ok { | ||||
| 				if size != "0" { | ||||
| 					updateProperty(player.htmlID(), cssTag, size, session) | ||||
| 					session.updateProperty(player.htmlID(), cssTag, size) | ||||
| 				} else { | ||||
| 					removeProperty(player.htmlID(), cssTag, session) | ||||
| 					session.removeProperty(player.htmlID(), cssTag) | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
|  | @ -107,7 +107,7 @@ func (player *videoPlayerData) set(tag string, value any) bool { | |||
| 
 | ||||
| 		case Poster: | ||||
| 			if url, ok := stringProperty(player, Poster, session); ok { | ||||
| 				updateProperty(player.htmlID(), Poster, url, session) | ||||
| 				session.updateProperty(player.htmlID(), Poster, url) | ||||
| 			} | ||||
| 		} | ||||
| 		return true | ||||
|  |  | |||
							
								
								
									
										120
									
								
								view.go
								
								
								
								
							
							
						
						
									
										120
									
								
								view.go
								
								
								
								
							|  | @ -193,7 +193,7 @@ func (view *viewData) remove(tag string) { | |||
| 	case Style, StyleDisabled: | ||||
| 		if _, ok := view.properties[tag]; ok { | ||||
| 			delete(view.properties, tag) | ||||
| 			updateProperty(view.htmlID(), "class", view.htmlClass(IsDisabled(view)), view.session) | ||||
| 			view.session.updateProperty(view.htmlID(), "class", view.htmlClass(IsDisabled(view))) | ||||
| 		} | ||||
| 
 | ||||
| 	case FocusEvent, LostFocusEvent: | ||||
|  | @ -323,7 +323,7 @@ func (view *viewData) set(tag string, value any) bool { | |||
| 		} | ||||
| 		view.properties[tag] = text | ||||
| 		if view.created { | ||||
| 			updateProperty(view.htmlID(), "class", view.htmlClass(IsDisabled(view)), view.session) | ||||
| 			view.session.updateProperty(view.htmlID(), "class", view.htmlClass(IsDisabled(view))) | ||||
| 		} | ||||
| 
 | ||||
| 	case FocusEvent, LostFocusEvent: | ||||
|  | @ -379,21 +379,21 @@ func viewPropertyChanged(view *viewData, tag string) { | |||
| 	case Visibility: | ||||
| 		switch GetVisibility(view) { | ||||
| 		case Invisible: | ||||
| 			updateCSSProperty(htmlID, Visibility, "hidden", session) | ||||
| 			updateCSSProperty(htmlID, "display", "", session) | ||||
| 			session.updateCSSProperty(htmlID, Visibility, "hidden") | ||||
| 			session.updateCSSProperty(htmlID, "display", "") | ||||
| 
 | ||||
| 		case Gone: | ||||
| 			updateCSSProperty(htmlID, Visibility, "hidden", session) | ||||
| 			updateCSSProperty(htmlID, "display", "none", session) | ||||
| 			session.updateCSSProperty(htmlID, Visibility, "hidden") | ||||
| 			session.updateCSSProperty(htmlID, "display", "none") | ||||
| 
 | ||||
| 		default: | ||||
| 			updateCSSProperty(htmlID, Visibility, "visible", session) | ||||
| 			updateCSSProperty(htmlID, "display", "", session) | ||||
| 			session.updateCSSProperty(htmlID, Visibility, "visible") | ||||
| 			session.updateCSSProperty(htmlID, "display", "") | ||||
| 		} | ||||
| 		return | ||||
| 
 | ||||
| 	case Background: | ||||
| 		updateCSSProperty(htmlID, Background, view.backgroundCSS(session), session) | ||||
| 		session.updateCSSProperty(htmlID, Background, view.backgroundCSS(session)) | ||||
| 		return | ||||
| 
 | ||||
| 	case Border: | ||||
|  | @ -402,9 +402,9 @@ func viewPropertyChanged(view *viewData, tag string) { | |||
| 			if buffer == nil { | ||||
| 				session.startUpdateScript(htmlID) | ||||
| 			} | ||||
| 			updateCSSProperty(htmlID, BorderWidth, "", session) | ||||
| 			updateCSSProperty(htmlID, BorderColor, "", session) | ||||
| 			updateCSSProperty(htmlID, BorderStyle, "none", session) | ||||
| 			session.updateCSSProperty(htmlID, BorderWidth, "") | ||||
| 			session.updateCSSProperty(htmlID, BorderColor, "") | ||||
| 			session.updateCSSProperty(htmlID, BorderStyle, "none") | ||||
| 			if buffer == nil { | ||||
| 				session.finishUpdateScript(htmlID) | ||||
| 			} | ||||
|  | @ -418,9 +418,9 @@ func viewPropertyChanged(view *viewData, tag string) { | |||
| 			if buffer == nil { | ||||
| 				session.startUpdateScript(htmlID) | ||||
| 			} | ||||
| 			updateCSSProperty(htmlID, BorderWidth, border.cssWidthValue(session), session) | ||||
| 			updateCSSProperty(htmlID, BorderColor, border.cssColorValue(session), session) | ||||
| 			updateCSSProperty(htmlID, BorderStyle, border.cssStyleValue(session), session) | ||||
| 			session.updateCSSProperty(htmlID, BorderWidth, border.cssWidthValue(session)) | ||||
| 			session.updateCSSProperty(htmlID, BorderColor, border.cssColorValue(session)) | ||||
| 			session.updateCSSProperty(htmlID, BorderStyle, border.cssStyleValue(session)) | ||||
| 			if buffer == nil { | ||||
| 				session.finishUpdateScript(htmlID) | ||||
| 			} | ||||
|  | @ -429,32 +429,32 @@ func viewPropertyChanged(view *viewData, tag string) { | |||
| 
 | ||||
| 	case BorderStyle, BorderLeftStyle, BorderRightStyle, BorderTopStyle, BorderBottomStyle: | ||||
| 		if border := getBorder(view, Border); border != nil { | ||||
| 			updateCSSProperty(htmlID, BorderStyle, border.cssStyleValue(session), session) | ||||
| 			session.updateCSSProperty(htmlID, BorderStyle, border.cssStyleValue(session)) | ||||
| 		} | ||||
| 		return | ||||
| 
 | ||||
| 	case BorderColor, BorderLeftColor, BorderRightColor, BorderTopColor, BorderBottomColor: | ||||
| 		if border := getBorder(view, Border); border != nil { | ||||
| 			updateCSSProperty(htmlID, BorderColor, border.cssColorValue(session), session) | ||||
| 			session.updateCSSProperty(htmlID, BorderColor, border.cssColorValue(session)) | ||||
| 		} | ||||
| 		return | ||||
| 
 | ||||
| 	case BorderWidth, BorderLeftWidth, BorderRightWidth, BorderTopWidth, BorderBottomWidth: | ||||
| 		if border := getBorder(view, Border); border != nil { | ||||
| 			updateCSSProperty(htmlID, BorderWidth, border.cssWidthValue(session), session) | ||||
| 			session.updateCSSProperty(htmlID, BorderWidth, border.cssWidthValue(session)) | ||||
| 		} | ||||
| 		return | ||||
| 
 | ||||
| 	case Outline, OutlineColor, OutlineStyle, OutlineWidth: | ||||
| 		updateCSSProperty(htmlID, Outline, GetOutline(view).cssString(session), session) | ||||
| 		session.updateCSSProperty(htmlID, Outline, GetOutline(view).cssString(session)) | ||||
| 		return | ||||
| 
 | ||||
| 	case Shadow: | ||||
| 		updateCSSProperty(htmlID, "box-shadow", shadowCSS(view, Shadow, session), session) | ||||
| 		session.updateCSSProperty(htmlID, "box-shadow", shadowCSS(view, Shadow, session)) | ||||
| 		return | ||||
| 
 | ||||
| 	case TextShadow: | ||||
| 		updateCSSProperty(htmlID, "text-shadow", shadowCSS(view, TextShadow, session), session) | ||||
| 		session.updateCSSProperty(htmlID, "text-shadow", shadowCSS(view, TextShadow, session)) | ||||
| 		return | ||||
| 
 | ||||
| 	case Radius, RadiusX, RadiusY, RadiusTopLeft, RadiusTopLeftX, RadiusTopLeftY, | ||||
|  | @ -462,44 +462,44 @@ func viewPropertyChanged(view *viewData, tag string) { | |||
| 		RadiusBottomLeft, RadiusBottomLeftX, RadiusBottomLeftY, | ||||
| 		RadiusBottomRight, RadiusBottomRightX, RadiusBottomRightY: | ||||
| 		radius := GetRadius(view) | ||||
| 		updateCSSProperty(htmlID, "border-radius", radius.cssString(session), session) | ||||
| 		session.updateCSSProperty(htmlID, "border-radius", radius.cssString(session)) | ||||
| 		return | ||||
| 
 | ||||
| 	case Margin, MarginTop, MarginRight, MarginBottom, MarginLeft, | ||||
| 		"top-margin", "right-margin", "bottom-margin", "left-margin": | ||||
| 		margin := GetMargin(view) | ||||
| 		updateCSSProperty(htmlID, Margin, margin.cssString(session), session) | ||||
| 		session.updateCSSProperty(htmlID, Margin, margin.cssString(session)) | ||||
| 		return | ||||
| 
 | ||||
| 	case Padding, PaddingTop, PaddingRight, PaddingBottom, PaddingLeft, | ||||
| 		"top-padding", "right-padding", "bottom-padding", "left-padding": | ||||
| 		padding := GetPadding(view) | ||||
| 		updateCSSProperty(htmlID, Padding, padding.cssString(session), session) | ||||
| 		session.updateCSSProperty(htmlID, Padding, padding.cssString(session)) | ||||
| 		return | ||||
| 
 | ||||
| 	case AvoidBreak: | ||||
| 		if avoid, ok := boolProperty(view, AvoidBreak, session); ok { | ||||
| 			if avoid { | ||||
| 				updateCSSProperty(htmlID, "break-inside", "avoid", session) | ||||
| 				session.updateCSSProperty(htmlID, "break-inside", "avoid") | ||||
| 			} else { | ||||
| 				updateCSSProperty(htmlID, "break-inside", "auto", session) | ||||
| 				session.updateCSSProperty(htmlID, "break-inside", "auto") | ||||
| 			} | ||||
| 		} | ||||
| 		return | ||||
| 
 | ||||
| 	case Clip: | ||||
| 		if clip := getClipShape(view, Clip, session); clip != nil && clip.valid(session) { | ||||
| 			updateCSSProperty(htmlID, `clip-path`, clip.cssStyle(session), session) | ||||
| 			session.updateCSSProperty(htmlID, `clip-path`, clip.cssStyle(session)) | ||||
| 		} else { | ||||
| 			updateCSSProperty(htmlID, `clip-path`, "none", session) | ||||
| 			session.updateCSSProperty(htmlID, `clip-path`, "none") | ||||
| 		} | ||||
| 		return | ||||
| 
 | ||||
| 	case ShapeOutside: | ||||
| 		if clip := getClipShape(view, ShapeOutside, session); clip != nil && clip.valid(session) { | ||||
| 			updateCSSProperty(htmlID, ShapeOutside, clip.cssStyle(session), session) | ||||
| 			session.updateCSSProperty(htmlID, ShapeOutside, clip.cssStyle(session)) | ||||
| 		} else { | ||||
| 			updateCSSProperty(htmlID, ShapeOutside, "none", session) | ||||
| 			session.updateCSSProperty(htmlID, ShapeOutside, "none") | ||||
| 		} | ||||
| 		return | ||||
| 
 | ||||
|  | @ -510,7 +510,7 @@ func viewPropertyChanged(view *viewData, tag string) { | |||
| 				text = filter.cssStyle(session) | ||||
| 			} | ||||
| 		} | ||||
| 		updateCSSProperty(htmlID, tag, text, session) | ||||
| 		session.updateCSSProperty(htmlID, tag, text) | ||||
| 		return | ||||
| 
 | ||||
| 	case BackdropFilter: | ||||
|  | @ -524,8 +524,8 @@ func viewPropertyChanged(view *viewData, tag string) { | |||
| 		if buffer == nil { | ||||
| 			session.startUpdateScript(htmlID) | ||||
| 		} | ||||
| 		updateCSSProperty(htmlID, "-webkit-backdrop-filter", text, session) | ||||
| 		updateCSSProperty(htmlID, tag, text, session) | ||||
| 		session.updateCSSProperty(htmlID, "-webkit-backdrop-filter", text) | ||||
| 		session.updateCSSProperty(htmlID, tag, text) | ||||
| 		if buffer == nil { | ||||
| 			session.finishUpdateScript(htmlID) | ||||
| 		} | ||||
|  | @ -533,38 +533,38 @@ func viewPropertyChanged(view *viewData, tag string) { | |||
| 
 | ||||
| 	case FontName: | ||||
| 		if font, ok := stringProperty(view, FontName, session); ok { | ||||
| 			updateCSSProperty(htmlID, "font-family", font, session) | ||||
| 			session.updateCSSProperty(htmlID, "font-family", font) | ||||
| 		} else { | ||||
| 			updateCSSProperty(htmlID, "font-family", "", session) | ||||
| 			session.updateCSSProperty(htmlID, "font-family", "") | ||||
| 		} | ||||
| 		return | ||||
| 
 | ||||
| 	case Italic: | ||||
| 		if state, ok := boolProperty(view, tag, session); ok { | ||||
| 			if state { | ||||
| 				updateCSSProperty(htmlID, "font-style", "italic", session) | ||||
| 				session.updateCSSProperty(htmlID, "font-style", "italic") | ||||
| 			} else { | ||||
| 				updateCSSProperty(htmlID, "font-style", "normal", session) | ||||
| 				session.updateCSSProperty(htmlID, "font-style", "normal") | ||||
| 			} | ||||
| 		} else { | ||||
| 			updateCSSProperty(htmlID, "font-style", "", session) | ||||
| 			session.updateCSSProperty(htmlID, "font-style", "") | ||||
| 		} | ||||
| 		return | ||||
| 
 | ||||
| 	case SmallCaps: | ||||
| 		if state, ok := boolProperty(view, tag, session); ok { | ||||
| 			if state { | ||||
| 				updateCSSProperty(htmlID, "font-variant", "small-caps", session) | ||||
| 				session.updateCSSProperty(htmlID, "font-variant", "small-caps") | ||||
| 			} else { | ||||
| 				updateCSSProperty(htmlID, "font-variant", "normal", session) | ||||
| 				session.updateCSSProperty(htmlID, "font-variant", "normal") | ||||
| 			} | ||||
| 		} else { | ||||
| 			updateCSSProperty(htmlID, "font-variant", "", session) | ||||
| 			session.updateCSSProperty(htmlID, "font-variant", "") | ||||
| 		} | ||||
| 		return | ||||
| 
 | ||||
| 	case Strikethrough, Overline, Underline: | ||||
| 		updateCSSProperty(htmlID, "text-decoration", view.cssTextDecoration(session), session) | ||||
| 		session.updateCSSProperty(htmlID, "text-decoration", view.cssTextDecoration(session)) | ||||
| 		for _, tag2 := range []string{TextLineColor, TextLineStyle, TextLineThickness} { | ||||
| 			viewPropertyChanged(view, tag2) | ||||
| 		} | ||||
|  | @ -575,29 +575,29 @@ func viewPropertyChanged(view *viewData, tag string) { | |||
| 		return | ||||
| 
 | ||||
| 	case AnimationTag: | ||||
| 		updateCSSProperty(htmlID, AnimationTag, view.animationCSS(session), session) | ||||
| 		session.updateCSSProperty(htmlID, AnimationTag, view.animationCSS(session)) | ||||
| 		return | ||||
| 
 | ||||
| 	case AnimationPaused: | ||||
| 		paused, ok := boolProperty(view, AnimationPaused, session) | ||||
| 		if !ok { | ||||
| 			updateCSSProperty(htmlID, `animation-play-state`, ``, session) | ||||
| 			session.updateCSSProperty(htmlID, `animation-play-state`, ``) | ||||
| 		} else if paused { | ||||
| 			updateCSSProperty(htmlID, `animation-play-state`, `paused`, session) | ||||
| 			session.updateCSSProperty(htmlID, `animation-play-state`, `paused`) | ||||
| 		} else { | ||||
| 			updateCSSProperty(htmlID, `animation-play-state`, `running`, session) | ||||
| 			session.updateCSSProperty(htmlID, `animation-play-state`, `running`) | ||||
| 		} | ||||
| 		return | ||||
| 
 | ||||
| 	case ZIndex, TabSize: | ||||
| 		if i, ok := intProperty(view, tag, session, 0); ok { | ||||
| 			updateCSSProperty(htmlID, tag, strconv.Itoa(i), session) | ||||
| 			session.updateCSSProperty(htmlID, tag, strconv.Itoa(i)) | ||||
| 		} | ||||
| 		return | ||||
| 
 | ||||
| 	case Row, Column: | ||||
| 		if parent := view.parentHTMLID(); parent != "" { | ||||
| 			updateInnerHTML(parent, session) | ||||
| 		if parentID := view.parentHTMLID(); parentID != "" { | ||||
| 			updateInnerHTML(parentID, session) | ||||
| 		} | ||||
| 		return | ||||
| 
 | ||||
|  | @ -608,15 +608,15 @@ func viewPropertyChanged(view *viewData, tag string) { | |||
| 		} | ||||
| 		if userSelect, ok := boolProperty(view, UserSelect, session); ok { | ||||
| 			if userSelect { | ||||
| 				updateCSSProperty(htmlID, "-webkit-user-select", "auto", session) | ||||
| 				updateCSSProperty(htmlID, "user-select", "auto", session) | ||||
| 				session.updateCSSProperty(htmlID, "-webkit-user-select", "auto") | ||||
| 				session.updateCSSProperty(htmlID, "user-select", "auto") | ||||
| 			} else { | ||||
| 				updateCSSProperty(htmlID, "-webkit-user-select", "none", session) | ||||
| 				updateCSSProperty(htmlID, "user-select", "none", session) | ||||
| 				session.updateCSSProperty(htmlID, "-webkit-user-select", "none") | ||||
| 				session.updateCSSProperty(htmlID, "user-select", "none") | ||||
| 			} | ||||
| 		} else { | ||||
| 			updateCSSProperty(htmlID, "-webkit-user-select", "", session) | ||||
| 			updateCSSProperty(htmlID, "user-select", "", session) | ||||
| 			session.updateCSSProperty(htmlID, "-webkit-user-select", "") | ||||
| 			session.updateCSSProperty(htmlID, "user-select", "") | ||||
| 		} | ||||
| 		if buffer == nil { | ||||
| 			session.finishUpdateScript(htmlID) | ||||
|  | @ -626,7 +626,7 @@ func viewPropertyChanged(view *viewData, tag string) { | |||
| 
 | ||||
| 	if cssTag, ok := sizeProperties[tag]; ok { | ||||
| 		size, _ := sizeProperty(view, tag, session) | ||||
| 		updateCSSProperty(htmlID, cssTag, size.cssString("", session), session) | ||||
| 		session.updateCSSProperty(htmlID, cssTag, size.cssString("", session)) | ||||
| 		return | ||||
| 	} | ||||
| 
 | ||||
|  | @ -639,23 +639,23 @@ func viewPropertyChanged(view *viewData, tag string) { | |||
| 	} | ||||
| 	if cssTag, ok := colorTags[tag]; ok { | ||||
| 		if color, ok := colorProperty(view, tag, session); ok { | ||||
| 			updateCSSProperty(htmlID, cssTag, color.cssString(), session) | ||||
| 			session.updateCSSProperty(htmlID, cssTag, color.cssString()) | ||||
| 		} else { | ||||
| 			updateCSSProperty(htmlID, cssTag, "", session) | ||||
| 			session.updateCSSProperty(htmlID, cssTag, "") | ||||
| 		} | ||||
| 		return | ||||
| 	} | ||||
| 
 | ||||
| 	if valuesData, ok := enumProperties[tag]; ok && valuesData.cssTag != "" { | ||||
| 		n, _ := enumProperty(view, tag, session, 0) | ||||
| 		updateCSSProperty(htmlID, valuesData.cssTag, valuesData.cssValues[n], session) | ||||
| 		session.updateCSSProperty(htmlID, valuesData.cssTag, valuesData.cssValues[n]) | ||||
| 		return | ||||
| 	} | ||||
| 
 | ||||
| 	for _, floatTag := range []string{Opacity, ScaleX, ScaleY, ScaleZ, RotateX, RotateY, RotateZ} { | ||||
| 		if tag == floatTag { | ||||
| 			if f, ok := floatTextProperty(view, floatTag, session, 0); ok { | ||||
| 				updateCSSProperty(htmlID, floatTag, f, session) | ||||
| 				session.updateCSSProperty(htmlID, floatTag, f) | ||||
| 			} | ||||
| 			return | ||||
| 		} | ||||
|  |  | |||
|  | @ -250,15 +250,15 @@ func (view *viewData) updateTransformProperty(tag string) bool { | |||
| 			if x.Type != Auto || y.Type != Auto { | ||||
| 				value = x.cssString("50%", session) + " " + y.cssString("50%", session) | ||||
| 			} | ||||
| 			updateCSSProperty(htmlID, "perspective-origin", value, session) | ||||
| 			session.updateCSSProperty(htmlID, "perspective-origin", value) | ||||
| 		} | ||||
| 
 | ||||
| 	case BackfaceVisible: | ||||
| 		if getTransform3D(view, session) { | ||||
| 			if GetBackfaceVisible(view) { | ||||
| 				updateCSSProperty(htmlID, BackfaceVisible, "visible", session) | ||||
| 				session.updateCSSProperty(htmlID, BackfaceVisible, "visible") | ||||
| 			} else { | ||||
| 				updateCSSProperty(htmlID, BackfaceVisible, "hidden", session) | ||||
| 				session.updateCSSProperty(htmlID, BackfaceVisible, "hidden") | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
|  | @ -274,10 +274,10 @@ func (view *viewData) updateTransformProperty(tag string) bool { | |||
| 				value = x.cssString("50%", session) + " " + y.cssString("50%", session) | ||||
| 			} | ||||
| 		} | ||||
| 		updateCSSProperty(htmlID, "transform-origin", value, session) | ||||
| 		session.updateCSSProperty(htmlID, "transform-origin", value) | ||||
| 
 | ||||
| 	case SkewX, SkewY, TranslateX, TranslateY, TranslateZ, ScaleX, ScaleY, ScaleZ, Rotate, RotateX, RotateY, RotateZ: | ||||
| 		updateCSSProperty(htmlID, "transform", view.transform(session), session) | ||||
| 		session.updateCSSProperty(htmlID, "transform", view.transform(session)) | ||||
| 
 | ||||
| 	default: | ||||
| 		return false | ||||
|  |  | |||
							
								
								
									
										20
									
								
								webBrige.go
								
								
								
								
							
							
						
						
									
										20
									
								
								webBrige.go
								
								
								
								
							|  | @ -134,6 +134,26 @@ func (brige *wsBrige) runFunc(funcName string, args ...any) bool { | |||
| 	return true | ||||
| } | ||||
| 
 | ||||
| func (brige *wsBrige) updateInnerHTML(htmlID, html string) { | ||||
| 	brige.runFunc("updateInnerHTML", htmlID, html) | ||||
| } | ||||
| 
 | ||||
| func (brige *wsBrige) appendToInnerHTML(htmlID, html string) { | ||||
| 	brige.runFunc("appendToInnerHTML", htmlID, html) | ||||
| } | ||||
| 
 | ||||
| func (brige *wsBrige) updateCSSProperty(htmlID, property, value string) { | ||||
| 	brige.runFunc("updateCSSProperty", htmlID, property, value) | ||||
| } | ||||
| 
 | ||||
| func (brige *wsBrige) updateProperty(htmlID, property, value any) { | ||||
| 	brige.runFunc("updateProperty", htmlID, property, value) | ||||
| } | ||||
| 
 | ||||
| func (brige *wsBrige) removeProperty(htmlID, property string) { | ||||
| 	brige.runFunc("removeProperty", htmlID, property) | ||||
| } | ||||
| 
 | ||||
| func (brige *wsBrige) readMessage() (string, bool) { | ||||
| 	_, p, err := brige.conn.ReadMessage() | ||||
| 	if err != nil { | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue