using System.Windows; using UserControl = System.Windows.Controls.UserControl; namespace OperationControl.Mapas.Editing.Views { public partial class MapaEditorOverlay : UserControl { public event Action? FerramentaSelecionada; public event Action? LimparSelecaoSolicitado; public event Action? DesfazerSolicitado; public event Action? RefazerSolicitado; public event Action? ExcluirSelecionadasSolicitado; public event Action? AplicarEdicaoSolicitado; public event Action? CancelarEdicaoSolicitado; public event Action? EscopoRecorteAlterado; public event Action? BordaGnssAcaoSolicitada; public event Action? RestaurarMapaFonteSolicitado; private bool _atualizandoEstado; public MapaEditorOverlay() { InitializeComponent(); } public void DefinirEstado( bool ativo, MapaFerramentaEdicao ferramenta, int quantidadeSelecionadas, bool modificado, bool podeDesfazer, bool podeRefazer, MapaEscopoRecorte escopoRecorte = MapaEscopoRecorte.TodasRuasAtingidas, MapaResumoBordaGnss? bordaGnss = null, bool possuiMapaFonte = false) { Visibility = ativo ? Visibility.Visible : Visibility.Collapsed; if (!ativo) return; _atualizandoEstado = true; try { bool ferramentaRecorte = ferramenta == MapaFerramentaEdicao.RecorteLivre || ferramenta == MapaFerramentaEdicao.RecortePorPontos || ferramenta == MapaFerramentaEdicao.RecorteBordaGnss; pnlEscopoRecorte.Visibility = ferramentaRecorte ? Visibility.Visible : Visibility.Collapsed; rbRecorteTodas.IsChecked = escopoRecorte == MapaEscopoRecorte.TodasRuasAtingidas; rbRecorteSelecionadas.IsChecked = escopoRecorte == MapaEscopoRecorte.SomenteRuasSelecionadas; bool avisarSemSelecao = ferramentaRecorte && escopoRecorte == MapaEscopoRecorte.SomenteRuasSelecionadas && quantidadeSelecionadas <= 0; txtEscopoRecorteAviso.Visibility = avisarSemSelecao ? Visibility.Visible : Visibility.Collapsed; } finally { _atualizandoEstado = false; } btnDesfazer.IsEnabled = podeDesfazer; btnRefazer.IsEnabled = podeRefazer; btnSelecionar.IsChecked = ferramenta == MapaFerramentaEdicao.Selecionar; btnSelecionarRetangulo.IsChecked = ferramenta == MapaFerramentaEdicao.SelecionarRetangulo; btnRecorteLivre.IsChecked = ferramenta == MapaFerramentaEdicao.RecorteLivre; btnRecortePorPontos.IsChecked = ferramenta == MapaFerramentaEdicao.RecortePorPontos; btnExcluirSelecionadas.IsEnabled = quantidadeSelecionadas > 0; btnLimparSelecao.IsEnabled = quantidadeSelecionadas > 0; btnAplicarEdicao.IsEnabled = modificado; btnCancelarEdicao.IsEnabled = ativo; btnRecorteBordaGnss.IsChecked = ferramenta == MapaFerramentaEdicao.RecorteBordaGnss; btnRestaurarMapaFonte.IsEnabled = possuiMapaFonte; bool exibindoBordaGnss = ferramenta == MapaFerramentaEdicao.RecorteBordaGnss; pnlBordaGnss.Visibility = exibindoBordaGnss ? Visibility.Visible : Visibility.Collapsed; if (exibindoBordaGnss && bordaGnss != null) { rbGnssManual.IsChecked = bordaGnss.Modo == MapaModoCapturaGnss.Manual; bool automatico = bordaGnss.Modo == MapaModoCapturaGnss.Automatico; bool gravandoAutomatico = bordaGnss.GravacaoAutomaticaAtiva; rbGnssManual.IsChecked = !automatico; rbGnssAutomatico.IsChecked = automatico; /* * Não permitimos trocar de modo * no meio de uma gravação ou depois * da borda finalizada. */ bool podeTrocarModo = !bordaGnss.Finalizada && !gravandoAutomatico; rbGnssManual.IsEnabled = podeTrocarModo; rbGnssAutomatico.IsEnabled = podeTrocarModo; btnGnssRegistrarPonto.Visibility = !automatico && !bordaGnss.Finalizada ? Visibility.Visible : Visibility.Collapsed; btnGnssRegistrarPonto.IsEnabled = !automatico && bordaGnss.CapturaAtiva && bordaGnss.LeituraGnssValida; btnGnssIniciarAutomatico.Visibility = automatico && !bordaGnss.Finalizada && !gravandoAutomatico ? Visibility.Visible : Visibility.Collapsed; btnGnssIniciarAutomatico.IsEnabled = automatico && !bordaGnss.Finalizada && !gravandoAutomatico && bordaGnss.LeituraGnssValida; btnGnssRemoverUltimo.IsEnabled = !bordaGnss.Finalizada && bordaGnss.QuantidadePontos > 0 && !gravandoAutomatico; bool podeFinalizar = bordaGnss.QuantidadePontos >= 2 && ( !automatico || gravandoAutomatico ); btnGnssFinalizar.IsEnabled = podeFinalizar; btnGnssFinalizar.Visibility = bordaGnss.Finalizada ? Visibility.Collapsed : ( automatico && !gravandoAutomatico ? Visibility.Collapsed : Visibility.Visible ); btnGnssFinalizar.Content = automatico ? "■ Finalizar gravação" : "✓ Finalizar borda"; txtBordaGnssResumo.Text = $"{bordaGnss.QuantidadePontos} " + $"{(bordaGnss.QuantidadePontos == 1 ? "ponto" : "pontos")} " + $"• {bordaGnss.ComprimentoMetros:F2} m"; txtGnssAutomaticoInfo.Visibility = automatico ? Visibility.Visible : Visibility.Collapsed; txtGnssAutomaticoInfo.Text = $"Registro automático a cada " + $"{bordaGnss.DistanciaMinimaAutomaticaMetros:F2} m"; txtBordaGnssEstado.Text = bordaGnss.Finalizada ? "PRONTA" : automatico ? ( gravandoAutomatico ? "GRAVANDO" : "PRONTO" ) : "CAPTURANDO"; txtBordaGnssStatus.Text = bordaGnss.StatusGnss; txtBordaGnssStatus.Foreground = bordaGnss.LeituraGnssValida ? ( bordaGnss.QualidadeAlta ? new System.Windows.Media .SolidColorBrush( System.Windows.Media .Color .FromRgb( 95, 207, 128 ) ) : new System.Windows.Media .SolidColorBrush( System.Windows.Media .Color .FromRgb( 240, 180, 91 ) ) ) : new System.Windows.Media .SolidColorBrush( System.Windows.Media .Color .FromRgb( 240, 100, 100 ) ); txtBordaGnssEstado.Text = bordaGnss.Finalizada ? "PRONTA" : "CAPTURANDO"; txtBordaGnssEstado.Foreground = bordaGnss.Finalizada ? System.Windows.Media.Brushes .DeepSkyBlue : new System.Windows.Media .SolidColorBrush( System.Windows.Media .Color .FromRgb( 95, 207, 128 ) ); btnGnssRegistrarPonto.IsEnabled = bordaGnss.CapturaAtiva && bordaGnss.LeituraGnssValida; btnGnssRemoverUltimo.IsEnabled = bordaGnss.CapturaAtiva && bordaGnss.QuantidadePontos > 0; btnGnssFinalizar.IsEnabled = bordaGnss.CapturaAtiva && bordaGnss.QuantidadePontos >= 2; btnGnssFinalizar.Visibility = bordaGnss.Finalizada ? Visibility.Collapsed : Visibility.Visible; btnGnssContinuar.Visibility = bordaGnss.Finalizada ? Visibility.Visible : Visibility.Collapsed; btnGnssDescartar.IsEnabled = bordaGnss.QuantidadePontos > 0; bool escopoBordaValido = escopoRecorte != MapaEscopoRecorte .SomenteRuasSelecionadas || quantidadeSelecionadas > 0; btnGnssAplicarBorda.Visibility = bordaGnss.Finalizada ? Visibility.Visible : Visibility.Collapsed; btnGnssAplicarBorda.IsEnabled = bordaGnss.Finalizada && bordaGnss.QuantidadePontos >= 2 && escopoBordaValido; } txtSelecionadas.Text = quantidadeSelecionadas switch { 0 => "Nenhuma rua selecionada", 1 => "1 rua selecionada", _ => $"{quantidadeSelecionadas} ruas selecionadas" }; txtInstrucao.Text = ferramenta switch { MapaFerramentaEdicao.Selecionar => "Clique nas ruas que deseja editar.", MapaFerramentaEdicao.SelecionarRetangulo => "Arraste para selecionar ruas. Ctrl + arraste para mover o mapa.", MapaFerramentaEdicao.RecorteLivre => "Arraste contornando a área a remover. Ctrl + arraste move o mapa.", MapaFerramentaEdicao.SelecionarPoligono => "Defina os vértices da área desejada.", MapaFerramentaEdicao.RecortePorPontos => "Clique para marcar os vértices. Enter ou duplo clique conclui. Backspace remove o último ponto. Esc descarta o traçado.", MapaFerramentaEdicao.RecorteBordaGnss => "Registre a borda real usando GNSS.", _ => "Selecione uma ferramenta." }; } private void btnSelecionar_Click(object sender, RoutedEventArgs e) { FerramentaSelecionada?.Invoke(MapaFerramentaEdicao.Selecionar); } private void btnSelecionarRetangulo_Click(object sender, RoutedEventArgs e) { FerramentaSelecionada?.Invoke(MapaFerramentaEdicao.SelecionarRetangulo); } private void btnRecorteLivre_Click(object sender, RoutedEventArgs e) { FerramentaSelecionada?.Invoke(MapaFerramentaEdicao.RecorteLivre); } private void btnRecortePorPontos_Click(object sender, RoutedEventArgs e) { FerramentaSelecionada?.Invoke(MapaFerramentaEdicao.RecortePorPontos); } private void btnLimparSelecao_Click(object sender, RoutedEventArgs e) { LimparSelecaoSolicitado?.Invoke(); } private void btnDesfazer_Click(object sender, RoutedEventArgs e) { DesfazerSolicitado?.Invoke(); } private void btnRefazer_Click(object sender, RoutedEventArgs e) { RefazerSolicitado?.Invoke(); } private void btnExcluirSelecionadas_Click(object sender, RoutedEventArgs e) { ExcluirSelecionadasSolicitado?.Invoke(); } private void rbRecorteTodas_Checked(object sender, RoutedEventArgs e) { if (_atualizandoEstado) return; EscopoRecorteAlterado?.Invoke(MapaEscopoRecorte.TodasRuasAtingidas); } private void rbRecorteSelecionadas_Checked(object sender, RoutedEventArgs e) { if (_atualizandoEstado) return; EscopoRecorteAlterado?.Invoke(MapaEscopoRecorte.SomenteRuasSelecionadas); } private void btnRecorteBordaGnss_Click(object sender, RoutedEventArgs e) { FerramentaSelecionada?.Invoke(MapaFerramentaEdicao.RecorteBordaGnss); } private void btnGnssRegistrarPonto_Click(object sender, RoutedEventArgs e) { BordaGnssAcaoSolicitada?.Invoke(MapaAcaoBordaGnss.RegistrarPonto); } private void btnGnssRemoverUltimo_Click(object sender, RoutedEventArgs e) { BordaGnssAcaoSolicitada?.Invoke(MapaAcaoBordaGnss.RemoverUltimo); } private void btnGnssFinalizar_Click(object sender, RoutedEventArgs e) { BordaGnssAcaoSolicitada?.Invoke(MapaAcaoBordaGnss.Finalizar); } private void btnGnssContinuar_Click(object sender, RoutedEventArgs e) { BordaGnssAcaoSolicitada?.Invoke(MapaAcaoBordaGnss.Continuar); } private void btnGnssDescartar_Click(object sender, RoutedEventArgs e) { BordaGnssAcaoSolicitada?.Invoke(MapaAcaoBordaGnss.Descartar); } private void btnGnssAplicarBorda_Click(object sender, RoutedEventArgs e) { BordaGnssAcaoSolicitada?.Invoke(MapaAcaoBordaGnss.Aplicar); } private void btnAplicarEdicao_Click(object sender, RoutedEventArgs e) { AplicarEdicaoSolicitado?.Invoke(); } private void btnCancelarEdicao_Click(object sender, RoutedEventArgs e) { CancelarEdicaoSolicitado?.Invoke(); } private void btnRestaurarMapaFonte_Click(object sender, RoutedEventArgs e) { RestaurarMapaFonteSolicitado?.Invoke(); } private void rbGnssManual_Checked(object sender, RoutedEventArgs e) { if (_atualizandoEstado) return; BordaGnssAcaoSolicitada?.Invoke(MapaAcaoBordaGnss.DefinirModoManual); } private void rbGnssAutomatico_Checked(object sender, RoutedEventArgs e) { if (_atualizandoEstado) return; BordaGnssAcaoSolicitada?.Invoke(MapaAcaoBordaGnss.DefinirModoAutomatico); } private void btnGnssIniciarAutomatico_Click(object sender, RoutedEventArgs e) { BordaGnssAcaoSolicitada?.Invoke(MapaAcaoBordaGnss.IniciarGravacaoAutomatica); } } }