GTPCorrgir/ContextMenuWindow.xaml.cs

170 lines
6.0 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 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 = "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 = "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)
{
this.Close();
}
private void Window_KeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Escape)
{
this.Close();
}
}
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();
}
}
}