From 84c8c1e3d743d296617eef8df4938432503b5212 Mon Sep 17 00:00:00 2001 From: Alexei Anoshenko <2277098+anoshenko@users.noreply.github.com> Date: Wed, 1 Jul 2026 13:37:23 +0300 Subject: [PATCH] Added PopupDefault, PopupDefaultsSeq, and SetPopupDefaults methods to Session interface --- CHANGELOG.md | 2 +- popup.go | 74 +++++++++++++++++++++++++--------------------------- session.go | 55 ++++++++++++++++++++------------------ 3 files changed, 67 insertions(+), 64 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f1e396e..a98be13 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ * Removed "style-disabled" property and GetDisabledStyle function * Added GoogleFonts field to AppParams * Added functions: GetWhiteSpace, GetWordBreak, ScrollIntoViewIfNeeded -* Added Popups, PopupShowAnimation, and SetPopupShowAnimation methods to Session interface +* Added Popups, PopupDefault, PopupDefaultsSeq, and SetPopupDefaults methods to Session interface * Added DismissWithoutAnimation add SetHotKey methods to Popup interface * Added ViewSeq add ViewCount methods to ParentView interface * Added ToBoundsProperty method to Bounds struct diff --git a/popup.go b/popup.go index df855dd..b717991 100644 --- a/popup.go +++ b/popup.go @@ -798,14 +798,34 @@ func (popup *popupData) propertyChanged(tag PropertyName) { } } -func (popup *popupData) animationProperty() AnimationProperty { - _, _, defaultDuration, defaultTiming := popup.session.PopupShowAnimation() - - duration, _ := floatProperty(popup, ShowDuration, popup.session, defaultDuration) - timing, ok := stringProperty(popup, ShowTiming, popup.session) - if !ok { - timing = defaultTiming +func (popup *popupData) defaultPopupFloat(tag PropertyName, defaultValue float64) float64 { + if value := popup.session.PopupDefault(tag); value != nil { + if f, ok := valueToFloat(value, popup.session, defaultValue); ok { + return f + } else { + DebugLogF(`"%v" is an invalid float64 value`, value) + } } + return defaultValue +} + +func (popup *popupData) animationProperty() AnimationProperty { + timing, ok := stringProperty(popup, ShowTiming, popup.session) + if ok && !isTimingFunctionValid(timing) { + DebugLog(`"` + timing + `" is an invalid timing function`) + ok = false + } + + if !ok { + timing = EaseTiming + if value := popup.session.PopupDefault(ShowTiming); value != nil { + if text, ok := value.(string); ok && text != "" && isTimingFunctionValid(text) { + timing = text + } + } + } + duration, _ := floatProperty(popup, ShowDuration, popup.session, popup.defaultPopupFloat(ShowDuration, 1)) + return NewAnimationProperty(Params{ Duration: duration, TimingFunction: timing, @@ -967,12 +987,15 @@ func (popup *popupData) Show() { } func (popup *popupData) showTransformAndOpacity() (TransformProperty, float64) { - defaultTransform, defaultOpacity, _, _ := popup.session.PopupShowAnimation() - opacity, _ := floatProperty(popup, ShowOpacity, popup.session, defaultOpacity) + opacity, _ := floatProperty(popup, ShowOpacity, popup.session, popup.defaultPopupFloat(ShowOpacity, 1)) transform := getTransformProperty(popup, ShowTransform) if transform == nil { - transform = defaultTransform + if value := popup.session.PopupDefault(ShowTransform); value != nil { + if t, ok := value.(TransformProperty); ok { + transform = t + } + } } return transform, opacity @@ -1387,34 +1410,9 @@ func NewPopup(view View, param Params) Popup { popup.properties = map[PropertyName]any{} popup.hotkeys = map[string]func(Popup){} - defaultTransform, defaultOpacity, duration, timing := popup.session.PopupShowAnimation() - - if value, ok := param[ShowTransform]; ok { - if transform := valueToTransformProperty(value); transform != nil { - defaultTransform = transform - } else { - param[ShowTransform] = defaultTransform - } - } else if defaultTransform != nil { - param[ShowTransform] = defaultTransform - } - - if value, ok := param[ShowOpacity]; ok { - if opacity, _ := valueToFloat(value, popup.session, 1); opacity >= 0 && opacity < 1 { - defaultOpacity = opacity - } else { - param[ShowOpacity] = defaultOpacity - } - } else if defaultOpacity != 1 { - param[ShowOpacity] = defaultOpacity - } - - if defaultTransform != nil || defaultOpacity != 1 { - if _, ok := param[ShowDuration]; !ok { - param[ShowDuration] = duration - } - if _, ok := param[ShowTiming]; !ok { - param[ShowTiming] = timing + for tag, value := range popup.session.PopupDefaultsSeq() { + if _, ok := param[tag]; !ok && value != nil { + param[tag] = value } } diff --git a/session.go b/session.go index 61fc448..4c59e25 100644 --- a/session.go +++ b/session.go @@ -2,6 +2,8 @@ package rui import ( "fmt" + "iter" + "maps" "net/url" "slices" "strconv" @@ -112,16 +114,17 @@ type Session interface { // a description of the error is written to the log Set(viewID string, tag PropertyName, value any) bool - // PopupShowAnimation returns default popup animation parameters. - // Returns the default value for the properties: "show-transform", "show-opacity", "show-duration" and "show-timing". - PopupShowAnimation() (transform TransformProperty, opacity, duration float64, timing string) - // PopupShowAnimation returns a list of displayed popups or nil if there are no displayed popups. Popups() []Popup - // SetPopupShowAnimation sets default popup animation parameters. - // Sets the default value for the properties: "show-transform", "show-opacity", "show-duration" and "show-timing". - SetPopupShowAnimation(transform TransformProperty, opacity, duration float64, timing string) + // PopupDefault returns default values ​​for the Popup property + PopupDefault(tag PropertyName) any + + // PopupDefaultsSeq returns an iterator over all default values ​​for Popup properties + PopupDefaultsSeq() iter.Seq2[PropertyName, any] + + // SetPopupDefaults sets default values ​​for Popup properties + SetPopupDefaults(params Params) // DownloadFile downloads (saves) on the client side the file located at the specified path on the server. DownloadFile(path string) @@ -250,10 +253,7 @@ type sessionData struct { timers map[int]func(Session) nextTimerID int pauseTime int64 - popupTransform TransformProperty - popupOpacity float64 - popupDuration float64 - popupTiming string + popupDefaults Params } func newSession(app Application, id int, customTheme string, params DataObject) Session { @@ -274,9 +274,6 @@ func newSession(app Application, id int, customTheme string, params DataObject) session.hotkeys = map[string]func(Session){} session.timers = map[int]func(Session){} session.nextTimerID = 1 - session.popupOpacity = 1 - session.popupDuration = 1 - session.popupTiming = EaseTiming if customTheme != "" { if theme, ok := CreateThemeFromText(customTheme); ok { @@ -977,19 +974,27 @@ func (session *sessionData) StopTimer(timerID int) { } } -func (session *sessionData) SetPopupShowAnimation(transform TransformProperty, opacity, duration float64, timing string) { - session.popupTransform = transform - if opacity >= 0 && opacity <= 1 { - session.popupOpacity = opacity +func (session *sessionData) PopupDefault(tag PropertyName) any { + if value, ok := session.popupDefaults[tag]; ok { + return value } - if duration > 0 { - session.popupDuration = duration - } - if isTimingFunctionValid(timing) { - session.popupTiming = timing + return nil +} + +func (session *sessionData) PopupDefaultsSeq() iter.Seq2[PropertyName, any] { + return func(yield func(PropertyName, any) bool) { + for tag, value := range session.popupDefaults { + if !yield(tag, value) { + return + } + } } } -func (session *sessionData) PopupShowAnimation() (transform TransformProperty, opacity, duration float64, timing string) { - return session.popupTransform, session.popupOpacity, session.popupDuration, session.popupTiming +func (session *sessionData) SetPopupDefaults(params Params) { + if len(params) > 0 { + session.popupDefaults = maps.Clone(params) + } else { + session.popupDefaults = nil + } }