Compare commits
No commits in common. "1e30f00c5790a1e226938dae60685c053ba8846a" and "a0de7441829409926101c59301381940481d76f0" have entirely different histories.
1e30f00c57
...
a0de744182
|
@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -9,62 +9,34 @@ 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; }
|
||||||
|
|
||||||
private void OpenWorkDirectory()
|
private void OpenWorkDirectory()
|
||||||
|
@ -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...
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -25,5 +25,4 @@ namespace CtrEditor
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,5 +25,4 @@ namespace CtrEditor
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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; }
|
||||||
|
|
Loading…
Reference in New Issue