agrobot_base/AgroBase/OperationControl/Controls/Pulverizador/PulverizadorIndicator.xaml

193 lines
12 KiB
XML

<UserControl x:Class="OperationControl.Controls.PulverizadorIndicator"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:OperationControl.Controls.Pulverizador"
mc:Ignorable="d" Width="458" Height="123">
<!-- ========= RECURSOS ========= -->
<UserControl.Resources>
<local:BicoPositionFisicaConverter x:Key="BicoPositionFisicaConverter" />
<local:AlturaBarraToMarginFisicaConverter x:Key="AlturaBarraToMarginFisicaConverter" GroundTop="80" Top80Px="7" AlturaMaxCm="80" />
<local:RuaWidthFisicaConverter x:Key="RuaWidthFisicaConverter" />
<local:RuaOffsetFisicaConverter x:Key="RuaOffsetFisicaConverter" />
<SolidColorBrush x:Key="BgBrush" Color="#FF101820"/>
<SolidColorBrush x:Key="CardBrush" Color="#FF1C2530"/>
<SolidColorBrush x:Key="LineBrush" Color="#FFB0BAC8"/>
<SolidColorBrush x:Key="AccentBrush" Color="#FF00A8E8"/>
<SolidColorBrush x:Key="CommandBrush" Color="#FFE74C3C"/>
<SolidColorBrush x:Key="SprayBrush" Color="#FF00A8E8"/>
<SolidColorBrush x:Key="TextPrimary" Color="#FFF5F7FA"/>
<SolidColorBrush x:Key="TextSecondary" Color="#FFB0BAC8"/>
<Style x:Key="Card" TargetType="Border">
<Setter Property="CornerRadius" Value="8"/>
<Setter Property="Background" Value="{StaticResource CardBrush}"/>
<Setter Property="Padding" Value="8"/>
<Setter Property="Margin" Value="0"/>
</Style>
<Style x:Key="SectionTitle" TargetType="TextBlock">
<Setter Property="Foreground" Value="{StaticResource TextSecondary}"/>
<Setter Property="FontSize" Value="12"/>
<Setter Property="FontWeight" Value="SemiBold"/>
<Setter Property="Margin" Value="0,0,0,6"/>
</Style>
</UserControl.Resources>
<!-- ========= LAYOUT ========= -->
<Grid Background="Transparent" Margin="0" ClipToBounds="True">
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<!-- Vista de trás -->
</Grid.RowDefinitions>
<!-- ===================== VISTA TRASEIRA / LEQUES ===================== -->
<Border Grid.Row="1" Style="{StaticResource Card}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<TextBlock Grid.Row="0" Text="" Style="{StaticResource SectionTitle}"/>
<Grid Grid.Row="1" Margin="10,0,10,-8">
<!-- Cota de altura à esquerda -->
<Canvas Width="50" HorizontalAlignment="Left">
<TextBlock Foreground="{StaticResource TextSecondary}" FontSize="10" Canvas.Top="-15" Canvas.Left="1" HorizontalAlignment="Left" VerticalAlignment="Center" Text="{Binding AlturaBarra, RelativeSource={RelativeSource AncestorType=UserControl}, StringFormat={}{0:F0} cm}" />
<Slider Minimum="50" Maximum="80" Value="{Binding AlturaBarra, RelativeSource={RelativeSource AncestorType=UserControl}, Mode=TwoWay}" Orientation="Vertical" Height="58" VerticalAlignment="Top" IsDirectionReversed="False" HorizontalAlignment="Center" Canvas.Left="5" />
</Canvas>
<!-- Bicos e leques (traseira) -->
<Canvas x:Name="canvasPai">
<Canvas.Margin>
<Binding Path="AlturaBarra" RelativeSource="{RelativeSource AncestorType=UserControl}" Converter="{StaticResource AlturaBarraToMarginFisicaConverter}" />
</Canvas.Margin>
<!-- Barra -->
<Line x:Name="linhaBarra" X1="4" Y1="10" X2="250" Y2="10" Stroke="{StaticResource LineBrush}" StrokeThickness="4" StrokeStartLineCap="Round" StrokeEndLineCap="Round" HorizontalAlignment="Left" VerticalAlignment="Center" Height="20" Canvas.Left="50" Canvas.Top="5" Width="256" />
<!-- Bicos dinâmicos -->
<ItemsControl ItemsSource="{Binding Bicos, RelativeSource={RelativeSource AncestorType=UserControl}}" AlternationCount="1000">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Canvas />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<!-- Define onde cada item fica no Canvas -->
<ItemsControl.ItemContainerStyle>
<Style TargetType="ContentPresenter">
<Setter Property="Canvas.Top" Value="-27" />
<Setter Property="Canvas.Left">
<Setter.Value>
<MultiBinding Converter="{StaticResource BicoPositionFisicaConverter}">
<!-- largura visível da barra em px -->
<Binding ElementName="linhaBarra" Path="ActualWidth" />
<!-- índice do bico (do modelo) -->
<Binding Path="Index" />
<!-- quantidade total de bicos -->
<Binding Path="QtdBicos" RelativeSource="{RelativeSource AncestorType=UserControl}" />
<!-- distância entre bicos em cm -->
<Binding Path="DistanciaEntreBicosCm" RelativeSource="{RelativeSource AncestorType=UserControl}" />
<!-- comprimento da barra em cm -->
<Binding Path="ComprimentoBarraCm" RelativeSource="{RelativeSource AncestorType=UserControl}" />
</MultiBinding>
</Setter.Value>
</Setter>
</Style>
</ItemsControl.ItemContainerStyle>
<!-- Como desenhar cada bico -->
<ItemsControl.ItemTemplate>
<DataTemplate DataType="{x:Type local:BicoModel}">
<local:BicoLequeIndicator AnguloControle="{Binding AnguloControle}" OpeningAngle="{Binding OpeningAngle}" IsCommandOn="{Binding IsCommandOn}" IsSpraying="{Binding IsSpraying}" Vazao="{Binding Vazao}" TempoAtuado="{Binding TempoAtuado}" Atuacoes="{Binding Atuacoes}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Canvas>
<!-- Bomba Pressurizadora -->
<Canvas Width="50" HorizontalAlignment="Right" Margin="0,0,0,0">
<!-- Título -->
<TextBlock Text="Bomba" FontSize="10" Canvas.Top="-30" Canvas.Left="10" TextAlignment="Right" Width="50">
<TextBlock.Style>
<Style TargetType="TextBlock" BasedOn="{StaticResource SectionTitle}">
<Setter Property="Foreground" Value="LightGray"/>
<Style.Triggers>
<!-- Quando a bomba estiver ligada -->
<DataTrigger Binding="{Binding IsBombaOn, RelativeSource={RelativeSource AncestorType=UserControl}}" Value="True">
<Setter Property="Foreground" Value="#4CD964"/>
</DataTrigger>
<!-- Quando desligada -->
<DataTrigger Binding="{Binding IsBombaOn, RelativeSource={RelativeSource AncestorType=UserControl}}" Value="False">
<Setter Property="Foreground" Value="#FFB0BAC8"/>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
<!-- Dados da bomba (pressão e tempo) -->
<StackPanel Orientation="Vertical" Canvas.Left="10" Canvas.Top="-18" TextBlock.TextAlignment="Right">
<!-- Linha 1: pressão -->
<TextBlock Text="Pressão" Foreground="{StaticResource TextSecondary}" FontSize="10"/>
<TextBlock Text="{Binding PressaoLinha, RelativeSource={RelativeSource AncestorType=UserControl}, StringFormat={}{0:F2} psi}" Foreground="{StaticResource TextPrimary}" FontSize="12" FontWeight="SemiBold" Margin="0,0,0,4"/>
<!-- Linha 2: tempo ligado -->
<TextBlock Text="Tempo" Foreground="{StaticResource TextSecondary}" FontSize="10"/>
<TextBlock Text="{Binding TempoAtuado, RelativeSource={RelativeSource AncestorType=UserControl}, StringFormat={}{0:F2} s}" Foreground="{StaticResource TextPrimary}" FontSize="12" FontWeight="SemiBold" Margin="0,0,0,4"/>
<!-- Linha 3: vazao -->
<TextBlock Text="Vazão" Foreground="{StaticResource TextSecondary}" FontSize="10"/>
<TextBlock Text="{Binding VazaoInstantanea, RelativeSource={RelativeSource AncestorType=UserControl}, StringFormat={}{0:F2} mL/s}" Foreground="{StaticResource TextPrimary}" FontSize="12" FontWeight="SemiBold"/>
</StackPanel>
</Canvas>
<!-- Solo + Rua -->
<Grid Height="13" VerticalAlignment="Top" Margin="-18,80,-18,0" ClipToBounds="True">
<!-- Cana (fundo) -->
<Border Background="#5F6A36" CornerRadius="0,0,8,8"/>
<!-- Rua (faixa vermelha que desliza) -->
<Border Height="13" HorizontalAlignment="Left" Background="#AA8B0000" CornerRadius="0,0,8,8">
<!-- Largura da rua em px -->
<Border.Width>
<MultiBinding Converter="{StaticResource RuaWidthFisicaConverter}">
<!-- largura em px da faixa do solo -->
<Binding RelativeSource="{RelativeSource AncestorType=Grid}" Path="ActualWidth"/>
<!-- largura da rua em cm -->
<Binding Path="LarguraRuaCm"/>
<!-- comprimento físico representado (cm) -->
<Binding Path="ComprimentoBarraCm"/>
</MultiBinding>
</Border.Width>
<!-- Deslocamento lateral da rua -->
<Border.Margin>
<MultiBinding Converter="{StaticResource RuaOffsetFisicaConverter}">
<!-- largura em px -->
<Binding RelativeSource="{RelativeSource AncestorType=Grid}" Path="ActualWidth"/>
<!-- erro lateral em cm (0 centro, - esquerda, + direita) -->
<Binding Path="ErroLateralCm"/>
<!-- largura rua cm -->
<Binding Path="LarguraRuaCm"/>
<!-- comprimento barra cm (escala px/cm) -->
<Binding Path="ComprimentoBarraCm"/>
</MultiBinding>
</Border.Margin>
</Border>
</Grid>
</Grid>
</Grid>
</Border>
</Grid>
</UserControl>