Marcado en purpura el objeto tomado de referencia

This commit is contained in:
Miguel 2025-02-20 13:17:03 +01:00
parent 38ca212d9f
commit 0a52c543e6
2 changed files with 31 additions and 27 deletions

View File

@ -7,10 +7,12 @@ namespace CtrEditor
public class ObjectAlignment
{
private readonly ObservableCollection<osBase> _selectedObjects;
private readonly osBase _referenceObject;
public ObjectAlignment(ObservableCollection<osBase> selectedObjects)
public ObjectAlignment(ObservableCollection<osBase> 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;
}

View File

@ -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)
{