CHUI-283: Refactor of how the layout is determined for LLFolderViewItem. Changed constant members that defined the layout to non-const member varaibles, which are populated using a .xml file.
parent
5cb0a62216
commit
381c13d0e5
|
|
@ -56,11 +56,7 @@
|
|||
const S32 RENAME_WIDTH_PAD = 4;
|
||||
const S32 RENAME_HEIGHT_PAD = 1;
|
||||
const S32 AUTO_OPEN_STACK_DEPTH = 16;
|
||||
const S32 MIN_ITEM_WIDTH_VISIBLE = LLFolderViewItem::ICON_WIDTH
|
||||
+ LLFolderViewItem::ICON_PAD
|
||||
+ LLFolderViewItem::ARROW_SIZE
|
||||
+ LLFolderViewItem::TEXT_PAD
|
||||
+ /*first few characters*/ 40;
|
||||
|
||||
const S32 MINIMUM_RENAMER_WIDTH = 80;
|
||||
|
||||
// *TODO: move in params in xml if necessary. Requires modification of LLFolderView & LLInventoryPanel Params.
|
||||
|
|
@ -211,10 +207,11 @@ LLFolderView::LLFolderView(const Params& p)
|
|||
// Textbox
|
||||
LLTextBox::Params text_p;
|
||||
LLFontGL* font = getLabelFontForStyle(mLabelStyle);
|
||||
LLRect new_r = LLRect(rect.mLeft + ICON_PAD,
|
||||
rect.mTop - TEXT_PAD,
|
||||
//mIconPad, mTextPad are set in folder_view_item.xml
|
||||
LLRect new_r = LLRect(rect.mLeft + mIconPad,
|
||||
rect.mTop - mTextPad,
|
||||
rect.mRight,
|
||||
rect.mTop - TEXT_PAD - font->getLineHeight());
|
||||
rect.mTop - mTextPad - font->getLineHeight());
|
||||
text_p.rect(new_r);
|
||||
text_p.name(std::string(p.name));
|
||||
text_p.font(font);
|
||||
|
|
@ -1652,12 +1649,13 @@ void LLFolderView::scrollToShowItem(LLFolderViewItem* item, const LLRect& constr
|
|||
S32 icon_height = mIcon.isNull() ? 0 : mIcon->getHeight();
|
||||
S32 label_height = getLabelFontForStyle(mLabelStyle)->getLineHeight();
|
||||
// when navigating with keyboard, only move top of opened folder on screen, otherwise show whole folder
|
||||
S32 max_height_to_show = item->isOpen() && mScrollContainer->hasFocus() ? (llmax( icon_height, label_height ) + ICON_PAD) : local_rect.getHeight();
|
||||
S32 max_height_to_show = item->isOpen() && mScrollContainer->hasFocus() ? (llmax( icon_height, label_height ) + item->getIconPad()) : local_rect.getHeight();
|
||||
|
||||
// get portion of item that we want to see...
|
||||
LLRect item_local_rect = LLRect(item->getIndentation(),
|
||||
local_rect.getHeight(),
|
||||
llmin(MIN_ITEM_WIDTH_VISIBLE, local_rect.getWidth()),
|
||||
//+32 is supposed to include few first characters
|
||||
llmin(item->getLabelXPos() + 32, local_rect.getWidth()),
|
||||
llmax(0, local_rect.getHeight() - max_height_to_show));
|
||||
|
||||
LLRect item_doc_rect;
|
||||
|
|
@ -1874,7 +1872,7 @@ void LLFolderView::updateRenamerPosition()
|
|||
if(mRenameItem)
|
||||
{
|
||||
// See also LLFolderViewItem::draw()
|
||||
S32 x = ARROW_SIZE + TEXT_PAD + ICON_WIDTH + ICON_PAD + mRenameItem->getIndentation();
|
||||
S32 x = mRenameItem->getLabelXPos();
|
||||
S32 y = mRenameItem->getRect().getHeight() - mRenameItem->getItemHeight() - RENAME_HEIGHT_PAD;
|
||||
mRenameItem->localPointToScreen( x, y, &x, &y );
|
||||
screenPointToLocal( x, y, &x, &y );
|
||||
|
|
|
|||
|
|
@ -90,7 +90,14 @@ LLFolderViewItem::Params::Params()
|
|||
item_height("item_height"),
|
||||
item_top_pad("item_top_pad"),
|
||||
creation_date(),
|
||||
allow_open("allow_open", true)
|
||||
allow_open("allow_open", true),
|
||||
left_pad("left_pad", 0),
|
||||
icon_pad("icon_pad", 0),
|
||||
icon_width("icon_width", 0),
|
||||
text_pad("text_pad", 0),
|
||||
text_pad_right("text_pad_right", 0),
|
||||
arrow_size("arrow_size", 0),
|
||||
max_folder_item_overlap("max_folder_item_overlap", 0)
|
||||
{}
|
||||
|
||||
// Default constructor
|
||||
|
|
@ -98,7 +105,7 @@ LLFolderViewItem::LLFolderViewItem(const LLFolderViewItem::Params& p)
|
|||
: LLView(p),
|
||||
mLabelWidth(0),
|
||||
mLabelWidthDirty(false),
|
||||
mLabelPaddingRight(DEFAULT_TEXT_PADDING_RIGHT),
|
||||
mLabelPaddingRight(DEFAULT_LABEL_PADDING_RIGHT),
|
||||
mParentFolder( NULL ),
|
||||
mIsSelected( FALSE ),
|
||||
mIsCurSelection( FALSE ),
|
||||
|
|
@ -114,7 +121,14 @@ LLFolderViewItem::LLFolderViewItem(const LLFolderViewItem::Params& p)
|
|||
mRoot(p.root),
|
||||
mViewModelItem(p.listener),
|
||||
mIsMouseOverTitle(false),
|
||||
mAllowOpen(p.allow_open)
|
||||
mAllowOpen(p.allow_open),
|
||||
mLeftPad(p.left_pad),
|
||||
mIconPad(p.icon_pad),
|
||||
mIconWidth(p.icon_width),
|
||||
mTextPad(p.text_pad),
|
||||
mTextPadRight(p.text_pad_right),
|
||||
mArrowSize(p.arrow_size),
|
||||
mMaxFolderItemOverlap(p.max_folder_item_overlap)
|
||||
{
|
||||
if (mViewModelItem)
|
||||
{
|
||||
|
|
@ -291,11 +305,11 @@ S32 LLFolderViewItem::arrange( S32* width, S32* height )
|
|||
: 0;
|
||||
if (mLabelWidthDirty)
|
||||
{
|
||||
mLabelWidth = ARROW_SIZE + TEXT_PAD + ICON_WIDTH + ICON_PAD + getLabelFontForStyle(mLabelStyle)->getWidth(mLabel) + getLabelFontForStyle(mLabelStyle)->getWidth(mLabelSuffix) + mLabelPaddingRight;
|
||||
mLabelWidth = getLabelXPos() + getLabelFontForStyle(mLabelStyle)->getWidth(mLabel) + getLabelFontForStyle(mLabelStyle)->getWidth(mLabelSuffix) + mLabelPaddingRight;
|
||||
mLabelWidthDirty = false;
|
||||
}
|
||||
|
||||
*width = llmax(*width, mLabelWidth + mIndentation);
|
||||
*width = llmax(*width, mLabelWidth);
|
||||
|
||||
// determine if we need to use ellipses to avoid horizontal scroll. EXT-719
|
||||
bool use_ellipses = getRoot()->getUseEllipses();
|
||||
|
|
@ -313,6 +327,21 @@ S32 LLFolderViewItem::getItemHeight()
|
|||
return mItemHeight;
|
||||
}
|
||||
|
||||
S32 LLFolderViewItem::getLabelXPos()
|
||||
{
|
||||
return getIndentation() + mArrowSize + mTextPad + mIconWidth + mIconPad;
|
||||
}
|
||||
|
||||
S32 LLFolderViewItem::getIconPad()
|
||||
{
|
||||
return mIconPad;
|
||||
}
|
||||
|
||||
S32 LLFolderViewItem::getTextPad()
|
||||
{
|
||||
return mTextPad;
|
||||
}
|
||||
|
||||
// *TODO: This can be optimized a lot by simply recording that it is
|
||||
// selected in the appropriate places, and assuming that set selection
|
||||
// means 'deselect' for a leaf item. Do this optimization after
|
||||
|
|
@ -734,8 +763,8 @@ void LLFolderViewItem::draw()
|
|||
{
|
||||
LLUIImage* arrow_image = default_params.folder_arrow_image;
|
||||
gl_draw_scaled_rotated_image(
|
||||
mIndentation, getRect().getHeight() - ARROW_SIZE - TEXT_PAD - TOP_PAD,
|
||||
ARROW_SIZE, ARROW_SIZE, mControlLabelRotation, arrow_image->getImage(), sFgColor);
|
||||
mIndentation, getRect().getHeight() - mArrowSize - mTextPad - TOP_PAD,
|
||||
mArrowSize, mArrowSize, mControlLabelRotation, arrow_image->getImage(), sFgColor);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -744,7 +773,7 @@ void LLFolderViewItem::draw()
|
|||
//--------------------------------------------------------------------------------//
|
||||
// Draw open icon
|
||||
//
|
||||
const S32 icon_x = mIndentation + ARROW_SIZE + TEXT_PAD;
|
||||
const S32 icon_x = mIndentation + mArrowSize + mTextPad;
|
||||
if (!mIconOpen.isNull() && (llabs(mControlLabelRotation) > 80)) // For open folders
|
||||
{
|
||||
mIconOpen->draw(icon_x, getRect().getHeight() - mIconOpen->getHeight() - TOP_PAD + 1);
|
||||
|
|
@ -769,8 +798,8 @@ void LLFolderViewItem::draw()
|
|||
|
||||
std::string::size_type filter_string_length = mViewModelItem->hasFilterStringMatch() ? mViewModelItem->getFilterStringSize() : 0;
|
||||
F32 right_x = 0;
|
||||
F32 y = (F32)getRect().getHeight() - font->getLineHeight() - (F32)TEXT_PAD - (F32)TOP_PAD;
|
||||
F32 text_left = (F32)(ARROW_SIZE + TEXT_PAD + ICON_WIDTH + ICON_PAD + mIndentation);
|
||||
F32 y = (F32)getRect().getHeight() - font->getLineHeight() - (F32)mTextPad - (F32)TOP_PAD;
|
||||
F32 text_left = (F32)getLabelXPos();
|
||||
std::string combined_string = mLabel + mLabelSuffix;
|
||||
|
||||
if (filter_string_length > 0)
|
||||
|
|
@ -804,11 +833,15 @@ void LLFolderViewItem::draw()
|
|||
if (filter_string_length > 0)
|
||||
{
|
||||
F32 match_string_left = text_left + font->getWidthF32(combined_string, 0, mViewModelItem->getFilterStringOffset());
|
||||
F32 yy = (F32)getRect().getHeight() - font->getLineHeight() - (F32)TEXT_PAD - (F32)TOP_PAD;
|
||||
F32 yy = (F32)getRect().getHeight() - font->getLineHeight() - (F32)mTextPad - (F32)TOP_PAD;
|
||||
font->renderUTF8( combined_string, mViewModelItem->getFilterStringOffset(), match_string_left, yy,
|
||||
sFilterTextColor, LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW,
|
||||
filter_string_length, S32_MAX, &right_x, FALSE );
|
||||
}
|
||||
|
||||
//Gilbert Linden 9-20-2012: Although this should be legal, removing it because it causes the mLabelSuffix rendering to
|
||||
//be distorted...oddly. I initially added this in but didn't need it after all. So removing to prevent unnecessary bug.
|
||||
//LLView::draw();
|
||||
}
|
||||
|
||||
const LLFolderViewModelInterface* LLFolderViewItem::getFolderViewModel( void ) const
|
||||
|
|
@ -984,7 +1017,7 @@ S32 LLFolderViewFolder::arrange( S32* width, S32* height )
|
|||
folders_t::iterator fit = iter++;
|
||||
// number of pixels that bottom of folder label is from top of parent folder
|
||||
if (getRect().getHeight() - (*fit)->getRect().mTop + (*fit)->getItemHeight()
|
||||
> llround(mCurHeight) + MAX_FOLDER_ITEM_OVERLAP)
|
||||
> llround(mCurHeight) + mMaxFolderItemOverlap)
|
||||
{
|
||||
// hide if beyond current folder height
|
||||
(*fit)->setVisible(FALSE);
|
||||
|
|
@ -997,7 +1030,7 @@ S32 LLFolderViewFolder::arrange( S32* width, S32* height )
|
|||
items_t::iterator iit = iter++;
|
||||
// number of pixels that bottom of item label is from top of parent folder
|
||||
if (getRect().getHeight() - (*iit)->getRect().mBottom
|
||||
> llround(mCurHeight) + MAX_FOLDER_ITEM_OVERLAP)
|
||||
> llround(mCurHeight) + mMaxFolderItemOverlap)
|
||||
{
|
||||
(*iit)->setVisible(FALSE);
|
||||
}
|
||||
|
|
@ -1757,7 +1790,7 @@ BOOL LLFolderViewFolder::handleMouseDown( S32 x, S32 y, MASK mask )
|
|||
}
|
||||
if( !handled )
|
||||
{
|
||||
if(mIndentation < x && x < mIndentation + ARROW_SIZE + TEXT_PAD)
|
||||
if(mIndentation < x && x < mIndentation + mArrowSize + mTextPad)
|
||||
{
|
||||
toggleOpen();
|
||||
handled = TRUE;
|
||||
|
|
@ -1781,7 +1814,7 @@ BOOL LLFolderViewFolder::handleDoubleClick( S32 x, S32 y, MASK mask )
|
|||
}
|
||||
if( !handled )
|
||||
{
|
||||
if(mIndentation < x && x < mIndentation + ARROW_SIZE + TEXT_PAD)
|
||||
if(mIndentation < x && x < mIndentation + mArrowSize + mTextPad)
|
||||
{
|
||||
// don't select when user double-clicks plus sign
|
||||
// so as not to contradict single-click behavior
|
||||
|
|
|
|||
|
|
@ -60,18 +60,18 @@ public:
|
|||
Optional<time_t> creation_date;
|
||||
Optional<bool> allow_open;
|
||||
|
||||
Optional<S32> left_pad,
|
||||
icon_pad,
|
||||
icon_width,
|
||||
text_pad,
|
||||
text_pad_right,
|
||||
arrow_size,
|
||||
max_folder_item_overlap;
|
||||
Params();
|
||||
};
|
||||
|
||||
// layout constants
|
||||
static const S32 LEFT_PAD = 5,
|
||||
ICON_PAD = 2,
|
||||
ICON_WIDTH = 16,
|
||||
TEXT_PAD = 1,
|
||||
DEFAULT_TEXT_PADDING_RIGHT = 4,
|
||||
ARROW_SIZE = 12,
|
||||
MAX_FOLDER_ITEM_OVERLAP = 2;
|
||||
|
||||
|
||||
static const S32 DEFAULT_LABEL_PADDING_RIGHT = 4;
|
||||
// animation parameters
|
||||
static const F32 FOLDER_CLOSE_TIME_CONSTANT,
|
||||
FOLDER_OPEN_TIME_CONSTANT;
|
||||
|
|
@ -99,6 +99,14 @@ protected:
|
|||
S32 mDragStartX,
|
||||
mDragStartY;
|
||||
|
||||
S32 mLeftPad,
|
||||
mIconPad,
|
||||
mIconWidth,
|
||||
mTextPad,
|
||||
mTextPadRight,
|
||||
mArrowSize,
|
||||
mMaxFolderItemOverlap;
|
||||
|
||||
F32 mControlLabelRotation;
|
||||
LLFolderView* mRoot;
|
||||
bool mHasVisibleChildren,
|
||||
|
|
@ -136,6 +144,9 @@ public:
|
|||
// makes sure that this view and it's children are the right size.
|
||||
virtual S32 arrange( S32* width, S32* height );
|
||||
virtual S32 getItemHeight();
|
||||
virtual S32 getLabelXPos();
|
||||
S32 getIconPad();
|
||||
S32 getTextPad();
|
||||
|
||||
// If 'selection' is 'this' then note that otherwise ignore.
|
||||
// Returns TRUE if this item ends up being selected.
|
||||
|
|
|
|||
|
|
@ -109,8 +109,8 @@ void LLConversationViewSession::draw()
|
|||
{
|
||||
LLUIImage* arrow_image = default_params.folder_arrow_image;
|
||||
gl_draw_scaled_rotated_image(
|
||||
mIndentation, getRect().getHeight() - ARROW_SIZE - TEXT_PAD - TOP_PAD,
|
||||
ARROW_SIZE, ARROW_SIZE, mControlLabelRotation, arrow_image->getImage(), sFgColor);
|
||||
mIndentation, getRect().getHeight() - mArrowSize - mTextPad - TOP_PAD,
|
||||
mArrowSize, mArrowSize, mControlLabelRotation, arrow_image->getImage(), sFgColor);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -227,7 +227,7 @@ void LLConversationViewSession::draw()
|
|||
// virtual
|
||||
S32 LLConversationViewSession::arrange(S32* width, S32* height)
|
||||
{
|
||||
LLRect rect(getIndentation() + ARROW_SIZE,
|
||||
LLRect rect(getIndentation() + mArrowSize,
|
||||
getLocalRect().mTop,
|
||||
getLocalRect().mRight,
|
||||
getLocalRect().mTop - getItemHeight());
|
||||
|
|
@ -336,7 +336,7 @@ void LLConversationViewParticipant::initFromParams(const LLConversationViewParti
|
|||
applyXUILayout(avatar_icon_params, this);
|
||||
LLAvatarIconCtrl * avatarIcon = LLUICtrlFactory::create<LLAvatarIconCtrl>(avatar_icon_params);
|
||||
addChild(avatarIcon);
|
||||
|
||||
|
||||
LLButton::Params info_button_params(params.info_button());
|
||||
applyXUILayout(info_button_params, this);
|
||||
LLButton * button = LLUICtrlFactory::create<LLButton>(info_button_params);
|
||||
|
|
@ -381,16 +381,11 @@ void LLConversationViewParticipant::draw()
|
|||
const BOOL show_context = (getRoot() ? getRoot()->getShowSelectionContext() : FALSE);
|
||||
const BOOL filled = show_context || (getRoot() ? getRoot()->getParentPanel()->hasFocus() : FALSE); // If we have keyboard focus, draw selection filled
|
||||
|
||||
const LLFolderViewItem::Params& default_params = LLUICtrlFactory::getDefaultParams<LLFolderViewItem>();
|
||||
const S32 TOP_PAD = default_params.item_top_pad;
|
||||
|
||||
const LLFontGL* font = getLabelFontForStyle(mLabelStyle);
|
||||
F32 right_x = 0;
|
||||
|
||||
//TEXT_PAD, TOP_PAD, ICON_PAD and mIndentation are temporary values and will non-const eventually since they don't
|
||||
//apply to every single layout
|
||||
F32 y = (F32)getRect().getHeight() - font->getLineHeight() - (F32)TEXT_PAD - (F32)TOP_PAD;
|
||||
F32 text_left = (F32)(mAvatarIcon->getRect().mRight + ICON_PAD + mIndentation);
|
||||
F32 y = (F32)getRect().getHeight() - font->getLineHeight() - (F32)mTextPad;
|
||||
F32 text_left = (F32)getLabelXPos();
|
||||
LLColor4 color = (mIsSelected && filled) ? sHighlightFgColor : sFgColor;
|
||||
|
||||
drawHighlight(show_context, filled, sHighlightBgColor, sFocusOutlineColor, sMouseOverColor);
|
||||
|
|
@ -448,6 +443,11 @@ void LLConversationViewParticipant::onMouseLeave(S32 x, S32 y, MASK mask)
|
|||
LLFolderViewItem::onMouseEnter(x, y, mask);
|
||||
}
|
||||
|
||||
S32 LLConversationViewParticipant::getLabelXPos()
|
||||
{
|
||||
return mAvatarIcon->getRect().mRight + mIconPad;
|
||||
}
|
||||
|
||||
// static
|
||||
void LLConversationViewParticipant::initChildrenWidths(LLConversationViewParticipant* self)
|
||||
{
|
||||
|
|
@ -465,7 +465,7 @@ void LLConversationViewParticipant::initChildrenWidths(LLConversationViewPartici
|
|||
|
||||
void LLConversationViewParticipant::computeLabelRightPadding()
|
||||
{
|
||||
mLabelPaddingRight = DEFAULT_TEXT_PADDING_RIGHT;
|
||||
mLabelPaddingRight = DEFAULT_LABEL_PADDING_RIGHT;
|
||||
LLView* control;
|
||||
S32 ctrl_width;
|
||||
|
||||
|
|
|
|||
|
|
@ -101,6 +101,8 @@ public:
|
|||
void onMouseEnter(S32 x, S32 y, MASK mask);
|
||||
void onMouseLeave(S32 x, S32 y, MASK mask);
|
||||
|
||||
/*virtual*/ S32 getLabelXPos();
|
||||
|
||||
protected:
|
||||
friend class LLUICtrlFactory;
|
||||
LLConversationViewParticipant( const Params& p );
|
||||
|
|
|
|||
|
|
@ -20,6 +20,13 @@
|
|||
folder_indentation="8"
|
||||
item_height="20"
|
||||
item_top_pad="4"
|
||||
selection_image="Rounded_Square"/>
|
||||
selection_image="Rounded_Square"
|
||||
left_pad="5"
|
||||
icon_pad="2"
|
||||
icon_width="16"
|
||||
text_pad="1"
|
||||
text_pad_right="4"
|
||||
arrow_size="12"
|
||||
max_folder_item_overlap="2"/>
|
||||
<item allow_open="false"/>
|
||||
</inventory_panel>
|
||||
|
|
|
|||
|
|
@ -1,12 +1,19 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<conversation_view_participant
|
||||
folder_arrow_image="ForSale_Badge"
|
||||
folder_arrow_image="Folder_Arrow"
|
||||
folder_indentation="0"
|
||||
item_height="24"
|
||||
item_top_pad="4"
|
||||
item_top_pad="0"
|
||||
selection_image="Rounded_Square"
|
||||
mouse_opaque="true"
|
||||
follows="left|top|right"
|
||||
left_pad="0"
|
||||
icon_pad="10"
|
||||
icon_width="20"
|
||||
text_pad="7"
|
||||
text_pad_right="4"
|
||||
arrow_size="12"
|
||||
max_folder_item_overlap="2"
|
||||
>
|
||||
<avatar_icon
|
||||
follows="left"
|
||||
|
|
|
|||
|
|
@ -6,4 +6,11 @@
|
|||
item_top_pad="4"
|
||||
selection_image="Rounded_Square"
|
||||
mouse_opaque="true"
|
||||
follows="left|top|right"/>
|
||||
follows="left|top|right"
|
||||
left_pad="5"
|
||||
icon_pad="2"
|
||||
icon_width="16"
|
||||
text_pad="1"
|
||||
text_pad_right="4"
|
||||
arrow_size="12"
|
||||
max_folder_item_overlap="2"/>
|
||||
|
|
|
|||
|
|
@ -7,4 +7,10 @@
|
|||
selection_image="Rounded_Square"
|
||||
mouse_opaque="true"
|
||||
follows="left|top|right"
|
||||
/>
|
||||
left_pad="5"
|
||||
icon_pad="2"
|
||||
icon_width="16"
|
||||
text_pad="1"
|
||||
text_pad_right="4"
|
||||
arrow_size="12"
|
||||
max_folder_item_overlap="2"/>
|
||||
|
|
|
|||
|
|
@ -5,7 +5,13 @@
|
|||
item_height="20"
|
||||
item_top_pad="4"
|
||||
selection_image="Rounded_Square"
|
||||
>
|
||||
left_pad="5"
|
||||
icon_pad="2"
|
||||
icon_width="16"
|
||||
text_pad="1"
|
||||
text_pad_right="4"
|
||||
arrow_size="12"
|
||||
max_folder_item_overlap="2">
|
||||
<new_badge
|
||||
label="New"
|
||||
label_offset_horiz="-1"
|
||||
|
|
|
|||
Loading…
Reference in New Issue