nodemanagerwindow.cpp

来自「骨骼动画....把魔兽模型解出的代码..」· C++ 代码 · 共 1,539 行 · 第 1/3 页

CPP
1,539
字号
//+-----------------------------------------------------------------------------
//| Included files
//+-----------------------------------------------------------------------------
#include "NodeManagerWindow.h"


//+-----------------------------------------------------------------------------
//| Global objects
//+-----------------------------------------------------------------------------
NODE_MANAGER_WINDOW NodeManagerWindow;


//+-----------------------------------------------------------------------------
//| Constructor
//+-----------------------------------------------------------------------------
NODE_MANAGER_WINDOW::NODE_MANAGER_WINDOW()
{
	CurrentlySelectedNode = NULL;
}


//+-----------------------------------------------------------------------------
//| Destructor
//+-----------------------------------------------------------------------------
NODE_MANAGER_WINDOW::~NODE_MANAGER_WINDOW()
{
	//Empty
}


//+-----------------------------------------------------------------------------
//| Creates a new window
//+-----------------------------------------------------------------------------
BOOL NODE_MANAGER_WINDOW::Create()
{
	WINDOW_TREEVIEW_INFO TreeviewInfo;

	FrameInfo.Title = "Node Manager";
	FrameInfo.Width = DEFAULT_NODE_MANAGER_WINDOW_WIDTH;
	FrameInfo.Height = DEFAULT_NODE_MANAGER_WINDOW_HEIGHT;
	FrameInfo.Style &= (~WS_VISIBLE);
	FrameInfo.Style |= (WS_MAXIMIZEBOX | WS_SIZEBOX);

	if(!WINDOW_FRAME::Create()) return FALSE;

	TreeviewInfo.Parent = Window;

	if(!TreeView.Create(TreeviewInfo)) return FALSE;

	NodeIcon.AssignIconListToTreeView(TreeView.GetWindow());

	return TRUE;
}


//+-----------------------------------------------------------------------------
//| Destroys the window
//+-----------------------------------------------------------------------------
VOID NODE_MANAGER_WINDOW::Destroy()
{
	TreeView.Destroy();

	WINDOW_FRAME::Destroy();
}


//+-----------------------------------------------------------------------------
//| Handles the window messages
//+-----------------------------------------------------------------------------
LRESULT NODE_MANAGER_WINDOW::MessageHandler(UINT Message, WPARAM W, LPARAM L)
{
	switch(Message)
	{
		case WM_SIZE:
		case WM_SIZING:
		{
			ResizeTreeView();
			return 0;
		}

		case WM_CLOSE:
		{
			Hide();
			return 0;
		}

		case WM_DESTROY:
		{
			return 0;
		}
	}

	return DefWindowProc(Window, Message, W, L);
}


//+-----------------------------------------------------------------------------
//| Handles the window menu messages
//+-----------------------------------------------------------------------------
LRESULT NODE_MANAGER_WINDOW::MenuHandler(WORD MenuItem)
{
	switch(MenuItem)
	{
		case NodeFileCreateAttachment:
		case NodeFileCreateAttachment2:
		{
			if(!CreateNewAttachment())
			{
				Error.DisplayMessage(Window);
				Error.ClearMessage();
				return 0;
			}

			return 0;
		}

		case NodeFileCreateBone:
		case NodeFileCreateBone2:
		{
			if(!CreateNewBone())
			{
				Error.DisplayMessage(Window);
				Error.ClearMessage();
				return 0;
			}

			return 0;
		}

		case NodeFileCreateCollisionShape:
		case NodeFileCreateCollisionShape2:
		{
			if(!CreateNewCollisionShape())
			{
				Error.DisplayMessage(Window);
				Error.ClearMessage();
				return 0;
			}

			return 0;
		}

		case NodeFileCreateEventObject:
		case NodeFileCreateEventObject2:
		{
			if(!CreateNewEventObject())
			{
				Error.DisplayMessage(Window);
				Error.ClearMessage();
				return 0;
			}

			return 0;
		}

		case NodeFileCreateHelper:
		case NodeFileCreateHelper2:
		{
			if(!CreateNewHelper())
			{
				Error.DisplayMessage(Window);
				Error.ClearMessage();
				return 0;
			}

			return 0;
		}

		case NodeFileCreateLight:
		case NodeFileCreateLight2:
		{
			if(!CreateNewLight())
			{
				Error.DisplayMessage(Window);
				Error.ClearMessage();
				return 0;
			}

			return 0;
		}

		case NodeFileCreateParticleEmitter:
		case NodeFileCreateParticleEmitter2:
		{
			if(!CreateNewParticleEmitter())
			{
				Error.DisplayMessage(Window);
				Error.ClearMessage();
				return 0;
			}

			return 0;
		}

		case NodeFileCreateParticleEmitter2_1:
		case NodeFileCreateParticleEmitter2_2:
		{
			if(!CreateNewParticleEmitter2())
			{
				Error.DisplayMessage(Window);
				Error.ClearMessage();
				return 0;
			}

			return 0;
		}

		case NodeFileCreateRibbonEmitter:
		case NodeFileCreateRibbonEmitter2:
		{
			if(!CreateNewRibbonEmitter())
			{
				Error.DisplayMessage(Window);
				Error.ClearMessage();
				return 0;
			}

			return 0;
		}

		case NodeFileDuplicate:
		case NodeFileDuplicate2:
		{
			if(!Duplicate())
			{
				Error.DisplayMessage(Window);
				Error.ClearMessage();
				return 0;
			}

			return 0;
		}

		case NodeFileMoveUp:
		case NodeFileMoveUp2:
		{
			if(!MoveUp())
			{
				Error.DisplayMessage(Window);
				Error.ClearMessage();
				return 0;
			}

			return 0;
		}

		case NodeFileMoveDown:
		case NodeFileMoveDown2:
		{
			if(!MoveDown())
			{
				Error.DisplayMessage(Window);
				Error.ClearMessage();
				return 0;
			}

			return 0;
		}

		case NodeFileMoveLeft:
		case NodeFileMoveLeft2:
		{
			if(!MoveLeft())
			{
				Error.DisplayMessage(Window);
				Error.ClearMessage();
				return 0;
			}

			return 0;
		}

		case NodeFileMoveRight:
		case NodeFileMoveRight2:
		{
			if(!MoveRight())
			{
				Error.DisplayMessage(Window);
				Error.ClearMessage();
				return 0;
			}

			return 0;
		}

		case NodeFileEdit:
		case NodeFileEdit2:
		{
			if(!Edit())
			{
				Error.DisplayMessage(Window);
				Error.ClearMessage();
				return 0;
			}

			return 0;
		}

		case NodeFileEditNode:
		case NodeFileEditNode2:
		{
			if(!EditNode())
			{
				Error.DisplayMessage(Window);
				Error.ClearMessage();
				return 0;
			}

			return 0;
		}

		case NodeFileRemove:
		case NodeFileRemove2:
		{
			if(!Remove())
			{
				Error.DisplayMessage(Window);
				Error.ClearMessage();
				return 0;
			}

			return 0;
		}
	}

	return 0;
}


//+-----------------------------------------------------------------------------
//| Handles the window control messages
//+-----------------------------------------------------------------------------
LRESULT NODE_MANAGER_WINDOW::ControlHandler(HWND Control, WORD Code)
{
	return 0;
}


//+-----------------------------------------------------------------------------
//| Handles the window notify messages
//+-----------------------------------------------------------------------------
LRESULT NODE_MANAGER_WINDOW::NotifyHandler(HWND Control, UINT Code, NMHDR* Header)
{
	if(Control == TreeView.GetWindow())
	{
		NM_TREEVIEW* TreeViewHeader;

		TreeViewHeader = reinterpret_cast<NM_TREEVIEW*>(Header);
		if(TreeViewHeader == NULL) return 0;

		return TreeViewHandler(Code, TreeViewHeader);
	}

	return 0;
}


//+-----------------------------------------------------------------------------
//| Handles the treeview messages
//+-----------------------------------------------------------------------------
LRESULT NODE_MANAGER_WINDOW::TreeViewHandler(UINT Code, NM_TREEVIEW* TreeViewHeader)
{
	TVITEM ItemData;
	POINT MousePosition;
	POINT LocalMousePosition;
	TVHITTESTINFO HitTestInfo;

	GetCursorPos(&MousePosition);
	LocalMousePosition = MousePosition;
	ScreenToClient(TreeView.GetWindow(), &LocalMousePosition);

	switch(Code)
	{
		case NM_DBLCLK:
		{
			if(CurrentlySelectedNode == NULL) return 0;

			ZeroMemory(&HitTestInfo, sizeof(TVHITTESTINFO));
			HitTestInfo.pt = LocalMousePosition;
			if(TreeView_HitTest(TreeView.GetWindow(), &HitTestInfo) == NULL) return 0;
			if(!(HitTestInfo.flags & TVHT_ONITEM)) return 0;

			if(!Edit())
			{
				Error.DisplayMessage(Window);
				Error.ClearMessage();
				return 0;
			}

			TreeView_Expand(TreeView.GetWindow(), HitTestInfo.hItem, TVE_TOGGLE);

			return 0;
		}

		case NM_RCLICK:
		{
			INT MenuId;
			HTREEITEM TreeViewItem;

			MenuId = NodeMenu2;
			TreeViewItem = NULL;

			TreeView_SelectItem(TreeView.GetWindow(), NULL);
			CurrentlySelectedNode = NULL;

			while(TRUE)
			{
				ZeroMemory(&HitTestInfo, sizeof(TVHITTESTINFO));
				HitTestInfo.pt = LocalMousePosition;
				if(TreeView_HitTest(TreeView.GetWindow(), &HitTestInfo) == NULL) break;
				if(!(HitTestInfo.flags & TVHT_ONITEM)) break;

				TreeViewItem = HitTestInfo.hItem;
				if(TreeViewItem == NULL) break;

				ZeroMemory(&ItemData, sizeof(TVITEM));
				ItemData.mask = TVIF_PARAM;
				ItemData.hItem = TreeViewItem;
				if(!TreeView_GetItem(TreeView.GetWindow(), &ItemData)) return 0;

				TreeView_SelectItem(TreeView.GetWindow(), TreeViewItem);
				CurrentlySelectedNode = reinterpret_cast<MODEL_BASE*>(ItemData.lParam);
				if(CurrentlySelectedNode == NULL) return 0;

				MenuId = NodeMenu;
				break;
			}

			if(!TrackPopupMenuEx(GetSubMenu(LoadMenu(GetModuleHandle(NULL), MAKEINTRESOURCE(MenuId)), 0),
								 TPM_LEFTALIGN | TPM_RIGHTBUTTON, MousePosition.x, MousePosition.y,
								 Window, NULL))
			{
				Error.SetMessage("Unable to create popup menu!");
				Error.DisplayMessage(Window);
				Error.ClearMessage();
				return 0;
			}

			return 0;
		}

		case TVN_SELCHANGED:
		{
			CurrentlySelectedNode = reinterpret_cast<MODEL_BASE*>(TreeViewHeader->itemNew.lParam);
			if(CurrentlySelectedNode == NULL) return 0;

			return 0;
		}
	}

	return 0;
}


//+-----------------------------------------------------------------------------
//| Adds a node
//+-----------------------------------------------------------------------------
VOID NODE_MANAGER_WINDOW::AddNode(MODEL_BASE* Node, HTREEITEM InsertionPoint)
{
	TVINSERTSTRUCT InsertItem;
	HTREEITEM Parent;

	if(Node->ParentNode.IsAttached())
	{
		Parent = Node->ParentNode.GetObjectData()->BaseData()->TreeViewItem;
		if(Parent == NULL) Parent = TVI_ROOT;
	}
	else
	{
		Parent = TVI_ROOT;
	}

	InsertItem.hParent = Parent;
	InsertItem.hInsertAfter = InsertionPoint;

	InsertItem.item.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM;
	InsertItem.item.hItem = NULL;
	InsertItem.item.state = 0;
	InsertItem.item.stateMask = 0;
	InsertItem.item.pszText = const_cast<CHAR*>(Node->BaseData()->Name.c_str());
	InsertItem.item.cchTextMax = static_cast<INT>(Node->BaseData()->Name.size());
	InsertItem.item.iImage = NodeIcon.GetIconIndex(Node->BaseData()->Type);
	InsertItem.item.iSelectedImage = InsertItem.item.iImage;
	InsertItem.item.cChildren = 0;
	InsertItem.item.lParam = reinterpret_cast<LPARAM>(Node);

	Node->BaseData()->TreeViewItem = TreeView_InsertItem(TreeView.GetWindow(), &InsertItem);

	TreeView_SelectItem(TreeView.GetWindow(), Node->BaseData()->TreeViewItem);
	CurrentlySelectedNode = Node;
}


//+-----------------------------------------------------------------------------
//| Adds a node and all of its children (and grandchildren etc...)
//+-----------------------------------------------------------------------------
VOID NODE_MANAGER_WINDOW::AddNodeAndChildren(MODEL_BASE* Node, HTREEITEM InsertionPoint)
{
	REFERENCE<MODEL_BASE*, MODEL_BASE*>* CurrentReference;

	AddNode(Node, InsertionPoint);

	CurrentReference = Node->ChildNodes.GetFirstReference();
	while(CurrentReference != NULL)
	{
		AddNodeAndChildren(CurrentReference->GetData(), TVI_LAST);
		CurrentReference = Node->ChildNodes.GetNextReference(CurrentReference);
	}
}


//+-----------------------------------------------------------------------------
//| Removes a node

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?