diff --git a/MainWindow.xaml.cs b/MainWindow.xaml.cs index f1207f7..e426ddd 100644 --- a/MainWindow.xaml.cs +++ b/MainWindow.xaml.cs @@ -16,6 +16,7 @@ using System.Text.RegularExpressions; using System.Collections.Generic; using System; using System.Linq; +using System.Threading.Tasks; namespace CtrEditor { @@ -660,7 +661,7 @@ namespace CtrEditor } // Agregar opciones de pegado - if (Clipboard.ContainsText()) + if (CanPasteFromClipboard()) { var pasteMenuItem = new MenuItem { Header = "Pegar (Ctrl+V)" }; pasteMenuItem.Click += (s, e) => PasteObjectsFromJson(); @@ -957,13 +958,77 @@ namespace CtrEditor } } - // Seleccionar los objetos pegados - foreach (var obj in newlyPastedObjects) + // Forzar actualización del layout para asegurar que los objetos estén renderizados + ImagenEnTrabajoCanvas.UpdateLayout(); + + // Usar Task.Delay para dar más tiempo al renderizado completo + Task.Delay(100).ContinueWith(_ => { - _objectManager.SelectObject(obj); - } + Application.Current.Dispatcher.Invoke(() => + { + try + { + // Forzar una segunda actualización del layout + ImagenEnTrabajoCanvas.UpdateLayout(); + + // Validar que los objetos tengan representación visual antes de seleccionar + var validObjects = newlyPastedObjects.Where(obj => + obj.VisualRepresentation != null && + ImagenEnTrabajoCanvas.Children.Contains(obj.VisualRepresentation)).ToList(); + + Console.WriteLine($"Intentando seleccionar {validObjects.Count} de {newlyPastedObjects.Count} objetos pegados"); + + if (validObjects.Count > 0) + { + // Limpiar selección actual primero + _objectManager.ClearSelection(); + + // Seleccionar los objetos válidos uno por uno con verificación + foreach (var obj in validObjects) + { + try + { + if (obj.VisualRepresentation != null) + { + Console.WriteLine($"Seleccionando objeto: {obj.Nombre} (ID: {obj.Id.Value})"); + _objectManager.SelectObject(obj); + } + } + catch (Exception objEx) + { + Console.WriteLine($"Error al seleccionar objeto {obj.Nombre}: {objEx.Message}"); + } + } + + // Actualizar visuales de selección con manejo de errores + try + { + _objectManager.UpdateSelectionVisuals(); + Console.WriteLine($"Seleccionados exitosamente {_objectManager.SelectedObjects.Count} objetos"); + } + catch (Exception visEx) + { + Console.WriteLine($"Error al actualizar visuales de selección: {visEx.Message}"); + Console.WriteLine($"Stack trace: {visEx.StackTrace}"); + } + } + else + { + Console.WriteLine("No se pudieron seleccionar los objetos pegados - representación visual no válida"); + foreach (var obj in newlyPastedObjects) + { + Console.WriteLine($"Objeto {obj.Nombre}: VisualRep={obj.VisualRepresentation != null}, EnCanvas={obj.VisualRepresentation != null && ImagenEnTrabajoCanvas.Children.Contains(obj.VisualRepresentation)}"); + } + } + } + catch (Exception ex) + { + Console.WriteLine($"Error general al seleccionar objetos pegados: {ex.Message}"); + Console.WriteLine($"Stack trace: {ex.StackTrace}"); + } + }); + }); - _objectManager.UpdateSelectionVisuals(); viewModel.HasUnsavedChanges = true; Console.WriteLine($"Pegados {newlyPastedObjects.Count} objeto(s) desde el portapapeles"); @@ -974,6 +1039,56 @@ namespace CtrEditor MessageBox.Show($"Error al pegar objetos: {ex.Message}", "Error", MessageBoxButton.OK, MessageBoxImage.Error); } } + + private bool CanPasteFromClipboard() + { + if (!Clipboard.ContainsText()) + return false; + + try + { + string jsonString = Clipboard.GetText(); + + // Validación básica del JSON + if (string.IsNullOrWhiteSpace(jsonString) || + (!jsonString.TrimStart().StartsWith("[") && !jsonString.TrimStart().StartsWith("{"))) + { + return false; + } + + // Intentar una deserialización rápida para validar + var settings = new JsonSerializerSettings + { + TypeNameHandling = TypeNameHandling.Auto, + ObjectCreationHandling = ObjectCreationHandling.Replace, + ConstructorHandling = ConstructorHandling.AllowNonPublicDefaultConstructor + }; + + // Intentar deserializar como lista de objetos + try + { + var pastedObjects = JsonConvert.DeserializeObject>(jsonString, settings); + return pastedObjects != null && pastedObjects.Any(); + } + catch + { + // Si falla como lista, intentar como objeto individual + try + { + var singleObject = JsonConvert.DeserializeObject(jsonString, settings); + return singleObject != null; + } + catch + { + return false; + } + } + } + catch + { + return false; + } + } } public class FloatValidationRule : ValidationRule