第二人生的源码分析(九十一)LLScrollListCtrl列表的详细绘制

从前面可以看到怎么样绘制滚动列表框的代码,但在那个函数里面还调用一个函数 drawItems来详细地绘制列表项的,现在就来分析这个函数的代码,如下:
#001 void LLScrollListCtrl::drawItems()
#002 {
 
计算左上角显示的位置。
#003     S32 x = mItemListRect.mLeft;
#004     S32 y = mItemListRect.mTop - mLineHeight;
#005 
 
允许显示最大的行数。
#006     // allow for partial line at bottom
#007     S32 num_page_lines = mPageLines + 1;
#008 
#009     LLRect item_rect;
#010 
#011     LLGLSUIDefault gls_ui;
#012    
#013     {
#014         LLLocalClipRect clip(mItemListRect);
#015 
#016         S32 cur_y = y;
#017        
#018         mDrewSelected = FALSE;
#019 
#020         S32 line = 0;
#021         S32 max_columns = 0;
#022 
 
获取高亮度显示的颜色。
#023         LLColor4 highlight_color = LLColor4::white;
#024          F32 type_ahead_timeout = LLUI::sConfigGroup->getF32("TypeAheadTimeout");
#025         highlight_color.mV[VALPHA] = clamp_rescale(mSearchTimer.getElapsedTimeF32(), type_ahead_timeout * 0.7f, type_ahead_timeout, 0.4f, 0.f);
#026 
#027         item_list::iterator iter;
 
下面开始遍历所有列表项。
#028         for (iter = mItemList.begin(); iter != mItemList.end(); iter++)
#029         {
 
获取一个显示的列表项。
#030             LLScrollListItem* item = *iter;
#031            
 
设置列表的位置。
#032             item_rect.setOriginAndSize(
#033                 x,
#034                 cur_y,
#035                 mItemListRect.getWidth(),
#036                 mLineHeight );
#037 
#038             //llinfos << item_rect.getWidth() << llendl;
#039 
 
判断是否选中这一项。
#040             if (item->getSelected())
#041             {
#042                 mDrewSelected = TRUE;
#043             }
#044 
#045             max_columns = llmax(max_columns, item->getNumColumns());
#046 
#047             LLColor4 fg_color;
#048             LLColor4 bg_color(LLColor4::transparent);
#049 
 
滚动到那一项显示。
#050             if( mScrollLines <= line && line < mScrollLines + num_page_lines )
#051             {
#052                 fg_color = (item->getEnabled() ? mFgUnselectedColor : mFgDisabledColor);
#053                 if( item->getSelected() && mCanSelect)
#054                 {
#055                     // Draw background of selected item
#056                     bg_color = mBgSelectedColor;
#057                     fg_color = (item->getEnabled() ? mFgSelectedColor : mFgDisabledColor);
#058                 }
#059                 else if (mHighlightedItem == line && mCanSelect)
#060                 {
#061                     bg_color = mHighlightedColor;
#062                 }
#063                 else
#064                 {
#065                     if (mDrawStripes && (line % 2 == 0) && (max_columns > 1))
#066                     {
#067                         bg_color = mBgStripeColor;
#068                     }
#069                 }
#070 
#071                 if (!item->getEnabled())
#072                 {
#073                     bg_color = mBgReadOnlyColor;
#074                 }
#075 
 
显示一项,通过类 LLScrollListItem里的函数draw来显示,第一个参数指明显示位置,第二个参数设置字体颜色,第三个设置背景颜色,第四个设置列表对齐宽度。
#076                 item->draw(item_rect, fg_color, bg_color, highlight_color, mColumnPadding);
#077 
#078                 cur_y -= mLineHeight;
#079             }
#080             line++;
#081         }
#082     }
#083 }
 
上面这个函数通过遍历 mItemList列表里的所有选项,然后计算每一项所在的位置、颜色、对齐的宽度,最后调用类LLScrollListItem里的函数draw来显示列表项。
 

转载于:https://www.cnblogs.com/ajuanabc/archive/2008/06/15/2464057.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值