从前面可以看到怎么样绘制滚动列表框的代码,但在那个函数里面还调用一个函数
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来显示列表项。