主界面添加拖动排序功能

This commit is contained in:
bin456789 2022-03-12 20:50:14 +08:00
parent 887dd8da3b
commit 5859cb7a15
No known key found for this signature in database
GPG key ID: EE301B386DE6C11B
2 changed files with 117 additions and 1 deletions

View file

@ -185,8 +185,13 @@
this.lvServers.UseCompatibleStateImageBehavior = false; this.lvServers.UseCompatibleStateImageBehavior = false;
this.lvServers.View = System.Windows.Forms.View.Details; this.lvServers.View = System.Windows.Forms.View.Details;
this.lvServers.ColumnClick += new System.Windows.Forms.ColumnClickEventHandler(this.lvServers_ColumnClick); this.lvServers.ColumnClick += new System.Windows.Forms.ColumnClickEventHandler(this.lvServers_ColumnClick);
this.lvServers.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.lvServers_ItemDrag);
this.lvServers.SelectedIndexChanged += new System.EventHandler(this.lvServers_SelectedIndexChanged); this.lvServers.SelectedIndexChanged += new System.EventHandler(this.lvServers_SelectedIndexChanged);
this.lvServers.Click += new System.EventHandler(this.lvServers_Click); this.lvServers.Click += new System.EventHandler(this.lvServers_Click);
this.lvServers.DragDrop += new System.Windows.Forms.DragEventHandler(this.lvServers_DragDrop);
this.lvServers.DragEnter += new System.Windows.Forms.DragEventHandler(this.lvServers_DragEnter);
this.lvServers.DragOver += new System.Windows.Forms.DragEventHandler(this.lvServers_DragOver);
this.lvServers.DragLeave += new System.EventHandler(this.lvServers_DragLeave);
this.lvServers.DoubleClick += new System.EventHandler(this.lvServers_DoubleClick); this.lvServers.DoubleClick += new System.EventHandler(this.lvServers_DoubleClick);
this.lvServers.KeyDown += new System.Windows.Forms.KeyEventHandler(this.lvServers_KeyDown); this.lvServers.KeyDown += new System.Windows.Forms.KeyEventHandler(this.lvServers_KeyDown);
// //
@ -959,7 +964,7 @@
} }
#endregion #endregion
private System.Windows.Forms.GroupBox groupBox1; private System.Windows.Forms.GroupBox groupBox1;
private System.Windows.Forms.GroupBox gbMsgTitle; private System.Windows.Forms.GroupBox gbMsgTitle;

View file

@ -214,6 +214,7 @@ namespace v2rayN.Forms
lvServers.View = View.Details; lvServers.View = View.Details;
lvServers.Scrollable = true; lvServers.Scrollable = true;
lvServers.MultiSelect = true; lvServers.MultiSelect = true;
lvServers.AllowDrop = true;
lvServers.HeaderStyle = ColumnHeaderStyle.Clickable; lvServers.HeaderStyle = ColumnHeaderStyle.Clickable;
lvServers.Columns.Add("", 30); lvServers.Columns.Add("", 30);
@ -313,6 +314,26 @@ namespace v2rayN.Forms
} }
} }
/// <summary>
/// 填充 ListView 背景颜色
/// </summary>
/// <param name="listView"></param>
private void RefillListViewBackColor(ListView listView)
{
for (int i = 0; i < listView.Items.Count; i++)
{
ListViewItem currentItem = lvServers.Items[i];
if (i % 2 == 1) // 隔行着色
{
currentItem.BackColor = Color.WhiteSmoke;
}
else
{
currentItem.BackColor = default;
}
}
}
/// <summary> /// <summary>
/// 刷新托盘服务器菜单 /// 刷新托盘服务器菜单
/// </summary> /// </summary>
@ -1587,5 +1608,95 @@ namespace v2rayN.Forms
} }
#endregion #endregion
#region
private void lvServers_DragDrop(object sender, DragEventArgs e)
{
int targetIndex = lvServers.InsertionMark.Index;
if (targetIndex == -1)
{
return;
}
if (lvServers.InsertionMark.AppearsAfterItem)
{
targetIndex++;
}
string activeIndexId = config.indexId();
lvServers.BeginUpdate();
foreach (ListViewItem oldItem in lvServers.SelectedItems)
{
if (targetIndex == oldItem.Index)
{
targetIndex++;
continue;
}
VmessItem oldVmess = config.vmess[oldItem.Index];
ListViewItem cloneItem = (ListViewItem)oldItem.Clone();
VmessItem cloneVmess = Utils.DeepCopy(oldVmess);
lvServers.Items.Insert(targetIndex, cloneItem);
config.vmess.Insert(targetIndex, cloneVmess);
cloneItem.Selected = true;
if (oldItem.Focused)
{
cloneItem.Focused = true;
}
lvServers.Items.Remove(oldItem);
config.vmess.Remove(oldVmess);
targetIndex = lvServers.Items.IndexOf(cloneItem) + 1;
}
RefillListViewBackColor(lvServers);
lvServers.EndUpdate();
config.index = config.FindIndexId(activeIndexId);
ConfigHandler.SaveConfig(ref config, false);
RefreshServersMenu();
}
private void lvServers_DragEnter(object sender, DragEventArgs e)
{
e.Effect = e.AllowedEffect;
}
private void lvServers_DragLeave(object sender, EventArgs e)
{
lvServers.InsertionMark.Index = -1;
}
private void lvServers_DragOver(object sender, DragEventArgs e)
{
Point targetPoint = lvServers.PointToClient(new Point(e.X, e.Y));
int targetIndex = lvServers.InsertionMark.NearestIndex(targetPoint);
if (targetIndex > -1)
{
Rectangle itemBounds = lvServers.GetItemRect(targetIndex);
lvServers.EnsureVisible(targetIndex);
if (targetPoint.Y > itemBounds.Top + (itemBounds.Height / 2))
{
lvServers.InsertionMark.AppearsAfterItem = true;
}
else
{
lvServers.InsertionMark.AppearsAfterItem = false;
}
}
lvServers.InsertionMark.Index = targetIndex;
}
private void lvServers_ItemDrag(object sender, ItemDragEventArgs e)
{
lvServers.DoDragDrop(e.Item, DragDropEffects.Move);
}
#endregion
} }
} }