# Conflicts:
#	indra/llui/llconsole.cpp
#	indra/llui/llcontainerview.cpp
#	indra/llui/llcontainerview.h
#	indra/newview/llpaneleditwearable.cpp
#	indra/newview/llpanelface.cpp
#	indra/newview/llpanelface.h
#	indra/newview/llpanelmaininventory.cpp
#	indra/newview/llpaneloutfitedit.cpp
#	indra/newview/llpaneloutfitedit.h
#	indra/newview/llpanelpeople.cpp
#	indra/newview/llwearableitemslist.cpp
#	indra/newview/llworldmapview.cpp
master
Ansariel 2024-07-26 14:28:51 +02:00
commit 9e0164e4fc
46 changed files with 536 additions and 490 deletions

View File

@ -432,7 +432,8 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons
// recursively render ellipses at end of string
// we've already reserved enough room
gGL.pushUIMatrix();
renderUTF8(std::string("..."),
static LLWString elipses_wstr(utf8string_to_wstring(std::string("...")));
render(elipses_wstr,
0,
(cur_x - origin.mV[VX]) / sScaleX, (F32)y,
color,

View File

@ -243,8 +243,6 @@ void LLBadge::draw()
// Calculate badge size based on label text
//
LLWString badge_label_wstring = mLabel;
S32 badge_label_begin_offset = 0;
S32 badge_char_length = S32_MAX;
S32 badge_pixel_length = S32_MAX;
@ -252,7 +250,7 @@ void LLBadge::draw()
bool do_not_use_ellipses = false;
F32 badge_width = (2.0f * mPaddingHoriz) +
mGLFont->getWidthF32(badge_label_wstring.c_str(), badge_label_begin_offset, badge_char_length);
mGLFont->getWidthF32(mLabel.getWString().c_str(), badge_label_begin_offset, badge_char_length);
F32 badge_height = (2.0f * mPaddingVert) + mGLFont->getLineHeight();
@ -366,7 +364,7 @@ void LLBadge::draw()
// Draw the label
//
mGLFont->render(badge_label_wstring,
mGLFont->render(mLabel.getWString(),
badge_label_begin_offset,
badge_center_x + mLabelOffsetHoriz,
badge_center_y + mLabelOffsetVert,

View File

@ -860,9 +860,6 @@ void LLButton::draw()
if( ll::ui::SearchableControl::getHighlighted() )
label_color = ll::ui::SearchableControl::getHighlightColor();
// Unselected label assignments
LLWString label = getCurrentLabel();
// overlay with keyboard focus border
if (hasFocus())
{
@ -993,8 +990,9 @@ void LLButton::draw()
}
// Draw label
if( !label.empty() )
if( !getCurrentLabel().empty() ) // Unselected label assignments
{
LLWString label = getCurrentLabel();
LLWStringUtil::trim(label);
S32 x;
@ -1157,10 +1155,10 @@ void LLButton::autoResize()
resize(getCurrentLabel());
}
void LLButton::resize(LLUIString label)
void LLButton::resize(const LLUIString& label)
{
// get label length
S32 label_width = mGLFont->getWidth(label.getString());
S32 label_width = mGLFont->getWidth(label.getWString().c_str());
// get current btn length
S32 btn_width =getRect().getWidth();
// check if it need resize

View File

@ -249,7 +249,7 @@ public:
void setImageOverlaySelectedColor(const LLColor4& color) { mImageOverlaySelectedColor = color; }
void autoResize(); // resize with label of current btn state
void resize(LLUIString label); // resize with label input
void resize(const LLUIString& label); // resize with label input
void setLabel(const std::string& label);
void setLabel(const LLUIString& label);
void setLabel( const LLStringExplicit& label);

View File

@ -222,7 +222,7 @@ void LLConsole::draw()
//static LLCachedControl<F32> console_bg_opacity(*LLUI::getInstance()->mSettingGroups["config"], "ConsoleBackgroundOpacity", 0.7f);
//F32 console_opacity = llclamp(console_bg_opacity(), 0.f, 1.f);
//LLColor4 color = LLUIColorTable::instance().getColor("ConsoleBackground");
//static LLColor4 color = LLUIColorTable::instance().getColor("ConsoleBackground");
//color.mV[VALPHA] *= console_opacity;
//F32 line_height = (F32)mFont->getLineHeight();

View File

@ -46,7 +46,7 @@ static ContainerViewRegistry::Register<LLPanel> r3("panel", &LLPanel::fromXML);
LLContainerView::LLContainerView(const LLContainerView::Params& p)
: LLView(p),
mShowLabel(p.show_label),
mLabel(p.label),
mLabel(utf8str_to_wstring(p.label)),
// <FS:Zi> Add background visible flag and color to container_view so we can have blank scrollview containers
mBackgroundVisible(p.background_visible),
mBackgroundColor(p.bg_color),
@ -128,8 +128,8 @@ void LLContainerView::draw()
// Draw the label
if (mShowLabel)
{
LLFontGL::getFontMonospace()->renderUTF8(
mLabel, 0, 2, getRect().getHeight() - 2, LLColor4(1,1,1,1), LLFontGL::LEFT, LLFontGL::TOP);
LLFontGL::getFontMonospace()->render(
mLabel, 0, 2.f, (F32)(getRect().getHeight() - 2), LLColor4(1,1,1,1), LLFontGL::LEFT, LLFontGL::TOP);
}
LLView::draw();
@ -293,7 +293,7 @@ LLRect LLContainerView::getRequiredRect()
void LLContainerView::setLabel(const std::string& label)
{
mLabel = label;
mLabel = utf8str_to_wstring(label);
}
void LLContainerView::setDisplayChildren(bool displayChildren)

View File

@ -97,7 +97,7 @@ public:
protected:
bool mDisplayChildren;
std::string mLabel;
LLWString mLabel;
// <FS:Zi> Add background visible flag and color to container_view so we can have blank scrollview containers
bool mBackgroundVisible;
LLUIColor mBackgroundColor;

View File

@ -215,7 +215,7 @@ LLFolderView::LLFolderView(const Params& p)
//clear label
// go ahead and render root folder as usual
// just make sure the label ("Inventory Folder") never shows up
mLabel = LLStringUtil::null;
mLabel.clear();
// Escape is handled by reverting the rename, not commiting it (default behavior)
LLLineEditor::Params params;

View File

@ -147,7 +147,7 @@ LLFolderViewItem::LLFolderViewItem(const LLFolderViewItem::Params& p)
mItemHeight(p.item_height),
mControlLabelRotation(0.f),
mDragAndDropTarget(false),
mLabel(p.name),
mLabel(utf8str_to_wstring(p.name)),
mRoot(p.root),
mViewModelItem(p.listener),
mIsMouseOverTitle(false),
@ -212,7 +212,7 @@ bool LLFolderViewItem::postBuild()
{
// getDisplayName() is expensive (due to internal getLabelSuffix() and name building)
// it also sets search strings so it requires a filter reset
mLabel = vmi->getDisplayName();
mLabel = utf8str_to_wstring(vmi->getDisplayName());
setToolTip(vmi->getName());
// Dirty the filter flag of the model from the view (CHUI-849)
@ -325,7 +325,7 @@ void LLFolderViewItem::refresh()
{
LLFolderViewModelItem& vmi = *getViewModelItem();
mLabel = vmi.getDisplayName();
mLabel = utf8str_to_wstring(vmi.getDisplayName());
setToolTip(vmi.getName());
// icons are slightly expensive to get, can be optimized
// see LLInventoryIcon::getIcon()
@ -338,7 +338,7 @@ void LLFolderViewItem::refresh()
// Very Expensive!
// Can do a number of expensive checks, like checking active motions, wearables or friend list
mLabelStyle = vmi.getLabelStyle();
mLabelSuffix = vmi.getLabelSuffix();
mLabelSuffix = utf8str_to_wstring(vmi.getLabelSuffix());
}
// Dirty the filter flag of the model from the view (CHUI-849)
@ -363,7 +363,7 @@ void LLFolderViewItem::refreshSuffix()
// Very Expensive!
// Can do a number of expensive checks, like checking active motions, wearables or friend list
mLabelStyle = vmi->getLabelStyle();
mLabelSuffix = vmi->getLabelSuffix();
mLabelSuffix = utf8str_to_wstring(vmi->getLabelSuffix());
}
mLabelWidthDirty = true;
@ -442,7 +442,7 @@ S32 LLFolderViewItem::arrange( S32* width, S32* height )
// it is purely visual, so it is fine to do at our laisure
refreshSuffix();
}
mLabelWidth = getLabelXPos() + getLabelFontForStyle(mLabelStyle)->getWidth(mLabel) + getLabelFontForStyle(LLFontGL::NORMAL)->getWidth(mLabelSuffix) + mLabelPaddingRight;
mLabelWidth = getLabelXPos() + getLabelFontForStyle(mLabelStyle)->getWidth(mLabel.c_str()) + getLabelFontForStyle(LLFontGL::NORMAL)->getWidth(mLabelSuffix.c_str()) + mLabelPaddingRight;
mLabelWidthDirty = false;
}
@ -959,7 +959,7 @@ void LLFolderViewItem::drawLabel(const LLFontGL * font, const F32 x, const F32 y
//--------------------------------------------------------------------------------//
// Draw the actual label text
//
font->renderUTF8(mLabel, 0, x, y, color,
font->render(mLabel, 0, x, y, color,
LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW,
S32_MAX, getRect().getWidth() - (S32) x - mLabelPaddingRight, &right_x, /*use_ellipses*/true);
}
@ -1015,7 +1015,7 @@ void LLFolderViewItem::draw()
F32 right_x = 0;
F32 y = (F32)getRect().getHeight() - font->getLineHeight() - (F32)mTextPad - (F32)TOP_PAD;
F32 text_left = (F32)getLabelXPos();
std::string combined_string = mLabel + mLabelSuffix;
LLWString combined_string = mLabel + mLabelSuffix;
const LLFontGL* suffix_font = getLabelFontForStyle(LLFontGL::NORMAL);
S32 filter_offset = static_cast<S32>(mViewModelItem->getFilterStringOffset());
@ -1025,8 +1025,8 @@ void LLFolderViewItem::draw()
S32 top = getRect().getHeight() - TOP_PAD;
if(mLabelSuffix.empty() || (font == suffix_font))
{
S32 left = ll_round(text_left) + font->getWidth(combined_string, 0, static_cast<S32>(mViewModelItem->getFilterStringOffset())) - 2;
S32 right = left + font->getWidth(combined_string, static_cast<S32>(mViewModelItem->getFilterStringOffset()), filter_string_length) + 2;
S32 left = ll_round(text_left) + font->getWidth(combined_string.c_str(), 0, static_cast<S32>(mViewModelItem->getFilterStringOffset())) - 2;
S32 right = left + font->getWidth(combined_string.c_str(), static_cast<S32>(mViewModelItem->getFilterStringOffset()), filter_string_length) + 2;
LLUIImage* box_image = default_params.selection_image;
LLRect box_rect(left, top, right, bottom);
@ -1037,8 +1037,8 @@ void LLFolderViewItem::draw()
S32 label_filter_length = llmin((S32)mLabel.size() - filter_offset, (S32)filter_string_length);
if(label_filter_length > 0)
{
S32 left = (S32)(ll_round(text_left) + font->getWidthF32(mLabel, 0, llmin(filter_offset, (S32)mLabel.size()))) - 2;
S32 right = left + (S32)font->getWidthF32(mLabel, filter_offset, label_filter_length) + 2;
S32 left = (S32)(ll_round(text_left) + font->getWidthF32(mLabel.c_str(), 0, llmin(filter_offset, (S32)mLabel.size()))) - 2;
S32 right = left + (S32)font->getWidthF32(mLabel.c_str(), filter_offset, label_filter_length) + 2;
LLUIImage* box_image = default_params.selection_image;
LLRect box_rect(left, top, right, bottom);
box_image->draw(box_rect, sFilterBGColor);
@ -1047,8 +1047,8 @@ void LLFolderViewItem::draw()
if(suffix_filter_length > 0)
{
S32 suffix_offset = llmax(0, filter_offset - (S32)mLabel.size());
S32 left = (S32)(ll_round(text_left) + font->getWidthF32(mLabel, 0, static_cast<S32>(mLabel.size())) + suffix_font->getWidthF32(mLabelSuffix, 0, suffix_offset))- 2;
S32 right = left + (S32)suffix_font->getWidthF32(mLabelSuffix, suffix_offset, suffix_filter_length) + 2;
S32 left = (S32)(ll_round(text_left) + font->getWidthF32(mLabel.c_str(), 0, static_cast<S32>(mLabel.size())) + suffix_font->getWidthF32(mLabelSuffix.c_str(), 0, suffix_offset)) - 2;
S32 right = left + (S32)suffix_font->getWidthF32(mLabelSuffix.c_str(), suffix_offset, suffix_filter_length) + 2;
LLUIImage* box_image = default_params.selection_image;
LLRect box_rect(left, top, right, bottom);
box_image->draw(box_rect, sFilterBGColor);
@ -1090,7 +1090,7 @@ void LLFolderViewItem::draw()
//
if (!mLabelSuffix.empty())
{
suffix_font->renderUTF8( mLabelSuffix, 0, right_x, y, isFadeItem() ? color : (LLColor4)sSuffixColor,
suffix_font->render( mLabelSuffix, 0, right_x, y, isFadeItem() ? color : (LLColor4)sSuffixColor,
LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW,
S32_MAX, S32_MAX, &right_x);
}
@ -1102,9 +1102,9 @@ void LLFolderViewItem::draw()
{
if(mLabelSuffix.empty() || (font == suffix_font))
{
F32 match_string_left = text_left + font->getWidthF32(combined_string, 0, filter_offset + filter_string_length) - font->getWidthF32(combined_string, filter_offset, filter_string_length);
F32 match_string_left = text_left + font->getWidthF32(combined_string.c_str(), 0, filter_offset + filter_string_length) - font->getWidthF32(combined_string.c_str(), filter_offset, filter_string_length);
F32 yy = (F32)getRect().getHeight() - font->getLineHeight() - (F32)mTextPad - (F32)TOP_PAD;
font->renderUTF8(combined_string, filter_offset, match_string_left, yy,
font->render(combined_string, filter_offset, match_string_left, yy,
sFilterTextColor, LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW,
filter_string_length, S32_MAX, &right_x);
}
@ -1113,9 +1113,9 @@ void LLFolderViewItem::draw()
S32 label_filter_length = llmin((S32)mLabel.size() - filter_offset, (S32)filter_string_length);
if(label_filter_length > 0)
{
F32 match_string_left = text_left + font->getWidthF32(mLabel, 0, filter_offset + label_filter_length) - font->getWidthF32(mLabel, filter_offset, label_filter_length);
F32 match_string_left = text_left + font->getWidthF32(mLabel.c_str(), 0, filter_offset + label_filter_length) - font->getWidthF32(mLabel.c_str(), filter_offset, label_filter_length);
F32 yy = (F32)getRect().getHeight() - font->getLineHeight() - (F32)mTextPad - (F32)TOP_PAD;
font->renderUTF8(mLabel, filter_offset, match_string_left, yy,
font->render(mLabel, filter_offset, match_string_left, yy,
sFilterTextColor, LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW,
label_filter_length, S32_MAX, &right_x);
}
@ -1124,9 +1124,9 @@ void LLFolderViewItem::draw()
if(suffix_filter_length > 0)
{
S32 suffix_offset = llmax(0, filter_offset - (S32)mLabel.size());
F32 match_string_left = text_left + font->getWidthF32(mLabel, 0, static_cast<S32>(mLabel.size())) + suffix_font->getWidthF32(mLabelSuffix, 0, suffix_offset + suffix_filter_length) - suffix_font->getWidthF32(mLabelSuffix, suffix_offset, suffix_filter_length);
F32 match_string_left = text_left + font->getWidthF32(mLabel.c_str(), 0, static_cast<S32>(mLabel.size())) + suffix_font->getWidthF32(mLabelSuffix.c_str(), 0, suffix_offset + suffix_filter_length) - suffix_font->getWidthF32(mLabelSuffix.c_str(), suffix_offset, suffix_filter_length);
F32 yy = (F32)getRect().getHeight() - suffix_font->getLineHeight() - (F32)mTextPad - (F32)TOP_PAD;
suffix_font->renderUTF8(mLabelSuffix, suffix_offset, match_string_left, yy, sFilterTextColor,
suffix_font->render(mLabelSuffix, suffix_offset, match_string_left, yy, sFilterTextColor,
LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW,
suffix_filter_length, S32_MAX, &right_x);
}
@ -1161,11 +1161,11 @@ bool LLFolderViewItem::handleToolTip(S32 x, S32 y, MASK mask)
return false;
S32 nStart = mArrowSize + mTextPad + mIconWidth + mIconPad + mIndentation;
S32 nWidth = getLabelFontForStyle(mLabelStyle)->getWidth(mLabel) + nStart;
S32 nWidth = getLabelFontForStyle(mLabelStyle)->getWidth(mLabel.c_str()) + nStart;
if (getRoot()->getParentPanel()->getRect().getWidth() < nWidth) // Label is truncated, display tooltip
{
setToolTip(mLabel);
setToolTip(wstring_to_utf8str(mLabel));
return LLView::handleToolTip(x, y, mask);
}
else

View File

@ -93,14 +93,14 @@ protected:
LLFolderViewItem(const Params& p);
std::string mLabel;
LLWString mLabel;
S32 mLabelWidth;
bool mLabelWidthDirty;
S32 mLabelPaddingRight;
LLFolderViewFolder* mParentFolder;
LLPointer<LLFolderViewModelItem> mViewModelItem;
LLFontGL::StyleFlags mLabelStyle;
std::string mLabelSuffix;
LLWString mLabelSuffix;
bool mSuffixNeedsRefresh; //suffix and icons
LLUIImagePtr mIcon,
mIconOpen,
@ -252,7 +252,7 @@ public:
// This method returns the label displayed on the view. This
// method was primarily added to allow sorting on the folder
// contents possible before the entire view has been constructed.
const std::string& getLabel() const { return mLabel; }
const LLWString& getLabel() const { return mLabel; }
LLFolderViewFolder* getParentFolder( void ) { return mParentFolder; }
const LLFolderViewFolder* getParentFolder( void ) const { return mParentFolder; }

View File

@ -566,8 +566,8 @@ void LLMenuItemGL::draw( void )
std::string::size_type offset = upper_case_label.find(mJumpKey);
if (offset != std::string::npos)
{
S32 x_begin = LEFT_PLAIN_PIXELS + mFont->getWidth(mLabel, 0, static_cast<S32>(offset));
S32 x_end = LEFT_PLAIN_PIXELS + mFont->getWidth(mLabel, 0, static_cast<S32>(offset) + 1);
S32 x_begin = LEFT_PLAIN_PIXELS + mFont->getWidth(mLabel.getWString().c_str(), 0, static_cast<S32>(offset));
S32 x_end = LEFT_PLAIN_PIXELS + mFont->getWidth(mLabel.getWString().c_str(), 0, static_cast<S32>(offset) + 1);
gl_line_2d(x_begin, (MENU_ITEM_PADDING / 2) + 1, x_end, (MENU_ITEM_PADDING / 2) + 1);
}
}
@ -1671,9 +1671,9 @@ void LLMenuItemBranchDownGL::draw( void )
std::string::size_type offset = upper_case_label.find(getJumpKey());
if (offset != std::string::npos)
{
S32 x_offset = ll_round((F32)getRect().getWidth() / 2.f - getFont()->getWidthF32(mLabel.getString(), 0, S32_MAX) / 2.f);
S32 x_begin = x_offset + getFont()->getWidth(mLabel, 0, static_cast<S32>(offset));
S32 x_end = x_offset + getFont()->getWidth(mLabel, 0, static_cast<S32>(offset) + 1);
S32 x_offset = ll_round((F32)getRect().getWidth() / 2.f - getFont()->getWidthF32(mLabel.getWString().c_str(), 0, S32_MAX) / 2.f);
S32 x_begin = x_offset + getFont()->getWidth(mLabel.getWString().c_str(), 0, static_cast<S32>(offset));
S32 x_end = x_offset + getFont()->getWidth(mLabel.getWString().c_str(), 0, static_cast<S32>(offset) + 1);
gl_line_2d(x_begin, LABEL_BOTTOM_PAD_PIXELS, x_end, LABEL_BOTTOM_PAD_PIXELS);
}
}

View File

@ -245,7 +245,7 @@ bool LLMultiSliderCtrl::setLabelArg( const std::string& key, const LLStringExpli
res = mLabelBox->setTextArg(key, text);
if (res && mLabelWidth == 0)
{
S32 label_width = mFont->getWidth(mLabelBox->getText());
S32 label_width = mFont->getWidth(mLabelBox->getWText().c_str());
LLRect rect = mLabelBox->getRect();
S32 prev_right = rect.mRight;
rect.mRight = rect.mLeft + label_width;

View File

@ -305,7 +305,7 @@ bool LLScrollListText::needsToolTip() const
return LLScrollListCell::needsToolTip();
// ...otherwise, show tooltips for truncated text
return mFont->getWidth(mText.getString()) > getWidth();
return mFont->getWidth(mText.getWString().c_str()) > getWidth();
}
//virtual
@ -328,7 +328,7 @@ LLScrollListText::~LLScrollListText()
S32 LLScrollListText::getContentWidth() const
{
return mFont->getWidth(mText.getString());
return mFont->getWidth(mText.getWString().c_str());
}
@ -394,18 +394,18 @@ void LLScrollListText::draw(const LLColor4& color, const LLColor4& highlight_col
switch(mFontAlignment)
{
case LLFontGL::LEFT:
left = mFont->getWidth(mText.getString(), 1, mHighlightOffset);
left = mFont->getWidth(mText.getWString().c_str(), 1, mHighlightOffset);
break;
case LLFontGL::RIGHT:
left = getWidth() - mFont->getWidth(mText.getString(), mHighlightOffset, S32_MAX);
left = getWidth() - mFont->getWidth(mText.getWString().c_str(), mHighlightOffset, S32_MAX);
break;
case LLFontGL::HCENTER:
left = (getWidth() - mFont->getWidth(mText.getString())) / 2;
left = (getWidth() - mFont->getWidth(mText.getWString().c_str())) / 2;
break;
}
LLRect highlight_rect(left - 2,
mFont->getLineHeight() + 1,
left + mFont->getWidth(mText.getString(), mHighlightOffset, mHighlightCount) + 1,
left + mFont->getWidth(mText.getWString().c_str(), mHighlightOffset, mHighlightCount) + 1,
1);
mRoundedRectImage->draw(highlight_rect, highlight_color);
}
@ -613,18 +613,18 @@ void LLScrollListIconText::draw(const LLColor4& color, const LLColor4& highlight
switch (mFontAlignment)
{
case LLFontGL::LEFT:
left = mFont->getWidth(mText.getString(), icon_space + 1, mHighlightOffset);
left = mFont->getWidth(mText.getWString().c_str(), icon_space + 1, mHighlightOffset);
break;
case LLFontGL::RIGHT:
left = getWidth() - mFont->getWidth(mText.getString(), mHighlightOffset, S32_MAX) - icon_space;
left = getWidth() - mFont->getWidth(mText.getWString().c_str(), mHighlightOffset, S32_MAX) - icon_space;
break;
case LLFontGL::HCENTER:
left = (getWidth() - mFont->getWidth(mText.getString()) - icon_space) / 2;
left = (getWidth() - mFont->getWidth(mText.getWString().c_str()) - icon_space) / 2;
break;
}
LLRect highlight_rect(left - 2,
mFont->getLineHeight() + 1,
left + mFont->getWidth(mText.getString(), mHighlightOffset, mHighlightCount) + 1,
left + mFont->getWidth(mText.getWString().c_str(), mHighlightOffset, mHighlightCount) + 1,
1);
mRoundedRectImage->draw(highlight_rect, highlight_color);
}
@ -642,12 +642,12 @@ void LLScrollListIconText::draw(const LLColor4& color, const LLColor4& highlight
break;
case LLFontGL::RIGHT:
start_text_x = (F32)getWidth();
start_icon_x = getWidth() - mFont->getWidth(mText.getString()) - icon_space;
start_icon_x = getWidth() - mFont->getWidth(mText.getWString().c_str()) - icon_space;
break;
case LLFontGL::HCENTER:
F32 center = (F32)getWidth()* 0.5f;
start_text_x = center + ((F32)icon_space * 0.5f);
start_icon_x = (S32)(center - (((F32)icon_space + mFont->getWidth(mText.getString())) * 0.5f));
start_icon_x = (S32)(center - (((F32)icon_space + mFont->getWidth(mText.getWString().c_str())) * 0.5f));
break;
}
mFont->render(mText.getWString(), 0,

View File

@ -749,7 +749,7 @@ S32 LLScrollListCtrl::calcMaxContentWidth()
if (mColumnWidthsDirty)
{
// 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;
column->mMaxContentWidth = column->mHeader ? LLFontGL::getFontSansSerifSmall()->getWidth(column->mLabel.getWString().c_str()) + mColumnPadding + HEADING_TEXT_PADDING : 0;
item_list::iterator iter;
for (iter = mItemList.begin(); iter != mItemList.end(); iter++)
{

View File

@ -225,7 +225,7 @@ bool LLSliderCtrl::setLabelArg( const std::string& key, const LLStringExplicit&
res = mLabelBox->setTextArg(key, text);
if (res && mLabelFont && mLabelWidth == 0)
{
S32 label_width = mLabelFont->getWidth(mLabelBox->getText());
S32 label_width = mLabelFont->getWidth(mLabelBox->getWText().c_str());
LLRect rect = mLabelBox->getRect();
S32 prev_right = rect.mRight;
rect.mRight = rect.mLeft + label_width;

View File

@ -676,7 +676,7 @@ LLRect LLStatBar::getRequiredRect()
void LLStatBar::drawLabelAndValue( F32 value, std::string &label, LLRect &bar_rect, S32 decimal_digits )
{
LLFontGL::getFontMonospace()->renderUTF8(mLabel, 0, 0, getRect().getHeight(), LLColor4(1.f, 1.f, 1.f, 1.f),
LLFontGL::getFontMonospace()->render(mLabel.getWString(), 0, 0.F, (F32)getRect().getHeight(), LLColor4(1.f, 1.f, 1.f, 1.f),
LLFontGL::LEFT, LLFontGL::TOP);
std::string value_str = !llisnan(value)
@ -758,14 +758,14 @@ void LLStatBar::drawTicks( F32 min, F32 max, F32 value_scale, LLRect &bar_rect )
{
decimal_digits = 0;
}
std::string tick_label = llformat("%.*f", decimal_digits, tick_value);
S32 tick_label_width = LLFontGL::getFontMonospace()->getWidth(tick_label);
LLWString tick_label = utf8str_to_wstring(llformat("%.*f", decimal_digits, tick_value));
S32 tick_label_width = LLFontGL::getFontMonospace()->getWidth(tick_label.c_str());
if (mOrientation == HORIZONTAL)
{
if (tick_begin > last_label + MIN_LABEL_SPACING)
{
gl_rect_2d(bar_rect.mLeft, tick_end, bar_rect.mRight - TICK_LENGTH, tick_begin, LLColor4(1.f, 1.f, 1.f, 0.25f));
LLFontGL::getFontMonospace()->renderUTF8(tick_label, 0, bar_rect.mRight, tick_begin,
LLFontGL::getFontMonospace()->render(tick_label, 0, (F32)bar_rect.mRight, (F32)tick_begin,
LLColor4(1.f, 1.f, 1.f, 0.5f),
LLFontGL::LEFT, LLFontGL::VCENTER);
last_label = tick_begin;
@ -781,7 +781,7 @@ void LLStatBar::drawTicks( F32 min, F32 max, F32 value_scale, LLRect &bar_rect )
{
gl_rect_2d(tick_begin, bar_rect.mTop, tick_end, bar_rect.mBottom - TICK_LENGTH, LLColor4(1.f, 1.f, 1.f, 0.25f));
S32 label_pos = tick_begin - ll_round((F32)tick_label_width * ((F32)tick_begin / (F32)bar_rect.getWidth()));
LLFontGL::getFontMonospace()->renderUTF8(tick_label, 0, label_pos, bar_rect.mBottom - TICK_LENGTH,
LLFontGL::getFontMonospace()->render(tick_label, 0, (F32)label_pos, (F32)(bar_rect.mBottom - TICK_LENGTH),
LLColor4(1.f, 1.f, 1.f, 0.5f),
LLFontGL::LEFT, LLFontGL::TOP);
last_label = label_pos;

View File

@ -107,8 +107,6 @@ void LLStatGraph::draw()
mUpdateTimer.reset();
}
LLColor4 color;
threshold_vec_t::iterator it = std::lower_bound(mThresholds.begin(), mThresholds.end(), Threshold(mValue / mMax, LLUIColor()));
if (it != mThresholds.begin())
@ -116,15 +114,14 @@ void LLStatGraph::draw()
it--;
}
color = LLUIColorTable::instance().getColor( "MenuDefaultBgColor" );
gGL.color4fv(color.mV);
static LLColor4 default_color = LLUIColorTable::instance().getColor( "MenuDefaultBgColor" );
gGL.color4fv(default_color.mV);
gl_rect_2d(0, getRect().getHeight(), getRect().getWidth(), 0, true);
gGL.color4fv(LLColor4::black.mV);
gl_rect_2d(0, getRect().getHeight(), getRect().getWidth(), 0, false);
color = it->mColor;
gGL.color4fv(color.mV);
gGL.color4fv(it->mColor().mV);
gl_rect_2d(1, ll_round(frac*getRect().getHeight()), getRect().getWidth() - 1, 0, true);
}

View File

@ -41,7 +41,7 @@ public:
: LLTextSegment(start, end),
mEditor(editor),
mStyle(style),
mExpanderLabel(more_text)
mExpanderLabel(utf8str_to_wstring(more_text))
{}
/*virtual*/ bool getDimensionsF32(S32 first_char, S32 num_chars, F32& width, S32& height) const
@ -80,7 +80,7 @@ public:
/*virtual*/ F32 draw(S32 start, S32 end, S32 selection_start, S32 selection_end, const LLRectf& draw_rect)
{
F32 right_x;
mStyle->getFont()->renderUTF8(mExpanderLabel, start,
mStyle->getFont()->render(mExpanderLabel, start,
draw_rect.mRight, draw_rect.mTop,
mStyle->getColor(),
LLFontGL::RIGHT, LLFontGL::TOP,
@ -103,7 +103,7 @@ public:
private:
LLTextBase& mEditor;
LLStyleSP mStyle;
std::string mExpanderLabel;
LLWString mExpanderLabel;
};
LLExpandableTextBox::LLTextBoxEx::Params::Params()

View File

@ -60,10 +60,11 @@ bool LLFloaterConversationLog::postBuild()
}
// Use the context menu of the Conversation list for the Conversation tab gear menu.
mConversationsGearBtn = getChild<LLMenuButton>("conversations_gear_btn");
LLToggleableMenu* conversations_gear_menu = mConversationLogList->getContextMenu();
if (conversations_gear_menu)
{
getChild<LLMenuButton>("conversations_gear_btn")->setMenu(conversations_gear_menu, LLMenuButton::MP_BOTTOM_LEFT);
mConversationsGearBtn->setMenu(conversations_gear_menu, LLMenuButton::MP_BOTTOM_LEFT);
}
getChild<LLFilterEditor>("people_filter_input")->setCommitCallback(boost::bind(&LLFloaterConversationLog::onFilterEdit, this, _2));
@ -73,7 +74,7 @@ bool LLFloaterConversationLog::postBuild()
void LLFloaterConversationLog::draw()
{
getChild<LLMenuButton>("conversations_gear_btn")->setEnabled(mConversationLogList->getSelectedItem() != NULL);
mConversationsGearBtn->setEnabled(mConversationLogList->getSelectedItem() != NULL);
LLFloater::draw();
}

View File

@ -29,6 +29,7 @@
#include "llfloater.h"
class LLConversationLogList;
class LLMenuButton;
class LLFloaterConversationLog : public LLFloater
{
@ -55,6 +56,7 @@ private:
bool isActionChecked(const LLSD& userdata);
LLConversationLogList* mConversationLogList;
LLMenuButton* mConversationsGearBtn = nullptr;
};

View File

@ -2188,9 +2188,11 @@ void LLGroupMgr::processGroupBanRequest(const LLSD& content)
LLGroupMgr::getInstance()->notifyObservers(GC_BANLIST);
}
void LLGroupMgr::groupMembersRequestCoro(std::string url, LLUUID group_id, U32 page_size, U32 page_start, std::string sort_column)
void LLGroupMgr::groupMembersRequestCoro(std::string url, LLUUID group_id, U32 page_size, U32 page_start, U32 sort_column, bool sort_descending)
{
LL_INFOS("GrpMgr") << "group_id: '" << group_id << "', sort_column: '" << sort_column << "', page_size: " << page_size << ", page_start: " << page_start << LL_ENDL;
LL_INFOS("GrpMgr") << "group_id: '" << group_id << "'"
<< ", page_size: " << page_size << ", page_start: " << page_start
<< ", sort_column: " << sort_column << ", sort_descending: " << sort_descending << LL_ENDL;
LLCore::HttpRequest::policy_t httpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID);
LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t
httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("groupMembersRequest", httpPolicy));
@ -2199,6 +2201,7 @@ void LLGroupMgr::groupMembersRequestCoro(std::string url, LLUUID group_id, U32 p
LLSD postData = LLSD::emptyMap();
postData["group_id"] = group_id;
if (page_size)
{
postData["page_size"] = LLSD::Integer(page_size);
@ -2206,12 +2209,19 @@ void LLGroupMgr::groupMembersRequestCoro(std::string url, LLUUID group_id, U32 p
{
postData["page_start"] = LLSD::Integer(page_start);
}
if (!sort_column.empty())
}
if (sort_column)
{
postData["sort_column"] = LLSD::Integer(sort_column);
if (sort_descending)
{
postData["sort_column"] = sort_column;
postData["sort_descending"] = 1;
}
}
mMemberRequestInFlight = true;
LLSD response = httpAdapter->postAndSuspend(httpRequest, url, postData, httpOpts);
mMemberRequestInFlight = false;
@ -2226,10 +2236,10 @@ void LLGroupMgr::groupMembersRequestCoro(std::string url, LLUUID group_id, U32 p
}
response.erase(LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS);
processCapGroupMembersResponse(response, page_size, page_start, sort_column);
processCapGroupMembersResponse(response, url, page_size, page_start, sort_column, sort_descending);
}
void LLGroupMgr::sendCapGroupMembersRequest(const LLUUID& group_id, U32 page_size, U32 page_start, const std::string& sort_column)
void LLGroupMgr::sendCapGroupMembersRequest(const LLUUID& group_id, U32 page_size, U32 page_start, const std::string& sort_column_name, bool sort_descending)
{
static U32 lastGroupMemberRequestFrame = 0;
@ -2238,6 +2248,10 @@ void LLGroupMgr::sendCapGroupMembersRequest(const LLUUID& group_id, U32 page_siz
if ((lastGroupMemberRequestFrame == gFrameCount) || mMemberRequestInFlight)
return;
LL_INFOS("GrpMgr") << "group_id: '" << group_id << "'"
<< ", page_size: " << page_size << ", page_start: " << page_start
<< ", sort_column_name: '" << sort_column_name << "', sort_descending: " << sort_descending << LL_ENDL;
LLViewerRegion* currentRegion = gAgent.getRegion();
// Thank you FS:Ansariel!
if (!currentRegion)
@ -2269,18 +2283,34 @@ void LLGroupMgr::sendCapGroupMembersRequest(const LLUUID& group_id, U32 page_siz
lastGroupMemberRequestFrame = gFrameCount;
mMemberRequestInFlight = true;
U32 sort_column = 0; // No sorting by default
if (!sort_column_name.empty())
{
static const std::vector<std::string> column_names = { "name", "donated", "online", "title" };
auto it = std::find(column_names.begin(), column_names.end(), sort_column_name);
if (it == column_names.end())
{
LL_WARNS("GrpMgr") << "Invalid column name: '" << sort_column_name << "'" << LL_ENDL;
}
else
{
// Use offset (1) because 0 means "no sorting"
sort_column = 1 + (U32)std::distance(column_names.begin(), it);
}
}
LLCoros::instance().launch("LLGroupMgr::groupMembersRequestCoro", [&]()
{
groupMembersRequestCoro(cap_url, group_id, page_size, page_start, sort_column);
groupMembersRequestCoro(cap_url, group_id, page_size, page_start, sort_column, sort_descending);
});
}
void LLGroupMgr::processCapGroupMembersResponse(const LLSD& response, U32 page_size, U32 page_start, const std::string& sort_column)
void LLGroupMgr::processCapGroupMembersResponse(const LLSD& response, const std::string& url, U32 page_size, U32 page_start, U32 sort_column, bool sort_descending)
{
LLUUID group_id = response["group_id"].asUUID();
LL_INFOS("GrpMgr") << "group_id: '" << group_id << "', sort_column: '" << sort_column << "', page_size: " << page_size << ", page_start: " << page_start << LL_ENDL;
LL_INFOS("GrpMgr") << "group_id: '" << group_id << "'"
<< ", page_size: " << page_size << ", page_start: " << page_start
<< ", sort_column: " << sort_column << ", sort_descending: " << sort_descending << LL_ENDL;
// Did we get anything in content?
if (!response.size())
@ -2400,7 +2430,10 @@ void LLGroupMgr::processCapGroupMembersResponse(const LLSD& response, U32 page_s
if (page_size && members_loaded >= page_size && member_count > members_before)
{
sendCapGroupMembersRequest(group_id, page_size, member_count, sort_column);
LLCoros::instance().launch("LLGroupMgr::groupMembersRequestCoro", [&]()
{
groupMembersRequestCoro(url, group_id, page_size, page_start, sort_column, sort_descending);
});
}
// Make the role-member data request

View File

@ -424,7 +424,7 @@ public:
void sendCapGroupMembersRequest(const LLUUID& group_id,
U32 page_size = 0, U32 page_start = 0, const std::string& sort_column = LLStringUtil::null);
U32 page_size = 0, U32 page_start = 0, const std::string& sort_column_name = LLStringUtil::null, bool sort_descending = false);
void cancelGroupRoleChanges(const LLUUID& group_id);
@ -447,8 +447,8 @@ public:
void clearGroupData(const LLUUID& group_id);
private:
void groupMembersRequestCoro(std::string url, LLUUID group_id, U32 page_size, U32 page_start, std::string sort_column);
void processCapGroupMembersResponse(const LLSD& response, U32 page_size, U32 page_start, const std::string& sort_column);
void groupMembersRequestCoro(std::string url, LLUUID group_id, U32 page_size, U32 page_start, U32 sort_column, bool sort_descending);
void processCapGroupMembersResponse(const LLSD& response, const std::string& url, U32 page_size, U32 page_start, U32 sort_column, bool sort_descending);
void getGroupBanRequestCoro(std::string url, LLUUID group_id);
void postGroupBanRequestCoro(std::string url, LLUUID group_id, U32 action, uuid_vec_t ban_list, bool update);

View File

@ -739,13 +739,16 @@ void LLOutfitGallery::onFilterSubStringChanged(const std::string& new_string, co
void LLOutfitGallery::onHighlightBaseOutfit(LLUUID base_id, LLUUID prev_id)
{
if (mOutfitMap[base_id])
auto base_it = mOutfitMap.find(base_id);
if (base_it != mOutfitMap.end())
{
mOutfitMap[base_id]->setOutfitWorn(true);
base_it->second->setOutfitWorn(true);
}
if (mOutfitMap[prev_id])
auto prev_it = mOutfitMap.find(prev_id);
if (prev_it != mOutfitMap.end())
{
mOutfitMap[prev_id]->setOutfitWorn(false);
prev_it->second->setOutfitWorn(false);
}
}
@ -859,13 +862,16 @@ void LLOutfitGallery::onChangeOutfitSelection(LLWearableItemsList* list, const L
{
if (mSelectedOutfitUUID == category_id)
return;
if (mOutfitMap[mSelectedOutfitUUID])
auto selected_it = mOutfitMap.find(mSelectedOutfitUUID);
if (selected_it != mOutfitMap.end())
{
mOutfitMap[mSelectedOutfitUUID]->setSelected(false);
selected_it->second->setSelected(false);
}
if (mOutfitMap[category_id])
auto category_it = mOutfitMap.find(category_id);
if (category_it != mOutfitMap.end())
{
mOutfitMap[category_id]->setSelected(true);
category_it->second->setSelected(true);
}
// mSelectedOutfitUUID will be set in LLOutfitListBase::ChangeOutfitSelection
}
@ -887,9 +893,10 @@ bool LLOutfitGallery::canWearSelected()
bool LLOutfitGallery::hasDefaultImage(const LLUUID& outfit_cat_id)
{
if (mOutfitMap[outfit_cat_id])
auto outfit_it = mOutfitMap.find(outfit_cat_id);
if (outfit_it != mOutfitMap.end())
{
return mOutfitMap[outfit_cat_id]->isDefaultImage();
return outfit_it->second->isDefaultImage();
}
return false;
}
@ -937,6 +944,7 @@ LLOutfitGalleryItem::~LLOutfitGalleryItem()
bool LLOutfitGalleryItem::postBuild()
{
mPreviewIcon = getChild<LLIconCtrl>("preview_outfit");
setDefaultImage();
mOutfitNameText = getChild<LLTextBox>("outfit_name");
@ -952,10 +960,12 @@ void LLOutfitGalleryItem::draw()
LLPanel::draw();
// Draw border
LLUIColor border_color = LLUIColorTable::instance().getColor(mSelected ? "OutfitGalleryItemSelected" : "OutfitGalleryItemUnselected", LLColor4::white);
LLRect border = getChildView("preview_outfit")->getRect();
static LLUIColor selected_color = LLUIColorTable::instance().getColor("OutfitGalleryItemSelected", LLColor4::white);
static LLUIColor unselected_color = LLUIColorTable::instance().getColor("OutfitGalleryItemUnselected", LLColor4::white);
const LLColor4& border_color = mSelected ? selected_color : unselected_color;
LLRect border = mPreviewIcon->getRect();
border.mRight = border.mRight + 1;
gl_rect_2d(border, border_color.get(), false);
gl_rect_2d(border, border_color, false);
// If the floater is focused, don't apply its alpha to the texture (STORM-677).
const F32 alpha = getTransparencyType() == TT_ACTIVE ? 1.0f : getCurrentTransparency();
@ -1111,7 +1121,7 @@ bool LLOutfitGalleryItem::setImageAssetId(LLUUID image_asset_id)
{
mImageAssetId = image_asset_id;
mTexturep = texture;
getChildView("preview_outfit")->setVisible(false);
mPreviewIcon->setVisible(false);
mDefaultImage = false;
mImageUpdatePending = (texture->getDiscardLevel() == -1);
return true;
@ -1128,7 +1138,7 @@ void LLOutfitGalleryItem::setDefaultImage()
{
mTexturep = NULL;
mImageAssetId.setNull();
getChildView("preview_outfit")->setVisible(true);
mPreviewIcon->setVisible(true);
mDefaultImage = true;
mImageUpdatePending = false;
}

View File

@ -261,6 +261,7 @@ private:
LLTextBox* mOutfitNameText;
LLTextBox* mOutfitWornText;
LLPanel* mTextBgPanel;
LLIconCtrl* mPreviewIcon = nullptr;
bool mSelected;
bool mWorn;
bool mDefaultImage;

View File

@ -48,6 +48,7 @@
#include "llscrollingpanelparam.h"
#include "llradiogroup.h"
#include "llnotificationsutil.h"
#include "lliconctrl.h"
#include "llcolorswatch.h"
#include "lltexturectrl.h"
@ -312,12 +313,8 @@ LLEditWearableDictionary::Subparts::Subparts()
addEntry(SUBPART_PHYSICS_BREASTS_UPDOWN, new SubpartEntry(SUBPART_PHYSICS_BREASTS_UPDOWN, "mTorso", "physics_breasts_updown", "physics_breasts_updown_param_list", "physics_breasts_updown_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(0.f, 0.f, 0.f),SEX_FEMALE));
addEntry(SUBPART_PHYSICS_BREASTS_INOUT, new SubpartEntry(SUBPART_PHYSICS_BREASTS_INOUT, "mTorso", "physics_breasts_inout", "physics_breasts_inout_param_list", "physics_breasts_inout_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(0.f, 0.f, 0.f),SEX_FEMALE));
addEntry(SUBPART_PHYSICS_BREASTS_LEFTRIGHT, new SubpartEntry(SUBPART_PHYSICS_BREASTS_LEFTRIGHT, "mTorso", "physics_breasts_leftright", "physics_breasts_leftright_param_list", "physics_breasts_leftright_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(0.f, 0.f, 0.f),SEX_FEMALE));
// <FS:Ansariel> Fix XUI warning
//addEntry(SUBPART_PHYSICS_BELLY_UPDOWN, new SubpartEntry(SUBPART_PHYSICS_BELLY_UPDOWN, "mTorso", "physics_belly_updown", "physics_belly_updown_param_list", "physics_belly_updown_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(0.f, 0.f, 0.f),SEX_BOTH));
//addEntry(SUBPART_PHYSICS_BUTT_UPDOWN, new SubpartEntry(SUBPART_PHYSICS_BUTT_UPDOWN, "mTorso", "physics_butt_updown", "physics_butt_updown_param_list", "physics_butt_updown_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(0.f, 0.f, 0.f),SEX_BOTH));
addEntry(SUBPART_PHYSICS_BELLY_UPDOWN, new SubpartEntry(SUBPART_PHYSICS_BELLY_UPDOWN, "mTorso", "physics_belly_updown", "physics_belly_updown_param_list", "physics_belly_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(0.f, 0.f, 0.f),SEX_BOTH));
addEntry(SUBPART_PHYSICS_BUTT_UPDOWN, new SubpartEntry(SUBPART_PHYSICS_BUTT_UPDOWN, "mTorso", "physics_butt_updown", "physics_butt_updown_param_list", "physics_butt_tab", LLVector3d(0.f, 0.f, 0.3f), LLVector3d(0.f, 0.f, 0.f),SEX_BOTH));
// </FS:Ansariel>
addEntry(SUBPART_PHYSICS_BUTT_LEFTRIGHT, new SubpartEntry(SUBPART_PHYSICS_BUTT_LEFTRIGHT, "mTorso", "physics_butt_leftright", "physics_butt_leftright_param_list", "physics_butt_leftright_tab", LLVector3d(0.f, 0.f, 0.f), LLVector3d(0.f, 0.f, 0.f),SEX_BOTH));
addEntry(SUBPART_PHYSICS_ADVANCED, new SubpartEntry(SUBPART_PHYSICS_ADVANCED, "mTorso", "physics_advanced", "physics_advanced_param_list", "physics_advanced_tab", LLVector3d(0.f, 0.f, 0.f), LLVector3d(0.f, 0.f, 0.f),SEX_BOTH));
}
@ -740,8 +737,14 @@ bool LLPanelEditWearable::postBuild()
mPanelTitle = getChild<LLTextBox>("edit_wearable_title");
mDescTitle = getChild<LLTextBox>("description_text");
getChild<LLRadioGroup>("sex_radio")->setCommitCallback(boost::bind(&LLPanelEditWearable::onCommitSexChange, this));
getChild<LLButton>("save_as_button")->setCommitCallback(boost::bind(&LLPanelEditWearable::onSaveAsButtonClicked, this));
mSexRadio = getChild<LLRadioGroup>("sex_radio");
mSexRadio->setCommitCallback(boost::bind(&LLPanelEditWearable::onCommitSexChange, this));
mMaleIcon = getChild<LLIconCtrl>("male_icon");
mFemaleIcon = getChild<LLIconCtrl>("female_icon");
mBtnSaveAs = getChild<LLButton>("save_as_button");
mBtnSaveAs->setCommitCallback(boost::bind(&LLPanelEditWearable::onSaveAsButtonClicked, this));
// The following panels will be shown/hidden based on what wearable we're editing
// body parts
@ -828,9 +831,21 @@ bool LLPanelEditWearable::postBuild()
continue;
}
mAccordionTabs.emplace(accordion_tab, tab);
// initialize callback to ensure camera view changes appropriately.
tab->setDropDownStateChangedCallback(boost::bind(&LLPanelEditWearable::onTabExpandedCollapsed,this,_2,index));
const std::string& scrolling_panel = subpart_entry->mParamList;
if (!scrolling_panel.empty())
{
LLScrollingPanelList* panel_list = tab->findChild<LLScrollingPanelList>(scrolling_panel);
if (panel_list)
{
mParamPanels.emplace(scrolling_panel, panel_list);
}
}
// <FS:Ansariel> Appearance panel not updating camera position; Some skins use tabs - in this case
// set a callback on the tab container when the tab is changed to switch the camera position
if (!tab_container_cb_set)
@ -1267,19 +1282,21 @@ void LLPanelEditWearable::showWearable(LLViewerWearable* wearable, bool show, bo
continue;
}
LLScrollingPanelList *panel_list = findChild<LLScrollingPanelList>(scrolling_panel);
LLAccordionCtrlTab *tab = findChild<LLAccordionCtrlTab>(accordion_tab);
if (!panel_list)
auto accord_it = mAccordionTabs.find(accordion_tab);
if (accord_it == mAccordionTabs.end())
{
LL_WARNS() << "could not get scrolling panel list: " << scrolling_panel << LL_ENDL;
continue;
LL_WARNS() << "could not get llaccordionctrltab from UI with name: " << accordion_tab << LL_ENDL;
continue;
}
LLAccordionCtrlTab* tab = accord_it->second;
if (!tab)
auto panel_it = mParamPanels.find(scrolling_panel);
if (panel_it == mParamPanels.end())
{
LL_WARNS() << "could not get llaccordionctrltab from UI with name: " << accordion_tab << LL_ENDL;
continue;
LL_WARNS() << "could not get scrolling panel list: " << scrolling_panel << LL_ENDL;
continue;
}
LLScrollingPanelList *panel_list = panel_it->second;
// Don't show female subparts if you're not female, etc.
if (!(gAgentAvatarp->getSex() & subpart_entry->mSex))
@ -1293,7 +1310,7 @@ void LLPanelEditWearable::showWearable(LLViewerWearable* wearable, bool show, bo
}
// what edit group do we want to extract params for?
const std::string edit_group = subpart_entry->mEditGroup;
const std::string& edit_group = subpart_entry->mEditGroup;
// storage for ordered list of visual params
value_map_t sorted_params;
@ -1448,9 +1465,9 @@ void LLPanelEditWearable::toggleTypeSpecificControls(LLWearableType::EType type)
// Toggle controls specific to shape editing panel.
{
bool is_shape = (type == LLWearableType::WT_SHAPE);
getChildView("sex_radio")->setVisible( is_shape);
getChildView("female_icon")->setVisible( is_shape);
getChildView("male_icon")->setVisible( is_shape);
mSexRadio->setVisible(is_shape);
mFemaleIcon->setVisible(is_shape);
mMaleIcon->setVisible(is_shape);
}
}
@ -1515,15 +1532,15 @@ void LLPanelEditWearable::updateScrollingPanelUI()
ESubpart subpart_e = wearable_entry->mSubparts[index];
const LLEditWearableDictionary::SubpartEntry *subpart_entry = LLEditWearableDictionary::getInstance()->getSubpart(subpart_e);
const std::string scrolling_panel = subpart_entry->mParamList;
const std::string& scrolling_panel = subpart_entry->mParamList;
LLScrollingPanelList *panel_list = getChild<LLScrollingPanelList>(scrolling_panel);
if (!panel_list)
auto panel_it = mParamPanels.find(scrolling_panel);
if (panel_it == mParamPanels.end())
{
LL_WARNS() << "could not get scrolling panel list: " << scrolling_panel << LL_ENDL;
continue;
LL_WARNS() << "could not get scrolling panel list: " << scrolling_panel << LL_ENDL;
continue;
}
LLScrollingPanelList* panel_list = panel_it->second;
panel_list->updatePanels(true);
}
@ -1663,7 +1680,7 @@ void LLPanelEditWearable::updateVerbs()
bool is_dirty = isDirty();
mBtnRevert->setEnabled(is_dirty);
getChildView("save_as_button")->setEnabled(is_dirty && can_copy);
mBtnSaveAs->setEnabled(is_dirty && can_copy);
// [FS:CR] FIRE-10986 - A little redundant since you shouldn't be able to get here if the wearable is
// no modify, but what the hell, check anyways.
@ -1705,7 +1722,7 @@ void LLPanelEditWearable::configureAlphaCheckbox(LLAvatarAppearanceDefines::ETex
LLCheckBoxCtrl* checkbox = mPanelAlpha->getChild<LLCheckBoxCtrl>(name);
checkbox->setCommitCallback(boost::bind(&LLPanelEditWearable::onInvisibilityCommit, this, checkbox, te));
mAlphaCheckbox2Index[name] = te;
mAlphaCheckbox2Index.push_back(std::make_pair(checkbox,te));
}
void LLPanelEditWearable::onInvisibilityCommit(LLCheckBoxCtrl* checkbox_ctrl, LLAvatarAppearanceDefines::ETextureIndex te)
@ -1766,11 +1783,10 @@ void LLPanelEditWearable::onInvisibilityCommit(LLCheckBoxCtrl* checkbox_ctrl, LL
void LLPanelEditWearable::updateAlphaCheckboxes()
{
for (string_texture_index_map_t::iterator iter = mAlphaCheckbox2Index.begin();
iter != mAlphaCheckbox2Index.end(); ++iter )
for (const auto& check_pair : mAlphaCheckbox2Index)
{
LLAvatarAppearanceDefines::ETextureIndex te = (LLAvatarAppearanceDefines::ETextureIndex)iter->second;
LLCheckBoxCtrl* ctrl = mPanelAlpha->getChild<LLCheckBoxCtrl>(iter->first);
LLAvatarAppearanceDefines::ETextureIndex te = (LLAvatarAppearanceDefines::ETextureIndex)check_pair.second;
LLCheckBoxCtrl* ctrl = check_pair.first;
if (ctrl)
{
ctrl->set(!gAgentAvatarp->isTextureVisible(te, mWearablePtr));

View File

@ -45,6 +45,8 @@ class LLViewerJointMesh;
class LLAccordionCtrlTab;
class LLJoint;
class LLLineEditor;
class LLRadioGroup;
class LLIconCtrl;
class LLPanelEditWearable : public LLPanel, public LLWearable::LLWearableObserver
{
@ -133,6 +135,7 @@ private:
LLViewerInventoryItem* mWearableItem;
// these are constant no matter what wearable we're editing
LLButton* mBtnSaveAs;
LLButton *mBtnRevert;
LLButton *mBtnBack;
std::string mBackBtnLabel;
@ -141,6 +144,9 @@ private:
LLTextBox *mDescTitle;
LLTextBox *mTxtAvatarHeight;
LLRadioGroup* mSexRadio = nullptr;
LLIconCtrl* mMaleIcon = nullptr;
LLIconCtrl* mFemaleIcon = nullptr;
// localized and parameterized strings that used to build avatar_height_label
std::string mMeters;
@ -180,8 +186,11 @@ private:
LLPanel *mPanelUniversal;
LLPanel *mPanelPhysics;
typedef std::map<std::string, LLAvatarAppearanceDefines::ETextureIndex> string_texture_index_map_t;
string_texture_index_map_t mAlphaCheckbox2Index;
std::unordered_map<std::string, LLAccordionCtrlTab*> mAccordionTabs;
std::unordered_map<std::string, LLScrollingPanelList*> mParamPanels;
typedef std::vector<std::pair<LLCheckBoxCtrl*, LLAvatarAppearanceDefines::ETextureIndex>> checkbox_texture_index_vec_t;
checkbox_texture_index_vec_t mAlphaCheckbox2Index;
typedef std::map<LLAvatarAppearanceDefines::ETextureIndex, LLUUID> s32_uuid_map_t;
s32_uuid_map_t mPreviousAlphaTexture;

View File

@ -40,6 +40,7 @@
class LLViewerRegion;
class LLIconCtrl;
class LLSettingsDropTarget;
class LLPanelEnvironmentInfo : public LLPanel
{

View File

@ -203,13 +203,11 @@ LLRender::eTexIndex LLPanelFace::getTextureChannelToEdit()
U32 matmedia_selection = mComboMatMedia->getCurrentIndex();
if (matmedia_selection == MATMEDIA_MATERIAL)
{
LLRadioGroup* radio_mat_type = getChild<LLRadioGroup>("radio_material_type");
channel_to_edit = (LLRender::eTexIndex)radio_mat_type->getSelectedIndex();
channel_to_edit = (LLRender::eTexIndex)mRadioMaterialType->getSelectedIndex();
}
if (matmedia_selection == MATMEDIA_PBR)
{
LLRadioGroup* radio_mat_type = getChild<LLRadioGroup>("radio_pbr_type");
channel_to_edit = (LLRender::eTexIndex)radio_mat_type->getSelectedIndex();
channel_to_edit = (LLRender::eTexIndex)mRadioPbrType->getSelectedIndex();
}
}
@ -222,8 +220,7 @@ LLRender::eTexIndex LLPanelFace::getTextureDropChannel()
{
if (mComboMatMedia && mComboMatMedia->getCurrentIndex() == MATMEDIA_MATERIAL)
{
LLRadioGroup* radio_mat_type = getChild<LLRadioGroup>("radio_material_type");
return LLRender::eTexIndex(radio_mat_type->getSelectedIndex());
return LLRender::eTexIndex(mRadioMaterialType->getSelectedIndex());
}
return LLRender::eTexIndex(MATTYPE_DIFFUSE);
@ -233,8 +230,7 @@ LLGLTFMaterial::TextureInfo LLPanelFace::getPBRDropChannel()
{
if (mComboMatMedia && mComboMatMedia->getCurrentIndex() == MATMEDIA_PBR)
{
LLRadioGroup* radio_pbr_type = getChild<LLRadioGroup>("radio_pbr_type");
return texture_info_from_pbrtype(radio_pbr_type->getSelectedIndex());
return texture_info_from_pbrtype(mRadioPbrType->getSelectedIndex());
}
return texture_info_from_pbrtype(PBRTYPE_BASE_COLOR);
@ -242,8 +238,8 @@ LLGLTFMaterial::TextureInfo LLPanelFace::getPBRDropChannel()
// Things the UI provides...
//
LLUUID LLPanelFace::getCurrentNormalMap() { return mBumpyTextureCtrl->getImageAssetID(); }
LLUUID LLPanelFace::getCurrentSpecularMap() { return mShinyTextureCtrl->getImageAssetID(); }
LLUUID LLPanelFace::getCurrentNormalMap() { return mBumpyTextureCtrl->getImageAssetID(); }
LLUUID LLPanelFace::getCurrentSpecularMap() { return mShinyTextureCtrl->getImageAssetID(); }
U32 LLPanelFace::getCurrentShininess() { return getChild<LLComboBox>("combobox shininess")->getCurrentIndex(); }
U32 LLPanelFace::getCurrentBumpiness() { return getChild<LLComboBox>("combobox bumpiness")->getCurrentIndex(); }
U8 LLPanelFace::getCurrentDiffuseAlphaMode() { return (U8)getChild<LLComboBox>("combobox alphamode")->getCurrentIndex(); }
@ -404,42 +400,26 @@ bool LLPanelFace::postBuild()
childSetAction("edit_selected_pbr", &LLPanelFace::onClickBtnEditPBR, this);
childSetAction("save_selected_pbr", &LLPanelFace::onClickBtnSavePBR, this);
// <FS:CR> Moved to the header so other functions can use them too.
//LLTextureCtrl* mTextureCtrl;
//LLTextureCtrl* mShinyTextureCtrl;
//LLTextureCtrl* mBumpyTextureCtrl;
//LLColorSwatchCtrl* mColorSwatch;
//LLColorSwatchCtrl* mShinyColorSwatch;
//LLComboBox* mComboTexGen;
//LLCheckBoxCtrl *mCheckFullbright;
//LLTextBox* mLabelColorTransp;
//LLSpinCtrl* mCtrlColorTransp; // transparency = 1 - alpha
//LLSpinCtrl* mCtrlGlow;
setMouseOpaque(false);
LLTextureCtrl* pbr_ctrl = findChild<LLTextureCtrl>("pbr_control");
if (pbr_ctrl)
mPBRTextureCtrl = getChild<LLTextureCtrl>("pbr_control");
if (mPBRTextureCtrl)
{
pbr_ctrl->setDefaultImageAssetID(LLUUID::null);
pbr_ctrl->setBlankImageAssetID(BLANK_MATERIAL_ASSET_ID);
pbr_ctrl->setCommitCallback(boost::bind(&LLPanelFace::onCommitPbr, this, _2));
pbr_ctrl->setOnCancelCallback(boost::bind(&LLPanelFace::onCancelPbr, this, _2));
pbr_ctrl->setOnSelectCallback(boost::bind(&LLPanelFace::onSelectPbr, this, _2));
pbr_ctrl->setDragCallback(boost::bind(&LLPanelFace::onDragPbr, this, _2));
pbr_ctrl->setOnTextureSelectedCallback(boost::bind(&LLPanelFace::onPbrSelectionChanged, this, _1));
pbr_ctrl->setOnCloseCallback(boost::bind(&LLPanelFace::onCloseTexturePicker, this, _2));
mPBRTextureCtrl->setDefaultImageAssetID(LLUUID::null);
mPBRTextureCtrl->setBlankImageAssetID(BLANK_MATERIAL_ASSET_ID);
mPBRTextureCtrl->setCommitCallback(boost::bind(&LLPanelFace::onCommitPbr, this, _2));
mPBRTextureCtrl->setOnCancelCallback(boost::bind(&LLPanelFace::onCancelPbr, this, _2));
mPBRTextureCtrl->setOnSelectCallback(boost::bind(&LLPanelFace::onSelectPbr, this, _2));
mPBRTextureCtrl->setDragCallback(boost::bind(&LLPanelFace::onDragPbr, this, _2));
mPBRTextureCtrl->setOnTextureSelectedCallback(boost::bind(&LLPanelFace::onPbrSelectionChanged, this, _1));
mPBRTextureCtrl->setOnCloseCallback(boost::bind(&LLPanelFace::onCloseTexturePicker, this, _2));
pbr_ctrl->setFollowsTop();
pbr_ctrl->setFollowsLeft();
pbr_ctrl->setImmediateFilterPermMask(PERM_NONE);
pbr_ctrl->setDnDFilterPermMask(PERM_COPY | PERM_TRANSFER);
pbr_ctrl->setBakeTextureEnabled(false);
pbr_ctrl->setInventoryPickType(PICK_MATERIAL);
mPBRTextureCtrl->setFollowsTop();
mPBRTextureCtrl->setFollowsLeft();
mPBRTextureCtrl->setImmediateFilterPermMask(PERM_NONE);
mPBRTextureCtrl->setDnDFilterPermMask(PERM_COPY | PERM_TRANSFER);
mPBRTextureCtrl->setBakeTextureEnabled(false);
mPBRTextureCtrl->setInventoryPickType(PICK_MATERIAL);
}
mTextureCtrl = getChild<LLTextureCtrl>("texture control");
@ -552,11 +532,11 @@ bool LLPanelFace::postBuild()
mComboMatMedia->selectNthItem(MATMEDIA_MATERIAL);
}
mRadioMatType = findChild<LLRadioGroup>("radio_material_type");
if(mRadioMatType)
mRadioMaterialType = findChild<LLRadioGroup>("radio_material_type");
if(mRadioMaterialType)
{
mRadioMatType->setCommitCallback(LLPanelFace::onCommitMaterialType, this);
mRadioMatType->selectNthItem(MATTYPE_DIFFUSE);
mRadioMaterialType->setCommitCallback(LLPanelFace::onCommitMaterialType, this);
mRadioMaterialType->selectNthItem(MATTYPE_DIFFUSE);
}
mRadioPbrType = findChild<LLRadioGroup>("radio_pbr_type");
@ -650,7 +630,6 @@ void LLPanelFace::draw()
void LLPanelFace::sendTexture()
{
//LLTextureCtrl* mTextureCtrl = getChild<LLTextureCtrl>("texture control");
if(!mTextureCtrl) return;
if( !mTextureCtrl->getTentative() )
{
@ -671,13 +650,10 @@ void LLPanelFace::sendTexture()
void LLPanelFace::sendBump(U32 bumpiness)
{
//LLTextureCtrl* bumpytexture_ctrl = getChild<LLTextureCtrl>("bumpytexture control");
if (!mBumpyTextureCtrl) return;
if (bumpiness < BUMPY_TEXTURE)
{
LL_DEBUGS("Materials") << "clearing bumptexture control" << LL_ENDL;
//bumpytexture_ctrl->clear();
//bumpytexture_ctrl->setImageAssetID(LLUUID());
mBumpyTextureCtrl->clear();
mBumpyTextureCtrl->setImageAssetID(LLUUID());
}
@ -697,13 +673,11 @@ void LLPanelFace::sendBump(U32 bumpiness)
//
LLSelectedTEMaterial::setNormalID(this, current_normal_map);
//LLSelectMgr::getInstance()->selectionSetBumpmap(bump, bumpytexture_ctrl->getImageItemID());
LLSelectMgr::getInstance()->selectionSetBumpmap(bump, mBumpyTextureCtrl->getImageItemID());
LLSelectMgr::getInstance()->selectionSetBumpmap( bump, mBumpyTextureCtrl->getImageItemID() );
}
void LLPanelFace::sendTexGen()
{
//LLComboBox* mComboTexGen = getChild<LLComboBox>("combobox texgen");
if(!mComboTexGen)return;
U8 tex_gen = (U8) mComboTexGen->getCurrentIndex() << TEM_TEX_GEN_SHIFT;
LLSelectMgr::getInstance()->selectionSetTexGen( tex_gen );
@ -711,13 +685,10 @@ void LLPanelFace::sendTexGen()
void LLPanelFace::sendShiny(U32 shininess)
{
//LLTextureCtrl* texture_ctrl = getChild<LLTextureCtrl>("shinytexture control");
if (!mShinyTextureCtrl) return;
if (shininess < SHINY_TEXTURE)
{
//texture_ctrl->clear();
//texture_ctrl->setImageAssetID(LLUUID());
mShinyTextureCtrl->clear();
mShinyTextureCtrl->setImageAssetID(LLUUID());
}
@ -730,8 +701,7 @@ void LLPanelFace::sendShiny(U32 shininess)
LLSelectedTEMaterial::setSpecularID(this, specmap);
//LLSelectMgr::getInstance()->selectionSetShiny(shiny, texture_ctrl->getImageItemID());
LLSelectMgr::getInstance()->selectionSetShiny(shiny, mShinyTextureCtrl->getImageItemID());
LLSelectMgr::getInstance()->selectionSetShiny( shiny, mShinyTextureCtrl->getImageItemID() );
updateShinyControls(!specmap.isNull(), true);
@ -739,16 +709,14 @@ void LLPanelFace::sendShiny(U32 shininess)
void LLPanelFace::sendFullbright()
{
//LLCheckBoxCtrl* mCheckFullbright = getChild<LLCheckBoxCtrl>("checkbox fullbright");
if (!mCheckFullbright) return;
if(!mCheckFullbright)return;
U8 fullbright = mCheckFullbright->get() ? TEM_FULLBRIGHT_MASK : 0;
LLSelectMgr::getInstance()->selectionSetFullbright( fullbright );
}
void LLPanelFace::sendColor()
{
//LLColorSwatchCtrl* mColorSwatch = getChild<LLColorSwatchCtrl>("colorswatch");
if (!mColorSwatch) return;
if(!mColorSwatch)return;
LLColor4 color = mColorSwatch->get();
LLSelectMgr::getInstance()->selectionSetColorOnly( color );
@ -756,8 +724,7 @@ void LLPanelFace::sendColor()
void LLPanelFace::sendAlpha()
{
//LLSpinCtrl* mCtrlColorTransp = getChild<LLSpinCtrl>("ColorTrans");
if (!mCtrlColorTransp) return;
if(!mCtrlColorTransp)return;
F32 alpha = (100.f - mCtrlColorTransp->get()) / 100.f;
LLSelectMgr::getInstance()->selectionSetAlphaOnly( alpha );
@ -766,9 +733,6 @@ void LLPanelFace::sendAlpha()
void LLPanelFace::sendGlow()
{
//LLSpinCtrl* mCtrlGlow = getChild<LLSpinCtrl>("glow");
//llassert(mCtrlGlow);
if (!mCtrlGlow) return;
if (mCtrlGlow)
{
F32 glow = mCtrlGlow->get();
@ -1118,14 +1082,13 @@ void LLPanelFace::sendTextureInfo()
LLSelectMgr::getInstance()->getSelection()->applyToObjects(&sendfunc);
}
void LLPanelFace::alignTestureLayer()
void LLPanelFace::alignTextureLayer()
{
LLFace* last_face = NULL;
bool identical_face = false;
LLSelectedTE::getFace(last_face, identical_face);
LLRadioGroup * radio_mat_type = getChild<LLRadioGroup>("radio_material_type");
LLPanelFaceSetAlignedConcreteTEFunctor setfunc(this, last_face, static_cast<LLRender::eTexIndex>(radio_mat_type->getSelectedIndex()));
LLPanelFaceSetAlignedConcreteTEFunctor setfunc(this, last_face, static_cast<LLRender::eTexIndex>(mRadioMaterialType->getSelectedIndex()));
LLSelectMgr::getInstance()->getSelection()->applyToTEs(&setfunc);
}
@ -1180,10 +1143,6 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
bool identical_norm = false;
bool identical_spec = false;
//LLTextureCtrl *texture_ctrl = getChild<LLTextureCtrl>("texture control");
//LLTextureCtrl *shinytexture_ctrl = getChild<LLTextureCtrl>("shinytexture control");
//LLTextureCtrl *bumpytexture_ctrl = getChild<LLTextureCtrl>("bumpytexture control");
LLUUID id;
LLUUID normmap_id;
LLUUID specmap_id;
@ -1247,14 +1206,12 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
}
mComboMatMedia->setEnabled(editable);
//LLRadioGroup* radio_mat_type = getChild<LLRadioGroup>("radio_material_type");
if (mRadioMatType->getSelectedIndex() < MATTYPE_DIFFUSE)
if (mRadioMaterialType->getSelectedIndex() < MATTYPE_DIFFUSE)
{
mRadioMatType->selectNthItem(MATTYPE_DIFFUSE);
mRadioMaterialType->selectNthItem(MATTYPE_DIFFUSE);
}
mRadioMatType->setEnabled(editable);
mRadioMaterialType->setEnabled(editable);
//LLRadioGroup* radio_pbr_type = getChild<LLRadioGroup>("radio_pbr_type");
if (mRadioPbrType->getSelectedIndex() < PBRTYPE_RENDER_MATERIAL_ID)
{
mRadioPbrType->selectNthItem(PBRTYPE_RENDER_MATERIAL_ID);
@ -1272,7 +1229,6 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
{
getChildView("color label")->setEnabled(editable);
}
//LLColorSwatchCtrl* color_swatch = findChild<LLColorSwatchCtrl>("colorswatch");
LLColor4 color = LLColor4::white;
bool identical_color = false;
@ -1286,16 +1242,16 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
mColorSwatch->set(color, force_set_values || (prev_color != color) || !editable);
mColorSwatch->setValid(editable && !has_pbr_material);
mColorSwatch->setEnabled(editable && !has_pbr_material);
mColorSwatch->setEnabled( editable && !has_pbr_material);
mColorSwatch->setCanApplyImmediately( editable && !has_pbr_material);
}
// Color transparency
getChildView("color trans")->setEnabled(editable);
mLabelColorTransp->setEnabled(editable);
F32 transparency = (1.f - color.mV[VALPHA]) * 100.f;
getChild<LLUICtrl>("ColorTrans")->setValue(editable ? transparency : 0);
getChildView("ColorTrans")->setEnabled(editable && has_material);
mCtrlColorTransp->setValue(editable ? transparency : 0);
mCtrlColorTransp->setEnabled(editable && has_material);
U8 shiny = 0;
bool identical_shiny = false;
@ -1325,10 +1281,8 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
getChild<LLUICtrl>("combobox shininess")->setTentative(!identical_spec);
getChild<LLUICtrl>("glossiness")->setTentative(!identical_spec);
getChild<LLUICtrl>("environment")->setTentative(!identical_spec);
getChild<LLUICtrl>("shinycolorswatch")->setTentative(!identical_spec);
mShinyColorSwatch->setTentative(!identical_spec);
//LLColorSwatchCtrl* mShinyColorSwatch = getChild<LLColorSwatchCtrl>("shinycolorswatch");
if (mShinyColorSwatch)
{
mShinyColorSwatch->setValid(editable);
mShinyColorSwatch->setEnabled( editable );
@ -1490,7 +1444,7 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
if (mShinyTextureCtrl)
{
mShinyTextureCtrl->setTentative( !identical_spec );
mShinyTextureCtrl->setEnabled( editable && !has_pbr_material );
mShinyTextureCtrl->setEnabled( editable && !has_pbr_material);
mShinyTextureCtrl->setImageAssetID( specmap_id );
if (attachment)
@ -1506,7 +1460,7 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
if (mBumpyTextureCtrl)
{
mBumpyTextureCtrl->setTentative( !identical_norm );
mBumpyTextureCtrl->setEnabled( editable && !has_pbr_material );
mBumpyTextureCtrl->setEnabled( editable && !has_pbr_material);
mBumpyTextureCtrl->setImageAssetID( normmap_id );
if (attachment)
@ -1764,27 +1718,18 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
F32 glow = 0.f;
bool identical_glow = false;
LLSelectedTE::getGlow(glow,identical_glow);
LLUICtrl* glow_ctrl = getChild<LLUICtrl>("glow");
glow_ctrl->setValue(glow);
glow_ctrl->setTentative(!identical_glow);
glow_ctrl->setEnabled(editable);
mCtrlGlow->setValue(glow);
mCtrlGlow->setTentative(!identical_glow);
mCtrlGlow->setEnabled(editable);
getChildView("glow label")->setEnabled(editable);
}
{
LLCtrlSelectionInterface* combobox_texgen = childGetSelectionInterface("combobox texgen");
if (combobox_texgen)
{
// Maps from enum to combobox entry index
combobox_texgen->selectNthItem(((S32)selected_texgen) >> 1);
}
else
{
LL_WARNS() << "failed childGetSelectionInterface for 'combobox texgen'" << LL_ENDL;
}
// Maps from enum to combobox entry index
mComboTexGen->selectNthItem(((S32)selected_texgen) >> 1);
getChildView("combobox texgen")->setEnabled(editable);
getChild<LLUICtrl>("combobox texgen")->setTentative(!identical);
mComboTexGen->setEnabled(editable);
mComboTexGen->setTentative(!identical);
getChildView("tex gen")->setEnabled(editable);
}
@ -1794,10 +1739,9 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
LLSelectedTE::getFullbright(fullbright_flag,identical_fullbright);
LLUICtrl* check_fullbright = getChild<LLUICtrl>("checkbox fullbright");
check_fullbright->setValue((S32)(fullbright_flag != 0));
check_fullbright->setEnabled(editable && !has_pbr_material);
check_fullbright->setTentative(!identical_fullbright);
mCheckFullbright->setValue((S32)(fullbright_flag != 0));
mCheckFullbright->setEnabled(editable && !has_pbr_material);
mCheckFullbright->setTentative(!identical_fullbright);
mComboMatMedia->setEnabledByValue("Materials", !has_pbr_material);
}
@ -1815,8 +1759,6 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
LLSelectedTEMaterial::getMaxNormalRepeats(repeats_norm, identical_norm_repeats);
LLSelectedTEMaterial::getMaxSpecularRepeats(repeats_spec, identical_spec_repeats);
LLComboBox* mComboTexGen = getChild<LLComboBox>("combobox texgen");
if (mComboTexGen)
{
S32 index = mComboTexGen ? mComboTexGen->getCurrentIndex() : 0;
bool enabled = editable && (index != 1);
@ -1827,7 +1769,7 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
U32 material_type = MATTYPE_DIFFUSE;
if (material_selection == MATMEDIA_MATERIAL)
{
material_type = mRadioMatType->getSelectedIndex();
material_type = mRadioMaterialType->getSelectedIndex();
}
else if (material_selection == MATMEDIA_PBR)
{
@ -1935,7 +1877,6 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
// Shiny (specular)
F32 offset_x, offset_y, repeat_x, repeat_y, rot;
//LLTextureCtrl* texture_ctrl = getChild<LLTextureCtrl>("shinytexture control");
mShinyTextureCtrl->setImageAssetID(material->getSpecularID());
if (!material->getSpecularID().isNull() && (shiny == SHINY_TEXTURE))
@ -1966,12 +1907,11 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
//
if (!material->getSpecularID().isNull())
{
LLColorSwatchCtrl* shiny_swatch = getChild<LLColorSwatchCtrl>("shinycolorswatch");
LLColor4 new_color = material->getSpecularLightColor();
LLColor4 old_color = shiny_swatch->get();
LLColor4 old_color = mShinyColorSwatch->get();
shiny_swatch->setOriginal(new_color);
shiny_swatch->set(new_color, force_set_values || old_color != new_color || !editable);
mShinyColorSwatch->setOriginal(new_color);
mShinyColorSwatch->set(new_color, force_set_values || old_color != new_color || !editable);
}
// Bumpy (normal)
@ -2014,8 +1954,8 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
calcp->setVar(LLCalc::TEX_U_OFFSET, getCurrentTextureOffsetU());
calcp->setVar(LLCalc::TEX_V_OFFSET, getCurrentTextureOffsetV());
calcp->setVar(LLCalc::TEX_ROTATION, getCurrentTextureRot());
calcp->setVar(LLCalc::TEX_TRANSPARENCY, (F32)childGetValue("ColorTrans").asReal());
calcp->setVar(LLCalc::TEX_GLOW, (F32)childGetValue("glow").asReal());
calcp->setVar(LLCalc::TEX_TRANSPARENCY, (F32)mCtrlColorTransp->getValue().asReal());
calcp->setVar(LLCalc::TEX_GLOW, (F32)mCtrlGlow->getValue().asReal());
// <FS:Zi> Find all faces with same texture
getChild<LLUICtrl>("btn_select_same_diff")->setEnabled(LLSelectMgr::getInstance()->getTEMode() && mTextureCtrl->getEnabled());
@ -2029,32 +1969,31 @@ void LLPanelFace::updateUI(bool force_set_values /*false*/)
clearCtrls();
// Disable non-UICtrls
LLTextureCtrl* pbr_ctrl = findChild<LLTextureCtrl>("pbr_control");
if (pbr_ctrl)
if (mPBRTextureCtrl)
{
pbr_ctrl->setImageAssetID(LLUUID::null);
pbr_ctrl->setEnabled(false);
mPBRTextureCtrl->setImageAssetID(LLUUID::null);
mPBRTextureCtrl->setEnabled(false);
}
///LLTextureCtrl* texture_ctrl = getChild<LLTextureCtrl>("texture control");
if (mTextureCtrl)
{
mTextureCtrl->setImageAssetID( LLUUID::null );
mTextureCtrl->setEnabled( false ); // this is a LLUICtrl, but we don't want it to have keyboard focus so we add it as a child, not a ctrl.
// mTextureCtrl->setValid(false);
}
//LLColorSwatchCtrl* mColorSwatch = getChild<LLColorSwatchCtrl>("colorswatch");
if (mColorSwatch)
{
mColorSwatch->setEnabled( false );
mColorSwatch->setFallbackImage(LLUI::getUIImage("locked_image.j2c") );
mColorSwatch->setValid(false);
}
//LLRadioGroup* radio_mat_type = getChild<LLRadioGroup>("radio_material_type");
if (mRadioMatType)
if (mRadioMaterialType)
{
mRadioMatType->setSelectedIndex(0);
mRadioMaterialType->setSelectedIndex(0);
}
getChildView("color trans")->setEnabled(false);
mLabelColorTransp->setEnabled(false);
mCtrlRpt->setEnabled(false);
getChildView("tex gen")->setEnabled(false);
getChildView("label shininess")->setEnabled(false);
@ -2171,23 +2110,22 @@ void LLPanelFace::updateUIGLTF(LLViewerObject* objectp, bool& has_pbr_material,
const bool saveable = LLMaterialEditor::canSaveObjectsMaterial();
// pbr material
LLTextureCtrl* pbr_ctrl = findChild<LLTextureCtrl>("pbr_control");
LLUUID pbr_id;
if (pbr_ctrl)
if (mPBRTextureCtrl)
{
LLSelectedTE::getPbrMaterialId(pbr_id, identical_pbr, has_pbr_material, has_faces_without_pbr);
pbr_ctrl->setTentative(!identical_pbr);
pbr_ctrl->setEnabled(settable);
pbr_ctrl->setImageAssetID(pbr_id);
mPBRTextureCtrl->setTentative(!identical_pbr);
mPBRTextureCtrl->setEnabled(settable);
mPBRTextureCtrl->setImageAssetID(pbr_id);
if (objectp->isAttachment())
{
pbr_ctrl->setFilterPermissionMasks(PERM_COPY | PERM_TRANSFER | PERM_MODIFY);
mPBRTextureCtrl->setFilterPermissionMasks(PERM_COPY | PERM_TRANSFER | PERM_MODIFY);
}
else
{
pbr_ctrl->setImmediateFilterPermMask(PERM_NONE);
mPBRTextureCtrl->setImmediateFilterPermMask(PERM_NONE);
}
}
@ -2246,13 +2184,12 @@ void LLPanelFace::updateVisibilityGLTF(LLViewerObject* objectp /*= nullptr */)
const bool show_pbr = mComboMatMedia->getCurrentIndex() == MATMEDIA_PBR && mComboMatMedia->getEnabled();
const bool inventory_pending = objectp && objectp->isInventoryPending();
LLRadioGroup* radio_pbr_type = findChild<LLRadioGroup>("radio_pbr_type");
radio_pbr_type->setVisible(show_pbr);
mRadioPbrType->setVisible(show_pbr);
const U32 pbr_type = radio_pbr_type->getSelectedIndex();
const U32 pbr_type = mRadioPbrType->getSelectedIndex();
const bool show_pbr_render_material_id = show_pbr && (pbr_type == PBRTYPE_RENDER_MATERIAL_ID);
getChildView("pbr_control")->setVisible(show_pbr_render_material_id);
mPBRTextureCtrl->setVisible(show_pbr_render_material_id);
getChildView("pbr_from_inventory")->setVisible(show_pbr_render_material_id);
getChildView("edit_selected_pbr")->setVisible(show_pbr_render_material_id && !inventory_pending);
@ -3064,7 +3001,7 @@ void LLPanelFace::onCommitColor(const LLSD& data)
void LLPanelFace::onCommitShinyColor(const LLSD& data)
{
LLSelectedTEMaterial::setSpecularLightColor(this, getChild<LLColorSwatchCtrl>("shinycolorswatch")->get());
LLSelectedTEMaterial::setSpecularLightColor(this, mShinyColorSwatch->get());
}
void LLPanelFace::onCommitAlpha(const LLSD& data)
@ -3090,7 +3027,7 @@ void LLPanelFace::onSelectColor(const LLSD& data)
void LLPanelFace::onSelectShinyColor(const LLSD& data)
{
LLSelectedTEMaterial::setSpecularLightColor(this, getChild<LLColorSwatchCtrl>("shinycolorswatch")->get());
LLSelectedTEMaterial::setSpecularLightColor(this, mShinyColorSwatch->get());
LLSelectMgr::getInstance()->saveSelectedShinyColors();
}
@ -3109,33 +3046,31 @@ void LLPanelFace::onCommitMaterialsMedia(LLUICtrl* ctrl, void* userdata)
void LLPanelFace::updateVisibility(LLViewerObject* objectp /* = nullptr */)
{
LLRadioGroup* radio_mat_type = findChild<LLRadioGroup>("radio_material_type");
LLRadioGroup* radio_pbr_type = findChild<LLRadioGroup>("radio_pbr_type");
LLComboBox* combo_shininess = findChild<LLComboBox>("combobox shininess");
LLComboBox* combo_bumpiness = findChild<LLComboBox>("combobox bumpiness");
if (!radio_mat_type || !radio_pbr_type || !mComboMatMedia || !combo_shininess || !combo_bumpiness)
if (!mRadioMaterialType || !mRadioPbrType || !mComboMatMedia || !combo_shininess || !combo_bumpiness)
{
LL_WARNS("Materials") << "Combo box not found...exiting." << LL_ENDL;
return;
}
U32 materials_media = mComboMatMedia->getCurrentIndex();
U32 material_type = radio_mat_type->getSelectedIndex();
U32 material_type = mRadioMaterialType->getSelectedIndex();
bool show_media = (materials_media == MATMEDIA_MEDIA) && mComboMatMedia->getEnabled();
bool show_material = materials_media == MATMEDIA_MATERIAL;
bool show_texture = (show_media || (show_material && (material_type == MATTYPE_DIFFUSE) && mComboMatMedia->getEnabled()));
bool show_bumpiness = show_material && (material_type == MATTYPE_NORMAL) && mComboMatMedia->getEnabled();
bool show_shininess = show_material && (material_type == MATTYPE_SPECULAR) && mComboMatMedia->getEnabled();
const bool show_pbr = mComboMatMedia->getCurrentIndex() == MATMEDIA_PBR && mComboMatMedia->getEnabled();
const U32 pbr_type = findChild<LLRadioGroup>("radio_pbr_type")->getSelectedIndex();
const U32 pbr_type = mRadioPbrType->getSelectedIndex();
const LLGLTFMaterial::TextureInfo texture_info = texture_info_from_pbrtype(pbr_type);
const bool show_pbr_asset = show_pbr && texture_info == LLGLTFMaterial::GLTF_TEXTURE_INFO_COUNT;
radio_mat_type->setVisible(show_material);
mRadioMaterialType->setVisible(show_material);
// Shared material controls
getChildView("checkbox_sync_settings")->setVisible(show_material || show_media);
getChildView("tex gen")->setVisible(show_material || show_media || show_pbr_asset);
getChildView("combobox texgen")->setVisible(show_material || show_media || show_pbr_asset);
mComboTexGen->setVisible(show_material || show_media || show_pbr_asset);
getChildView("button align textures")->setVisible(show_material || show_media);
// <FS:CR> FIRE-11407 - Be consistant and hide this with the other controls
@ -3151,7 +3086,7 @@ void LLPanelFace::updateVisibility(LLViewerObject* objectp /* = nullptr */)
getChildView("button align")->setVisible(show_media);
// Diffuse texture controls
getChildView("texture control")->setVisible(show_texture && show_material);
mTextureCtrl->setVisible(show_texture && show_material);
getChildView("label alphamode")->setVisible(show_texture && show_material);
getChildView("combobox alphamode")->setVisible(show_texture && show_material);
getChildView("label maskcutoff")->setVisible(false);
@ -3168,7 +3103,7 @@ void LLPanelFace::updateVisibility(LLViewerObject* objectp /* = nullptr */)
getChildView("TexOffsetV")->setVisible(show_texture);
// Specular map controls
getChildView("shinytexture control")->setVisible(show_shininess);
mShinyTextureCtrl->setVisible(show_shininess);
getChildView("combobox shininess")->setVisible(show_shininess);
getChildView("label shininess")->setVisible(show_shininess);
getChildView("label glossiness")->setVisible(false);
@ -3176,7 +3111,7 @@ void LLPanelFace::updateVisibility(LLViewerObject* objectp /* = nullptr */)
getChildView("label environment")->setVisible(false);
getChildView("environment")->setVisible(false);
getChildView("label shinycolor")->setVisible(false);
getChildView("shinycolorswatch")->setVisible(false);
mShinyColorSwatch->setVisible(false);
if (show_shininess)
{
updateShinyControls();
@ -3192,7 +3127,7 @@ void LLPanelFace::updateVisibility(LLViewerObject* objectp /* = nullptr */)
{
updateBumpyControls();
}
getChildView("bumpytexture control")->setVisible(show_bumpiness);
mBumpyTextureCtrl->setVisible(show_bumpiness);
getChildView("combobox bumpiness")->setVisible(show_bumpiness);
getChildView("label bumpiness")->setVisible(show_bumpiness);
getChildView("bumpyScaleU")->setVisible(show_bumpiness);
@ -3259,7 +3194,6 @@ void LLPanelFace::onCommitTexGen(LLUICtrl* ctrl, void* userdata)
// static
void LLPanelFace::updateShinyControls(bool is_setting_texture, bool mess_with_shiny_combobox)
{
//LLTextureCtrl* texture_ctrl = getChild<LLTextureCtrl>("shinytexture control");
LLUUID shiny_texture_ID = mShinyTextureCtrl->getImageAssetID();
LL_DEBUGS("Materials") << "Shiny texture selected: " << shiny_texture_ID << LL_ENDL;
LLComboBox* comboShiny = getChild<LLComboBox>("combobox shininess");
@ -3296,10 +3230,8 @@ void LLPanelFace::updateShinyControls(bool is_setting_texture, bool mess_with_sh
}
}
LLRadioGroup* radio_mat_type = getChild<LLRadioGroup>("radio_material_type");
U32 materials_media = mComboMatMedia->getCurrentIndex();
U32 material_type = radio_mat_type->getSelectedIndex();
U32 material_type = mRadioMaterialType->getSelectedIndex();
bool show_material = (materials_media == MATMEDIA_MATERIAL);
bool show_shininess = show_material && (material_type == MATTYPE_SPECULAR) && mComboMatMedia->getEnabled();
U32 shiny_value = comboShiny->getCurrentIndex();
@ -3309,13 +3241,12 @@ void LLPanelFace::updateShinyControls(bool is_setting_texture, bool mess_with_sh
getChildView("label environment")->setVisible(show_shinyctrls);
getChildView("environment")->setVisible(show_shinyctrls);
getChildView("label shinycolor")->setVisible(show_shinyctrls);
getChildView("shinycolorswatch")->setVisible(show_shinyctrls);
mShinyColorSwatch->setVisible(show_shinyctrls);
}
// static
void LLPanelFace::updateBumpyControls(bool is_setting_texture, bool mess_with_combobox)
{
//LLTextureCtrl* texture_ctrl = getChild<LLTextureCtrl>("bumpytexture control");
LLUUID bumpy_texture_ID = mBumpyTextureCtrl->getImageAssetID();
LL_DEBUGS("Materials") << "texture: " << bumpy_texture_ID << (mess_with_combobox ? "" : " do not") << " update combobox" << LL_ENDL;
LLComboBox* comboBumpy = getChild<LLComboBox>("combobox bumpiness");
@ -3326,9 +3257,6 @@ void LLPanelFace::updateBumpyControls(bool is_setting_texture, bool mess_with_co
if (mess_with_combobox)
{
LLUUID bumpy_texture_ID = mBumpyTextureCtrl->getImageAssetID();
LL_DEBUGS("Materials") << "texture: " << bumpy_texture_ID << (mess_with_combobox ? "" : " do not") << " update combobox" << LL_ENDL;
if (!bumpy_texture_ID.isNull() && is_setting_texture)
{
if (!comboBumpy->itemExists(USE_TEXTURE))
@ -3381,10 +3309,9 @@ void LLPanelFace::updateAlphaControls()
}
U32 mat_type = MATTYPE_DIFFUSE;
//LLRadioGroup* radio_mat_type = getChild<LLRadioGroup>("radio_material_type");
if(mRadioMatType)
if(mRadioMaterialType)
{
mat_type = mRadioMatType->getSelectedIndex();
mat_type = mRadioMaterialType->getSelectedIndex();
}
show_alphactrls = show_alphactrls && (mat_media == MATMEDIA_MATERIAL);
@ -3437,20 +3364,19 @@ bool LLPanelFace::onDragPbr(LLUICtrl*, LLInventoryItem* item)
void LLPanelFace::onCommitPbr(const LLSD& data)
{
LLTextureCtrl* pbr_ctrl = findChild<LLTextureCtrl>("pbr_control");
if (!pbr_ctrl) return;
if (!pbr_ctrl->getTentative())
if (!mPBRTextureCtrl) return;
if (!mPBRTextureCtrl->getTentative())
{
// we grab the item id first, because we want to do a
// permissions check in the selection manager. ARGH!
LLUUID id = pbr_ctrl->getImageItemID();
LLUUID id = mPBRTextureCtrl->getImageItemID();
if (id.isNull())
{
id = pbr_ctrl->getImageAssetID();
id = mPBRTextureCtrl->getImageAssetID();
}
if (!LLSelectMgr::getInstance()->selectionSetGLTFMaterial(id))
{
// If failed to set material, refresh pbr_ctrl's value
// If failed to set material, refresh mPBRTextureCtrl's value
refresh();
}
}
@ -3465,16 +3391,15 @@ void LLPanelFace::onSelectPbr(const LLSD& data)
{
LLSelectMgr::getInstance()->saveSelectedObjectTextures();
LLTextureCtrl* pbr_ctrl = findChild<LLTextureCtrl>("pbr_control");
if (!pbr_ctrl) return;
if (!pbr_ctrl->getTentative())
if (!mPBRTextureCtrl) return;
if (!mPBRTextureCtrl->getTentative())
{
// we grab the item id first, because we want to do a
// permissions check in the selection manager. ARGH!
LLUUID id = pbr_ctrl->getImageItemID();
LLUUID id = mPBRTextureCtrl->getImageItemID();
if (id.isNull())
{
id = pbr_ctrl->getImageAssetID();
id = mPBRTextureCtrl->getImageAssetID();
}
if (!LLSelectMgr::getInstance()->selectionSetGLTFMaterial(id))
{
@ -3584,7 +3509,7 @@ void LLPanelFace::onCancelNormalTexture(const LLSD& data)
U8 bumpy = 0;
bool identical_bumpy = false;
LLSelectedTE::getBumpmap(bumpy, identical_bumpy);
LLUUID spec_map_id = getChild<LLTextureCtrl>("bumpytexture control")->getImageAssetID();
LLUUID spec_map_id = mBumpyTextureCtrl->getImageAssetID();
bumpy = spec_map_id.isNull() ? bumpy : BUMPY_TEXTURE;
sendBump(bumpy);
}
@ -4055,13 +3980,11 @@ void LLPanelFace::onCommitRepeatsPerMeter(LLUICtrl* ctrl, void* userdata)
U32 material_type = 0;
if (materials_media == MATMEDIA_PBR)
{
LLRadioGroup *radio_mat_type = self->getChild<LLRadioGroup>("radio_pbr_type");
material_type = radio_mat_type->getSelectedIndex();
material_type = self->mRadioPbrType->getSelectedIndex();
}
if (materials_media == MATMEDIA_MATERIAL)
{
LLRadioGroup *radio_mat_type = self->getChild<LLRadioGroup>("radio_material_type");
material_type = radio_mat_type->getSelectedIndex();
material_type = self->mRadioMaterialType->getSelectedIndex();
}
F32 repeats_per_meter = (F32) repeats_ctrl->getValue().asReal();
@ -4189,15 +4112,14 @@ void LLPanelFace::onClickAutoFix(void* userdata)
void LLPanelFace::onAlignTexture(void* userdata)
{
LLPanelFace* self = (LLPanelFace*)userdata;
self->alignTestureLayer();
self->alignTextureLayer();
}
void LLPanelFace::onClickBtnLoadInvPBR(void* userdata)
{
// Shouldn't this be "save to inventory?"
LLPanelFace* self = (LLPanelFace*)userdata;
LLTextureCtrl* pbr_ctrl = self->findChild<LLTextureCtrl>("pbr_control");
pbr_ctrl->showPicker(true);
self->mPBRTextureCtrl->showPicker(true);
}
void LLPanelFace::onClickBtnEditPBR(void* userdata)
@ -5126,7 +5048,7 @@ void LLPanelFace::updateGLTFTextureTransform(float value, U32 pbr_type, std::fun
void LLPanelFace::setMaterialOverridesFromSelection()
{
const U32 pbr_type = findChild<LLRadioGroup>("radio_pbr_type")->getSelectedIndex();
const U32 pbr_type = mRadioPbrType->getSelectedIndex();
const LLGLTFMaterial::TextureInfo texture_info = texture_info_from_pbrtype(pbr_type);
U32 texture_info_start;
U32 texture_info_end;
@ -5296,7 +5218,7 @@ bool LLPanelFace::Selection::compareSelection()
void LLPanelFace::onCommitGLTFTextureScaleU(LLUICtrl* ctrl)
{
const float value = (F32)ctrl->getValue().asReal();
const U32 pbr_type = findChild<LLRadioGroup>("radio_pbr_type")->getSelectedIndex();
const U32 pbr_type = mRadioPbrType->getSelectedIndex();
updateGLTFTextureTransform(value, pbr_type, [&](LLGLTFMaterial::TextureTransform* new_transform)
{
new_transform->mScale.mV[VX] = value;
@ -5306,7 +5228,7 @@ void LLPanelFace::onCommitGLTFTextureScaleU(LLUICtrl* ctrl)
void LLPanelFace::onCommitGLTFTextureScaleV(LLUICtrl* ctrl)
{
const float value = (F32)ctrl->getValue().asReal();
const U32 pbr_type = findChild<LLRadioGroup>("radio_pbr_type")->getSelectedIndex();
const U32 pbr_type = mRadioPbrType->getSelectedIndex();
updateGLTFTextureTransform(value, pbr_type, [&](LLGLTFMaterial::TextureTransform* new_transform)
{
new_transform->mScale.mV[VY] = value;
@ -5316,7 +5238,7 @@ void LLPanelFace::onCommitGLTFTextureScaleV(LLUICtrl* ctrl)
void LLPanelFace::onCommitGLTFRotation(LLUICtrl* ctrl)
{
const float value = (F32)ctrl->getValue().asReal() * DEG_TO_RAD;
const U32 pbr_type = findChild<LLRadioGroup>("radio_pbr_type")->getSelectedIndex();
const U32 pbr_type = mRadioPbrType->getSelectedIndex();
updateGLTFTextureTransform(value, pbr_type, [&](LLGLTFMaterial::TextureTransform* new_transform)
{
new_transform->mRotation = value;
@ -5326,7 +5248,7 @@ void LLPanelFace::onCommitGLTFRotation(LLUICtrl* ctrl)
void LLPanelFace::onCommitGLTFTextureOffsetU(LLUICtrl* ctrl)
{
const float value = (F32)ctrl->getValue().asReal();
const U32 pbr_type = findChild<LLRadioGroup>("radio_pbr_type")->getSelectedIndex();
const U32 pbr_type = mRadioPbrType->getSelectedIndex();
updateGLTFTextureTransform(value, pbr_type, [&](LLGLTFMaterial::TextureTransform* new_transform)
{
new_transform->mOffset.mV[VX] = value;
@ -5336,7 +5258,7 @@ void LLPanelFace::onCommitGLTFTextureOffsetU(LLUICtrl* ctrl)
void LLPanelFace::onCommitGLTFTextureOffsetV(LLUICtrl* ctrl)
{
const float value = (F32)ctrl->getValue().asReal();
const U32 pbr_type = findChild<LLRadioGroup>("radio_pbr_type")->getSelectedIndex();
const U32 pbr_type = mRadioPbrType->getSelectedIndex();
updateGLTFTextureTransform(value, pbr_type, [&](LLGLTFMaterial::TextureTransform* new_transform)
{
new_transform->mOffset.mV[VY] = value;
@ -5346,13 +5268,11 @@ void LLPanelFace::onCommitGLTFTextureOffsetV(LLUICtrl* ctrl)
void LLPanelFace::onTextureSelectionChanged(LLInventoryItem* itemp)
{
LL_DEBUGS("Materials") << "item asset " << itemp->getAssetUUID() << LL_ENDL;
//LLRadioGroup* radio_mat_type = findChild<LLRadioGroup>("radio_material_type");
//if(!radio_mat_type)
if (!mRadioMatType)
if (!mRadioMaterialType)
{
return;
}
U32 mattype = mRadioMatType->getSelectedIndex();
U32 mattype = mRadioMaterialType->getSelectedIndex();
std::string which_control="texture control";
switch (mattype)
{
@ -5398,8 +5318,7 @@ void LLPanelFace::onTextureSelectionChanged(LLInventoryItem* itemp)
void LLPanelFace::onPbrSelectionChanged(LLInventoryItem* itemp)
{
LLTextureCtrl* pbr_ctrl = findChild<LLTextureCtrl>("pbr_control");
if (pbr_ctrl)
if (mPBRTextureCtrl)
{
LLUUID obj_owner_id;
std::string obj_owner_name;
@ -5417,12 +5336,12 @@ void LLPanelFace::onPbrSelectionChanged(LLInventoryItem* itemp)
if ((can_copy && can_transfer && can_modify) || from_library)
{
pbr_ctrl->setCanApply(true, true);
mPBRTextureCtrl->setCanApply(true, true);
return;
}
// if material has (no-transfer) attribute it can be applied only for object which we own and is not for sale
pbr_ctrl->setCanApply(false, can_transfer ? true : is_object_owner && not_for_sale);
mPBRTextureCtrl->setCanApply(false, can_transfer ? true : is_object_owner && not_for_sale);
if (gSavedSettings.getBOOL("TextureLivePreview"))
{

View File

@ -43,7 +43,6 @@ class LLColorSwatchCtrl;
class LLComboBox;
class LLInventoryItem;
class LLLineEditor;
class LLRadioGroup;
class LLSpinCtrl;
class LLTextBox;
class LLTextureCtrl;
@ -53,6 +52,7 @@ class LLFloater;
class LLMaterialID;
class LLMediaCtrl;
class LLMenuButton;
class LLRadioGroup;
class PBRPickerAgentListener;
class PBRPickerObjectListener;
@ -149,7 +149,7 @@ protected:
void sendFullbright(); // applies and sends full bright
void sendGlow();
void alignTestureLayer();
void alignTextureLayer();
void updateCopyTexButton();
@ -333,28 +333,30 @@ private:
F32 getCurrentTextureOffsetV();
// Build tool controls
LLTextureCtrl* mTextureCtrl;
LLTextureCtrl* mShinyTextureCtrl;
LLTextureCtrl* mBumpyTextureCtrl;
LLColorSwatchCtrl* mColorSwatch;
LLColorSwatchCtrl* mShinyColorSwatch;
LLComboBox* mComboTexGen;
LLRadioGroup* mRadioMatType;
LLRadioGroup* mRadioPbrType;
LLCheckBoxCtrl *mCheckFullbright;
LLTextBox* mLabelColorTransp;
LLSpinCtrl* mCtrlColorTransp; // transparency = 1 - alpha
LLSpinCtrl* mCtrlGlow;
LLSpinCtrl* mCtrlRpt;
// </FS:CR>
LLComboBox *mComboMatMedia;
LLMediaCtrl *mTitleMedia;
LLTextBox *mTitleMediaText;
LLTextureCtrl* mPBRTextureCtrl = nullptr;
LLTextureCtrl* mTextureCtrl = nullptr;
LLTextureCtrl* mShinyTextureCtrl = nullptr;
LLTextureCtrl* mBumpyTextureCtrl = nullptr;
LLColorSwatchCtrl* mColorSwatch = nullptr;
LLColorSwatchCtrl* mShinyColorSwatch = nullptr;
LLComboBox* mComboTexGen = nullptr;
LLRadioGroup* mRadioMaterialType = nullptr;
LLRadioGroup* mRadioPbrType = nullptr;
LLCheckBoxCtrl* mCheckFullbright = nullptr;
LLTextBox* mLabelColorTransp = nullptr;
LLSpinCtrl* mCtrlColorTransp = nullptr; // transparency = 1 - alpha
LLSpinCtrl* mCtrlGlow = nullptr;
LLComboBox *mComboMatMedia = nullptr;
LLMediaCtrl *mTitleMedia = nullptr;
LLTextBox *mTitleMediaText = nullptr;
// Update visibility of controls to match current UI mode
// (e.g. materials vs media editing)

View File

@ -1398,8 +1398,9 @@ void LLPanelGroupMembersSubTab::activate()
if (!gdatap || !gdatap->isMemberDataComplete())
{
const U32 page_size = 50;
std::string sort_column = mMembersList->getSortColumnName();
LLGroupMgr::getInstance()->sendCapGroupMembersRequest(mGroupID, page_size, 0, sort_column);
std::string sort_column_name = mMembersList->getSortColumnName();
bool sort_descending = !mMembersList->getSortAscending();
LLGroupMgr::getInstance()->sendCapGroupMembersRequest(mGroupID, page_size, 0, sort_column_name, sort_descending);
}
if (!gdatap || !gdatap->isRoleMemberDataComplete())

View File

@ -240,31 +240,33 @@ bool LLPanelMainInventory::postBuild()
//panel->getFilter().markDefault();
// Set up the default inv. panel/filter settings.
mActivePanel = getChild<LLInventoryPanel>(ALL_ITEMS);
if (mActivePanel)
mAllItemsPanel = getChild<LLInventoryPanel>(ALL_ITEMS);
if (mAllItemsPanel)
{
// "All Items" is the previous only view, so it gets the InventorySortOrder
mActivePanel->setSortOrder(gSavedSettings.getU32(LLInventoryPanel::DEFAULT_SORT_ORDER));
mActivePanel->getFilter().markDefault();
mActivePanel->getRootFolder()->applyFunctorRecursively(*mSavedFolderState);
mActivePanel->setSelectCallback(boost::bind(&LLPanelMainInventory::onSelectionChange, this, mActivePanel, _1, _2));
mAllItemsPanel->setSortOrder(gSavedSettings.getU32(LLInventoryPanel::DEFAULT_SORT_ORDER));
mAllItemsPanel->getFilter().markDefault();
mAllItemsPanel->getRootFolder()->applyFunctorRecursively(*mSavedFolderState);
mAllItemsPanel->setSelectCallback(boost::bind(&LLPanelMainInventory::onSelectionChange, this, mAllItemsPanel, _1, _2));
mResortActivePanel = true;
}
LLInventoryPanel* recent_items_panel = getChild<LLInventoryPanel>(RECENT_ITEMS);
if (recent_items_panel)
mActivePanel = mAllItemsPanel;
mRecentPanel = getChild<LLInventoryPanel>(RECENT_ITEMS);
if (mRecentPanel)
{
// assign default values until we will be sure that we have setting to restore
recent_items_panel->setSinceLogoff(true);
mRecentPanel->setSinceLogoff(true);
// <FS:Zi> Recent items panel should save sort order
// recent_items_panel->setSortOrder(LLInventoryFilter::SO_DATE);
recent_items_panel->setSortOrder(gSavedSettings.getU32(LLInventoryPanel::RECENTITEMS_SORT_ORDER));
// mRecentPanel->setSortOrder(LLInventoryFilter::SO_DATE);
mRecentPanel->setSortOrder(gSavedSettings.getU32(LLInventoryPanel::RECENTITEMS_SORT_ORDER));
// </FS:Zi>
recent_items_panel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);
LLInventoryFilter& recent_filter = recent_items_panel->getFilter();
mRecentPanel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);
LLInventoryFilter& recent_filter = mRecentPanel->getFilter();
recent_filter.setFilterObjectTypes(recent_filter.getFilterObjectTypes() & ~(0x1 << LLInventoryType::IT_CATEGORY));
recent_filter.setEmptyLookupMessage("InventoryNoMatchingRecentItems");
recent_filter.markDefault();
recent_items_panel->setSelectCallback(boost::bind(&LLPanelMainInventory::onSelectionChange, this, recent_items_panel, _1, _2));
mRecentPanel->setSelectCallback(boost::bind(&LLPanelMainInventory::onSelectionChange, this, mRecentPanel, _1, _2));
}
mWornItemsPanel = getChild<LLInventoryPanel>(WORN_ITEMS);
@ -313,12 +315,12 @@ bool LLPanelMainInventory::postBuild()
// Load the persistent "Recent Items" settings.
// Note that the "All Items" settings do not persist.
if(recent_items_panel)
if(mRecentPanel)
{
if(savedFilterState.has(recent_items_panel->getFilter().getName()))
if(savedFilterState.has(mRecentPanel->getFilter().getName()))
{
LLSD recent_items = savedFilterState.get(
recent_items_panel->getFilter().getName());
mRecentPanel->getFilter().getName());
// <FS:Ansariel> Fix wrong param type
//LLInventoryFilter::Params p;
LLInventoryPanel::InventoryState p;
@ -326,14 +328,14 @@ bool LLPanelMainInventory::postBuild()
LLParamSDParser parser;
parser.readSD(recent_items, p);
// <FS:Ansariel> Fix wrong param type
//recent_items_panel->getFilter().fromParams(p);
recent_items_panel->getFilter().fromParams(p.filter);
//mRecentPanel->getFilter().fromParams(p);
mRecentPanel->getFilter().fromParams(p.filter);
// </FS:Ansariel>
// <FS:Ansariel> We do that earlier already
//recent_items_panel->setSortOrder(gSavedSettings.getU32(LLInventoryPanel::RECENTITEMS_SORT_ORDER));
//mRecentPanel->setSortOrder(gSavedSettings.getU32(LLInventoryPanel::RECENTITEMS_SORT_ORDER));
// </FS:Ansariel> Recent items panel doesn't filter empty folders until filter floater has been opened
LLInventoryFilter& recent_filter = recent_items_panel->getFilter();
LLInventoryFilter& recent_filter = mRecentPanel->getFilter();
recent_filter.setFilterObjectTypes(recent_filter.getFilterObjectTypes() & ~(0x1 << LLInventoryType::IT_CATEGORY));
// </FS:Ansariel>
}
@ -489,7 +491,7 @@ LLPanelMainInventory::~LLPanelMainInventory( void )
LLInventoryPanel* LLPanelMainInventory::getAllItemsPanel()
{
return getChild<LLInventoryPanel>(ALL_ITEMS);
return mAllItemsPanel;
}
void LLPanelMainInventory::selectAllItemsPanel()
@ -499,7 +501,7 @@ void LLPanelMainInventory::selectAllItemsPanel()
bool LLPanelMainInventory::isRecentItemsPanelSelected()
{
return (RECENT_ITEMS == getActivePanel()->getName());
return (mRecentPanel == getActivePanel());
}
void LLPanelMainInventory::startSearch()
@ -1466,8 +1468,8 @@ void LLPanelMainInventory::toggleFindOptions()
void LLPanelMainInventory::setSelectCallback(const LLFolderView::signal_t::slot_type& cb)
{
getChild<LLInventoryPanel>(ALL_ITEMS)->setSelectCallback(cb);
getChild<LLInventoryPanel>(RECENT_ITEMS)->setSelectCallback(cb);
mAllItemsPanel->setSelectCallback(cb);
mRecentPanel->setSelectCallback(cb);
getChild<LLInventoryPanel>("Worn Items")->setSelectCallback(cb);
}
@ -1944,10 +1946,10 @@ void LLPanelMainInventory::initListCommandsHandlers()
{
childSetAction("trash_btn", boost::bind(&LLPanelMainInventory::onTrashButtonClick, this)); // <FS:Ansariel> Keep better inventory layout
childSetAction("add_btn", boost::bind(&LLPanelMainInventory::onAddButtonClick, this));
childSetAction("view_mode_btn", boost::bind(&LLPanelMainInventory::onViewModeClick, this));
childSetAction("up_btn", boost::bind(&LLPanelMainInventory::onUpFolderClicked, this));
childSetAction("back_btn", boost::bind(&LLPanelMainInventory::onBackFolderClicked, this));
childSetAction("forward_btn", boost::bind(&LLPanelMainInventory::onForwardFolderClicked, this));
mViewModeBtn->setCommitCallback(boost::bind(&LLPanelMainInventory::onViewModeClick, this));
mUpBtn->setCommitCallback(boost::bind(&LLPanelMainInventory::onUpFolderClicked, this));
mBackBtn->setCommitCallback(boost::bind(&LLPanelMainInventory::onBackFolderClicked, this));
mForwardBtn->setCommitCallback(boost::bind(&LLPanelMainInventory::onForwardFolderClicked, this));
// <FS:Ansariel> Keep better inventory layout
mTrashButton = getChild<LLDragAndDropButton>("trash_btn");
@ -2028,12 +2030,9 @@ void LLPanelMainInventory::initSingleFolderRoot(const LLUUID& start_folder_id)
void LLPanelMainInventory::initInventoryViews()
{
LLInventoryPanel* all_item = getChild<LLInventoryPanel>(ALL_ITEMS);
all_item->initializeViewBuilding();
LLInventoryPanel* recent_item = getChild<LLInventoryPanel>(RECENT_ITEMS);
recent_item->initializeViewBuilding();
LLInventoryPanel* worn_item = getChild<LLInventoryPanel>(WORN_ITEMS);
worn_item->initializeViewBuilding();
mAllItemsPanel->initializeViewBuilding();
mRecentPanel->initializeViewBuilding();
mWornItemsPanel->initializeViewBuilding();
}
void LLPanelMainInventory::toggleViewMode()

View File

@ -210,7 +210,9 @@ private:
LLUICtrl* mCounterCtrl;
LLHandle<LLFloater> mFinderHandle;
LLInventoryPanel* mActivePanel;
LLInventoryPanel* mWornItemsPanel;
LLInventoryPanel* mAllItemsPanel = nullptr;
LLInventoryPanel* mRecentPanel = nullptr;
LLInventoryPanel* mWornItemsPanel = nullptr;
bool mResortActivePanel;
LLSaveFolderState* mSavedFolderState;
std::string mFilterText;

View File

@ -441,6 +441,8 @@ LLPanelOutfitEdit::~LLPanelOutfitEdit()
delete mCOFDragAndDropObserver;
delete mWearableListViewItemsComparator;
while (!mListViewItemTypes.empty()) {
delete mListViewItemTypes.back();
mListViewItemTypes.pop_back();
@ -483,8 +485,10 @@ bool LLPanelOutfitEdit::postBuild()
mFolderViewBtn = getChild<LLButton>("folder_view_btn");
mListViewBtn = getChild<LLButton>("list_view_btn");
mFilterPanel = getChild<LLView>("filter_panel");
mFilterBtn = getChild<LLButton>("filter_button");
mFilterBtn->setCommitCallback(boost::bind(&LLPanelOutfitEdit::showWearablesFilter, this));
childSetCommitCallback("filter_button", boost::bind(&LLPanelOutfitEdit::showWearablesFilter, this), NULL);
childSetCommitCallback("folder_view_btn", boost::bind(&LLPanelOutfitEdit::showWearablesFolderView, this), NULL);
childSetCommitCallback("folder_view_btn", boost::bind(&LLPanelOutfitEdit::saveListSelection, this), NULL);
childSetCommitCallback("list_view_btn", boost::bind(&LLPanelOutfitEdit::showWearablesListView, this), NULL);
@ -537,13 +541,17 @@ bool LLPanelOutfitEdit::postBuild()
mSearchFilter = getChild<LLFilterEditor>("look_item_filter");
mSearchFilter->setCommitCallback(boost::bind(&LLPanelOutfitEdit::onSearchEdit, this, _2));
childSetAction("show_add_wearables_btn", boost::bind(&LLPanelOutfitEdit::onAddMoreButtonClicked, this));
mShowAddWearablesBtn = getChild<LLButton>("show_add_wearables_btn");
mShowAddWearablesBtn->setClickedCallback(boost::bind(&LLPanelOutfitEdit::onAddMoreButtonClicked, this));
mPlusBtn = getChild<LLButton>("plus_btn");
mPlusBtn->setClickedCallback(boost::bind(&LLPanelOutfitEdit::onPlusBtnClicked, this));
childSetAction(REVERT_BTN, boost::bind(&LLAppearanceMgr::wearBaseOutfit, LLAppearanceMgr::getInstance()));
mNoAddWearablesButtonBar = getChild<LLUICtrl>("no_add_wearables_button_bar");
mAddWearablesButtonBar = getChild<LLUICtrl>("add_wearables_button_bar");
/*
* By default AT_CLOTHING are sorted by (in in MY OUTFITS):
* - by type (types order determined in LLWearableType::EType)
@ -574,11 +582,15 @@ bool LLPanelOutfitEdit::postBuild()
getChild<LLButton>(SAVE_BTN)->setCommitCallback(boost::bind(&LLPanelOutfitEdit::saveOutfit, this, false));
getChild<LLButton>(SAVE_AS_BTN)->setCommitCallback(boost::bind(&LLPanelOutfitEdit::saveOutfit, this, true));
mLoadingIndicator = getChild<LLLoadingIndicator>("edit_outfit_loading_indicator");
mOutfitNameStatusPanel = getChild<LLPanel>("outfit_name_and_status");
// <FS:Ansariel> Show avatar complexity in appearance floater
mAvatarComplexityLabel = getChild<LLTextBox>("avatar_complexity_label");
mAvatarComplexityAddingLabel = getChild<LLTextBox>("avatar_complexity_adding_label");
onOutfitChanging(gAgentWearables.isCOFChangeInProgress());
return true;
}
@ -618,15 +630,15 @@ void LLPanelOutfitEdit::showAddWearablesPanel(bool show_add_wearables)
mAddWearablesPanel->setVisible(show_add_wearables);
getChild<LLUICtrl>("show_add_wearables_btn")->setValue(show_add_wearables);
mShowAddWearablesBtn->setValue(show_add_wearables);
updateFiltersVisibility();
getChildView("filter_button")->setVisible( show_add_wearables);
mFilterBtn->setVisible( show_add_wearables);
//search filter should be disabled
if (!show_add_wearables)
{
getChild<LLUICtrl>("filter_button")->setValue(false);
mFilterBtn->setValue(false);
mFolderViewFilterCmbBox->setVisible(false);
mListViewFilterCmbBox->setVisible(false);
@ -653,15 +665,15 @@ void LLPanelOutfitEdit::showAddWearablesPanel(bool show_add_wearables)
}
//switching button bars
getChildView("no_add_wearables_button_bar")->setVisible( !show_add_wearables);
getChildView("add_wearables_button_bar")->setVisible( show_add_wearables);
mNoAddWearablesButtonBar->setVisible( !show_add_wearables);
mAddWearablesButtonBar->setVisible( show_add_wearables);
}
void LLPanelOutfitEdit::showWearablesFilter()
{
bool filter_visible = getChild<LLUICtrl>("filter_button")->getValue();
bool filter_visible = mFilterBtn->getValue();
getChildView("filter_panel")->setVisible( filter_visible);
mFilterPanel->setVisible(filter_visible);
if(!filter_visible)
{
@ -1324,19 +1336,17 @@ static void update_status_widget_rect(LLView * widget, S32 right_border)
void LLPanelOutfitEdit::onOutfitChanging(bool started)
{
static LLLoadingIndicator* indicator = getChild<LLLoadingIndicator>("edit_outfit_loading_indicator");
static LLView* status_panel = getChild<LLView>("outfit_name_and_status");
static S32 indicator_delta = status_panel->getRect().getWidth() - indicator->getRect().mLeft;
S32 indicator_delta = mOutfitNameStatusPanel->getRect().getWidth() - mLoadingIndicator->getRect().mLeft;
S32 delta = started ? indicator_delta : 0;
S32 right_border = status_panel->getRect().getWidth() - delta;
S32 right_border = mOutfitNameStatusPanel->getRect().getWidth() - delta;
if (mCurrentOutfitName)
update_status_widget_rect(mCurrentOutfitName, right_border);
if (mStatus)
update_status_widget_rect(mStatus, right_border);
indicator->setVisible(started);
mLoadingIndicator->setVisible(started);
}
void LLPanelOutfitEdit::getCurrentItemUUID(LLUUID& selected_id)

View File

@ -59,6 +59,7 @@ class LLMenuGL;
class LLFindNonLinksByMask;
class LLFindWearablesOfType;
class LLWearableItemTypeNameComparator;
class LLLoadingIndicator;
class LLPanelOutfitEdit : public LLPanel
{
@ -221,7 +222,15 @@ private:
LLButton* mFolderViewBtn;
LLButton* mListViewBtn;
LLButton* mPlusBtn;
LLButton* mShowAddWearablesBtn = nullptr;
LLButton* mFilterBtn = nullptr;
LLPanel* mAddWearablesPanel;
LLPanel* mOutfitNameStatusPanel = nullptr;
LLLoadingIndicator* mLoadingIndicator = nullptr;
LLView* mFilterPanel = nullptr;
LLUICtrl* mNoAddWearablesButtonBar = nullptr;
LLUICtrl* mAddWearablesButtonBar = nullptr;
// <FS:Ansariel> Show avatar complexity in appearance floater
LLTextBox* mAvatarComplexityLabel;
LLTextBox* mAvatarComplexityAddingLabel;

View File

@ -292,7 +292,8 @@ void LLPanelOutfitsInventory::openApearanceTab(const std::string& tab_name)
void LLPanelOutfitsInventory::initListCommandsHandlers()
{
mListCommands = getChild<LLPanel>("bottom_panel");
mListCommands->childSetAction("wear_btn", boost::bind(&LLPanelOutfitsInventory::onWearButtonClick, this));
mWearBtn = mListCommands->getChild<LLButton>("wear_btn");
mWearBtn->setCommitCallback(boost::bind(&LLPanelOutfitsInventory::onWearButtonClick, this));
mMyOutfitsPanel->childSetAction("trash_btn", boost::bind(&LLPanelOutfitsInventory::onTrashButtonClick, this));
mOutfitGalleryPanel->childSetAction("trash_btn", boost::bind(&LLPanelOutfitsInventory::onTrashButtonClick, this));
}
@ -303,14 +304,12 @@ void LLPanelOutfitsInventory::updateListCommands()
bool wear_enabled = isActionEnabled("wear");
bool wear_visible = !isCOFPanelActive();
bool make_outfit_enabled = isActionEnabled("save_outfit");
LLButton* wear_btn = mListCommands->getChild<LLButton>("wear_btn");
mMyOutfitsPanel->childSetEnabled("trash_btn", trash_enabled);
mOutfitGalleryPanel->childSetEnabled("trash_btn", trash_enabled);
wear_btn->setEnabled(wear_enabled);
wear_btn->setVisible(wear_visible);
mWearBtn->setEnabled(wear_enabled);
mWearBtn->setVisible(wear_visible);
getChild<LLButton>(SAVE_BTN)->setEnabled(make_outfit_enabled);
wear_btn->setToolTip(getString((!isOutfitsGalleryPanelActive() && mMyOutfitsPanel->hasItemSelected()) ? "wear_items_tooltip" : "wear_outfit_tooltip"));
mWearBtn->setToolTip(getString((!isOutfitsGalleryPanelActive() && mMyOutfitsPanel->hasItemSelected()) ? "wear_items_tooltip" : "wear_outfit_tooltip"));
}
void LLPanelOutfitsInventory::onTrashButtonClick()

View File

@ -116,6 +116,7 @@ protected:
private:
LLPanel* mListCommands;
LLMenuGL* mMenuAdd;
LLButton* mWearBtn = nullptr;
// List Commands //
//////////////////////////////////////////////////////////////////////////////////

View File

@ -170,8 +170,6 @@ public:
id_it = uuids.begin(),
id_end = uuids.end();
LLAvatarItemDistanceComparator::id_to_pos_map_t pos_map;
mAvatarsPositions.clear();
for (;pos_it != pos_end && id_it != id_end; ++pos_it, ++id_it )
@ -673,17 +671,14 @@ bool LLPanelPeople::postBuild()
//S32 max_premium = LLAgentBenefitsMgr::get("Premium").getGroupMembershipLimit();
// </FS:Ansariel>
// <FS:Ansariel> Firestorm radar
//mNearbyFilterCommitConnection = getChild<LLFilterEditor>("nearby_filter_input")->setCommitCallback(boost::bind(&LLPanelPeople::onFilterEdit, this, _2));
mFriedsFilterCommitConnection = getChild<LLFilterEditor>("friends_filter_input")->setCommitCallback(boost::bind(&LLPanelPeople::onFilterEdit, this, _2));
mGroupsFilterCommitConnection = getChild<LLFilterEditor>("groups_filter_input")->setCommitCallback(boost::bind(&LLPanelPeople::onFilterEdit, this, _2));
mRecentFilterCommitConnection = getChild<LLFilterEditor>("recent_filter_input")->setCommitCallback(boost::bind(&LLPanelPeople::onFilterEdit, this, _2));
LLPanel* group_tab = getChild<LLPanel>(GROUP_TAB_NAME);
mGroupDelBtn = group_tab->getChild<LLButton>("minus_btn");
mGroupCountText = group_tab->getChild<LLTextBox>("groupcount");
// <FS:Ansariel> Don't bother with "want more?" advertisement
//if(LLAgentBenefitsMgr::current().getGroupMembershipLimit() < max_premium)
//{
// getChild<LLTextBox>("groupcount")->setText(getString("GroupCountWithInfo"));
// getChild<LLTextBox>("groupcount")->setURLClickedCallback(boost::bind(&LLPanelPeople::onGroupLimitInfo, this));
// mGroupCountText->setText(getString("GroupCountWithInfo"));
// mGroupCountText->setURLClickedCallback(boost::bind(&LLPanelPeople::onGroupLimitInfo, this));
//}
// </FS:Ansariel>
mTabContainer = getChild<LLTabContainer>("tabs");
@ -696,6 +691,9 @@ bool LLPanelPeople::postBuild()
friends_tab->setVisibleCallback(boost::bind(&Updater::setActive, mFriendListUpdater, _2));
friends_tab->setVisibleCallback(boost::bind(&LLPanelPeople::removePicker, this));
mFriendsGearBtn = friends_tab->getChild<LLButton>("gear_btn");
mFriendsDelFriendBtn = friends_tab->getChild<LLUICtrl>("friends_del_btn");
// <FS:Ansariel> FIRE-4740: Friend counter in people panel
mFriendsTabContainer = friends_tab->findChild<LLTabContainer>("friends_accordion");
// <FS:Ansariel> Firestorm radar
@ -703,11 +701,11 @@ bool LLPanelPeople::postBuild()
mAllFriendList = friends_tab->getChild<LLAvatarList>("avatars_all");
mOnlineFriendList->setNoItemsCommentText(getString("no_friends_online"));
mOnlineFriendList->setShowIcons("FriendsListShowIcons");
mOnlineFriendList->showPermissions("FriendsListShowPermissions");
mOnlineFriendList->showPermissions(gSavedSettings.getBOOL("FriendsListShowPermissions"));
mOnlineFriendList->setShowCompleteName(!gSavedSettings.getBOOL("FriendsListHideUsernames"));
mAllFriendList->setNoItemsCommentText(getString("no_friends"));
mAllFriendList->setShowIcons("FriendsListShowIcons");
mAllFriendList->showPermissions("FriendsListShowPermissions");
mAllFriendList->showPermissions(gSavedSettings.getBOOL("FriendsListShowPermissions"));
mAllFriendList->setShowCompleteName(!gSavedSettings.getBOOL("FriendsListHideUsernames"));
LLPanel* nearby_tab = getChild<LLPanel>(NEARBY_TAB_NAME);
@ -732,23 +730,36 @@ bool LLPanelPeople::postBuild()
//mNearbyList->setRlvCheckShowNames(true);
// [/RLVa:KB]
mMiniMap = (LLNetMap*)getChildView("Net Map",true);
mMiniMap = nearby_tab->getChild<LLNetMap>("Net Map", true);
// <FS:Ansariel> Synchronize tooltips throughout instances
//mMiniMap->setToolTipMsg(gSavedSettings.getBOOL("DoubleClickTeleport") ?
// getString("AltMiniMapToolTipMsg") : getString("MiniMapToolTipMsg"));
// <//FS:Ansariel> Synchronize tooltips throughout instances
mRecentList = getChild<LLPanel>(RECENT_TAB_NAME)->getChild<LLAvatarList>("avatar_list");
mNearbyGearBtn = nearby_tab->getChild<LLButton>("gear_btn");
mNearbyAddFriendBtn = nearby_tab->getChild<LLButton>("add_friend_btn");
LLPanel* recent_tab = getChild<LLPanel>(RECENT_TAB_NAME);
mRecentList = recent_tab->getChild<LLAvatarList>("avatar_list");
mRecentList->setNoItemsCommentText(getString("no_recent_people"));
mRecentList->setNoItemsMsg(getString("no_recent_people"));
mRecentList->setNoFilteredItemsMsg(getString("no_filtered_recent_people"));
mRecentList->setShowIcons("RecentListShowIcons");
mGroupList = getChild<LLGroupList>("group_list");
mRecentGearBtn = recent_tab->getChild<LLButton>("gear_btn");
mRecentAddFriendBtn = recent_tab->getChild<LLButton>("add_friend_btn");
mGroupList = group_tab->getChild<LLGroupList>("group_list");
mGroupList->setNoItemsCommentText(getString("no_groups_msg"));
mGroupList->setNoItemsMsg(getString("no_groups_msg"));
mGroupList->setNoFilteredItemsMsg(getString("no_filtered_groups_msg"));
// <FS:Ansariel> Firestorm radar
//mNearbyFilterCommitConnection = nearby_tab->getChild<LLFilterEditor>("nearby_filter_input")->setCommitCallback(boost::bind(&LLPanelPeople::onFilterEdit, this, _2));
mFriedsFilterCommitConnection = friends_tab->getChild<LLFilterEditor>("friends_filter_input")->setCommitCallback(boost::bind(&LLPanelPeople::onFilterEdit, this, _2));
mRecentFilterCommitConnection = recent_tab->getChild<LLFilterEditor>("recent_filter_input")->setCommitCallback(boost::bind(&LLPanelPeople::onFilterEdit, this, _2));
mGroupsFilterCommitConnection = group_tab->getChild<LLFilterEditor>("groups_filter_input")->setCommitCallback(boost::bind(&LLPanelPeople::onFilterEdit, this, _2));
// <FS:Ansariel> Use Firestorm radar menu handler
//mNearbyList->setContextMenu(&LLPanelPeopleMenus::gNearbyPeopleContextMenu);
// </FS:Ansariel>
@ -978,13 +989,11 @@ void LLPanelPeople::updateRecentList()
void LLPanelPeople::updateButtons()
{
std::string cur_tab = getActiveTabName();
// [RLVa:KB] - Checked: RLVa-1.4.9
const std::string& cur_tab = getActiveTabName();
bool nearby_tab_active = (cur_tab == NEARBY_TAB_NAME);
// [/RLVa:KB]
bool friends_tab_active = (cur_tab == FRIENDS_TAB_NAME);
bool group_tab_active = (cur_tab == GROUP_TAB_NAME);
//bool recent_tab_active = (cur_tab == RECENT_TAB_NAME);
bool recent_tab_active = (cur_tab == RECENT_TAB_NAME);
LLUUID selected_id;
uuid_vec_t selected_uuids;
@ -999,16 +1008,15 @@ void LLPanelPeople::updateButtons()
selected_id = mGroupList->getSelectedUUID();
}
LLPanel* groups_panel = mTabContainer->getCurrentPanel();
groups_panel->getChildView("minus_btn")->setEnabled(item_selected && selected_id.notNull()); // a real group selected
mGroupDelBtn->setEnabled(item_selected && selected_id.notNull()); // a real group selected
// <FS:CR> FIRE-12229
//U32 groups_count = static_cast<U32>(gAgent.mGroups.size());
//U32 max_groups = LLAgentBenefitsMgr::current().getGroupMembershipLimit();
//U32 groups_remaining = max_groups > groups_count ? max_groups - groups_count : 0;
//groups_panel->getChild<LLUICtrl>("groupcount")->setTextArg("[COUNT]", llformat("%d", groups_count));
//groups_panel->getChild<LLUICtrl>("groupcount")->setTextArg("[REMAINING]", llformat("%d", groups_remaining));
getChild<LLUICtrl>("groupcount")->setValue(FSCommon::populateGroupCount());
//mGroupCountText->setTextArg("[COUNT]", llformat("%d", groups_count));
//mGroupCountText->setTextArg("[REMAINING]", llformat("%d", groups_remaining));
mGroupCountText->setValue(FSCommon::populateGroupCount());
// </FS:CR>
}
else
@ -1023,40 +1031,39 @@ void LLPanelPeople::updateButtons()
is_self = gAgent.getID() == selected_id;
}
LLPanel* cur_panel = mTabContainer->getCurrentPanel();
if (cur_panel)
{
// <FS:Ansariel> RLVa check
//if (cur_panel->hasChild("add_friend_btn", true))
// cur_panel->getChildView("add_friend_btn")->setEnabled(item_selected && !is_friend && !is_self);
if (!nearby_tab_active && cur_panel->hasChild("add_friend_btn", true))
cur_panel->getChildView("add_friend_btn")->setEnabled(item_selected && !is_friend && !is_self && RlvActions::canShowName(RlvActions::SNC_DEFAULT, selected_id));
// </FS:Ansariel> RLVa check
// <FS:Ansariel> Firestorm radar
//if(nearby_tab_active)
//{
// mNearbyAddFriendBtn->setEnabled(item_selected && !is_friend && !is_self);
// mNearbyGearBtn->setEnabled(multiple_selected);
//}
// </FS:Ansariel> Firestorm radar
if (friends_tab_active)
{
cur_panel->getChildView("friends_del_btn")->setEnabled(multiple_selected);
mFriendsDelFriendBtn->setEnabled(multiple_selected);
mFriendsGearBtn->setEnabled(multiple_selected);
}
// <FS:Ansariel> Fix warning about missing gear button on blocklist panel
//if (!group_tab_active)
if (!group_tab_active && !nearby_tab_active && cur_tab != BLOCKED_TAB_NAME)
// </FS:Ansariel>
if (recent_tab_active)
{
cur_panel->getChildView("gear_btn")->setEnabled(multiple_selected);
// <FS:Ansariel> RLVa check
//mRecentAddFriendBtn->setEnabled(item_selected && !is_friend && !is_self);
mRecentAddFriendBtn->setEnabled(item_selected && !is_friend && !is_self && RlvActions::canShowName(RlvActions::SNC_DEFAULT, selected_id));
mRecentGearBtn->setEnabled(multiple_selected);
}
}
}
}
std::string LLPanelPeople::getActiveTabName() const
const std::string& LLPanelPeople::getActiveTabName() const
{
return mTabContainer->getCurrentPanel()->getName();
}
LLUUID LLPanelPeople::getCurrentItemID() const
{
std::string cur_tab = getActiveTabName();
const std::string& cur_tab = getActiveTabName();
if (cur_tab == FRIENDS_TAB_NAME) // this tab has two lists
{
@ -1093,7 +1100,7 @@ LLUUID LLPanelPeople::getCurrentItemID() const
void LLPanelPeople::getCurrentItemIDs(uuid_vec_t& selected_uuids) const
{
std::string cur_tab = getActiveTabName();
const std::string& cur_tab = getActiveTabName();
if (cur_tab == FRIENDS_TAB_NAME)
{
@ -1193,7 +1200,7 @@ void LLPanelPeople::onFilterEdit(const std::string& search_string)
saved_filter = search_upper;
// Apply new filter to the current tab.
const std::string cur_tab = getActiveTabName();
const std::string& cur_tab = getActiveTabName();
if (cur_tab == NEARBY_TAB_NAME)
{
mNearbyList->setNameFilter(filter);

View File

@ -106,7 +106,7 @@ private:
bool isItemsFreeOfFriends(const uuid_vec_t& uuids);
void updateButtons();
std::string getActiveTabName() const;
const std::string& getActiveTabName() const;
LLUUID getCurrentItemID() const;
void getCurrentItemIDs(uuid_vec_t& selected_uuids) const;
void setSortOrder(LLAvatarList* list, ESortOrder order, bool save = true);
@ -167,6 +167,17 @@ private:
// <FS:Ansariel> FIRE-4740: Friend counter in people panel
LLTabContainer* mFriendsTabContainer;
LLButton* mNearbyGearBtn = nullptr;
LLButton* mFriendsGearBtn = nullptr;
LLButton* mRecentGearBtn = nullptr;
LLButton* mGroupDelBtn = nullptr;
LLButton* mNearbyAddFriendBtn = nullptr;
LLButton* mRecentAddFriendBtn = nullptr;
LLUICtrl* mFriendsDelFriendBtn = nullptr;
LLTextBox* mGroupCountText = nullptr;
std::vector<std::string> mSavedOriginalFilters;
std::vector<std::string> mSavedFilters;

View File

@ -469,7 +469,7 @@ void LLProgressView::initLogos()
//#endif // defined(LL_FMODSTUDIO) || defined(LL_HAVOK) // <FS> FIRE-30937: Always needed
// We don't know final screen rect yet, so we can't precalculate position fully
S32 texture_start_x = (S32)mLogosLabel->getFont()->getWidthF32(mLogosLabel->getText()) + default_pad;
S32 texture_start_x = (S32)mLogosLabel->getFont()->getWidthF32(mLogosLabel->getWText().c_str()) + default_pad;
S32 texture_start_y = -7;
// Normally we would just preload these textures from textures.xml,

View File

@ -51,12 +51,13 @@ LLScrollingPanelParamBase::LLScrollingPanelParamBase( const LLPanel::Params& pan
else
buildFromFile( "panel_scrolling_param_base.xml");
getChild<LLUICtrl>("param slider")->setValue(weightToPercent(param->getWeight()));
mParamSlider = getChild<LLUICtrl>("param slider");
mParamSlider->setValue(weightToPercent(param->getWeight()));
std::string display_name = LLTrans::getString(param->getDisplayName());
getChild<LLUICtrl>("param slider")->setLabelArg("[DESC]", display_name);
getChildView("param slider")->setEnabled(mAllowModify);
childSetCommitCallback("param slider", LLScrollingPanelParamBase::onSliderMoved, this);
mParamSlider->setLabelArg("[DESC]", display_name);
mParamSlider->setEnabled(mAllowModify);
mParamSlider->setCommitCallback(LLScrollingPanelParamBase::onSliderMoved, this);
setVisible(false);
setBorderVisible( false );
@ -77,9 +78,9 @@ void LLScrollingPanelParamBase::updatePanel(bool allow_modify)
}
F32 current_weight = mWearable->getVisualParamWeight( param->getID() );
getChild<LLUICtrl>("param slider")->setValue(weightToPercent( current_weight ) );
mParamSlider->setValue(weightToPercent( current_weight ) );
mAllowModify = allow_modify;
getChildView("param slider")->setEnabled(mAllowModify);
mParamSlider->setEnabled(mAllowModify);
}
// static

View File

@ -55,6 +55,7 @@ public:
public:
LLViewerVisualParam* mParam;
protected:
LLUICtrl* mParamSlider = nullptr;
bool mAllowModify;
LLWearable *mWearable;
};

View File

@ -39,6 +39,7 @@
#include "llfloaterreg.h"
#include "llfloaterworldmap.h"
#include "llfolderviewmodel.h"
#include "llloadingindicator.h"
#include "lloutfitobserver.h"
#include "llpaneleditwearable.h"
#include "llpaneloutfitsinventory.h"
@ -139,6 +140,8 @@ bool LLSidepanelAppearance::postBuild()
mCurrOutfitPanel = getChild<LLPanel>("panel_currentlook");
mWearableLoadingIndicator = getChild<LLLoadingIndicator>("wearables_loading_indicator");
mEditOutfitBtn = getChild<LLButton>("edit_outfit_btn");
setVisibleCallback(boost::bind(&LLSidepanelAppearance::onVisibilityChanged,this,_2));
@ -543,8 +546,8 @@ void LLSidepanelAppearance::inventoryFetched()
void LLSidepanelAppearance::setWearablesLoading(bool val)
{
getChildView("wearables_loading_indicator")->setVisible( val);
getChildView("edit_outfit_btn")->setVisible( !val);
mWearableLoadingIndicator->setVisible(val);
mEditOutfitBtn->setVisible(!val);
if (!val)
{

View File

@ -38,6 +38,7 @@ class LLCurrentlyWornFetchObserver;
class LLPanelEditWearable;
class LLViewerWearable;
class LLPanelOutfitsInventory;
class LLLoadingIndicator;
class LLSidepanelAppearance : public LLPanel
{
@ -101,8 +102,11 @@ private:
LLButton* mOpenOutfitBtn;
LLButton* mEditAppearanceBtn;
LLButton* mEditOutfitBtn = nullptr;
LLPanel* mCurrOutfitPanel;
LLLoadingIndicator* mWearableLoadingIndicator = nullptr;
LLTextBox* mCurrentLookName;
LLTextBox* mOutfitStatus;

View File

@ -108,21 +108,27 @@ LLPanelWearableOutfitItem::Params::Params()
bool LLPanelWearableOutfitItem::postBuild()
{
if (mShowWidgets)
{
mAddWearableBtn = getChild<LLButton>("add_wearable");
mRemoveWearableBtn = getChild<LLButton>("remove_wearable");
}
LLPanelWearableListItem::postBuild();
//if(mShowWidgets) // <FS:Ansariel> Make Add/Remove buttons work
{
// <FS:Ansariel> Make Add/Remove buttons work
//addWidgetToRightSide("add_wearable");
//addWidgetToRightSide("remove_wearable");
//addWidgetToRightSide(mAddWearableBtn);
//addWidgetToRightSide(mAddWearableBtn);
LLViewerInventoryItem* inv_item = getItem();
mShowWidgets &= (inv_item->getType() != LLAssetType::AT_BODYPART);
addWidgetToRightSide("add_wearable", mShowWidgets);
addWidgetToRightSide("remove_wearable", mShowWidgets);
addWidgetToRightSide(mAddWearableBtn, mShowWidgets);
addWidgetToRightSide(mAddWearableBtn, mShowWidgets);
// </FS:Ansariel>
childSetAction("add_wearable", boost::bind(&LLPanelWearableOutfitItem::onAddWearable, this));
childSetAction("remove_wearable", boost::bind(&LLPanelWearableOutfitItem::onRemoveWearable, this));
mAddWearableBtn->setClickedCallback(boost::bind(&LLPanelWearableOutfitItem::onAddWearable, this));
mRemoveWearableBtn->setClickedCallback(boost::bind(&LLPanelWearableOutfitItem::onRemoveWearable, this));
setWidgetsVisible(false);
reshapeWidgets();
@ -253,14 +259,14 @@ void LLPanelWearableOutfitItem::updateItem(const std::string& name,
if(mShowWidgets)
{
setShowWidget("add_wearable", !is_worn);
setShowWidget(mAddWearableBtn, !is_worn);
// <FS:Ansariel> Make Add/Remove buttons work
//// Body parts can't be removed, only replaced
//LLViewerInventoryItem* inv_item = getItem();
//bool show_remove = is_worn && inv_item && (inv_item->getType() != LLAssetType::AT_BODYPART);
//setShowWidget("remove_wearable", show_remove);
setShowWidget("remove_wearable", is_worn);
setShowWidget(mRemoveWearableBtn, is_worn);
// </FS:Ansariel>
if(mHovered)

View File

@ -104,6 +104,8 @@ protected:
bool worn_indication_enabled, const Params& params, bool show_widgets = false);
private:
LLButton* mAddWearableBtn = nullptr;
LLButton* mRemoveWearableBtn = nullptr;
bool mWornIndicationEnabled;
// <FS:Ansariel> Make Add/Remove buttons work
protected:

View File

@ -1197,21 +1197,23 @@ void LLWorldMapView::drawTracking(const LLVector3d& pos_global, const LLColor4&
drawImage(pos_global, sTrackCircleImage, color);
}
// clamp text position to on-screen
const S32 TEXT_PADDING = DEFAULT_TRACKING_ARROW_SIZE + 2;
S32 half_text_width = llfloor(font->getWidthF32(label) * 0.5f);
text_x = llclamp(text_x, half_text_width + TEXT_PADDING, getRect().getWidth() - half_text_width - TEXT_PADDING);
text_y = llclamp(text_y + vert_offset, TEXT_PADDING + vert_offset, getRect().getHeight() - font->getLineHeight() - TEXT_PADDING - vert_offset);
// if (label != "")
// [RLVa:KB] - Checked: 2009-07-04 (RLVa-1.4.5) | Added: RLVa-1.0.0
if ( (label != "") && (RlvActions::canShowLocation()) )
// [/RLVa:KB]
{
font->renderUTF8(
label, 0,
text_x,
text_y,
// clamp text position to on-screen
const S32 TEXT_PADDING = DEFAULT_TRACKING_ARROW_SIZE + 2;
LLWString wlabel = utf8string_to_wstring(label);
S32 half_text_width = llfloor(font->getWidthF32(wlabel.c_str()) * 0.5f);
text_x = llclamp(text_x, half_text_width + TEXT_PADDING, getRect().getWidth() - half_text_width - TEXT_PADDING);
text_y = llclamp(text_y + vert_offset, TEXT_PADDING + vert_offset, getRect().getHeight() - font->getLineHeight() - TEXT_PADDING - vert_offset);
font->render(
wlabel, 0,
(F32)text_x,
(F32)text_y,
LLColor4::white, LLFontGL::HCENTER,
LLFontGL::BASELINE, LLFontGL::NORMAL, LLFontGL::DROP_SHADOW);