From e935efb0cbf1af96833762ffa9f050da2c68dc2c Mon Sep 17 00:00:00 2001 From: Miguel Date: Fri, 13 Jun 2025 23:28:50 +0200 Subject: [PATCH] =?UTF-8?q?Se=20agreg=C3=B3=20la=20funci=C3=B3n=20CanPaste?= =?UTF-8?q?FromClipboard=20para=20validar=20el=20contenido=20del=20portapa?= =?UTF-8?q?peles=20antes=20de=20pegar=20objetos,=20mejorando=20la=20gesti?= =?UTF-8?q?=C3=B3n=20de=20errores=20y=20asegurando=20que=20solo=20se=20sel?= =?UTF-8?q?eccionen=20objetos=20con=20representaci=C3=B3n=20visual=20v?= =?UTF-8?q?=C3=A1lida.=20Se=20implement=C3=B3=20un=20retraso=20en=20la=20s?= =?UTF-8?q?elecci=C3=B3n=20para=20permitir=20el=20renderizado=20completo?= =?UTF-8?q?=20de=20los=20objetos=20pegados.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MainWindow.xaml.cs | 127 ++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 121 insertions(+), 6 deletions(-) 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