1
0
mirror of https://github.com/chylex/TweetDuck.git synced 2024-11-14 17:42:47 +01:00
TweetDuck/Dialogs/FormPlugins.cs

116 lines
3.4 KiB
C#

using System;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;
using TweetDuck.Configuration;
using TweetDuck.Management;
using TweetDuck.Plugins;
using TweetLib.Core;
using TweetLib.Core.Features.Plugins;
using TweetLib.Core.Features.Plugins.Enums;
using TweetLib.Core.Systems.Configuration;
namespace TweetDuck.Dialogs {
sealed partial class FormPlugins : Form, FormManager.IAppDialog {
private static UserConfig Config => Program.Config.User;
private readonly PluginManager pluginManager;
public FormPlugins() {
InitializeComponent();
Text = Program.BrandName + " Plugins";
}
public FormPlugins(PluginManager pluginManager) : this() {
this.pluginManager = pluginManager;
if (!Config.PluginsWindowSize.IsEmpty) {
Size targetSize = Config.PluginsWindowSize;
Size = new Size(Math.Max(MinimumSize.Width, targetSize.Width), Math.Max(MinimumSize.Height, targetSize.Height));
}
Shown += (sender, args) => {
ReloadPluginList();
};
FormClosed += (sender, args) => {
Config.PluginsWindowSize = Size;
Config.Save();
};
ResizeEnd += (sender, args) => {
timerLayout.Start();
};
}
private int GetPluginOrderIndex(Plugin plugin) {
return !plugin.CanRun ? 0 : pluginManager.Config.IsEnabled(plugin) ? 1 : 2;
}
private void ReloadPluginList() {
flowLayoutPlugins.Controls.Clear();
flowLayoutPlugins.SuspendLayout();
foreach (Plugin plugin in pluginManager.Plugins.OrderBy(GetPluginOrderIndex).ThenBy(plugin => plugin.Name)) {
flowLayoutPlugins.Controls.Add(new PluginControl(pluginManager, plugin));
flowLayoutPlugins.Controls.Add(new Panel {
BackColor = Color.DimGray,
Margin = new Padding(0),
Size = new Size(1, 1)
});
}
flowLayoutPlugins.ResumeLayout(true);
timerLayout_Tick(null, EventArgs.Empty);
timerLayout.Start();
}
private void timerLayout_Tick(object sender, EventArgs e) {
timerLayout.Stop();
// stupid WinForms scrollbars and panels
Padding = new Padding(Padding.Left, Padding.Top, Padding.Right + 1, Padding.Bottom + 1);
Padding = new Padding(Padding.Left, Padding.Top, Padding.Right - 1, Padding.Bottom - 1);
}
private void flowLayoutPlugins_Resize(object sender, EventArgs e) {
Control lastPlugin = flowLayoutPlugins.Controls.OfType<PluginControl>().LastOrDefault();
if (lastPlugin == null) {
return;
}
bool showScrollBar = lastPlugin.Location.Y + lastPlugin.Height + 1 >= flowLayoutPlugins.Height;
int horizontalOffset = showScrollBar ? SystemInformation.VerticalScrollBarWidth : 0;
flowLayoutPlugins.AutoScroll = showScrollBar;
flowLayoutPlugins.VerticalScroll.Visible = showScrollBar;
foreach (Control control in flowLayoutPlugins.Controls) {
control.Width = flowLayoutPlugins.Width - control.Margin.Horizontal - horizontalOffset;
}
flowLayoutPlugins.Controls[flowLayoutPlugins.Controls.Count - 1].Visible = !showScrollBar;
flowLayoutPlugins.Focus();
}
private void btnOpenFolder_Click(object sender, EventArgs e) {
App.SystemHandler.OpenFileExplorer(pluginManager.GetPluginFolder(PluginGroup.Custom));
}
private void btnReload_Click(object sender, EventArgs e) {
if (FormMessage.Warning("Reloading Plugins", "This will also reload the browser window. Do you want to proceed?", FormMessage.Yes, FormMessage.No)) {
pluginManager.Reload();
ReloadPluginList();
}
}
private void btnClose_Click(object sender, EventArgs e) {
Close();
}
}
}