This commit is contained in:
Phyxion
2019-09-13 15:34:42 +02:00
committed by GitHub
parent d92d88d905
commit 22a229eda1
55 changed files with 8818 additions and 9312 deletions
+105 -103
View File
@@ -1,12 +1,7 @@
/*
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) 2009-2010 Michael Möller <mmoeller@openhardwaremonitor.org>
*/
// Mozilla Public License 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
// All Rights Reserved
using System;
using System.Collections;
@@ -14,110 +9,117 @@ using System.Collections.Generic;
using System.Collections.ObjectModel;
using Aga.Controls.Tree;
namespace OpenHardwareMonitor.GUI {
public class TreeModel : ITreeModel {
namespace OpenHardwareMonitor.GUI
{
public class TreeModel : ITreeModel
{
private readonly Node _root;
private bool _forceVisible;
private Node root;
private bool forceVisible = false;
public TreeModel() {
root = new Node();
root.Model = this;
}
public TreePath GetPath(Node node) {
if (node == root)
return TreePath.Empty;
else {
Stack<object> stack = new Stack<object>();
while (node != root) {
stack.Push(node);
node = node.Parent;
public TreeModel()
{
_root = new Node { Model = this };
}
return new TreePath(stack.ToArray());
}
}
public Collection<Node> Nodes {
get { return root.Nodes; }
}
public TreePath GetPath(Node node)
{
if (node == _root)
return TreePath.Empty;
private Node GetNode(TreePath treePath) {
Node parent = root;
foreach (object obj in treePath.FullPath) {
Node node = obj as Node;
if (node == null || node.Parent != parent)
return null;
parent = node;
}
return parent;
}
public IEnumerable GetChildren(TreePath treePath) {
Node node = GetNode(treePath);
if (node != null) {
foreach (Node n in node.Nodes)
if (forceVisible || n.IsVisible)
yield return n;
} else {
yield break;
}
}
public bool IsLeaf(TreePath treePath) {
return false;
}
public bool ForceVisible {
get {
return forceVisible;
}
set {
if (value != forceVisible) {
forceVisible = value;
OnStructureChanged(root);
Stack<object> stack = new Stack<object>();
while (node != _root)
{
stack.Push(node);
node = node.Parent;
}
return new TreePath(stack.ToArray());
}
}
}
#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 Collection<Node> Nodes
{
get { return _root.Nodes; }
}
public void OnNodeChanged(Node parent, int index, Node node) {
if (NodesChanged != null && parent != null) {
TreePath path = GetPath(parent);
if (path != null)
NodesChanged(this, new TreeModelEventArgs(
path, new int[] { index }, new object[] { node }));
}
}
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 void OnStructureChanged(Node node) {
if (StructureChanged != null)
StructureChanged(this,
new TreeModelEventArgs(GetPath(node), new object[0]));
}
public IEnumerable GetChildren(TreePath treePath)
{
Node node = GetNode(treePath);
if (node != null)
{
foreach (Node n in node.Nodes)
if (_forceVisible || n.IsVisible)
yield return n;
}
else
{ }
}
public void OnNodeInserted(Node parent, int index, Node node) {
if (NodesInserted != null) {
TreeModelEventArgs args = new TreeModelEventArgs(GetPath(parent),
new int[] { index }, new object[] { node });
NodesInserted(this, args);
}
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);
}
}
public void OnNodeRemoved(Node parent, int index, Node node) {
if (NodesRemoved != null) {
TreeModelEventArgs args = new TreeModelEventArgs(GetPath(parent),
new int[] { index }, new object[] { node });
NodesRemoved(this, args);
}
}
}
}