groupdlg.cpp
来自「quake3工具源码。包括生成bsp文件」· C++ 代码 · 共 635 行 · 第 1/2 页
CPP
635 行
Group_RemoveListFromWorld();
int nCount = pArray->GetSize();
for (int i = 0; i < nCount; i++)
{
sprintf(cBuff, GROUPNAME, i);
SetKeyValue(world_entity, cBuff, pArray->GetAt(i));
}
}
*/
int CountChar(const char *p, char c)
{
int nCount = 0;
int nLen = strlen(p)-1;
while (nLen-- >= 0)
{
if (p[nLen] == c)
{
nCount++;
}
}
return nCount;
}
/*
// this is not very efficient but should get the job done
// as our trees should never be too big
void Group_BuildTree(CTreeCtrl *pTree)
{
if (!g_qeglobals.m_bBrushPrimitMode)
{
return;
}
CStringArray array;
int i;
CString strTemp;
CString strRight;
//++timo WARNING: this is very dangerous! delete all tree items, without checking the brushes
pTree->DeleteAllItems();
TVINSERTSTRUCT tvInsert;
memset(&tvInsert, 0, sizeof(TVINSERTSTRUCT));
tvInsert.hParent = NULL;
tvInsert.hInsertAfter = NULL;
tvInsert.item.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE;
tvInsert.item.pszText = _T("World");
tvInsert.item.iImage = IMG_GROUP;
tvInsert.item.iSelectedImage = IMG_GROUP;
HTREEITEM hWorld = pTree->InsertItem(&tvInsert);
Group_GetListFromWorld(&array);
// groups use @ to delimit levels, the number of @ signs
// start with ROOT item
// nothing is a peer with world, it is ancestor to everything
// expects things in order so first entry should be a 2nd level item
HTREEITEM itemParent = pTree->GetRootItem();
HTREEITEM itemLast = itemParent;
int nCount = array.GetSize();
int nLastLevel = 1;
for (i = 0; i < nCount; i++)
{
strTemp = array.GetAt(i);
int nLevel = CountChar(strTemp, GROUP_DELIMETER);
if (nLevel < nLastLevel)
{
int nLevelsUp = nLastLevel - nLevel;
while (nLevelsUp-- > 0)
{
itemParent = pTree->GetParentItem(itemParent);
}
}
else if (nLevel > nLastLevel)
{
itemParent = itemLast;
}
nLastLevel = nLevel;
char *pLast = strrchr(strTemp, GROUP_DELIMETER);
pLast++;
itemLast = pTree->InsertItem(pLast, itemParent);
}
}
*/
void DecomposeSiblingList(const char *p, CStringArray *pArray, CTreeCtrl *pTree, HTREEITEM itemChild)
{
CString str = p;
str += GROUP_DELIMETER;
while (itemChild)
{
CString strAdd = str;
strAdd += pTree->GetItemText(itemChild);
// do not want to add brushes or things, just groups
if (pTree->GetItemData(itemChild) == 0)
{
pArray->Add(strAdd);
}
if (pTree->ItemHasChildren(itemChild))
{
HTREEITEM itemOffspring = pTree->GetChildItem(itemChild);
DecomposeSiblingList(strAdd, pArray, pTree, itemOffspring);
}
itemChild = pTree->GetNextSiblingItem(itemChild);
}
}
/*
void Group_DecomposeTree(CTreeCtrl *pTree)
{
if (!g_qeglobals.m_bBrushPrimitMode)
{
return;
}
CStringArray array;
HTREEITEM itemParent = pTree->GetRootItem();
if (pTree->ItemHasChildren(itemParent))
{
HTREEITEM itemChild = pTree->GetChildItem(itemParent);
DecomposeSiblingList(pTree->GetItemText(itemParent), &array, pTree, itemChild);
}
Group_SetListToWorld(&array);
}
*/
/////////////////////////////////////////////////////////////////////////////
// CGroupDlg dialog
CGroupDlg::CGroupDlg(CWnd* pParent /*=NULL*/)
: CDialog(CGroupDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CGroupDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}
void CGroupDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CGroupDlg)
DDX_Control(pDX, IDC_TREE_GROUP, m_wndTree);
DDX_Control(pDX, IDC_BTN_EDIT, m_wndEdit);
DDX_Control(pDX, IDC_BTN_DEL, m_wndDel);
DDX_Control(pDX, IDC_BTN_ADD, m_wndAdd);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CGroupDlg, CDialog)
//{{AFX_MSG_MAP(CGroupDlg)
ON_WM_SIZE()
ON_BN_CLICKED(IDC_BTN_ADD, OnBtnAdd)
ON_BN_CLICKED(IDC_BTN_DEL, OnBtnDel)
ON_BN_CLICKED(IDC_BTN_EDIT, OnBtnEdit)
ON_NOTIFY(NM_RCLICK, IDC_TREE_GROUP, OnRclickTreeGroup)
ON_NOTIFY(TVN_ENDLABELEDIT, IDC_TREE_GROUP, OnEndlabeleditTreeGroup)
ON_NOTIFY(NM_CLICK, IDC_TREE_GROUP, OnClickTreeGroup)
ON_NOTIFY(TVN_SETDISPINFO, IDC_TREE_GROUP, OnSetdispinfoTreeGroup)
ON_NOTIFY(TVN_BEGINDRAG, IDC_TREE_GROUP, OnBegindragTreeGroup)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CGroupDlg message handlers
void CGroupDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
CRect rct;
GetClientRect(rct);
if ( m_wndAdd.GetSafeHwnd())
{
//all borders at 4, spacing at 6
CRect rctButton;
m_wndAdd.GetWindowRect(rctButton);
int nWidth = rctButton.Width();
int nHeight = rctButton.Height();
int nTop = rct.Height() - nHeight - 4;
m_wndAdd.SetWindowPos(NULL, 4, nTop, 0, 0, SWP_NOSIZE);
m_wndEdit.SetWindowPos(NULL, 8 + nWidth , nTop, 0, 0, SWP_NOSIZE);
m_wndDel.SetWindowPos(NULL, 12 + (nWidth * 2), nTop, 0, 0, SWP_NOSIZE);
rct.bottom = nTop;
m_wndTree.SetWindowPos(NULL, rct.left + 4, rct.top + 4, rct.Width() - 8, rct.Height() - 8, SWP_SHOWWINDOW);
}
}
BOOL CGroupDlg::OnInitDialog()
{
CDialog::OnInitDialog();
m_imgList.Create(IDB_BITMAP_GROUPS, 16, 0, ILC_COLOR);
m_wndTree.SetImageList(&m_imgList, TVSIL_NORMAL);
InitGroups();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CGroupDlg::InitGroups()
{
Group_Init();
}
// add a new group, put all selected brushes into the group
void CGroupDlg::OnBtnAdd()
{
CNameDlg dlg("New Group", this);
if (dlg.DoModal() == IDOK)
{
// create a new group node
HTREEITEM hItem = m_wndTree.GetSelectedItem();
TVINSERTSTRUCT tvInsert;
memset(&tvInsert, 0, sizeof(TVINSERTSTRUCT));
tvInsert.item.iImage = IMG_GROUP;
tvInsert.item.iSelectedImage = tvInsert.item.iImage;
//++timo wasat?
// tvInsert.hParent = (hItem) ? hItem : m_hWorld;
tvInsert.hParent = m_hWorld;
tvInsert.hInsertAfter = NULL;
tvInsert.item.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE;
tvInsert.item.pszText = _T(dlg.m_strName.GetBuffer(0));
// create a new group
group_t *g = Group_Alloc( dlg.m_strName.GetBuffer(0) );
g->itemOwner = m_wndTree.InsertItem(&tvInsert);
g->next = g_pGroups;
g_pGroups = g;
// now add the selected brushes
// NOTE: it would be much faster to give the group_t for adding
// but Select_AddToGroup is the standard way for all other cases
Select_AddToGroup( dlg.m_strName.GetBuffer(0) );
}
}
void CGroupDlg::OnBtnDel()
{
}
void CGroupDlg::OnBtnEdit()
{
}
BOOL CGroupDlg::OnChildNotify(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pLResult)
{
return CDialog::OnChildNotify(message, wParam, lParam, pLResult);
}
BOOL CGroupDlg::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
return CDialog::OnNotify(wParam, lParam, pResult);
}
void CGroupDlg::OnRclickTreeGroup(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
*pResult = 0;
}
void CGroupDlg::OnEndlabeleditTreeGroup(NMHDR* pNMHDR, LRESULT* pResult)
{
TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR;
const char *pText = pTVDispInfo->item.pszText;
if (pText && strlen(pText) > 0)
{
HTREEITEM item = pTVDispInfo->item.hItem;
if (m_wndTree.GetRootItem() != item)
{
m_wndTree.SetItemText(item, pText);
if (pTVDispInfo->item.iImage != IMG_GROUP)
{
// if it is an entity
}
}
else
{
Sys_Printf("Cannot rename the world\n");
}
}
m_wndTree.RedrawWindow();
*pResult = 0;
}
void CGroupDlg::OnClickTreeGroup(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
*pResult = 0;
}
void CGroupDlg::OnSetdispinfoTreeGroup(NMHDR* pNMHDR, LRESULT* pResult)
{
TV_DISPINFO* pTVDispInfo = (TV_DISPINFO*)pNMHDR;
// TODO: Add your control notification handler code here
*pResult = 0;
}
void CGroupDlg::OnCancel()
{
TreeView_EndEditLabelNow(m_wndTree.GetSafeHwnd(), TRUE);
}
void CGroupDlg::OnOK()
{
TreeView_EndEditLabelNow(m_wndTree.GetSafeHwnd(), FALSE);
}
void CGroupDlg::OnBegindragTreeGroup(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
// TODO: Add your control notification handler code here
*pResult = 0;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?