From a0de7441829409926101c59301381940481d76f0 Mon Sep 17 00:00:00 2001 From: Miguel Date: Thu, 2 May 2024 16:06:45 +0200 Subject: [PATCH] Estado inicial --- App.xaml | 2 +- App.xaml.cs | 11 ++-- CtrEditor.csproj | 5 ++ MainViewModel.cs | 96 +++++++++++++++++++++++++++++++++++ MainWindow.xaml | 77 +++++++++++++++++++++++++--- MainWindow.xaml.cs | 2 + ObjetoSimuladoBotella.xaml | 6 +++ ObjetoSimuladoBotella.xaml.cs | 28 ++++++++++ ObjetoSimuladoPack.xaml | 6 +++ ObjetoSimuladoPack.xaml.cs | 28 ++++++++++ RelayCommand.cs | 42 +++++++++++++++ SimulationState.cs | 24 +++++++++ SimulationViewModel.cs | 29 +++++++++++ estadoPersistente.cs | 68 +++++++++++++++++++++++++ 14 files changed, 412 insertions(+), 12 deletions(-) create mode 100644 MainViewModel.cs create mode 100644 ObjetoSimuladoBotella.xaml create mode 100644 ObjetoSimuladoBotella.xaml.cs create mode 100644 ObjetoSimuladoPack.xaml create mode 100644 ObjetoSimuladoPack.xaml.cs create mode 100644 RelayCommand.cs create mode 100644 SimulationState.cs create mode 100644 SimulationViewModel.cs create mode 100644 estadoPersistente.cs diff --git a/App.xaml b/App.xaml index f2e3323..c8e0a37 100644 --- a/App.xaml +++ b/App.xaml @@ -4,6 +4,6 @@ xmlns:local="clr-namespace:CtrEditor" StartupUri="MainWindow.xaml"> - + diff --git a/App.xaml.cs b/App.xaml.cs index 01f6265..a9e0a46 100644 --- a/App.xaml.cs +++ b/App.xaml.cs @@ -4,11 +4,12 @@ using System.Windows; namespace CtrEditor { - /// - /// Interaction logic for App.xaml - /// - public partial class App : Application + public partial class App : System.Windows.Application { + public App() + { + InitializeComponent(); + } } - } + diff --git a/CtrEditor.csproj b/CtrEditor.csproj index 81a7216..b51ef84 100644 --- a/CtrEditor.csproj +++ b/CtrEditor.csproj @@ -8,4 +8,9 @@ true + + + + + diff --git a/MainViewModel.cs b/MainViewModel.cs new file mode 100644 index 0000000..e7d436d --- /dev/null +++ b/MainViewModel.cs @@ -0,0 +1,96 @@ +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.Windows.Input; + +namespace CtrEditor +{ + public class MainViewModel : INotifyPropertyChanged + { + private double _zoomFactor = 1.0; + private string _directorioTrabajo; + + + public MainViewModel() + { + OpenWorkDirectoryCommand = new RelayCommand(OpenWorkDirectory); + LoadImageCommand = new RelayCommand(LoadImage); + } + + + public string DirectorioTrabajo + { + get => _directorioTrabajo; + set + { + _directorioTrabajo = value; + OnPropertyChanged(nameof(DirectorioTrabajo)); // Notificar el cambio de propiedad + EstadoPersistente.Instance.DirectorioTrabajo = value; // Actualizar el estado persistente + EstadoPersistente.Instance.GuardarEstado(); // Guardar el estado actualizado + } + } + + 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 + } + } + + // Ejemplo de propiedad para gestionar el UserControl activo + private UserControl _activeControl; + public UserControl ActiveControl + { + get => _activeControl; + set { _activeControl = value; OnPropertyChanged(); } + } + + // Comando para cargar una imagen + public ICommand LoadImageCommand { get; private set; } + + + private void LoadImage() + { + // Implementar lógica de carga de imagen + } + + public event PropertyChangedEventHandler PropertyChanged; + protected void OnPropertyChanged([CallerMemberName] string propertyName = null) + { + PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); + } + + public double ZoomFactor + { + get => _zoomFactor; + set { _zoomFactor = value; OnPropertyChanged(); } + } + + private double _offsetX = 0; + private double _offsetY = 0; + public double OffsetX + { + get => _offsetX; + set { _offsetX = value; OnPropertyChanged(); } + } + public double OffsetY + { + get => _offsetY; + set { _offsetY = value; OnPropertyChanged(); } + } + + // Implementación de INotifyPropertyChanged... + } + +} diff --git a/MainWindow.xaml b/MainWindow.xaml index 2c31d0f..ee57d3b 100644 --- a/MainWindow.xaml +++ b/MainWindow.xaml @@ -1,12 +1,77 @@  - + Height="450" Width="800" + ResizeMode="CanResize" Title="C:/"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/MainWindow.xaml.cs b/MainWindow.xaml.cs index 11bb453..0fc2633 100644 --- a/MainWindow.xaml.cs +++ b/MainWindow.xaml.cs @@ -20,5 +20,7 @@ namespace CtrEditor { InitializeComponent(); } + + } } \ No newline at end of file diff --git a/ObjetoSimuladoBotella.xaml b/ObjetoSimuladoBotella.xaml new file mode 100644 index 0000000..d3df96a --- /dev/null +++ b/ObjetoSimuladoBotella.xaml @@ -0,0 +1,6 @@ + + + diff --git a/ObjetoSimuladoBotella.xaml.cs b/ObjetoSimuladoBotella.xaml.cs new file mode 100644 index 0000000..dddcc68 --- /dev/null +++ b/ObjetoSimuladoBotella.xaml.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace CtrEditor +{ + /// + /// Interaction logic for ObjetoSimuladoBotella.xaml + /// + public partial class ObjetoSimuladoBotella : UserControl + { + public ObjetoSimuladoBotella() + { + InitializeComponent(); + } + } +} diff --git a/ObjetoSimuladoPack.xaml b/ObjetoSimuladoPack.xaml new file mode 100644 index 0000000..f832e81 --- /dev/null +++ b/ObjetoSimuladoPack.xaml @@ -0,0 +1,6 @@ + + + diff --git a/ObjetoSimuladoPack.xaml.cs b/ObjetoSimuladoPack.xaml.cs new file mode 100644 index 0000000..793f096 --- /dev/null +++ b/ObjetoSimuladoPack.xaml.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace CtrEditor +{ + /// + /// Interaction logic for ObjetoSimuladoPack.xaml + /// + public partial class ObjetoSimuladoPack : UserControl + { + public ObjetoSimuladoPack() + { + InitializeComponent(); + } + } +} diff --git a/RelayCommand.cs b/RelayCommand.cs new file mode 100644 index 0000000..3b3d68e --- /dev/null +++ b/RelayCommand.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Input; + +namespace CtrEditor +{ + public class RelayCommand : ICommand + { + private readonly Action _execute; + private readonly Func _canExecute; + + public RelayCommand(Action execute, Func canExecute = null) + { + _execute = execute ?? throw new ArgumentNullException(nameof(execute)); + _canExecute = canExecute; + } + + public bool CanExecute(object parameter) + { + return _canExecute == null || _canExecute(); + } + + public void Execute(object parameter) + { + _execute(); + } + + public event EventHandler CanExecuteChanged + { + add { CommandManager.RequerySuggested += value; } + remove { CommandManager.RequerySuggested -= value; } + } + + public void RaiseCanExecuteChanged() + { + CommandManager.InvalidateRequerySuggested(); + } + } +} diff --git a/SimulationState.cs b/SimulationState.cs new file mode 100644 index 0000000..7f3fb2b --- /dev/null +++ b/SimulationState.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CtrEditor +{ + public class SimulationState + { + // public List Objects { get; set; } = new List(); + + public void SaveState(string path) + { + // Serializar estado a JSON + } + + public void LoadState(string path) + { + // Deserializar estado desde JSON + } + } + +} diff --git a/SimulationViewModel.cs b/SimulationViewModel.cs new file mode 100644 index 0000000..a47a082 --- /dev/null +++ b/SimulationViewModel.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CtrEditor +{ + //public class SimulationViewModel : INotifyPropertyChanged + //{ + // private ObservableCollection _simulatedObjects; + // public ObservableCollection SimulatedObjects + // { + // get => _simulatedObjects; + // set { _simulatedObjects = value; OnPropertyChanged(); } + // } + + // public SimulationViewModel() + // { + // SimulatedObjects = new ObservableCollection + // { + // new ObjetoSimuladoBotella(), // Suponiendo que estos controles no requieren parámetros en el constructor + // new ObjetoSimuladoPack() + // }; + // } + + // // Implementación de INotifyPropertyChanged aquí + //} +} diff --git a/estadoPersistente.cs b/estadoPersistente.cs new file mode 100644 index 0000000..b3f74ea --- /dev/null +++ b/estadoPersistente.cs @@ -0,0 +1,68 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Newtonsoft.Json; +using System; +using System.IO; + +namespace CtrEditor +{ + internal class EstadoPersistente + { + // Ruta donde se guardará el estado + private static readonly string _filePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "estado.json"); + + // Instancia privada estática, parte del patrón Singleton + private static EstadoPersistente _instance; + + // Propiedad privada para el directorio de trabajo + private string _strDirectorioTrabajo; + + // Propiedad pública con get y set para controlar el acceso a _strDirectorioTrabajo + public string DirectorioTrabajo + { + get { return _strDirectorioTrabajo; } + set { _strDirectorioTrabajo = value; } + } + + // Constructor privado para evitar la instanciación externa + private EstadoPersistente() + { + _strDirectorioTrabajo = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); + } + + // Propiedad pública estática para acceder a la instancia + public static EstadoPersistente Instance + { + get + { + if (_instance == null) + { + _instance = CargarEstado(); + } + return _instance; + } + } + + // Método para guardar el estado en un archivo JSON + public void GuardarEstado() + { + string json = JsonConvert.SerializeObject(this); + File.WriteAllText(_filePath, json); + } + + // Método estático para cargar el estado desde un archivo JSON + private static EstadoPersistente CargarEstado() + { + if (File.Exists(_filePath)) + { + string json = File.ReadAllText(_filePath); + return JsonConvert.DeserializeObject(json); + } + return new EstadoPersistente(); // Devuelve una nueva instancia si no existe el archivo + } + } + +}