private void DrawRect(SpriteRectangle r, Graphics g, Pen p, Brush b) { if (p != null) { DrawBorder(g, p, r); } if (b != null) { g.FillRectangle(b, r.value); } }
private void SelectEverythingAroundLastSelected(SpriteRectangle currentClickedRectangle) { if (currentClickedRectangle == null || !currentClickedRectangle.IsGrouped) { return; } currentClickedRectangle.IsGroupValidated = true; if (currentClickedRectangle.IsGrouped) { IterateAndSelect(currentClickedRectangle.Top, currentClickedRectangle.GroupId.Value); IterateAndSelect(currentClickedRectangle.Right, currentClickedRectangle.GroupId.Value); IterateAndSelect(currentClickedRectangle.Bottom, currentClickedRectangle.GroupId.Value); IterateAndSelect(currentClickedRectangle.Left, currentClickedRectangle.GroupId.Value); } ResetValidated(); }
private void DrawBorder(Graphics e, Pen p, SpriteRectangle rect) { if (rect.Top == null || !rect.Top.IsGrouped || rect.Top.GroupId != null && rect.GroupId != null && rect.Top.GroupId != rect.GroupId) { e.DrawLine(p, rect.value.X, rect.value.Y, rect.value.X + rect.value.Width, rect.value.Y); } if (rect.Right == null || !rect.Right.IsGrouped || rect.Right.GroupId != null && rect.GroupId != null && rect.Right.GroupId != rect.GroupId) { e.DrawLine(p, rect.value.X + rect.value.Width, rect.value.Y, rect.value.X + rect.value.Width, rect.value.Y + rect.value.Height); } if (rect.Bottom == null || !rect.Bottom.IsGrouped || rect.Bottom.GroupId != null && rect.GroupId != null && rect.Bottom.GroupId != rect.GroupId) { e.DrawLine(p, rect.value.X, rect.value.Y + rect.value.Height, rect.value.X + rect.value.Width, rect.value.Y + rect.value.Height); } if (rect.Left == null || !rect.Left.IsGrouped || rect.Left.GroupId != null && rect.GroupId != null && rect.Left.GroupId != rect.GroupId) { e.DrawLine(p, rect.value.X, rect.value.Y, rect.value.X, rect.value.Y + rect.value.Height); } }
private void DrawNameBorder(Graphics e, Pen p, SpriteRectangle rect) { if (rect.Top == null || !rect.Top.ExportNameGroupId.HasValue || rect.ExportNameGroupId != rect.Top.ExportNameGroupId) { e.DrawLine(p, rect.value.X, rect.value.Y, rect.value.X + rect.value.Width, rect.value.Y); } if (rect.Right == null || !rect.Right.ExportNameGroupId.HasValue || rect.ExportNameGroupId != rect.Right.ExportNameGroupId) { e.DrawLine(p, rect.value.X + rect.value.Width, rect.value.Y, rect.value.X + rect.value.Width, rect.value.Y + rect.value.Height); } if (rect.Bottom == null || !rect.Bottom.ExportNameGroupId.HasValue || rect.ExportNameGroupId != rect.Bottom.ExportNameGroupId) { e.DrawLine(p, rect.value.X, rect.value.Y + rect.value.Height, rect.value.X + rect.value.Width, rect.value.Y + rect.value.Height); } if (rect.Left == null || !rect.Left.ExportNameGroupId.HasValue || rect.ExportNameGroupId != rect.Left.ExportNameGroupId) { e.DrawLine(p, rect.value.X, rect.value.Y, rect.value.X, rect.value.Y + rect.value.Height); } }
public void SpliceRects(int spliceWidth, int spliceHeight) { if (spliceWidth <= 0 || spliceHeight <= 0) { return; } _spliceWidth = spliceWidth; _spliceHeight = spliceHeight; var maxColumns = Convert.ToInt32(Math.Floor(this.Image.Width / (spliceWidth * 1.0f))); var maxRows = Convert.ToInt32(Math.Floor(this.Image.Height / (spliceHeight * 1.0f))); _rects = new SpriteRectangle[maxRows, maxColumns]; _rectsList = new List <SpriteRectangle>(); //create array for (int row = 0; row < _rects.GetLength(0); row++) { for (int col = 0; col < _rects.GetLength(1); col++) { _rects[row, col] = new SpriteRectangle { value = Rectangle.Empty, }; } } //assign neighbors for (int row = 0; row < _rects.GetLength(0); row++) { for (int col = 0; col < _rects.GetLength(1); col++) { var currentRect = _rects[row, col]; currentRect.Left = col - 1 >= 0 ? _rects[row, col - 1] : null; currentRect.Bottom = row + 1 < _rects.GetLength(0) ? _rects[row + 1, col] : null; currentRect.Right = col + 1 < _rects.GetLength(1) ? _rects[row, col + 1] : null; currentRect.Top = row - 1 >= 0 ? _rects[row - 1, col] : null; _rectsList.Add(currentRect); } } UpdateRectsSizes(); }
private void IterateAndSelect(SpriteRectangle currentRect, Guid groupId) { if (currentRect == null || currentRect.IsGroupValidated || !currentRect.IsGrouped || (currentRect.GroupId.HasValue && currentRect.GroupId.Value != groupId)) { return; } currentRect.IsGroupValidated = true; foreach (var spriteRectangle in _rectsList) { if (currentRect.Id != spriteRectangle.Id || !spriteRectangle.IsGrouped) { continue; } spriteRectangle.IsSelected = true; IterateAndSelect(currentRect.Top, groupId); IterateAndSelect(currentRect.Right, groupId); IterateAndSelect(currentRect.Bottom, groupId); IterateAndSelect(currentRect.Left, groupId); return; } }
void SelectSquareClick(object sender, MouseEventArgs e) { if (_rects == null || _rectsList == null) { return; } if (Control.ModifierKeys == Keys.Shift && _lastSelected != null) { //select multiple rects var startX = _lastSelected.value.X < e.X ? _lastSelected.value.X : e.X; var startY = _lastSelected.value.Y < e.Y ? _lastSelected.value.Y : e.Y; var lastFurtherestX = _lastSelected.value.Width + _lastSelected.value.X; var furthestX = lastFurtherestX > e.X ? lastFurtherestX : e.X; var lastFurtherestY = _lastSelected.value.Height + _lastSelected.value.Y; var furthestY = lastFurtherestY > e.Y ? lastFurtherestY : e.Y; var mouseRect = new Rectangle(startX, startY, furthestX - startX, furthestY - startY); var selectedRectangles = new List <SpriteRectangle>(); //Show Restore button? var anyAreDeleted = false; foreach (var spriteRectangle in _rectsList) { spriteRectangle.IsSelected = spriteRectangle.value.IntersectsWith(mouseRect); if (!spriteRectangle.IsSelected) { continue; } if (spriteRectangle.IsDeleted) { anyAreDeleted = true; } selectedRectangles.Add(spriteRectangle); } _lastSelected = null; foreach (var selectedRectangle in selectedRectangles) { SelectEverythingAroundLastSelected(selectedRectangle); } var allSelectedRects = _rectsList.Where(r => r.IsSelected).ToList(); var isAllSinglesOrAllGroupsSelected = allSelectedRects.Count(r => r.IsGrouped) == allSelectedRects.Count || allSelectedRects.Count(r => !r.IsGrouped) == allSelectedRects.Count; if (isAllSinglesOrAllGroupsSelected) { var allHaveTheSameExportNameId = allSelectedRects.Select(r => r.ExportNameGroupId).Distinct().Count(r => r.HasValue) == 1; _mainForm.exportName.Text = allHaveTheSameExportNameId ? allSelectedRects.ElementAt(0).ExportName : string.Empty; } UpdateButtons(true, false, !anyAreDeleted, !anyAreDeleted, anyAreDeleted, isAllSinglesOrAllGroupsSelected); } else { //select single foreach (var spriteRectangle in _rectsList) { spriteRectangle.IsSelected = spriteRectangle.value.Contains(e.Location); if (!spriteRectangle.IsSelected) { continue; } _lastSelected = spriteRectangle; } //If click was outside of Image if (_lastSelected == null) { UpdateButtons(true, false, false, true, false, false); } else //Found a square to select { _mainForm.exportName.Text = _lastSelected.ExportNameGroupId.HasValue ? _lastSelected.ExportName : string.Empty; SelectEverythingAroundLastSelected(_lastSelected); UpdateButtons(false, _lastSelected.IsGrouped, _lastSelected.IsSelected, !_lastSelected.IsDeleted, _lastSelected.IsSelected, true); } } Invalidate(); }