123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- using Avalonia;
- using Avalonia.Controls;
- using Avalonia.Markup.Xaml;
- using System;
- namespace ShakerApp.Views;
- public partial class TimeControl : UserControl
- {
- public TimeControl()
- {
- InitializeComponent();
- }
- private bool changed = false;
- public static readonly StyledProperty<float> TimeProperty = AvaloniaProperty.Register<TimeControl, float>(nameof(Time), defaultBindingMode: Avalonia.Data.BindingMode.TwoWay, defaultValue: 0, coerce: static (obj, val) =>
- {
- if (obj is TimeControl control)
- {
- float time = val;
- if (control.changed) return val;
- control.changed = true;
- control.SetValue(HourProperty!, (uint)time / 3600);
- control.SetValue(MinuteProperty!, (byte)((uint)time / 60 % 60));
- control.SetValue(SecondProperty!, MathF.Floor((time - (control.Hour * 3600 + control.Minute * 60)) / control.Increment) * control.Increment);
- control.changed = false;
- }
- return val;
- });
- public float Time
- {
- get => GetValue(TimeProperty);
- set
- {
- var val = GetValue(TimeProperty);
- if (val == value) return;
- SetValue(TimeProperty, value);
- }
- }
- public static readonly StyledProperty<uint> HourProperty = AvaloniaProperty.Register<TimeControl, uint>(nameof(Hour), defaultValue: 0, coerce: (obj, val) =>
- {
- if (obj is TimeControl control)
- {
- control.SetValue(TimeProperty, control.Hour * 3600 + control.Minute * 60 + control.Second);
- }
- return val;
- });
- public uint Hour
- {
- get => GetValue(HourProperty);
- set
- {
- var val = GetValue(HourProperty);
- if (val == value) return;
- SetValue(HourProperty, value);
- }
- }
- public static readonly StyledProperty<byte> MinuteProperty = AvaloniaProperty.Register<TimeControl, byte>(nameof(Minute), defaultValue: 0, coerce:(obj,val)=>
- {
- byte temp = Math.Clamp(val, (byte)0, (byte)59);
- var control = (TimeControl)obj;
- control.SetValue(TimeProperty, control.Hour * 3600 + temp * 60 + control.Second);
- return temp;
- });
- public byte Minute
- {
- get => GetValue(MinuteProperty);
- set
- {
- var val = GetValue(MinuteProperty);
- if (val == value) return;
- SetValue(MinuteProperty, value);
- }
- }
- public static readonly StyledProperty<float> SecondProperty = AvaloniaProperty.Register<TimeControl, float>(nameof(Second), defaultValue: 0, coerce: (obj, val) =>
- {
- var control = (TimeControl)obj;
- float temp = Math.Clamp(val, 0f, 59f - control.Increment);
- control.SetValue(TimeProperty, control.Hour * 3600 + control.Minute * 60 + temp);
- return temp;
- });
- public float Second
- {
- get => GetValue(SecondProperty);
- set
- {
- var val = GetValue(SecondProperty);
- if (val == value) return;
- SetValue(SecondProperty, value);
- }
- }
- public static readonly StyledProperty<float> IncrementProperty = AvaloniaProperty.Register<TimeControl, float>(nameof(Increment), defaultValue:0.01f );
- public float Increment
- {
- get => GetValue(IncrementProperty);
- set => SetValue(IncrementProperty, value);
- }
- }
|