summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRye Mutt <rye@alchemyviewer.org>2024-07-25 23:57:22 -0400
committerRye Mutt <rye@alchemyviewer.org>2024-07-25 23:57:22 -0400
commit99b4f1dd20c01d195e9de7c1ee23e28cc198ee04 (patch)
treec8b71dcb54271aff430a3651253dc652678d2b35
parent543dbfee498b84e440ea75ae156d8d666ba1c1c9 (diff)
Fix some findChild stalls when swapping to/from wearable editors
-rw-r--r--indra/newview/llpaneleditwearable.cpp76
-rw-r--r--indra/newview/llpaneleditwearable.h13
2 files changed, 59 insertions, 30 deletions
diff --git a/indra/newview/llpaneleditwearable.cpp b/indra/newview/llpaneleditwearable.cpp
index e88f6c0470..282b6d4a0a 100644
--- a/indra/newview/llpaneleditwearable.cpp
+++ b/indra/newview/llpaneleditwearable.cpp
@@ -48,6 +48,7 @@
#include "llscrollingpanelparam.h"
#include "llradiogroup.h"
#include "llnotificationsutil.h"
+#include "lliconctrl.h"
#include "llcolorswatch.h"
#include "lltexturectrl.h"
@@ -307,8 +308,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));
- 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));
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));
}
@@ -727,8 +728,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
@@ -806,8 +813,20 @@ 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);
+ }
+ }
}
// initialize texture and color picker controls
@@ -1211,19 +1230,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))
@@ -1237,7 +1258,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;
@@ -1337,9 +1358,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);
}
}
@@ -1400,15 +1421,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;
-
- LLScrollingPanelList *panel_list = getChild<LLScrollingPanelList>(scrolling_panel);
+ const std::string& scrolling_panel = subpart_entry->mParamList;
- 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);
}
@@ -1542,7 +1563,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);
if (isAgentAvatarValid())
{
@@ -1580,7 +1601,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)
@@ -1637,11 +1658,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));
diff --git a/indra/newview/llpaneleditwearable.h b/indra/newview/llpaneleditwearable.h
index aa4ac915c7..443b52b8fc 100644
--- a/indra/newview/llpaneleditwearable.h
+++ b/indra/newview/llpaneleditwearable.h
@@ -44,6 +44,8 @@ class LLViewerJointMesh;
class LLAccordionCtrlTab;
class LLJoint;
class LLLineEditor;
+class LLRadioGroup;
+class LLIconCtrl;
class LLPanelEditWearable : public LLPanel
{
@@ -123,6 +125,7 @@ private:
LLViewerInventoryItem* mWearableItem;
// these are constant no matter what wearable we're editing
+ LLButton* mBtnSaveAs;
LLButton *mBtnRevert;
LLButton *mBtnBack;
std::string mBackBtnLabel;
@@ -131,6 +134,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;
@@ -170,8 +176,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;