From 015bfe5bd733445e87c874426305158c42d1a39f Mon Sep 17 00:00:00 2001 From: Beeks Date: Wed, 6 Oct 2010 14:44:29 -0400 Subject: [PATCH] Preliminary work for Day Cycle selecting. Signed-off-by: Beeks --- indra/newview/CMakeLists.txt | 2 + indra/newview/app_settings/settings.xml | 11 + .../app_settings/windlight/days/Default.xml | 72 ++--- indra/newview/llfloaterdaycycle.cpp | 263 +++++++++++++++++- indra/newview/llfloaterdaycycle.h | 27 +- indra/newview/llstartup.cpp | 3 + indra/newview/llwldaycycle.cpp | 69 ++++- indra/newview/llwldaycycle.h | 3 + indra/newview/llwlparammanager.cpp | 2 +- .../xui/en-us/floater_day_cycle_options.xml | 28 +- .../skins/default/xui/en-us/menu_viewer.xml | 10 +- .../skins/default/xui/en-us/notifications.xml | 34 ++- 12 files changed, 459 insertions(+), 65 deletions(-) diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 462d6e989..2450d2a35 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -64,6 +64,7 @@ include_directories( ) set(viewer_SOURCE_FILES + ascentdaycyclemanager.cpp ascentfloatercontactgroups.cpp ascentprefssys.cpp ascentprefsvan.cpp @@ -513,6 +514,7 @@ endif (LINUX) set(viewer_HEADER_FILES CMakeLists.txt ViewerInstall.cmake + ascentdaycyclemanager.h ascentfloatercontactgroups.h ascentprefssys.h ascentprefsvan.h diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 789d74009..8f380563d 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -867,6 +867,17 @@ Value Custom + AscentActiveDayCycle + + Comment + Day cycle currently in use + Persist + 1 + Type + String + Value + Default + AscentAutoCloseOOC Comment diff --git a/indra/newview/app_settings/windlight/days/Default.xml b/indra/newview/app_settings/windlight/days/Default.xml index d3d7ece7e..3d3afd507 100644 --- a/indra/newview/app_settings/windlight/days/Default.xml +++ b/indra/newview/app_settings/windlight/days/Default.xml @@ -1,36 +1,36 @@ - - - - 0 - A-12AM - - - 0.125 - A-3AM - - - 0.25 - A-6AM - - - 0.375 - A-9AM - - - 0.5 - A-12PM - - - 0.625 - A-3PM - - - 0.75 - A-6PM - - - 0.875 - A-9PM - - - + + + + 0 + A-12AM + + + 0.125 + A-3AM + + + 0.25 + A-6AM + + + 0.375 + A-9AM + + + 0.5 + A-12PM + + + 0.625 + A-3PM + + + 0.75 + A-6PM + + + 0.875 + A-9PM + + + diff --git a/indra/newview/llfloaterdaycycle.cpp b/indra/newview/llfloaterdaycycle.cpp index 58876a8de..07106e6b1 100644 --- a/indra/newview/llfloaterdaycycle.cpp +++ b/indra/newview/llfloaterdaycycle.cpp @@ -37,6 +37,7 @@ #include "pipeline.h" #include "llsky.h" +#include "llboost.h" #include "llsliderctrl.h" #include "llmultislider.h" #include "llmultisliderctrl.h" @@ -54,12 +55,16 @@ #include "llviewerwindow.h" #include "llwlparamset.h" +#include "llwldaycycle.h" #include "llwlparammanager.h" +#include "ascentdaycyclemanager.h" //Ascent Addition #include "llpostprocess.h" #include "llfloaterwindlight.h" LLFloaterDayCycle* LLFloaterDayCycle::sDayCycle = NULL; + +std::set LLFloaterDayCycle::sDefaultPresets; std::map LLFloaterDayCycle::sSliderToKey; const F32 LLFloaterDayCycle::sHoursPerDay = 24.0f; @@ -88,6 +93,37 @@ LLFloaterDayCycle::LLFloaterDayCycle() : LLFloater(std::string("Day Cycle Floate sldr->addSlider(); + // add the combo boxes + LLComboBox* comboBox = getChild("DayCyclePresetsCombo"); + + if(comboBox != NULL) { + + std::map::iterator mIt = + AscentDayCycleManager::instance()->mParamList.begin(); + for(; mIt != AscentDayCycleManager::instance()->mParamList.end(); mIt++) + { + comboBox->add(mIt->first); + } + + // entry for when we're in estate time + comboBox->add(LLStringUtil::null); + + // set defaults on combo boxes + comboBox->selectByValue(LLSD("Default")); + } + + // add the list of presets + std::string def_days = getString("DaycycleDefaultNames"); + + // no editing or deleting of the blank string + sDefaultPresets.insert(""); + boost_tokenizer tokens(def_days, boost::char_separator(":")); + for (boost_tokenizer::iterator token_iter = tokens.begin(); token_iter != tokens.end(); ++token_iter) + { + std::string tok(*token_iter); + //sDefaultPresets.insert(tok); + } + // load it up initCallbacks(); } @@ -130,6 +166,15 @@ void LLFloaterDayCycle::initCallbacks(void) childSetAction("WLLoadDayCycle", onLoadDayCycle, NULL); childSetAction("WLSaveDayCycle", onSaveDayCycle, NULL); + LLComboBox* comboBox = getChild("DayCyclePresetsCombo"); + + //childSetAction("WLLoadPreset", onLoadPreset, comboBox); + childSetAction("DayCycleNewPreset", onNewPreset, comboBox); + childSetAction("DayCycleSavePreset", onSavePreset, comboBox); + childSetAction("DayCycleDeletePreset", onDeletePreset, comboBox); + + comboBox->setCommitCallback(onChangePresetName); + childSetAction("WLAddKey", onAddKey, NULL); childSetAction("WLDeleteKey", onDeleteKey, NULL); } @@ -268,6 +313,216 @@ void LLFloaterDayCycle::onClose(bool app_quitting) } } +void LLFloaterDayCycle::onNewPreset(void* userData) +{ + LLNotifications::instance().add("NewDaycyclePreset", LLSD(), LLSD(), newPromptCallback); +} + +void LLFloaterDayCycle::onSavePreset(void* userData) +{ + // get the name + LLComboBox* comboBox = sDayCycle->getChild( + "DayCyclePresetsCombo"); + + // don't save the empty name + if(comboBox->getSelectedItemLabel() == "") + { + return; + } + + // check to see if it's a default and shouldn't be overwritten + std::set::iterator sIt = sDefaultPresets.find( + comboBox->getSelectedItemLabel()); + if(sIt != sDefaultPresets.end() && !gSavedSettings.getBOOL("SkyEditPresets")) + { + LLNotifications::instance().add("WLNoEditDefault"); + return; + } + + LLWLParamManager::instance()->mCurParams.mName = + comboBox->getSelectedItemLabel(); + + LLNotifications::instance().add("WLSavePresetAlert", LLSD(), LLSD(), saveAlertCallback); +} + +bool LLFloaterDayCycle::saveAlertCallback(const LLSD& notification, const LLSD& response) +{ + S32 option = LLNotification::getSelectedOption(notification, response); + // if they choose save, do it. Otherwise, don't do anything + if(option == 0) + { + LLComboBox* combo_box = sDayCycle->getChild("DayCyclePresetsCombo"); + // comment this back in to save to file + LLWLParamManager::instance()->mDay.saveDayCycle(combo_box->getSelectedValue().asString()); + } + return false; +} + +void LLFloaterDayCycle::onDeletePreset(void* userData) +{ + LLComboBox* combo_box = sDayCycle->getChild( + "DayCyclePresetsCombo"); + + if(combo_box->getSelectedValue().asString() == "") + { + return; + } + + LLSD args; + args["SKY"] = combo_box->getSelectedValue().asString(); + LLNotifications::instance().add("WLDeletePresetAlert", args, LLSD(), + boost::bind(&LLFloaterDayCycle::deleteAlertCallback, sDayCycle, _1, _2)); +} + +bool LLFloaterDayCycle::deleteAlertCallback(const LLSD& notification, const LLSD& response) +{ + S32 option = LLNotification::getSelectedOption(notification, response); + + // if they choose delete, do it. Otherwise, don't do anything + if(option == 0) + { + LLComboBox* combo_box = getChild( + "DayCyclePresetsCombo"); + LLFloaterDayCycle* day_cycle = NULL; + LLComboBox* key_combo = NULL; + LLMultiSliderCtrl* mult_sldr = NULL; + + if(LLFloaterDayCycle::isOpen()) + { + day_cycle = LLFloaterDayCycle::instance(); + key_combo = day_cycle->getChild( + "WLKeyPresets"); + mult_sldr = day_cycle->getChild("WLDayCycleKeys"); + } + + std::string name(combo_box->getSelectedValue().asString()); + + // check to see if it's a default and shouldn't be deleted + std::set::iterator sIt = sDefaultPresets.find(name); + if(sIt != sDefaultPresets.end()) + { + LLNotifications::instance().add("WLNoEditDefault"); + return false; + } + + AscentDayCycleManager::instance()->removeParamSet(name, true); + + // remove and choose another + S32 new_index = combo_box->getCurrentIndex(); + + combo_box->remove(name); + if(key_combo != NULL) + { + key_combo->remove(name); + + // remove from slider, as well + day_cycle->deletePreset(name); + } + + // pick the previously selected index after delete + if(new_index > 0) + { + new_index--; + } + + if(combo_box->getItemCount() > 0) + { + combo_box->setCurrentByIndex(new_index); + } + } + return false; +} + +bool LLFloaterDayCycle::newPromptCallback(const LLSD& notification, const LLSD& response) +{ + std::string text = response["message"].asString(); + S32 option = LLNotification::getSelectedOption(notification, response); + + if(text == "") + { + return false; + } + + if(option == 0) { + LLComboBox* comboBox = sDayCycle->getChild( + "DayCyclePresetsCombo"); + + LLFloaterDayCycle* sDayCycle = NULL; + LLComboBox* keyCombo = NULL; + if(LLFloaterDayCycle::isOpen()) + { + sDayCycle = LLFloaterDayCycle::instance(); + keyCombo = sDayCycle->getChild( + "WLKeyPresets"); + } + + // add the current parameters to the list + // see if it's there first + std::map::iterator mIt = + AscentDayCycleManager::instance()->mParamList.find(text); + + // if not there, add a new one + if(mIt == AscentDayCycleManager::instance()->mParamList.end()) + { + AscentDayCycleManager::instance()->addParamSet(text, + AscentDayCycleManager::instance()->mCurParams); + comboBox->add(text); + comboBox->sortByName(); + + // add a blank to the bottom + comboBox->selectFirstItem(); + if(comboBox->getSimple() == "") + { + comboBox->remove(0); + } + comboBox->add(LLStringUtil::null); + + comboBox->setSelectedByValue(text, true); + if(LLFloaterDayCycle::isOpen()) + { + keyCombo->add(text); + keyCombo->sortByName(); + } + LLWLParamManager::instance()->mDay.saveDayCycle(text); + + // otherwise, send a message to the user + } + else + { + LLNotifications::instance().add("ExistsSkyPresetAlert"); + } + } + return false; +} + +void LLFloaterDayCycle::onChangePresetName(LLUICtrl* ctrl, void * userData) +{ + + LLComboBox * combo_box = static_cast(ctrl); + + if(combo_box->getSimple() == "") + { + return; + } + + LLWLParamManager::instance()->mDay.loadDayCycle(combo_box->getSelectedValue().asString()); + gSavedSettings.setString("AscentActiveDayCycle", combo_box->getSelectedValue().asString()); + // sync it all up + syncSliderTrack(); + syncMenu(); + + // set the param manager's track to the new one + LLMultiSliderCtrl* tSldr; + tSldr = sDayCycle->getChild( + "WLTimeSlider"); + LLWLParamManager::instance()->resetAnimator( + tSldr->getCurSliderValue() / sHoursPerDay, false); + + // and draw it + LLWLParamManager::instance()->mAnimator.update( + LLWLParamManager::instance()->mCurParams); +} + void LLFloaterDayCycle::onRunAnimSky(void* userData) { // if no keys, do nothing @@ -307,8 +562,8 @@ void LLFloaterDayCycle::onStopAnimSky(void* userData) void LLFloaterDayCycle::onUseLindenTime(void* userData) { - LLFloaterWindLight* wl = LLFloaterWindLight::instance(); - LLComboBox* box = wl->getChild("WLPresetsCombo"); + LLFloaterDayCycle* dc = LLFloaterDayCycle::instance(); + LLComboBox* box = dc->getChild("DayCyclePresetsCombo"); box->selectByValue(""); LLWLParamManager::instance()->mAnimator.mIsRunning = true; @@ -317,7 +572,7 @@ void LLFloaterDayCycle::onUseLindenTime(void* userData) void LLFloaterDayCycle::onLoadDayCycle(void* userData) { - LLWLParamManager::instance()->mDay.loadDayCycle("Default.xml"); + //LLWLParamManager::instance()->mDay.loadDayCycle("Default.xml"); // sync it all up syncSliderTrack(); @@ -337,7 +592,7 @@ void LLFloaterDayCycle::onLoadDayCycle(void* userData) void LLFloaterDayCycle::onSaveDayCycle(void* userData) { - LLWLParamManager::instance()->mDay.saveDayCycle("Default.xml"); + //LLWLParamManager::instance()->mDay.saveDayCycle("Default.xml"); } diff --git a/indra/newview/llfloaterdaycycle.h b/indra/newview/llfloaterdaycycle.h index d23003554..17330f8ca 100644 --- a/indra/newview/llfloaterdaycycle.h +++ b/indra/newview/llfloaterdaycycle.h @@ -99,10 +99,30 @@ public: /// delete a key frame static void onDeleteKey(void* userData); - /// button to load day + /// when user hits the load preset button + static void onNewPreset(void* userData); + + /// when user hits the save preset button + static void onSavePreset(void* userData); + + /// prompts a user when overwriting a preset + static bool saveAlertCallback(const LLSD& notification, const LLSD& response); + + /// when user hits the save preset button + static void onDeletePreset(void* userData); + + /// prompts a user when overwriting a preset + bool deleteAlertCallback(const LLSD& notification, const LLSD& response); + + static bool newPromptCallback(const LLSD& notification, const LLSD& response); + + /// what to do when you change the preset name + static void onChangePresetName(LLUICtrl* ctrl, void* userData); + + /// button to load day OLD -HgB static void onLoadDayCycle(void* userData); - /// button to save day + /// button to save day OLD -HgB static void onSaveDayCycle(void* userData); /// toggle for Linden time @@ -140,6 +160,9 @@ private: // map of sliders to parameters static std::map sSliderToKey; + //Presets default + static std::set sDefaultPresets; + static const F32 sHoursPerDay; }; diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 68f63a7a2..56e2713c4 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -193,11 +193,13 @@ #include "llsocks5.h" #include "jcfloaterareasearch.h" + // #include "llpanellogin.h" //#include "llfloateravatars.h" //#include "llactivation.h" #include "wlfPanel_AdvSettings.h" //Lower right Windlight and Rendering options +#include "ascentdaycyclemanager.h" #include "llao.h" #include "llfloaterblacklist.h" #include "scriptcounter.h" @@ -2528,6 +2530,7 @@ bool idle_startup() // init the shader managers LLPostProcess::initClass(); LLWLParamManager::initClass(); + AscentDayCycleManager::initClass(); LLWaterParamManager::initClass(); // RN: don't initialize VO classes in drone mode, they are too closely tied to rendering diff --git a/indra/newview/llwldaycycle.cpp b/indra/newview/llwldaycycle.cpp index 1d17c6047..2abf9d45a 100644 --- a/indra/newview/llwldaycycle.cpp +++ b/indra/newview/llwldaycycle.cpp @@ -40,7 +40,9 @@ #include -LLWLDayCycle::LLWLDayCycle() : mDayRate(120) +LLWLDayCycle::LLWLDayCycle() : + mDayRate(120), + mName("Unnamed Cycle") { } @@ -54,22 +56,39 @@ void LLWLDayCycle::loadDayCycle(const std::string & fileName) // clear the first few things mTimeMap.clear(); - // now load the file - std::string pathName(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, - "windlight/days", fileName)); - llinfos << "Loading DayCycle settings from " << pathName << llendl; - - llifstream day_cycle_xml(pathName); - if (day_cycle_xml.is_open()) + // bugfix for SL-46920: preventing filenames that break stuff. + char * curl_str = curl_escape(fileName.c_str(), fileName.size()); + std::string escaped_filename(curl_str); + curl_free(curl_str); + curl_str = NULL; + + escaped_filename += ".xml"; + + std::string pathName(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight/days", escaped_filename)); + llinfos << "Loading Day Cycle preset from " << pathName << llendl; + + llifstream day_cycle_xml; + day_cycle_xml.open(pathName.c_str()); + + // That failed, try loading from the users area instead. + if(!day_cycle_xml) + { + pathName=gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight/days", escaped_filename); + llinfos << "Loading User Day Cycle preset from " << pathName << llendl; + day_cycle_xml.open(pathName.c_str()); + } + + if (day_cycle_xml) { // load and parse it LLSD day_data(LLSD::emptyArray()); LLPointer parser = new LLSDXMLParser(); parser->parse(day_cycle_xml, day_data, LLSDSerialize::SIZE_UNLIMITED); - + llinfos << "Loading day cycle into timeline..." << llendl; // add each key for(S32 i = 0; i < day_data.size(); ++i) { + llinfos << "Loading value" << i << llendl; // make sure it's a two array if(day_data[i].size() != 2) { @@ -95,14 +114,39 @@ void LLWLDayCycle::loadDayCycle(const std::string & fileName) day_cycle_xml.close(); } + else + { + llwarns << "Can't find " << fileName << llendl; + return; + } } void LLWLDayCycle::saveDayCycle(const std::string & fileName) { - LLSD day_data(LLSD::emptyArray()); + + // bugfix for SL-46920: preventing filenames that break stuff. + char * curl_str = curl_escape(fileName.c_str(), fileName.size()); + std::string escaped_filename(curl_str); + curl_free(curl_str); + curl_str = NULL; - std::string pathName(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight/days", fileName)); - //llinfos << "Saving WindLight settings to " << pathName << llendl; + escaped_filename += ".xml"; + + std::string pathName(gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "windlight/days", escaped_filename)); + llinfos << "Saving Day Cycle preset from " << pathName << llendl; + + llofstream day_cycle_xml; + day_cycle_xml.open(pathName.c_str()); + + // That failed, try loading from the users area instead. + if(!day_cycle_xml) + { + pathName=gDirUtilp->getExpandedFilename( LL_PATH_USER_SETTINGS , "windlight/days", escaped_filename); + llinfos << "Saving User Day Cycle preset from " << pathName << llendl; + day_cycle_xml.open(pathName.c_str()); + } + + LLSD day_data(LLSD::emptyArray()); for(std::map::const_iterator mIt = mTimeMap.begin(); mIt != mTimeMap.end(); @@ -114,7 +158,6 @@ void LLWLDayCycle::saveDayCycle(const std::string & fileName) day_data.append(key); } - llofstream day_cycle_xml(pathName); LLPointer formatter = new LLSDXMLFormatter(); formatter->format(day_data, day_cycle_xml, LLSDFormatter::OPTIONS_PRETTY); day_cycle_xml.close(); diff --git a/indra/newview/llwldaycycle.h b/indra/newview/llwldaycycle.h index f045a6d1b..d886317a2 100644 --- a/indra/newview/llwldaycycle.h +++ b/indra/newview/llwldaycycle.h @@ -45,6 +45,9 @@ class LLWLDayCycle; class LLWLDayCycle { + +public: + std::string mName; public: // lists what param sets are used when during the day diff --git a/indra/newview/llwlparammanager.cpp b/indra/newview/llwlparammanager.cpp index b8a2bf0bd..c4d146664 100644 --- a/indra/newview/llwlparammanager.cpp +++ b/indra/newview/llwlparammanager.cpp @@ -553,7 +553,7 @@ LLWLParamManager * LLWLParamManager::instance() sInstance->loadPresets(LLStringUtil::null); // load the day - sInstance->mDay.loadDayCycle(std::string("Default.xml")); + sInstance->mDay.loadDayCycle(gSavedSettings.getString("AscentActiveDayCycle")); // *HACK - sets cloud scrolling to what we want... fix this better in the future sInstance->getParamSet("Default", sInstance->mCurParams); diff --git a/indra/newview/skins/default/xui/en-us/floater_day_cycle_options.xml b/indra/newview/skins/default/xui/en-us/floater_day_cycle_options.xml index 84812b9de..ab31d1ea6 100644 --- a/indra/newview/skins/default/xui/en-us/floater_day_cycle_options.xml +++ b/indra/newview/skins/default/xui/en-us/floater_day_cycle_options.xml @@ -237,14 +237,36 @@ label="Use Estate Time" label_selected="Go to Estate Time" left_delta="55" mouse_opaque="true" name="WLUseLindenTime" scale_image="true" width="140" /> -