From 0a52c543e6ad2fb9a1ec035c0c2f7285006b30ed Mon Sep 17 00:00:00 2001 From: Miguel Date: Thu, 20 Feb 2025 13:17:03 +0100 Subject: [PATCH] Marcado en purpura el objeto tomado de referencia --- ObjectAlignment.cs | 20 ++++++++++--------- ObjectManipulationManager.cs | 38 +++++++++++++++++++----------------- 2 files changed, 31 insertions(+), 27 deletions(-) diff --git a/ObjectAlignment.cs b/ObjectAlignment.cs index 7a8b25e..4a9bda1 100644 --- a/ObjectAlignment.cs +++ b/ObjectAlignment.cs @@ -7,10 +7,12 @@ namespace CtrEditor public class ObjectAlignment { private readonly ObservableCollection _selectedObjects; + private readonly osBase _referenceObject; - public ObjectAlignment(ObservableCollection selectedObjects) + public ObjectAlignment(ObservableCollection selectedObjects, osBase referenceObject = null) { _selectedObjects = selectedObjects; + _referenceObject = referenceObject ?? selectedObjects.FirstOrDefault(); } public void AlignLeft() @@ -139,11 +141,11 @@ namespace CtrEditor { if (_selectedObjects.Count <= 1) return; - float averageWidth = _selectedObjects.Average(obj => GetEffectiveDimensions(obj).Width); - foreach (var obj in _selectedObjects) + float referenceWidth = GetEffectiveDimensions(_referenceObject).Width; + foreach (var obj in _selectedObjects.Where(o => o != _referenceObject)) { var currentDims = GetEffectiveDimensions(obj); - SetEffectiveDimensions(obj, averageWidth, currentDims.Height); + SetEffectiveDimensions(obj, referenceWidth, currentDims.Height); } } @@ -151,11 +153,11 @@ namespace CtrEditor { if (_selectedObjects.Count <= 1) return; - float averageHeight = _selectedObjects.Average(obj => GetEffectiveDimensions(obj).Height); - foreach (var obj in _selectedObjects) + float referenceHeight = GetEffectiveDimensions(_referenceObject).Height; + foreach (var obj in _selectedObjects.Where(o => o != _referenceObject)) { var currentDims = GetEffectiveDimensions(obj); - SetEffectiveDimensions(obj, currentDims.Width, averageHeight); + SetEffectiveDimensions(obj, currentDims.Width, referenceHeight); } } @@ -163,8 +165,8 @@ namespace CtrEditor { if (_selectedObjects.Count <= 1) return; - float referenceAngle = _selectedObjects.First().Angulo; - foreach (var obj in _selectedObjects) + float referenceAngle = _referenceObject.Angulo; + foreach (var obj in _selectedObjects.Where(o => o != _referenceObject)) { obj.Angulo = referenceAngle; } diff --git a/ObjectManipulationManager.cs b/ObjectManipulationManager.cs index 0c9ef80..3360ef3 100644 --- a/ObjectManipulationManager.cs +++ b/ObjectManipulationManager.cs @@ -393,22 +393,14 @@ namespace CtrEditor } else { - // Agregar destacados de selección para los objetos ya seleccionados - foreach (var obj in _selectedObjects) - { - if (obj.VisualRepresentation != null) - { - AddSelectionHighlight(obj.VisualRepresentation); - } - } + UpdateAllSelectionHighlights(); } } - private void AddSelectionHighlight(UserControl userControl) + private void AddSelectionHighlight(UserControl userControl, bool isReference = false) { if (userControl == null) return; - // Primero remover cualquier highlight existente para este control RemoveSelectionHighlight(userControl); Rect boundingBox = VisualTreeHelper.GetDescendantBounds(userControl); @@ -420,8 +412,10 @@ namespace CtrEditor Width = transformedBoundingBox.Width, Height = transformedBoundingBox.Height, Fill = Brushes.Transparent, - Stroke = new SolidColorBrush(Color.FromArgb(180, 255, 0, 0)), - StrokeThickness = 2, + Stroke = new SolidColorBrush(isReference ? + Color.FromArgb(180, 128, 0, 128) : // Purple for reference + Color.FromArgb(180, 255, 0, 0)), // Red for others + StrokeThickness = isReference ? 3 : 2, // Más grueso para el de referencia Tag = "SelectionHighlight", IsHitTestVisible = false }; @@ -453,21 +447,28 @@ namespace CtrEditor _selectionHighlightPairs.Clear(); } - private void UpdateSelectionHighlights() + private void UpdateAllSelectionHighlights() { if (_mainWindow.DataContext is MainViewModel viewModel && viewModel.IsMultiSelectionActive) { RemoveAllSelectionHighlights(); + bool isFirst = true; foreach (var selectedObject in _selectedObjects) { if (selectedObject.VisualRepresentation != null) { - AddSelectionHighlight(selectedObject.VisualRepresentation); + AddSelectionHighlight(selectedObject.VisualRepresentation, isFirst); + isFirst = false; } } } } + private void UpdateSelectionHighlights() + { + UpdateAllSelectionHighlights(); + } + private void UserControl_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { if (!_isDrawingCanvas) @@ -557,7 +558,7 @@ namespace CtrEditor } _startPointUserControl = currentPosition; - UpdateSelectionHighlights(); + UpdateAllSelectionHighlights(); } private void UserControl_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) @@ -575,6 +576,7 @@ namespace CtrEditor RemoveAllSelectionHighlights(); // Remover antes de actualizar UpdateSelectionVisuals(); + UpdateAllSelectionHighlights(); // Restaurar los rectángulos de selección si es necesario if (_mainWindow.DataContext is MainViewModel viewModel && viewModel.IsMultiSelectionActive) @@ -703,7 +705,7 @@ namespace CtrEditor } _startPointUserControl = currentPosition; - UpdateSelectionHighlights(); + UpdateAllSelectionHighlights(); } private void HandleResizeForObject(osBase obj, Point currentPosition, bool activateSizeWidth, bool activateSizeHeight) @@ -737,14 +739,14 @@ namespace CtrEditor _lastAngle = (float)angle; } - UpdateSelectionHighlights(); + UpdateAllSelectionHighlights(); } public void AlignObjects(AlignmentType alignmentType) { if (_selectedObjects.Count <= 1) return; - var alignment = new ObjectAlignment(_selectedObjects); + var alignment = new ObjectAlignment(_selectedObjects, _selectedObjects.FirstOrDefault()); switch (alignmentType) {