feat: add CollapsiblePanel reusable control
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
104
OpenNest/Controls/CollapsiblePanel.cs
Normal file
104
OpenNest/Controls/CollapsiblePanel.cs
Normal file
@@ -0,0 +1,104 @@
|
||||
using System;
|
||||
using System.Drawing;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace OpenNest.Controls
|
||||
{
|
||||
public class CollapsiblePanel : Panel
|
||||
{
|
||||
private readonly Panel headerPanel;
|
||||
private readonly Label headerLabel;
|
||||
private readonly Label chevronLabel;
|
||||
private readonly Panel contentPanel;
|
||||
private bool isExpanded;
|
||||
private int expandedHeight;
|
||||
|
||||
public CollapsiblePanel()
|
||||
{
|
||||
isExpanded = true;
|
||||
expandedHeight = 200;
|
||||
|
||||
headerPanel = new Panel
|
||||
{
|
||||
Dock = DockStyle.Top,
|
||||
Height = 28,
|
||||
BackColor = Color.FromArgb(240, 240, 240),
|
||||
Cursor = Cursors.Hand
|
||||
};
|
||||
|
||||
chevronLabel = new Label
|
||||
{
|
||||
Text = "▾",
|
||||
AutoSize = false,
|
||||
Size = new Size(20, 28),
|
||||
Dock = DockStyle.Left,
|
||||
TextAlign = ContentAlignment.MiddleCenter,
|
||||
Font = new Font("Segoe UI", 9f)
|
||||
};
|
||||
|
||||
headerLabel = new Label
|
||||
{
|
||||
Text = "Section",
|
||||
AutoSize = false,
|
||||
Dock = DockStyle.Fill,
|
||||
TextAlign = ContentAlignment.MiddleLeft,
|
||||
Font = new Font("Segoe UI", 9f, FontStyle.Bold)
|
||||
};
|
||||
|
||||
headerPanel.Controls.Add(headerLabel);
|
||||
headerPanel.Controls.Add(chevronLabel);
|
||||
headerPanel.Click += (s, e) => Toggle();
|
||||
headerLabel.Click += (s, e) => Toggle();
|
||||
chevronLabel.Click += (s, e) => Toggle();
|
||||
|
||||
contentPanel = new Panel
|
||||
{
|
||||
Dock = DockStyle.Fill
|
||||
};
|
||||
|
||||
Controls.Add(contentPanel);
|
||||
Controls.Add(headerPanel);
|
||||
}
|
||||
|
||||
public string HeaderText
|
||||
{
|
||||
get => headerLabel.Text;
|
||||
set => headerLabel.Text = value;
|
||||
}
|
||||
|
||||
public bool IsExpanded
|
||||
{
|
||||
get => isExpanded;
|
||||
set
|
||||
{
|
||||
isExpanded = value;
|
||||
UpdateLayout();
|
||||
}
|
||||
}
|
||||
|
||||
public int ExpandedHeight
|
||||
{
|
||||
get => expandedHeight;
|
||||
set
|
||||
{
|
||||
expandedHeight = value;
|
||||
if (isExpanded) Height = value;
|
||||
}
|
||||
}
|
||||
|
||||
public Panel ContentPanel => contentPanel;
|
||||
|
||||
public void Toggle()
|
||||
{
|
||||
isExpanded = !isExpanded;
|
||||
UpdateLayout();
|
||||
}
|
||||
|
||||
private void UpdateLayout()
|
||||
{
|
||||
contentPanel.Visible = isExpanded;
|
||||
chevronLabel.Text = isExpanded ? "▾" : "▸";
|
||||
Height = isExpanded ? expandedHeight : headerPanel.Height;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user