This repository has been archived on 2024-08-06. You can view files and clone it, but cannot push or open issues or pull requests.
linear-app-launcher/Windows/Forms/Tile/TileContainer.cs

192 lines
5.2 KiB
C#
Raw Normal View History

2020-05-03 10:41:54 +00:00
using AppLauncher.Models;
using System;
2020-05-03 14:53:15 +00:00
using System.Collections.Generic;
2020-04-11 17:43:20 +00:00
using System.Drawing;
2020-05-03 10:41:54 +00:00
using System.Threading;
2020-04-11 17:43:20 +00:00
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;
2020-05-02 16:17:10 +00:00
protected bool isAnimating = false;
2020-04-11 17:43:20 +00:00
public TileContainer(TileGroupModel model) : base()
{
InitializeComponent();
2020-05-02 16:17:10 +00:00
this.ContextMenuStrip = contextMenuStrip1;
//this.BackColor = Color.MistyRose;
2020-04-11 17:43:20 +00:00
label1.TileGroupPanel = this;
groupInfo = model;
label1.TitleText = groupInfo.Title;
panel1.SetGridSize(groupInfo.GridSize.Width, groupInfo.GridSize.Height);
2020-05-03 10:41:54 +00:00
this.Width = panel1.Width;
2020-04-11 17:43:20 +00:00
label1.Checked = groupInfo.IsExpanded;
panel1.LoadTiles(model.Items);
2020-05-03 10:41:54 +00:00
panel1.Resize += panel1_Resize;
2020-04-11 17:43:20 +00:00
}
2020-05-02 16:17:10 +00:00
protected override async void OnLoad(EventArgs e)
2020-04-11 17:43:20 +00:00
{
base.OnLoad(e);
label1.Width = panel1.Width;
2020-05-02 16:17:10 +00:00
this.Margin = new Padding(0, 0, 0, 0);
this.Padding = new Padding(0, 0, 0, 20);
2020-05-03 10:41:54 +00:00
//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();
2020-04-11 17:43:20 +00:00
}
2020-05-03 10:41:54 +00:00
public int CollapseHeight => label1.Height + panel1.CollapseHeight;
2020-04-11 17:43:20 +00:00
2020-05-03 10:41:54 +00:00
public int ExpandedHeight => label1.Height + panel1.ExpandedHeight + this.Padding.Top + this.Padding.Bottom;
2020-05-02 16:17:10 +00:00
public bool IsAnimating => isAnimating;
2020-04-11 17:43:20 +00:00
2020-05-03 14:53:15 +00:00
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;
}
}
2020-04-11 17:43:20 +00:00
public async Task Collapse()
{
await Task.Run(() =>
{
2020-05-02 16:17:10 +00:00
if (isAnimating) return;
isAnimating = true;
2020-05-03 10:41:54 +00:00
while (this.Height > this.CollapseHeight)
2020-04-11 17:43:20 +00:00
{
if (this.InvokeRequired)
{
this.Invoke(new MethodInvoker(() => {
this.Height -= collapseIncrement;
}));
}
else
{
this.Height -= collapseIncrement;
}
Thread.Sleep(10);
}
2020-05-02 16:17:10 +00:00
isAnimating = false;
2020-04-11 17:43:20 +00:00
});
}
public async Task CollapseNow()
{
await Task.Run(() =>
{
2020-05-02 16:17:10 +00:00
if (isAnimating) return;
isAnimating = true;
2020-04-11 17:43:20 +00:00
if (this.InvokeRequired)
{
this.Invoke(new MethodInvoker(() => {
2020-05-03 10:41:54 +00:00
this.Height = this.CollapseHeight;
2020-04-11 17:43:20 +00:00
}));
}
else
{
2020-05-03 10:41:54 +00:00
this.Height = this.CollapseHeight;
2020-04-11 17:43:20 +00:00
}
2020-05-02 16:17:10 +00:00
isAnimating = false;
2020-04-11 17:43:20 +00:00
});
}
public async Task Expand()
{
await Task.Run(() =>
{
2020-05-02 16:17:10 +00:00
if (isAnimating) return;
isAnimating = true;
2020-05-03 10:41:54 +00:00
while (this.Height < this.ExpandedHeight)
2020-04-11 17:43:20 +00:00
{
if (this.InvokeRequired)
{
this.Invoke(new MethodInvoker(() => {
this.Height += expandIncrement;
this.Invalidate();
}));
}
else
{
this.Height += expandIncrement;
this.Invalidate();
}
Thread.Sleep(10);
}
2020-05-02 16:17:10 +00:00
isAnimating = false;
2020-04-11 17:43:20 +00:00
});
}
2020-05-02 16:17:10 +00:00
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();
}
2020-04-11 17:43:20 +00:00
}
}