Luego de AgregarDirectorio de trabajo

This commit is contained in:
Miguel 2024-04-14 09:47:56 +02:00
parent 2243c5ac9e
commit a86a84bd9f
5 changed files with 181 additions and 51 deletions

42
EstadoTrabajo.cs Normal file
View File

@ -0,0 +1,42 @@
using Newtonsoft.Json;
using System.IO;
using Path = System.IO.Path;
namespace ROIEditor
{
public class EstadoTrabajo
{
public string strDirectorioTrabajo;
public string NombreImagenEditando;
private static string _filePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "EstadoTrabajo.json");
public EstadoTrabajo()
{
strDirectorioTrabajo = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
NombreImagenEditando = null;
}
// Método para guardar el estado en un archivo JSON
public void GuardarEstado()
{
string json = JsonConvert.SerializeObject(this);
File.WriteAllText(_filePath, json);
}
// Método para cargar el estado desde un archivo JSON
public static EstadoTrabajo CargarEstado()
{
if (File.Exists(_filePath))
{
string json = File.ReadAllText(_filePath);
return JsonConvert.DeserializeObject<EstadoTrabajo>(json);
}
return new EstadoTrabajo(); // Devuelve una nueva instancia si no existe el archivo
}
public string CarpetaDB()
{
return Path.Combine(strDirectorioTrabajo, "roieditor.db");
}
}
}

View File

@ -11,7 +11,7 @@ using System.ComponentModel;
namespace ROIEditor
{
public class DatabaseManagerList<T>
public class ListaPersistente<T>
{
private readonly string connectionString;
private readonly string tableName;
@ -46,7 +46,7 @@ namespace ROIEditor
public int Count => data.Count;
public DatabaseManagerList(string dbPath, string tableName)
public ListaPersistente(string dbPath, string tableName)
{
connectionString = $"Data Source={dbPath}";
this.tableName = tableName;
@ -130,14 +130,14 @@ namespace ROIEditor
}
}
public class DatabaseManagerItem<T> where T : new()
public class ItemPersistente<T> where T : new()
{
private readonly string connectionString;
private readonly string tableName;
private T data; // Ahora 'data' es un objeto de tipo T
public string Clave;
public DatabaseManagerItem(string dbPath, string tableName)
public ItemPersistente(string dbPath, string tableName)
{
connectionString = $"Data Source={dbPath}";
this.tableName = tableName;

View File

@ -21,57 +21,85 @@
</Style>
</Window.Resources>
<DockPanel LastChildFill="True">
<!-- Panel izquierdo para la lista de imágenes -->
<ListBox x:Name="ListaImagenes" DockPanel.Dock="Left" Width="200" Margin="5">
<!-- Aquí irán los elementos de la lista de imágenes -->
</ListBox>
<!-- Campo de texto y botón para directorio de trabajo en la parte superior -->
<Grid DockPanel.Dock="Top" Height="25" Margin="5">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<!-- Esta columna ocupa todo el espacio disponible -->
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
<!-- Esta columna ocupa solo el espacio necesario para el contenido, en este caso, el botón -->
</Grid.ColumnDefinitions>
<TextBox x:Name="DirectorioTrabajo" Grid.Column="0" Margin="5,0"/>
<Button x:Name="SeleccionarDirectorio" Grid.Column="1" Width="130" Content="Seleccionar Directorio" Margin="5,0" Click="SeleccionarDirectorio_Click"/>
<Button x:Name="LeerDirectorio" Grid.Column="2" Width="130" Content="Leer Directorio" Margin="5,0" Click="LeerDirectorio_Click"/>
</Grid>
<!-- Panel izquierdo para la lista de imágenes y funciones -->
<Grid DockPanel.Dock="Left" Width="200" Margin="5">
<Grid.RowDefinitions>
<RowDefinition Height="3*"/>
<!-- Esta fila ocupará 1/3 del espacio disponible -->
<RowDefinition Height="1*"/>
<!-- Esta fila ocupará 2/3 del espacio disponible -->
</Grid.RowDefinitions>
<ListBox x:Name="ListaFunciones" Grid.Row="0" Margin="0,0,0,5">
<!-- Aquí irán los elementos de la lista de funciones -->
</ListBox>
<ListBox x:Name="ListaImagenes" Grid.Row="1" Margin="0,5,0,0">
<!-- Aquí irán los elementos de la lista de imágenes -->
</ListBox>
</Grid>
<!-- Panel derecho dividido en dos para ROIs y formulario -->
<DockPanel DockPanel.Dock="Right" Width="400" Margin="5">
<!-- Lista de ROIs -->
<ListBox x:Name="ListaROIs" DockPanel.Dock="Top" Height="300" Margin="0,0,0,5"/>
<Grid DockPanel.Dock="Right" Width="400" Margin="5">
<Grid.RowDefinitions>
<RowDefinition Height="1*"/>
<!-- Espacio para la lista de ROIs -->
<RowDefinition Height="*"/>
<!-- Espacio restante para el formulario -->
</Grid.RowDefinitions>
<!-- Lista de ROIs -->
<ListBox x:Name="ListaROIs" Grid.Row="0" Margin="0,0,0,5">
<!-- Elementos de la lista de ROIs aquí -->
</ListBox>
<!-- Formulario para detalles del ROI -->
<StackPanel DockPanel.Dock="Bottom" Margin="0,5,0,0">
<StackPanel Grid.Row="1" Margin="0,5,0,0">
<!-- Coordenadas X,Y -->
<Label Content="Coordenadas X,Y:"/>
<TextBox x:Name="ROI_xy" Margin="0,0,0,5"/>
<!-- DX, DY -->
<Label Content="DX, DY:"/>
<TextBox x:Name="ROI_dxdy" Margin="0,0,0,5"/>
<!-- Nombre -->
<Label Content="Nombre:"/>
<TextBox x:Name="ROI_nombre" Margin="0,0,0,5"/>
<!-- Código Numérico -->
<Label Content="Código Numérico:"/>
<TextBox x:Name="ROI_num" Margin="0,0,0,5"/>
<!-- Descripción -->
<Label Content="Descripción:"/>
<TextBox x:Name="ROI_descripcion" Margin="0,0,0,5"/>
<!-- Campo de texto 1 -->
<Label Content="Campo de texto 1:"/>
<TextBox x:Name="ROI_text1" Margin="0,0,0,5"/>
<!-- Campo de texto 2 -->
<Label Content="Campo de texto 2:"/>
<TextBox x:Name="ROI_text2" Margin="0,0,0,5"/>
<!-- Campo de texto 3 -->
<Label Content="Campo de texto 3:"/>
<TextBox x:Name="ROI_text3" Margin="0,0,0,5"/>
<!-- Botones -->
<Button x:Name="Guardar_ROI" Content="Guardar" Margin="0,0,0,5"/>
<Button x:Name="Borrar_ROI" Content="Borrar ROI"/>
</StackPanel>
</Grid>
</DockPanel>
<!-- Centro para la imagen con soporte de paneo y zoom -->
<ScrollViewer x:Name="ImagenEnTrabajoScrollViewer" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
@ -81,9 +109,6 @@
<ScaleTransform ScaleX="1" ScaleY="1"/>
</Canvas.LayoutTransform>
</Canvas>
</ScrollViewer>
</DockPanel>
</Window>

View File

@ -1,6 +1,4 @@
using Newtonsoft.Json;
using System.Diagnostics.Eventing.Reader;
using System.IO;
using System.IO;
using System.Text;
using System.Windows;
using System.Windows.Controls;
@ -14,7 +12,6 @@ using System.Windows.Shapes;
using Path = System.IO.Path;
namespace ROIEditor
{
/// <summary>
@ -25,20 +22,23 @@ namespace ROIEditor
private Point? clickPosition = null;
private bool _isDrawing = false;
private bool _EstaCargandoTrabajo = false;
private Point _startPosition;
private Rectangle _currentRect = null;
private Image imagenDeFondo;
private bool _isDragging = false;
private Point _lastMousePosition;
private string NombreImagenEditando;
private DatabaseManagerList<Roi> ListaDeROIs = new DatabaseManagerList<Roi>("roiseditor.db","ROIs");
private DatabaseManagerItem<ImagenEstado> EstadoImagenActual = new DatabaseManagerItem<ImagenEstado>("imagenes.db","estados");
private ListaPersistente<Roi> ListaDeROIs;
private ItemPersistente<ImagenEstado> EstadoImagenActual;
private EstadoTrabajo Estado;
// Constructor de MainWindow
public MainWindow()
{
InitializeComponent();
CargarImagenes();
this.Closing += MainWindow_Closing; // Suscribir al evento Closing
ListaImagenes.SelectionChanged += ListaImagenes_SelectionChanged;
ImagenEnTrabajoCanvas.MouseLeftButtonDown += ImagenEnTrabajoCanvas_MouseLeftButtonDown;
@ -70,8 +70,63 @@ namespace ROIEditor
ROI_text2.LostFocus += GuardarCambiosRoi;
ROI_text3.LostFocus += GuardarCambiosRoi;
// Se carga el ultimo estado
Estado = EstadoTrabajo.CargarEstado();
DirectorioTrabajo.Text = Estado.strDirectorioTrabajo;
ActualizarPorCambioDirTrabajo();
}
private void MainWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
SalvarEstadoImgen_y_ROIs();
Estado.GuardarEstado(); // Guardar el estado cuando la ventana se cierra
}
private void SeleccionarDirectorio_Click(object sender, RoutedEventArgs e)
{
var dialog = new Ookii.Dialogs.Wpf.VistaFolderBrowserDialog();
if (dialog.ShowDialog(this).GetValueOrDefault())
{
DirectorioTrabajo.Text = dialog.SelectedPath;
if (Estado.strDirectorioTrabajo != DirectorioTrabajo.Text)
{
Estado.strDirectorioTrabajo = DirectorioTrabajo.Text;
ActualizarPorCambioDirTrabajo();
}
}
}
private void LeerDirectorio_Click(object sender, RoutedEventArgs e)
{
ActualizarPorCambioDirTrabajo();
}
private void ActualizarPorCambioDirTrabajo()
{
string dbPath = Estado.CarpetaDB();
_EstaCargandoTrabajo = true;
ListaDeROIs = new ListaPersistente<Roi>(dbPath, "ROIs");
EstadoImagenActual = new ItemPersistente<ImagenEstado>(dbPath, "estados");
CargarImagenes();
if (!string.IsNullOrEmpty(Estado.NombreImagenEditando))
{
for (int i = 0; i < ListaImagenes.Items.Count; i++)
{
if ((string)ListaImagenes.Items[i] == Estado.NombreImagenEditando)
{
ListaImagenes.SelectedIndex = i; // Selecciona el ítem que coincide con el último editado
break;
}
}
}
_EstaCargandoTrabajo = false;
}
private void ListaROIs_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
@ -370,32 +425,27 @@ namespace ROIEditor
}
public string PathPlantillasJson()
{
string jsonPath = Path.ChangeExtension(NombreImagenEditando, ".json");
string jsonPath = Path.ChangeExtension(Estado.NombreImagenEditando, ".json");
var imagePath = Path.Combine(Directory.GetCurrentDirectory(), "Plantillas", jsonPath);
return imagePath;
}
public string PathPlantillasPNG()
{
string jsonPath = Path.ChangeExtension(NombreImagenEditando, ".png");
string jsonPath = Path.ChangeExtension(Estado.NombreImagenEditando, ".png");
var imagePath = Path.Combine(Directory.GetCurrentDirectory(), "Plantillas", jsonPath);
return imagePath;
}
private void ListaImagenes_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (ListaImagenes.SelectedItem != null)
{
if (NombreImagenEditando != null)
{
SalvarEstadoImagen();
}
if (ListaDeROIs.Count>0)
{
ListaDeROIs.Save();
}
NombreImagenEditando = ListaImagenes.SelectedItem.ToString();
SalvarEstadoImgen_y_ROIs();
ListaDeROIs.Load(NombreImagenEditando);
Estado.NombreImagenEditando = ListaImagenes.SelectedItem.ToString();
ListaDeROIs.Load(Estado.NombreImagenEditando);
ActualizarListaROIsEnUI();
var imagePath = PathPlantillasPNG();
@ -405,10 +455,26 @@ namespace ROIEditor
}
}
private void SalvarEstadoImgen_y_ROIs()
{
if (!_EstaCargandoTrabajo)
{
// Si es igual es porque es la primera vez que se carga
if (Estado.NombreImagenEditando != null)
{
SalvarEstadoImagen();
}
if (ListaDeROIs.Count > 0)
{
ListaDeROIs.Save();
}
}
}
private void CargarEstadoImagen()
{
var st = (ScaleTransform)ImagenEnTrabajoCanvas.LayoutTransform;
if (EstadoImagenActual.Load(NombreImagenEditando))
if (EstadoImagenActual.Load(Estado.NombreImagenEditando))
{
var EACargado = EstadoImagenActual.Get();
@ -444,7 +510,7 @@ namespace ROIEditor
ea.HorizontalOffset = ImagenEnTrabajoScrollViewer.HorizontalOffset;
ea.VerticalOffset = ImagenEnTrabajoScrollViewer.VerticalOffset;
EstadoImagenActual.Save(NombreImagenEditando);
EstadoImagenActual.Save(Estado.NombreImagenEditando);
}
@ -500,9 +566,5 @@ namespace ROIEditor
}
}
}
}

View File

@ -11,6 +11,7 @@
<ItemGroup>
<PackageReference Include="Microsoft.Data.Sqlite" Version="8.0.3" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="Ookii.Dialogs.Wpf" Version="5.0.1" />
</ItemGroup>
</Project>