diff options
-rw-r--r-- | indra/newview/llenvironment.cpp | 4 | ||||
-rw-r--r-- | indra/newview/llfloatereditextdaycycle.cpp | 51 | ||||
-rw-r--r-- | indra/newview/llfloatereditextdaycycle.h | 1 | ||||
-rw-r--r-- | indra/newview/llfloaterfixedenvironment.cpp | 96 | ||||
-rw-r--r-- | indra/newview/llfloaterfixedenvironment.h | 2 | ||||
-rw-r--r-- | indra/newview/llfloaterland.cpp | 18 | ||||
-rw-r--r-- | indra/newview/llfloaterregioninfo.cpp | 4 | ||||
-rw-r--r-- | indra/newview/llpanelenvironment.cpp | 19 | ||||
-rw-r--r-- | indra/newview/llpanelenvironment.h | 4 | ||||
-rw-r--r-- | indra/newview/llsettingspicker.cpp | 31 | ||||
-rw-r--r-- | indra/newview/llsettingspicker.h | 1 | ||||
-rw-r--r-- | indra/newview/skins/default/xui/en/panel_region_environment.xml | 2 |
12 files changed, 167 insertions, 66 deletions
diff --git a/indra/newview/llenvironment.cpp b/indra/newview/llenvironment.cpp index 3b1990c850..ec2577d053 100644 --- a/indra/newview/llenvironment.cpp +++ b/indra/newview/llenvironment.cpp @@ -1768,6 +1768,8 @@ void LLEnvironment::DayTransition::animate() if (!mBlenderSky && !mBlenderWater) LLEnvironment::instance().mCurrentEnvironment = mNextInstance; + else + setWater(mNextInstance->getWater()); }); mSky = mStartSky->buildClone(); @@ -1778,6 +1780,8 @@ void LLEnvironment::DayTransition::animate() if (!mBlenderSky && !mBlenderWater) LLEnvironment::instance().mCurrentEnvironment = mNextInstance; + else + setSky(mNextInstance->getSky()); }); } diff --git a/indra/newview/llfloatereditextdaycycle.cpp b/indra/newview/llfloatereditextdaycycle.cpp index 5bf34455bb..fa16648140 100644 --- a/indra/newview/llfloatereditextdaycycle.cpp +++ b/indra/newview/llfloatereditextdaycycle.cpp @@ -53,6 +53,7 @@ #include "llparcel.h" #include "llflyoutcombobtn.h" //Todo: make a proper UI element/button/panel instead #include "llregioninfomodel.h" +#include "llviewermenufile.h" // LLFilePickerReplyThread #include "llviewerregion.h" #include "llpaneleditwater.h" #include "llpaneleditsky.h" @@ -277,8 +278,6 @@ void LLFloaterEditExtDayCycle::onOpen(const LLSD& key) } else { - mInventoryItem = nullptr; - mInventoryId.setNull(); mCanCopy = true; mCanMod = true; mMakeNoTrans = false; @@ -449,6 +448,8 @@ void LLFloaterEditExtDayCycle::setEditDayCycle(const LLSettingsDay::ptr_t &pday) void LLFloaterEditExtDayCycle::setEditDefaultDayCycle() { + mInventoryItem = nullptr; + mInventoryId.setNull(); LLSettingsVOBase::getSettingsAsset(LLSettingsDay::GetDefaultAssetId(), [this](LLUUID asset_id, LLSettingsBase::ptr_t settings, S32 status, LLExtStat) { onAssetLoaded(asset_id, settings, status); }); } @@ -1065,6 +1066,13 @@ void LLFloaterEditExtDayCycle::loadInventoryItem(const LLUUID &inventoryId) void LLFloaterEditExtDayCycle::onAssetLoaded(LLUUID asset_id, LLSettingsBase::ptr_t settings, S32 status) { + if ((mInventoryItem && mInventoryItem->getAssetUUID() != asset_id) + || (!mInventoryItem && LLSettingsDay::GetDefaultAssetId() != asset_id)) + { + LL_WARNS("ENVDAYEDIT") << "Discarding obsolete asset callback" << LL_ENDL; + return; + } + if (!settings || status) { LLSD args; @@ -1084,6 +1092,9 @@ void LLFloaterEditExtDayCycle::onAssetLoaded(LLUUID asset_id, LLSettingsBase::pt else settings->setFlag(LLSettingsBase::FLAG_NOMOD); + if (mInventoryItem) + settings->setName(mInventoryItem->getName()); + setEditDayCycle(std::dynamic_pointer_cast<LLSettingsDay>(settings)); } @@ -1326,28 +1337,28 @@ void LLFloaterEditExtDayCycle::onInventoryUpdated(LLUUID asset_id, LLUUID invent void LLFloaterEditExtDayCycle::doImportFromDisk() { // Load a a legacy Windlight XML from disk. + (new LLFilePickerReplyThread(boost::bind(&LLFloaterEditExtDayCycle::loadSettingFromFile, this, _1), LLFilePicker::FFLOAD_XML, false))->getFile(); +} - LLFilePicker& picker = LLFilePicker::instance(); - if (picker.getOpenFile(LLFilePicker::FFLOAD_XML)) - { - std::string filename = picker.getFirstFile(); - - LL_WARNS("LAPRAS") << "Selected file: " << filename << LL_ENDL; - LLSettingsDay::ptr_t legacyday = LLEnvironment::createDayCycleFromLegacyPreset(filename); +void LLFloaterEditExtDayCycle::loadSettingFromFile(const std::vector<std::string>& filenames) +{ + if (filenames.size() < 1) return; + std::string filename = filenames[0]; + LL_WARNS("LAPRAS") << "Selected file: " << filename << LL_ENDL; + LLSettingsDay::ptr_t legacyday = LLEnvironment::createDayCycleFromLegacyPreset(filename); - if (!legacyday) - { - LLSD args(LLSDMap("FILE", filename)); - LLNotificationsUtil::add("WLImportFail", args); - return; - } + if (!legacyday) + { + LLSD args(LLSDMap("FILE", filename)); + LLNotificationsUtil::add("WLImportFail", args); + return; + } - loadInventoryItem(LLUUID::null); + loadInventoryItem(LLUUID::null); - mCurrentTrack = 1; - setDirtyFlag(); - setEditDayCycle(legacyday); - } + mCurrentTrack = 1; + setDirtyFlag(); + setEditDayCycle(legacyday); } bool LLFloaterEditExtDayCycle::canUseInventory() const diff --git a/indra/newview/llfloatereditextdaycycle.h b/indra/newview/llfloatereditextdaycycle.h index f03a69c200..185b27bff3 100644 --- a/indra/newview/llfloatereditextdaycycle.h +++ b/indra/newview/llfloatereditextdaycycle.h @@ -136,6 +136,7 @@ private: void onAssetLoaded(LLUUID asset_id, LLSettingsBase::ptr_t settings, S32 status); void doImportFromDisk(); + void loadSettingFromFile(const std::vector<std::string>& filenames); void doApplyCreateNewInventory(const LLSettingsDay::ptr_t &day); void doApplyUpdateInventory(const LLSettingsDay::ptr_t &day); void doApplyEnvironment(const std::string &where, const LLSettingsDay::ptr_t &day); diff --git a/indra/newview/llfloaterfixedenvironment.cpp b/indra/newview/llfloaterfixedenvironment.cpp index 09a05eb7e2..d65a578a6d 100644 --- a/indra/newview/llfloaterfixedenvironment.cpp +++ b/indra/newview/llfloaterfixedenvironment.cpp @@ -38,7 +38,7 @@ #include "lltabcontainer.h" #include "llfilepicker.h" #include "llsettingspicker.h" - +#include "llviewermenufile.h" // LLFilePickerReplyThread #include "llviewerparcelmgr.h" // newview @@ -292,12 +292,30 @@ void LLFloaterFixedEnvironment::checkAndConfirmSettingsLoss(LLFloaterFixedEnviro void LLFloaterFixedEnvironment::onPickerCommitSetting(LLUUID asset_id) { + mInventoryItem = NULL; + mInventoryId.setNull(); + if (!mInventoryFloater.isDead()) + { + LLFloaterSettingsPicker *picker = static_cast<LLFloaterSettingsPicker *>(mInventoryFloater.get()); + if (picker) + { + mInventoryId = picker->findItemID(asset_id, false); + mInventoryItem = gInventory.getItem(mInventoryId); + } + } + LLSettingsVOBase::getSettingsAsset(asset_id, [this](LLUUID asset_id, LLSettingsBase::ptr_t settings, S32 status, LLExtStat) { onAssetLoaded(asset_id, settings, status); }); } void LLFloaterFixedEnvironment::onAssetLoaded(LLUUID asset_id, LLSettingsBase::ptr_t settings, S32 status) { + if (mInventoryItem && mInventoryItem->getAssetUUID() != asset_id) + { + LL_WARNS("ENVIRONMENT") << "Discarding obsolete asset callback" << LL_ENDL; + return; + } + if (!settings || status) { LLSD args; @@ -581,30 +599,29 @@ void LLFloaterFixedEnvironmentWater::onOpen(const LLSD& key) void LLFloaterFixedEnvironmentWater::doImportFromDisk() { // Load a a legacy Windlight XML from disk. + (new LLFilePickerReplyThread(boost::bind(&LLFloaterFixedEnvironmentWater::loadWaterSettingFromFile, this, _1), LLFilePicker::FFLOAD_XML, false))->getFile(); +} - LLFilePicker& picker = LLFilePicker::instance(); - if (picker.getOpenFile(LLFilePicker::FFLOAD_XML)) - { - std::string filename = picker.getFirstFile(); - - LL_WARNS("LAPRAS") << "Selected file: " << filename << LL_ENDL; - LLSettingsWater::ptr_t legacywater = LLEnvironment::createWaterFromLegacyPreset(filename); - - if (!legacywater) - { - LLSD args(LLSDMap("FILE", filename)); - LLNotificationsUtil::add("WLImportFail", args); - return; - } +void LLFloaterFixedEnvironmentWater::loadWaterSettingFromFile(const std::vector<std::string>& filenames) +{ + if (filenames.size() < 1) return; + std::string filename = filenames[0]; + LL_WARNS("LAPRAS") << "Selected file: " << filename << LL_ENDL; + LLSettingsWater::ptr_t legacywater = LLEnvironment::createWaterFromLegacyPreset(filename); - loadInventoryItem(LLUUID::null); + if (!legacywater) + { + LLSD args(LLSDMap("FILE", filename)); + LLNotificationsUtil::add("WLImportFail", args); + return; + } - setDirtyFlag(); - LLEnvironment::instance().setEnvironment(LLEnvironment::ENV_EDIT, legacywater); - setEditSettings(legacywater); - LLEnvironment::instance().updateEnvironment(LLEnvironment::TRANSITION_FAST, true); + loadInventoryItem(LLUUID::null); - } + setDirtyFlag(); + LLEnvironment::instance().setEnvironment(LLEnvironment::ENV_EDIT, legacywater); + setEditSettings(legacywater); + LLEnvironment::instance().updateEnvironment(LLEnvironment::TRANSITION_FAST, true); } //========================================================================= @@ -669,30 +686,31 @@ void LLFloaterFixedEnvironmentSky::onOpen(const LLSD& key) void LLFloaterFixedEnvironmentSky::doImportFromDisk() { // Load a a legacy Windlight XML from disk. + (new LLFilePickerReplyThread(boost::bind(&LLFloaterFixedEnvironmentSky::loadSkySettingFromFile, this, _1), LLFilePicker::FFLOAD_XML, false))->getFile(); +} - LLFilePicker& picker = LLFilePicker::instance(); - if (picker.getOpenFile(LLFilePicker::FFLOAD_XML)) - { - std::string filename = picker.getFirstFile(); +void LLFloaterFixedEnvironmentSky::loadSkySettingFromFile(const std::vector<std::string>& filenames) +{ + if (filenames.size() < 1) return; + std::string filename = filenames[0]; - LL_WARNS("LAPRAS") << "Selected file: " << filename << LL_ENDL; - LLSettingsSky::ptr_t legacysky = LLEnvironment::createSkyFromLegacyPreset(filename); + LL_WARNS("LAPRAS") << "Selected file: " << filename << LL_ENDL; + LLSettingsSky::ptr_t legacysky = LLEnvironment::createSkyFromLegacyPreset(filename); - if (!legacysky) - { - LLSD args(LLSDMap("FILE", filename)); - LLNotificationsUtil::add("WLImportFail", args); + if (!legacysky) + { + LLSD args(LLSDMap("FILE", filename)); + LLNotificationsUtil::add("WLImportFail", args); - return; - } + return; + } - loadInventoryItem(LLUUID::null); + loadInventoryItem(LLUUID::null); - clearDirtyFlag(); - LLEnvironment::instance().setEnvironment(LLEnvironment::ENV_EDIT, legacysky); - setEditSettings(legacysky); - LLEnvironment::instance().updateEnvironment(LLEnvironment::TRANSITION_FAST, true); - } + clearDirtyFlag(); + LLEnvironment::instance().setEnvironment(LLEnvironment::ENV_EDIT, legacysky); + setEditSettings(legacysky); + LLEnvironment::instance().updateEnvironment(LLEnvironment::TRANSITION_FAST, true); } //========================================================================= diff --git a/indra/newview/llfloaterfixedenvironment.h b/indra/newview/llfloaterfixedenvironment.h index b7991ceb01..3181d4cbda 100644 --- a/indra/newview/llfloaterfixedenvironment.h +++ b/indra/newview/llfloaterfixedenvironment.h @@ -140,6 +140,7 @@ protected: virtual void updateEditEnvironment() override; virtual void doImportFromDisk() override; + void loadWaterSettingFromFile(const std::vector<std::string>& filenames); private: }; @@ -159,6 +160,7 @@ protected: virtual void updateEditEnvironment() override; virtual void doImportFromDisk() override; + void loadSkySettingFromFile(const std::vector<std::string>& filenames); private: }; diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp index 38ced18edf..453c9f1138 100644 --- a/indra/newview/llfloaterland.cpp +++ b/indra/newview/llfloaterland.cpp @@ -3304,6 +3304,14 @@ void LLPanelLandEnvironment::refreshFromSource() { LLParcel *parcel = getParcel(); + if (!LLEnvironment::instance().isExtendedEnvironmentEnabled()) + { + setNoEnvironmentSupport(true); + setControlsEnabled(false); + return; + } + setNoEnvironmentSupport(false); + if (!parcel) { setNoSelection(true); @@ -3316,8 +3324,16 @@ void LLPanelLandEnvironment::refreshFromSource() { setCrossRegion(false); + LLHandle<LLPanel> that_h = getHandle(); + LLEnvironment::instance().requestParcel(parcel->getLocalID(), - [this](S32 parcel_id, LLEnvironment::EnvironmentInfo::ptr_t envifo) { mLastParcelId = parcel_id; onEnvironmentReceived(parcel_id, envifo); }); + [that_h](S32 parcel_id, LLEnvironment::EnvironmentInfo::ptr_t envifo) + { + LLPanelLandEnvironment *that = (LLPanelLandEnvironment*)that_h.get(); + if (!that) return; + that->mLastParcelId = parcel_id; + that->onEnvironmentReceived(parcel_id, envifo); + }); } else { diff --git a/indra/newview/llfloaterregioninfo.cpp b/indra/newview/llfloaterregioninfo.cpp index 6aa35b40b6..96ca7c1ac4 100644 --- a/indra/newview/llfloaterregioninfo.cpp +++ b/indra/newview/llfloaterregioninfo.cpp @@ -3447,8 +3447,10 @@ void LLPanelRegionEnvironment::refreshFromEstate() void LLPanelRegionEnvironment::refreshFromSource() { + LLHandle<LLPanel> that_h = getHandle(); + LLEnvironment::instance().requestRegion( - [this](S32 parcel_id, LLEnvironment::EnvironmentInfo::ptr_t envifo) {onEnvironmentReceived(parcel_id, envifo); }); + [that_h](S32 parcel_id, LLEnvironment::EnvironmentInfo::ptr_t envifo) { _onEnvironmentReceived(that_h, parcel_id, envifo); }); } void LLPanelRegionEnvironment::doApply() diff --git a/indra/newview/llpanelenvironment.cpp b/indra/newview/llpanelenvironment.cpp index 8d7ec48d63..ecffa34ab9 100644 --- a/indra/newview/llpanelenvironment.cpp +++ b/indra/newview/llpanelenvironment.cpp @@ -119,6 +119,7 @@ LLPanelEnvironmentInfo::LLPanelEnvironmentInfo(): mDirtyFlag(0), mCrossRegion(false), mNoSelection(false), + mNoEnvironment(false), mSettingsFloater(), mEditFloater() { @@ -330,7 +331,7 @@ bool LLPanelEnvironmentInfo::setControlsEnabled(bool enabled) bool is_unavailable(false); bool is_legacy = (mCurrentEnvironment) ? mCurrentEnvironment->mIsLegacy : true; - if (!LLEnvironment::instance().isExtendedEnvironmentEnabled() && !isRegion()) + if (mNoEnvironment || (!LLEnvironment::instance().isExtendedEnvironmentEnabled() && !isRegion())) { is_unavailable = true; getChild<LLTextBox>(TXT_DISABLED)->setText(getString(STR_LEGACY)); @@ -574,24 +575,26 @@ void LLPanelEnvironmentInfo::doApply() if (getIsDirtyFlag(DIRTY_FLAG_MASK)) { + LLHandle<LLPanel> that_h = getHandle(); + S32 rdo_selection = getChild<LLRadioGroup>(RDG_ENVIRONMENT_SELECT)->getSelectedIndex(); if (rdo_selection == 0) { LLEnvironment::instance().resetParcel(parcel_id, - [this](S32 parcel_id, LLEnvironment::EnvironmentInfo::ptr_t envifo) {onEnvironmentReceived(parcel_id, envifo); }); + [that_h](S32 parcel_id, LLEnvironment::EnvironmentInfo::ptr_t envifo) { _onEnvironmentReceived(that_h, parcel_id, envifo); }); } else if (rdo_selection == 1) { LLEnvironment::instance().updateParcel(parcel_id, mCurrentEnvironment->mDayCycle->getAssetId(), mCurrentEnvironment->mDayLength.value(), mCurrentEnvironment->mDayOffset.value(), - [this](S32 parcel_id, LLEnvironment::EnvironmentInfo::ptr_t envifo) {onEnvironmentReceived(parcel_id, envifo); }); + [that_h](S32 parcel_id, LLEnvironment::EnvironmentInfo::ptr_t envifo) { _onEnvironmentReceived(that_h, parcel_id, envifo); }); } else { LLEnvironment::instance().updateParcel(parcel_id, mCurrentEnvironment->mDayCycle, mCurrentEnvironment->mDayLength.value(), mCurrentEnvironment->mDayOffset.value(), - [this](S32 parcel_id, LLEnvironment::EnvironmentInfo::ptr_t envifo) {onEnvironmentReceived(parcel_id, envifo); }); + [that_h](S32 parcel_id, LLEnvironment::EnvironmentInfo::ptr_t envifo) { _onEnvironmentReceived(that_h, parcel_id, envifo); }); } // Todo: save altitudes once LLEnvironment::setRegionAltitudes() gets implemented @@ -695,3 +698,11 @@ void LLPanelEnvironmentInfo::onEnvironmentReceived(S32 parcel_id, LLEnvironment: clearDirtyFlag(DIRTY_FLAG_MASK); refresh(); } + +void LLPanelEnvironmentInfo::_onEnvironmentReceived(LLHandle<LLPanel> that_h, S32 parcel_id, LLEnvironment::EnvironmentInfo::ptr_t envifo) +{ + LLPanelEnvironmentInfo *that = (LLPanelEnvironmentInfo *)that_h.get(); + if (!that) + return; + that->onEnvironmentReceived(parcel_id, envifo); +} diff --git a/indra/newview/llpanelenvironment.h b/indra/newview/llpanelenvironment.h index fdf0fe46a7..a632acfd03 100644 --- a/indra/newview/llpanelenvironment.h +++ b/indra/newview/llpanelenvironment.h @@ -121,6 +121,7 @@ protected: void onEditCommitted(LLSettingsDay::ptr_t newday); void onPickerAssetDownloaded(LLSettingsBase::ptr_t settings); void onEnvironmentReceived(S32 parcel_id, LLEnvironment::EnvironmentInfo::ptr_t envifo); + static void _onEnvironmentReceived(LLHandle<LLPanel> that_h, S32 parcel_id, LLEnvironment::EnvironmentInfo::ptr_t envifo); virtual void refreshFromSource() = 0; @@ -132,6 +133,7 @@ protected: void setCrossRegion(bool val) { mCrossRegion = val; } void setNoSelection(bool val) { mNoSelection = val; } + void setNoEnvironmentSupport(bool val) { mNoEnvironment = val; } LLEnvironment::EnvironmentInfo::ptr_t mCurrentEnvironment; @@ -165,6 +167,6 @@ private: S32 mDirtyFlag; bool mCrossRegion; bool mNoSelection; - + bool mNoEnvironment; }; #endif // LL_LLPANELEXPERIENCES_H diff --git a/indra/newview/llsettingspicker.cpp b/indra/newview/llsettingspicker.cpp index 06d54825e7..f72c7c5dcf 100644 --- a/indra/newview/llsettingspicker.cpp +++ b/indra/newview/llsettingspicker.cpp @@ -302,6 +302,37 @@ void LLFloaterSettingsPicker::onButtonSelect() closeFloater(); } +BOOL LLFloaterSettingsPicker::handleDoubleClick(S32 x, S32 y, MASK mask) +{ + if (mSettingAssetID.notNull() + && mInventoryPanel) + { + LLUUID item_id = findItemID(mSettingAssetID, FALSE); + S32 inventory_x = x - mInventoryPanel->getRect().mLeft; + S32 inventory_y = y - mInventoryPanel->getRect().mBottom; + if (item_id.notNull() + && mInventoryPanel->parentPointInView(inventory_x, inventory_y)) + { + // make sure item (not folder) is selected + LLFolderViewItem* item_viewp = mInventoryPanel->getItemByID(item_id); + if (item_viewp && item_viewp->isSelected()) + { + LLRect target_rect; + item_viewp->localRectToOtherView(item_viewp->getLocalRect(), &target_rect, this); + if (target_rect.pointInRect(x, y)) + { + // Quick-apply + if (mCommitSignal) + (*mCommitSignal)(this, LLSD(mSettingAssetID)); + closeFloater(); + return TRUE; + } + } + } + } + return LLFloater::handleDoubleClick(x, y, mask); +} + //========================================================================= void LLFloaterSettingsPicker::setActive(bool active) { diff --git a/indra/newview/llsettingspicker.h b/indra/newview/llsettingspicker.h index a58fa38ed0..7fcc7fd4a7 100644 --- a/indra/newview/llsettingspicker.h +++ b/indra/newview/llsettingspicker.h @@ -96,6 +96,7 @@ private: void onSelectionChange(const itemlist_t &items, bool user_action); void onButtonCancel(); void onButtonSelect(); + virtual BOOL handleDoubleClick(S32 x, S32 y, MASK mask) override; LLHandle<LLView> mOwnerHandle; diff --git a/indra/newview/skins/default/xui/en/panel_region_environment.xml b/indra/newview/skins/default/xui/en/panel_region_environment.xml index 3ce0d7a2ef..cfb142093a 100644 --- a/indra/newview/skins/default/xui/en/panel_region_environment.xml +++ b/indra/newview/skins/default/xui/en/panel_region_environment.xml @@ -21,6 +21,7 @@ height="367" follows="all" layout="topleft" + animate="false" orientation="vertical"> <layout_panel auto_resize="true" @@ -50,6 +51,7 @@ bottom="-1" layout="topleft" follows="all" + animate="false" orientation="horizontal"> <layout_panel background_visible="true" |