Revision | d32be2b43655d28484a6686dfb26bedf39aa6132 (tree) |
---|---|
Zeit | 2020-03-23 22:50:56 |
Autor | Kazuhiro Fujieda <fujieda@user...> |
Commiter | Kazuhiro Fujieda |
装備一覧の更新時の書き換えを最小限にする
@@ -24,13 +24,8 @@ namespace KancolleSniffer.View | ||
24 | 24 | { |
25 | 25 | public class ItemTreeView : TreeView |
26 | 26 | { |
27 | - private ItemStatus[] _prevItemList; | |
28 | - | |
29 | 27 | public void SetNodes(ItemStatus[] itemList) |
30 | 28 | { |
31 | - if (_prevItemList != null && _prevItemList.SequenceEqual(itemList, new ItemStatusComparer())) | |
32 | - return; | |
33 | - _prevItemList = itemList.Select(CloneItemStatus).ToArray(); | |
34 | 29 | SetNodes(CreateItemNodes(itemList)); |
35 | 30 | } |
36 | 31 |
@@ -97,44 +92,11 @@ namespace KancolleSniffer.View | ||
97 | 92 | return root; |
98 | 93 | } |
99 | 94 | |
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 | - | |
127 | 95 | private void SetNodes(TreeNode root) |
128 | 96 | { |
129 | - var y = GetScrollPos(Handle, 1); | |
130 | - BeginUpdate(); | |
131 | 97 | var save = SaveTreeViewState(Nodes); |
132 | - Nodes.Clear(); | |
133 | - foreach (TreeNode child in root.Nodes) | |
134 | - Nodes.Add(child); | |
98 | + UpdateNodes(Nodes, root.Nodes); | |
135 | 99 | RestoreTreeViewState(Nodes, save.Nodes); |
136 | - EndUpdate(); | |
137 | - SetScrollPos(Handle, 1, y, true); | |
138 | 100 | } |
139 | 101 | |
140 | 102 | private TreeNode SaveTreeViewState(IEnumerable nodes) |
@@ -164,6 +126,25 @@ namespace KancolleSniffer.View | ||
164 | 126 | } |
165 | 127 | } |
166 | 128 | |
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 | + | |
167 | 148 | // ReSharper disable InconsistentNaming |
168 | 149 | // ReSharper disable IdentifierTypo |
169 | 150 |