• R/O
  • HTTP
  • SSH
  • HTTPS

Commit

Tags
Keine Tags

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

Commit MetaInfo

Revisiond32be2b43655d28484a6686dfb26bedf39aa6132 (tree)
Zeit2020-03-23 22:50:56
AutorKazuhiro Fujieda <fujieda@user...>
CommiterKazuhiro Fujieda

Log Message

装備一覧の更新時の書き換えを最小限にする

Ändern Zusammenfassung

Diff

--- a/KancolleSniffer/View/ItemTreeView.cs
+++ b/KancolleSniffer/View/ItemTreeView.cs
@@ -24,13 +24,8 @@ namespace KancolleSniffer.View
2424 {
2525 public class ItemTreeView : TreeView
2626 {
27- private ItemStatus[] _prevItemList;
28-
2927 public void SetNodes(ItemStatus[] itemList)
3028 {
31- if (_prevItemList != null && _prevItemList.SequenceEqual(itemList, new ItemStatusComparer()))
32- return;
33- _prevItemList = itemList.Select(CloneItemStatus).ToArray();
3429 SetNodes(CreateItemNodes(itemList));
3530 }
3631
@@ -97,44 +92,11 @@ namespace KancolleSniffer.View
9792 return root;
9893 }
9994
100- private ItemStatus CloneItemStatus(ItemStatus org)
101- {
102- return new ItemStatus
103- {
104- Level = org.Level,
105- Spec = org.Spec,
106- Holder = new ShipStatus {Id = org.Holder.Id, Fleet = org.Holder.Fleet}
107- };
108- }
109-
110- private class ItemStatusComparer : IEqualityComparer<ItemStatus>
111- {
112- public bool Equals(ItemStatus x, ItemStatus y)
113- // ReSharper disable PossibleNullReferenceException
114- => x.Level == y.Level && x.Spec == y.Spec && x.Holder.Id == y.Holder.Id &&
115- x.Holder.Fleet == y.Holder.Fleet;
116- // ReSharper restore PossibleNullReferenceException
117-
118- public int GetHashCode(ItemStatus obj) => obj.Level + obj.Spec.GetHashCode() + obj.Holder.GetHashCode();
119- }
120-
121- [DllImport("user32.dll")]
122- private static extern int GetScrollPos(IntPtr hWnd, int nBar);
123-
124- [DllImport("user32.dll")]
125- private static extern int SetScrollPos(IntPtr hWnd, int nBar, int nPos, bool bRedraw);
126-
12795 private void SetNodes(TreeNode root)
12896 {
129- var y = GetScrollPos(Handle, 1);
130- BeginUpdate();
13197 var save = SaveTreeViewState(Nodes);
132- Nodes.Clear();
133- foreach (TreeNode child in root.Nodes)
134- Nodes.Add(child);
98+ UpdateNodes(Nodes, root.Nodes);
13599 RestoreTreeViewState(Nodes, save.Nodes);
136- EndUpdate();
137- SetScrollPos(Handle, 1, y, true);
138100 }
139101
140102 private TreeNode SaveTreeViewState(IEnumerable nodes)
@@ -164,6 +126,25 @@ namespace KancolleSniffer.View
164126 }
165127 }
166128
129+ private void UpdateNodes(TreeNodeCollection prev, TreeNodeCollection now)
130+ {
131+ for (var i = 0; i < now.Count; i++)
132+ {
133+ if (prev.Count <= i)
134+ {
135+ prev.Add(now[i]);
136+ continue;
137+ }
138+ if (prev.Count > i && prev[i].Name == now[i].Name)
139+ {
140+ UpdateNodes(prev[i].Nodes, now[i].Nodes);
141+ continue;
142+ }
143+ prev.RemoveAt(i);
144+ prev.Insert(i, now[i]);
145+ }
146+ }
147+
167148 // ReSharper disable InconsistentNaming
168149 // ReSharper disable IdentifierTypo
169150