mirror of
https://github.com/ShareX/ShareX.git
synced 2024-09-30 09:17:36 +13:00
Merge pull request #4405 from Jaex/thumbnail-view-multi-select-support
fixed #4280: Thumbnail view multi select support
This commit is contained in:
commit
7489916857
7 changed files with 158 additions and 64 deletions
|
@ -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)
|
||||
|
|
47
ShareX/Controls/TaskThumbnailPanel.Designer.cs
generated
47
ShareX/Controls/TaskThumbnailPanel.Designer.cs
generated
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
4
ShareX/Controls/TaskThumbnailView.Designer.cs
generated
4
ShareX/Controls/TaskThumbnailView.Designer.cs
generated
|
@ -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();
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue