Merge pull request #4405 from Jaex/thumbnail-view-multi-select-support

fixed #4280: Thumbnail view multi select support
This commit is contained in:
Jaex 2019-10-02 10:30:32 +03:00 committed by GitHub
commit 7489916857
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 158 additions and 64 deletions

View file

@ -76,8 +76,12 @@ public override string Text
}
}
[DefaultValue(3)]
public int SpaceAfterCheckBox { get; set; }
[DefaultValue(false)]
public bool IgnoreClick { get; set; }
private bool isChecked, isHover;
private string text;
@ -151,7 +155,10 @@ protected override void OnClick(EventArgs e)
{
base.OnClick(e);
Checked = !Checked;
if (!IgnoreClick)
{
Checked = !Checked;
}
}
protected virtual void OnCheckedChanged(EventArgs e)

View file

@ -32,29 +32,16 @@ protected override void Dispose(bool disposing)
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
this.lblTitle = new ShareX.HelpersLib.BlackStyleLabel();
this.ttMain = new System.Windows.Forms.ToolTip(this.components);
this.pThumbnail = new ShareX.TaskRoundedCornerPanel();
this.cbSelected = new ShareX.HelpersLib.BlackStyleCheckBox();
this.pbProgress = new ShareX.HelpersLib.BlackStyleProgressBar();
this.pbThumbnail = new System.Windows.Forms.PictureBox();
this.lblTitle = new ShareX.HelpersLib.BlackStyleLabel();
this.pThumbnail.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.pbThumbnail)).BeginInit();
this.SuspendLayout();
//
// lblTitle
//
this.lblTitle.AutoEllipsis = true;
this.lblTitle.BackColor = System.Drawing.Color.Transparent;
this.lblTitle.Font = new System.Drawing.Font("Arial", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.lblTitle.ForeColor = System.Drawing.Color.White;
this.lblTitle.Location = new System.Drawing.Point(0, 0);
this.lblTitle.Name = "lblTitle";
this.lblTitle.Size = new System.Drawing.Size(256, 22);
this.lblTitle.TabIndex = 1;
this.lblTitle.Text = "Test.png";
this.lblTitle.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
this.lblTitle.MouseClick += new System.Windows.Forms.MouseEventHandler(this.LblTitle_MouseClick);
//
// ttMain
//
this.ttMain.AutoPopDelay = 5000;
@ -66,6 +53,7 @@ private void InitializeComponent()
// pThumbnail
//
this.pThumbnail.BackColor = System.Drawing.Color.Transparent;
this.pThumbnail.Controls.Add(this.cbSelected);
this.pThumbnail.Controls.Add(this.pbProgress);
this.pThumbnail.Controls.Add(this.pbThumbnail);
this.pThumbnail.Location = new System.Drawing.Point(0, 24);
@ -74,9 +62,23 @@ private void InitializeComponent()
this.pThumbnail.PanelColor = System.Drawing.Color.FromArgb(((int)(((byte)(28)))), ((int)(((byte)(32)))), ((int)(((byte)(38)))));
this.pThumbnail.Radius = 5F;
this.pThumbnail.Size = new System.Drawing.Size(256, 256);
this.pThumbnail.StatusLocation = ShareX.ThumbnailTitleLocation.Top;
this.pThumbnail.TabIndex = 0;
this.pThumbnail.MouseClick += new System.Windows.Forms.MouseEventHandler(this.PbThumbnail_MouseClick);
//
// cbSelected
//
this.cbSelected.BackColor = System.Drawing.Color.Transparent;
this.cbSelected.Checked = true;
this.cbSelected.Font = new System.Drawing.Font("Arial", 8F);
this.cbSelected.ForeColor = System.Drawing.Color.White;
this.cbSelected.IgnoreClick = true;
this.cbSelected.Location = new System.Drawing.Point(4, 4);
this.cbSelected.Name = "cbSelected";
this.cbSelected.Size = new System.Drawing.Size(13, 13);
this.cbSelected.TabIndex = 2;
this.cbSelected.Visible = false;
//
// pbProgress
//
this.pbProgress.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left)
@ -106,6 +108,20 @@ private void InitializeComponent()
this.pbThumbnail.MouseMove += new System.Windows.Forms.MouseEventHandler(this.PbThumbnail_MouseMove);
this.pbThumbnail.MouseUp += new System.Windows.Forms.MouseEventHandler(this.PbThumbnail_MouseUp);
//
// lblTitle
//
this.lblTitle.AutoEllipsis = true;
this.lblTitle.BackColor = System.Drawing.Color.Transparent;
this.lblTitle.Font = new System.Drawing.Font("Arial", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.lblTitle.ForeColor = System.Drawing.Color.White;
this.lblTitle.Location = new System.Drawing.Point(0, 0);
this.lblTitle.Name = "lblTitle";
this.lblTitle.Size = new System.Drawing.Size(256, 22);
this.lblTitle.TabIndex = 1;
this.lblTitle.Text = "Test.png";
this.lblTitle.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
this.lblTitle.MouseClick += new System.Windows.Forms.MouseEventHandler(this.LblTitle_MouseClick);
//
// TaskThumbnailPanel
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
@ -128,5 +144,6 @@ private void InitializeComponent()
private HelpersLib.BlackStyleProgressBar pbProgress;
private System.Windows.Forms.PictureBox pbThumbnail;
private System.Windows.Forms.ToolTip ttMain;
private HelpersLib.BlackStyleCheckBox cbSelected;
}
}

View file

@ -96,6 +96,25 @@ public partial class TaskThumbnailPanel : UserControl
public WorkerTask Task { get; private set; }
private bool selected;
public bool Selected
{
get
{
return selected;
}
set
{
if (selected != value)
{
selected = value;
cbSelected.Visible = selected;
}
}
}
private string title;
public string Title
@ -392,7 +411,7 @@ public void ClearThumbnail()
private void LblTitle_MouseClick(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left && Task.Info != null)
if (ModifierKeys != Keys.Control && e.Button == MouseButtons.Left && Task.Info != null)
{
if (Task.Info.Result != null)
{
@ -428,7 +447,7 @@ private void PbThumbnail_MouseUp(object sender, MouseEventArgs e)
private void PbThumbnail_MouseClick(object sender, MouseEventArgs e)
{
if (ThumbnailSupportsClick && e.Button == MouseButtons.Left && Task.Info != null)
if (ThumbnailSupportsClick && ModifierKeys != Keys.Control && e.Button == MouseButtons.Left && Task.Info != null)
{
string filePath = Task.Info.FilePath;

View file

@ -42,7 +42,7 @@ private void InitializeComponent()
this.flpMain.TabIndex = 0;
this.flpMain.MouseDown += new System.Windows.Forms.MouseEventHandler(this.FlpMain_MouseDown);
this.flpMain.MouseEnter += new System.EventHandler(this.FlpMain_MouseEnter);
this.flpMain.MouseUp += new System.Windows.Forms.MouseEventHandler(this.Panel_MouseUp);
this.flpMain.MouseUp += new System.Windows.Forms.MouseEventHandler(this.TaskThumbnailView_MouseUp);
//
// TaskThumbnailView
//
@ -55,7 +55,7 @@ private void InitializeComponent()
this.Size = new System.Drawing.Size(242, 228);
this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.FlpMain_MouseDown);
this.MouseEnter += new System.EventHandler(this.FlpMain_MouseEnter);
this.MouseUp += new System.Windows.Forms.MouseEventHandler(this.Panel_MouseUp);
this.MouseUp += new System.Windows.Forms.MouseEventHandler(this.TaskThumbnailView_MouseUp);
this.ResumeLayout(false);
this.PerformLayout();

View file

@ -24,6 +24,7 @@ You should have received a copy of the GNU General Public License
#endregion License Information (GPL v3)
using ShareX.HelpersLib;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
@ -34,7 +35,20 @@ namespace ShareX
public partial class TaskThumbnailView : UserControl
{
public List<TaskThumbnailPanel> Panels { get; private set; }
public TaskThumbnailPanel SelectedPanel { get; private set; }
public List<TaskThumbnailPanel> SelectedPanels { get; private set; }
public TaskThumbnailPanel SelectedPanel
{
get
{
if (SelectedPanels.Count > 0)
{
return SelectedPanels[SelectedPanels.Count - 1];
}
return null;
}
}
private bool titleVisible = true;
@ -102,12 +116,13 @@ public Size ThumbnailSize
}
}
public delegate void TaskViewMouseEventHandler(object sender, MouseEventArgs e, WorkerTask task);
public delegate void TaskViewMouseEventHandler(object sender, MouseEventArgs e);
public event TaskViewMouseEventHandler ContextMenuRequested;
public TaskThumbnailView()
{
Panels = new List<TaskThumbnailPanel>();
SelectedPanels = new List<TaskThumbnailPanel>();
InitializeComponent();
UpdateTheme();
@ -139,8 +154,7 @@ private TaskThumbnailPanel CreatePanel(WorkerTask task)
{
TaskThumbnailPanel panel = new TaskThumbnailPanel(task);
panel.MouseEnter += FlpMain_MouseEnter;
panel.MouseDown += (sender, e) => SelectedPanel = panel;
panel.MouseUp += Panel_MouseUp;
panel.MouseUp += (object sender, MouseEventArgs e) => Panel_MouseUp(sender, e, panel);
panel.ThumbnailSize = ThumbnailSize;
panel.TitleVisible = TitleVisible;
panel.TitleLocation = TitleLocation;
@ -184,15 +198,25 @@ public void UpdateAllThumbnails(bool forceUpdate = false)
}
}
protected void OnContextMenuRequested(object sender, MouseEventArgs e, WorkerTask task)
public void UnselectAllPanels()
{
if (ContextMenuRequested != null)
SelectedPanels.Clear();
foreach (TaskThumbnailPanel panel in Panels)
{
ContextMenuRequested(sender, e, task);
panel.Selected = false;
}
}
private void FlpMain_MouseEnter(object sender, System.EventArgs e)
protected void OnContextMenuRequested(object sender, MouseEventArgs e)
{
if (ContextMenuRequested != null)
{
ContextMenuRequested(sender, e);
}
}
private void FlpMain_MouseEnter(object sender, EventArgs e)
{
// Workaround to handle mouse wheel scrolling in Windows 7
if (NativeMethods.GetForegroundWindow() == ParentForm.Handle && !flpMain.Focused)
@ -203,14 +227,50 @@ private void FlpMain_MouseEnter(object sender, System.EventArgs e)
private void FlpMain_MouseDown(object sender, MouseEventArgs e)
{
SelectedPanel = null;
UnselectAllPanels();
}
private void Panel_MouseUp(object sender, MouseEventArgs e)
private void TaskThumbnailView_MouseUp(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
Panel_MouseUp(sender, e, null);
}
private void Panel_MouseUp(object sender, MouseEventArgs e, TaskThumbnailPanel panel)
{
if (panel == null)
{
OnContextMenuRequested(sender, e, SelectedPanel?.Task);
UnselectAllPanels();
}
if (panel != null)
{
if (ModifierKeys == Keys.Control)
{
if (panel.Selected)
{
panel.Selected = false;
SelectedPanels.Remove(panel);
}
else
{
panel.Selected = true;
SelectedPanels.Add(panel);
}
}
else
{
if (!panel.Selected)
{
UnselectAllPanels();
panel.Selected = true;
SelectedPanels.Add(panel);
}
}
}
if (ModifierKeys != Keys.Control && e.Button == MouseButtons.Right)
{
OnContextMenuRequested(sender, e);
}
}
}

View file

@ -169,7 +169,7 @@ private void InitializeControls()
TaskManager.TaskListView = new TaskListView(lvUploads);
TaskManager.TaskThumbnailView = ucTaskThumbnailView;
uim = new UploadInfoManager(lvUploads);
uim = new UploadInfoManager();
// Required for BackColor Transparent to work
lblListViewTip.Parent = lvUploads;
@ -610,7 +610,7 @@ private void EnableDisableToolStripMenuItems<T>(params ToolStripDropDownItem[] p
}
}
private void UpdateContextMenu(WorkerTask task = null)
private void UpdateContextMenu()
{
cmsTaskInfo.SuspendLayout();
@ -622,7 +622,7 @@ private void UpdateContextMenu(WorkerTask task = null)
if (Program.Settings.TaskViewMode == TaskViewMode.ListView)
{
pbPreview.Reset();
uim.RefreshSelectedItems();
uim.UpdateSelectedItems(lvUploads.SelectedItems.Cast<ListViewItem>().Select(x => x.Tag as WorkerTask));
switch (Program.Settings.ImagePreview)
{
@ -647,9 +647,9 @@ private void UpdateContextMenu(WorkerTask task = null)
break;
}
}
else
else if (Program.Settings.TaskViewMode == TaskViewMode.ThumbnailView)
{
uim.SelectItem(task);
uim.UpdateSelectedItems(ucTaskThumbnailView.SelectedPanels.Select(x => x.Task));
}
if (uim.IsItemSelected)
@ -1126,19 +1126,26 @@ private WorkerTask[] GetSelectedTasks()
private void RemoveTasks(IEnumerable<WorkerTask> tasks)
{
tasks.Where(x => x != null && !x.IsWorking).ForEach(TaskManager.Remove);
if (tasks != null)
{
tasks.Where(x => x != null && !x.IsWorking).ForEach(TaskManager.Remove);
}
}
private void RemoveSelectedItems()
{
IEnumerable<WorkerTask> tasks = null;
if (Program.Settings.TaskViewMode == TaskViewMode.ListView)
{
RemoveTasks(lvUploads.SelectedItems.Cast<ListViewItem>().Select(x => x.Tag as WorkerTask));
tasks = lvUploads.SelectedItems.Cast<ListViewItem>().Select(x => x.Tag as WorkerTask);
}
else if (Program.Settings.TaskViewMode == TaskViewMode.ThumbnailView && ucTaskThumbnailView.SelectedPanel != null)
else if (Program.Settings.TaskViewMode == TaskViewMode.ThumbnailView)
{
RemoveTasks(new WorkerTask[] { ucTaskThumbnailView.SelectedPanel.Task });
tasks = ucTaskThumbnailView.SelectedPanels.Select(x => x.Task);
}
RemoveTasks(tasks);
}
private void RemoveAllItems()
@ -1539,9 +1546,9 @@ private void lvUploads_KeyDown(object sender, KeyEventArgs e)
e.Handled = e.SuppressKeyPress = true;
}
private void UcTaskView_ContextMenuRequested(object sender, MouseEventArgs e, WorkerTask task)
private void UcTaskView_ContextMenuRequested(object sender, MouseEventArgs e)
{
UpdateContextMenu(task);
UpdateContextMenu();
cmsTaskInfo.Show(sender as Control, e.X + 1, e.Y + 1);
}
@ -1549,7 +1556,7 @@ private void LblThumbnailViewTip_MouseUp(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
UcTaskView_ContextMenuRequested(lblThumbnailViewTip, e, null);
UcTaskView_ContextMenuRequested(lblThumbnailViewTip, e);
}
}

View file

@ -32,7 +32,6 @@ You should have received a copy of the GNU General Public License
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace ShareX
{
@ -61,33 +60,18 @@ public bool IsItemSelected
}
}
private ListView lv;
private UploadInfoParser parser;
public UploadInfoManager(ListView listView)
public UploadInfoManager()
{
lv = listView;
parser = new UploadInfoParser();
}
public void RefreshSelectedItems()
public void UpdateSelectedItems(IEnumerable<WorkerTask> tasks)
{
if (lv != null && lv.SelectedItems != null && lv.SelectedItems.Count > 0)
if (tasks != null && tasks.Count() > 0)
{
SelectedItems = lv.SelectedItems.Cast<ListViewItem>().Select(x => x.Tag as WorkerTask).Where(x => x != null && x.Info != null).
Select(x => new UploadInfoStatus(x)).ToArray();
}
else
{
SelectedItems = null;
}
}
public void SelectItem(WorkerTask task)
{
if (task != null && task.Info != null)
{
SelectedItems = new UploadInfoStatus[] { new UploadInfoStatus(task) };
SelectedItems = tasks.Where(x => x != null && x.Info != null).Select(x => new UploadInfoStatus(x)).ToArray();
}
else
{