Improved selection logic

This commit is contained in:
Lars Brubaker 2017-08-22 15:55:52 -07:00
parent 241a514373
commit 98959561db
7 changed files with 87 additions and 69 deletions

View file

@ -879,7 +879,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
{
children.Add(DragDropSource);
});
Scene.Select(DragDropSource);
Scene.SelectedItem = DragDropSource;
itemAddedToScene = true;
}
@ -1050,7 +1050,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
{
Scene.ClearSelection();
foreach (var sceneItem in matchingSceneChildren)
foreach (var sceneItem in matchingSceneChildren.ToList())
{
Scene.AddToSelection(sceneItem);
}
@ -1240,14 +1240,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
{
if (Scene.HasSelection)
{
if (Scene.SelectedItem.ItemType == Object3DTypes.SelectionGroup)
{
Scene.ModifyChildren(ClearSelectionApplyChanges);
}
else
{
Scene.ClearSelection();
}
Scene.ClearSelection();
SelectedTransformChanged?.Invoke(this, null);
}
@ -1265,7 +1258,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
if (Scene.SelectedItem == null)
{
// No selection exists
Scene.Select(hitObject);
Scene.SelectedItem = hitObject;
}
else if ((ModifierKeys == Keys.Shift || ModifierKeys == Keys.Control)
&& !Scene.SelectedItem.Children.Contains(hitObject))
@ -1278,12 +1271,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
}
else if (ModifierKeys != Keys.Shift)
{
Scene.ModifyChildren(children =>
{
ClearSelectionApplyChanges(children);
});
Scene.Select(hitObject);
Scene.SelectedItem = hitObject;
}
PartHasBeenChanged();
@ -1326,12 +1314,6 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
}
}
public void ClearSelectionApplyChanges(List<IObject3D> target)
{
Scene.SelectedItem.CollapseInto(target);
Scene.ClearSelection();
}
public IntersectInfo GetIntersectPosition(Vector2 screenSpacePosition)
{
//Vector2 meshViewerWidgetScreenPosition = meshViewerWidget.TransformFromParentSpace(this, new Vector2(mouseEvent.X, mouseEvent.Y));
@ -1609,30 +1591,10 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
{
if (Scene.HasSelection)
{
var totalAABB = Scene.SelectedItem.GetAxisAlignedBoundingBox(Matrix4X4.Identity);
// move the objects to the right place
foreach(var child in Scene.SelectedItem.Children)
{
var childAABB = child.GetAxisAlignedBoundingBox(Scene.SelectedItem.Matrix);
var offset = new Vector3();
switch (alignment)
{
case AxisAlignment.Min:
offset[axisIndex] = totalAABB.minXYZ[axisIndex] - childAABB.minXYZ[axisIndex];
break;
var transformDatas = GetTransforms(axisIndex, alignment);
case AxisAlignment.Center:
offset[axisIndex] = totalAABB.Center[axisIndex] - childAABB.Center[axisIndex];
break;
this.Scene.UndoBuffer.AddAndDo(new TransformUndoCommand(transformDatas));
case AxisAlignment.Max:
{
offset[axisIndex] = totalAABB.maxXYZ[axisIndex] - childAABB.maxXYZ[axisIndex];
}
break;
}
child.Matrix *= Matrix4X4.CreateTranslation(offset);
}
//Scene.SelectedItem.MaterialIndex = extruderIndexCanPassToClick;
PartHasBeenChanged();
}
@ -1640,17 +1602,68 @@ namespace MatterHackers.MatterControl.PartPreviewWindow
alignButton.MouseEnter += (s2, e2) =>
{
// TODO: make a preview of the new positions
// make a preview of the new positions
var transformDatas = GetTransforms(axisIndex, alignment);
foreach (var transform in transformDatas)
{
var copy = transform.TransformedObject.Clone();
copy.Matrix = transform.RedoTransform;
copy.Color = new RGBA_Bytes(copy.Color, 126);
Scene.Children.Add(copy);
}
};
alignButton.MouseLeave += (s3, e3) =>
{
// TODO: clear the preview of the new positions
// clear the preview of the new positions
foreach(var child in Scene.Children.ToArray())
{
if(child.Color.Alpha0To255 == 126)
{
Scene.Children.Remove(child);
}
}
};
return alignButton;
}
private List<TransformData> GetTransforms(int axisIndex, AxisAlignment alignment)
{
var transformDatas = new List<TransformData>();
var totalAABB = Scene.SelectedItem.GetAxisAlignedBoundingBox(Matrix4X4.Identity);
// move the objects to the right place
foreach (var child in Scene.SelectedItem.Children)
{
var childAABB = child.GetAxisAlignedBoundingBox(Scene.SelectedItem.Matrix);
var offset = new Vector3();
switch (alignment)
{
case AxisAlignment.Min:
offset[axisIndex] = totalAABB.minXYZ[axisIndex] - childAABB.minXYZ[axisIndex];
break;
case AxisAlignment.Center:
offset[axisIndex] = totalAABB.Center[axisIndex] - childAABB.Center[axisIndex];
break;
case AxisAlignment.Max:
{
offset[axisIndex] = totalAABB.maxXYZ[axisIndex] - childAABB.maxXYZ[axisIndex];
}
break;
}
transformDatas.Add(new TransformData()
{
TransformedObject = child,
RedoTransform = child.Matrix * Matrix4X4.CreateTranslation(offset),
UndoTransform = child.Matrix,
});
}
return transformDatas;
}
internal GuiWidget AddMaterialControls()
{
var widget = new IgnoredPopupWidget()