Use ListView virtual mode in history form

This commit is contained in:
Jaex 2022-01-01 00:18:40 +03:00
parent a3f615d72c
commit bbec9ecef1
3 changed files with 75 additions and 55 deletions

View file

@ -220,8 +220,11 @@ private void InitializeComponent()
this.lvHistory.Name = "lvHistory"; this.lvHistory.Name = "lvHistory";
this.lvHistory.UseCompatibleStateImageBehavior = false; this.lvHistory.UseCompatibleStateImageBehavior = false;
this.lvHistory.View = System.Windows.Forms.View.Details; this.lvHistory.View = System.Windows.Forms.View.Details;
this.lvHistory.VirtualMode = true;
this.lvHistory.CacheVirtualItems += new System.Windows.Forms.CacheVirtualItemsEventHandler(this.lvHistory_CacheVirtualItems);
this.lvHistory.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.lvHistory_ItemDrag); this.lvHistory.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.lvHistory_ItemDrag);
this.lvHistory.ItemSelectionChanged += new System.Windows.Forms.ListViewItemSelectionChangedEventHandler(this.lvHistory_ItemSelectionChanged); this.lvHistory.ItemSelectionChanged += new System.Windows.Forms.ListViewItemSelectionChangedEventHandler(this.lvHistory_ItemSelectionChanged);
this.lvHistory.RetrieveVirtualItem += new System.Windows.Forms.RetrieveVirtualItemEventHandler(this.lvHistory_RetrieveVirtualItem);
this.lvHistory.KeyDown += new System.Windows.Forms.KeyEventHandler(this.lvHistory_KeyDown); this.lvHistory.KeyDown += new System.Windows.Forms.KeyEventHandler(this.lvHistory_KeyDown);
this.lvHistory.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.lvHistory_MouseDoubleClick); this.lvHistory.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.lvHistory_MouseDoubleClick);
// //

View file

@ -41,9 +41,12 @@ public partial class HistoryForm : Form
private HistoryItemManager him; private HistoryItemManager him;
private HistoryItem[] allHistoryItems; private HistoryItem[] allHistoryItems;
private HistoryItem[] filteredHistoryItems;
private string defaultTitle; private string defaultTitle;
private Dictionary<string, string> typeNamesLocaleLookup; private Dictionary<string, string> typeNamesLocaleLookup;
private string[] allTypeNames; private string[] allTypeNames;
private ListViewItem[] listViewCache;
private int listViewFirstItem;
public HistoryForm(string historyPath, HistorySettings settings, Action<string> uploadFile = null, Action<string> editImage = null) public HistoryForm(string historyPath, HistorySettings settings, Action<string> uploadFile = null, Action<string> editImage = null)
{ {
@ -137,7 +140,7 @@ private void RefreshHistoryItems(bool mockData = false)
private HistoryItem[] him_GetHistoryItems() private HistoryItem[] him_GetHistoryItems()
{ {
return lvHistory.SelectedItems.Cast<ListViewItem>().Select(x => x.Tag as HistoryItem).ToArray(); return lvHistory.SelectedIndices.Cast<int>().Select(i => filteredHistoryItems[i]).ToArray();
} }
private HistoryItem[] GetHistoryItems(bool mockData = false) private HistoryItem[] GetHistoryItems(bool mockData = false)
@ -163,8 +166,13 @@ private void ApplyFilter(HistoryFilter filter)
if (allHistoryItems != null && allHistoryItems.Length > 0) if (allHistoryItems != null && allHistoryItems.Length > 0)
{ {
IEnumerable<HistoryItem> historyItems = filter.ApplyFilter(allHistoryItems); IEnumerable<HistoryItem> historyItems = filter.ApplyFilter(allHistoryItems);
filteredHistoryItems = historyItems.ToArray();
AddHistoryItems(historyItems.ToArray()); UpdateTitle(filteredHistoryItems);
listViewCache = null;
lvHistory.VirtualListSize = 0;
lvHistory.VirtualListSize = filteredHistoryItems.Length;
} }
} }
@ -213,54 +221,35 @@ private void ApplyFilterAdvanced()
ApplyFilter(filter); ApplyFilter(filter);
} }
private void AddHistoryItems(HistoryItem[] historyItems) private ListViewItem CreateListViewItem(int index)
{ {
Cursor = Cursors.WaitCursor; HistoryItem hi = filteredHistoryItems[index];
UpdateTitle(historyItems); ListViewItem lvi = new ListViewItem();
lvHistory.Items.Clear(); if (hi.Type.Equals("Image", StringComparison.InvariantCultureIgnoreCase))
ListViewItem[] listViewItems = new ListViewItem[historyItems.Length];
for (int i = 0; i < historyItems.Length; i++)
{ {
HistoryItem hi = historyItems[i]; lvi.ImageIndex = 0;
ListViewItem lvi = listViewItems[i] = new ListViewItem(); }
else if (hi.Type.Equals("Text", StringComparison.InvariantCultureIgnoreCase))
if (hi.Type.Equals("Image", StringComparison.InvariantCultureIgnoreCase)) {
{ lvi.ImageIndex = 1;
lvi.ImageIndex = 0; }
} else if (hi.Type.Equals("File", StringComparison.InvariantCultureIgnoreCase))
else if (hi.Type.Equals("Text", StringComparison.InvariantCultureIgnoreCase)) {
{ lvi.ImageIndex = 2;
lvi.ImageIndex = 1; }
} else
else if (hi.Type.Equals("File", StringComparison.InvariantCultureIgnoreCase)) {
{ lvi.ImageIndex = 3;
lvi.ImageIndex = 2;
}
else
{
lvi.ImageIndex = 3;
}
lvi.SubItems.Add(hi.DateTime.ToString()).Tag = hi.DateTime;
lvi.SubItems.Add(hi.FileName);
lvi.SubItems.Add(hi.URL);
lvi.Tag = hi;
} }
lvHistory.Items.AddRange(listViewItems); lvi.SubItems.Add(hi.DateTime.ToString()).Tag = hi.DateTime;
lvHistory.FillLastColumn(); lvi.SubItems.Add(hi.FileName);
lvHistory.Focus(); lvi.SubItems.Add(hi.URL);
lvi.Tag = hi;
if (lvHistory.Items.Count > 0) return lvi;
{
lvHistory.Items[0].Selected = true;
}
Cursor = Cursors.Default;
} }
private void UpdateTitle(HistoryItem[] historyItems = null) private void UpdateTitle(HistoryItem[] historyItems = null)
@ -396,9 +385,7 @@ private string OutputStats(HistoryItem[] historyItems)
private void HistoryForm_Shown(object sender, EventArgs e) private void HistoryForm_Shown(object sender, EventArgs e)
{ {
Refresh(); Refresh();
RefreshHistoryItems(); RefreshHistoryItems();
this.ForceActivate(); this.ForceActivate();
} }
@ -517,6 +504,35 @@ private void btnAdvancedSearchReset_Click(object sender, EventArgs e)
ApplyFilterAdvanced(); ApplyFilterAdvanced();
} }
private void lvHistory_RetrieveVirtualItem(object sender, RetrieveVirtualItemEventArgs e)
{
if (listViewCache != null && e.ItemIndex >= listViewFirstItem && e.ItemIndex < listViewFirstItem + listViewCache.Length)
{
e.Item = listViewCache[e.ItemIndex - listViewFirstItem];
}
else
{
e.Item = CreateListViewItem(e.ItemIndex);
}
}
private void lvHistory_CacheVirtualItems(object sender, CacheVirtualItemsEventArgs e)
{
if (listViewCache != null && e.StartIndex >= listViewFirstItem && e.EndIndex <= listViewFirstItem + listViewCache.Length)
{
return;
}
listViewFirstItem = e.StartIndex;
int length = e.EndIndex - e.StartIndex + 1;
listViewCache = new ListViewItem[length];
for (int i = 0; i < length; i++)
{
listViewCache[i] = CreateListViewItem(e.StartIndex + i);
}
}
private void lvHistory_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e) private void lvHistory_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e)
{ {
UpdateControls(); UpdateControls();
@ -539,9 +555,10 @@ private void lvHistory_ItemDrag(object sender, ItemDragEventArgs e)
{ {
List<string> selection = new List<string>(); List<string> selection = new List<string>();
foreach (ListViewItem item in lvHistory.SelectedItems) foreach (int index in lvHistory.SelectedIndices)
{ {
HistoryItem hi = (HistoryItem)item.Tag; HistoryItem hi = filteredHistoryItems[index];
if (File.Exists(hi.FilePath)) if (File.Exists(hi.FilePath))
{ {
selection.Add(hi.FilePath); selection.Add(hi.FilePath);

View file

@ -586,7 +586,7 @@
<value>lvHistory</value> <value>lvHistory</value>
</data> </data>
<data name="&gt;&gt;lvHistory.Type" xml:space="preserve"> <data name="&gt;&gt;lvHistory.Type" xml:space="preserve">
<value>ShareX.HelpersLib.MyListView, ShareX.HelpersLib, Version=13.6.2.0, Culture=neutral, PublicKeyToken=null</value> <value>ShareX.HelpersLib.MyListView, ShareX.HelpersLib, Version=13.7.0.0, Culture=neutral, PublicKeyToken=null</value>
</data> </data>
<data name="&gt;&gt;lvHistory.Parent" xml:space="preserve"> <data name="&gt;&gt;lvHistory.Parent" xml:space="preserve">
<value>tscHistory.ContentPanel</value> <value>tscHistory.ContentPanel</value>
@ -718,7 +718,7 @@
<value>3, 0</value> <value>3, 0</value>
</data> </data>
<data name="tsHistory.Size" type="System.Drawing.Size, System.Drawing"> <data name="tsHistory.Size" type="System.Drawing.Size, System.Drawing">
<value>508, 25</value> <value>477, 25</value>
</data> </data>
<data name="tsHistory.TabIndex" type="System.Int32, mscorlib"> <data name="tsHistory.TabIndex" type="System.Int32, mscorlib">
<value>0</value> <value>0</value>
@ -799,7 +799,7 @@
<value>0, 0</value> <value>0, 0</value>
</data> </data>
<data name="pbThumbnail.Size" type="System.Drawing.Size, System.Drawing"> <data name="pbThumbnail.Size" type="System.Drawing.Size, System.Drawing">
<value>627, 445</value> <value>627, 442</value>
</data> </data>
<data name="pbThumbnail.TabIndex" type="System.Int32, mscorlib"> <data name="pbThumbnail.TabIndex" type="System.Int32, mscorlib">
<value>3</value> <value>3</value>
@ -808,7 +808,7 @@
<value>pbThumbnail</value> <value>pbThumbnail</value>
</data> </data>
<data name="&gt;&gt;pbThumbnail.Type" xml:space="preserve"> <data name="&gt;&gt;pbThumbnail.Type" xml:space="preserve">
<value>ShareX.HelpersLib.MyPictureBox, ShareX.HelpersLib, Version=13.6.2.0, Culture=neutral, PublicKeyToken=null</value> <value>ShareX.HelpersLib.MyPictureBox, ShareX.HelpersLib, Version=13.7.0.0, Culture=neutral, PublicKeyToken=null</value>
</data> </data>
<data name="&gt;&gt;pbThumbnail.Parent" xml:space="preserve"> <data name="&gt;&gt;pbThumbnail.Parent" xml:space="preserve">
<value>scHistoryItemInfo.Panel1</value> <value>scHistoryItemInfo.Panel1</value>
@ -838,7 +838,7 @@
<value>0, 0</value> <value>0, 0</value>
</data> </data>
<data name="pgHistoryItemInfo.Size" type="System.Drawing.Size, System.Drawing"> <data name="pgHistoryItemInfo.Size" type="System.Drawing.Size, System.Drawing">
<value>627, 209</value> <value>627, 212</value>
</data> </data>
<data name="pgHistoryItemInfo.TabIndex" type="System.Int32, mscorlib"> <data name="pgHistoryItemInfo.TabIndex" type="System.Int32, mscorlib">
<value>0</value> <value>0</value>
@ -871,7 +871,7 @@
<value>627, 661</value> <value>627, 661</value>
</data> </data>
<data name="scHistoryItemInfo.SplitterDistance" type="System.Int32, mscorlib"> <data name="scHistoryItemInfo.SplitterDistance" type="System.Int32, mscorlib">
<value>445</value> <value>442</value>
</data> </data>
<data name="scHistoryItemInfo.SplitterWidth" type="System.Int32, mscorlib"> <data name="scHistoryItemInfo.SplitterWidth" type="System.Int32, mscorlib">
<value>7</value> <value>7</value>
@ -883,7 +883,7 @@
<value>scHistoryItemInfo</value> <value>scHistoryItemInfo</value>
</data> </data>
<data name="&gt;&gt;scHistoryItemInfo.Type" xml:space="preserve"> <data name="&gt;&gt;scHistoryItemInfo.Type" xml:space="preserve">
<value>ShareX.HelpersLib.SplitContainerCustomSplitter, ShareX.HelpersLib, Version=13.6.2.0, Culture=neutral, PublicKeyToken=null</value> <value>ShareX.HelpersLib.SplitContainerCustomSplitter, ShareX.HelpersLib, Version=13.7.0.0, Culture=neutral, PublicKeyToken=null</value>
</data> </data>
<data name="&gt;&gt;scHistoryItemInfo.Parent" xml:space="preserve"> <data name="&gt;&gt;scHistoryItemInfo.Parent" xml:space="preserve">
<value>scMain.Panel2</value> <value>scMain.Panel2</value>
@ -922,7 +922,7 @@
<value>scMain</value> <value>scMain</value>
</data> </data>
<data name="&gt;&gt;scMain.Type" xml:space="preserve"> <data name="&gt;&gt;scMain.Type" xml:space="preserve">
<value>ShareX.HelpersLib.SplitContainerCustomSplitter, ShareX.HelpersLib, Version=13.6.2.0, Culture=neutral, PublicKeyToken=null</value> <value>ShareX.HelpersLib.SplitContainerCustomSplitter, ShareX.HelpersLib, Version=13.7.0.0, Culture=neutral, PublicKeyToken=null</value>
</data> </data>
<data name="&gt;&gt;scMain.Parent" xml:space="preserve"> <data name="&gt;&gt;scMain.Parent" xml:space="preserve">
<value>$this</value> <value>$this</value>