forked from mbk-lab/rui_orig
Communication optimisation
This commit is contained in:
parent
392a0a0288
commit
5e532a000f
10
animation.go
10
animation.go
|
@ -607,8 +607,12 @@ func (view *viewData) SetAnimated(tag string, value interface{}, animation Anima
|
|||
return view.Set(tag, value)
|
||||
}
|
||||
|
||||
updateProperty(view.htmlID(), "ontransitionend", "transitionEndEvent(this, event)", view.session)
|
||||
updateProperty(view.htmlID(), "ontransitioncancel", "transitionCancelEvent(this, event)", view.session)
|
||||
session := view.Session()
|
||||
htmlID := view.htmlID()
|
||||
session.startUpdateScript(htmlID)
|
||||
|
||||
updateProperty(htmlID, "ontransitionend", "transitionEndEvent(this, event)", view.session)
|
||||
updateProperty(htmlID, "ontransitioncancel", "transitionCancelEvent(this, event)", view.session)
|
||||
|
||||
if prevAnimation, ok := view.transitions[tag]; ok {
|
||||
view.singleTransition[tag] = prevAnimation
|
||||
|
@ -618,6 +622,8 @@ func (view *viewData) SetAnimated(tag string, value interface{}, animation Anima
|
|||
view.transitions[tag] = animation
|
||||
view.updateTransitionCSS()
|
||||
|
||||
session.finishUpdateScript(htmlID)
|
||||
|
||||
result := view.Set(tag, value)
|
||||
if !result {
|
||||
delete(view.singleTransition, tag)
|
||||
|
|
|
@ -231,7 +231,7 @@ function updateProperty(elementId, property, value) {
|
|||
}
|
||||
}
|
||||
|
||||
function removeProperty(elementId, property, value) {
|
||||
function removeProperty(elementId, property) {
|
||||
var element = document.getElementById(elementId);
|
||||
if (element && element.hasAttribute(property)) {
|
||||
element.removeAttribute(property);
|
||||
|
|
|
@ -104,6 +104,10 @@ type Session interface {
|
|||
|
||||
popupManager() *popupManager
|
||||
imageManager() *imageManager
|
||||
|
||||
startUpdateScript(htmlID string)
|
||||
updateScript(htmlID string) *strings.Builder
|
||||
finishUpdateScript(htmlID string)
|
||||
}
|
||||
|
||||
type sessionData struct {
|
||||
|
@ -134,6 +138,7 @@ type sessionData struct {
|
|||
events chan DataObject
|
||||
animationCounter int
|
||||
animationCSS string
|
||||
updateScripts map[string]*strings.Builder
|
||||
}
|
||||
|
||||
func newSession(app Application, id int, customTheme string, params DataObject) Session {
|
||||
|
@ -149,6 +154,7 @@ func newSession(app Application, id int, customTheme string, params DataObject)
|
|||
session.ignoreUpdates = false
|
||||
session.animationCounter = 0
|
||||
session.animationCSS = ""
|
||||
session.updateScripts = map[string]*strings.Builder{}
|
||||
|
||||
if customTheme != "" {
|
||||
if theme, ok := CreateThemeFromText(customTheme); ok {
|
||||
|
|
|
@ -2,8 +2,33 @@ package rui
|
|||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
)
|
||||
|
||||
func (session *sessionData) startUpdateScript(htmlID string) {
|
||||
buffer := allocStringBuilder()
|
||||
session.updateScripts[htmlID] = buffer
|
||||
buffer.WriteString("var element = document.getElementById('")
|
||||
buffer.WriteString(htmlID)
|
||||
buffer.WriteString("');\nif (element) {\n")
|
||||
}
|
||||
|
||||
func (session *sessionData) updateScript(htmlID string) *strings.Builder {
|
||||
if buffer, ok := session.updateScripts[htmlID]; ok {
|
||||
return buffer
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (session *sessionData) finishUpdateScript(htmlID string) {
|
||||
if buffer, ok := session.updateScripts[htmlID]; ok {
|
||||
buffer.WriteString("scanElementsSize();\n}\n")
|
||||
session.runScript(buffer.String())
|
||||
freeStringBuilder(buffer)
|
||||
delete(session.updateScripts, htmlID)
|
||||
}
|
||||
}
|
||||
|
||||
func sizeConstant(session Session, tag string) (SizeUnit, bool) {
|
||||
if text, ok := session.Constant(tag); ok {
|
||||
return StringToSizeUnit(text)
|
||||
|
@ -58,19 +83,36 @@ func appendToInnerHTML(htmlID, content string, session Session) {
|
|||
|
||||
func updateProperty(htmlID, property, value string, session Session) {
|
||||
if !session.ignoreViewUpdates() {
|
||||
session.runScript(fmt.Sprintf(`updateProperty('%v', '%v', '%v');`, htmlID, property, value))
|
||||
if buffer := session.updateScript(htmlID); buffer != nil {
|
||||
buffer.WriteString(fmt.Sprintf(`element.setAttribute('%v', '%v');`, property, value))
|
||||
buffer.WriteRune('\n')
|
||||
} else {
|
||||
session.runScript(fmt.Sprintf(`updateProperty('%v', '%v', '%v');`, htmlID, property, value))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func updateCSSProperty(htmlID, property, value string, session Session) {
|
||||
if !session.ignoreViewUpdates() {
|
||||
session.runScript(fmt.Sprintf(`updateCSSProperty('%v', '%v', '%v');`, htmlID, property, value))
|
||||
if buffer := session.updateScript(htmlID); buffer != nil {
|
||||
buffer.WriteString(fmt.Sprintf(`element.style['%v'] = '%v';`, property, value))
|
||||
buffer.WriteRune('\n')
|
||||
} else {
|
||||
session.runScript(fmt.Sprintf(`updateCSSProperty('%v', '%v', '%v');`, htmlID, property, value))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func updateBoolProperty(htmlID, property string, value bool, session Session) {
|
||||
if !session.ignoreViewUpdates() {
|
||||
if value {
|
||||
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 if value {
|
||||
session.runScript(fmt.Sprintf(`updateProperty('%v', '%v', true);`, htmlID, property))
|
||||
} else {
|
||||
session.runScript(fmt.Sprintf(`updateProperty('%v', '%v', false);`, htmlID, property))
|
||||
|
@ -80,7 +122,12 @@ func updateBoolProperty(htmlID, property string, value bool, session Session) {
|
|||
|
||||
func removeProperty(htmlID, property string, session Session) {
|
||||
if !session.ignoreViewUpdates() {
|
||||
session.runScript(fmt.Sprintf(`removeProperty('%v', '%v');`, htmlID, property))
|
||||
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.runScript(fmt.Sprintf(`removeProperty('%v', '%v');`, htmlID, property))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
28
view.go
28
view.go
|
@ -402,18 +402,32 @@ func viewPropertyChanged(view *viewData, tag string) {
|
|||
|
||||
case Border:
|
||||
if getBorder(view, Border) == nil {
|
||||
buffer := session.updateScript(htmlID)
|
||||
if buffer == nil {
|
||||
session.startUpdateScript(htmlID)
|
||||
}
|
||||
updateCSSProperty(htmlID, BorderWidth, "", session)
|
||||
updateCSSProperty(htmlID, BorderColor, "", session)
|
||||
updateCSSProperty(htmlID, BorderStyle, "none", session)
|
||||
if buffer == nil {
|
||||
session.finishUpdateScript(htmlID)
|
||||
}
|
||||
return
|
||||
}
|
||||
fallthrough
|
||||
|
||||
case BorderLeft, BorderRight, BorderTop, BorderBottom:
|
||||
if border := getBorder(view, Border); border != nil {
|
||||
buffer := session.updateScript(htmlID)
|
||||
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)
|
||||
if buffer == nil {
|
||||
session.finishUpdateScript(htmlID)
|
||||
}
|
||||
}
|
||||
return
|
||||
|
||||
|
@ -510,8 +524,15 @@ func viewPropertyChanged(view *viewData, tag string) {
|
|||
text = filter.cssStyle(session)
|
||||
}
|
||||
}
|
||||
buffer := session.updateScript(htmlID)
|
||||
if buffer == nil {
|
||||
session.startUpdateScript(htmlID)
|
||||
}
|
||||
updateCSSProperty(htmlID, "-webkit-backdrop-filter", text, session)
|
||||
updateCSSProperty(htmlID, tag, text, session)
|
||||
if buffer == nil {
|
||||
session.finishUpdateScript(htmlID)
|
||||
}
|
||||
return
|
||||
|
||||
case FontName:
|
||||
|
@ -585,6 +606,10 @@ func viewPropertyChanged(view *viewData, tag string) {
|
|||
return
|
||||
|
||||
case UserSelect:
|
||||
buffer := session.updateScript(htmlID)
|
||||
if buffer == nil {
|
||||
session.startUpdateScript(htmlID)
|
||||
}
|
||||
if userSelect, ok := boolProperty(view, UserSelect, session); ok {
|
||||
if userSelect {
|
||||
updateCSSProperty(htmlID, "-webkit-user-select", "auto", session)
|
||||
|
@ -597,6 +622,9 @@ func viewPropertyChanged(view *viewData, tag string) {
|
|||
updateCSSProperty(htmlID, "-webkit-user-select", "", session)
|
||||
updateCSSProperty(htmlID, "user-select", "", session)
|
||||
}
|
||||
if buffer == nil {
|
||||
session.finishUpdateScript(htmlID)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
|
|
12
viewUtils.go
12
viewUtils.go
|
@ -47,20 +47,20 @@ func SetChangeListener(view View, viewID, tag string, listener func(View, string
|
|||
// true - all properties were set successful,
|
||||
// false - error (incompatible type or invalid format of a string value, see AppLog).
|
||||
func SetParams(rootView View, viewID string, params Params) bool {
|
||||
var view View
|
||||
if viewID != "" {
|
||||
view = ViewByID(rootView, viewID)
|
||||
} else {
|
||||
view = rootView
|
||||
rootView = ViewByID(rootView, viewID)
|
||||
}
|
||||
if view == nil {
|
||||
if rootView == nil {
|
||||
return false
|
||||
}
|
||||
|
||||
session := rootView.Session()
|
||||
session.startUpdateScript(rootView.htmlID())
|
||||
result := true
|
||||
for tag, value := range params {
|
||||
result = view.Set(tag, value) && result
|
||||
result = rootView.Set(tag, value) && result
|
||||
}
|
||||
session.finishUpdateScript(rootView.htmlID())
|
||||
return result
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue