1
0
mirror of https://github.com/chylex/TweetDuck.git synced 2025-05-09 14:34:05 +02:00

Begin redesign of the Plugins form (layout reorganization, fixes, optimization)

This commit is contained in:
chylex 2018-04-27 13:47:29 +02:00
parent 1ce5ddfd98
commit 27d41e6164
5 changed files with 120 additions and 60 deletions

View File

@ -23,10 +23,12 @@ protected override void Dispose(bool disposing) {
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent() {
this.components = new System.ComponentModel.Container();
this.btnClose = new System.Windows.Forms.Button();
this.btnReload = new System.Windows.Forms.Button();
this.btnOpenFolder = new System.Windows.Forms.Button();
this.flowLayoutPlugins = new TweetDuck.Plugins.Controls.PluginListFlowLayout();
this.timerLayout = new System.Windows.Forms.Timer(this.components);
this.SuspendLayout();
//
// btnClose
@ -82,6 +84,11 @@ private void InitializeComponent() {
this.flowLayoutPlugins.WrapContents = false;
this.flowLayoutPlugins.Resize += new System.EventHandler(this.flowLayoutPlugins_Resize);
//
// timerLayout
//
this.timerLayout.Interval = 99;
this.timerLayout.Tick += new System.EventHandler(this.timerLayout_Tick);
//
// FormPlugins
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
@ -106,5 +113,6 @@ private void InitializeComponent() {
private System.Windows.Forms.Button btnReload;
private System.Windows.Forms.Button btnOpenFolder;
private Plugins.Controls.PluginListFlowLayout flowLayoutPlugins;
private System.Windows.Forms.Timer timerLayout;
}
}

View File

@ -18,7 +18,7 @@ public FormPlugins(){
public FormPlugins(PluginManager pluginManager) : this(){
this.pluginManager = pluginManager;
Shown += (sender, args) => {
Program.UserConfig.PluginsWindow.Restore(this, false);
ReloadPluginList();
@ -28,6 +28,10 @@ public FormPlugins(PluginManager pluginManager) : this(){
Program.UserConfig.PluginsWindow.Save(this);
Program.UserConfig.Save();
};
ResizeEnd += (sender, args) => {
timerLayout.Start();
};
}
private int GetPluginOrderIndex(Plugin plugin){
@ -50,18 +54,26 @@ private void ReloadPluginList(){
flowLayoutPlugins.ResumeLayout(true);
// sorry, I guess...
Padding = new Padding(Padding.Left, Padding.Top, Padding.Right+1, Padding.Bottom);
Padding = new Padding(Padding.Left, Padding.Top, Padding.Right-1, Padding.Bottom);
timerLayout_Tick(null, EventArgs.Empty);
timerLayout.Start();
}
private void flowLayoutPlugins_Resize(object sender, EventArgs e){
if (flowLayoutPlugins.Controls.Count == 0){
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);
}
public void flowLayoutPlugins_Resize(object sender, EventArgs e){
Control lastPlugin = flowLayoutPlugins.Controls.OfType<PluginControl>().LastOrDefault();
if (lastPlugin == null){
return;
}
Control lastControl = flowLayoutPlugins.Controls[flowLayoutPlugins.Controls.Count-1];
bool showScrollBar = lastControl.Location.Y+lastControl.Height >= flowLayoutPlugins.Height;
bool showScrollBar = lastPlugin.Location.Y+lastPlugin.Height+1 >= flowLayoutPlugins.Height;
int horizontalOffset = showScrollBar ? SystemInformation.VerticalScrollBarWidth : 0;
flowLayoutPlugins.AutoScroll = showScrollBar;
@ -71,7 +83,7 @@ private void flowLayoutPlugins_Resize(object sender, EventArgs e){
control.Width = flowLayoutPlugins.Width-control.Margin.Horizontal-horizontalOffset;
}
lastControl.Visible = !showScrollBar;
flowLayoutPlugins.Controls[flowLayoutPlugins.Controls.Count-1].Visible = !showScrollBar;
flowLayoutPlugins.Focus();
}

View File

@ -23,6 +23,7 @@ protected override void Dispose(bool disposing) {
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent() {
this.components = new System.ComponentModel.Container();
this.btnToggleState = new System.Windows.Forms.Button();
this.labelName = new System.Windows.Forms.Label();
this.panelDescription = new System.Windows.Forms.Panel();
@ -33,6 +34,7 @@ private void InitializeComponent() {
this.labelVersion = new System.Windows.Forms.Label();
this.btnConfigure = new System.Windows.Forms.Button();
this.labelType = new TweetDuck.Core.Controls.LabelVertical();
this.timerLayout = new System.Windows.Forms.Timer(this.components);
this.panelDescription.SuspendLayout();
this.flowLayoutInfo.SuspendLayout();
this.SuspendLayout();
@ -40,9 +42,9 @@ private void InitializeComponent() {
// btnToggleState
//
this.btnToggleState.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.btnToggleState.Location = new System.Drawing.Point(456, 80);
this.btnToggleState.Location = new System.Drawing.Point(453, 59);
this.btnToggleState.Name = "btnToggleState";
this.btnToggleState.Size = new System.Drawing.Size(65, 23);
this.btnToggleState.Size = new System.Drawing.Size(68, 23);
this.btnToggleState.TabIndex = 5;
this.btnToggleState.Text = "Disable";
this.btnToggleState.UseVisualStyleBackColor = true;
@ -50,11 +52,13 @@ private void InitializeComponent() {
//
// labelName
//
this.labelName.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.labelName.AutoSize = true;
this.labelName.Font = new System.Drawing.Font("Microsoft Sans Serif", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
this.labelName.Location = new System.Drawing.Point(24, 7);
this.labelName.Font = new System.Drawing.Font("Segoe UI Semibold", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
this.labelName.Location = new System.Drawing.Point(0, 0);
this.labelName.Margin = new System.Windows.Forms.Padding(0);
this.labelName.Name = "labelName";
this.labelName.Size = new System.Drawing.Size(61, 24);
this.labelName.Size = new System.Drawing.Size(53, 21);
this.labelName.TabIndex = 0;
this.labelName.Text = "Name";
this.labelName.UseMnemonic = false;
@ -66,10 +70,11 @@ private void InitializeComponent() {
| System.Windows.Forms.AnchorStyles.Right)));
this.panelDescription.AutoScroll = true;
this.panelDescription.Controls.Add(this.labelDescription);
this.panelDescription.Location = new System.Drawing.Point(28, 35);
this.panelDescription.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
this.panelDescription.Location = new System.Drawing.Point(28, 33);
this.panelDescription.Name = "panelDescription";
this.panelDescription.Size = new System.Drawing.Size(493, 39);
this.panelDescription.TabIndex = 2;
this.panelDescription.Size = new System.Drawing.Size(410, 47);
this.panelDescription.TabIndex = 3;
this.panelDescription.Resize += new System.EventHandler(this.panelDescription_Resize);
//
// labelDescription
@ -80,44 +85,51 @@ private void InitializeComponent() {
this.labelDescription.Location = new System.Drawing.Point(0, 0);
this.labelDescription.Margin = new System.Windows.Forms.Padding(0);
this.labelDescription.Name = "labelDescription";
this.labelDescription.Size = new System.Drawing.Size(13, 39);
this.labelDescription.Size = new System.Drawing.Size(14, 45);
this.labelDescription.TabIndex = 0;
this.labelDescription.Text = "a\r\nb\r\nc";
this.labelDescription.UseMnemonic = false;
//
// labelAuthor
//
this.labelAuthor.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.labelAuthor.AutoSize = true;
this.labelAuthor.Location = new System.Drawing.Point(3, 0);
this.labelAuthor.Margin = new System.Windows.Forms.Padding(3, 0, 32, 0);
this.labelAuthor.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
this.labelAuthor.Location = new System.Drawing.Point(53, 5);
this.labelAuthor.Margin = new System.Windows.Forms.Padding(0, 0, 0, 1);
this.labelAuthor.Name = "labelAuthor";
this.labelAuthor.Size = new System.Drawing.Size(38, 13);
this.labelAuthor.TabIndex = 0;
this.labelAuthor.Size = new System.Drawing.Size(44, 15);
this.labelAuthor.TabIndex = 1;
this.labelAuthor.Text = "Author";
this.labelAuthor.UseMnemonic = false;
//
// flowLayoutInfo
//
this.flowLayoutInfo.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
this.flowLayoutInfo.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.flowLayoutInfo.Controls.Add(this.labelName);
this.flowLayoutInfo.Controls.Add(this.labelAuthor);
this.flowLayoutInfo.Controls.Add(this.labelWebsite);
this.flowLayoutInfo.Location = new System.Drawing.Point(28, 85);
this.flowLayoutInfo.Location = new System.Drawing.Point(24, 6);
this.flowLayoutInfo.Margin = new System.Windows.Forms.Padding(0);
this.flowLayoutInfo.Name = "flowLayoutInfo";
this.flowLayoutInfo.Size = new System.Drawing.Size(348, 18);
this.flowLayoutInfo.TabIndex = 3;
this.flowLayoutInfo.Size = new System.Drawing.Size(414, 21);
this.flowLayoutInfo.TabIndex = 1;
this.flowLayoutInfo.WrapContents = false;
//
// labelWebsite
//
this.labelWebsite.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)));
this.labelWebsite.AutoEllipsis = true;
this.labelWebsite.AutoSize = true;
this.labelWebsite.Cursor = System.Windows.Forms.Cursors.Hand;
this.labelWebsite.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Underline, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
this.labelWebsite.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Underline, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
this.labelWebsite.ForeColor = System.Drawing.Color.Blue;
this.labelWebsite.Location = new System.Drawing.Point(76, 0);
this.labelWebsite.Location = new System.Drawing.Point(100, 5);
this.labelWebsite.Margin = new System.Windows.Forms.Padding(3, 0, 0, 1);
this.labelWebsite.Name = "labelWebsite";
this.labelWebsite.Size = new System.Drawing.Size(46, 13);
this.labelWebsite.TabIndex = 1;
this.labelWebsite.Size = new System.Drawing.Size(49, 15);
this.labelWebsite.TabIndex = 2;
this.labelWebsite.Text = "Website";
this.labelWebsite.UseMnemonic = false;
this.labelWebsite.Click += new System.EventHandler(this.labelWebsite_Click);
@ -126,19 +138,21 @@ private void InitializeComponent() {
//
this.labelVersion.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.labelVersion.Location = new System.Drawing.Point(14, 12);
this.labelVersion.Margin = new System.Windows.Forms.Padding(3, 9, 3, 0);
this.labelVersion.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
this.labelVersion.Location = new System.Drawing.Point(88, 6);
this.labelVersion.Margin = new System.Windows.Forms.Padding(0, 0, 1, 0);
this.labelVersion.Name = "labelVersion";
this.labelVersion.Size = new System.Drawing.Size(510, 13);
this.labelVersion.TabIndex = 1;
this.labelVersion.Padding = new System.Windows.Forms.Padding(0, 0, 0, 3);
this.labelVersion.Size = new System.Drawing.Size(436, 21);
this.labelVersion.TabIndex = 2;
this.labelVersion.Text = "Version";
this.labelVersion.TextAlign = System.Drawing.ContentAlignment.TopRight;
this.labelVersion.TextAlign = System.Drawing.ContentAlignment.BottomRight;
this.labelVersion.UseMnemonic = false;
//
// btnConfigure
//
this.btnConfigure.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.btnConfigure.Location = new System.Drawing.Point(382, 80);
this.btnConfigure.Location = new System.Drawing.Point(453, 31);
this.btnConfigure.Name = "btnConfigure";
this.btnConfigure.Size = new System.Drawing.Size(68, 23);
this.btnConfigure.TabIndex = 4;
@ -152,12 +166,18 @@ private void InitializeComponent() {
| System.Windows.Forms.AnchorStyles.Left)));
this.labelType.BackColor = System.Drawing.Color.DarkGray;
this.labelType.Font = new System.Drawing.Font("Consolas", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238)));
this.labelType.LineHeight = 0;
this.labelType.Location = new System.Drawing.Point(0, 0);
this.labelType.Name = "labelType";
this.labelType.Size = new System.Drawing.Size(18, 109);
this.labelType.TabIndex = 6;
this.labelType.Size = new System.Drawing.Size(18, 88);
this.labelType.TabIndex = 0;
this.labelType.Text = "TYPE";
//
// timerLayout
//
this.timerLayout.Interval = 1;
this.timerLayout.Tick += new System.EventHandler(this.timerLayout_Tick);
//
// PluginControl
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
@ -166,21 +186,18 @@ private void InitializeComponent() {
this.Controls.Add(this.btnConfigure);
this.Controls.Add(this.flowLayoutInfo);
this.Controls.Add(this.panelDescription);
this.Controls.Add(this.labelName);
this.Controls.Add(this.btnToggleState);
this.Controls.Add(this.labelVersion);
this.Margin = new System.Windows.Forms.Padding(0);
this.MaximumSize = new System.Drawing.Size(65535, 109);
this.MinimumSize = new System.Drawing.Size(0, 61);
this.MaximumSize = new System.Drawing.Size(65535, 88);
this.Name = "PluginControl";
this.Padding = new System.Windows.Forms.Padding(3, 3, 6, 3);
this.Size = new System.Drawing.Size(530, 109);
this.Size = new System.Drawing.Size(530, 88);
this.panelDescription.ResumeLayout(false);
this.panelDescription.PerformLayout();
this.flowLayoutInfo.ResumeLayout(false);
this.flowLayoutInfo.PerformLayout();
this.ResumeLayout(false);
this.PerformLayout();
}
@ -196,5 +213,6 @@ private void InitializeComponent() {
private System.Windows.Forms.Label labelVersion;
private System.Windows.Forms.Button btnConfigure;
private Core.Controls.LabelVertical labelType;
private System.Windows.Forms.Timer timerLayout;
}
}

View File

@ -9,8 +9,8 @@ namespace TweetDuck.Plugins.Controls{
sealed partial class PluginControl : UserControl{
private readonly PluginManager pluginManager;
private readonly Plugin plugin;
private readonly float dpiScale;
private int nextHeight;
public PluginControl(){
InitializeComponent();
@ -19,33 +19,52 @@ public PluginControl(){
public PluginControl(PluginManager pluginManager, Plugin plugin) : this(){
this.pluginManager = pluginManager;
this.plugin = plugin;
this.dpiScale = this.GetDPIScale();
this.labelName.Text = plugin.Name;
this.labelDescription.Text = plugin.CanRun ? plugin.Description : "This plugin requires TweetDuck "+plugin.RequiredVersion+" or newer.";
this.labelVersion.Text = plugin.Version;
this.labelAuthor.Text = plugin.Author;
this.labelWebsite.Text = plugin.Website;
this.labelType.LineHeight = BrowserUtils.Scale(9, dpiScale);
this.labelName.Text = plugin.Name;
this.labelDescription.Text = plugin.CanRun ? plugin.Description : $"This plugin requires TweetDuck {plugin.RequiredVersion} or newer.";
this.labelAuthor.Text = string.IsNullOrWhiteSpace(plugin.Author) ? string.Empty : $"by {plugin.Author}";
this.labelWebsite.Text = plugin.Website;
this.labelVersion.Text = plugin.Version;
this.labelType.LineHeight = BrowserUtils.Scale(9, this.GetDPIScale());
UpdatePluginState();
if (labelDescription.Text.Length == 0){
labelDescription.Visible = false;
}
panelDescription_Resize(panelDescription, EventArgs.Empty);
}
private void timerLayout_Tick(object sender, EventArgs e){
timerLayout.Stop();
Height = nextHeight;
ResumeLayout();
}
private void panelDescription_Resize(object sender, EventArgs e){
if (labelDescription.Text.Length == 0){
Height = MinimumSize.Height;
SuspendLayout();
int maxWidth = panelDescription.Width-(panelDescription.VerticalScroll.Visible ? SystemInformation.VerticalScrollBarWidth : 0);
labelDescription.MaximumSize = new Size(maxWidth, int.MaxValue);
Font font = labelDescription.Font;
int descriptionLines = TextRenderer.MeasureText(labelDescription.Text, font, new Size(maxWidth, int.MaxValue), TextFormatFlags.WordBreak).Height/(font.Height-1);
int requiredLines = Math.Max(descriptionLines, 1+(string.IsNullOrEmpty(labelVersion.Text) ? 0 : 1)+(btnConfigure.Visible ? 1 : 0));
switch(requiredLines){
case 1: nextHeight = MaximumSize.Height-2*(font.Height-1); break;
case 2: nextHeight = MaximumSize.Height-(font.Height-1); break;
default: nextHeight = MaximumSize.Height; break;
}
if (nextHeight != Height){
timerLayout.Start();
}
else{
labelDescription.MaximumSize = new Size(panelDescription.Width-SystemInformation.VerticalScrollBarWidth, 0);
Height = Math.Min(MinimumSize.Height+BrowserUtils.Scale(9, dpiScale)+labelDescription.Height, MaximumSize.Height);
ResumeLayout();
}
}

View File

@ -9,7 +9,10 @@ public PluginListFlowLayout(){
}
protected override void WndProc(ref Message m){
NativeMethods.ShowScrollBar(Handle, NativeMethods.SB_HORZ, false); // basically fuck the horizontal scrollbar very much
if (m.Msg == 0x85){ // WM_NCPAINT
NativeMethods.ShowScrollBar(Handle, NativeMethods.SB_HORZ, false); // basically fuck the horizontal scrollbar very much
}
base.WndProc(ref m);
}
}