91 lines
4.4 KiB
Markdown
91 lines
4.4 KiB
Markdown
# Sistema de Persistencia de Configuración del Entorno de Trabajo
|
|
|
|
## Resumen
|
|
Se ha implementado un sistema completo para guardar y restaurar la configuración del entorno de trabajo para cada imagen, incluyendo la posición del GridSplitter, el estado del canvas (zoom, posición, offset) y el estado de `Is3DUpdateEnabled`.
|
|
|
|
## Archivos Creados/Modificados
|
|
|
|
### 1. Nuevo Archivo: `Models/WorkspaceConfiguration.cs`
|
|
- **Propósito**: Contiene la configuración del entorno de trabajo
|
|
- **Propiedades principales**:
|
|
- `GridSplitterPosition`: Altura del GridSplitter que separa vista 2D y 3D
|
|
- `CanvasCenterX/Y`: Posición central del canvas en píxeles
|
|
- `ZoomLevel`: Nivel de zoom actual del canvas
|
|
- `CanvasOffsetX/Y`: Offset de transformación del canvas
|
|
- `Is3DUpdateEnabled`: Estado de las actualizaciones 3D
|
|
- `HorizontalScrollOffset/VerticalScrollOffset`: Posición del scroll
|
|
|
|
### 2. Modificado: `MainViewModel.cs`
|
|
- **Agregado**: Propiedad `WorkspaceConfig` para manejar la configuración
|
|
- **Nuevos métodos**:
|
|
- `CaptureWorkspaceState()`: Captura el estado actual desde la UI
|
|
- `RestoreWorkspaceState()`: Restaura el estado a la UI
|
|
- `InitializeDefaultWorkspaceConfig()`: Inicializa configuración por defecto
|
|
|
|
### 3. Modificado: `SimulationData` (en MainViewModel.cs)
|
|
- **Agregado**: Propiedad `WorkspaceConfig` para persistir la configuración junto con cada imagen
|
|
|
|
### 4. Modificado: `Serialization/StateSerializer.cs`
|
|
- **Modificado `SaveState()`**: Ahora captura automáticamente el estado del workspace antes de guardar
|
|
- **Modificado `LoadCurrentPageState()`**: Carga y restaura la configuración del workspace
|
|
|
|
### 5. Modificado: `MainWindow.xaml`
|
|
- **Agregado**: Nombres a los elementos Grid para poder accederlos desde código:
|
|
- `x:Name="MainGrid"` al Grid principal
|
|
- `x:Name="MiddleColumnGrid"` al Grid de la segunda columna
|
|
|
|
## Funcionamiento
|
|
|
|
### Guardado Automático
|
|
1. Cuando se guarda el estado de una imagen (`SaveState()`), el sistema automáticamente:
|
|
- Captura la posición actual del GridSplitter
|
|
- Captura el estado actual del canvas (zoom, posición, scroll)
|
|
- Captura el estado de `Is3DUpdateEnabled`
|
|
- Guarda toda esta información junto con los datos de la imagen
|
|
|
|
### Carga Automática
|
|
1. Cuando se carga una imagen (`LoadState()`), el sistema:
|
|
- Carga la configuración del workspace guardada para esa imagen
|
|
- Restaura automáticamente todos los valores a la UI
|
|
- Si no hay configuración guardada, usa valores por defecto
|
|
|
|
### Persistencia por Imagen
|
|
- Cada imagen tiene su propia configuración independiente
|
|
- La configuración se guarda en el mismo archivo JSON que los objetos simulables
|
|
- Compatible con versiones anteriores (si no hay configuración, usa valores por defecto)
|
|
|
|
## Características Técnicas
|
|
|
|
### Manejo de Errores
|
|
- Todos los métodos de captura y restauración tienen manejo de excepciones
|
|
- Los errores se registran en Debug pero no interrumpen el proceso de guardado/carga
|
|
|
|
### Compatibilidad
|
|
- Compatible con archivos existentes (retro-compatibilidad)
|
|
- Si un archivo no tiene configuración del workspace, se crea una por defecto
|
|
|
|
### Uso del Dispatcher
|
|
- La restauración del estado usa `Dispatcher.BeginInvoke()` para asegurar que la UI esté lista
|
|
- Prioridad `Background` para no bloquear la interfaz
|
|
|
|
## Beneficios
|
|
|
|
1. **Consistencia**: Cada imagen mantiene su configuración visual específica
|
|
2. **Productividad**: Los usuarios no necesitan reconfigurar la vista cada vez que cambian de imagen
|
|
3. **Flexibilidad**: Diferentes imágenes pueden tener diferentes configuraciones de trabajo
|
|
4. **Transparencia**: El sistema funciona automáticamente sin intervención del usuario
|
|
5. **Robustez**: Manejo de errores y compatibilidad con versiones anteriores
|
|
|
|
## Uso
|
|
El sistema es completamente automático. Los usuarios simplemente trabajan normalmente y:
|
|
- Al cambiar de imagen, la configuración se guarda automáticamente
|
|
- Al seleccionar una imagen, su configuración se restaura automáticamente
|
|
- El estado de `Is3DUpdateEnabled` se mantiene independiente para cada imagen
|
|
- La posición del GridSplitter se recuerda para cada imagen
|
|
|
|
## Notas de Implementación
|
|
- Se usa `TransformGroup`, `ScaleTransform` y `TranslateTransform` para manejar el canvas
|
|
- El GridSplitter se maneja a través de las `RowDefinitions` del Grid de la segunda columna
|
|
- La configuración se serializa junto con los datos de simulación en formato JSON
|
|
- Se mantiene la estructura existente del sistema de serialización
|