1
1
using System ;
2
2
using System . Linq ;
3
3
using System . Reactive . Subjects ;
4
+ using Avalonia . Controls . Primitives ;
4
5
using Avalonia . Controls . Shapes ;
5
6
using Avalonia . Controls . Templates ;
6
7
using Avalonia . Data ;
@@ -94,6 +95,67 @@ public void UseSeconds_Equals_False_Should_Hide_Seconds()
94
95
}
95
96
}
96
97
98
+ [ Fact ]
99
+ public void UseSeconds_Equals_False_Should_Have_Zero_Seconds ( )
100
+ {
101
+ using ( UnitTestApplication . Start ( Services ) )
102
+ {
103
+ TimePicker timePicker = new TimePicker ( )
104
+ {
105
+ UseSeconds = false ,
106
+ Template = CreateTemplate ( includePopup : true )
107
+ } ;
108
+ timePicker . ApplyTemplate ( ) ;
109
+
110
+ var desc = timePicker . GetVisualDescendants ( ) ;
111
+ Assert . True ( desc . Count ( ) > 2 ) ;
112
+
113
+ // find button
114
+ Assert . True ( desc . ElementAt ( 1 ) is Button ) ;
115
+ var btn = ( Button ) desc . ElementAt ( 1 ) ;
116
+
117
+ Assert . True ( desc . ElementAt ( 2 ) is Popup ) ;
118
+ var popup = ( Popup ) desc . ElementAt ( 2 ) ;
119
+
120
+ Assert . True ( popup . Child is TimePickerPresenter ) ;
121
+ var timePickerPresenter = ( TimePickerPresenter ) popup . Child ;
122
+
123
+ var panel = ( Panel ) timePickerPresenter . VisualChildren [ 0 ] ;
124
+ var acceptBtn = ( Button ) panel . VisualChildren [ 0 ] ;
125
+
126
+ Assert . False ( popup . IsOpen ) ;
127
+ btn . PerformClick ( ) ;
128
+ Assert . True ( popup . IsOpen ) ;
129
+ Assert . False ( timePickerPresenter . UseSeconds ) ;
130
+
131
+ acceptBtn . PerformClick ( ) ;
132
+
133
+ Assert . Equal ( 0 , timePickerPresenter . Time . Seconds ) ;
134
+ Assert . Equal ( 0 , timePicker . SelectedTime ? . Seconds ) ;
135
+ }
136
+ }
137
+
138
+ [ Fact ]
139
+ public void TimePickerPresenter_UseSeconds_Equals_False_Should_Have_Zero_Seconds ( )
140
+ {
141
+ using ( UnitTestApplication . Start ( Services ) )
142
+ {
143
+ TimePickerPresenter timePickerPresenter = new TimePickerPresenter ( )
144
+ {
145
+ UseSeconds = false ,
146
+ Template = CreatePickerTemplate ( ) ,
147
+ } ;
148
+ timePickerPresenter . ApplyTemplate ( ) ;
149
+
150
+ var panel = ( Panel ) timePickerPresenter . VisualChildren [ 0 ] ;
151
+ var acceptBtn = ( Button ) panel . VisualChildren [ 0 ] ;
152
+
153
+ acceptBtn . PerformClick ( ) ;
154
+
155
+ Assert . Equal ( 0 , timePickerPresenter . Time . Seconds ) ;
156
+ }
157
+ }
158
+
97
159
[ Fact ]
98
160
public void SelectedTime_null_Should_Use_Placeholders ( )
99
161
{
@@ -219,14 +281,15 @@ public void SelectedTime_EnableDataValidation()
219
281
textShaperImpl : new HeadlessTextShaperStub ( ) ,
220
282
renderInterface : new HeadlessPlatformRenderInterface ( ) ) ;
221
283
222
- private static IControlTemplate CreateTemplate ( )
284
+ private static IControlTemplate CreateTemplate ( bool includePopup = false )
223
285
{
224
286
return new FuncControlTemplate ( ( control , scope ) =>
225
287
{
226
288
var layoutRoot = new Grid
227
289
{
228
290
Name = "LayoutRoot"
229
291
} . RegisterInNameScope ( scope ) ;
292
+
230
293
//Skip contentpresenter
231
294
var flyoutButton = new Button
232
295
{
@@ -288,7 +351,7 @@ private static IControlTemplate CreateTemplate()
288
351
Name = "PART_SecondColumnDivider"
289
352
} . RegisterInNameScope ( scope ) ;
290
353
Grid . SetColumn ( secondSpacer , 3 ) ;
291
-
354
+
292
355
var thirdSpacer = new Rectangle
293
356
{
294
357
Name = "PART_ThirdColumnDivider"
@@ -298,8 +361,92 @@ private static IControlTemplate CreateTemplate()
298
361
contentGrid . Children . AddRange ( new Control [ ] { firstPickerHost , firstSpacer , secondPickerHost , secondSpacer , thirdPickerHost , thirdSpacer , fourthPickerHost } ) ;
299
362
flyoutButton . Content = contentGrid ;
300
363
layoutRoot . Children . Add ( flyoutButton ) ;
364
+
365
+ if ( includePopup )
366
+ {
367
+ var popup = new Popup
368
+ {
369
+ Name = "PART_Popup"
370
+ } . RegisterInNameScope ( scope ) ;
371
+
372
+ var pickerPresenter = new TimePickerPresenter
373
+ {
374
+ Name = "PART_PickerPresenter" ,
375
+ Template = CreatePickerTemplate ( )
376
+ } . RegisterInNameScope ( scope ) ;
377
+ pickerPresenter . ApplyTemplate ( ) ;
378
+
379
+ popup . Child = pickerPresenter ;
380
+
381
+ layoutRoot . Children . Add ( popup ) ;
382
+ }
383
+
301
384
return layoutRoot ;
302
385
} ) ;
303
386
}
387
+
388
+ private static IControlTemplate CreatePickerTemplate ( )
389
+ {
390
+ return new FuncControlTemplate ( ( control , scope ) =>
391
+ {
392
+ var acceptButton = new Button
393
+ {
394
+ Name = "PART_AcceptButton"
395
+ } . RegisterInNameScope ( scope ) ;
396
+
397
+ var hourSelector = new DateTimePickerPanel
398
+ {
399
+ Name = "PART_HourSelector" ,
400
+ PanelType = DateTimePickerPanelType . Hour ,
401
+ } . RegisterInNameScope ( scope ) ;
402
+
403
+ var minuteSelector = new DateTimePickerPanel
404
+ {
405
+ Name = "PART_MinuteSelector" ,
406
+ PanelType = DateTimePickerPanelType . Minute ,
407
+ } . RegisterInNameScope ( scope ) ;
408
+
409
+ var secondHost = new Panel
410
+ {
411
+ Name = "PART_SecondHost"
412
+ } . RegisterInNameScope ( scope ) ;
413
+
414
+ var secondSelector = new DateTimePickerPanel
415
+ {
416
+ Name = "PART_SecondSelector" ,
417
+ PanelType = DateTimePickerPanelType . Second ,
418
+ } . RegisterInNameScope ( scope ) ;
419
+
420
+ var periodHost = new Panel
421
+ {
422
+ Name = "PART_PeriodHost"
423
+ } . RegisterInNameScope ( scope ) ;
424
+
425
+ var periodSelector = new DateTimePickerPanel
426
+ {
427
+ Name = "PART_PeriodSelector" ,
428
+ PanelType = DateTimePickerPanelType . TimePeriod ,
429
+ } . RegisterInNameScope ( scope ) ;
430
+
431
+ var pickerContainer = new Grid
432
+ {
433
+ Name = "PART_PickerContainer"
434
+ } . RegisterInNameScope ( scope ) ;
435
+
436
+ var secondSpacer = new Rectangle
437
+ {
438
+ Name = "PART_SecondSpacer"
439
+ } . RegisterInNameScope ( scope ) ;
440
+
441
+ var thirdSpacer = new Rectangle
442
+ {
443
+ Name = "PART_ThirdSpacer"
444
+ } . RegisterInNameScope ( scope ) ;
445
+
446
+ var contentPanel = new StackPanel ( ) ;
447
+ contentPanel . Children . AddRange ( new Control [ ] { acceptButton , hourSelector , minuteSelector , secondHost , secondSelector , periodHost , periodSelector , pickerContainer , secondSpacer , thirdSpacer } ) ;
448
+ return contentPanel ;
449
+ } ) ;
450
+ }
304
451
}
305
452
}
0 commit comments