Skip to content

Commit 811746b

Browse files
committed
Speed up node replacement.
1 parent 2a181ed commit 811746b

File tree

1 file changed

+32
-19
lines changed

1 file changed

+32
-19
lines changed

ReClass.NET/Forms/MainForm.Functions.cs

Lines changed: 32 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -292,38 +292,47 @@ public void ReplaceSelectedNodesWithType(Type type)
292292
var hotSpotPartitions = selectedNodes
293293
.WhereNot(s => s.Node is ClassNode)
294294
.GroupBy(s => s.Node.GetParentContainer())
295-
.SelectMany(g => g
296-
.OrderBy(s => s.Node.Offset)
297-
.GroupWhile((h1, h2) => h1.Node.Offset + h1.Node.MemorySize == h2.Node.Offset)
298-
);
295+
.Select(g => new
296+
{
297+
Container = g.Key,
298+
Partitions = g.OrderBy(s => s.Node.Offset)
299+
.GroupWhile((s1, s2) => s1.Node.Offset + s1.Node.MemorySize == s2.Node.Offset)
300+
});
299301

300-
foreach (var selectedPartition in hotSpotPartitions)
302+
foreach (var containerPartitions in hotSpotPartitions)
301303
{
302-
var hotSpotsToReplace = new Queue<MemoryViewControl.SelectedNodeInfo>(selectedPartition);
303-
while (hotSpotsToReplace.Count > 0)
304+
containerPartitions.Container.BeginUpdate();
305+
306+
foreach (var partition in containerPartitions.Partitions)
304307
{
305-
var selected = hotSpotsToReplace.Dequeue();
308+
var hotSpotsToReplace = new Queue<MemoryViewControl.SelectedNodeInfo>(partition);
309+
while (hotSpotsToReplace.Count > 0)
310+
{
311+
var selected = hotSpotsToReplace.Dequeue();
306312

307-
var node = BaseNode.CreateInstanceFromType(type);
313+
var node = BaseNode.CreateInstanceFromType(type);
308314

309-
var createdNodes = new List<BaseNode>();
310-
selected.Node.GetParentContainer().ReplaceChildNode(selected.Node, node, ref createdNodes);
315+
var createdNodes = new List<BaseNode>();
316+
containerPartitions.Container.ReplaceChildNode(selected.Node, node, ref createdNodes);
311317

312-
node.IsSelected = true;
318+
node.IsSelected = true;
313319

314-
var info = new MemoryViewControl.SelectedNodeInfo(node, selected.Process, selected.Memory, selected.Address, selected.Level);
320+
var info = new MemoryViewControl.SelectedNodeInfo(node, selected.Process, selected.Memory, selected.Address, selected.Level);
315321

316-
newSelected.Add(info);
322+
newSelected.Add(info);
317323

318-
// If more than one node is selected I assume the user wants to replace the complete range with the desired node type.
319-
if (selectedNodes.Count > 1)
320-
{
321-
foreach (var createdNode in createdNodes)
324+
// If more than one node is selected I assume the user wants to replace the complete range with the desired node type.
325+
if (selectedNodes.Count > 1)
322326
{
323-
hotSpotsToReplace.Enqueue(new MemoryViewControl.SelectedNodeInfo(createdNode, selected.Process, selected.Memory, selected.Address + createdNode.Offset - node.Offset, selected.Level));
327+
foreach (var createdNode in createdNodes)
328+
{
329+
hotSpotsToReplace.Enqueue(new MemoryViewControl.SelectedNodeInfo(createdNode, selected.Process, selected.Memory, selected.Address + createdNode.Offset - node.Offset, selected.Level));
330+
}
324331
}
325332
}
326333
}
334+
335+
containerPartitions.Container.EndUpdate();
327336
}
328337

329338
memoryViewControl.ClearSelection();
@@ -373,6 +382,8 @@ private void PasteNodeFromClipboardToSelection()
373382
var classNode = selectedNode.GetParentClass();
374383
if (containerNode != null && classNode != null)
375384
{
385+
containerNode.BeginUpdate();
386+
376387
foreach (var node in result.Item2)
377388
{
378389
if (node is BaseWrapperNode)
@@ -394,6 +405,8 @@ private void PasteNodeFromClipboardToSelection()
394405

395406
containerNode.InsertNode(selectedNode, node);
396407
}
408+
409+
containerNode.EndUpdate();
397410
}
398411
}
399412
}

0 commit comments

Comments
 (0)