Mejoras en App,xaml.cs desde Claude
This commit is contained in:
parent
f20ee01e22
commit
2caf2b96f5
224
App.xaml.cs
224
App.xaml.cs
|
@ -2,10 +2,9 @@
|
|||
using System.Data;
|
||||
using System.Windows;
|
||||
using System;
|
||||
using System.Windows;
|
||||
using System.Windows.Forms; // Necesitas agregar una referencia a System.Windows.Forms
|
||||
using System.Windows.Forms;
|
||||
using Application = System.Windows.Application;
|
||||
using System.Diagnostics; // Asegúrate de incluir esta directiva para usar Stopwatch
|
||||
using System.Diagnostics;
|
||||
using System.Threading.Tasks;
|
||||
using System.Globalization;
|
||||
using System.Windows.Data;
|
||||
|
@ -13,11 +12,6 @@ using System.Runtime.InteropServices;
|
|||
|
||||
namespace GTPCorrgir
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for App.xaml
|
||||
/// </summary>
|
||||
///
|
||||
|
||||
public partial class App : Application
|
||||
{
|
||||
gtpask GTP = new gtpask();
|
||||
|
@ -26,128 +20,199 @@ namespace GTPCorrgir
|
|||
bool CorreccionFinalizada = false;
|
||||
Stopwatch stopwatch = new Stopwatch();
|
||||
private notificacion notificationWindow;
|
||||
private readonly int TimeoutSeconds = 60; // Timeout máximo para esperar la respuesta
|
||||
private CancellationTokenSource _cancellationTokenSource;
|
||||
|
||||
KeyboardHelper pasteLogic = new KeyboardHelper();
|
||||
|
||||
protected override void OnStartup(StartupEventArgs e)
|
||||
{
|
||||
base.OnStartup(e);
|
||||
_cancellationTokenSource = new CancellationTokenSource();
|
||||
|
||||
pasteLogic.SaveCurrentWindow();
|
||||
|
||||
if (System.Windows.Clipboard.ContainsText())
|
||||
try
|
||||
{
|
||||
GTP.TextoACorregir = System.Windows.Clipboard.GetText();
|
||||
pasteLogic.SaveCurrentWindow();
|
||||
|
||||
if (System.Windows.Clipboard.ContainsText())
|
||||
{
|
||||
GTP.TextoACorregir = System.Windows.Clipboard.GetText();
|
||||
}
|
||||
|
||||
if (Opciones.Instance.modo == Opciones.modoDeUso.Corregir ||
|
||||
Opciones.Instance.modo == Opciones.modoDeUso.Ortografia)
|
||||
{
|
||||
GTP.Log.Log("Iniciando proceso de corrección");
|
||||
stopwatch.Start();
|
||||
|
||||
ShowCustomNotification("Espera", $"Corrigiendo texto con {Opciones.Instance.nombreDeLLM()}...");
|
||||
IniciarCronometro();
|
||||
|
||||
// Ejecuta la tarea de corrección con timeout
|
||||
_ = ProcessCorreccionWithTimeout();
|
||||
}
|
||||
else if (Opciones.Instance.modo == Opciones.modoDeUso.Chat)
|
||||
{
|
||||
var chatWindows = new Chat(GTP);
|
||||
chatWindows.Show();
|
||||
}
|
||||
}
|
||||
|
||||
if (Opciones.Instance.modo == Opciones.modoDeUso.Corregir || Opciones.Instance.modo == Opciones.modoDeUso.Ortografia)
|
||||
catch (Exception ex)
|
||||
{
|
||||
GTP.Log.Log($"Error en OnStartup: {ex.Message}");
|
||||
GTP.Log.Log($"StackTrace: {ex.StackTrace}");
|
||||
ShowCustomNotification("Error", "Se produjo un error al iniciar la aplicación");
|
||||
Application.Current.Shutdown();
|
||||
}
|
||||
}
|
||||
|
||||
stopwatch.Start();
|
||||
private async Task ProcessCorreccionWithTimeout()
|
||||
{
|
||||
try
|
||||
{
|
||||
using var timeoutCts = new CancellationTokenSource(TimeSpan.FromSeconds(TimeoutSeconds));
|
||||
using var linkedCts = CancellationTokenSource.CreateLinkedTokenSource(
|
||||
timeoutCts.Token, _cancellationTokenSource.Token);
|
||||
|
||||
// Muestra notificación inicial y comienza el cronómetro en el hilo de la UI
|
||||
ShowCustomNotification("Espera", $"Corrigiendo texto con .{Opciones.Instance.nombreDeLLM()} ..");
|
||||
IniciarCronometro();
|
||||
|
||||
|
||||
// Ejecuta la tarea de corrección en un hilo secundario
|
||||
Task.Run(async () =>
|
||||
var correccionTask = Task.Run(async () =>
|
||||
{
|
||||
try
|
||||
{
|
||||
GTP.Log.Log("Iniciando corrección de texto");
|
||||
await GTP.CorregirTexto();
|
||||
GTP.Log.Log("Corrección de texto completada");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine("Error durante la corrección de texto: " + ex.Message);
|
||||
GTP.Log.Log($"Error durante la corrección: {ex.Message}");
|
||||
throw;
|
||||
}
|
||||
}, linkedCts.Token);
|
||||
|
||||
await correccionTask;
|
||||
|
||||
await Dispatcher.InvokeAsync(async () =>
|
||||
{
|
||||
try
|
||||
{
|
||||
GTP.Log.Log("Procesando resultado de la corrección");
|
||||
CorreccionFinalizada = true;
|
||||
DetenerCronometro();
|
||||
|
||||
if (GTP.TextoCorregido != null)
|
||||
{
|
||||
GTP.Log.Log("Copiando texto corregido al portapapeles");
|
||||
System.Windows.Clipboard.SetText(GTP.TextoCorregido);
|
||||
ShowCustomNotification("Se puede pegar",
|
||||
$"Corrección en: {Math.Round(stopwatch.ElapsedMilliseconds / 1000.0, 1)} s");
|
||||
|
||||
if (Opciones.Instance.modo == Opciones.modoDeUso.Corregir)
|
||||
{
|
||||
GTP.Log.Log("Mostrando ventana de resultado");
|
||||
var resultadoWindow = new VentanaResultado(GTP.TextoCorregido);
|
||||
resultadoWindow.Show();
|
||||
await Task.Delay(1000);
|
||||
}
|
||||
else if (Opciones.Instance.modo == Opciones.modoDeUso.Ortografia)
|
||||
{
|
||||
GTP.Log.Log("Ejecutando pegado automático");
|
||||
pasteLogic.RestoreAndSimulatePaste();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
GTP.Log.Log("Error: TextoCorregido es null");
|
||||
ShowCustomNotification("Error", "No se pudo obtener el texto corregido");
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
GTP.Log.Log($"Error en el procesamiento final: {ex.Message}");
|
||||
ShowCustomNotification("Error", "Error al procesar el resultado");
|
||||
}
|
||||
finally
|
||||
{
|
||||
await Dispatcher.Invoke(async () => // Nota el 'async' aquí para permitir 'await'
|
||||
{
|
||||
CorreccionFinalizada = true;
|
||||
DetenerCronometro();
|
||||
if (GTP.TextoCorregido != null)
|
||||
{
|
||||
System.Windows.Clipboard.SetText(GTP.TextoCorregido);
|
||||
ShowCustomNotification("Se puede pegar", $"Corrección en : {Math.Round(stopwatch.ElapsedMilliseconds / 1000.0, 1)} s");
|
||||
|
||||
if (Opciones.Instance.modo == Opciones.modoDeUso.Corregir)
|
||||
{
|
||||
var resultadoWindow = new VentanaResultado(GTP.TextoCorregido);
|
||||
resultadoWindow.Show();
|
||||
await Task.Delay(1000); // Asíncrono espera 5 segundos
|
||||
}
|
||||
else if (Opciones.Instance.modo == Opciones.modoDeUso.Ortografia)
|
||||
pasteLogic.RestoreAndSimulatePaste();
|
||||
|
||||
Application.Current.Shutdown();
|
||||
}
|
||||
else
|
||||
{
|
||||
MostrarNotificacion("Error", "No se pudo corregir el texto.");
|
||||
Application.Current.Shutdown();
|
||||
}
|
||||
});
|
||||
GTP.Log.Log("Cerrando aplicación");
|
||||
Application.Current.Shutdown();
|
||||
}
|
||||
});
|
||||
} else if (Opciones.Instance.modo == Opciones.modoDeUso.Chat)
|
||||
{
|
||||
var chatWindows = new Chat(GTP);
|
||||
chatWindows.Show();
|
||||
}
|
||||
catch (OperationCanceledException)
|
||||
{
|
||||
GTP.Log.Log("Operación cancelada por timeout");
|
||||
await Dispatcher.InvokeAsync(() =>
|
||||
{
|
||||
ShowCustomNotification("Error", "La operación excedió el tiempo límite");
|
||||
Application.Current.Shutdown();
|
||||
});
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
GTP.Log.Log($"Error no controlado: {ex.Message}");
|
||||
await Dispatcher.InvokeAsync(() =>
|
||||
{
|
||||
ShowCustomNotification("Error", "Se produjo un error inesperado");
|
||||
Application.Current.Shutdown();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
protected override void OnExit(ExitEventArgs e)
|
||||
{
|
||||
_cancellationTokenSource?.Cancel();
|
||||
_cancellationTokenSource?.Dispose();
|
||||
base.OnExit(e);
|
||||
}
|
||||
|
||||
private void ShowCustomNotification(string title, string message)
|
||||
{
|
||||
if (notificationWindow == null)
|
||||
try
|
||||
{
|
||||
notificationWindow = new notificacion();
|
||||
notificationWindow.Show();
|
||||
GTP.Log.Log($"Mostrando notificación: {title} - {message}");
|
||||
if (notificationWindow == null)
|
||||
{
|
||||
notificationWindow = new notificacion();
|
||||
notificationWindow.Show();
|
||||
}
|
||||
notificationWindow.UpdateNotification(title, message);
|
||||
}
|
||||
|
||||
notificationWindow.UpdateNotification(title, message);
|
||||
}
|
||||
|
||||
private void MostrarNotificacion(string titulo, string mensaje)
|
||||
{
|
||||
notificacion = new NotifyIcon
|
||||
catch (Exception ex)
|
||||
{
|
||||
Icon = SystemIcons.Information,
|
||||
BalloonTipTitle = titulo,
|
||||
BalloonTipText = mensaje,
|
||||
Visible = true
|
||||
};
|
||||
notificacion.ShowBalloonTip(1000);
|
||||
GTP.Log.Log($"Error al mostrar notificación: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private void IniciarCronometro()
|
||||
{
|
||||
timer = new System.Windows.Forms.Timer();
|
||||
timer.Interval = 100; // 1000 milisegundos (1 segundo)
|
||||
timer.Interval = 100;
|
||||
timer.Tick += ActualizarCronometro;
|
||||
timer.Start();
|
||||
GTP.Log.Log("Cronómetro iniciado");
|
||||
}
|
||||
|
||||
private void ActualizarCronometro(object sender, EventArgs e)
|
||||
{
|
||||
if (!CorreccionFinalizada) {
|
||||
//notificacion.BalloonTipText = $"Texto en {GTP.IdiomaDetectado} pasados: {Math.Round(stopwatch.ElapsedMilliseconds/1000.0,1)} s";
|
||||
//notificacion.ShowBalloonTip(1000);
|
||||
ShowCustomNotification($"{Opciones.Instance.nombreDeLLM()} Trabajando..", $"Texto en {GTP.IdiomaDetectado} pasados: {Math.Round(stopwatch.ElapsedMilliseconds / 1000.0, 1)} s");
|
||||
if (!CorreccionFinalizada)
|
||||
{
|
||||
ShowCustomNotification(
|
||||
$"{Opciones.Instance.nombreDeLLM()} Trabajando..",
|
||||
$"Texto en {GTP.IdiomaDetectado} pasados: {Math.Round(stopwatch.ElapsedMilliseconds / 1000.0, 1)} s"
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
private void DetenerCronometro()
|
||||
{
|
||||
timer.Stop();
|
||||
timer.Dispose();
|
||||
if (timer != null)
|
||||
{
|
||||
timer.Stop();
|
||||
timer.Dispose();
|
||||
GTP.Log.Log("Cronómetro detenido");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public class KeyboardHelper
|
||||
{
|
||||
[DllImport("user32.dll", SetLastError = true)]
|
||||
|
@ -182,7 +247,4 @@ namespace GTPCorrgir
|
|||
keybd_event((byte)VK_CONTROL, 0x9d, KEYEVENTF_KEYUP, UIntPtr.Zero); // Ctrl Release
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
Loading…
Reference in New Issue