273 lines
9.5 KiB
C#
273 lines
9.5 KiB
C#
using AgroBase.Models;
|
|
using AgroBase.Models.Operacoes;
|
|
using OperationControl.Helpers;
|
|
using OperationControl.Models;
|
|
using OperationControl.Models.Operacao;
|
|
using System.Collections.ObjectModel;
|
|
using System.ComponentModel;
|
|
using System.Windows;
|
|
using System.Windows.Input;
|
|
using static AgroBase.Models.Enums;
|
|
using Brush = System.Windows.Media.Brush;
|
|
using Brushes = System.Windows.Media.Brushes;
|
|
|
|
namespace OperationControl.ViewModels.Views.Operacao
|
|
{
|
|
public class OperacaoRightViewModel : INotifyPropertyChanged
|
|
{
|
|
private bool _isCollapsed;
|
|
private RoverCardModel _roverSelecionado;
|
|
|
|
public OperacaoRightViewModel()
|
|
{
|
|
Rovers = new ObservableCollection<RoverCardModel>();
|
|
|
|
ToggleCollapseCommand = new RelayCommand(_ => ToggleCollapse());
|
|
SelecionarRoverCommand = new RelayCommand(p => SelecionarRover((p as RoverCardModel).NumeroSerie));
|
|
SelecionarSecaoCommand = new RelayCommand(p =>
|
|
{
|
|
if (p is SecaoRightBar secao)
|
|
SelecionarSecao(secao);
|
|
else if (p != null && Enum.TryParse<SecaoRightBar>(p.ToString(), out var secaoParseada))
|
|
SelecionarSecao(secaoParseada);
|
|
});
|
|
AcaoBotaoTopoCommand = new RelayCommand(_ => ExecutarAcaoBotaoTopo());
|
|
}
|
|
|
|
public event PropertyChangedEventHandler PropertyChanged;
|
|
public event Action<SecaoRightBar> SecaoSelecionadaChanged;
|
|
public event Action<RoverCardModel> RoverSelecionadoChanged;
|
|
|
|
public ObservableCollection<RoverCardModel> Rovers { get; }
|
|
|
|
public ICommand ToggleCollapseCommand { get; }
|
|
public ICommand SelecionarRoverCommand { get; }
|
|
public ICommand SelecionarSecaoCommand { get; }
|
|
public ICommand AcaoBotaoTopoCommand { get; }
|
|
|
|
public bool IsCollapsed
|
|
{
|
|
get => _isCollapsed;
|
|
set
|
|
{
|
|
if (_isCollapsed != value)
|
|
{
|
|
_isCollapsed = value;
|
|
OnPropertyChanged(nameof(IsCollapsed));
|
|
}
|
|
}
|
|
}
|
|
|
|
public RoverCardModel RoverSelecionado
|
|
{
|
|
get => _roverSelecionado;
|
|
set
|
|
{
|
|
if (_roverSelecionado != value)
|
|
{
|
|
_roverSelecionado = value;
|
|
OnPropertyChanged(nameof(RoverSelecionado));
|
|
OnPropertyChanged(nameof(SemRoverSelecionado));
|
|
OnPropertyChanged(nameof(ComRoverSelecionado));
|
|
CommandManager.InvalidateRequerySuggested();
|
|
}
|
|
}
|
|
}
|
|
|
|
public bool SemRoverSelecionado => RoverSelecionado == null;
|
|
public bool ComRoverSelecionado => RoverSelecionado != null;
|
|
|
|
public string QuantidadeRoversTexto => $"{Rovers.Count} rover(s) encontrado(s)";
|
|
|
|
private SecaoRightBar _secaoAtual = SecaoRightBar.Menu;
|
|
public SecaoRightBar SecaoAtual
|
|
{
|
|
get => _secaoAtual;
|
|
set
|
|
{
|
|
if (_secaoAtual != value)
|
|
{
|
|
_secaoAtual = value;
|
|
OnPropertyChanged(nameof(SecaoAtual));
|
|
OnPropertyChanged(nameof(EmMenu));
|
|
OnPropertyChanged(nameof(EmResumo));
|
|
OnPropertyChanged(nameof(EmParametrizacao));
|
|
OnPropertyChanged(nameof(EmControle));
|
|
OnPropertyChanged(nameof(BotaoTopoEhVoltar));
|
|
OnPropertyChanged(nameof(TextoBotaoTopo));
|
|
}
|
|
}
|
|
}
|
|
|
|
public bool EmResumo => SecaoAtual == SecaoRightBar.Resumo;
|
|
public bool EmParametrizacao => SecaoAtual == SecaoRightBar.Parametrizacao;
|
|
public bool EmControle => SecaoAtual == SecaoRightBar.Controle;
|
|
public bool EmMenu => !EmResumo && !EmControle && !EmParametrizacao;
|
|
|
|
public bool BotaoTopoEhVoltar => EmResumo || EmControle || EmParametrizacao;
|
|
|
|
public string TextoBotaoTopo => BotaoTopoEhVoltar ? "◀ Voltar" : "Trocar Rover";
|
|
|
|
private void ExecutarAcaoBotaoTopo()
|
|
{
|
|
if (BotaoTopoEhVoltar)
|
|
{
|
|
SelecionarSecao(SecaoRightBar.Menu);
|
|
}
|
|
else
|
|
{
|
|
SelecionarRover(null);
|
|
}
|
|
}
|
|
|
|
|
|
public void ToggleCollapse()
|
|
{
|
|
IsCollapsed = !IsCollapsed;
|
|
}
|
|
|
|
public void SelecionarRover(string roverId)
|
|
{
|
|
var rover = Rovers.FirstOrDefault(x => x.NumeroSerie == roverId);
|
|
RoverSelecionado = rover;
|
|
SelecionarSecao(RoverSelecionado != null ? SecaoRightBar.Menu : SecaoRightBar.SemRoverSelecionado);
|
|
RoverSelecionadoChanged?.Invoke(rover);
|
|
}
|
|
|
|
public void SelecionarSecao(SecaoRightBar secao)
|
|
{
|
|
SecaoAtual = secao;
|
|
|
|
SecaoSelecionadaChanged?.Invoke(secao);
|
|
}
|
|
|
|
public void DestacarRoverNoMapa(string? roverId)
|
|
{
|
|
foreach (var rover in Rovers)
|
|
rover.IsDestacadoNoMapa = !string.IsNullOrEmpty(roverId) && rover.NumeroSerie == roverId;
|
|
}
|
|
|
|
public void AtualizarListaRovers(params RoverCardModel[] rovers)
|
|
{
|
|
var origem = (rovers ?? Array.Empty<RoverCardModel>()).ToList();
|
|
|
|
// Remove os que não existem mais
|
|
for (int i = Rovers.Count - 1; i >= 0; i--)
|
|
{
|
|
var atual = Rovers[i];
|
|
bool aindaExiste = origem.Any(x => x.NumeroSerie == atual.NumeroSerie);
|
|
|
|
if (!aindaExiste)
|
|
Rovers.RemoveAt(i);
|
|
}
|
|
|
|
// Adiciona ou atualiza os existentes
|
|
foreach (var roverNovo in origem)
|
|
{
|
|
var roverExistente = Rovers.FirstOrDefault(x => x.NumeroSerie == roverNovo.NumeroSerie);
|
|
|
|
if (roverExistente == null)
|
|
{
|
|
Rovers.Add(roverNovo);
|
|
}
|
|
else
|
|
{
|
|
roverExistente.EquipamentoId = roverNovo.EquipamentoId;
|
|
roverExistente.Status = roverNovo.Status;
|
|
|
|
// se quiser refletir mudança de texto também:
|
|
// roverExistente.NumeroSerie = roverNovo.NumeroSerie; // normalmente não precisa se NS é a chave
|
|
|
|
// dispara props derivadas se necessário
|
|
// no caso de EquipamentoId, como é auto-property hoje, melhor virar property notificável se isso puder mudar
|
|
}
|
|
}
|
|
|
|
OnPropertyChanged(nameof(QuantidadeRoversTexto));
|
|
OnPropertyChanged(nameof(SemRoverSelecionado));
|
|
OnPropertyChanged(nameof(ComRoverSelecionado));
|
|
}
|
|
|
|
|
|
private void OnPropertyChanged(string nome)
|
|
{
|
|
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nome));
|
|
}
|
|
}
|
|
|
|
public class RoverCardModel : INotifyPropertyChanged
|
|
{
|
|
public event PropertyChangedEventHandler? PropertyChanged;
|
|
|
|
public string EquipamentoId { get; set; }
|
|
public string NumeroSerie { get; set; }
|
|
|
|
private StatusModulo _status;
|
|
public StatusModulo Status
|
|
{
|
|
get => _status;
|
|
set
|
|
{
|
|
if (_status != value)
|
|
{
|
|
_status = value;
|
|
OnPropertyChanged(nameof(Status));
|
|
OnPropertyChanged(nameof(StatusBrush));
|
|
OnPropertyChanged(nameof(StatusTexto));
|
|
}
|
|
}
|
|
}
|
|
|
|
private bool _isDestacadoNoMapa;
|
|
public bool IsDestacadoNoMapa
|
|
{
|
|
get => _isDestacadoNoMapa;
|
|
set
|
|
{
|
|
if (_isDestacadoNoMapa != value)
|
|
{
|
|
_isDestacadoNoMapa = value;
|
|
OnPropertyChanged(nameof(IsDestacadoNoMapa));
|
|
OnPropertyChanged(nameof(BordaCardBrush));
|
|
OnPropertyChanged(nameof(BordaCardThickness));
|
|
OnPropertyChanged(nameof(CardBackground));
|
|
}
|
|
}
|
|
}
|
|
|
|
public Brush StatusBrush =>
|
|
Status == StatusModulo.Operante ? Brushes.Green :
|
|
Status == StatusModulo.Desconectado ? Brushes.Gray :
|
|
Status == StatusModulo.Falha ? Brushes.Red :
|
|
Status == StatusModulo.Alerta ? Brushes.Yellow :
|
|
Status == StatusModulo.Conectado ? Brushes.Blue :
|
|
Brushes.Black;
|
|
|
|
public System.Windows.Media.Brush CardBackground => IsDestacadoNoMapa ? new System.Windows.Media.SolidColorBrush(System.Windows.Media.Color.FromRgb(58, 42, 18)) : new System.Windows.Media.SolidColorBrush(System.Windows.Media.Color.FromRgb(38, 38, 38));
|
|
public Brush BordaCardBrush => IsDestacadoNoMapa ? Brushes.Orange : StatusBrush;
|
|
public Thickness BordaCardThickness => IsDestacadoNoMapa ? new Thickness(3) : new Thickness(2);
|
|
|
|
public string EquipamentoTexto => $"Equipamento: {EquipamentoId}";
|
|
public string NumeroSerieTexto => $"NS: {NumeroSerie}";
|
|
public string StatusTexto => $"Status: {Status}";
|
|
|
|
private void OnPropertyChanged(string nome)
|
|
{
|
|
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nome));
|
|
}
|
|
}
|
|
|
|
public enum SecaoRightBar
|
|
{
|
|
SemRoverSelecionado = 0,
|
|
Menu = 1,
|
|
Resumo = 2,
|
|
Diagnostico = 3,
|
|
Parametrizacao = 4,
|
|
Controle = 5,
|
|
Historico = 6,
|
|
Pulverizador = 7,
|
|
}
|
|
|
|
}
|