From deac9ae7d84776d1f8497af82ed39e5d53e722d9 Mon Sep 17 00:00:00 2001 From: andreykproductengine Date: Wed, 23 Jan 2019 20:33:41 +0200 Subject: SL-1932 Day Cycle Edit feature "Load Track" Part 2 --- indra/newview/llfloatereditextdaycycle.cpp | 3 +- indra/newview/llfloaterfixedenvironment.cpp | 2 +- indra/newview/llpanelenvironment.cpp | 2 +- indra/newview/llsettingspicker.cpp | 96 +++++++++++++++++++--- indra/newview/llsettingspicker.h | 15 +++- .../default/xui/en/floater_settings_picker.xml | 40 +++++---- 6 files changed, 124 insertions(+), 34 deletions(-) diff --git a/indra/newview/llfloatereditextdaycycle.cpp b/indra/newview/llfloatereditextdaycycle.cpp index 601b964410..d6c104547d 100644 --- a/indra/newview/llfloatereditextdaycycle.cpp +++ b/indra/newview/llfloatereditextdaycycle.cpp @@ -1823,7 +1823,7 @@ void LLFloaterEditExtDayCycle::doOpenInventoryFloater(LLSettingsType::type_e typ if (!picker) { picker = new LLFloaterSettingsPicker(this, - LLUUID::null, "SELECT SETTINGS"); + LLUUID::null); mInventoryFloater = picker->getHandle(); @@ -1834,6 +1834,7 @@ void LLFloaterEditExtDayCycle::doOpenInventoryFloater(LLSettingsType::type_e typ picker->setSettingsItemId(curritem); picker->openFloater(); picker->setFocus(TRUE); + picker->setTrackWater(mCurrentTrack == LLSettingsDay::TRACK_WATER); } void LLFloaterEditExtDayCycle::doCloseInventoryFloater(bool quitting) diff --git a/indra/newview/llfloaterfixedenvironment.cpp b/indra/newview/llfloaterfixedenvironment.cpp index 98cec04898..ce231973c7 100644 --- a/indra/newview/llfloaterfixedenvironment.cpp +++ b/indra/newview/llfloaterfixedenvironment.cpp @@ -239,7 +239,7 @@ LLFloaterSettingsPicker * LLFloaterFixedEnvironment::getSettingsPicker() if (!picker) { picker = new LLFloaterSettingsPicker(this, - LLUUID::null, "SELECT SETTINGS"); + LLUUID::null); mInventoryFloater = picker->getHandle(); diff --git a/indra/newview/llpanelenvironment.cpp b/indra/newview/llpanelenvironment.cpp index ec6352c88d..000c7050ab 100644 --- a/indra/newview/llpanelenvironment.cpp +++ b/indra/newview/llpanelenvironment.cpp @@ -334,7 +334,7 @@ LLFloaterSettingsPicker * LLPanelEnvironmentInfo::getSettingsPicker(bool create) if (!picker && create) { picker = new LLFloaterSettingsPicker(this, - LLUUID::null, "SELECT SETTINGS"); + LLUUID::null); mSettingsFloater = picker->getHandle(); diff --git a/indra/newview/llsettingspicker.cpp b/indra/newview/llsettingspicker.cpp index d2824e04a9..a155906415 100644 --- a/indra/newview/llsettingspicker.cpp +++ b/indra/newview/llsettingspicker.cpp @@ -37,6 +37,7 @@ #include "llinventorymodelbackgroundfetch.h" #include "llinventoryobserver.h" #include "llinventorypanel.h" +#include "llsettingsvo.h" #include "lldraghandle.h" #include "llviewercontrol.h" @@ -57,16 +58,25 @@ namespace const F32 CONTEXT_CONE_IN_ALPHA(0.0f); const F32 CONTEXT_CONE_OUT_ALPHA(1.0f); const F32 CONTEXT_FADE_TIME(0.08f); + + // strings in xml + + const std::string STR_TITLE_PREFIX = "pick title"; + const std::string STR_TITLE_TRACK = "pick_track"; + const std::string STR_TITLE_SETTINGS = "pick_settings"; + const std::string STR_TRACK_WATER = "track_water"; + const std::string STR_TRACK_GROUND = "track_ground"; + const std::string STR_TRACK_SKY = "track_sky"; } //========================================================================= -LLFloaterSettingsPicker::LLFloaterSettingsPicker(LLView * owner, LLUUID initial_item_id, const std::string &label, const LLSD ¶ms): +LLFloaterSettingsPicker::LLFloaterSettingsPicker(LLView * owner, LLUUID initial_item_id, const LLSD ¶ms): LLFloater(params), mOwnerHandle(), - mLabel(label), mActive(true), mContextConeOpacity(0.0f), mSettingItemID(initial_item_id), + mTrackWater(true), mImmediateFilterPermMask(PERM_NONE) { mOwnerHandle = owner->getHandle(); @@ -87,12 +97,9 @@ BOOL LLFloaterSettingsPicker::postBuild() if (!LLFloater::postBuild()) return FALSE; - if (!mLabel.empty()) - { - std::string pick = getString("pick title"); - - setTitle(pick + mLabel); - } + std::string prefix = getString(STR_TITLE_PREFIX); + std::string label = getString(STR_TITLE_SETTINGS); + setTitle(prefix + " " + label); mFilterEdit = getChild(FLT_INVENTORY_SEARCH); mFilterEdit->setCommitCallback([this](LLUICtrl*, const LLSD& param){ onFilterEdit(param.asString()); }); @@ -165,7 +172,20 @@ void LLFloaterSettingsPicker::setSettingsFilter(LLSettingsType::type_e type) filter = static_cast(0x1) << static_cast(type); } - getChild(PNL_COMBO)->setVisible(type != LLSettingsType::ST_WATER && type != LLSettingsType::ST_SKY); + bool day_cycle = (type != LLSettingsType::ST_WATER) && (type != LLSettingsType::ST_SKY); + getChild(PNL_COMBO)->setVisible(day_cycle); + std::string prefix = getString(STR_TITLE_PREFIX); + std::string label; + if (day_cycle) + { + + label = getString(STR_TITLE_TRACK); + } + else + { + label = getString(STR_TITLE_SETTINGS); + } + setTitle(prefix + " " + label); mInventoryPanel->setFilterSettingsTypes(filter); } @@ -269,6 +289,7 @@ void LLFloaterSettingsPicker::onFilterEdit(const std::string& search_string) void LLFloaterSettingsPicker::onSelectionChange(const LLFloaterSettingsPicker::itemlist_t &items, bool user_action) { bool track_picker_enabled = false; + LLUUID asset_id; if (items.size()) { LLFolderViewItem* first_item = items.front(); @@ -284,6 +305,7 @@ void LLFloaterSettingsPicker::onSelectionChange(const LLFloaterSettingsPicker::i mNoCopySettingsSelected = true; } setSettingsItemId(bridge_model->getItem()->getUUID(), false); + asset_id = bridge_model->getItem()->getAssetUUID(); mViewModel->setDirty(); // *TODO: shouldn't we be using setValue() here? if (user_action) @@ -299,7 +321,61 @@ void LLFloaterSettingsPicker::onSelectionChange(const LLFloaterSettingsPicker::i } } } - getChild(CMB_TRACK_SELECTION)->setEnabled(track_picker_enabled); + getChild(CMB_TRACK_SELECTION)->setEnabled(track_picker_enabled && mSettingAssetID == asset_id); + if (track_picker_enabled && asset_id.notNull() && mSettingAssetID != asset_id) + { + LLUUID item_id = mSettingItemID; + LLHandle handle = getHandle(); + LLSettingsVOBase::getSettingsAsset(asset_id, + [item_id, handle](LLUUID asset_id, LLSettingsBase::ptr_t settings, S32 status, LLExtStat) { LLFloaterSettingsPicker::onAssetLoadedCb(handle, item_id, asset_id, settings, status); }); + } +} + +void LLFloaterSettingsPicker::onAssetLoadedCb(LLHandle handle, LLUUID item_id, LLUUID asset_id, LLSettingsBase::ptr_t settings, S32 status) +{ + if (handle.isDead() || status) + { + return; + } + + LLFloaterSettingsPicker *picker = static_cast(handle.get()); + + if (picker->mSettingItemID != item_id) + { + return; + } + + picker->onAssetLoaded(asset_id, settings); +} + +void LLFloaterSettingsPicker::onAssetLoaded(LLUUID asset_id, LLSettingsBase::ptr_t settings) +{ + LLComboBox* track_selection = getChild(CMB_TRACK_SELECTION); + track_selection->clear(); + track_selection->removeall(); + LLSettingsDay::ptr_t pday = std::dynamic_pointer_cast(settings); + + if (mTrackWater) + { + track_selection->add(getString(STR_TRACK_WATER), LLSD::Integer(LLSettingsDay::TRACK_WATER), ADD_TOP, true); + } + else + { + // track 1 always present + track_selection->add(getString(STR_TRACK_GROUND), LLSD::Integer(LLSettingsDay::TRACK_GROUND_LEVEL), ADD_TOP, true); + LLUIString formatted_label = getString(STR_TRACK_SKY); + for (int i = 2; i < LLSettingsDay::TRACK_MAX; i++) + { + if (!pday->isTrackEmpty(i)) + { + formatted_label.setArg("[NUM]", llformat("%d", i)); + track_selection->add(formatted_label.getString(), LLSD::Integer(i), ADD_TOP, true); + } + } + } + + mSettingAssetID = asset_id; + track_selection->setEnabled(true); } void LLFloaterSettingsPicker::onButtonCancel() diff --git a/indra/newview/llsettingspicker.h b/indra/newview/llsettingspicker.h index 5acc562fe5..13ee90f0fe 100644 --- a/indra/newview/llsettingspicker.h +++ b/indra/newview/llsettingspicker.h @@ -33,6 +33,7 @@ #include "llpermissionsflags.h" #include "llfolderview.h" #include "llinventory.h" +#include "llsettingsdaycycle.h" #include @@ -48,7 +49,7 @@ public: typedef std::function close_callback_t; typedef std::function id_changed_callback_t; - LLFloaterSettingsPicker(LLView * owner, LLUUID setting_item_id, const std::string &label, const LLSD ¶ms = LLSD()); + LLFloaterSettingsPicker(LLView * owner, LLUUID setting_item_id, const LLSD ¶ms = LLSD()); virtual ~LLFloaterSettingsPicker() override; @@ -64,6 +65,10 @@ public: void setSettingsFilter(LLSettingsType::type_e type); LLSettingsType::type_e getSettingsFilter() const { return mSettingsType; } + // Only for day cycle + void setTrackWater(bool use_water) { mTrackWater = use_water; } + void setTrackSky(bool use_sky) { mTrackWater = !use_sky; } + // Takes a UUID, wraps get/setImageAssetID virtual void setValue(const LLSD& value) override; virtual LLSD getValue() const override; @@ -86,11 +91,14 @@ public: static LLInventoryItem * findItem(const LLUUID& asset_id, bool copyable_only, bool ignore_library); + private: typedef std::deque itemlist_t; void onFilterEdit(const std::string& search_string); void onSelectionChange(const itemlist_t &items, bool user_action); + static void onAssetLoadedCb(LLHandle handle, LLUUID item_id, LLUUID asset_id, LLSettingsBase::ptr_t settings, S32 status); + void onAssetLoaded(LLUUID asset_id, LLSettingsBase::ptr_t settings); void onButtonCancel(); void onButtonSelect(); virtual BOOL handleDoubleClick(S32 x, S32 y, MASK mask) override; @@ -98,8 +106,9 @@ private: LLHandle mOwnerHandle; - std::string mLabel; - LLUUID mSettingItemID; + LLUUID mSettingItemID; + LLUUID mSettingAssetID; + bool mTrackWater; LLFilterEditor * mFilterEdit; LLInventoryPanel * mInventoryPanel; diff --git a/indra/newview/skins/default/xui/en/floater_settings_picker.xml b/indra/newview/skins/default/xui/en/floater_settings_picker.xml index 9ea949088f..55a1b540b4 100644 --- a/indra/newview/skins/default/xui/en/floater_settings_picker.xml +++ b/indra/newview/skins/default/xui/en/floater_settings_picker.xml @@ -17,6 +17,27 @@ name="pick title"> Pick: + + SELECT TRACK + + + SELECT SETTINGS + + + + Water + + + Ground + + + Sky[NUM] + - - - - - + width="190"/>