MCPcopy Create free account
hub / github.com/SOUI2/soui / UpdateVisibleItems

Method UpdateVisibleItems

SOUI/src/control/SMCListView.cpp:514–657  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

512
513
514void SMCListView::UpdateVisibleItems()
515{
516 if(!m_adapter) return;
517 int iOldFirstVisible = m_iFirstVisible;
518 int iOldLastVisible = m_iFirstVisible + m_lstItems.GetCount();
519 int nOldTotalHeight = m_lvItemLocator->GetTotalHeight();
520
521 int iNewFirstVisible = m_lvItemLocator->Position2Item(m_siVer.nPos);
522 int iNewLastVisible = iNewFirstVisible;
523 int pos = m_lvItemLocator->Item2Position(iNewFirstVisible);
524 int iHoverItem = m_pHoverItem?(int)m_pHoverItem->GetItemIndex():-1;
525 m_pHoverItem = NULL;
526
527 ItemInfo *pItemInfos = new ItemInfo[m_lstItems.GetCount()];
528 SPOSITION spos = m_lstItems.GetHeadPosition();
529 int i=0;
530 while(spos)
531 {
532 pItemInfos[i++]=m_lstItems.GetNext(spos);
533 }
534
535 m_lstItems.RemoveAll();
536
537 if(iNewFirstVisible!=-1)
538 {
539 while(pos < m_siVer.nPos + (int)m_siVer.nPage && iNewLastVisible < m_adapter->getCount())
540 {
541 DWORD dwState = WndState_Normal;
542 if(iHoverItem == iNewLastVisible) dwState |= WndState_Hover;
543 if(m_iSelItem == iNewLastVisible) dwState |= WndState_Check;
544
545 ItemInfo ii={NULL,-1};
546 ii.nType = m_adapter->getItemViewType(iNewLastVisible,dwState);
547
548 if(iNewLastVisible>=iOldFirstVisible && iNewLastVisible < iOldLastVisible)
549 {//use the old visible item
550 int iItem = iNewLastVisible-iOldFirstVisible;//(iNewLastVisible-iNewFirstVisible) + (iNewFirstVisible-iOldFirstVisible);
551 SASSERT(iItem>=0 && iItem <= (iOldLastVisible-iOldFirstVisible));
552 if(pItemInfos[iItem].nType == ii.nType)
553 {//类型相同才能重用
554 ii = pItemInfos[iItem];
555 pItemInfos[iItem].pItem = NULL;//标记该行已经被重用
556 }
557 }
558 if(!ii.pItem)
559 {//create new visible item
560 SList<SItemPanel *> *lstRecycle = m_itemRecycle.GetAt(ii.nType);
561 if(lstRecycle->IsEmpty())
562 {//创建一个新的列表项
563 ii.pItem = SItemPanel::Create(this,pugi::xml_node(),this);
564 ii.pItem->GetEventSet()->subscribeEvent(EventItemPanelClick::EventID,Subscriber(&SMCListView::OnItemClick,this));
565 }else
566 {
567 ii.pItem = lstRecycle->RemoveHead();
568 }
569 ii.pItem->SetItemIndex(iNewLastVisible);
570 }
571 ii.pItem->SetVisible(TRUE);

Callers

nothing calls this directly

Calls 15

SubscriberFunction · 0.85
GetHeadPositionMethod · 0.80
RemoveHeadMethod · 0.80
IsFixHeightMethod · 0.80
ModifyItemStateMethod · 0.80
DoColorizeMethod · 0.80
toPixelSizeMethod · 0.80
AddTailMethod · 0.80
GetDividerSizeMethod · 0.80
GetStateMethod · 0.80
ClearFocusMethod · 0.80
CreateFunction · 0.50

Tested by

no test coverage detected