Updated transition

This commit is contained in:
Alexei Anoshenko 2022-08-10 15:36:38 +03:00
parent 9af68bc5f3
commit f3f3ddb084
7 changed files with 94 additions and 31 deletions

View File

@ -4,7 +4,9 @@
* The "interface{}" type replaced by "any"
* Added "overflow", "arrow", "arrow-align", "arrow-size", "arrow-width", and "arrow-offset" properties
* Added "@ruiArrowSize" and "@ruiArrowWidth" constants to the default theme
* Added the GetOverflow function
* Added Transition, Transitions, and SetTransition functions to the ViewStyle interface
* Added GetOverflow, and GetTransitions functions
* Changed GetTransition functions
# v0.8.0

View File

@ -55,16 +55,19 @@ const (
// The animation plays forwards each cycle. In other words, each time the animation cycles,
// the animation will reset to the beginning state and start over again. This is the default value.
NormalAnimation = 0
// ReverseAnimation is value of the "animation-direction" property.
// The animation plays backwards each cycle. In other words, each time the animation cycles,
// the animation will reset to the end state and start over again. Animation steps are performed
// backwards, and timing functions are also reversed.
// For example, an "ease-in" timing function becomes "ease-out".
ReverseAnimation = 1
// AlternateAnimation is value of the "animation-direction" property.
// The animation reverses direction each cycle, with the first iteration being played forwards.
// The count to determine if a cycle is even or odd starts at one.
AlternateAnimation = 2
// AlternateReverseAnimation is value of the "animation-direction" property.
// The animation reverses direction each cycle, with the first iteration being played backwards.
// The count to determine if a cycle is even or odd starts at one.
@ -673,14 +676,38 @@ func (view *viewData) updateTransitionCSS() {
updateCSSProperty(view.htmlID(), "transition", view.transitionCSS(view.Session()), view.Session())
}
func (view *viewData) getTransitions() Params {
result := Params{}
for tag, animation := range view.transitions {
func (style *viewStyle) Transition(tag string) Animation {
if style.transitions != nil {
if anim, ok := style.transitions[tag]; ok {
return anim
}
}
return nil
}
func (style *viewStyle) Transitions() map[string]Animation {
result := map[string]Animation{}
for tag, animation := range style.transitions {
result[tag] = animation
}
return result
}
func (style *viewStyle) SetTransition(tag string, animation Animation) {
if animation == nil {
delete(style.transitions, tag)
} else {
style.transitions[tag] = 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())
}
}
// SetAnimated sets the property with name "tag" of the "rootView" subview with "viewID" id by value. Result:
// true - success,
// false - error (incompatible type or invalid format of a string value, see AppLog).
@ -697,38 +724,48 @@ func IsAnimationPaused(view View, subviewID string) bool {
return boolStyledProperty(view, subviewID, AnimationPaused, false)
}
// GetTransition returns the subview transitions. The result is always non-nil.
// GetTransitions returns the subview transitions. The result is always non-nil.
// If the second argument (subviewID) is "" then transitions of the first argument (view) is returned
func GetTransition(view View, subviewID string) Params {
func GetTransitions(view View, subviewID string) map[string]Animation {
if subviewID != "" {
view = ViewByID(view, subviewID)
}
if view != nil {
return view.getTransitions()
return view.Transitions()
}
return Params{}
return map[string]Animation{}
}
// GetTransition returns the subview property transition. If there is no transition for the given property then nil is returned.
// If the second argument (subviewID) is "" then transitions of the first argument (view) is returned
func GetTransition(view View, subviewID, tag string) Animation {
if subviewID != "" {
view = ViewByID(view, subviewID)
}
if view != nil {
return view.Transition(tag)
}
return nil
}
// AddTransition adds the transition for the subview property.
// If the second argument (subviewID) is "" then the transition is added to the first argument (view)
func AddTransition(view View, subviewID, tag string, animation Animation) bool {
if tag == "" {
return false
}
if tag != "" {
if subviewID != "" {
view = ViewByID(view, subviewID)
}
if subviewID != "" {
view = ViewByID(view, subviewID)
if view != nil {
view.SetTransition(tag, animation)
return true
}
}
if view == nil {
return false
}
transitions := view.getTransitions()
transitions[tag] = animation
return view.Set(Transition, transitions)
return false
}
// GetAnimation returns the subview animations. The result is always non-nil.

View File

@ -264,9 +264,22 @@ func (customView *CustomViewData) setScroll(x, y, width, height float64) {
}
}
func (customView *CustomViewData) getTransitions() Params {
func (customView *CustomViewData) Transition(tag string) Animation {
if customView.superView != nil {
return customView.superView.getTransitions()
return customView.superView.Transition(tag)
}
return nil
}
func (customView *CustomViewData) Transitions() map[string]Animation {
if customView.superView != nil {
return customView.superView.Transitions()
}
return map[string]Animation{}
}
func (customView *CustomViewData) SetTransition(tag string, animation Animation) {
if customView.superView != nil {
customView.superView.SetTransition(tag, animation)
}
return Params{}
}

View File

@ -4,8 +4,8 @@ import (
"testing"
)
var stopTestLogFlag = false
var testLogDone chan int
// var stopTestLogFlag = false
// var testLogDone chan int
var ignoreTestLog = false
func createTestLog(t *testing.T, ignore bool) {

View File

@ -71,8 +71,6 @@ type View interface {
cssStyle(self View, builder cssBuilder)
addToCSSStyle(addCSS map[string]string)
getTransitions() Params
onResize(self View, x, y, width, height float64)
onItemResize(self View, index string, x, y, width, height float64)
setNoResizeEvent()

View File

@ -10,6 +10,16 @@ import (
// ViewStyle interface of the style of view
type ViewStyle interface {
Properties
// Transition returns the transition animation of the property. Returns nil is there is no transition animation.
Transition(tag string) Animation
// Transitions returns the map of transition animations. The result is always non-nil.
Transitions() map[string]Animation
// SetTransition sets the transition animation for the property if "animation" argument is not nil, and
// removes the transition animation of the property if "animation" argument is nil.
// The "tag" argument is the property name.
SetTransition(tag string, animation Animation)
cssViewStyle(buffer cssBuilder, session Session)
}
@ -741,7 +751,7 @@ func writePropertyValue(buffer *strings.Builder, tag string, value any, indent s
if animation := value[tag]; animation != nil {
buffer.WriteString(indent2)
animation.writeTransitionString(tag, buffer)
buffer.WriteString("\n")
buffer.WriteString(",\n")
}
}
buffer.WriteString(indent)
@ -822,6 +832,10 @@ func writeViewStyle(name string, view ViewStyle, buffer *strings.Builder, indent
}
}
if transitions := view.Transitions(); len(transitions) > 0 {
writeProperty(Transition, transitions)
}
indent = indent[:len(indent)-1]
buffer.WriteString(indent)
buffer.WriteString("}")

View File

@ -47,8 +47,7 @@ func (container *viewsContainerData) setParentID(parentID string) {
func (container *viewsContainerData) Views() []View {
if container.views == nil {
container.views = []View{}
}
if count := len(container.views); count > 0 {
} else if count := len(container.views); count > 0 {
views := make([]View, count)
copy(views, container.views)
return views