Skip to content

Commit 87c6f02

Browse files
committed
Added code to persist and restore the expanded state of the tree view (hardware and type nodes).
1 parent bcb3186 commit 87c6f02

8 files changed

Lines changed: 161 additions & 71 deletions

File tree

External/Aga.Controls.dll

-4.5 KB
Binary file not shown.

External/Aga.Controls/Aga.Controls.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@
9191
<Compile Include="TimeCounter.cs" />
9292
<Compile Include="Tree\Input\ReorderColumnState.cs" />
9393
<Compile Include="Tree\ListModel.cs" />
94+
<Compile Include="Tree\MemberAdapter.cs" />
9495
<Compile Include="Tree\NodeControls\EditEventArgs.cs" />
9596
<Compile Include="Tree\NodeControls\LabelEventArgs.cs" />
9697
<Compile Include="Tree\NodeControls\NodeIntegerTextBox.cs">
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Reflection;
4+
using System.Text;
5+
6+
namespace Aga.Controls.Tree {
7+
internal struct MemberAdapter
8+
{
9+
private object _obj;
10+
private PropertyInfo _pi;
11+
private FieldInfo _fi;
12+
13+
public static readonly MemberAdapter Empty = new MemberAdapter();
14+
15+
public Type MemberType
16+
{
17+
get
18+
{
19+
if (_pi != null)
20+
return _pi.PropertyType;
21+
else if (_fi != null)
22+
return _fi.FieldType;
23+
else
24+
return null;
25+
}
26+
}
27+
28+
public object Value
29+
{
30+
get
31+
{
32+
if (_pi != null && _pi.CanRead)
33+
return _pi.GetValue(_obj, null);
34+
else if (_fi != null)
35+
return _fi.GetValue(_obj);
36+
else
37+
return null;
38+
}
39+
set
40+
{
41+
if (_pi != null && _pi.CanWrite)
42+
_pi.SetValue(_obj, value, null);
43+
else if (_fi != null)
44+
_fi.SetValue(_obj, value);
45+
}
46+
}
47+
48+
public MemberAdapter(object obj, PropertyInfo pi)
49+
{
50+
_obj = obj;
51+
_pi = pi;
52+
_fi = null;
53+
}
54+
55+
public MemberAdapter(object obj, FieldInfo fi)
56+
{
57+
_obj = obj;
58+
_fi = fi;
59+
_pi = null;
60+
}
61+
}
62+
}

External/Aga.Controls/Tree/NodeControls/BindableControl.cs

Lines changed: 2 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -6,64 +6,10 @@
66

77
namespace Aga.Controls.Tree.NodeControls
88
{
9+
910
public abstract class BindableControl : NodeControl
1011
{
11-
private struct MemberAdapter
12-
{
13-
private object _obj;
14-
private PropertyInfo _pi;
15-
private FieldInfo _fi;
16-
17-
public static readonly MemberAdapter Empty = new MemberAdapter();
18-
19-
public Type MemberType
20-
{
21-
get
22-
{
23-
if (_pi != null)
24-
return _pi.PropertyType;
25-
else if (_fi != null)
26-
return _fi.FieldType;
27-
else
28-
return null;
29-
}
30-
}
31-
32-
public object Value
33-
{
34-
get
35-
{
36-
if (_pi != null && _pi.CanRead)
37-
return _pi.GetValue(_obj, null);
38-
else if (_fi != null)
39-
return _fi.GetValue(_obj);
40-
else
41-
return null;
42-
}
43-
set
44-
{
45-
if (_pi != null && _pi.CanWrite)
46-
_pi.SetValue(_obj, value, null);
47-
else if (_fi != null)
48-
_fi.SetValue(_obj, value);
49-
}
50-
}
51-
52-
public MemberAdapter(object obj, PropertyInfo pi)
53-
{
54-
_obj = obj;
55-
_pi = pi;
56-
_fi = null;
57-
}
58-
59-
public MemberAdapter(object obj, FieldInfo fi)
60-
{
61-
_obj = obj;
62-
_fi = fi;
63-
_pi = null;
64-
}
65-
}
66-
12+
6713
#region Properties
6814

6915
private bool _virtualMode = false;

External/Aga.Controls/Tree/TreeNodeAdv.cs

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System;
22
using System.Collections.Generic;
33
using System.Collections.ObjectModel;
4+
using System.Reflection;
45
using System.Runtime.Serialization;
56
using System.Security.Permissions;
67

@@ -205,7 +206,12 @@ public bool IsExpanded
205206

206207
internal void AssignIsExpanded(bool value)
207208
{
208-
_isExpanded = value;
209+
if (_isExpanded != value)
210+
{
211+
_isExpanded = value;
212+
var ma = GetMemberAdapter("IsExpanded");
213+
ma.Value = value;
214+
}
209215
}
210216

211217
private TreeNodeAdv _parent;
@@ -336,7 +342,7 @@ internal bool IsExpandingNow
336342
set { _isExpandingNow = value; }
337343
}
338344

339-
private bool _autoExpandOnStructureChanged = true;
345+
private bool _autoExpandOnStructureChanged = false;
340346
public bool AutoExpandOnStructureChanged
341347
{
342348
get { return _autoExpandOnStructureChanged; }
@@ -357,6 +363,12 @@ internal TreeNodeAdv(TreeViewAdv tree, object tag)
357363
_nodes = new NodeCollection(this);
358364
_children = new ReadOnlyCollection<TreeNodeAdv>(_nodes);
359365
_tag = tag;
366+
367+
var value = GetMemberAdapter("IsExpanded").Value;
368+
if (value != null && value is bool)
369+
{
370+
_isExpanded = (bool)value;
371+
}
360372
}
361373

362374
public override string ToString()
@@ -402,11 +414,29 @@ public void Expand(bool ignoreChildren)
402414
private void SetIsExpanded(bool value, bool ignoreChildren)
403415
{
404416
if (Tree == null)
405-
_isExpanded = value;
417+
AssignIsExpanded(value);
406418
else
407419
Tree.SetIsExpanded(this, value, ignoreChildren);
408420
}
409421

422+
private MemberAdapter GetMemberAdapter(string propertyName)
423+
{
424+
if (this.Tag != null && !string.IsNullOrEmpty(propertyName))
425+
{
426+
Type type = this.Tag.GetType();
427+
PropertyInfo pi = type.GetProperty(propertyName);
428+
if (pi != null)
429+
return new MemberAdapter(this.Tag, pi);
430+
else
431+
{
432+
FieldInfo fi = type.GetField(propertyName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
433+
if (fi != null)
434+
return new MemberAdapter(this.Tag, fi);
435+
}
436+
}
437+
return MemberAdapter.Empty;
438+
}
439+
410440
#region ISerializable Members
411441

412442
private TreeNodeAdv(SerializationInfo info, StreamingContext context)

GUI/HardwareNode.cs

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,21 @@ This Source Code Form is subject to the terms of the Mozilla Public
44
License, v. 2.0. If a copy of the MPL was not distributed with this
55
file, You can obtain one at http://mozilla.org/MPL/2.0/.
66
7-
Copyright (C) 2009-2012 Michael Möller <mmoeller@openhardwaremonitor.org>
7+
Copyright (C) 2009-2020 Michael Möller <mmoeller@openhardwaremonitor.org>
88
99
*/
1010

1111
using System;
1212
using System.Collections.Generic;
13-
using System.Drawing;
1413
using OpenHardwareMonitor.Hardware;
1514

1615
namespace OpenHardwareMonitor.GUI {
1716
public class HardwareNode : Node {
1817

19-
private PersistentSettings settings;
20-
private UnitManager unitManager;
21-
private IHardware hardware;
18+
private readonly PersistentSettings settings;
19+
private readonly UnitManager unitManager;
20+
private readonly IHardware hardware;
21+
private readonly Identifier expandedIdentifier;
2222

2323
private List<TypeNode> typeNodes = new List<TypeNode>();
2424

@@ -31,13 +31,17 @@ public HardwareNode(IHardware hardware, PersistentSettings settings,
3131
this.Image = HardwareTypeImage.Instance.GetImage(hardware.HardwareType);
3232

3333
foreach (SensorType sensorType in Enum.GetValues(typeof(SensorType)))
34-
typeNodes.Add(new TypeNode(sensorType));
34+
typeNodes.Add(new TypeNode(sensorType, hardware, settings));
3535

3636
foreach (ISensor sensor in hardware.Sensors)
3737
SensorAdded(sensor);
3838

3939
hardware.SensorAdded +=new SensorEventHandler(SensorAdded);
4040
hardware.SensorRemoved += new SensorEventHandler(SensorRemoved);
41+
42+
this.expandedIdentifier = new Identifier(hardware.Identifier, "expanded");
43+
base.IsExpanded =
44+
settings.GetValue(expandedIdentifier.ToString(), base.IsExpanded);
4145
}
4246

4347
public override string Text {
@@ -49,6 +53,18 @@ public IHardware Hardware {
4953
get { return hardware; }
5054
}
5155

56+
public override bool IsExpanded {
57+
get {
58+
return base.IsExpanded;
59+
}
60+
set {
61+
if (base.IsExpanded != value) {
62+
base.IsExpanded = value;
63+
settings.SetValue(expandedIdentifier.ToString(), value);
64+
}
65+
}
66+
}
67+
5268
private void UpdateNode(TypeNode node) {
5369
if (node.Nodes.Count > 0) {
5470
if (!Nodes.Contains(node)) {

GUI/Node.cs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ This Source Code Form is subject to the terms of the Mozilla Public
44
License, v. 2.0. If a copy of the MPL was not distributed with this
55
file, You can obtain one at http://mozilla.org/MPL/2.0/.
66
7-
Copyright (C) 2009-2010 Michael Möller <mmoeller@openhardwaremonitor.org>
7+
Copyright (C) 2009-2020 Michael Möller <mmoeller@openhardwaremonitor.org>
88
99
*/
1010

@@ -25,6 +25,7 @@ public class Node {
2525
private string text;
2626
private Image image;
2727
private bool visible;
28+
private bool expanded;
2829

2930
private TreeModel RootTreeModel() {
3031
Node node = this;
@@ -42,6 +43,7 @@ public Node(string text) {
4243
this.text = text;
4344
this.nodes = new NodeCollection(this);
4445
this.visible = true;
46+
this.expanded = true;
4547
}
4648

4749
public TreeModel Model {
@@ -83,6 +85,17 @@ public Image Image {
8385
}
8486
}
8587

88+
public virtual bool IsExpanded {
89+
get {
90+
return expanded;
91+
}
92+
set {
93+
if (value != expanded) {
94+
expanded = value;
95+
}
96+
}
97+
}
98+
8699
public virtual bool IsVisible {
87100
get { return visible; }
88101
set {

GUI/TypeNode.cs

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,26 @@ This Source Code Form is subject to the terms of the Mozilla Public
44
License, v. 2.0. If a copy of the MPL was not distributed with this
55
file, You can obtain one at http://mozilla.org/MPL/2.0/.
66
7-
Copyright (C) 2009-2012 Michael Möller <mmoeller@openhardwaremonitor.org>
7+
Copyright (C) 2009-2020 Michael Möller <mmoeller@openhardwaremonitor.org>
88
99
*/
1010

11-
using System;
12-
using System.Collections.Generic;
1311
using OpenHardwareMonitor.Hardware;
1412

1513
namespace OpenHardwareMonitor.GUI {
1614
public class TypeNode : Node {
1715

18-
private SensorType sensorType;
16+
private readonly PersistentSettings settings;
17+
private readonly SensorType sensorType;
18+
private readonly IHardware hardware;
19+
private readonly Identifier expandedIdentifier;
1920

20-
public TypeNode(SensorType sensorType) : base() {
21+
public TypeNode(SensorType sensorType, IHardware hardware,
22+
PersistentSettings settings) : base()
23+
{
24+
this.settings = settings;
2125
this.sensorType = sensorType;
26+
this.hardware = hardware;
2227

2328
switch (sensorType) {
2429
case SensorType.Voltage:
@@ -77,6 +82,11 @@ public TypeNode(SensorType sensorType) : base() {
7782

7883
NodeAdded += new NodeEventHandler(TypeNode_NodeAdded);
7984
NodeRemoved += new NodeEventHandler(TypeNode_NodeRemoved);
85+
86+
this.expandedIdentifier = new Identifier(new Identifier(hardware.Identifier,
87+
sensorType.ToString().ToLowerInvariant()), "expanded");
88+
base.IsExpanded =
89+
settings.GetValue(expandedIdentifier.ToString(), base.IsExpanded);
8090
}
8191

8292
private void TypeNode_NodeRemoved(Node node) {
@@ -101,5 +111,17 @@ private void node_IsVisibleChanged(Node node) {
101111
public SensorType SensorType {
102112
get { return sensorType; }
103113
}
114+
115+
public override bool IsExpanded {
116+
get {
117+
return base.IsExpanded;
118+
}
119+
set {
120+
if (base.IsExpanded != value) {
121+
base.IsExpanded = value;
122+
settings.SetValue(expandedIdentifier.ToString(), value);
123+
}
124+
}
125+
}
104126
}
105127
}

0 commit comments

Comments
 (0)