371 lines
15 KiB
C#
371 lines
15 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Windows;
|
|
using System.Windows.Forms;
|
|
using System.Windows.Input;
|
|
using System.Windows.Data;
|
|
using System.Windows.Controls;
|
|
using System.IO;
|
|
using System.Diagnostics;
|
|
using KeyEventArgs = System.Windows.Input.KeyEventArgs;
|
|
using MessageBox = System.Windows.MessageBox;
|
|
|
|
namespace GTPCorrgir
|
|
{
|
|
public class NullToBooleanConverter : IValueConverter
|
|
{
|
|
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
|
|
{
|
|
return value != null;
|
|
}
|
|
|
|
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
|
|
{
|
|
throw new NotImplementedException();
|
|
}
|
|
}
|
|
|
|
public partial class ContextMenuWindow : Window
|
|
{
|
|
public class MenuOption
|
|
{
|
|
public string DisplayName { get; set; }
|
|
public object Value { get; set; }
|
|
}
|
|
|
|
private readonly List<MenuOption> modeOptions;
|
|
private readonly List<MenuOption> llmOptions;
|
|
private bool optionsSelected = false;
|
|
|
|
public ContextMenuWindow()
|
|
{
|
|
// Initialize lists in constructor
|
|
modeOptions = new List<MenuOption>
|
|
{
|
|
new MenuOption { DisplayName = "Corregir texto", Value = Opciones.modoDeUso.Corregir },
|
|
new MenuOption { DisplayName = "Revisar ortografía", Value = Opciones.modoDeUso.Ortografia },
|
|
new MenuOption { DisplayName = "Chat", Value = Opciones.modoDeUso.Chat },
|
|
new MenuOption { DisplayName = "Pregunta-Respuesta", Value = Opciones.modoDeUso.PreguntaRespuesta },
|
|
new MenuOption { DisplayName = "Traducir a inglés", Value = Opciones.modoDeUso.Traducir_a_Ingles },
|
|
new MenuOption { DisplayName = "Traducir a italiano", Value = Opciones.modoDeUso.Traducir_a_Italiano },
|
|
new MenuOption { DisplayName = "Traducir a español", Value = Opciones.modoDeUso.Traducir_a_Espanol },
|
|
new MenuOption { DisplayName = "Traducir a portugués", Value = Opciones.modoDeUso.Traducir_a_Portugues },
|
|
new MenuOption { DisplayName = "OCR a texto", Value = Opciones.modoDeUso.OCRaTexto }
|
|
};
|
|
|
|
llmOptions = new List<MenuOption>
|
|
{
|
|
new MenuOption { DisplayName = "OpenAI", Value = Opciones.LLM_a_Usar.OpenAI },
|
|
new MenuOption { DisplayName = "Ollama", Value = Opciones.LLM_a_Usar.Ollama },
|
|
new MenuOption { DisplayName = "Groq", Value = Opciones.LLM_a_Usar.Groq },
|
|
new MenuOption { DisplayName = "Grok", Value = Opciones.LLM_a_Usar.Grok }
|
|
};
|
|
|
|
InitializeComponent();
|
|
InitializeControls();
|
|
LoadSavedSelections();
|
|
|
|
// Posicionar la ventana después de que se haya cargado completamente
|
|
this.Loaded += (s, e) => PositionWindowAtCursor();
|
|
}
|
|
|
|
private void InitializeControls()
|
|
{
|
|
ModeListBox.ItemsSource = modeOptions;
|
|
LLMListBox.ItemsSource = llmOptions;
|
|
}
|
|
|
|
private void LoadSavedSelections()
|
|
{
|
|
var savedSettings = MenuSettings.Instance;
|
|
|
|
var savedMode = modeOptions.FirstOrDefault(x =>
|
|
(Opciones.modoDeUso)x.Value == savedSettings.Options.LastUsedMode);
|
|
var savedLLM = llmOptions.FirstOrDefault(x =>
|
|
(Opciones.LLM_a_Usar)x.Value == savedSettings.Options.LastUsedLLM);
|
|
|
|
if (savedMode != null)
|
|
ModeListBox.SelectedItem = savedMode;
|
|
|
|
if (savedLLM != null)
|
|
LLMListBox.SelectedItem = savedLLM;
|
|
}
|
|
|
|
private void PositionWindowAtCursor()
|
|
{
|
|
var cursorPosition = System.Windows.Forms.Cursor.Position;
|
|
var screen = Screen.FromPoint(cursorPosition);
|
|
|
|
// Calculate position ensuring the window stays within screen bounds
|
|
double left = cursorPosition.X;
|
|
double top = cursorPosition.Y;
|
|
|
|
// Get the window size (waiting for it to be rendered)
|
|
this.UpdateLayout();
|
|
double windowWidth = this.ActualWidth;
|
|
double windowHeight = this.ActualHeight;
|
|
|
|
// Adjust position if window would go off screen
|
|
if (left + windowWidth > screen.WorkingArea.Right)
|
|
{
|
|
left = screen.WorkingArea.Right - windowWidth;
|
|
}
|
|
|
|
if (top + windowHeight > screen.WorkingArea.Bottom)
|
|
{
|
|
top = screen.WorkingArea.Bottom - windowHeight;
|
|
}
|
|
|
|
// Ensure window doesn't go off the left or top of the screen
|
|
left = Math.Max(screen.WorkingArea.Left, left);
|
|
top = Math.Max(screen.WorkingArea.Top, top);
|
|
|
|
this.Left = left;
|
|
this.Top = top;
|
|
}
|
|
|
|
private void CloseButton_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
// Cerrar toda la aplicación cuando se hace clic en el botón de cerrar
|
|
System.Windows.Application.Current.Shutdown();
|
|
}
|
|
|
|
private void Window_KeyDown(object sender, KeyEventArgs e)
|
|
{
|
|
if (e.Key == Key.Escape)
|
|
{
|
|
// Cerrar toda la aplicación cuando se presiona Esc
|
|
System.Windows.Application.Current.Shutdown();
|
|
}
|
|
}
|
|
|
|
private void Window_Deactivated(object sender, EventArgs e)
|
|
{
|
|
// Elimina este evento o modifícalo para que no cierre automáticamente
|
|
// if (!optionsSelected)
|
|
// {
|
|
// this.DialogResult = false;
|
|
// this.Close();
|
|
// }
|
|
}
|
|
|
|
private void AcceptButton_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
if (ModeListBox.SelectedItem is MenuOption selectedMode &&
|
|
LLMListBox.SelectedItem is MenuOption selectedLLM)
|
|
{
|
|
UpdateOptionsAndClose(selectedMode, selectedLLM);
|
|
}
|
|
}
|
|
|
|
private void UpdateOptionsAndClose(MenuOption selectedMode, MenuOption selectedLLM)
|
|
{
|
|
optionsSelected = true;
|
|
|
|
var modeValue = (Opciones.modoDeUso)selectedMode.Value;
|
|
var llmValue = (Opciones.LLM_a_Usar)selectedLLM.Value;
|
|
|
|
Opciones.Instance.modo = modeValue;
|
|
Opciones.Instance.LLM = llmValue;
|
|
|
|
MenuSettings.Instance.UpdateLastUsedOptions(modeValue, llmValue);
|
|
|
|
// Eliminar DialogResult
|
|
this.Close();
|
|
}
|
|
|
|
// Manejadores del menú contextual
|
|
private void OpenLog_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
try
|
|
{
|
|
string logFilePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "logfile.log");
|
|
|
|
if (File.Exists(logFilePath))
|
|
{
|
|
// Intentar abrir con el programa predeterminado
|
|
Process.Start(new ProcessStartInfo
|
|
{
|
|
FileName = logFilePath,
|
|
UseShellExecute = true
|
|
});
|
|
}
|
|
else
|
|
{
|
|
MessageBox.Show("El archivo de log no existe aún.", "Información",
|
|
MessageBoxButton.OK, MessageBoxImage.Information);
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
MessageBox.Show($"Error al abrir el archivo de log: {ex.Message}", "Error",
|
|
MessageBoxButton.OK, MessageBoxImage.Error);
|
|
}
|
|
}
|
|
|
|
private void ClearLog_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
try
|
|
{
|
|
var result = MessageBox.Show(
|
|
"¿Está seguro de que desea limpiar el archivo de log?\nEsta acción no se puede deshacer.",
|
|
"Confirmar limpieza de log",
|
|
MessageBoxButton.YesNo,
|
|
MessageBoxImage.Warning);
|
|
|
|
if (result == MessageBoxResult.Yes)
|
|
{
|
|
string logFilePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "logfile.log");
|
|
|
|
if (File.Exists(logFilePath))
|
|
{
|
|
try
|
|
{
|
|
// Obtener todos los listeners de tipo TextWriterTraceListener
|
|
var textWriterListeners = new List<System.Diagnostics.TextWriterTraceListener>();
|
|
|
|
foreach (System.Diagnostics.TraceListener listener in System.Diagnostics.Trace.Listeners)
|
|
{
|
|
if (listener is System.Diagnostics.TextWriterTraceListener textListener)
|
|
{
|
|
textWriterListeners.Add(textListener);
|
|
}
|
|
}
|
|
|
|
// Cerrar y remover temporalmente los listeners
|
|
foreach (var listener in textWriterListeners)
|
|
{
|
|
listener.Flush();
|
|
listener.Close();
|
|
System.Diagnostics.Trace.Listeners.Remove(listener);
|
|
}
|
|
|
|
// Esperar un momento para asegurar que el archivo se libere
|
|
System.Threading.Thread.Sleep(100);
|
|
|
|
// Limpiar el archivo
|
|
File.WriteAllText(logFilePath, string.Empty);
|
|
|
|
// Recrear los listeners
|
|
foreach (var listener in textWriterListeners)
|
|
{
|
|
var newListener = new System.Diagnostics.TextWriterTraceListener(logFilePath);
|
|
System.Diagnostics.Trace.Listeners.Add(newListener);
|
|
}
|
|
|
|
// Reactivar AutoFlush
|
|
System.Diagnostics.Trace.AutoFlush = true;
|
|
|
|
MessageBox.Show("El archivo de log ha sido limpiado correctamente.", "Éxito",
|
|
MessageBoxButton.OK, MessageBoxImage.Information);
|
|
}
|
|
catch (UnauthorizedAccessException)
|
|
{
|
|
MessageBox.Show(
|
|
"No se puede acceder al archivo de log. Puede que esté siendo usado por otro proceso.\n" +
|
|
"Intente cerrar todas las instancias de la aplicación y vuelva a intentarlo.",
|
|
"Acceso denegado",
|
|
MessageBoxButton.OK, MessageBoxImage.Warning);
|
|
}
|
|
catch (IOException ioEx)
|
|
{
|
|
MessageBox.Show(
|
|
$"Error de E/S al acceder al archivo de log:\n{ioEx.Message}\n\n" +
|
|
"El archivo puede estar siendo usado por otro proceso.",
|
|
"Error de archivo",
|
|
MessageBoxButton.OK, MessageBoxImage.Warning);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
MessageBox.Show("El archivo de log no existe.", "Información",
|
|
MessageBoxButton.OK, MessageBoxImage.Information);
|
|
}
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
MessageBox.Show($"Error al limpiar el archivo de log: {ex.Message}", "Error",
|
|
MessageBoxButton.OK, MessageBoxImage.Error);
|
|
}
|
|
}
|
|
|
|
private void About_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
var aboutDialog = new Window
|
|
{
|
|
Title = "Acerca de GTPCorregir",
|
|
Width = 400,
|
|
Height = 300,
|
|
WindowStartupLocation = WindowStartupLocation.CenterOwner,
|
|
Owner = this,
|
|
ResizeMode = ResizeMode.NoResize,
|
|
ShowInTaskbar = false,
|
|
WindowStyle = WindowStyle.ToolWindow
|
|
};
|
|
|
|
var stackPanel = new StackPanel { Margin = new Thickness(20) };
|
|
|
|
stackPanel.Children.Add(new System.Windows.Controls.TextBlock
|
|
{
|
|
Text = "GTPCorregir",
|
|
FontSize = 18,
|
|
FontWeight = FontWeights.Bold,
|
|
HorizontalAlignment = System.Windows.HorizontalAlignment.Center,
|
|
Margin = new Thickness(0, 0, 0, 10)
|
|
});
|
|
|
|
stackPanel.Children.Add(new System.Windows.Controls.TextBlock
|
|
{
|
|
Text = "Herramienta de corrección de texto con IA",
|
|
FontSize = 12,
|
|
HorizontalAlignment = System.Windows.HorizontalAlignment.Center,
|
|
Margin = new Thickness(0, 0, 0, 15)
|
|
});
|
|
|
|
stackPanel.Children.Add(new System.Windows.Controls.TextBlock
|
|
{
|
|
Text = "• Corrección de ortografía y gramática",
|
|
Margin = new Thickness(0, 2, 0, 2)
|
|
});
|
|
stackPanel.Children.Add(new System.Windows.Controls.TextBlock
|
|
{
|
|
Text = "• Traducción a múltiples idiomas",
|
|
Margin = new Thickness(0, 2, 0, 2)
|
|
});
|
|
stackPanel.Children.Add(new System.Windows.Controls.TextBlock
|
|
{
|
|
Text = "• OCR con PaddleOCR",
|
|
Margin = new Thickness(0, 2, 0, 2)
|
|
});
|
|
stackPanel.Children.Add(new System.Windows.Controls.TextBlock
|
|
{
|
|
Text = "• Soporte para múltiples LLMs",
|
|
Margin = new Thickness(0, 2, 0, 2)
|
|
});
|
|
|
|
stackPanel.Children.Add(new System.Windows.Controls.TextBlock
|
|
{
|
|
Text = $"Versión: {System.Reflection.Assembly.GetExecutingAssembly().GetName().Version}",
|
|
FontSize = 10,
|
|
HorizontalAlignment = System.Windows.HorizontalAlignment.Center,
|
|
Margin = new Thickness(0, 20, 0, 0)
|
|
});
|
|
|
|
var closeButton = new System.Windows.Controls.Button
|
|
{
|
|
Content = "Cerrar",
|
|
Width = 80,
|
|
Height = 25,
|
|
HorizontalAlignment = System.Windows.HorizontalAlignment.Center,
|
|
Margin = new Thickness(0, 15, 0, 0)
|
|
};
|
|
closeButton.Click += (s, args) => aboutDialog.Close();
|
|
stackPanel.Children.Add(closeButton);
|
|
|
|
aboutDialog.Content = stackPanel;
|
|
aboutDialog.ShowDialog();
|
|
}
|
|
}
|
|
} |