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/MainForm.cs
2020-05-03 15:53:15 +01:00

191 lines
5.2 KiB
C#

using AppLauncher.Models;
using AppLauncher.Windows.Forms;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace AppLauncher
{
public partial class MainForm : AForm
{
protected int collapsedWidth = 40;
protected int expandedWidth = 800;
protected bool isBusy = false;
public MainForm() : base()
{
InitializeComponent();
}
protected override void OnShown(EventArgs e)
{
base.OnShown(e);
string jsonfigFilename = Path.ChangeExtension(Application.ExecutablePath, "jsonfig");
if (File.Exists(jsonfigFilename))
{
loadSession(jsonfigFilename);
}
this.Width = flowLayoutPanel1.Width + (flowLayoutPanel1.Left * 2);
}
public async Task ToggleSize()
{
if (this.Width > collapsedWidth)
{
flowLayoutPanel1.Visible = false;
titlePanel1.LabelVisible = false;
await collapseWindow(collapsedWidth, 6);
}
else
{
await expandWindow(expandedWidth, 8);
flowLayoutPanel1.Visible = true;
titlePanel1.LabelVisible = true;
}
}
/// <summary>
/// Save As
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void toolStripMenuItem2_Click(object sender, EventArgs e)
{
if (isBusy)
{
return;
}
if (flowLayoutPanel1.Controls.Count <= 0)
{
return;
}
if (saveFileDialog1.ShowDialog() != DialogResult.OK)
{
return;
}
isBusy = true;
List<TileGroupModel> rs = new List<TileGroupModel>();
for (int i = 0; i < flowLayoutPanel1.Controls.Count; i++)
{
if (flowLayoutPanel1.Controls[i].GetType() != typeof(TileContainer))
{
continue;
}
TileContainer container = flowLayoutPanel1.Controls[i] as TileContainer;
rs.Add(container.Model);
}
try
{
File.WriteAllText(saveFileDialog1.FileName, JsonConvert.SerializeObject(rs));
MessageBox.Show("Session saved!", "Save session", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch (Exception exc)
{
MessageBox.Show(exc.Message, "Save session");
}
isBusy = false;
}
private void toolStripMenuItem1_Click(object sender, EventArgs e)
{
this.TopMost = !this.TopMost;
toolStripMenuItem1.Checked = this.TopMost;
}
private void exitToolStripMenuItem_Click(object sender, EventArgs e)
{
this.Close();
}
protected async Task collapseWindow(int width, int increment = 6)
{
await Task.Run(() =>
{
while (this.Width > width)
{
if (this.InvokeRequired)
{
this.Invoke(new MethodInvoker(() => {
this.Width -= increment;
}));
}
else
{
this.Width -= increment;
}
Application.DoEvents();
}
});
}
protected async Task expandWindow(int width, int increment = 8)
{
await Task.Run(() =>
{
while (this.Width < width)
{
if (this.InvokeRequired)
{
this.Invoke(new MethodInvoker(() => {
this.Width += increment;
//this.Invalidate();
}));
}
else
{
this.Width += increment;
//this.Invalidate();
}
Application.DoEvents();
}
});
}
protected void loadSession(string filename)
{
string sourceCode = File.ReadAllText(filename);
if (string.IsNullOrWhiteSpace(sourceCode))
{
return;
}
List<TileGroupModel> rs = JsonConvert.DeserializeObject<List<TileGroupModel>>(sourceCode);
if (rs == null)
{
return;
}
int maxWidth = 0;
flowLayoutPanel1.Controls.Clear();
foreach (TileGroupModel item in rs)
{
TileContainer panel = new TileContainer(item);
maxWidth = Math.Max(maxWidth, panel.Width);
flowLayoutPanel1.Controls.Add(panel);
}
flowLayoutPanel1.Width = maxWidth;
}
}
}