SL-6109 New cell type with icon and text (and 1 pixel offset for all text cells)

meow-7.2.2
andreykproductengine 2019-09-19 16:57:22 +03:00 committed by Andrey Kleshchev
parent 1702a65665
commit 31e0cefb6c
2 changed files with 169 additions and 6 deletions

View File

@ -50,6 +50,10 @@ LLScrollListCell* LLScrollListCell::create(const LLScrollListCell::Params& cell_
{
cell = new LLScrollListDate(cell_p);
}
else if (cell_p.type() == "icontext")
{
cell = new LLScrollListIconText(cell_p);
}
else // default is "text"
{
cell = new LLScrollListText(cell_p);
@ -168,7 +172,7 @@ U32 LLScrollListText::sCount = 0;
LLScrollListText::LLScrollListText(const LLScrollListCell::Params& p)
: LLScrollListCell(p),
mText(p.value().asString()),
mText(p.text.isProvided() ? p.text() : p.value().asString()),
mFont(p.font),
mColor(p.color),
mUseColor(p.color.isProvided()),
@ -296,7 +300,7 @@ void LLScrollListText::draw(const LLColor4& color, const LLColor4& highlight_col
switch(mFontAlignment)
{
case LLFontGL::LEFT:
left = mFont->getWidth(mText.getString(), 0, mHighlightOffset);
left = mFont->getWidth(mText.getString(), 1, mHighlightOffset);
break;
case LLFontGL::RIGHT:
left = getWidth() - mFont->getWidth(mText.getString(), mHighlightOffset, S32_MAX);
@ -319,7 +323,7 @@ void LLScrollListText::draw(const LLColor4& color, const LLColor4& highlight_col
switch(mFontAlignment)
{
case LLFontGL::LEFT:
start_x = 0.f;
start_x = 1.f;
break;
case LLFontGL::RIGHT:
start_x = (F32)getWidth();
@ -435,3 +439,139 @@ const LLSD LLScrollListDate::getValue() const
{
return mDate;
}
//
// LLScrollListIconText
//
LLScrollListIconText::LLScrollListIconText(const LLScrollListCell::Params& p)
: LLScrollListText(p),
mIcon(p.value().isUUID() ? LLUI::getUIImageByID(p.value().asUUID()) : LLUI::getUIImage(p.value().asString())),
mPad(4)
{
mTextWidth = getWidth() - mPad /*padding*/ - mFont->getLineHeight();
}
LLScrollListIconText::~LLScrollListIconText()
{
}
const LLSD LLScrollListIconText::getValue() const
{
if (mIcon.isNull())
{
return LLStringUtil::null;
}
return mIcon->getName();
}
void LLScrollListIconText::setValue(const LLSD& value)
{
if (value.isUUID())
{
// don't use default image specified by LLUUID::null, use no image in that case
LLUUID image_id = value.asUUID();
mIcon = image_id.notNull() ? LLUI::getUIImageByID(image_id) : LLUIImagePtr(NULL);
}
else
{
std::string value_string = value.asString();
if (LLUUID::validate(value_string))
{
setValue(LLUUID(value_string));
}
else if (!value_string.empty())
{
mIcon = LLUI::getUIImage(value.asString());
}
else
{
mIcon = NULL;
}
}
}
void LLScrollListIconText::setWidth(S32 width)
{
LLScrollListCell::setWidth(width);
// Assume that iamge height and width is identical to font height and width
mTextWidth = width - mPad /*padding*/ - mFont->getLineHeight();
}
void LLScrollListIconText::draw(const LLColor4& color, const LLColor4& highlight_color) const
{
LLColor4 display_color;
if (mUseColor)
{
display_color = mColor;
}
else
{
display_color = color;
}
S32 icon_height = mFont->getLineHeight();
S32 icon_space = mIcon ? (icon_height + mPad) : 0;
if (mHighlightCount > 0)
{
S32 left = 0;
switch (mFontAlignment)
{
case LLFontGL::LEFT:
left = mFont->getWidth(mText.getString(), icon_space + 1, mHighlightOffset);
break;
case LLFontGL::RIGHT:
left = getWidth() - mFont->getWidth(mText.getString(), mHighlightOffset, S32_MAX) - icon_space;
break;
case LLFontGL::HCENTER:
left = (getWidth() - mFont->getWidth(mText.getString()) - icon_space) / 2;
break;
}
LLRect highlight_rect(left - 2,
mFont->getLineHeight() + 1,
left + mFont->getWidth(mText.getString(), mHighlightOffset, mHighlightCount) + 1,
1);
mRoundedRectImage->draw(highlight_rect, highlight_color);
}
// Try to draw the entire string
F32 right_x;
U32 string_chars = mText.length();
F32 start_text_x = 0.f;
S32 start_icon_x = 0;
switch (mFontAlignment)
{
case LLFontGL::LEFT:
start_text_x = icon_space + 1;
start_icon_x = 1;
break;
case LLFontGL::RIGHT:
start_text_x = (F32)getWidth();
start_icon_x = getWidth() - mFont->getWidth(mText.getString()) - icon_space;
break;
case LLFontGL::HCENTER:
F32 center = (F32)getWidth()* 0.5f;
start_text_x = center + ((F32)icon_space * 0.5f);
start_icon_x = center - (((F32)icon_space + mFont->getWidth(mText.getString())) * 0.5f);
break;
}
mFont->render(mText.getWString(), 0,
start_text_x, 0.f,
display_color,
mFontAlignment,
LLFontGL::BOTTOM,
0,
LLFontGL::NO_SHADOW,
string_chars,
getTextWidth(),
&right_x,
TRUE);
if (mIcon)
{
mIcon->draw(start_icon_x, 0, icon_height, icon_height, mColor);
}
}

View File

@ -59,7 +59,8 @@ public:
visible;
Optional<void*> userdata;
Optional<LLSD> value;
Optional<LLSD> value; // state of checkbox, icon id/name, date
Optional<std::string> text; // description or text
Optional<std::string> tool_tip;
Optional<const LLFontGL*> font;
@ -152,7 +153,7 @@ public:
void setText(const LLStringExplicit& text);
void setFontStyle(const U8 font_style);
private:
protected:
LLUIString mText;
S32 mTextWidth;
const LLFontGL* mFont;
@ -169,7 +170,7 @@ private:
};
/*
* Cell displaying an image.
* Cell displaying an image. AT the moment, this is specifically UI image
*/
class LLScrollListIcon : public LLScrollListCell
{
@ -223,4 +224,26 @@ private:
LLDate mDate;
};
/*
* Cell displaying icon and text.
*/
class LLScrollListIconText : public LLScrollListText
{
public:
LLScrollListIconText(const LLScrollListCell::Params& p);
/*virtual*/ ~LLScrollListIconText();
/*virtual*/ void draw(const LLColor4& color, const LLColor4& highlight_color) const;
/*virtual*/ const LLSD getValue() const;
/*virtual*/ void setValue(const LLSD& value);
S32 getIconWidth() const;
/*virtual*/ void setWidth(S32 width);/* { LLScrollListCell::setWidth(width); mTextWidth = width - ; }*/
private:
LLPointer<LLUIImage> mIcon;
S32 mPad;
};
#endif