Skip to content
Snippets Groups Projects
Commit c5f6ff43 authored by Kelly Washington's avatar Kelly Washington
Browse files

MAINT-1897 Poor performance viewing large group member lists

* Improve draw performance of scroll lists by only drawing what is visible
* Reduce frequency of expensive column width calculations
Fixes by Richard
parent 6a947c80
No related branches found
No related tags found
No related merge requests found
...@@ -563,8 +563,7 @@ void LLComboBox::showList() ...@@ -563,8 +563,7 @@ void LLComboBox::showList()
S32 min_width = getRect().getWidth(); S32 min_width = getRect().getWidth();
S32 max_width = llmax(min_width, MAX_COMBO_WIDTH); S32 max_width = llmax(min_width, MAX_COMBO_WIDTH);
// make sure we have up to date content width metrics // make sure we have up to date content width metrics
mList->calcColumnWidths(); S32 list_width = llclamp(mList->calcMaxContentWidth(), min_width, max_width);
S32 list_width = llclamp(mList->getMaxContentWidth(), min_width, max_width);
if (mListPosition == BELOW) if (mListPosition == BELOW)
{ {
......
...@@ -98,6 +98,7 @@ BOOL LLScrollColumnHeader::handleDoubleClick(S32 x, S32 y, MASK mask) ...@@ -98,6 +98,7 @@ BOOL LLScrollColumnHeader::handleDoubleClick(S32 x, S32 y, MASK mask)
if (canResize() && mResizeBar->getRect().pointInRect(x, y)) if (canResize() && mResizeBar->getRect().pointInRect(x, y))
{ {
// reshape column to max content width // reshape column to max content width
mColumn->mParentCtrl->calcMaxContentWidth();
LLRect column_rect = getRect(); LLRect column_rect = getRect();
column_rect.mRight = column_rect.mLeft + mColumn->mMaxContentWidth; column_rect.mRight = column_rect.mLeft + mColumn->mMaxContentWidth;
setShape(column_rect, true); setShape(column_rect, true);
...@@ -127,6 +128,8 @@ LLView* LLScrollColumnHeader::findSnapEdge(S32& new_edge_val, const LLCoordGL& m ...@@ -127,6 +128,8 @@ LLView* LLScrollColumnHeader::findSnapEdge(S32& new_edge_val, const LLCoordGL& m
LLRect snap_rect = getSnapRect(); LLRect snap_rect = getSnapRect();
mColumn->mParentCtrl->calcMaxContentWidth();
S32 snap_delta = mColumn->mMaxContentWidth - snap_rect.getWidth(); S32 snap_delta = mColumn->mMaxContentWidth - snap_rect.getWidth();
// x coord growing means column growing, so same signs mean we're going in right direction // x coord growing means column growing, so same signs mean we're going in right direction
......
...@@ -159,15 +159,14 @@ LLScrollListCtrl::LLScrollListCtrl(const LLScrollListCtrl::Params& p) ...@@ -159,15 +159,14 @@ LLScrollListCtrl::LLScrollListCtrl(const LLScrollListCtrl::Params& p)
mMouseWheelOpaque(p.mouse_wheel_opaque), mMouseWheelOpaque(p.mouse_wheel_opaque),
mPageLines(p.page_lines), mPageLines(p.page_lines),
mMaxSelectable(0), mMaxSelectable(0),
mAllowKeyboardMovement(TRUE), mAllowKeyboardMovement(true),
mCommitOnKeyboardMovement(p.commit_on_keyboard_movement), mCommitOnKeyboardMovement(p.commit_on_keyboard_movement),
mCommitOnSelectionChange(FALSE), mCommitOnSelectionChange(false),
mSelectionChanged(FALSE), mSelectionChanged(false),
mNeedsScroll(FALSE), mNeedsScroll(false),
mCanSelect(TRUE), mCanSelect(true),
mColumnsDirty(FALSE), mColumnsDirty(false),
mMaxItemCount(INT_MAX), mMaxItemCount(INT_MAX),
mMaxContentWidth(0),
mBorderThickness( 2 ), mBorderThickness( 2 ),
mOnDoubleClickCallback( NULL ), mOnDoubleClickCallback( NULL ),
mOnMaximumSelectCallback( NULL ), mOnMaximumSelectCallback( NULL ),
...@@ -181,7 +180,7 @@ LLScrollListCtrl::LLScrollListCtrl(const LLScrollListCtrl::Params& p) ...@@ -181,7 +180,7 @@ LLScrollListCtrl::LLScrollListCtrl(const LLScrollListCtrl::Params& p)
mTotalStaticColumnWidth(0), mTotalStaticColumnWidth(0),
mTotalColumnPadding(0), mTotalColumnPadding(0),
mSorted(false), mSorted(false),
mDirty(FALSE), mDirty(false),
mOriginalSelection(-1), mOriginalSelection(-1),
mLastSelected(NULL), mLastSelected(NULL),
mHeadingHeight(p.heading_height), mHeadingHeight(p.heading_height),
...@@ -357,7 +356,7 @@ void LLScrollListCtrl::clearRows() ...@@ -357,7 +356,7 @@ void LLScrollListCtrl::clearRows()
mScrollLines = 0; mScrollLines = 0;
mLastSelected = NULL; mLastSelected = NULL;
updateLayout(); updateLayout();
mDirty = FALSE; mDirty = false;
} }
...@@ -592,15 +591,42 @@ BOOL LLScrollListCtrl::addItem( LLScrollListItem* item, EAddPosition pos, BOOL r ...@@ -592,15 +591,42 @@ BOOL LLScrollListCtrl::addItem( LLScrollListItem* item, EAddPosition pos, BOOL r
// NOTE: This is *very* expensive for large lists, especially when we are dirtying the list every frame // NOTE: This is *very* expensive for large lists, especially when we are dirtying the list every frame
// while receiving a long list of names. // while receiving a long list of names.
// *TODO: Use bookkeeping to make this an incramental cost with item additions // *TODO: Use bookkeeping to make this an incramental cost with item additions
void LLScrollListCtrl::calcColumnWidths() S32 LLScrollListCtrl::calcMaxContentWidth()
{ {
const S32 HEADING_TEXT_PADDING = 25; const S32 HEADING_TEXT_PADDING = 25;
const S32 COLUMN_TEXT_PADDING = 10; const S32 COLUMN_TEXT_PADDING = 10;
mMaxContentWidth = 0;
S32 max_item_width = 0; S32 max_item_width = 0;
ordered_columns_t::iterator column_itor;
for (column_itor = mColumnsIndexed.begin(); column_itor != mColumnsIndexed.end(); ++column_itor)
{
LLScrollListColumn* column = *column_itor;
if (!column) continue;
if (mColumnWidthsDirty)
{
mColumnWidthsDirty = false;
// update max content width for this column, by looking at all items
column->mMaxContentWidth = column->mHeader ? LLFontGL::getFontSansSerifSmall()->getWidth(column->mLabel) + mColumnPadding + HEADING_TEXT_PADDING : 0;
item_list::iterator iter;
for (iter = mItemList.begin(); iter != mItemList.end(); iter++)
{
LLScrollListCell* cellp = (*iter)->getColumn(column->mIndex);
if (!cellp) continue;
column->mMaxContentWidth = llmax(LLFontGL::getFontSansSerifSmall()->getWidth(cellp->getValue().asString()) + mColumnPadding + COLUMN_TEXT_PADDING, column->mMaxContentWidth);
}
}
max_item_width += column->mMaxContentWidth;
}
return max_item_width;
}
bool LLScrollListCtrl::updateColumnWidths()
{
bool width_changed = false;
ordered_columns_t::iterator column_itor; ordered_columns_t::iterator column_itor;
for (column_itor = mColumnsIndexed.begin(); column_itor != mColumnsIndexed.end(); ++column_itor) for (column_itor = mColumnsIndexed.begin(); column_itor != mColumnsIndexed.end(); ++column_itor)
{ {
...@@ -618,23 +644,13 @@ void LLScrollListCtrl::calcColumnWidths() ...@@ -618,23 +644,13 @@ void LLScrollListCtrl::calcColumnWidths()
new_width = (mItemListRect.getWidth() - mTotalStaticColumnWidth - mTotalColumnPadding) / mNumDynamicWidthColumns; new_width = (mItemListRect.getWidth() - mTotalStaticColumnWidth - mTotalColumnPadding) / mNumDynamicWidthColumns;
} }
column->setWidth(new_width); if (column->getWidth() != new_width)
// update max content width for this column, by looking at all items
column->mMaxContentWidth = column->mHeader ? LLFontGL::getFontSansSerifSmall()->getWidth(column->mLabel) + mColumnPadding + HEADING_TEXT_PADDING : 0;
item_list::iterator iter;
for (iter = mItemList.begin(); iter != mItemList.end(); iter++)
{ {
LLScrollListCell* cellp = (*iter)->getColumn(column->mIndex); column->setWidth(new_width);
if (!cellp) continue; width_changed = true;
column->mMaxContentWidth = llmax(LLFontGL::getFontSansSerifSmall()->getWidth(cellp->getValue().asString()) + mColumnPadding + COLUMN_TEXT_PADDING, column->mMaxContentWidth);
} }
max_item_width += column->mMaxContentWidth;
} }
return width_changed;
mMaxContentWidth = max_item_width;
} }
const S32 SCROLL_LIST_ROW_PAD = 2; const S32 SCROLL_LIST_ROW_PAD = 2;
...@@ -670,7 +686,12 @@ void LLScrollListCtrl::updateLineHeightInsert(LLScrollListItem* itemp) ...@@ -670,7 +686,12 @@ void LLScrollListCtrl::updateLineHeightInsert(LLScrollListItem* itemp)
void LLScrollListCtrl::updateColumns() void LLScrollListCtrl::updateColumns()
{ {
calcColumnWidths(); if (!mColumnsDirty)
return;
mColumnsDirty = false;
bool columns_changed_width = updateColumnWidths();
// update column headers // update column headers
std::vector<LLScrollListColumn*>::iterator column_ordered_it; std::vector<LLScrollListColumn*>::iterator column_ordered_it;
...@@ -719,20 +740,22 @@ void LLScrollListCtrl::updateColumns() ...@@ -719,20 +740,22 @@ void LLScrollListCtrl::updateColumns()
} }
// propagate column widths to individual cells // propagate column widths to individual cells
item_list::iterator iter; if (columns_changed_width)
for (iter = mItemList.begin(); iter != mItemList.end(); iter++)
{ {
LLScrollListItem *itemp = *iter; item_list::iterator iter;
S32 num_cols = itemp->getNumColumns(); for (iter = mItemList.begin(); iter != mItemList.end(); iter++)
S32 i = 0;
for (LLScrollListCell* cell = itemp->getColumn(i); i < num_cols; cell = itemp->getColumn(++i))
{ {
if (i >= (S32)mColumnsIndexed.size()) break; LLScrollListItem *itemp = *iter;
S32 num_cols = itemp->getNumColumns();
S32 i = 0;
for (LLScrollListCell* cell = itemp->getColumn(i); i < num_cols; cell = itemp->getColumn(++i))
{
if (i >= (S32)mColumnsIndexed.size()) break;
cell->setWidth(mColumnsIndexed[i]->getWidth()); cell->setWidth(mColumnsIndexed[i]->getWidth());
}
} }
} }
} }
void LLScrollListCtrl::setHeadingHeight(S32 heading_height) void LLScrollListCtrl::setHeadingHeight(S32 heading_height)
...@@ -773,7 +796,7 @@ BOOL LLScrollListCtrl::selectFirstItem() ...@@ -773,7 +796,7 @@ BOOL LLScrollListCtrl::selectFirstItem()
{ {
deselectItem(itemp); deselectItem(itemp);
} }
first_item = FALSE; first_item = false;
} }
if (mCommitOnSelectionChange) if (mCommitOnSelectionChange)
{ {
...@@ -1407,17 +1430,23 @@ void LLScrollListCtrl::drawItems() ...@@ -1407,17 +1430,23 @@ void LLScrollListCtrl::drawItems()
S32 cur_y = y; S32 cur_y = y;
S32 line = 0;
S32 max_columns = 0; S32 max_columns = 0;
LLColor4 highlight_color = LLColor4::white; LLColor4 highlight_color = LLColor4::white;
static LLUICachedControl<F32> type_ahead_timeout ("TypeAheadTimeout", 0); static LLUICachedControl<F32> type_ahead_timeout ("TypeAheadTimeout", 0);
highlight_color.mV[VALPHA] = clamp_rescale(mSearchTimer.getElapsedTimeF32(), type_ahead_timeout * 0.7f, type_ahead_timeout, 0.4f, 0.f); highlight_color.mV[VALPHA] = clamp_rescale(mSearchTimer.getElapsedTimeF32(), type_ahead_timeout * 0.7f, type_ahead_timeout, 0.4f, 0.f);
S32 first_line = mScrollLines;
S32 last_line = llmin((S32)mItemList.size() - 1, mScrollLines + getLinesPerPage());
if (first_line >= mItemList.size())
{
return;
}
item_list::iterator iter; item_list::iterator iter;
for (iter = mItemList.begin(); iter != mItemList.end(); iter++) for (S32 line = first_line; line <= last_line; line++)
{ {
LLScrollListItem* item = *iter; LLScrollListItem* item = mItemList[line];
item_rect.setOriginAndSize( item_rect.setOriginAndSize(
x, x,
...@@ -1481,7 +1510,6 @@ void LLScrollListCtrl::drawItems() ...@@ -1481,7 +1510,6 @@ void LLScrollListCtrl::drawItems()
cur_y -= mLineHeight; cur_y -= mLineHeight;
} }
line++;
} }
} }
} }
...@@ -1497,7 +1525,7 @@ void LLScrollListCtrl::draw() ...@@ -1497,7 +1525,7 @@ void LLScrollListCtrl::draw()
if (mNeedsScroll) if (mNeedsScroll)
{ {
scrollToShowSelected(); scrollToShowSelected();
mNeedsScroll = FALSE; mNeedsScroll = false;
} }
LLRect background(0, getRect().getHeight(), getRect().getWidth(), 0); LLRect background(0, getRect().getHeight(), getRect().getWidth(), 0);
// Draw background // Draw background
...@@ -1508,11 +1536,7 @@ void LLScrollListCtrl::draw() ...@@ -1508,11 +1536,7 @@ void LLScrollListCtrl::draw()
gl_rect_2d(background, getEnabled() ? mBgWriteableColor.get() % alpha : mBgReadOnlyColor.get() % alpha ); gl_rect_2d(background, getEnabled() ? mBgWriteableColor.get() % alpha : mBgReadOnlyColor.get() % alpha );
} }
if (mColumnsDirty) updateColumns();
{
updateColumns();
mColumnsDirty = FALSE;
}
getChildView("comment_text")->setVisible(mItemList.empty()); getChildView("comment_text")->setVisible(mItemList.empty());
...@@ -1720,7 +1744,7 @@ BOOL LLScrollListCtrl::handleMouseDown(S32 x, S32 y, MASK mask) ...@@ -1720,7 +1744,7 @@ BOOL LLScrollListCtrl::handleMouseDown(S32 x, S32 y, MASK mask)
setFocus(TRUE); setFocus(TRUE);
// clear selection changed flag because user is starting a selection operation // clear selection changed flag because user is starting a selection operation
mSelectionChanged = FALSE; mSelectionChanged = false;
handleClick(x, y, mask); handleClick(x, y, mask);
} }
...@@ -1738,15 +1762,15 @@ BOOL LLScrollListCtrl::handleMouseUp(S32 x, S32 y, MASK mask) ...@@ -1738,15 +1762,15 @@ BOOL LLScrollListCtrl::handleMouseUp(S32 x, S32 y, MASK mask)
if(mask == MASK_NONE) if(mask == MASK_NONE)
{ {
selectItemAt(x, y, mask); selectItemAt(x, y, mask);
mNeedsScroll = TRUE; mNeedsScroll = true;
} }
} }
// always commit when mouse operation is completed inside list // always commit when mouse operation is completed inside list
if (mItemListRect.pointInRect(x,y)) if (mItemListRect.pointInRect(x,y))
{ {
mDirty |= mSelectionChanged; mDirty = mDirty || mSelectionChanged;
mSelectionChanged = FALSE; mSelectionChanged = false;
onCommit(); onCommit();
} }
...@@ -1862,7 +1886,7 @@ BOOL LLScrollListCtrl::handleClick(S32 x, S32 y, MASK mask) ...@@ -1862,7 +1886,7 @@ BOOL LLScrollListCtrl::handleClick(S32 x, S32 y, MASK mask)
{ {
selectItemAt(x, y, mask); selectItemAt(x, y, mask);
gFocusMgr.setMouseCapture(this); gFocusMgr.setMouseCapture(this);
mNeedsScroll = TRUE; mNeedsScroll = true;
} }
// propagate state of cell to rest of selected column // propagate state of cell to rest of selected column
...@@ -1891,7 +1915,7 @@ BOOL LLScrollListCtrl::handleClick(S32 x, S32 y, MASK mask) ...@@ -1891,7 +1915,7 @@ BOOL LLScrollListCtrl::handleClick(S32 x, S32 y, MASK mask)
// treat this as a normal single item selection // treat this as a normal single item selection
selectItemAt(x, y, mask); selectItemAt(x, y, mask);
gFocusMgr.setMouseCapture(this); gFocusMgr.setMouseCapture(this);
mNeedsScroll = TRUE; mNeedsScroll = true;
// do not eat click (allow double click callback) // do not eat click (allow double click callback)
return FALSE; return FALSE;
} }
...@@ -1997,7 +2021,7 @@ BOOL LLScrollListCtrl::handleHover(S32 x,S32 y,MASK mask) ...@@ -1997,7 +2021,7 @@ BOOL LLScrollListCtrl::handleHover(S32 x,S32 y,MASK mask)
if(mask == MASK_NONE) if(mask == MASK_NONE)
{ {
selectItemAt(x, y, mask); selectItemAt(x, y, mask);
mNeedsScroll = TRUE; mNeedsScroll = true;
} }
} }
else else
...@@ -2044,7 +2068,7 @@ BOOL LLScrollListCtrl::handleKeyHere(KEY key,MASK mask ) ...@@ -2044,7 +2068,7 @@ BOOL LLScrollListCtrl::handleKeyHere(KEY key,MASK mask )
{ {
// commit implicit in call // commit implicit in call
selectPrevItem(FALSE); selectPrevItem(FALSE);
mNeedsScroll = TRUE; mNeedsScroll = true;
handled = TRUE; handled = TRUE;
} }
break; break;
...@@ -2053,7 +2077,7 @@ BOOL LLScrollListCtrl::handleKeyHere(KEY key,MASK mask ) ...@@ -2053,7 +2077,7 @@ BOOL LLScrollListCtrl::handleKeyHere(KEY key,MASK mask )
{ {
// commit implicit in call // commit implicit in call
selectNextItem(FALSE); selectNextItem(FALSE);
mNeedsScroll = TRUE; mNeedsScroll = true;
handled = TRUE; handled = TRUE;
} }
break; break;
...@@ -2061,7 +2085,7 @@ BOOL LLScrollListCtrl::handleKeyHere(KEY key,MASK mask ) ...@@ -2061,7 +2085,7 @@ BOOL LLScrollListCtrl::handleKeyHere(KEY key,MASK mask )
if (mAllowKeyboardMovement || hasFocus()) if (mAllowKeyboardMovement || hasFocus())
{ {
selectNthItem(getFirstSelectedIndex() - (mScrollbar->getPageSize() - 1)); selectNthItem(getFirstSelectedIndex() - (mScrollbar->getPageSize() - 1));
mNeedsScroll = TRUE; mNeedsScroll = true;
if (mCommitOnKeyboardMovement if (mCommitOnKeyboardMovement
&& !mCommitOnSelectionChange) && !mCommitOnSelectionChange)
{ {
...@@ -2074,7 +2098,7 @@ BOOL LLScrollListCtrl::handleKeyHere(KEY key,MASK mask ) ...@@ -2074,7 +2098,7 @@ BOOL LLScrollListCtrl::handleKeyHere(KEY key,MASK mask )
if (mAllowKeyboardMovement || hasFocus()) if (mAllowKeyboardMovement || hasFocus())
{ {
selectNthItem(getFirstSelectedIndex() + (mScrollbar->getPageSize() - 1)); selectNthItem(getFirstSelectedIndex() + (mScrollbar->getPageSize() - 1));
mNeedsScroll = TRUE; mNeedsScroll = true;
if (mCommitOnKeyboardMovement if (mCommitOnKeyboardMovement
&& !mCommitOnSelectionChange) && !mCommitOnSelectionChange)
{ {
...@@ -2087,7 +2111,7 @@ BOOL LLScrollListCtrl::handleKeyHere(KEY key,MASK mask ) ...@@ -2087,7 +2111,7 @@ BOOL LLScrollListCtrl::handleKeyHere(KEY key,MASK mask )
if (mAllowKeyboardMovement || hasFocus()) if (mAllowKeyboardMovement || hasFocus())
{ {
selectFirstItem(); selectFirstItem();
mNeedsScroll = TRUE; mNeedsScroll = true;
if (mCommitOnKeyboardMovement if (mCommitOnKeyboardMovement
&& !mCommitOnSelectionChange) && !mCommitOnSelectionChange)
{ {
...@@ -2100,7 +2124,7 @@ BOOL LLScrollListCtrl::handleKeyHere(KEY key,MASK mask ) ...@@ -2100,7 +2124,7 @@ BOOL LLScrollListCtrl::handleKeyHere(KEY key,MASK mask )
if (mAllowKeyboardMovement || hasFocus()) if (mAllowKeyboardMovement || hasFocus())
{ {
selectNthItem(getItemCount() - 1); selectNthItem(getItemCount() - 1);
mNeedsScroll = TRUE; mNeedsScroll = true;
if (mCommitOnKeyboardMovement if (mCommitOnKeyboardMovement
&& !mCommitOnSelectionChange) && !mCommitOnSelectionChange)
{ {
...@@ -2139,7 +2163,7 @@ BOOL LLScrollListCtrl::handleKeyHere(KEY key,MASK mask ) ...@@ -2139,7 +2163,7 @@ BOOL LLScrollListCtrl::handleKeyHere(KEY key,MASK mask )
} }
else if (selectItemByPrefix(wstring_to_utf8str(mSearchString), FALSE)) else if (selectItemByPrefix(wstring_to_utf8str(mSearchString), FALSE))
{ {
mNeedsScroll = TRUE; mNeedsScroll = true;
// update search string only on successful match // update search string only on successful match
mSearchTimer.reset(); mSearchTimer.reset();
...@@ -2180,7 +2204,7 @@ BOOL LLScrollListCtrl::handleUnicodeCharHere(llwchar uni_char) ...@@ -2180,7 +2204,7 @@ BOOL LLScrollListCtrl::handleUnicodeCharHere(llwchar uni_char)
if (selectItemByPrefix(wstring_to_utf8str(mSearchString + (llwchar)uni_char), FALSE)) if (selectItemByPrefix(wstring_to_utf8str(mSearchString + (llwchar)uni_char), FALSE))
{ {
// update search string only on successful match // update search string only on successful match
mNeedsScroll = TRUE; mNeedsScroll = true;
mSearchString += uni_char; mSearchString += uni_char;
mSearchTimer.reset(); mSearchTimer.reset();
...@@ -2226,7 +2250,7 @@ BOOL LLScrollListCtrl::handleUnicodeCharHere(llwchar uni_char) ...@@ -2226,7 +2250,7 @@ BOOL LLScrollListCtrl::handleUnicodeCharHere(llwchar uni_char)
if (item->getEnabled() && LLStringOps::toLower(item_label[0]) == uni_char) if (item->getEnabled() && LLStringOps::toLower(item_label[0]) == uni_char)
{ {
selectItem(item); selectItem(item);
mNeedsScroll = TRUE; mNeedsScroll = true;
cellp->highlightText(0, 1); cellp->highlightText(0, 1);
mSearchTimer.reset(); mSearchTimer.reset();
...@@ -2297,7 +2321,7 @@ void LLScrollListCtrl::selectItem(LLScrollListItem* itemp, BOOL select_single_it ...@@ -2297,7 +2321,7 @@ void LLScrollListCtrl::selectItem(LLScrollListItem* itemp, BOOL select_single_it
} }
itemp->setSelected(TRUE); itemp->setSelected(TRUE);
mLastSelected = itemp; mLastSelected = itemp;
mSelectionChanged = TRUE; mSelectionChanged = true;
} }
} }
...@@ -2318,7 +2342,7 @@ void LLScrollListCtrl::deselectItem(LLScrollListItem* itemp) ...@@ -2318,7 +2342,7 @@ void LLScrollListCtrl::deselectItem(LLScrollListItem* itemp)
{ {
cellp->highlightText(0, 0); cellp->highlightText(0, 0);
} }
mSelectionChanged = TRUE; mSelectionChanged = true;
} }
} }
...@@ -2326,7 +2350,7 @@ void LLScrollListCtrl::commitIfChanged() ...@@ -2326,7 +2350,7 @@ void LLScrollListCtrl::commitIfChanged()
{ {
if (mSelectionChanged) if (mSelectionChanged)
{ {
mDirty = TRUE; mDirty = true;
mSelectionChanged = FALSE; mSelectionChanged = FALSE;
onCommit(); onCommit();
} }
...@@ -2437,7 +2461,8 @@ void LLScrollListCtrl::sortOnce(S32 column, BOOL ascending) ...@@ -2437,7 +2461,8 @@ void LLScrollListCtrl::sortOnce(S32 column, BOOL ascending)
void LLScrollListCtrl::dirtyColumns() void LLScrollListCtrl::dirtyColumns()
{ {
mColumnsDirty = TRUE; mColumnsDirty = true;
mColumnWidthsDirty = true;
// need to keep mColumnsIndexed up to date // need to keep mColumnsIndexed up to date
// just in case someone indexes into it immediately // just in case someone indexes into it immediately
...@@ -3006,7 +3031,7 @@ void LLScrollListCtrl::resetDirty() ...@@ -3006,7 +3031,7 @@ void LLScrollListCtrl::resetDirty()
void LLScrollListCtrl::onFocusReceived() void LLScrollListCtrl::onFocusReceived()
{ {
// forget latent selection changes when getting focus // forget latent selection changes when getting focus
mSelectionChanged = FALSE; mSelectionChanged = false;
LLUICtrl::onFocusReceived(); LLUICtrl::onFocusReceived();
} }
......
...@@ -343,8 +343,8 @@ class LLScrollListCtrl : public LLUICtrl, public LLEditMenuHandler, ...@@ -343,8 +343,8 @@ class LLScrollListCtrl : public LLUICtrl, public LLEditMenuHandler,
static void onClickColumn(void *userdata); static void onClickColumn(void *userdata);
virtual void updateColumns(); virtual void updateColumns();
void calcColumnWidths(); S32 calcMaxContentWidth();
S32 getMaxContentWidth() { return mMaxContentWidth; } bool updateColumnWidths();
void setHeadingHeight(S32 heading_height); void setHeadingHeight(S32 heading_height);
/** /**
...@@ -440,16 +440,17 @@ class LLScrollListCtrl : public LLUICtrl, public LLEditMenuHandler, ...@@ -440,16 +440,17 @@ class LLScrollListCtrl : public LLUICtrl, public LLEditMenuHandler,
S32 mHeadingHeight; // the height of the column header buttons, if visible S32 mHeadingHeight; // the height of the column header buttons, if visible
U32 mMaxSelectable; U32 mMaxSelectable;
LLScrollbar* mScrollbar; LLScrollbar* mScrollbar;
BOOL mAllowMultipleSelection; bool mAllowMultipleSelection;
BOOL mAllowKeyboardMovement; bool mAllowKeyboardMovement;
BOOL mCommitOnKeyboardMovement; bool mCommitOnKeyboardMovement;
BOOL mCommitOnSelectionChange; bool mCommitOnSelectionChange;
BOOL mSelectionChanged; bool mSelectionChanged;
BOOL mNeedsScroll; bool mNeedsScroll;
BOOL mMouseWheelOpaque; bool mMouseWheelOpaque;
BOOL mCanSelect; bool mCanSelect;
const BOOL mDisplayColumnHeaders; bool mDisplayColumnHeaders;
BOOL mColumnsDirty; bool mColumnsDirty;
bool mColumnWidthsDirty;
mutable item_list mItemList; mutable item_list mItemList;
...@@ -458,7 +459,6 @@ class LLScrollListCtrl : public LLUICtrl, public LLEditMenuHandler, ...@@ -458,7 +459,6 @@ class LLScrollListCtrl : public LLUICtrl, public LLEditMenuHandler,
S32 mMaxItemCount; S32 mMaxItemCount;
LLRect mItemListRect; LLRect mItemListRect;
S32 mMaxContentWidth;
S32 mColumnPadding; S32 mColumnPadding;
BOOL mBackgroundVisible; BOOL mBackgroundVisible;
...@@ -498,7 +498,7 @@ class LLScrollListCtrl : public LLUICtrl, public LLEditMenuHandler, ...@@ -498,7 +498,7 @@ class LLScrollListCtrl : public LLUICtrl, public LLEditMenuHandler,
typedef std::map<std::string, LLScrollListColumn*> column_map_t; typedef std::map<std::string, LLScrollListColumn*> column_map_t;
column_map_t mColumns; column_map_t mColumns;
BOOL mDirty; bool mDirty;
S32 mOriginalSelection; S32 mOriginalSelection;
ContextMenuType mContextMenuType; ContextMenuType mContextMenuType;
......
...@@ -1549,16 +1549,18 @@ void LLView::screenPointToLocal(S32 screen_x, S32 screen_y, S32* local_x, S32* l ...@@ -1549,16 +1549,18 @@ void LLView::screenPointToLocal(S32 screen_x, S32 screen_y, S32* local_x, S32* l
void LLView::localPointToScreen(S32 local_x, S32 local_y, S32* screen_x, S32* screen_y) const void LLView::localPointToScreen(S32 local_x, S32 local_y, S32* screen_x, S32* screen_y) const
{ {
*screen_x = local_x + getRect().mLeft; *screen_x = local_x;
*screen_y = local_y + getRect().mBottom; *screen_y = local_y;
const LLView* cur = this; const LLView* cur = this;
while( cur->mParentView ) do
{ {
LLRect cur_rect = cur->getRect();
*screen_x += cur_rect.mLeft;
*screen_y += cur_rect.mBottom;
cur = cur->mParentView; cur = cur->mParentView;
*screen_x += cur->getRect().mLeft;
*screen_y += cur->getRect().mBottom;
} }
while( cur );
} }
void LLView::screenRectToLocal(const LLRect& screen, LLRect* local) const void LLView::screenRectToLocal(const LLRect& screen, LLRect* local) const
......
...@@ -68,7 +68,7 @@ LLNameListCtrl::LLNameListCtrl(const LLNameListCtrl::Params& p) ...@@ -68,7 +68,7 @@ LLNameListCtrl::LLNameListCtrl(const LLNameListCtrl::Params& p)
{} {}
// public // public
void LLNameListCtrl::addNameItem(const LLUUID& agent_id, EAddPosition pos, LLScrollListItem* LLNameListCtrl::addNameItem(const LLUUID& agent_id, EAddPosition pos,
BOOL enabled, const std::string& suffix) BOOL enabled, const std::string& suffix)
{ {
//llinfos << "LLNameListCtrl::addNameItem " << agent_id << llendl; //llinfos << "LLNameListCtrl::addNameItem " << agent_id << llendl;
...@@ -78,7 +78,7 @@ void LLNameListCtrl::addNameItem(const LLUUID& agent_id, EAddPosition pos, ...@@ -78,7 +78,7 @@ void LLNameListCtrl::addNameItem(const LLUUID& agent_id, EAddPosition pos,
item.enabled = enabled; item.enabled = enabled;
item.target = INDIVIDUAL; item.target = INDIVIDUAL;
addNameItemRow(item, pos, suffix); return addNameItemRow(item, pos, suffix);
} }
// virtual, public // virtual, public
...@@ -271,10 +271,10 @@ void LLNameListCtrl::addGroupNameItem(LLNameListCtrl::NameItem& item, EAddPositi ...@@ -271,10 +271,10 @@ void LLNameListCtrl::addGroupNameItem(LLNameListCtrl::NameItem& item, EAddPositi
addNameItemRow(item, pos); addNameItemRow(item, pos);
} }
void LLNameListCtrl::addNameItem(LLNameListCtrl::NameItem& item, EAddPosition pos) LLScrollListItem* LLNameListCtrl::addNameItem(LLNameListCtrl::NameItem& item, EAddPosition pos)
{ {
item.target = INDIVIDUAL; item.target = INDIVIDUAL;
addNameItemRow(item, pos); return addNameItemRow(item, pos);
} }
LLScrollListItem* LLNameListCtrl::addElement(const LLSD& element, EAddPosition pos, void* userdata) LLScrollListItem* LLNameListCtrl::addElement(const LLSD& element, EAddPosition pos, void* userdata)
......
...@@ -115,9 +115,9 @@ class LLNameListCtrl ...@@ -115,9 +115,9 @@ class LLNameListCtrl
public: public:
// Add a user to the list by name. It will be added, the name // Add a user to the list by name. It will be added, the name
// requested from the cache, and updated as necessary. // requested from the cache, and updated as necessary.
void addNameItem(const LLUUID& agent_id, EAddPosition pos = ADD_BOTTOM, LLScrollListItem* addNameItem(const LLUUID& agent_id, EAddPosition pos = ADD_BOTTOM,
BOOL enabled = TRUE, const std::string& suffix = LLStringUtil::null); BOOL enabled = TRUE, const std::string& suffix = LLStringUtil::null);
void addNameItem(NameItem& item, EAddPosition pos = ADD_BOTTOM); LLScrollListItem* addNameItem(NameItem& item, EAddPosition pos = ADD_BOTTOM);
/*virtual*/ LLScrollListItem* addElement(const LLSD& element, EAddPosition pos = ADD_BOTTOM, void* userdata = NULL); /*virtual*/ LLScrollListItem* addElement(const LLSD& element, EAddPosition pos = ADD_BOTTOM, void* userdata = NULL);
LLScrollListItem* addNameItemRow(const NameItem& value, EAddPosition pos = ADD_BOTTOM, const std::string& suffix = LLStringUtil::null); LLScrollListItem* addNameItemRow(const NameItem& value, EAddPosition pos = ADD_BOTTOM, const std::string& suffix = LLStringUtil::null);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment