diff --git a/PlantBox.Client/PlantBox.Client/Forms/Controls/StatusBar.xaml b/PlantBox.Client/PlantBox.Client/Forms/Controls/StatusBar.xaml new file mode 100644 index 0000000..13e6360 --- /dev/null +++ b/PlantBox.Client/PlantBox.Client/Forms/Controls/StatusBar.xaml @@ -0,0 +1,32 @@ + + + + + + + \ No newline at end of file diff --git a/PlantBox.Client/PlantBox.Client/Forms/Controls/StatusBar.xaml.cs b/PlantBox.Client/PlantBox.Client/Forms/Controls/StatusBar.xaml.cs new file mode 100644 index 0000000..607cf75 --- /dev/null +++ b/PlantBox.Client/PlantBox.Client/Forms/Controls/StatusBar.xaml.cs @@ -0,0 +1,133 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.CompilerServices; +using System.Text; +using System.Threading.Tasks; + +using Xamarin.Forms; +using Xamarin.Forms.Xaml; + +namespace PlantBox.Client.Forms.Controls.StatusBar +{ + [XamlCompilation(XamlCompilationOptions.Compile)] + public partial class StatusBar : ContentView + { + // Progress + public static readonly BindableProperty ProgressProperty = BindableProperty.Create(nameof(Progress), typeof(double), typeof(StatusBar)); + public double Progress + { + get => (double)GetValue(ProgressProperty); + set => SetValue(ProgressProperty, value); + } + // HintColor + public static readonly BindableProperty HintColorProperty = BindableProperty.Create(nameof(HintColor), typeof(Color), typeof(StatusBar)); + public Color HintColor + { + get => (Color)GetValue(HintColorProperty); + set => SetValue(HintColorProperty, value); + } + // ForegroundColor + public static readonly BindableProperty ForegroundColorProperty = BindableProperty.Create(nameof(ForegroundColor), typeof(Color), typeof(StatusBar)); + public Color ForegroundColor + { + get => (Color)GetValue(ForegroundColorProperty); + set => SetValue(ForegroundColorProperty, value); + } + // Image + public static readonly BindableProperty ImageProperty = BindableProperty.Create(nameof(Image), typeof(ImageSource), typeof(StatusBar)); + public ImageSource Image + { + get => (ImageSource)GetValue(ImageProperty); + set => SetValue(ImageProperty, value); + } + // Label + public static readonly BindableProperty LabelProperty = BindableProperty.Create(nameof(Label), typeof(string), typeof(StatusBar)); + public string Label + { + get => (string)GetValue(LabelProperty); + set => SetValue(LabelProperty, value); + } + // BoundHeight + public static readonly BindableProperty BoundHeightProperty = BindableProperty.Create(nameof(BoundHeight), typeof(double), typeof(StatusBar)); + public double BoundHeight + { + get => (double)GetValue(BoundHeightProperty); + set => SetValue(BoundHeightProperty, value); + } + // BoundColor + public static readonly BindableProperty BoundColorProperty = BindableProperty.Create(nameof(BoundColor), typeof(Color), typeof(StatusBar)); + public Color BoundColor + { + get => (Color)GetValue(BoundColorProperty); + set => SetValue(BoundColorProperty, value); + } + // LowerBound + public static readonly BindableProperty LowerBoundProperty = BindableProperty.Create(nameof(LowerBound), typeof(double), typeof(StatusBar), 0.2); + public double LowerBound + { + get => (double)GetValue(LowerBoundProperty); + set => SetValue(LowerBoundProperty, value); + } + // UpperBound + public static readonly BindableProperty UpperBoundProperty = BindableProperty.Create(nameof(UpperBound), typeof(double), typeof(StatusBar), 0.8); + public double UpperBound + { + get => (double)GetValue(UpperBoundProperty); + set => SetValue(UpperBoundProperty, value); + } + + public StatusBar() + { + InitializeComponent(); + + AbsoluteLayout.SetLayoutFlags(UpperBoundBar, AbsoluteLayoutFlags.PositionProportional | AbsoluteLayoutFlags.WidthProportional); + AbsoluteLayout.SetLayoutFlags(LowerBoundBar, AbsoluteLayoutFlags.PositionProportional | AbsoluteLayoutFlags.WidthProportional); + } + + protected override void OnPropertyChanged([CallerMemberName]string propertyName = null) + { + base.OnPropertyChanged(propertyName); + + if (propertyName == ProgressProperty.PropertyName) + { + new Animation + ( + x => AbsoluteLayout.SetLayoutBounds(ForegroundBar, new Rectangle(0, 1, 1, x)), + AbsoluteLayout.GetLayoutBounds(ForegroundBar).Height, + Progress, + Easing.CubicInOut + ).Commit(this, "Scale", 16, 1000); + } + if (propertyName == HintColorProperty.PropertyName) + { + BackgroundBar.BackgroundColor = HintColor; + } + if (propertyName == ForegroundColorProperty.PropertyName) + { + ForegroundBar.BackgroundColor = ForegroundColor; + label.TextColor = ForegroundColor; + } + if (propertyName == ImageProperty.PropertyName) + { + image.Source = Image; + } + if (propertyName == LabelProperty.PropertyName) + { + label.Text = Label; + } + if (propertyName == BoundHeightProperty.PropertyName || propertyName == LowerBoundProperty.PropertyName || propertyName == UpperBoundProperty.PropertyName) + { + // Y axis is reversed + double realBoundHeight = BoundHeight / BackgroundBar.Height; + AbsoluteLayout.SetLayoutBounds(LowerBoundBar, new Rectangle(0, 1 - LowerBound, 1, BoundHeight)); + AbsoluteLayout.SetLayoutBounds(UpperBoundBar, new Rectangle(0, 1 - UpperBound, 1, BoundHeight)); + } + if (propertyName == BoundColorProperty.PropertyName) + { + LowerBoundBar.BackgroundColor = BoundColor; + UpperBoundBar.BackgroundColor = BoundColor; + } + } + } +} \ No newline at end of file diff --git a/PlantBox.Client/PlantBox.Client/PlantBox.Client.csproj b/PlantBox.Client/PlantBox.Client/PlantBox.Client.csproj index f639f32..c61e328 100644 --- a/PlantBox.Client/PlantBox.Client/PlantBox.Client.csproj +++ b/PlantBox.Client/PlantBox.Client/PlantBox.Client.csproj @@ -43,6 +43,9 @@ MSBuild:UpdateDesignTimeXaml + + MSBuild:Compile + MSBuild:UpdateDesignTimeXaml