您的位置:首页 > 产品设计 > UI/UE

duilib 修复CTreeViewUI复选功能判断不准确的bug

2014-12-30 14:06 507 查看
转载请说明出处,谢谢~~:/article/1371196.html

CTreeViewUI里面自带了复选的功能,但是复选功能存在bug:

1)当一个分组下面存在子项时,子项被手动全选后,分组的复选框没有自动变为选中状态



2)当一个分组下面存在子项时,当所有子项都取消选中状态时,分组的复选框还是选中状态



分组的CTreeNodeUI控件应该自动判断是否为选中状态,bug被修复后的效果如下:



修复过程:

当某个复选框被单击后会触发CTreeViewUI控件的OnCheckBoxChanged函数,这时应该在这里做出判断,来决定分组的选中状态,为此我给CTreeNodeUI控件增加了IsAllChildChecked函数。

修改后的OnCheckBoxChanged函数如下:

bool CTreeViewUI::OnCheckBoxChanged( void* param )
{
TNotifyUI* pMsg = (TNotifyUI*)param;
if(pMsg->sType == _T("selectchanged"))
{
CCheckBoxUI* pCheckBox = (CCheckBoxUI*)pMsg->pSender;
CTreeNodeUI* pItem = (CTreeNodeUI*)pCheckBox->GetParent()->GetParent();
SetItemCheckBox(pCheckBox->GetCheck(),pItem);

if(pItem->GetParentNode() != NULL)  //edit by:Redrain  2014.12.11
pItem->GetParentNode()->IsAllChildChecked();

return true;
}
return true;
}


当某个复选框被单击后,去通知他的父控件,让父控件判断是否应该是选中状态。为CTreeNodeUI控件增加的IsAllChildChecked函数如下:

void CTreeNodeUI::IsAllChildChecked()
{
bool bIsAllChildChecked = true;
bool bIsAllChildUncheck = true;
int nCount = GetCountChild();
if(nCount > 0)
{
for(int nIndex = 0;nIndex < nCount;nIndex++)
{
CTreeNodeUI* pItem = GetChildNode(nIndex);
if(!pItem->GetCheckBox()->IsSelected())
{
bIsAllChildChecked = false;
}
else
{
bIsAllChildUncheck = false;
}
}
if (bIsAllChildChecked && !GetCheckBox()->IsSelected())
{
GetCheckBox()->Selected(true);
return;
}
else if (bIsAllChildUncheck && GetCheckBox()->IsSelected())
{
GetCheckBox()->Selected(false);
return;
}

}

}


总结:

bug的修复代码已经提交到我自己的Duilib库。

我的Duilib库代码下载地址:点击打开链接

Redrain 2014.12.30
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐