Compare commits

..

No commits in common. "1e30f00c5790a1e226938dae60685c053ba8846a" and "a0de7441829409926101c59301381940481d76f0" have entirely different histories.

7 changed files with 58 additions and 220 deletions

View File

@ -1,40 +0,0 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CtrEditor
{
public class DatosDeTrabajo
{
public Dictionary<string, string> Imagenes { get; private set; }
public DatosDeTrabajo()
{
Imagenes = new Dictionary<string, string>();
CargarImagenes(); // Inicializar la carga de imágenes basada en el directorio persistente
}
public void CargarImagenes()
{
Imagenes.Clear();
string folderPath = EstadoPersistente.Instance.directorio; // Usar directamente desde el Singleton
if (Directory.Exists(folderPath))
{
var archivosImagen = Directory.GetFiles(folderPath, "*.png"); // Ajustar para otros formatos si es necesario
foreach (var archivo in archivosImagen)
{
var nombreArchivo = Path.GetFileName(archivo);
if (!Imagenes.ContainsKey(nombreArchivo))
{
Imagenes[nombreArchivo] = archivo;
}
}
}
}
}
}

View File

@ -9,61 +9,33 @@ using System.Windows.Controls;
using System.Windows.Input; using System.Windows.Input;
using Ookii.Dialogs.Wpf; using Ookii.Dialogs.Wpf;
using System.Windows.Input; using System.Windows.Input;
using System.Collections.ObjectModel;
using System.Windows.Media;
using System.Windows.Media.Imaging;
namespace CtrEditor namespace CtrEditor
{ {
public class MainViewModel : INotifyPropertyChanged public class MainViewModel : INotifyPropertyChanged
{ {
public DatosDeTrabajo datosDeTrabajo { get; } private double _zoomFactor = 1.0;
public ObservableCollection<string> listaImagenes { get; private set; } // Publicación de las claves del diccionario private string _directorioTrabajo;
private string _selectedImage;
// Evento que se dispara cuando se selecciona una nueva imagen
public event EventHandler<string> ImageSelected;
public MainViewModel() public MainViewModel()
{ {
OpenWorkDirectoryCommand = new RelayCommand(OpenWorkDirectory); OpenWorkDirectoryCommand = new RelayCommand(OpenWorkDirectory);
datosDeTrabajo = new DatosDeTrabajo(); LoadImageCommand = new RelayCommand(LoadImage);
listaImagenes = new ObservableCollection<string>(datosDeTrabajo.Imagenes.Keys);
directorioTrabajo = EstadoPersistente.Instance.directorio;
} }
public string directorioTrabajo public string DirectorioTrabajo
{ {
get => EstadoPersistente.Instance.directorio; get => _directorioTrabajo;
set set
{ {
if (value != null) _directorioTrabajo = value;
{ OnPropertyChanged(nameof(DirectorioTrabajo)); // Notificar el cambio de propiedad
EstadoPersistente.Instance.directorio = value; // Actualizar el estado persistente EstadoPersistente.Instance.DirectorioTrabajo = value; // Actualizar el estado persistente
EstadoPersistente.Instance.GuardarEstado(); // Guardar el estado actualizado EstadoPersistente.Instance.GuardarEstado(); // Guardar el estado actualizado
datosDeTrabajo.CargarImagenes();
listaImagenes = new ObservableCollection<string>(datosDeTrabajo.Imagenes.Keys); // Actualizar claves
OnPropertyChanged(nameof(directorioTrabajo)); // Notificar el cambio de propiedad
OnPropertyChanged(nameof(listaImagenes)); // Notificar que la lista de imágenes ha cambiado
} }
} }
}
public string SelectedImage
{
get => _selectedImage;
set
{
if (_selectedImage != value)
{
_selectedImage = value;
OnPropertyChanged(nameof(SelectedImage));
ImageSelected?.Invoke(this, datosDeTrabajo.Imagenes[value]); // Dispara el evento con la nueva ruta de imagen
}
}
}
public ICommand OpenWorkDirectoryCommand { get; } public ICommand OpenWorkDirectoryCommand { get; }
@ -72,18 +44,53 @@ namespace CtrEditor
var dialog = new VistaFolderBrowserDialog(); var dialog = new VistaFolderBrowserDialog();
if (dialog.ShowDialog() == true) // Mostrar el diálogo y comprobar si el resultado es positivo 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 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(); }
}
// Implementación de INotifyPropertyChanged... // 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; public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged([CallerMemberName] string propertyName = null) protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
{ {
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 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...
} }
} }

View File

@ -1,12 +1,8 @@
<Window x:Class="CtrEditor.MainWindow" <Window x:Class="CtrEditor.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:ctreditor="clr-namespace:CtrEditor" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Height="450" Width="800" Height="450" Width="800"
ResizeMode="CanResize" Title="{Binding directorioTrabajo}"> ResizeMode="CanResize" Title="C:/">
<Window.DataContext>
<ctreditor:MainViewModel/>
</Window.DataContext>
<Grid> <Grid>
<!-- Menú Principal sobre toda la ventana --> <!-- Menú Principal sobre toda la ventana -->
@ -34,7 +30,7 @@
<RowDefinition Height="2*"/> <RowDefinition Height="2*"/>
<RowDefinition Height="1*"/> <RowDefinition Height="1*"/>
</Grid.RowDefinitions> </Grid.RowDefinitions>
<ListBox x:Name="ListaImagenes" Grid.Row="0" Margin="5" ItemsSource="{Binding listaImagenes}" SelectedItem="{Binding SelectedImage}" /> <ListBox x:Name="ListaImagenes" Grid.Row="0" Margin="5" ItemsSource="{Binding ImageList}" SelectedItem="{Binding SelectedImage}" />
<ListBox x:Name="ListaFunciones" Grid.Row="1" Margin="5"/> <ListBox x:Name="ListaFunciones" Grid.Row="1" Margin="5"/>
</Grid> </Grid>
@ -52,12 +48,14 @@
<MenuItem Header="Eliminar"/> <MenuItem Header="Eliminar"/>
</Menu> </Menu>
<ScrollViewer x:Name="ImagenEnTrabajoScrollViewer" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto" PanningMode="Both"> <ScrollViewer Grid.Row="1" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
<Canvas x:Name="ImagenEnTrabajoCanvas" Margin="200"> <Canvas x:Name="ImagenEnTrabajoCanvas" Background="Beige" Margin="5">
<!-- El Margin puede ser ajustado según el espacio adicional que quieras proporcionar --> <Canvas.RenderTransform>
<Canvas.LayoutTransform> <TransformGroup>
<ScaleTransform ScaleX="1" ScaleY="1"/> <ScaleTransform ScaleX="{Binding ZoomFactor}" ScaleY="{Binding ZoomFactor}"/>
</Canvas.LayoutTransform> <TranslateTransform X="{Binding OffsetX}" Y="{Binding OffsetY}"/>
</TransformGroup>
</Canvas.RenderTransform>
</Canvas> </Canvas>
</ScrollViewer> </ScrollViewer>
</Grid> </Grid>

View File

@ -16,136 +16,11 @@ namespace CtrEditor
/// </summary> /// </summary>
public partial class MainWindow : Window public partial class MainWindow : Window
{ {
private Point _lastMousePosition;
private bool _isDrawing = false;
private bool _isDragging = false;
private Image imagenDeFondo;
public MainWindow() public MainWindow()
{ {
InitializeComponent(); InitializeComponent();
this.Loaded += MainWindow_Loaded;
ImagenEnTrabajoScrollViewer.PreviewMouseWheel += ImagenEnTrabajoCanvas_MouseWheel;
ImagenEnTrabajoCanvas.MouseDown += Canvas_MouseDown_Panning;
ImagenEnTrabajoCanvas.MouseMove += Canvas_MouseMove_Panning;
ImagenEnTrabajoCanvas.MouseUp += Canvas_MouseUp_Panning;
}
private void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
if (DataContext is MainViewModel viewModel)
{
viewModel.ImageSelected += ViewModel_ImageSelected;
}
}
private void ViewModel_ImageSelected(object sender, string imagePath)
{
LoadImageToCanvas(imagePath);
} }
private void LoadImageToCanvas(string imagePath)
{
BitmapImage bitmap = new BitmapImage(new Uri(imagePath, UriKind.Absolute));
if (imagenDeFondo == null)
{
imagenDeFondo = new Image();
ImagenEnTrabajoCanvas.Children.Add(imagenDeFondo);
}
imagenDeFondo.Source = bitmap;
RenderOptions.SetBitmapScalingMode(imagenDeFondo, BitmapScalingMode.HighQuality);
// Elimina solo los ROIs, no la imagen de fondo
for (int i = ImagenEnTrabajoCanvas.Children.Count - 1; i >= 0; i--)
{
if (ImagenEnTrabajoCanvas.Children[i] is Rectangle)
{
ImagenEnTrabajoCanvas.Children.RemoveAt(i);
}
}
// Ajusta el tamaño del Canvas a la imagen, si es necesario
ImagenEnTrabajoCanvas.Width = bitmap.Width;
ImagenEnTrabajoCanvas.Height = bitmap.Height;
// Posiciona la imagen correctamente dentro del Canvas
Canvas.SetLeft(imagenDeFondo, 0);
Canvas.SetTop(imagenDeFondo, 0);
}
private void Canvas_MouseUp_Panning(object sender, MouseButtonEventArgs e)
{
if (_isDragging)
{
_isDragging = false;
ImagenEnTrabajoScrollViewer.ReleaseMouseCapture(); // Finaliza la captura del ratón
}
}
private void Canvas_MouseDown_Panning(object sender, MouseButtonEventArgs e)
{
if (e.LeftButton == MouseButtonState.Pressed && !_isDrawing)
{
// Indica que se inicia el panning
_isDragging = true;
// Guarda la posición actual del ratón
_lastMousePosition = e.GetPosition(ImagenEnTrabajoScrollViewer);
//ImagenEnTrabajoScrollViewer.CaptureMouse(); // Importante para capturar el movimiento
}
}
private void Canvas_MouseMove_Panning(object sender, MouseEventArgs e)
{
if (_isDragging && !_isDrawing)
{
// Calcula el nuevo desplazamiento basado en el movimiento del ratón
var currentPosition = e.GetPosition(ImagenEnTrabajoScrollViewer);
var dx = currentPosition.X - _lastMousePosition.X;
var dy = currentPosition.Y - _lastMousePosition.Y;
// Ajusta el desplazamiento del ScrollViewer
ImagenEnTrabajoScrollViewer.ScrollToHorizontalOffset(ImagenEnTrabajoScrollViewer.HorizontalOffset - dx);
ImagenEnTrabajoScrollViewer.ScrollToVerticalOffset(ImagenEnTrabajoScrollViewer.VerticalOffset - dy);
// Actualiza la posición del ratón para el próximo movimiento
_lastMousePosition = currentPosition;
}
}
private void ImagenEnTrabajoCanvas_MouseWheel(object sender, MouseWheelEventArgs e)
{
var st = (ScaleTransform)ImagenEnTrabajoCanvas.LayoutTransform;
double zoomFactor = e.Delta > 0 ? 1.1 : 0.9;
Point cursorPosition = e.GetPosition(ImagenEnTrabajoScrollViewer);
// Calcular el punto focal del zoom relativo al contenido del ScrollViewer
var absoluteX = ImagenEnTrabajoScrollViewer.HorizontalOffset + cursorPosition.X;
var absoluteY = ImagenEnTrabajoScrollViewer.VerticalOffset + cursorPosition.Y;
// Aplicar el zoom
st.ScaleX *= zoomFactor;
st.ScaleY *= zoomFactor;
// Calcular el nuevo desplazamiento para que el zoom se centre en la posición del cursor
ImagenEnTrabajoScrollViewer.UpdateLayout(); // Asegurarse de que el layout del ScrollViewer esté actualizado
var newHorizontalOffset = absoluteX * zoomFactor - cursorPosition.X;
var newVerticalOffset = absoluteY * zoomFactor - cursorPosition.Y;
// Aplicar el nuevo desplazamiento
ImagenEnTrabajoScrollViewer.ScrollToHorizontalOffset(newHorizontalOffset);
ImagenEnTrabajoScrollViewer.ScrollToVerticalOffset(newVerticalOffset);
e.Handled = true; // Evita el procesamiento adicional del evento
}
private void MainWindow_Closed(object sender, EventArgs e)
{
if (DataContext is MainViewModel viewModel)
{
viewModel.ImageSelected -= ViewModel_ImageSelected;
}
}
} }
} }

View File

@ -25,5 +25,4 @@ namespace CtrEditor
InitializeComponent(); InitializeComponent();
} }
} }
} }

View File

@ -25,5 +25,4 @@ namespace CtrEditor
InitializeComponent(); InitializeComponent();
} }
} }
} }

View File

@ -21,7 +21,7 @@ namespace CtrEditor
private string _strDirectorioTrabajo; private string _strDirectorioTrabajo;
// Propiedad pública con get y set para controlar el acceso a _strDirectorioTrabajo // Propiedad pública con get y set para controlar el acceso a _strDirectorioTrabajo
public string directorio public string DirectorioTrabajo
{ {
get { return _strDirectorioTrabajo; } get { return _strDirectorioTrabajo; }
set { _strDirectorioTrabajo = value; } set { _strDirectorioTrabajo = value; }