diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 192fc58e23..d797315272 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -17968,15 +17968,13 @@ Change of this parameter will affect the layout of buttons in notification toast DebugWebRTCRequireEstablishedSpatialSession Comment - Test for FIRE-36672 + Only report proximal channel when a spatial session is established (FIRE-36672) Persist 1 Type Boolean Value - 0 - Backup - 0 + 1 VivoxVoiceHost diff --git a/indra/newview/fsfloatergrouptitles.cpp b/indra/newview/fsfloatergrouptitles.cpp index 7334d852cf..3629a0f848 100644 --- a/indra/newview/fsfloatergrouptitles.cpp +++ b/indra/newview/fsfloatergrouptitles.cpp @@ -106,7 +106,8 @@ bool FSFloaterGroupTitles::postBuild() mSetRegionButton = getChild("btnSetRegion"); mSetRegionManualButton = getChild("btnSetRegionManual"); mClearRegionButton = getChild("btnClearRegion"); - mNoneOnUnassigned = getChild("none_on_unassigned"); + mSetDefaultButton = getChild("btnSetDefault"); + mUseDefaultCheck = getChild("use_default_title"); mTitleList = getChild("title_list"); mFilterEditor = getChild("filter_input"); @@ -116,19 +117,21 @@ bool FSFloaterGroupTitles::postBuild() mSetRegionButton->setCommitCallback(boost::bind(&FSFloaterGroupTitles::onSetRegion, this)); mSetRegionManualButton->setCommitCallback(boost::bind(&FSFloaterGroupTitles::onSetRegionManual, this)); mClearRegionButton->setCommitCallback(boost::bind(&FSFloaterGroupTitles::onClearRegion, this)); - mNoneOnUnassigned->setCommitCallback(boost::bind(&FSFloaterGroupTitles::onNoneOnUnassignedToggle, this)); + mSetDefaultButton->setCommitCallback(boost::bind(&FSFloaterGroupTitles::onSetAsDefault, this)); + mUseDefaultCheck->setCommitCallback(boost::bind(&FSFloaterGroupTitles::onUseDefaultToggle, this)); mTitleList->setDoubleClickCallback(boost::bind(&FSFloaterGroupTitles::activateGroupTitle, this)); mTitleList->setCommitCallback(boost::bind(&FSFloaterGroupTitles::selectedTitleChanged, this)); mFilterEditor->setCommitCallback(boost::bind(&FSFloaterGroupTitles::onFilterEdit, this, _2)); - mNoneOnUnassigned->set(FSGroupTitleRegionMgr::getInstance()->getNoneOnUnassigned()); mSetRegionButton->setEnabled(false); mSetRegionManualButton->setEnabled(false); mClearRegionButton->setEnabled(false); + mSetDefaultButton->setEnabled(false); + mUseDefaultCheck->set(FSGroupTitleRegionMgr::getInstance()->getEnabled()); mAssignmentsChangedConnection = FSGroupTitleRegionMgr::getInstance()->setAssignmentsChangedCallback([this]() { updateRegionColumn(); }); mTitleList->sortByColumn("title_sort_column", true); - mTitleList->setFilterColumn(0); + mTitleList->setFilterColumn(mTitleList->getColumn("filter_text")->mIndex); refreshGroupTitles(); @@ -219,6 +222,13 @@ void FSFloaterGroupTitles::addListItem(const LLUUID& group_id, const LLUUID& rol item["columns"][6]["column"] = "name_sort_column"; item["columns"][6]["type"] = "text"; item["columns"][6]["value"] = (is_group ? ("1_" + group_name) : "0"); + item["columns"][7]["column"] = "filter_text"; + item["columns"][7]["type"] = "text"; + item["columns"][7]["value"] = title + " " + group_name + " " + region_name; + item["columns"][8]["column"] = "default_marker"; + item["columns"][8]["type"] = "icon"; + item["columns"][8]["halign"] = "center"; + item["columns"][8]["value"] = LLStringUtil::null; mTitleList->addElement(item); @@ -250,6 +260,7 @@ void FSFloaterGroupTitles::processGroupTitleResults(const LLGroupData& group_dat } mTitleList->scrollToShowSelected(); + updateDefaultColumn(); // Remove observer observer_map_t::iterator found_it = mGroupTitleObserverMap.find(group_data.mID); @@ -297,6 +308,8 @@ void FSFloaterGroupTitles::refreshGroupTitles() mGroupTitleObserverMap[group_data.mID] = roleObserver; LLGroupMgr::getInstance()->sendGroupTitlesRequest(group_data.mID); } + + updateDefaultColumn(); } void FSFloaterGroupTitles::selectedTitleChanged() @@ -311,12 +324,14 @@ void FSFloaterGroupTitles::selectedTitleChanged() mSetRegionButton->setEnabled(true); mSetRegionManualButton->setEnabled(true); mClearRegionButton->setEnabled(has_region); + mSetDefaultButton->setEnabled(true); } else { mSetRegionButton->setEnabled(false); mSetRegionManualButton->setEnabled(false); mClearRegionButton->setEnabled(false); + mSetDefaultButton->setEnabled(false); } } @@ -442,14 +457,65 @@ void FSFloaterGroupTitles::onClearRegion() menu->show(screen_x, screen_y, mClearRegionButton); } -void FSFloaterGroupTitles::onNoneOnUnassignedToggle() +void FSFloaterGroupTitles::onUseDefaultToggle() { - FSGroupTitleRegionMgr::getInstance()->setNoneOnUnassigned(mNoneOnUnassigned->get()); + FSGroupTitleRegionMgr::getInstance()->setEnabled(mUseDefaultCheck->get()); + updateDefaultColumn(); +} + +void FSFloaterGroupTitles::onSetAsDefault() +{ + LLScrollListItem* selected_item = mTitleList->getFirstSelected(); + if (!selected_item) + { + return; + } + const LLUUID group_id = selected_item->getColumn(mTitleList->getColumn("group_id")->mIndex)->getValue().asUUID(); + const LLUUID role_id = selected_item->getColumn(mTitleList->getColumn("role_id")->mIndex)->getValue().asUUID(); + auto* mgr = FSGroupTitleRegionMgr::getInstance(); + mgr->setDefaultTitle(group_id, role_id); + mgr->setEnabled(true); + mUseDefaultCheck->set(true); + updateDefaultColumn(); +} + +void FSFloaterGroupTitles::updateDefaultColumn() +{ + LLScrollListColumn* default_col = mTitleList->getColumn("default_marker"); + if (!default_col) + { + return; + } + + const auto default_col_idx = default_col->mIndex; + const auto group_id_col_idx = mTitleList->getColumn("group_id")->mIndex; + const auto role_id_col_idx = mTitleList->getColumn("role_id")->mIndex; + + auto* mgr = FSGroupTitleRegionMgr::getInstance(); + const bool enabled = mgr->getEnabled(); + const LLUUID default_group = mgr->getDefaultGroupID(); + const LLUUID default_role = mgr->getDefaultRoleID(); + + for (auto* item : mTitleList->getAllData()) + { + auto* cell = item->getColumn(default_col_idx); + if (!cell) + { + continue; + } + const LLUUID group_id = item->getColumn(group_id_col_idx)->getValue().asUUID(); + const LLUUID role_id = item->getColumn(role_id_col_idx)->getValue().asUUID(); + const bool is_default = enabled && group_id == default_group && role_id == default_role; + cell->setValue(is_default ? LLSD("Check_Mark") : LLSD(LLStringUtil::null)); + } } void FSFloaterGroupTitles::updateRegionColumn() { const auto region_col_idx = mTitleList->getColumn("regionname")->mIndex; + const auto title_col_idx = mTitleList->getColumn("grouptitle")->mIndex; + const auto group_col_idx = mTitleList->getColumn("groupname")->mIndex; + const auto filter_col_idx = mTitleList->getColumn("filter_text")->mIndex; const auto group_id_col_idx = mTitleList->getColumn("group_id")->mIndex; const auto role_id_col_idx = mTitleList->getColumn("role_id")->mIndex; auto* mgr = FSGroupTitleRegionMgr::getInstance(); @@ -457,10 +523,18 @@ void FSFloaterGroupTitles::updateRegionColumn() { const auto group_id = item->getColumn(group_id_col_idx)->getValue().asUUID(); const auto role_id = item->getColumn(role_id_col_idx)->getValue().asUUID(); + const std::string region_name = mgr->getRegionForTitle(group_id, role_id); if (auto* cell = item->getColumn(region_col_idx)) { - cell->setValue(mgr->getRegionForTitle(group_id, role_id)); + cell->setValue(region_name); + } + + if (auto* filter_cell = item->getColumn(filter_col_idx)) + { + const std::string title = item->getColumn(title_col_idx)->getValue().asString(); + const std::string group_name = item->getColumn(group_col_idx)->getValue().asString(); + filter_cell->setValue(title + " " + group_name + " " + region_name); } } } diff --git a/indra/newview/fsfloatergrouptitles.h b/indra/newview/fsfloatergrouptitles.h index 50b0440d1d..782bcb80b0 100644 --- a/indra/newview/fsfloatergrouptitles.h +++ b/indra/newview/fsfloatergrouptitles.h @@ -85,7 +85,9 @@ private: void onSetRegion(); void onSetRegionManual(); void onClearRegion(); - void onNoneOnUnassignedToggle(); + void onUseDefaultToggle(); + void onSetAsDefault(); + void updateDefaultColumn(); void updateRegionColumn(); LLButton* mActivateButton; @@ -94,7 +96,8 @@ private: LLButton* mSetRegionButton; LLButton* mSetRegionManualButton; LLButton* mClearRegionButton; - LLCheckBoxCtrl* mNoneOnUnassigned; + LLButton* mSetDefaultButton; + LLCheckBoxCtrl* mUseDefaultCheck; LLScrollListCtrl* mTitleList; LLFilterEditor* mFilterEditor; diff --git a/indra/newview/fsgrouptitleregionmgr.cpp b/indra/newview/fsgrouptitleregionmgr.cpp index 2b84296bff..c537659338 100644 --- a/indra/newview/fsgrouptitleregionmgr.cpp +++ b/indra/newview/fsgrouptitleregionmgr.cpp @@ -92,7 +92,9 @@ void FSGroupTitleRegionMgr::loadFromDisk() } mAssignments.clear(); - mNoneOnUnassigned = false; + mEnabled = false; + mDefaultGroupID.setNull(); + mDefaultRoleID.setNull(); mLastAppliedRegion.clear(); const auto filename = getFilename(); @@ -120,7 +122,20 @@ void FSGroupTitleRegionMgr::loadFromDisk() } file.close(); - mNoneOnUnassigned = data["none_on_unassigned"].asBoolean(); + if (data.has("none_on_unassigned")) + { + mEnabled = data["none_on_unassigned"].asBoolean(); + } + + if (data.has("default_group_id")) + { + mDefaultGroupID = data["default_group_id"].asUUID(); + } + + if (data.has("default_role_id")) + { + mDefaultRoleID = data["default_role_id"].asUUID(); + } if (data.has("assignments") && data["assignments"].isMap()) { @@ -175,7 +190,9 @@ void FSGroupTitleRegionMgr::saveToDisk() } LLSD data; - data["none_on_unassigned"] = mNoneOnUnassigned; + data["none_on_unassigned"] = mEnabled; + data["default_group_id"] = mDefaultGroupID; + data["default_role_id"] = mDefaultRoleID; data["assignments"] = assignments; llofstream file(filename.c_str()); @@ -305,9 +322,24 @@ bool FSGroupTitleRegionMgr::getAssignmentForRegion(const std::string& region_nam // Preferences // --------------------------------------------------------------------------- -void FSGroupTitleRegionMgr::setNoneOnUnassigned(bool enabled) +void FSGroupTitleRegionMgr::setEnabled(bool enabled) { - mNoneOnUnassigned = enabled; + if (enabled == mEnabled) + { + return; + } + mEnabled = enabled; + saveToDisk(); +} + +void FSGroupTitleRegionMgr::setDefaultTitle(const LLUUID& group_id, const LLUUID& role_id) +{ + if (group_id == mDefaultGroupID && role_id == mDefaultRoleID) + { + return; + } + mDefaultGroupID = group_id; + mDefaultRoleID = role_id; saveToDisk(); } @@ -483,6 +515,41 @@ void FSGroupTitleRegionMgr::onValidationTimeout() // Region change handler // --------------------------------------------------------------------------- +void FSGroupTitleRegionMgr::applyGroupTitle(const LLUUID& group_id, const LLUUID& role_id) +{ + if (group_id.notNull() && !gAgent.isInGroup(group_id)) + { + LL_WARNS() << "Requested group title belongs to a group we are no longer in, skipping" << LL_ENDL; + return; + } + + bool title_already_active = false; + if (group_id.notNull()) + { + if (const auto* group_data = LLGroupMgr::getInstance()->getGroupData(group_id)) + { + for (const auto& title : group_data->mTitles) + { + if (title.mRoleID == role_id && title.mSelected) + { + title_already_active = true; + break; + } + } + } + } + + if (group_id.notNull() && !title_already_active) + { + LLGroupMgr::getInstance()->sendGroupTitleUpdate(group_id, role_id); + } + + if (gAgent.getGroupID() != group_id) + { + LLGroupActions::activate(group_id); + } +} + void FSGroupTitleRegionMgr::onRegionChanged() { if (!mDataLoaded) @@ -518,43 +585,16 @@ void FSGroupTitleRegionMgr::onRegionChanged() LLUUID role_id; if (getAssignmentForRegion(region_name, group_id, role_id)) { - if (group_id.notNull() && !gAgent.isInGroup(group_id)) - { - LL_WARNS() << "Region '" << region->getName() << "' has a title assignment for a group we are no longer in, skipping" << LL_ENDL; - return; - } - - bool title_already_active = false; - if (group_id.notNull()) - { - if (const auto* group_data = LLGroupMgr::getInstance()->getGroupData(group_id)) - { - for (const auto& title : group_data->mTitles) - { - if (title.mRoleID == role_id && title.mSelected) - { - title_already_active = true; - break; - } - } - } - } - - LL_INFOS() << "Region '" << region->getName() << "', switching to assigned group title" << LL_ENDL; - - if (group_id.notNull() && !title_already_active) - { - LLGroupMgr::getInstance()->sendGroupTitleUpdate(group_id, role_id); - } - - if (gAgent.getGroupID() != group_id) - { - LLGroupActions::activate(group_id); - } + LL_DEBUGS() << "Region '" << region->getName() << "' has an assigned group title, applying it" << LL_ENDL; + applyGroupTitle(group_id, role_id); + return; } - else if (mNoneOnUnassigned && gAgent.getGroupID().notNull()) + + if (!mEnabled) { - LL_INFOS() << "Region '" << region->getName() << "' has no title preset, deactivating group" << LL_ENDL; - LLGroupActions::activate(LLUUID::null); + return; } + + LL_DEBUGS() << "Region '" << region->getName() << "' is unassigned, applying default group title" << LL_ENDL; + applyGroupTitle(mDefaultGroupID, mDefaultRoleID); } diff --git a/indra/newview/fsgrouptitleregionmgr.h b/indra/newview/fsgrouptitleregionmgr.h index 70032b8478..913e3a35cd 100644 --- a/indra/newview/fsgrouptitleregionmgr.h +++ b/indra/newview/fsgrouptitleregionmgr.h @@ -59,8 +59,11 @@ public: std::string getRegionForTitle(const LLUUID& group_id, const LLUUID& role_id) const; std::vector getRegionDisplayNamesForTitle(const LLUUID& group_id, const LLUUID& role_id) const; bool getAssignmentForRegion(const std::string& region_name, LLUUID& group_id, LLUUID& role_id) const; - void setNoneOnUnassigned(bool enabled); - bool getNoneOnUnassigned() const { return mNoneOnUnassigned; } + void setEnabled(bool enabled); + bool getEnabled() const { return mEnabled; } + void setDefaultTitle(const LLUUID& group_id, const LLUUID& role_id); + const LLUUID& getDefaultGroupID() const { return mDefaultGroupID; } + const LLUUID& getDefaultRoleID() const { return mDefaultRoleID; } void showRegionInputDialog(const LLUUID& group_id, const LLUUID& role_id); static std::string sanitizeRegionName(const std::string& input); @@ -69,6 +72,7 @@ public: private: void validateAndSetAssignment(const LLUUID& group_id, const LLUUID& role_id, const std::string& region_name); + void applyGroupTitle(const LLUUID& group_id, const LLUUID& role_id); void onRegionChanged(); void cancelPendingValidation(); void onValidationResult(U64 region_handle); @@ -76,7 +80,9 @@ private: std::string getFilename() const; static std::string normalizeRegionName(const std::string& name); static bool onRegionInputCallback(const LLSD& notification, const LLSD& response); - bool mNoneOnUnassigned = false; + bool mEnabled = false; + LLUUID mDefaultGroupID; + LLUUID mDefaultRoleID; bool mDataLoaded = false; std::string mLastAppliedRegion; diff --git a/indra/newview/llvoicewebrtc.cpp b/indra/newview/llvoicewebrtc.cpp index ede91032c2..8349eb7d15 100644 --- a/indra/newview/llvoicewebrtc.cpp +++ b/indra/newview/llvoicewebrtc.cpp @@ -1569,7 +1569,7 @@ void LLWebRTCVoiceClient::processChannels(bool process) bool LLWebRTCVoiceClient::inProximalChannel() { - // Test for FIRE-36672, disabled by default + // FIRE-36672: Voice status indicator behavior change // inSpatialChannel() defaults to true with no session (parcel voice disabled), which keeps the conversation voice indicator green // Only report proximal when a spatial session is established static LLCachedControl require_established_session(gSavedSettings, "DebugWebRTCRequireEstablishedSpatialSession", false); diff --git a/indra/newview/skins/default/xui/az/floater_fs_group_titles.xml b/indra/newview/skins/default/xui/az/floater_fs_group_titles.xml index d3bbc05c5f..9a1ee80561 100644 --- a/indra/newview/skins/default/xui/az/floater_fs_group_titles.xml +++ b/indra/newview/skins/default/xui/az/floater_fs_group_titles.xml @@ -14,5 +14,4 @@