Luego de AgregarDirectorio de trabajo
This commit is contained in:
parent
2243c5ac9e
commit
a86a84bd9f
|
@ -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");
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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;
|
|
@ -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">
|
||||
<!-- 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>
|
||||
|
||||
<!-- 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>
|
||||
|
||||
|
||||
<!-- Panel derecho dividido en dos para ROIs y formulario -->
|
||||
<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>
|
||||
|
||||
|
||||
|
|
|
@ -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
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -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>
|
||||
|
|
Loading…
Reference in New Issue