@@ -55,8 +55,36 @@ module ViewChat =
55 | None -> ()
55 | None -> ()
56 , Avalonia.Threading.DispatcherPriority.Background) |> ignore
56 , Avalonia.Threading.DispatcherPriority.Background) |> ignore
58− let private strokeTransition =
58+ let private ensureSolidifyStyle =
61+ Avalonia.Styling.Style(fun sel ->
62+ sel.OfType<Avalonia.Controls.Shapes.Rectangle>().Class("solidifying"))
64+ let anim = Avalonia.Animation.Animation()
59− DoubleTransition(Avalonia.Controls.Shapes.Shape.StrokeThicknessProperty, System.TimeSpan.FromMilliseconds 800.)
65+ anim.Duration <- System.TimeSpan.FromMilliseconds 600.
66+ anim.IterationCount <- Avalonia.Animation.IterationCount(1UL)
67+ anim.FillMode <- Avalonia.Animation.FillMode.Forward
70+ let t = float i / 10.
71+ let dash = 4. + 2. * t
72+ let gap = 2. - 2. * t
73+ let kf = Avalonia.Animation.KeyFrame()
74+ kf.Cue <- Avalonia.Animation.Cue(float32 t)
77+ Avalonia.Styling.Setter(
78+ Avalonia.Controls.Shapes.Shape.StrokeDashArrayProperty,
79+ box (Avalonia.Collections.AvaloniaList<float>([| dash; gap |]))))
82+ Avalonia.Styling.Setter(Avalonia.Controls.Shapes.Shape.StrokeDashOffsetProperty, box 0.))
84+ anim.Children.Add(kf)
86+ s.Animations.Add(anim)
87+ Avalonia.Application.Current.Styles.Add(s))
61 let private messageItem m =
89 let private messageItem m =
62 let align, cols, col =
90 let align, cols, col =
@@ -76,21 +104,25 @@ module ViewChat =
77 match m.Direction with
105 match m.Direction with
78 | Outgoing status ->
106 | Outgoing status ->
79− ensureMarchingAntsStyle.Force()
80 let isSent = status = DeliveryStatus.Sent
107 let isSent = status = DeliveryStatus.Sent
82− Rectangle()
109+ if isSent then
110+ ensureMarchingAntsStyle.Force()
83− .stroke(Avalonia.Media.Colors.Black)
113+ .stroke(Avalonia.Media.Colors.Black)
84− .strokeThickness(4.)
114+ .strokeThickness(4.)
85− .strokeDashArray([ 4.; 2. ])
115+ .strokeDashArray([ 4.; 2. ])
86− .isHitTestVisible(false)
116+ .isHitTestVisible(false)
87− .classes("marching")
117+ .classes("marching")
89− Rectangle()
119+ ensureSolidifyStyle.Force()
90− .stroke(Avalonia.Media.Colors.Black)
120+
91− .strokeThickness(if isSent then 0. else 4.)
121+ Rectangle()
122+ .stroke(Avalonia.Media.Colors.Black)
123+ .strokeThickness(4.)
92− .isHitTestVisible(false)
124+ .isHitTestVisible(false)
93− .transition (strokeTransition)
125+ .classes("solidifying")
94 | Incoming ->
126 | Incoming ->
95 Rectangle()
127 Rectangle()
96 .stroke(Avalonia.Media.Colors.Black)
128 .stroke(Avalonia.Media.Colors.Black)