bool RespondsToDragHandle(FPGameObject gameObject, FPDragHandle dragHandle) { bool respondsToWidth = gameObject.WidthSegments > 0; bool respondsToHeight = gameObject.HeightSegments > 0; if (!respondsToWidth && IsWidthHandle(dragHandle)) return false; if (!respondsToHeight && IsHeightHandle(dragHandle)) return false; return true; }
PointF PointFromHandleAroundRect(FPDragHandle handle, RectangleF rect) { switch (handle) { case FPDragHandle.TopLeft: return new PointF(rect.X, rect.Y); case FPDragHandle.BottomLeft: return new PointF(rect.X, rect.Y + rect.Height); case FPDragHandle.TopRight: return new PointF(rect.X + rect.Width, rect.Y); case FPDragHandle.BottomRight: return new PointF(rect.X + rect.Width, rect.Y + rect.Height); case FPDragHandle.MiddleLeft: return new PointF(rect.X, rect.Y + rect.Height / 2.0f); case FPDragHandle.MiddleTop: return new PointF(rect.X + rect.Width / 2.0f, rect.Y); case FPDragHandle.MiddleRight: return new PointF(rect.X + rect.Width, rect.Y + rect.Height / 2.0f); case FPDragHandle.MiddleBottom: return new PointF(rect.X + rect.Width / 2.0f, rect.Y + rect.Height); case FPDragHandle.Center: return new PointF(rect.X + rect.Width / 2.0f, rect.Y + rect.Height / 2.0f); default: return PointF.Empty; } }
bool IsWidthHandle(FPDragHandle handle) { switch (handle) { case FPDragHandle.TopLeft: case FPDragHandle.BottomLeft: case FPDragHandle.TopRight: case FPDragHandle.BottomRight: case FPDragHandle.MiddleLeft: case FPDragHandle.MiddleRight: return true; case FPDragHandle.MiddleTop: case FPDragHandle.MiddleBottom: case FPDragHandle.Center: case FPDragHandle.None: default: return false; } }
private void levelView_MouseMoved(object sender, MouseEventArgs e) { PointF location = LevelViewLocation(e); currentHandle = FPDragHandle.None; const float handleSize = 14.0f; RectangleF handleRect = new RectangleF(0.0f, 0.0f, handleSize, handleSize); if (selectedIndices.Count == 1) { var draggedObject = DraggedObject; for (FPDragHandle handle = FPDragHandle.TopLeft; handle < FPDragHandle.Center; handle++) { if (!RespondsToDragHandle(draggedObject, handle)) continue; PointF handlePoint = PointFromHandleAroundRect(handle, draggedObject.Rect); handleRect.X = handlePoint.X - handleRect.Width / 2.0f; handleRect.Y = handlePoint.Y - handleRect.Height / 2.0f; if (handleRect.Contains(location)) { currentHandle = handle; beginMovePoint = endMovePoint = location; break; } } if (currentHandle == FPDragHandle.None) { if (draggedObject.Rect.Contains(location)) { currentHandle = FPDragHandle.Center; beginMovePoint = endMovePoint = location; } } } else { foreach (var index in selectedIndices) { var gameObject = gameObjects[index]; if (gameObject.Rect.Contains(location)) { currentHandle = FPDragHandle.Center; beginMovePoint = endMovePoint = location; break; } } } levelView.Invalidate(); }
private void BeginResize(FPDragHandle handle) { BeforeAction("Resize Selected"); }