using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Runtime.CompilerServices; using System.Text; using System.Threading.Tasks; using System.Windows.Controls; using System.Windows.Input; using Ookii.Dialogs.Wpf; using System.Collections.ObjectModel; using System.Windows.Media; using System.Windows.Media.Imaging; using static System.Runtime.InteropServices.JavaScript.JSType; using System.Windows.Threading; using CtrEditor.ObjetosSim; using System.IO; using System.Windows.Forms; using System.Text.Json.Serialization; using System.Text.Json; using Newtonsoft.Json; namespace CtrEditor { public class MainViewModel : INotifyPropertyChanged { public DatosDeTrabajo datosDeTrabajo { get; } public ObservableCollection listaImagenes { get; private set; } // Publicación de las claves del diccionario public ObservableCollection ListaOsBase { get; } = new ObservableCollection(); private readonly DispatcherTimer _timerSimulacion; public ICommand StartSimulationCommand { get; } public ICommand StopSimulationCommand { get; } public ICommand ItemDoubleClickCommand { get; private set; } // Evento que se dispara cuando se selecciona una nueva imagen public event EventHandler ImageSelected; public event EventHandler TickSimulacion; public event Action OnUserControlSelected; public MainViewModel() { OpenWorkDirectoryCommand = new RelayCommand(OpenWorkDirectory); datosDeTrabajo = new DatosDeTrabajo(); InitializeTipoSimulableList(); ItemDoubleClickCommand = new ParameterizedRelayCommand(ExecuteDoubleClick); _timerSimulacion = new DispatcherTimer(); _timerSimulacion.Interval = TimeSpan.FromMilliseconds(100); // ajusta el intervalo según sea necesario _timerSimulacion.Tick += OnTickSimulacion; StartSimulationCommand = new RelayCommand(StartSimulation); StopSimulationCommand = new RelayCommand(StopSimulation); } public void LoadInitialData() { // Suponiendo que "SelectedImage" es una propiedad que al establecerse dispara "ImageSelected" directorioTrabajo = EstadoPersistente.Instance.directorio; } private TipoSimulable _selectedItem = null; public TipoSimulable SelectedItem { get => _selectedItem; set { if (_selectedItem != value) { _selectedItem = value; OnPropertyChanged(nameof(SelectedItem)); // Notificar que la propiedad ha cambiado } } } private void ExecuteDoubleClick(object parameter) { if (parameter is TipoSimulable tipoSimulable) { var instance = Activator.CreateInstance(tipoSimulable.Tipo) as osBase; if (instance != null) { ObjetosSimulables.Add(instance); OnUserControlSelected?.Invoke(instance); } } } private void InitializeTipoSimulableList() { var baseType = typeof(osBase); var types = AppDomain.CurrentDomain.GetAssemblies() .SelectMany(assembly => assembly.GetTypes()) .Where(type => type.IsSubclassOf(baseType) && !type.IsAbstract); foreach (var type in types) { ListaOsBase.Add(new TipoSimulable { Nombre = type.Name, Tipo = type }); } } private void StartSimulation() { _timerSimulacion.Start(); } private void StopSimulation() { _timerSimulacion.Stop(); } private void OnTickSimulacion(object sender, EventArgs e) { var args = new TickSimulacionEventArgs(); OnTickSimulacion(args); } protected virtual void OnTickSimulacion(TickSimulacionEventArgs e) { TickSimulacion?.Invoke(this, e); } public string directorioTrabajo { get => EstadoPersistente.Instance.directorio; set { if (value != null) { EstadoPersistente.Instance.directorio = value; // Actualizar el estado persistente EstadoPersistente.Instance.GuardarEstado(); // Guardar el estado actualizado datosDeTrabajo.CargarImagenes(); listaImagenes = new ObservableCollection(datosDeTrabajo.Imagenes.Keys); // Actualizar claves SelectedImage = null; if (listaImagenes.FirstOrDefault() != null) SelectedImage = listaImagenes.FirstOrDefault(); OnPropertyChanged(nameof(directorioTrabajo)); // Notificar el cambio de propiedad OnPropertyChanged(nameof(listaImagenes)); // Notificar que la lista de imágenes ha cambiado } } } private string _selectedImage = null; public string SelectedImage { get => _selectedImage; set { if (_selectedImage != value && value != null) { SaveStateObjetosSimulables(); // Guarda el estado antes de cambiar la imagen _selectedImage = value; LoadStateObjetosSimulables(); ImageSelected?.Invoke(this, datosDeTrabajo.Imagenes[value]); // Dispara el evento con la nueva ruta de imagen } _selectedImage = value; OnPropertyChanged(nameof(SelectedImage)); } } public ICommand OpenWorkDirectoryCommand { get; } private void OpenWorkDirectory() { var dialog = new VistaFolderBrowserDialog(); if (dialog.ShowDialog() == true) // Mostrar el diálogo y comprobar si el resultado es positivo { directorioTrabajo = dialog.SelectedPath; // Actualizar la propiedad que también actualiza el estado persistente } } // // Lista de osBase // private ObservableCollection objetosSimulables = new ObservableCollection(); public ObservableCollection ObjetosSimulables { get => objetosSimulables; set { if (objetosSimulables != value) { objetosSimulables = value; OnPropertyChanged(nameof(ObjetosSimulables)); } } } public void SaveStateObjetosSimulables() { if (_selectedImage != null) { var settings = new JsonSerializerSettings { Formatting = Formatting.Indented, NullValueHandling = NullValueHandling.Ignore, TypeNameHandling = TypeNameHandling.Auto }; foreach (var obj in objetosSimulables) { obj.VisualRepresentation = null; } var serializedData = JsonConvert.SerializeObject(objetosSimulables, settings); File.WriteAllText(datosDeTrabajo.ObtenerPathImagenConExtension(_selectedImage, ".json"), serializedData); } } public void LoadStateObjetosSimulables() { try { ObjetosSimulables.Clear(); if (_selectedImage != null) { string jsonPath = datosDeTrabajo.ObtenerPathImagenConExtension(_selectedImage, ".json"); if (File.Exists(jsonPath)) { string jsonString = File.ReadAllText(jsonPath); var settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Auto, ObjectCreationHandling = ObjectCreationHandling.Replace, PreserveReferencesHandling = PreserveReferencesHandling.Objects, ConstructorHandling = ConstructorHandling.AllowNonPublicDefaultConstructor }; objetosSimulables = JsonConvert.DeserializeObject>(jsonString, settings); foreach (var obj in objetosSimulables) { OnUserControlSelected?.Invoke(obj); } } } } catch { /* Consider logging the error or handling it appropriately */ } } // Implementación de INotifyPropertyChanged... public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged([CallerMemberName] string propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } } public class TipoSimulable { public string Nombre { get; set; } public Type Tipo { get; set; } } public class TickSimulacionEventArgs : EventArgs { // Aquí puedes agregar propiedades o campos para pasar información adicional // en el evento TickSimulacion } }