SL-15383 Crash at SearchableControl's setHighlighted

master
Andrey Kleshchev 2021-06-14 21:19:55 +03:00
parent 261ba33537
commit 5b92d266df
2 changed files with 38 additions and 7 deletions

View File

@ -263,7 +263,8 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key)
mGotPersonalInfo(false),
mOriginalIMViaEmail(false),
mLanguageChanged(false),
mAvatarDataInitialized(false)
mAvatarDataInitialized(false),
mSearchDataDirty(true)
{
LLConversationLog::instance().addObserver(this);
@ -2150,6 +2151,11 @@ void LLFloaterPreference::updateClickActionViews()
getChild<LLComboBox>("double_click_action_combo")->setValue(dbl_click_to_teleport ? 2 : (int)dbl_click_to_walk);
}
void LLFloaterPreference::updateSearchableItems()
{
mSearchDataDirty = true;
}
void LLFloaterPreference::applyUIColor(LLUICtrl* ctrl, const LLSD& param)
{
LLUIColorTable::instance().setColor(param.asString(), LLColor4(ctrl->getValue()));
@ -2906,10 +2912,19 @@ void LLPanelPreferenceControls::populateControlTable()
filename = "control_table_contents_columns_basic.xml";
break;
default:
// Either unknown mode or MODE_SAVED_SETTINGS
// It doesn't have UI or actual settings yet
LL_INFOS() << "Unimplemented mode" << LL_ENDL;
return;
{
// Either unknown mode or MODE_SAVED_SETTINGS
// It doesn't have UI or actual settings yet
LL_WARNS() << "Unimplemented mode" << LL_ENDL;
// Searchable columns were removed, mark searchables for an update
LLFloaterPreference* instance = LLFloaterReg::findTypedInstance<LLFloaterPreference>("preferences");
if (instance)
{
instance->updateSearchableItems();
}
return;
}
}
addControlTableColumns(filename);
@ -2940,8 +2955,15 @@ void LLPanelPreferenceControls::populateControlTable()
}
else
{
LL_INFOS() << "Unimplemented mode" << LL_ENDL;
return;
LL_WARNS() << "Unimplemented mode" << LL_ENDL;
}
// Searchable columns were removed and readded, mark searchables for an update
// Note: at the moment tables/lists lack proper llsearchableui support
LLFloaterPreference* instance = LLFloaterReg::findTypedInstance<LLFloaterPreference>("preferences");
if (instance)
{
instance->updateSearchableItems();
}
}
@ -3559,6 +3581,12 @@ void LLFloaterPreference::onUpdateFilterTerm(bool force)
if( !mSearchData || (mSearchData->mLastFilter == seachValue && !force))
return;
if (mSearchDataDirty)
{
// Data exists, but is obsolete, regenerate
collectSearchableItems();
}
mSearchData->mLastFilter = seachValue;
if( !mSearchData->mRootTab )
@ -3656,4 +3684,5 @@ void LLFloaterPreference::collectSearchableItems()
collectChildren( this, ll::prefs::PanelDataPtr(), pRootTabcontainer );
}
mSearchDataDirty = false;
}

View File

@ -108,6 +108,7 @@ public:
void getControlNames(std::vector<std::string>& names);
// updates click/double-click action controls depending on values from settings.xml
void updateClickActionViews();
void updateSearchableItems();
protected:
void onBtnOK(const LLSD& userdata);
@ -220,6 +221,7 @@ private:
LLSearchEditor *mFilterEdit;
std::unique_ptr< ll::prefs::SearchData > mSearchData;
bool mSearchDataDirty;
void onUpdateFilterTerm( bool force = false );
void collectSearchableItems();