private void RenderEntry(Graphics g, FenceEntry entry, int x, int y) { var icon = entry.ExtractIcon(thumbnailProvider); var name = entry.Name; var textPosition = new PointF(x, y + icon.Height + 5); var textMaxSize = new SizeF(itemWidth, textHeight); var stringFormat = new StringFormat { Alignment = StringAlignment.Center, Trimming = StringTrimming.EllipsisCharacter }; var textSize = g.MeasureString(name, iconFont, textMaxSize, stringFormat); var outlineRect = new Rectangle(x - 2, y - 2, itemWidth + 2, icon.Height + (int)textSize.Height + 5 + 2); var outlineRectInner = outlineRect.Shrink(1); var mousePos = PointToClient(MousePosition); var mouseOver = mousePos.X >= x && mousePos.Y >= y && mousePos.X < x + outlineRect.Width && mousePos.Y < y + outlineRect.Height; if (mouseOver) { hoveringItem = entry.Path; hasHoverUpdated = true; } if (mouseOver && shouldUpdateSelection) { selectedItem = entry.Path; shouldUpdateSelection = false; hasSelectionUpdated = true; } if (mouseOver && shouldRunDoubleClick) { shouldRunDoubleClick = false; entry.Open(); } if (selectedItem == entry.Path) { if (mouseOver) { g.DrawRectangle(new Pen(Color.FromArgb(120, SystemColors.ActiveBorder)), outlineRectInner); g.FillRectangle(new SolidBrush(Color.FromArgb(100, SystemColors.GradientActiveCaption)), outlineRect); } else { g.DrawRectangle(new Pen(Color.FromArgb(120, SystemColors.ActiveBorder)), outlineRectInner); g.FillRectangle(new SolidBrush(Color.FromArgb(80, SystemColors.GradientInactiveCaption)), outlineRect); } } else { if (mouseOver) { g.DrawRectangle(new Pen(Color.FromArgb(120, SystemColors.ActiveBorder)), outlineRectInner); g.FillRectangle(new SolidBrush(Color.FromArgb(80, SystemColors.ActiveCaption)), outlineRect); } } g.DrawIcon(icon, x + itemWidth / 2 - icon.Width / 2, y); g.DrawString(name, iconFont, new SolidBrush(Color.FromArgb(180, 15, 15, 15)), new RectangleF(textPosition.Move(shadowDist, shadowDist), textMaxSize), stringFormat); g.DrawString(name, iconFont, Brushes.White, new RectangleF(textPosition, textMaxSize), stringFormat); }
private void FenceWindow_Paint(object sender, PaintEventArgs e) { e.Graphics.Clip = new Region(ClientRectangle); e.Graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias; e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; // Background e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(100, Color.Black)), ClientRectangle); // Title e.Graphics.DrawString(Text, titleFont, Brushes.White, new PointF(Width / 2, titleOffset), new StringFormat { Alignment = StringAlignment.Center }); e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(50, Color.Black)), new RectangleF(0, 0, Width, titleHeight)); // Items var x = itemPadding; var y = itemPadding; scrollHeight = 0; e.Graphics.Clip = new Region(new Rectangle(0, titleHeight, Width, Height - titleHeight)); foreach (var file in fenceInfo.Files) { var entry = FenceEntry.FromPath(file); if (entry == null) { continue; } RenderEntry(e.Graphics, entry, x, y + titleHeight - scrollOffset); var itemBottom = y + itemHeight; if (itemBottom > scrollHeight) { scrollHeight = itemBottom; } x += itemWidth + itemPadding; if (x + itemWidth > Width) { x = itemPadding; y += itemHeight + itemPadding; } } scrollHeight -= (ClientRectangle.Height - titleHeight); // Scroll bars if (scrollHeight > 0) { var contentHeight = Height - titleHeight; var scrollbarHeight = contentHeight - scrollHeight; e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(150, Color.Black)), new Rectangle(Width - 5, titleHeight + scrollOffset, 5, scrollbarHeight)); scrollOffset = Math.Min(scrollOffset, scrollHeight); } // Click handlers if (shouldUpdateSelection && !hasSelectionUpdated) { selectedItem = null; } if (!hasHoverUpdated) { hoveringItem = null; } shouldRunDoubleClick = false; shouldUpdateSelection = false; hasSelectionUpdated = false; hasHoverUpdated = false; }