using AppLauncher.Models; using System; using System.Collections.Generic; using System.Drawing; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; namespace AppLauncher.Windows.Forms { public partial class TileContainer : AUserControl { protected int collapseIncrement = 6; protected int expandIncrement = 8; protected TileGroupModel groupInfo = null; protected bool isAnimating = false; public TileContainer(TileGroupModel model) : base() { InitializeComponent(); this.ContextMenuStrip = contextMenuStrip1; //this.BackColor = Color.MistyRose; label1.TileGroupPanel = this; groupInfo = model; label1.TitleText = groupInfo.Title; panel1.SetGridSize(groupInfo.GridSize.Width, groupInfo.GridSize.Height); this.Width = panel1.Width; label1.Checked = groupInfo.IsExpanded; panel1.LoadTiles(model.Items); panel1.Resize += panel1_Resize; } protected override async void OnLoad(EventArgs e) { base.OnLoad(e); label1.Width = panel1.Width; this.Margin = new Padding(0, 0, 0, 0); this.Padding = new Padding(0, 0, 0, 20); //this.MaximumSize = new Size(panel1.Width, ExpandedHeight); //this.MinimumSize = new Size(panel1.Width, label1.Height); //this.Size = this.MaximumSize; this.Size = new Size(panel1.Width, this.ExpandedHeight); } private async void panel1_Resize(object sender, EventArgs e) { await this.InvalidateContainer(); } public int CollapseHeight => label1.Height + panel1.CollapseHeight; public int ExpandedHeight => label1.Height + panel1.ExpandedHeight + this.Padding.Top + this.Padding.Bottom; public bool IsAnimating => isAnimating; public TileGroupModel Model { get { TileGroupModel rs = new TileGroupModel() { Title = label1.TitleText, GridSize = new Size(panel1.GridSize.X, panel1.GridSize.Y), IsExpanded = label1.Checked, IsExclusive = groupInfo.IsExclusive, Items = panel1.Tiles }; return rs; } } public async Task Collapse() { await Task.Run(() => { if (isAnimating) return; isAnimating = true; while (this.Height > this.CollapseHeight) { if (this.InvokeRequired) { this.Invoke(new MethodInvoker(() => { this.Height -= collapseIncrement; })); } else { this.Height -= collapseIncrement; } Thread.Sleep(10); } isAnimating = false; }); } public async Task CollapseNow() { await Task.Run(() => { if (isAnimating) return; isAnimating = true; if (this.InvokeRequired) { this.Invoke(new MethodInvoker(() => { this.Height = this.CollapseHeight; })); } else { this.Height = this.CollapseHeight; } isAnimating = false; }); } public async Task Expand() { await Task.Run(() => { if (isAnimating) return; isAnimating = true; while (this.Height < this.ExpandedHeight) { if (this.InvokeRequired) { this.Invoke(new MethodInvoker(() => { this.Height += expandIncrement; this.Invalidate(); })); } else { this.Height += expandIncrement; this.Invalidate(); } Thread.Sleep(10); } isAnimating = false; }); } public async Task InvalidateContainer(bool animate = true) { if (this.IsAnimating) { return; } if (label1.Checked) { await this.Expand(); } else { if (animate) { await this.Collapse(); } else { await this.CollapseNow(); } } } private void addToolStripMenuItem_Click(object sender, EventArgs e) { AddTileForm addForm = new AddTileForm(panel1); addForm.ShowDialog(); } } }