agrobot_base/AgroBase/OperationControl/Mapas/Editing/Views/MapaEditorOverlay.xaml.cs

517 lines
17 KiB
C#

using System.Windows;
using UserControl = System.Windows.Controls.UserControl;
namespace OperationControl.Mapas.Editing.Views
{
public partial class MapaEditorOverlay : UserControl
{
public event Action<MapaFerramentaEdicao>? 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<MapaEscopoRecorte>? EscopoRecorteAlterado;
public event Action<MapaAcaoBordaGnss>? 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);
}
}
}