Mejorado de delete y dumplicate para objetos multiples
This commit is contained in:
parent
736068619a
commit
fe8f2119ce
|
@ -18,6 +18,12 @@ namespace CtrEditor.Controls
|
||||||
UserControlFactory.CargarPropiedadesosDatos(selectedObject, PropertyGridControl);
|
UserControlFactory.CargarPropiedadesosDatos(selectedObject, PropertyGridControl);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Add a new method to clear properties
|
||||||
|
public void ClearProperties()
|
||||||
|
{
|
||||||
|
UserControlFactory.LimpiarPropiedadesosDatos(PropertyGridControl);
|
||||||
|
}
|
||||||
|
|
||||||
public bool IsKeyboardFocusWithin => PropertyGridControl.IsKeyboardFocusWithin;
|
public bool IsKeyboardFocusWithin => PropertyGridControl.IsKeyboardFocusWithin;
|
||||||
|
|
||||||
private void ImagePathButton_Click(object sender, RoutedEventArgs e)
|
private void ImagePathButton_Click(object sender, RoutedEventArgs e)
|
||||||
|
|
|
@ -273,10 +273,9 @@ namespace CtrEditor
|
||||||
|
|
||||||
partial void OnSelectedItemOsListChanged(osBase value)
|
partial void OnSelectedItemOsListChanged(osBase value)
|
||||||
{
|
{
|
||||||
if (value != null)
|
// Enable delete and duplicate commands when either an individual item is selected
|
||||||
habilitarEliminarUserControl = true;
|
// or when there are multiple objects selected
|
||||||
else
|
habilitarEliminarUserControl = _objectManager.SelectedObjects.Count > 0;
|
||||||
habilitarEliminarUserControl = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -519,8 +518,66 @@ namespace CtrEditor
|
||||||
|
|
||||||
private void DuplicarUserControl()
|
private void DuplicarUserControl()
|
||||||
{
|
{
|
||||||
if (SelectedItemOsList is osBase objDuplicar)
|
if (_objectManager.SelectedObjects.Count > 0)
|
||||||
DuplicarObjeto(objDuplicar, 0.5f, 0.5f);
|
{
|
||||||
|
// Create a copy of the selected objects to avoid issues during iteration
|
||||||
|
var objectsToDuplicate = _objectManager.SelectedObjects.ToList();
|
||||||
|
|
||||||
|
// Clear current selection before duplicating
|
||||||
|
_objectManager.ClearSelection();
|
||||||
|
|
||||||
|
// Track all newly created objects
|
||||||
|
var newObjects = new List<osBase>();
|
||||||
|
|
||||||
|
// Duplicate each object with a small offset
|
||||||
|
float offsetX = 0.5f;
|
||||||
|
float offsetY = 0.5f;
|
||||||
|
|
||||||
|
foreach (var objToDuplicate in objectsToDuplicate)
|
||||||
|
{
|
||||||
|
var newObj = DuplicarObjeto(objToDuplicate, offsetX, offsetY);
|
||||||
|
if (newObj != null)
|
||||||
|
{
|
||||||
|
newObjects.Add(newObj);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Force a complete layout update to ensure all controls are positioned
|
||||||
|
MainWindow.ImagenEnTrabajoCanvas.UpdateLayout();
|
||||||
|
|
||||||
|
// Use a dispatcher to delay the selection until the UI has had time to fully render
|
||||||
|
Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Render, new Action(() =>
|
||||||
|
{
|
||||||
|
// Select all newly created objects
|
||||||
|
foreach (var newObj in newObjects)
|
||||||
|
{
|
||||||
|
if (newObj.VisualRepresentation != null)
|
||||||
|
{
|
||||||
|
double left = Canvas.GetLeft(newObj.VisualRepresentation);
|
||||||
|
double top = Canvas.GetTop(newObj.VisualRepresentation);
|
||||||
|
|
||||||
|
// Only add to selection if the object has valid coordinates
|
||||||
|
if (!double.IsNaN(left) && !double.IsNaN(top) && !double.IsInfinity(left) && !double.IsInfinity(top))
|
||||||
|
{
|
||||||
|
_objectManager.SelectObject(newObj);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Force another layout update before updating selection visuals
|
||||||
|
MainWindow.ImagenEnTrabajoCanvas.UpdateLayout();
|
||||||
|
|
||||||
|
// Update SelectedItemOsList if there are newly created objects
|
||||||
|
if (newObjects.Count > 0)
|
||||||
|
{
|
||||||
|
// Set to the last duplicated object so it's visible in the property panel
|
||||||
|
SelectedItemOsList = newObjects.LastOrDefault();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Now update selection visuals
|
||||||
|
_objectManager.UpdateSelectionVisuals();
|
||||||
|
}));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public osBase DuplicarObjeto(osBase objDuplicar, float OffsetX, float OffsetY)
|
public osBase DuplicarObjeto(osBase objDuplicar, float OffsetX, float OffsetY)
|
||||||
|
@ -575,6 +632,7 @@ namespace CtrEditor
|
||||||
private void EliminarUserControl()
|
private void EliminarUserControl()
|
||||||
{
|
{
|
||||||
_objectManager.EliminarObjetosSeleccionados();
|
_objectManager.EliminarObjetosSeleccionados();
|
||||||
|
SelectedItemOsList = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -886,9 +944,17 @@ namespace CtrEditor
|
||||||
|
|
||||||
// Se cargan los datos de cada UserControl en el StackPanel
|
// Se cargan los datos de cada UserControl en el StackPanel
|
||||||
public void CargarPropiedadesosDatos(osBase selectedObject, Controls.PanelEdicionControl PanelEdicion, ResourceDictionary Resources)
|
public void CargarPropiedadesosDatos(osBase selectedObject, Controls.PanelEdicionControl PanelEdicion, ResourceDictionary Resources)
|
||||||
|
{
|
||||||
|
if (selectedObject == null)
|
||||||
|
{
|
||||||
|
// Clear the property panel when no object is selected
|
||||||
|
PanelEdicion.ClearProperties();
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
PanelEdicion.CargarPropiedades(selectedObject);
|
PanelEdicion.CargarPropiedades(selectedObject);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private RelayCommand saveCommand;
|
private RelayCommand saveCommand;
|
||||||
public ICommand SaveCommand => saveCommand ??= new RelayCommand(Save);
|
public ICommand SaveCommand => saveCommand ??= new RelayCommand(Save);
|
||||||
|
@ -1010,6 +1076,12 @@ namespace CtrEditor
|
||||||
HasUnsavedChanges = true;
|
HasUnsavedChanges = true;
|
||||||
_objectManager.UpdateSelectionVisuals();
|
_objectManager.UpdateSelectionVisuals();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Add this method to MainViewModel class
|
||||||
|
public void NotifySelectionChanged()
|
||||||
|
{
|
||||||
|
OnPropertyChanged(nameof(SelectedItemOsList));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class SimulationData
|
public class SimulationData
|
||||||
|
|
|
@ -319,7 +319,6 @@ namespace CtrEditor
|
||||||
|
|
||||||
private void ListaOs_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
|
private void ListaOs_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (e.AddedItems.Count > 0 && e.AddedItems[0] is osBase selectedObject)
|
if (e.AddedItems.Count > 0 && e.AddedItems[0] is osBase selectedObject)
|
||||||
{
|
{
|
||||||
// Siempre trabajar con selección única para las propiedades
|
// Siempre trabajar con selección única para las propiedades
|
||||||
|
@ -327,8 +326,10 @@ namespace CtrEditor
|
||||||
|
|
||||||
_objectManager.SelectObject(selectedObject);
|
_objectManager.SelectObject(selectedObject);
|
||||||
}
|
}
|
||||||
else
|
else if (e.RemovedItems.Count > 0 && e.AddedItems.Count == 0)
|
||||||
{
|
{
|
||||||
|
// This handles the case when an item is deselected and no new item is selected
|
||||||
|
CargarPropiedadesosDatos(null);
|
||||||
_objectManager.RemoveResizeRectangles();
|
_objectManager.RemoveResizeRectangles();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -367,6 +368,7 @@ namespace CtrEditor
|
||||||
{
|
{
|
||||||
if (e.Key == Key.Delete)
|
if (e.Key == Key.Delete)
|
||||||
{
|
{
|
||||||
|
// This will delete all selected objects
|
||||||
_objectManager.EliminarObjetosSeleccionados();
|
_objectManager.EliminarObjetosSeleccionados();
|
||||||
e.Handled = true;
|
e.Handled = true;
|
||||||
}
|
}
|
||||||
|
@ -443,7 +445,15 @@ namespace CtrEditor
|
||||||
private void CargarPropiedadesosDatos(osBase selectedObject)
|
private void CargarPropiedadesosDatos(osBase selectedObject)
|
||||||
{
|
{
|
||||||
if (DataContext is MainViewModel viewModel)
|
if (DataContext is MainViewModel viewModel)
|
||||||
|
{
|
||||||
viewModel.CargarPropiedadesosDatos(selectedObject, PanelEdicion, Resources);
|
viewModel.CargarPropiedadesosDatos(selectedObject, PanelEdicion, Resources);
|
||||||
|
|
||||||
|
// If no object is selected, make sure to clear the properties panel
|
||||||
|
if (selectedObject == null)
|
||||||
|
{
|
||||||
|
PanelEdicion.ClearProperties();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public (float X, float Y) ObtenerCentroCanvasMeters()
|
public (float X, float Y) ObtenerCentroCanvasMeters()
|
||||||
|
|
|
@ -429,6 +429,9 @@ namespace CtrEditor
|
||||||
}
|
}
|
||||||
|
|
||||||
UpdateSelectionVisuals();
|
UpdateSelectionVisuals();
|
||||||
|
|
||||||
|
// Update the view model's selection state
|
||||||
|
vm.NotifySelectionChanged();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -440,6 +443,12 @@ namespace CtrEditor
|
||||||
_selectedObjects.Remove(obj);
|
_selectedObjects.Remove(obj);
|
||||||
obj.IsSelected = false;
|
obj.IsSelected = false;
|
||||||
RemoveSelectionHighlight(obj.VisualRepresentation);
|
RemoveSelectionHighlight(obj.VisualRepresentation);
|
||||||
|
|
||||||
|
// Update the view model's selection state
|
||||||
|
if (_mainWindow.DataContext is MainViewModel vm)
|
||||||
|
{
|
||||||
|
vm.NotifySelectionChanged();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -899,6 +908,9 @@ namespace CtrEditor
|
||||||
RemoveResizeRectangles();
|
RemoveResizeRectangles();
|
||||||
RemoveAllSelectionHighlights();
|
RemoveAllSelectionHighlights();
|
||||||
|
|
||||||
|
// Ensure the property panel is cleared by explicitly setting SelectedItemOsList to null
|
||||||
|
viewModel.SelectedItemOsList = null;
|
||||||
|
|
||||||
// Actualizar el estado de cambios sin guardar
|
// Actualizar el estado de cambios sin guardar
|
||||||
if (viewModel != null)
|
if (viewModel != null)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue