using OperationControl.Helpers; using System.ComponentModel; using System.Windows.Input; namespace OperationControl.ViewModels { public class PreparacaoMapaBottomViewModel : INotifyPropertyChanged { public event Action? CarregarMapaSolicitado; public event Action? FixarBaseSolicitado; private bool _fixacaoEmAndamento; public bool FixacaoEmAndamento { get => _fixacaoEmAndamento; set { if (_fixacaoEmAndamento != value) { _fixacaoEmAndamento = value; OnPropertyChanged(nameof(FixacaoEmAndamento)); OnPropertyChanged(nameof(PodeCarregarMapa)); OnPropertyChanged(nameof(PodeFixarBase)); } } } public bool PodeCarregarMapa => !FixacaoEmAndamento; public bool PodeFixarBase => true; private double _progressoFixacao; public double ProgressoFixacao { get => _progressoFixacao; set { if (_progressoFixacao != value) { _progressoFixacao = value; OnPropertyChanged(nameof(ProgressoFixacao)); OnPropertyChanged(nameof(ProgressoFixacaoTexto)); } } } public string ProgressoFixacaoTexto => $"{ProgressoFixacao:F0}%"; private string _statusTexto = "Pronto para carregar o mapa e fixar a base."; public string StatusTexto { get => _statusTexto; set { if (_statusTexto != value) { _statusTexto = value; OnPropertyChanged(nameof(StatusTexto)); } } } private string _textoBotaoFixarBase = "Fixar posição da base"; public string TextoBotaoFixarBase { get => _textoBotaoFixarBase; set { if (_textoBotaoFixarBase != value) { _textoBotaoFixarBase = value; OnPropertyChanged(nameof(TextoBotaoFixarBase)); } } } public ICommand CarregarMapaCommand { get; } public ICommand FixarBaseCommand { get; } public PreparacaoMapaBottomViewModel() { CarregarMapaCommand = new RelayCommand(_ => ExecutarCarregarMapa(), _ => PodeCarregarMapa); FixarBaseCommand = new RelayCommand(_ => ExecutarFixarBase(), _ => PodeFixarBase); } private void ExecutarCarregarMapa() { var dlg = new OpenFileDialog { Filter = "Arquivos de mapa|*.geojson;*.json;*.shp", Title = "Selecione o arquivo de mapa" }; if (dlg.ShowDialog() == DialogResult.OK) { StatusTexto = $"Mapa selecionado: {System.IO.Path.GetFileName(dlg.FileName)}"; CarregarMapaSolicitado?.Invoke(dlg.FileName); } } private void ExecutarFixarBase() { FixarBaseSolicitado?.Invoke(); } public void AtualizarProgresso(double progresso, string status) { ProgressoFixacao = progresso; StatusTexto = status; } public void IniciarFixacao() { FixacaoEmAndamento = true; TextoBotaoFixarBase = "Parar"; ProgressoFixacao = 0; StatusTexto = "Iniciando fixação da posição da base..."; } public void FinalizarFixacao(bool sucesso, string? mensagem = null) { FixacaoEmAndamento = false; TextoBotaoFixarBase = "Fixar posição da base"; ProgressoFixacao = sucesso ? 100 : ProgressoFixacao; if (!string.IsNullOrWhiteSpace(mensagem)) StatusTexto = mensagem; else StatusTexto = sucesso ? "Fixação da base concluída com sucesso." : "Fixação da base encerrada."; } public void CancelarFixacao(string? mensagem = null) { FixacaoEmAndamento = false; TextoBotaoFixarBase = "Fixar posição da base"; StatusTexto = mensagem ?? "Fixação da base cancelada."; } public event PropertyChangedEventHandler? PropertyChanged; private void OnPropertyChanged(string nome) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nome)); System.Windows.Input.CommandManager.InvalidateRequerySuggested(); } } }