Skip to content

Commit 4b7b6e9

Browse files
committedNov 1, 2020
Open/Close folder icon in test application.
1 parent ab7e591 commit 4b7b6e9

8 files changed

+74
-52
lines changed
 
-20 Bytes
Loading

‎Sources/NodeUIEngine/NUIE_NodeTree.cpp

+1-20
Original file line numberDiff line numberDiff line change
@@ -36,15 +36,7 @@ const CreatorFunction& NodeTree::Item::GetCreator () const
3636
}
3737

3838
NodeTree::Group::Group (const std::wstring& name) :
39-
name (name),
40-
iconId (InvalidIconId)
41-
{
42-
43-
}
44-
45-
NodeTree::Group::Group (const std::wstring& name, const IconId& iconId) :
46-
name (name),
47-
iconId (iconId)
39+
name (name)
4840
{
4941

5042
}
@@ -59,11 +51,6 @@ const std::wstring& NodeTree::Group::GetName () const
5951
return name;
6052
}
6153

62-
const NUIE::IconId& NodeTree::Group::GetIconId () const
63-
{
64-
return iconId;
65-
}
66-
6754
const std::vector<NodeTree::Item>& NodeTree::Group::GetItems () const
6855
{
6956
return items;
@@ -80,12 +67,6 @@ size_t NodeTree::AddGroup (const std::wstring& groupName)
8067
return groups.size () - 1;
8168
}
8269

83-
size_t NodeTree::AddGroup (const std::wstring& groupName, const IconId& iconId)
84-
{
85-
groups.push_back (Group (groupName, iconId));
86-
return groups.size () - 1;
87-
}
88-
8970
void NodeTree::AddItem (size_t groupIndex, const std::wstring& itemName, const CreatorFunction& creator)
9071
{
9172
groups[groupIndex].AddItem (Item (itemName, creator));

‎Sources/NodeUIEngine/NUIE_NodeTree.hpp

-3
Original file line numberDiff line numberDiff line change
@@ -38,19 +38,16 @@ class NodeTree
3838
void AddItem (const Item& item);
3939

4040
const std::wstring& GetName () const;
41-
const IconId& GetIconId () const;
4241
const std::vector<Item>& GetItems () const;
4342

4443
private:
4544
std::wstring name;
46-
IconId iconId;
4745
std::vector<Item> items;
4846
};
4947

5048
NodeTree ();
5149

5250
size_t AddGroup (const std::wstring& groupName);
53-
size_t AddGroup (const std::wstring& groupName, const IconId& iconId);
5451
void AddItem (size_t groupIndex, const std::wstring& itemName, const CreatorFunction& creator);
5552
void AddItem (size_t groupIndex, const std::wstring& itemName, const IconId& iconId, const CreatorFunction& creator);
5653

‎Sources/WindowsAppSupport/WAS_NodeEditorNodeTreeHwndControl.cpp

+16-3
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ static LRESULT CALLBACK NodeEditorNodeListStaticWindowProc (HWND hwnd, UINT msg,
4242
case TVN_SELCHANGED:
4343
control->TreeViewSelectionChanged ((LPNMTREEVIEW) lParam);
4444
break;
45+
case TVN_ITEMEXPANDED:
46+
control->TreeViewItemExpanded ((LPNMTREEVIEW) lParam);
4547
case NM_DBLCLK:
4648
control->TreeViewDoubleClick (header);
4749
break;
@@ -165,15 +167,26 @@ void NodeEditorNodeTreeHwndControl::TreeViewSelectionChanged (LPNMTREEVIEW lpnmt
165167
selectedNode = lpnmtv->itemNew.lParam;
166168
}
167169

170+
void NodeEditorNodeTreeHwndControl::TreeViewItemExpanded (LPNMTREEVIEW lpnmtv)
171+
{
172+
if (lpnmtv->hdr.hwndFrom != nodeTreeView.GetListHandle ()) {
173+
return;
174+
}
175+
176+
nodeTreeView.GroupExpanded (lpnmtv->itemNew);
177+
}
178+
168179
void NodeEditorNodeTreeHwndControl::FillNodeTree (const NUIE::NodeTree& nodeTree, ImageLoader* imageLoader)
169180
{
170181
if (imageLoader != nullptr) {
171-
nodeTreeView.InitImageList ();
182+
nodeTreeView.InitImageList (
183+
imageLoader->LoadGroupClosedImage (),
184+
imageLoader->LoadGroupOpenedImage ()
185+
);
172186
}
173187
LPARAM nextNodeId = 0;
174188
for (const NUIE::NodeTree::Group& group : nodeTree.GetGroups ()) {
175-
HBITMAP groupIcon = LoadTreeImage (imageLoader, group.GetIconId ());
176-
nodeTreeView.AddGroup (group.GetName (), groupIcon);
189+
nodeTreeView.AddGroup (group.GetName ());
177190
for (const NUIE::NodeTree::Item& item : group.GetItems ()) {
178191
HBITMAP itemIcon = LoadTreeImage (imageLoader, item.GetIconId ());
179192
nodeTreeView.AddItem (group.GetName (), item.GetName (), itemIcon, nextNodeId);

‎Sources/WindowsAppSupport/WAS_NodeEditorNodeTreeHwndControl.hpp

+3
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ class NodeEditorNodeTreeHwndControl : public NUIE::NativeNodeEditorControl
1818
ImageLoader ();
1919
virtual ~ImageLoader ();
2020

21+
virtual HBITMAP LoadGroupClosedImage () = 0;
22+
virtual HBITMAP LoadGroupOpenedImage () = 0;
2123
virtual HBITMAP LoadImage (const NUIE::IconId& iconId) = 0;
2224
};
2325

@@ -38,6 +40,7 @@ class NodeEditorNodeTreeHwndControl : public NUIE::NativeNodeEditorControl
3840
void FillNodeTree (const NUIE::NodeTree& nodeTree, ImageLoader* imageLoader);
3941
void TreeViewDoubleClick (LPNMHDR lpnmhdr);
4042
void TreeViewSelectionChanged (LPNMTREEVIEW lpnmtv);
43+
void TreeViewItemExpanded (LPNMTREEVIEW lpnmtv);
4144
void TreeViewBeginDrag (LPNMTREEVIEW lpnmtv);
4245
void TreeViewEndDrag (int x, int y);
4346

‎Sources/WindowsAppSupport/WAS_NodeTree.cpp

+35-20
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,10 @@ namespace WAS
77
{
88

99
NodeTreeView::NodeTreeView () :
10-
listHandle (NULL),
10+
treeHandle (NULL),
1111
imageList (NULL),
12+
groupClosedBitmap (-1),
13+
groupOpenedBitmap (-1),
1214
groups ()
1315
{
1416

@@ -23,43 +25,46 @@ NodeTreeView::~NodeTreeView ()
2325

2426
bool NodeTreeView::Init (HWND parentHandle, int x, int y, int width, int height)
2527
{
26-
listHandle = CreateWindowEx (
28+
treeHandle = CreateWindowEx (
2729
0, WC_TREEVIEW, NULL, WS_VISIBLE | WS_CHILD | TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | TVS_SHOWSELALWAYS,
2830
x, y, width, height, parentHandle, NULL, NULL, NULL
2931
);
30-
if (DBGERROR (listHandle == NULL)) {
32+
if (DBGERROR (treeHandle == NULL)) {
3133
return false;
3234
}
35+
TreeView_SetItemHeight (treeHandle, 20);
3336
return true;
3437
}
3538

36-
bool NodeTreeView::InitImageList ()
39+
bool NodeTreeView::InitImageList (HBITMAP closedBitmap, HBITMAP openedBitmap)
3740
{
3841
if (DBGERROR (imageList != NULL)) {
3942
return false;
4043
}
41-
imageList = ImageList_Create (18, 18, ILC_COLOR32, 1, 1);
44+
imageList = ImageList_Create (18, 18, ILC_COLOR32, 2, 1);
4245
if (DBGERROR (imageList == NULL)) {
4346
return false;
4447
}
45-
TreeView_SetImageList (listHandle, imageList, TVSIL_NORMAL);
48+
groupClosedBitmap = ImageList_Add (imageList, closedBitmap, NULL);
49+
groupOpenedBitmap = ImageList_Add (imageList, openedBitmap, NULL);
50+
TreeView_SetImageList (treeHandle, imageList, TVSIL_NORMAL);
4651
return true;
4752
}
4853

4954
void NodeTreeView::Resize (int x, int y, int width, int height)
5055
{
51-
if (listHandle == NULL) {
56+
if (treeHandle == NULL) {
5257
return;
5358
}
54-
MoveWindow (listHandle, x, y, width, height, TRUE);
59+
MoveWindow (treeHandle, x, y, width, height, TRUE);
5560
}
5661

5762
bool NodeTreeView::HasGroup (const std::wstring& group) const
5863
{
5964
return groups.find (group) != groups.end ();
6065
}
6166

62-
void NodeTreeView::AddGroup (const std::wstring& group, HBITMAP bitmap)
67+
void NodeTreeView::AddGroup (const std::wstring& group)
6368
{
6469
auto found = groups.find (group);
6570
if (DBGERROR (found != groups.end ())) {
@@ -75,15 +80,13 @@ void NodeTreeView::AddGroup (const std::wstring& group, HBITMAP bitmap)
7580
tvInsertStruct.item.cchTextMax = sizeof (tvInsertStruct.item.pszText) / sizeof (wchar_t);
7681
tvInsertStruct.item.lParam = (LPARAM) -1;
7782

78-
if (imageList != NULL && bitmap != NULL) {
79-
int imageIndex = ImageList_GetImageCount (imageList);
80-
ImageList_Add (imageList, bitmap, NULL);
83+
if (imageList != NULL) {
8184
tvInsertStruct.item.mask |= TVIF_IMAGE | TVIF_SELECTEDIMAGE;
82-
tvInsertStruct.item.iImage = imageIndex;
83-
tvInsertStruct.item.iSelectedImage = imageIndex;
85+
tvInsertStruct.item.iImage = groupClosedBitmap;
86+
tvInsertStruct.item.iSelectedImage = groupClosedBitmap;
8487
}
8588

86-
HTREEITEM groupItem = (HTREEITEM) SendMessage (listHandle, TVM_INSERTITEM, 0, (LPARAM) &tvInsertStruct);
89+
HTREEITEM groupItem = (HTREEITEM) SendMessage (treeHandle, TVM_INSERTITEM, 0, (LPARAM) &tvInsertStruct);
8790
groups.insert ({ group, groupItem });
8891
}
8992

@@ -104,26 +107,38 @@ void NodeTreeView::AddItem (const std::wstring& group, const std::wstring& text,
104107
tvInsertStruct.item.lParam = lParam;
105108

106109
if (imageList != NULL && bitmap != NULL) {
107-
int imageIndex = ImageList_GetImageCount (imageList);
108-
ImageList_Add (imageList, bitmap, NULL);
110+
int imageIndex = ImageList_Add (imageList, bitmap, NULL);
109111
tvInsertStruct.item.mask |= TVIF_IMAGE | TVIF_SELECTEDIMAGE;
110112
tvInsertStruct.item.iImage = imageIndex;
111113
tvInsertStruct.item.iSelectedImage = imageIndex;
112114
}
113115

114-
SendMessage (listHandle, TVM_INSERTITEM, 0, (LPARAM) &tvInsertStruct);
116+
SendMessage (treeHandle, TVM_INSERTITEM, 0, (LPARAM) &tvInsertStruct);
117+
}
118+
119+
void NodeTreeView::GroupExpanded (const TVITEMW& group)
120+
{
121+
TVITEM newGroup = group;
122+
if (group.state & TVIS_EXPANDED) {
123+
newGroup.iImage = groupOpenedBitmap;
124+
newGroup.iSelectedImage = groupOpenedBitmap;
125+
} else {
126+
newGroup.iImage = groupClosedBitmap;
127+
newGroup.iSelectedImage = groupClosedBitmap;
128+
}
129+
TreeView_SetItem (treeHandle, &newGroup);
115130
}
116131

117132
void NodeTreeView::ExpandAll ()
118133
{
119134
for (const auto& it : groups) {
120-
TreeView_Expand (listHandle, it.second, TVM_EXPAND);
135+
TreeView_Expand (treeHandle, it.second, TVM_EXPAND);
121136
}
122137
}
123138

124139
HWND NodeTreeView::GetListHandle ()
125140
{
126-
return listHandle;
141+
return treeHandle;
127142
}
128143

129144
}

‎Sources/WindowsAppSupport/WAS_NodeTree.hpp

+6-3
Original file line numberDiff line numberDiff line change
@@ -14,19 +14,22 @@ class NodeTreeView
1414
~NodeTreeView ();
1515

1616
bool Init (HWND parentHandle, int x, int y, int width, int height);
17-
bool InitImageList ();
17+
bool InitImageList (HBITMAP closedBitmap, HBITMAP openedBitmap);
1818
void Resize (int x, int y, int width, int height);
1919

2020
bool HasGroup (const std::wstring& group) const;
21-
void AddGroup (const std::wstring& group, HBITMAP bitmap);
21+
void AddGroup (const std::wstring& group);
2222
void AddItem (const std::wstring& group, const std::wstring& text, HBITMAP bitmap, LPARAM lParam);
23+
void GroupExpanded (const TVITEMW& group);
2324
void ExpandAll ();
2425

2526
HWND GetListHandle ();
2627

2728
private:
28-
HWND listHandle;
29+
HWND treeHandle;
2930
HIMAGELIST imageList;
31+
int groupClosedBitmap;
32+
int groupOpenedBitmap;
3033
std::unordered_map<std::wstring, HTREEITEM> groups;
3134
};
3235

‎Sources/WindowsEmbeddingDemo/main.cpp

+13-3
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,16 @@ class AppUIEnvironment : public NUIE::NodeUIEnvironment
123123
class ImageLoader : public WAS::NodeEditorNodeTreeHwndControl::ImageLoader
124124
{
125125
public:
126+
virtual HBITMAP LoadGroupClosedImage () override
127+
{
128+
return WAS::LoadBitmapFromResource (MAKEINTRESOURCE (FOLDERCLOSED_ICON), L"IMAGE");
129+
}
130+
131+
virtual HBITMAP LoadGroupOpenedImage () override
132+
{
133+
return WAS::LoadBitmapFromResource (MAKEINTRESOURCE (FOLDEROPENED_ICON), L"IMAGE");
134+
}
135+
126136
virtual HBITMAP LoadImage (const NUIE::IconId& iconId) override
127137
{
128138
return WAS::LoadBitmapFromResource (MAKEINTRESOURCE (iconId.GetId ()), L"IMAGE");
@@ -131,7 +141,7 @@ class AppUIEnvironment : public NUIE::NodeUIEnvironment
131141

132142
NUIE::NodeTree nodeTree;
133143

134-
size_t inputNodes = nodeTree.AddGroup (L"Input Nodes", NUIE::IconId (FOLDEROPENED_ICON));
144+
size_t inputNodes = nodeTree.AddGroup (L"Input Nodes");
135145
AddNodeTreeItem (nodeTree, inputNodes, L"Boolean", NUIE::IconId (TREE_BOOLEAN_ICON), [&] (const NUIE::Point& position) {
136146
return NUIE::UINodePtr (new BI::BooleanNode (NE::LocString (L"Boolean"), position, true));
137147
});
@@ -150,7 +160,7 @@ class AppUIEnvironment : public NUIE::NodeUIEnvironment
150160
AddNodeTreeItem (nodeTree, inputNodes, L"Number Distribution", NUIE::IconId (TREE_DOUBLEDISTRIBUTED_ICON), [&] (const NUIE::Point& position) {
151161
return NUIE::UINodePtr (new BI::DoubleDistributedNode (NE::LocString (L"Number Distribution"), position));
152162
});
153-
size_t mathematicalNodes = nodeTree.AddGroup (L"Mathematical Nodes", NUIE::IconId (FOLDEROPENED_ICON));
163+
size_t mathematicalNodes = nodeTree.AddGroup (L"Mathematical Nodes");
154164
AddNodeTreeItem (nodeTree, mathematicalNodes, L"Addition", NUIE::IconId (TREE_ADDITION_ICON), [&] (const NUIE::Point& position) {
155165
return NUIE::UINodePtr (new BI::AdditionNode (NE::LocString (L"Addition"), position));
156166
});
@@ -178,7 +188,7 @@ class AppUIEnvironment : public NUIE::NodeUIEnvironment
178188
AddNodeTreeItem (nodeTree, mathematicalNodes, L"Sqrt", NUIE::IconId (TREE_SQRT_ICON), [&] (const NUIE::Point& position) {
179189
return NUIE::UINodePtr (new BI::SqrtNode (NE::LocString (L"Sqrt"), position));
180190
});
181-
size_t otherNodes = nodeTree.AddGroup (L"Other Nodes", NUIE::IconId (FOLDEROPENED_ICON));
191+
size_t otherNodes = nodeTree.AddGroup (L"Other Nodes");
182192
AddNodeTreeItem (nodeTree, otherNodes, L"List Builder", NUIE::IconId (TREE_LISTBUILDER_ICON), [&] (const NUIE::Point& position) {
183193
return NUIE::UINodePtr (new BI::ListBuilderNode (NE::LocString (L"List Builder"), position));
184194
});

0 commit comments

Comments
 (0)
Please sign in to comment.