Files
CarlMonitor/LibreHardwareMonitor-0.9.4/LibreHardwareMonitor/UI/TreeModel.cs
2025-04-07 07:44:27 -07:00

125 lines
3.3 KiB
C#

// This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
// If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
// Copyright (C) LibreHardwareMonitor and Contributors.
// Partial Copyright (C) Michael Möller <mmoeller@openhardwaremonitor.org> and Contributors.
// All Rights Reserved.
using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using Aga.Controls.Tree;
namespace LibreHardwareMonitor.UI;
public class TreeModel : ITreeModel
{
private readonly Node _root;
private bool _forceVisible;
public TreeModel()
{
_root = new Node { Model = this };
}
public TreePath GetPath(Node node)
{
if (node == _root)
return TreePath.Empty;
Stack<object> stack = new Stack<object>();
while (node != _root)
{
stack.Push(node);
node = node.Parent;
}
return new TreePath(stack.ToArray());
}
public Collection<Node> Nodes
{
get { return _root.Nodes; }
}
private Node GetNode(TreePath treePath)
{
Node parent = _root;
foreach (object obj in treePath.FullPath)
{
if (!(obj is Node node) || node.Parent != parent)
return null;
parent = node;
}
return parent;
}
public IEnumerable GetChildren(TreePath treePath)
{
Node node = GetNode(treePath);
if (node != null)
{
return node.Nodes.Where(n => _forceVisible || n.IsVisible).ToList();
}
return Enumerable.Empty<Node>();
}
public bool IsLeaf(TreePath treePath)
{
return false;
}
public bool ForceVisible
{
get
{
return _forceVisible;
}
set
{
if (value != _forceVisible)
{
_forceVisible = value;
OnStructureChanged(_root);
}
}
}
#pragma warning disable 67
public event EventHandler<TreeModelEventArgs> NodesChanged;
public event EventHandler<TreePathEventArgs> StructureChanged;
public event EventHandler<TreeModelEventArgs> NodesInserted;
public event EventHandler<TreeModelEventArgs> NodesRemoved;
#pragma warning restore 67
public void OnNodeChanged(Node parent, int index, Node node)
{
if (parent != null)
{
TreePath path = GetPath(parent);
if (path != null)
NodesChanged?.Invoke(this, new TreeModelEventArgs(path, new[] { index }, new object[] { node }));
}
}
public void OnStructureChanged(Node node)
{
StructureChanged?.Invoke(this, new TreeModelEventArgs(GetPath(node), new object[0]));
}
public void OnNodeInserted(Node parent, int index, Node node)
{
TreeModelEventArgs args = new TreeModelEventArgs(GetPath(parent), new[] { index }, new object[] { node });
NodesInserted?.Invoke(this, args);
}
public void OnNodeRemoved(Node parent, int index, Node node)
{
TreeModelEventArgs args = new TreeModelEventArgs(GetPath(parent), new[] { index }, new object[] { node });
NodesRemoved?.Invoke(this, args);
}
}