diff options
author | Rider Linden <rider@lindenlab.com> | 2018-06-11 11:43:50 -0700 |
---|---|---|
committer | Rider Linden <rider@lindenlab.com> | 2018-06-11 11:43:50 -0700 |
commit | 97da85de0b1e0f8c2fc60c156c31b237b869230a (patch) | |
tree | 5dd5785e0bc9321c5e340c70ccf8c36993b948da /indra | |
parent | 8365945f8af6e27e7180b40aae79f210f99bb7c8 (diff) |
remove legacy environmental edit floater and some lingering transition functions. Change floater environment switch behavior.
Diffstat (limited to 'indra')
-rw-r--r-- | indra/newview/CMakeLists.txt | 2 | ||||
-rw-r--r-- | indra/newview/llenvironment.cpp | 357 | ||||
-rw-r--r-- | indra/newview/llenvironment.h | 64 | ||||
-rw-r--r-- | indra/newview/llfloatereditextdaycycle.cpp | 3 | ||||
-rw-r--r-- | indra/newview/llfloaterenvironmentsettings.cpp | 299 | ||||
-rw-r--r-- | indra/newview/llfloaterenvironmentsettings.h | 72 | ||||
-rw-r--r-- | indra/newview/llfloaterfixedenvironment.cpp | 7 | ||||
-rw-r--r-- | indra/newview/llinventorybridge.cpp | 10 | ||||
-rw-r--r-- | indra/newview/llinventorypanel.cpp | 1 | ||||
-rw-r--r-- | indra/newview/llsettingspicker.cpp | 21 | ||||
-rw-r--r-- | indra/newview/llviewerfloaterreg.cpp | 2 | ||||
-rw-r--r-- | indra/newview/llviewermenu.cpp | 6 | ||||
-rw-r--r-- | indra/newview/skins/default/xui/en/floater_environment_settings.xml | 162 | ||||
-rw-r--r-- | indra/newview/skins/default/xui/en/menu_viewer.xml | 7 |
14 files changed, 27 insertions, 986 deletions
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 571587867c..696f603a13 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -225,7 +225,6 @@ set(viewer_SOURCE_FILES llfloaterdestinations.cpp llfloatereditdaycycle.cpp llfloatereditextdaycycle.cpp - llfloaterenvironmentsettings.cpp llfloaterevent.cpp llfloaterexperiencepicker.cpp llfloaterexperienceprofile.cpp @@ -845,7 +844,6 @@ set(viewer_HEADER_FILES llfloaterdeleteprefpreset.h llfloaterdestinations.h llfloatereditextdaycycle.h - llfloaterenvironmentsettings.h llfloaterevent.h llfloaterexperiencepicker.h llfloaterexperienceprofile.h diff --git a/indra/newview/llenvironment.cpp b/indra/newview/llenvironment.cpp index ccb5294a2e..a5ee7d0737 100644 --- a/indra/newview/llenvironment.cpp +++ b/indra/newview/llenvironment.cpp @@ -254,12 +254,6 @@ LLEnvironment::LLEnvironment(): mSelectedSky(), mSelectedWater(), mSelectedDay(), - mSkysById(), - mSkysByName(), - mWaterByName(), - mWaterById(), - mDayCycleByName(), - mDayCycleById(), mUserPrefs(), mSelectedEnvironment(LLEnvironment::ENV_LOCAL), mCurrentTrack(1) @@ -269,13 +263,7 @@ LLEnvironment::LLEnvironment(): void LLEnvironment::initSingleton() { LLSettingsSky::ptr_t p_default_sky = LLSettingsVOSky::buildDefaultSky(); - addSky(p_default_sky); - LLSettingsWater::ptr_t p_default_water = LLSettingsVOWater::buildDefaultWater(); - addWater(p_default_water); - - LLSettingsDay::ptr_t p_default_day = LLSettingsVODay::buildDefaultDayCycle(); - addDayCycle(p_default_day); mCurrentEnvironment = std::make_shared<DayInstance>(); mCurrentEnvironment->setSky(p_default_sky); @@ -283,9 +271,6 @@ void LLEnvironment::initSingleton() mEnvironments[ENV_DEFAULT] = mCurrentEnvironment; - // LEGACY! - legacyLoadAllPresets(); - requestRegionEnvironment(); LLRegionInfoModel::instance().setUpdateCallback([this]() { onParcelChange(); }); @@ -397,22 +382,6 @@ bool LLEnvironment::isInventoryEnabled() const !gAgent.getRegionCapability("UpdateSettingsTaskInventory").empty()); } - -LLEnvironment::connection_t LLEnvironment::setSkyListChange(const LLEnvironment::change_signal_t::slot_type& cb) -{ - return mSkyListChange.connect(cb); -} - -LLEnvironment::connection_t LLEnvironment::setWaterListChange(const LLEnvironment::change_signal_t::slot_type& cb) -{ - return mWaterListChange.connect(cb); -} - -LLEnvironment::connection_t LLEnvironment::setDayCycleListChange(const LLEnvironment::change_signal_t::slot_type& cb) -{ - return mDayCycleListChange.connect(cb); -} - void LLEnvironment::onParcelChange() { S32 parcel_id(INVALID_PARCEL_ID); @@ -437,7 +406,7 @@ void LLEnvironment::onLegacyRegionSettings(LLSD data) LLSettingsDay::ptr_t regionday; if (data[1].isUndefined()) - regionday = LLEnvironment::findDayCycleByName("Default"); + regionday = LLSettingsVODay::buildDefaultDayCycle(); else regionday = LLSettingsVODay::buildFromLegacyMessage(regionId, data[1], data[2], data[3]); @@ -916,176 +885,6 @@ void LLEnvironment::updateShaderUniforms(LLGLSLShader *shader) } } -LLEnvironment::list_name_id_t LLEnvironment::getSkyList() const -{ - list_name_id_t list; - - list.reserve(mSkysByName.size()); - - for (auto &it: mSkysByName) - { - list.push_back(std::vector<name_id_t>::value_type(it.second->getName(), it.second->getId())); - } - - return list; -} - -LLEnvironment::list_name_id_t LLEnvironment::getWaterList() const -{ - list_name_id_t list; - - list.reserve(mWaterByName.size()); - - for (auto &it : mWaterByName) - { - list.push_back(std::vector<name_id_t>::value_type(it.second->getName(), it.second->getId())); - } - - return list; -} - -LLEnvironment::list_name_id_t LLEnvironment::getDayCycleList() const -{ - list_name_id_t list; - - list.reserve(mDayCycleByName.size()); - - for (auto &it: mDayCycleByName) - { - list.push_back(std::vector<name_id_t>::value_type(it.second->getName(), it.second->getId())); - } - - return list; -} - -void LLEnvironment::addSky(const LLSettingsSky::ptr_t &sky) -{ - std::string name = sky->getValue(LLSettingsSky::SETTING_NAME).asString(); - - LL_WARNS("RIDER") << "Adding sky as '" << name << "'" << LL_ENDL; - - auto result = mSkysByName.insert(namedSettingMap_t::value_type(name, sky)); // auto should be: std::pair<namedSettingMap_t::iterator, bool> - - if (!result.second) - (*(result.first)).second = sky; - mSkyListChange(); -} - -void LLEnvironment::removeSky(const std::string &name) -{ - auto it = mSkysByName.find(name); - if (it != mSkysByName.end()) - mSkysByName.erase(it); - mSkyListChange(); -} - -void LLEnvironment::clearAllSkys() -{ - mSkysByName.clear(); - mSkysById.clear(); - mSkyListChange(); -} - -void LLEnvironment::addWater(const LLSettingsWater::ptr_t &water) -{ - std::string name = water->getValue(LLSettingsWater::SETTING_NAME).asString(); - - LL_WARNS("RIDER") << "Adding water as '" << name << "'" << LL_ENDL; - - auto result = mWaterByName.insert(namedSettingMap_t::value_type(name, water)); - - if (!result.second) - (*(result.first)).second = water; - mWaterListChange(); -} - - -void LLEnvironment::removeWater(const std::string &name) -{ - auto it = mWaterByName.find(name); - if (it != mWaterByName.end()) - mWaterByName.erase(it); - mWaterListChange(); -} - -void LLEnvironment::clearAllWater() -{ - mWaterByName.clear(); - mWaterById.clear(); - mWaterListChange(); -} - -void LLEnvironment::addDayCycle(const LLSettingsDay::ptr_t &daycycle) -{ - std::string name = daycycle->getValue(LLSettingsDay::SETTING_NAME).asString(); - - LL_WARNS("RIDER") << "Adding daycycle as '" << name << "'" << LL_ENDL; - - auto result = mDayCycleByName.insert(namedSettingMap_t::value_type(name, daycycle)); - - if (!result.second) - (*(result.first)).second = daycycle; - mDayCycleListChange(); -} - -//void LLEnvironment::addDayCycle(const LLUUID &id, const LLSettingsSky::ptr_t &sky); - -void LLEnvironment::removeDayCycle(const std::string &name) -{ - auto it = mDayCycleByName.find(name); - if (it != mDayCycleByName.end()) - mDayCycleByName.erase(it); - mDayCycleListChange(); -} - -//void LLEnvironment::removeDayCycle(const LLUUID &id); -void LLEnvironment::clearAllDayCycles() -{ - mDayCycleByName.clear(); - mWaterById.clear(); - mDayCycleListChange(); -} - -LLSettingsSky::ptr_t LLEnvironment::findSkyByName(std::string name) const -{ - auto it = mSkysByName.find(name); - - if (it == mSkysByName.end()) - { - LL_WARNS("ENVIRONMENT") << "Unable to find sky with unknown name '" << name << "'" << LL_ENDL; - return LLSettingsSky::ptr_t(); - } - - return std::static_pointer_cast<LLSettingsSky>((*it).second); -} - -LLSettingsWater::ptr_t LLEnvironment::findWaterByName(std::string name) const -{ - auto it = mWaterByName.find(name); - - if (it == mWaterByName.end()) - { - LL_WARNS("ENVIRONMENT") << "Unable to find water with unknown name '" << name << "'" << LL_ENDL; - return LLSettingsWater::ptr_t(); - } - - return std::static_pointer_cast<LLSettingsWater>((*it).second); -} - -LLSettingsDay::ptr_t LLEnvironment::findDayCycleByName(std::string name) const -{ - auto it = mDayCycleByName.find(name); - - if (it == mDayCycleByName.end()) - { - LL_WARNS("ENVIRONMENT") << "Unable to find daycycle with unknown name '" << name << "'" << LL_ENDL; - return LLSettingsDay::ptr_t(); - } - - return std::static_pointer_cast<LLSettingsDay>((*it).second); -} - - void LLEnvironment::recordEnvironment(S32 parcel_id, LLEnvironment::EnvironmentInfo::ptr_t envinfo) { LL_WARNS("ENVIRONMENT") << "Have environment" << LL_ENDL; @@ -1518,19 +1317,6 @@ LLEnvironment::EnvironmentInfo::ptr_t LLEnvironment::EnvironmentInfo::extract(LL } //========================================================================= -// Transitional Code. -// static -std::string LLEnvironment::getSysDir(const std::string &subdir) -{ - return gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight\\"+subdir, ""); -} - -// static -std::string LLEnvironment::getUserDir(const std::string &subdir) -{ - return gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "windlight\\"+subdir, ""); -} - LLSettingsWater::ptr_t LLEnvironment::createWaterFromLegacyPreset(const std::string filename) { std::string name(gDirUtilp->getBaseFileName(LLURI::unescape(filename), true)); @@ -1601,147 +1387,6 @@ LLSettingsDay::ptr_t LLEnvironment::createDayCycleFromEnvironment(EnvSelection_t return day; } -void LLEnvironment::legacyLoadAllPresets() -{ -// std::string dir; -// std::string file; -// -// // System skies -// { -// dir = getSysDir("skies"); -// LLDirIterator dir_iter(dir, "*.xml"); -// while (dir_iter.next(file)) -// { -// std::string path = gDirUtilp->add(dir, file); -// -// LLSD data = legacyLoadPreset(path); -// if (data) -// { -// std::string name(gDirUtilp->getBaseFileName(LLURI::unescape(path), true)); -// -// LLSettingsSky::ptr_t sky = LLSettingsVOSky::buildFromLegacyPreset(name, data); -// LLEnvironment::instance().addSky(sky); -// } -// } -// } -// -// // User skies -// { -// dir = getUserDir("skies"); -// LLDirIterator dir_iter(dir, "*.xml"); -// while (dir_iter.next(file)) -// { -// std::string path = gDirUtilp->add(dir, file); -// -// LLSD data = legacyLoadPreset(path); -// if (data) -// { -// std::string name(gDirUtilp->getBaseFileName(LLURI::unescape(path), true)); -// -// LLSettingsSky::ptr_t sky = LLSettingsVOSky::buildFromLegacyPreset(name, data); -// LLEnvironment::instance().addSky(sky); -// } -// } -// } -// -// // System water -// { -// dir = getSysDir("water"); -// LLDirIterator dir_iter(dir, "*.xml"); -// while (dir_iter.next(file)) -// { -// std::string path = gDirUtilp->add(dir, file); -// -// LLSD data = legacyLoadPreset(path); -// if (data) -// { -// std::string name(gDirUtilp->getBaseFileName(LLURI::unescape(path), true)); -// -// LLSettingsWater::ptr_t water = LLSettingsVOWater::buildFromLegacyPreset(name, data); -// LLEnvironment::instance().addWater(water); -// } -// } -// } -// -// // User water -// { -// dir = getUserDir("water"); -// LLDirIterator dir_iter(dir, "*.xml"); -// while (dir_iter.next(file)) -// { -// std::string path = gDirUtilp->add(dir, file); -// -// LLSD data = legacyLoadPreset(path); -// if (data) -// { -// std::string name(gDirUtilp->getBaseFileName(LLURI::unescape(path), true)); -// -// LLSettingsWater::ptr_t water = LLSettingsVOWater::buildFromLegacyPreset(name, data); -// LLEnvironment::instance().addWater(water); -// } -// } -// } -// -// // System Days -// { -// dir = getSysDir("days"); -// LLDirIterator dir_iter(dir, "*.xml"); -// while (dir_iter.next(file)) -// { -// std::string path = gDirUtilp->add(dir, file); -// -// LLSD data = legacyLoadPreset(path); -// if (data) -// { -// std::string name(gDirUtilp->getBaseFileName(LLURI::unescape(path), true)); -// -// LLSettingsDay::ptr_t day = LLSettingsVODay::buildFromLegacyPreset(name, data); -// /*if (day->validate()) -// { -// LL_INFOS() << "Adding Day Cycle " << name << "." << LL_ENDL; -// LLEnvironment::instance().addDayCycle(day); -// } -// else -// { -// LL_WARNS() << "Day Cycle " << name << " was not valid. Ignoring." << LL_ENDL; -// }*/ -// LL_INFOS() << "Adding Day Cycle " << name << "." << LL_ENDL; -// LLEnvironment::instance().addDayCycle(day); -// #ifdef EXPORT_PRESETS -// std::string exportfile = LLURI::escape(name) + "(new).xml"; -// std::string exportpath = gDirUtilp->add(getSysDir("new"), exportfile); -// -// LLSD settings = day->getSettings(); -// -// std::ofstream daycyclefile(exportpath); -// LLPointer<LLSDFormatter> formatter = new LLSDXMLFormatter(); -// formatter->format(settings, daycyclefile, LLSDFormatter::OPTIONS_PRETTY); -// daycyclefile.close(); -// #endif -// } -// } -// } -// -// // User Days -// { -// dir = getUserDir("days"); -// LLDirIterator dir_iter(dir, "*.xml"); -// while (dir_iter.next(file)) -// { -// std::string path = gDirUtilp->add(dir, file); -// -// LLSD data = legacyLoadPreset(path); -// if (data) -// { -// std::string name(gDirUtilp->getBaseFileName(LLURI::unescape(path), true)); -// -// LLSettingsDay::ptr_t day = LLSettingsVODay::buildFromLegacyPreset(name, data); -// LLEnvironment::instance().addDayCycle(day); -// } -// } -// } -} - void LLEnvironment::onAgentPositionHasChanged(const LLVector3 &localpos) { S32 trackno = calculateSkyTrackForAltitude(localpos.mV[VZ]); diff --git a/indra/newview/llenvironment.h b/indra/newview/llenvironment.h index 8202564ce7..9da6de60ae 100644 --- a/indra/newview/llenvironment.h +++ b/indra/newview/llenvironment.h @@ -133,12 +133,11 @@ public: typedef std::pair<LLSettingsSky::ptr_t, LLSettingsWater::ptr_t> fixedEnvironment_t; - typedef std::map<std::string, LLSettingsBase::ptr_t> namedSettingMap_t; - typedef std::pair<std::string, LLUUID> name_id_t; - typedef std::vector<name_id_t> list_name_id_t; - typedef boost::signals2::signal<void()> change_signal_t; typedef std::function<void(S32, EnvironmentInfo::ptr_t)> environment_apply_fn; + typedef boost::signals2::signal<void(EnvSelection_t, const LLSettingsBase::ptr_t &)> environment_changed_signal_t; + typedef environment_changed_signal_t::slot_type environment_changed_fn; + typedef std::array<F32, 4> altitude_list_t; virtual ~LLEnvironment(); @@ -185,20 +184,6 @@ public: void updateEnvironment(LLSettingsBase::Seconds transition = TRANSITION_DEFAULT, bool forced = false); - void addSky(const LLSettingsSky::ptr_t &sky); - void addWater(const LLSettingsWater::ptr_t &sky); - void addDayCycle(const LLSettingsDay::ptr_t &day); - - list_name_id_t getSkyList() const; - list_name_id_t getWaterList() const; - list_name_id_t getDayCycleList() const; - - // *LAPRAS* TODO : Remove these vvv - LLSettingsSky::ptr_t findSkyByName(std::string name) const; - LLSettingsWater::ptr_t findWaterByName(std::string name) const; - LLSettingsDay::ptr_t findDayCycleByName(std::string name) const; - // *LAPRAS* TODO : Remove these ^^^ - inline LLVector2 getCloudScrollDelta() const { return mCloudScrollDelta; } F32 getCamHeight() const; @@ -229,9 +214,7 @@ public: LLSettingsDay::ptr_t createDayCycleFromEnvironment(EnvSelection_t env, LLSettingsBase::ptr_t settings); //------------------------------------------- - connection_t setSkyListChange(const change_signal_t::slot_type& cb); - connection_t setWaterListChange(const change_signal_t::slot_type& cb); - connection_t setDayCycleListChange(const change_signal_t::slot_type& cb); + connection_t setEnvironmentChanged(environment_changed_fn cb); void requestRegionEnvironment(); @@ -341,8 +324,6 @@ private: static const F32 SUN_DELTA_YAW; F32 mLastCamYaw = 0.0f; - typedef std::map<LLUUID, LLSettingsBase::ptr_t> AssetSettingMap_t; - LLVector2 mCloudScrollDelta; // cumulative cloud delta InstanceArray_t mEnvironments; @@ -357,25 +338,8 @@ private: LLSettingsBlender::ptr_t mBlenderSky; LLSettingsBlender::ptr_t mBlenderWater; - typedef std::vector<LLSettingsSky::ptr_t> SkyList_t; - typedef std::vector<LLSettingsWater::ptr_t> WaterList_t; - typedef std::vector<LLSettingsDay::ptr_t> DayList_t; - - namedSettingMap_t mSkysByName; - AssetSettingMap_t mSkysById; - - namedSettingMap_t mWaterByName; - AssetSettingMap_t mWaterById; - - namedSettingMap_t mDayCycleByName; - AssetSettingMap_t mDayCycleById; - UserPrefs mUserPrefs; - change_signal_t mSkyListChange; - change_signal_t mWaterListChange; - change_signal_t mDayCycleListChange; - S32 mCurrentTrack; altitude_list_t mTrackAltitudes; @@ -384,22 +348,6 @@ private: DayInstance::ptr_t getSelectedEnvironmentInstance(); - //void addSky(const LLUUID &id, const LLSettingsSky::ptr_t &sky); - void removeSky(const std::string &name); - //void removeSky(const LLUUID &id); - void clearAllSkys(); - - //void addWater(const LLUUID &id, const LLSettingsSky::ptr_t &sky); - void removeWater(const std::string &name); - //void removeWater(const LLUUID &id); - void clearAllWater(); - - //void addDayCycle(const LLUUID &id, const LLSettingsSky::ptr_t &sky); - void removeDayCycle(const std::string &name); - //void removeDayCycle(const LLUUID &id); - void clearAllDayCycles(); - - void updateCloudScroll(); void onParcelChange(); @@ -415,10 +363,6 @@ private: void onSetEnvAssetLoaded(EnvSelection_t env, LLUUID asset_id, LLSettingsBase::ptr_t settings, S32 status); void onUpdateParcelAssetLoaded(LLUUID asset_id, LLSettingsBase::ptr_t settings, S32 status, S32 parcel_id, S32 day_length, S32 day_offset); - //========================================================================= - void legacyLoadAllPresets(); - static std::string getSysDir(const std::string &subdir); - static std::string getUserDir(const std::string &subdir); }; diff --git a/indra/newview/llfloatereditextdaycycle.cpp b/indra/newview/llfloatereditextdaycycle.cpp index daee8a798e..5a6af85334 100644 --- a/indra/newview/llfloatereditextdaycycle.cpp +++ b/indra/newview/llfloatereditextdaycycle.cpp @@ -266,6 +266,7 @@ void LLFloaterEditExtDayCycle::onClose(bool app_quitting) if (!app_quitting && LLEnvironment::instance().getSelectedEnvironment() == LLEnvironment::ENV_EDIT) { LLEnvironment::instance().setSelectedEnvironment(LLEnvironment::ENV_LOCAL); + LLEnvironment::instance().clearEnvironment(LLEnvironment::ENV_EDIT); } stopPlay(); } @@ -278,8 +279,6 @@ void LLFloaterEditExtDayCycle::onFocusReceived() void LLFloaterEditExtDayCycle::onFocusLost() { - stopPlay(); - LLEnvironment::instance().setSelectedEnvironment(LLEnvironment::ENV_LOCAL); } diff --git a/indra/newview/llfloaterenvironmentsettings.cpp b/indra/newview/llfloaterenvironmentsettings.cpp deleted file mode 100644 index 1b96db6611..0000000000 --- a/indra/newview/llfloaterenvironmentsettings.cpp +++ /dev/null @@ -1,299 +0,0 @@ -/** - * @file llfloaterenvironmentsettings.cpp - * @brief LLFloaterEnvironmentSettings class definition - * - * $LicenseInfo:firstyear=2011&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2011, Linden Research, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA - * $/LicenseInfo$ - */ - -#include "llviewerprecompiledheaders.h" - -#include "llfloaterenvironmentsettings.h" - -#include "llcombobox.h" -#include "llradiogroup.h" - -#include "llenvironment.h" - - -LLFloaterEnvironmentSettings::LLFloaterEnvironmentSettings(const LLSD &key) -: LLFloater(key) - ,mRegionSettingsRadioGroup(NULL) - ,mDayCycleSettingsRadioGroup(NULL) - ,mWaterPresetCombo(NULL) - ,mSkyPresetCombo(NULL) - ,mDayCyclePresetCombo(NULL) -{ -} - -// virtual -BOOL LLFloaterEnvironmentSettings::postBuild() -{ - mRegionSettingsRadioGroup = getChild<LLRadioGroup>("region_settings_radio_group"); - mRegionSettingsRadioGroup->setCommitCallback(boost::bind(&LLFloaterEnvironmentSettings::onSwitchRegionSettings, this)); - - mDayCycleSettingsRadioGroup = getChild<LLRadioGroup>("sky_dayc_settings_radio_group"); - mDayCycleSettingsRadioGroup->setCommitCallback(boost::bind(&LLFloaterEnvironmentSettings::onSwitchDayCycle, this)); - - mWaterPresetCombo = getChild<LLComboBox>("water_settings_preset_combo"); - mWaterPresetCombo->setCommitCallback(boost::bind(&LLFloaterEnvironmentSettings::onSelectWaterPreset, this)); - - mSkyPresetCombo = getChild<LLComboBox>("sky_settings_preset_combo"); - mSkyPresetCombo->setCommitCallback(boost::bind(&LLFloaterEnvironmentSettings::onSelectSkyPreset, this)); - - mDayCyclePresetCombo = getChild<LLComboBox>("dayc_settings_preset_combo"); - mDayCyclePresetCombo->setCommitCallback(boost::bind(&LLFloaterEnvironmentSettings::onSelectDayCyclePreset, this)); - - childSetCommitCallback("ok_btn", boost::bind(&LLFloaterEnvironmentSettings::onBtnOK, this), NULL); - childSetCommitCallback("cancel_btn", boost::bind(&LLFloaterEnvironmentSettings::onBtnCancel, this), NULL); - - setCloseCallback(boost::bind(&LLFloaterEnvironmentSettings::cancel, this)); - - LLEnvironment::instance().setSkyListChange(boost::bind(&LLFloaterEnvironmentSettings::populateSkyPresetsList, this)); - LLEnvironment::instance().setWaterListChange(boost::bind(&LLFloaterEnvironmentSettings::populateWaterPresetsList, this)); - LLEnvironment::instance().setDayCycleListChange(boost::bind(&LLFloaterEnvironmentSettings::populateDayCyclePresetsList, this)); - - return TRUE; -} - -// virtual -void LLFloaterEnvironmentSettings::onOpen(const LLSD& key) -{ - refresh(); -} - -//virtual -void LLFloaterEnvironmentSettings::onClose(bool app_quitting) -{ - if (!app_quitting) - LLEnvironment::instance().updateEnvironment(); -} - - -void LLFloaterEnvironmentSettings::onSwitchRegionSettings() -{ - getChild<LLView>("user_environment_settings")->setEnabled(mRegionSettingsRadioGroup->getSelectedIndex() != 0); - - apply(); -} - -void LLFloaterEnvironmentSettings::onSwitchDayCycle() -{ - bool is_fixed_sky = mDayCycleSettingsRadioGroup->getSelectedIndex() == 0; - - mSkyPresetCombo->setEnabled(is_fixed_sky); - mDayCyclePresetCombo->setEnabled(!is_fixed_sky); - - apply(); -} - -void LLFloaterEnvironmentSettings::onSelectWaterPreset() -{ - apply(); -} - -void LLFloaterEnvironmentSettings::onSelectSkyPreset() -{ - apply(); -} - -void LLFloaterEnvironmentSettings::onSelectDayCyclePreset() -{ - apply(); -} - -void LLFloaterEnvironmentSettings::onBtnOK() -{ -#if 0 - bool use_region_settings = mRegionSettingsRadioGroup->getSelectedIndex() == 0; - - LLEnvironment::instance().clearEnvironment(LLEnvironment::ENV_EDIT); - if (use_region_settings) - { - LLEnvironment::instance().clearEnvironment(LLEnvironment::ENV_LOCAL); - LLEnvironment::instance().setSelectedEnvironment(LLEnvironment::ENV_PARCEL); - } - else - { - bool use_fixed_sky = mDayCycleSettingsRadioGroup->getSelectedIndex() == 0; - - if (!use_fixed_sky) - { - - std::string day_cycle = mDayCyclePresetCombo->getValue().asString(); - LLSettingsDay::ptr_t day = LLEnvironment::instance().findDayCycleByName(day_cycle); - if (day) - { - LLEnvironment::instance().setEnvironment(LLEnvironment::ENV_LOCAL, day, LLSettingsDay::DEFAULT_DAYLENGTH, LLSettingsDay::DEFAULT_DAYOFFSET); - } - } - else - { - std::string water_preset = mWaterPresetCombo->getValue().asString(); - std::string sky_preset = mSkyPresetCombo->getValue().asString(); - - LLSettingsSky::ptr_t sky = LLEnvironment::instance().findSkyByName(sky_preset); - LLSettingsWater::ptr_t water = LLEnvironment::instance().findWaterByName(water_preset); - - LLEnvironment::instance().setEnvironment(LLEnvironment::ENV_LOCAL, LLEnvironment::fixedEnvironment_t(sky, water)); - } - LLEnvironment::instance().setSelectedEnvironment(LLEnvironment::ENV_LOCAL); - } - - // Save and apply new user preferences. - bool use_region_settings = mRegionSettingsRadioGroup->getSelectedIndex() == 0; - bool use_fixed_sky = mDayCycleSettingsRadioGroup->getSelectedIndex() == 0; - std::string water_preset = mWaterPresetCombo->getValue().asString(); - std::string sky_preset = mSkyPresetCombo->getValue().asString(); - std::string day_cycle = mDayCyclePresetCombo->getValue().asString(); - - LLEnvManagerNew::instance().setUserPrefs( - water_preset, - sky_preset, - day_cycle, - use_fixed_sky, - use_region_settings); - - // *TODO: This triggers applying user preferences again, which is suboptimal. -#endif - closeFloater(); -} - -void LLFloaterEnvironmentSettings::onBtnCancel() -{ - closeFloater(); -} - -void LLFloaterEnvironmentSettings::refresh() -{ - LLEnvironment::fixedEnvironment_t fixed = LLEnvironment::instance().getEnvironmentFixed(LLEnvironment::ENV_EDIT); - - LLSettingsDay::ptr_t day = LLEnvironment::instance().getEnvironmentDay(LLEnvironment::ENV_EDIT); - LLSettingsSky::ptr_t sky = fixed.first; - LLSettingsWater::ptr_t water = fixed.second; - - bool use_region_settings = true; - bool use_fixed_sky = !day; - - // Set up radio buttons according to user preferences. - mRegionSettingsRadioGroup->setSelectedIndex(use_region_settings ? 0 : 1); - mDayCycleSettingsRadioGroup->setSelectedIndex(use_fixed_sky ? 0 : 1); - - // Populate the combo boxes with appropriate lists of available presets. - populateWaterPresetsList(); - populateSkyPresetsList(); - populateDayCyclePresetsList(); - - // Enable/disable other controls based on user preferences. - getChild<LLView>("user_environment_settings")->setEnabled(!use_region_settings); - mSkyPresetCombo->setEnabled(use_fixed_sky); - mDayCyclePresetCombo->setEnabled(!use_fixed_sky); - - // Select the current presets in combo boxes. - if (water) - mWaterPresetCombo->selectByValue(water->getName()); - else - mWaterPresetCombo->selectByValue(LLSD()); - if (sky) - mSkyPresetCombo->selectByValue(sky->getName()); - else - mSkyPresetCombo->selectByValue(LLSD()); - if (day) - mDayCyclePresetCombo->selectByValue(day->getName()); - else - mDayCyclePresetCombo->selectByValue(LLSD()); -} - -void LLFloaterEnvironmentSettings::apply() -{ - // Update environment with the user choice. - bool use_region_settings = mRegionSettingsRadioGroup->getSelectedIndex() == 0; - bool use_fixed_sky = mDayCycleSettingsRadioGroup->getSelectedIndex() == 0; - std::string water_preset = mWaterPresetCombo->getValue().asString(); - std::string sky_preset = mSkyPresetCombo->getValue().asString(); - std::string day_cycle = mDayCyclePresetCombo->getValue().asString(); - - if (use_region_settings) - { - //env_mgr.useRegionSettings(); - } - else - { - if (use_fixed_sky) - { - LLSettingsSky::ptr_t psky = LLEnvironment::instance().findSkyByName(sky_preset); - if (psky) - LLEnvironment::instance().setEnvironment(LLEnvironment::ENV_LOCAL, psky); - } - else - { - LLSettingsDay::ptr_t pday = LLEnvironment::instance().findDayCycleByName(day_cycle); - if (pday) - LLEnvironment::instance().setEnvironment(LLEnvironment::ENV_LOCAL, pday, LLSettingsDay::DEFAULT_DAYLENGTH, LLSettingsDay::DEFAULT_DAYOFFSET); - } - - LLSettingsWater::ptr_t pwater = LLEnvironment::instance().findWaterByName(water_preset); - if (pwater) - LLEnvironment::instance().setEnvironment(LLEnvironment::ENV_LOCAL, pwater); - } -} - -void LLFloaterEnvironmentSettings::cancel() -{ - // Revert environment to user preferences. -// LLEnvManagerNew::instance().usePrefs(); -} - -void LLFloaterEnvironmentSettings::populateWaterPresetsList() -{ - mWaterPresetCombo->removeall(); - - LLEnvironment::list_name_id_t list = LLEnvironment::instance().getWaterList(); - - for (LLEnvironment::list_name_id_t::iterator it = list.begin(); it != list.end(); ++it) - { - mWaterPresetCombo->add((*it).first, LLSD::String((*it).first)); // - } -} - -void LLFloaterEnvironmentSettings::populateSkyPresetsList() -{ - mSkyPresetCombo->removeall(); - - LLEnvironment::list_name_id_t list = LLEnvironment::instance().getSkyList(); - - for (LLEnvironment::list_name_id_t::iterator it = list.begin(); it != list.end(); ++it) - { - mSkyPresetCombo->add((*it).first, LLSD::String((*it).first)); - } -} - -void LLFloaterEnvironmentSettings::populateDayCyclePresetsList() -{ - mDayCyclePresetCombo->removeall(); - - LLEnvironment::list_name_id_t list = LLEnvironment::instance().getDayCycleList(); - - for (LLEnvironment::list_name_id_t::iterator it = list.begin(); it != list.end(); ++it) - { - mDayCyclePresetCombo->add((*it).first, LLSD::String((*it).first)); - } -} diff --git a/indra/newview/llfloaterenvironmentsettings.h b/indra/newview/llfloaterenvironmentsettings.h deleted file mode 100644 index 2236d57ff4..0000000000 --- a/indra/newview/llfloaterenvironmentsettings.h +++ /dev/null @@ -1,72 +0,0 @@ -/** - * @file llfloaterenvironmentsettings.h - * @brief LLFloaterEnvironmentSettings class definition - * - * $LicenseInfo:firstyear=2011&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2011, Linden Research, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA - * $/LicenseInfo$ - */ - -#ifndef LL_LLFLOATERENVIRONMENTSETTINGS_H -#define LL_LLFLOATERENVIRONMENTSETTINGS_H - -#include "llfloater.h" - -class LLComboBox; -class LLRadioGroup; - -class LLFloaterEnvironmentSettings : public LLFloater -{ - LOG_CLASS(LLFloaterEnvironmentSettings); - -public: - LLFloaterEnvironmentSettings(const LLSD &key); - /*virtual*/ BOOL postBuild(); - /*virtual*/ void onOpen(const LLSD& key); - /*virtual*/ void onClose(bool app_quitting); - -private: - void onSwitchRegionSettings(); - void onSwitchDayCycle(); - - void onSelectWaterPreset(); - void onSelectSkyPreset(); - void onSelectDayCyclePreset(); - - void onBtnOK(); - void onBtnCancel(); - - void refresh(); /// update controls with user prefs - void apply(); - void cancel(); - - void populateWaterPresetsList(); - void populateSkyPresetsList(); - void populateDayCyclePresetsList(); - - LLRadioGroup* mRegionSettingsRadioGroup; - LLRadioGroup* mDayCycleSettingsRadioGroup; - - LLComboBox* mWaterPresetCombo; - LLComboBox* mSkyPresetCombo; - LLComboBox* mDayCyclePresetCombo; -}; - -#endif // LL_LLFLOATERENVIRONMENTSETTINGS_H diff --git a/indra/newview/llfloaterfixedenvironment.cpp b/indra/newview/llfloaterfixedenvironment.cpp index 0c6127c61f..be7b55bd45 100644 --- a/indra/newview/llfloaterfixedenvironment.cpp +++ b/indra/newview/llfloaterfixedenvironment.cpp @@ -130,6 +130,9 @@ void LLFloaterFixedEnvironment::onOpen(const LLSD& key) void LLFloaterFixedEnvironment::onClose(bool app_quitting) { + LLEnvironment::instance().setSelectedEnvironment(LLEnvironment::ENV_LOCAL); + LLEnvironment::instance().clearEnvironment(LLEnvironment::ENV_EDIT); + mSettings.reset(); syncronizeTabs(); } @@ -142,10 +145,6 @@ void LLFloaterFixedEnvironment::onFocusReceived() void LLFloaterFixedEnvironment::onFocusLost() { - // *TODO*: If the window receiving focus is from a select color or select image control... - // We have technically not changed out of what we are doing so don't change back to displaying - // the local environment. (unfortunately the focus manager has - LLEnvironment::instance().setSelectedEnvironment(LLEnvironment::ENV_LOCAL); } void LLFloaterFixedEnvironment::refresh() diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index 58f6c2065b..f1c7615efc 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -6911,7 +6911,8 @@ void LLSettingsBridge::performAction(LLInventoryModel* model, std::string action LLViewerInventoryItem* item = static_cast<LLViewerInventoryItem*>(getItem()); if (!item) return; - LLUUID asset_id = item->getProtectedAssetUUID(); + LLUUID asset_id = item->getAssetUUID(); + LL_WARNS("LAPRAS") << "Locally applying asset ID " << asset_id << LL_ENDL; LLEnvironment::instance().setEnvironment(LLEnvironment::ENV_LOCAL, asset_id); LLEnvironment::instance().setSelectedEnvironment(LLEnvironment::ENV_LOCAL); } @@ -6921,7 +6922,7 @@ void LLSettingsBridge::performAction(LLInventoryModel* model, std::string action LLViewerInventoryItem* item = static_cast<LLViewerInventoryItem*>(getItem()); if (!item) return; - LLUUID asset_id = item->getProtectedAssetUUID(); + LLUUID asset_id = item->getAssetUUID(); LLParcel *parcel = LLViewerParcelMgr::instance().getAgentParcel(); if (!parcel) @@ -6931,6 +6932,7 @@ void LLSettingsBridge::performAction(LLInventoryModel* model, std::string action } S32 parcel_id = parcel->getLocalID(); + LL_WARNS("LAPRAS") << "Applying asset ID " << asset_id << " to parcel " << parcel_id << LL_ENDL; LLEnvironment::instance().updateParcel(parcel_id, asset_id, -1, -1); } else if ("apply_settings_region" == action) @@ -6939,7 +6941,9 @@ void LLSettingsBridge::performAction(LLInventoryModel* model, std::string action LLViewerInventoryItem* item = static_cast<LLViewerInventoryItem*>(getItem()); if (!item) return; - LLUUID asset_id = item->getProtectedAssetUUID(); + LLUUID asset_id = item->getAssetUUID(); + + LL_WARNS("LAPRAS") << "Applyng asset id " << asset_id << " to region." << LL_ENDL; LLEnvironment::instance().updateRegion(asset_id, -1, -1); } diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp index 7ba9f2fc43..2464e650e1 100644 --- a/indra/newview/llinventorypanel.cpp +++ b/indra/newview/llinventorypanel.cpp @@ -392,7 +392,6 @@ const std::string LLInventoryPanel::getFilterSubString() return getFilter().getFilterSubString(); } - void LLInventoryPanel::setSortOrder(U32 order) { LLInventorySort sorter(order); diff --git a/indra/newview/llsettingspicker.cpp b/indra/newview/llsettingspicker.cpp index 29b08fc3d7..b386243777 100644 --- a/indra/newview/llsettingspicker.cpp +++ b/indra/newview/llsettingspicker.cpp @@ -36,6 +36,7 @@ #include "llinventoryobserver.h" #include "llinventorypanel.h" +#include "lldraghandle.h" #include "llviewercontrol.h" #include "llagent.h" @@ -205,14 +206,14 @@ void LLFloaterSettingsPicker::draw() } } -// if (gFocusMgr.childHasMouseCapture(getDragHandle())) -// { -// mContextConeOpacity = lerp(mContextConeOpacity, gSavedSettings.getF32("PickerContextOpacity"), LLSmoothInterpolation::getInterpolant(CONTEXT_FADE_TIME)); -// } -// else -// { - mContextConeOpacity = lerp(mContextConeOpacity, 0.f, LLSmoothInterpolation::getInterpolant(CONTEXT_FADE_TIME)); -// } + if (gFocusMgr.childHasMouseCapture(getDragHandle())) + { + mContextConeOpacity = lerp(mContextConeOpacity, gSavedSettings.getF32("PickerContextOpacity"), LLSmoothInterpolation::getInterpolant(CONTEXT_FADE_TIME)); + } + else + { + mContextConeOpacity = lerp(mContextConeOpacity, 0.f, LLSmoothInterpolation::getInterpolant(CONTEXT_FADE_TIME)); + } LLFloater::draw(); } @@ -412,10 +413,6 @@ LLUUID LLFloaterSettingsPicker::findItemID(const LLUUID& asset_id, bool copyable #include "lllocalbitmaps.h" #include "llerror.h" -static const F32 CONTEXT_CONE_IN_ALPHA = 0.0f; -static const F32 CONTEXT_CONE_OUT_ALPHA = 1.f; -static const F32 CONTEXT_FADE_TIME = 0.08f; - static const S32 LOCAL_TRACKING_ID_COLUMN = 1; //static const char CURRENT_IMAGE_NAME[] = "Current Texture"; diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp index 78c868c6f4..2d1f3510d5 100644 --- a/indra/newview/llviewerfloaterreg.cpp +++ b/indra/newview/llviewerfloaterreg.cpp @@ -59,7 +59,6 @@ #include "llfloaterdestinations.h" #include "llfloatereditdaycycle.h" #include "llfloatereditextdaycycle.h" -#include "llfloaterenvironmentsettings.h" #include "llfloaterexperienceprofile.h" #include "llfloaterexperiences.h" #include "llfloaterexperiencepicker.h" @@ -220,7 +219,6 @@ void LLViewerFloaterReg::registerFloaters() LLFloaterReg::add("destinations", "floater_destinations.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterDestinations>); LLFloaterReg::add("env_post_process", "floater_post_process.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterPostProcess>); - LLFloaterReg::add("env_settings", "floater_environment_settings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterEnvironmentSettings>); LLFloaterReg::add("env_edit_day_cycle", "floater_edit_day_cycle.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterEditDayCycle>); LLFloaterReg::add("env_fixed_environmentent_water", "floater_fixedenvironment.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterFixedEnvironmentWater>); diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 8153e41b45..e45ffb38ad 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -8383,12 +8383,6 @@ class LLWorldEnvSettings : public view_listener_t { std::string tod = userdata.asString(); - if (tod == "editor") - { - LLFloaterReg::toggleInstance("env_settings"); - return true; - } - if (tod == "sunrise") { LLEnvironment::instance().setEnvironment(LLEnvironment::ENV_LOCAL, LLEnvironment::KNOWN_SKY_SUNRISE); diff --git a/indra/newview/skins/default/xui/en/floater_environment_settings.xml b/indra/newview/skins/default/xui/en/floater_environment_settings.xml deleted file mode 100644 index 1b1cafaca6..0000000000 --- a/indra/newview/skins/default/xui/en/floater_environment_settings.xml +++ /dev/null @@ -1,162 +0,0 @@ -<?xml version="1.0" encoding="utf-8" standalone="yes" ?> -<floater - legacy_header_height="18" - height="328" - layout="topleft" - name="Environment Editor Floater" - help_topic="environment_editor_floater" - save_rect="true" - title="ENVIRONMENT SETTINGS" - width="540"> - - <text - follows="top|left|right" - height="15" - layout="topleft" - left="20" - name="note" - top="25" - width="510" - wrap="true"> - Use the options below to customize the environment settings for your viewer. - </text> - - <view_border - bevel_style="none" - follows="top|left" - height="237" - layout="topleft" - left="20" - name="border" - top_pad="8" - width="500"/> - <radio_group - follows="top|left" - height="45" - layout="topleft" - left_delta="10" - name="region_settings_radio_group" - top_delta="20" - width="200"> - <radio_item - label="Use region settings" - layout="topleft" - name="use_region_settings"/> - <radio_item - label="Customize my environment" - layout="topleft" - name="use_my_settings" - top_pad="20"/> - </radio_group> - - <panel - height="170" - layout="topleft" - left="50" - name="user_environment_settings" - top_pad="0" - width="470"> - - <text - follows="top|left|right" - font="SansSerifItalic" - height="15" - layout="topleft" - left_delta="0" - name="note" - top_pad="0" - width="470" - wrap="true"> - Note: your custom settings will not be visible to other users. - </text> - - <!-- Water Setting --> - <text - name="water_settings_title" - follows="top|left" - height="16" - layout="topleft" - left="50" - top="40" - width="200"> - Water Setting - </text> - <combo_box - follows="top|left" - left_pad="2" - name="water_settings_preset_combo" - top_delta="-5" - width="200"> - <combo_box.item - label="-Select a preset-" - name="item0"/> - </combo_box> - - - <!-- Sky/Day Cycle Settings --> - <text - name="sky_dayc_settings_title" - follows="top|left" - height="16" - layout="topleft" - left="50" - top_pad="20" - width="100"> - Sky / Day Cycle - </text> - <radio_group - layout="topleft" - left_delta="50" - name="sky_dayc_settings_radio_group" - top_pad="10" - height="50" - width="150"> - <radio_item - layout="topleft" - label="Fixed sky" - name="my_sky_settings"/> - <radio_item - layout="topleft" - label="Day cycle" - name="my_dayc_settings" - top_pad="25"/> - </radio_group> - <combo_box - follows="top|left" - left_pad="2" - name="sky_settings_preset_combo" - top_delta="-7" - width="200"> - <combo_box.item - label="-Select a preset-" - name="item0"/> - </combo_box> - <combo_box - follows="top|left" - name="dayc_settings_preset_combo" - top_delta="36" - width="200"> - <combo_box.item - label="-Select a preset-" - name="item0"/> - </combo_box> - </panel> - - <button - follows="left|top" - height="23" - label="OK" - layout="topleft" - right="-130" - name="ok_btn" - top_pad="10" - width="100" /> - <button - follows="left|top" - height="23" - label="Cancel" - layout="topleft" - left_pad="10" - name="cancel_btn" - width="100" /> -</floater> diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index 578f1c56ff..90fc06aeb6 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -697,7 +697,7 @@ </menu_item_check> </menu> - +<!-- <menu create_jump_keys="true" label="Environment Editor" @@ -714,8 +714,6 @@ <menu_item_separator/> - <!-- *LAPRAS* These menus go away. Keep till no longer needed --> - <menu name="Water Presets" label="Water Presets"> @@ -772,9 +770,8 @@ parameter="edit_day_cycle"/> </menu_item_call> </menu> - <!-- *LAPRAS* --> </menu> - +--> </menu> <menu |