Mejoras en App,xaml.cs desde Claude

This commit is contained in:
Miguel 2024-11-14 11:37:17 +01:00
parent f20ee01e22
commit 2caf2b96f5
1 changed files with 144 additions and 82 deletions

View File

@ -2,10 +2,9 @@
using System.Data; using System.Data;
using System.Windows; using System.Windows;
using System; using System;
using System.Windows; using System.Windows.Forms;
using System.Windows.Forms; // Necesitas agregar una referencia a System.Windows.Forms
using Application = System.Windows.Application; 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.Threading.Tasks;
using System.Globalization; using System.Globalization;
using System.Windows.Data; using System.Windows.Data;
@ -13,11 +12,6 @@ using System.Runtime.InteropServices;
namespace GTPCorrgir namespace GTPCorrgir
{ {
/// <summary>
/// Interaction logic for App.xaml
/// </summary>
///
public partial class App : Application public partial class App : Application
{ {
gtpask GTP = new gtpask(); gtpask GTP = new gtpask();
@ -26,128 +20,199 @@ namespace GTPCorrgir
bool CorreccionFinalizada = false; bool CorreccionFinalizada = false;
Stopwatch stopwatch = new Stopwatch(); Stopwatch stopwatch = new Stopwatch();
private notificacion notificationWindow; private notificacion notificationWindow;
private readonly int TimeoutSeconds = 60; // Timeout máximo para esperar la respuesta
private CancellationTokenSource _cancellationTokenSource;
KeyboardHelper pasteLogic = new KeyboardHelper(); KeyboardHelper pasteLogic = new KeyboardHelper();
protected override void OnStartup(StartupEventArgs e) protected override void OnStartup(StartupEventArgs e)
{ {
base.OnStartup(e); base.OnStartup(e);
_cancellationTokenSource = new CancellationTokenSource();
pasteLogic.SaveCurrentWindow(); try
if (System.Windows.Clipboard.ContainsText())
{ {
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();
}
} }
catch (Exception ex)
if (Opciones.Instance.modo == Opciones.modoDeUso.Corregir || Opciones.Instance.modo == Opciones.modoDeUso.Ortografia)
{ {
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 var correccionTask = Task.Run(async () =>
ShowCustomNotification("Espera", $"Corrigiendo texto con .{Opciones.Instance.nombreDeLLM()} ..");
IniciarCronometro();
// Ejecuta la tarea de corrección en un hilo secundario
Task.Run(async () =>
{ {
try try
{ {
GTP.Log.Log("Iniciando corrección de texto");
await GTP.CorregirTexto(); await GTP.CorregirTexto();
GTP.Log.Log("Corrección de texto completada");
} }
catch (Exception ex) 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 finally
{ {
await Dispatcher.Invoke(async () => // Nota el 'async' aquí para permitir 'await' GTP.Log.Log("Cerrando aplicación");
{ Application.Current.Shutdown();
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();
}
});
} }
}); });
} 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) private void ShowCustomNotification(string title, string message)
{ {
if (notificationWindow == null) try
{ {
notificationWindow = new notificacion(); GTP.Log.Log($"Mostrando notificación: {title} - {message}");
notificationWindow.Show(); if (notificationWindow == null)
{
notificationWindow = new notificacion();
notificationWindow.Show();
}
notificationWindow.UpdateNotification(title, message);
} }
catch (Exception ex)
notificationWindow.UpdateNotification(title, message);
}
private void MostrarNotificacion(string titulo, string mensaje)
{
notificacion = new NotifyIcon
{ {
Icon = SystemIcons.Information, GTP.Log.Log($"Error al mostrar notificación: {ex.Message}");
BalloonTipTitle = titulo, }
BalloonTipText = mensaje,
Visible = true
};
notificacion.ShowBalloonTip(1000);
} }
private void IniciarCronometro() private void IniciarCronometro()
{ {
timer = new System.Windows.Forms.Timer(); timer = new System.Windows.Forms.Timer();
timer.Interval = 100; // 1000 milisegundos (1 segundo) timer.Interval = 100;
timer.Tick += ActualizarCronometro; timer.Tick += ActualizarCronometro;
timer.Start(); timer.Start();
GTP.Log.Log("Cronómetro iniciado");
} }
private void ActualizarCronometro(object sender, EventArgs e) private void ActualizarCronometro(object sender, EventArgs e)
{ {
if (!CorreccionFinalizada) { if (!CorreccionFinalizada)
//notificacion.BalloonTipText = $"Texto en {GTP.IdiomaDetectado} pasados: {Math.Round(stopwatch.ElapsedMilliseconds/1000.0,1)} s"; {
//notificacion.ShowBalloonTip(1000); ShowCustomNotification(
ShowCustomNotification($"{Opciones.Instance.nombreDeLLM()} Trabajando..", $"Texto en {GTP.IdiomaDetectado} pasados: {Math.Round(stopwatch.ElapsedMilliseconds / 1000.0, 1)} s"); $"{Opciones.Instance.nombreDeLLM()} Trabajando..",
$"Texto en {GTP.IdiomaDetectado} pasados: {Math.Round(stopwatch.ElapsedMilliseconds / 1000.0, 1)} s"
);
} }
} }
private void DetenerCronometro() private void DetenerCronometro()
{ {
timer.Stop(); if (timer != null)
timer.Dispose(); {
timer.Stop();
timer.Dispose();
GTP.Log.Log("Cronómetro detenido");
}
} }
} }
public class KeyboardHelper public class KeyboardHelper
{ {
[DllImport("user32.dll", SetLastError = true)] [DllImport("user32.dll", SetLastError = true)]
@ -182,7 +247,4 @@ namespace GTPCorrgir
keybd_event((byte)VK_CONTROL, 0x9d, KEYEVENTF_KEYUP, UIntPtr.Zero); // Ctrl Release keybd_event((byte)VK_CONTROL, 0x9d, KEYEVENTF_KEYUP, UIntPtr.Zero); // Ctrl Release
} }
} }
}
}