From d9c9fbdd0d4c2638b3aab5b2db0f8cf6d48a928e Mon Sep 17 00:00:00 2001 From: Armin Weatherwax Date: Thu, 26 Aug 2010 16:24:58 +0200 Subject: Katharine Berry: Can load WindLight settings from LLSD notecards ending in ".wl" --- linden/indra/newview/llinventorybridge.cpp | 68 ++++++++++++++++++++++ linden/indra/newview/llinventorybridge.h | 1 + linden/indra/newview/llwlparammanager.cpp | 56 +++++++++++++++++- linden/indra/newview/llwlparammanager.h | 12 +++- .../skins/default/xui/en-us/menu_inventory.xml | 4 ++ 5 files changed, 137 insertions(+), 4 deletions(-) diff --git a/linden/indra/newview/llinventorybridge.cpp b/linden/indra/newview/llinventorybridge.cpp index 41af123..7396eac 100644 --- a/linden/indra/newview/llinventorybridge.cpp +++ b/linden/indra/newview/llinventorybridge.cpp @@ -86,6 +86,7 @@ #include "lluictrlfactory.h" #include "llselectmgr.h" #include "llfloateropenobject.h" +#include "llwlparammanager.h" // Helpers // bug in busy count inc/dec right now, logic is complex... do we really need it? @@ -812,6 +813,12 @@ void LLItemBridge::performAction(LLFolderView* folder, LLInventoryModel* model, folder_view_itemp->getListener()->pasteFromClipboard(); return; } + else if ("load_windlight" == action) + { + LLInventoryItem* itemp = model->getItem(mUUID); + if(!itemp) return; + LLWLParamManager::instance()->loadPresetNotecard(itemp->getName(), itemp->getAssetUUID(), mUUID); + } } void LLItemBridge::selectItem() @@ -3059,7 +3066,68 @@ void LLNotecardBridge::openItem() open_notecard(item, getPrefix() + item->getName(), LLUUID::null, FALSE); } } + +void LLNotecardBridge::buildContextMenu(LLMenuGL& menu, U32 flags) +{ + // *TODO: Translate + lldebugs << "LLNotecardBridge::buildContextMenu()" << llendl; + std::vector items; + std::vector disabled_items; + if(isInTrash()) + { + items.push_back(std::string("Purge Item")); + if (!isItemRemovable()) + { + disabled_items.push_back(std::string("Purge Item")); + } + + items.push_back(std::string("Restore Item")); + } + else + { + bool is_windlight = (getName().length() > 2 && getName().compare(getName().length() - 3, 3, ".wl") == 0); + + if(is_windlight) + { + items.push_back(std::string("Use Windlight Settings")); + } + items.push_back(std::string("Properties")); + getClipboardEntries(true, items, disabled_items, flags); + } + hideContextEntries(menu, items, disabled_items); +/* +-- + + + + menuentry_vec_t items; + menuentry_vec_t disabled_items; + if(isItemInTrash()) + { + addTrashContextMenuOptions(items, disabled_items); + } + else + { + bool is_windlight = (getName().length() > 2 && getName().compare(getName().length() - 3, 3, ".wl") == 0); + items.push_back(std::string("Share")); + if (!canShare()) + { + disabled_items.push_back(std::string("Share")); + } + + addOpenRightClickMenuOption(items); + if(is_windlight) + { + items.push_back(std::string("Use Windlight Settings")); + } + items.push_back(std::string("Properties")); + + getClipboardEntries(true, items, disabled_items, flags); + } + hide_context_entries(menu, items, disabled_items); +*/ +} // +=================================================+ // | LLGestureBridge | diff --git a/linden/indra/newview/llinventorybridge.h b/linden/indra/newview/llinventorybridge.h index 53540b0..2ad4b3a 100644 --- a/linden/indra/newview/llinventorybridge.h +++ b/linden/indra/newview/llinventorybridge.h @@ -476,6 +476,7 @@ public: virtual LLUIImagePtr getIcon() const; virtual void openItem(); + virtual void buildContextMenu(LLMenuGL& menu, U32 flags); protected: LLNotecardBridge(LLInventoryPanel* inventory, const LLUUID& uuid) : diff --git a/linden/indra/newview/llwlparammanager.cpp b/linden/indra/newview/llwlparammanager.cpp index 5f80283..8bbff25 100644 --- a/linden/indra/newview/llwlparammanager.cpp +++ b/linden/indra/newview/llwlparammanager.cpp @@ -60,6 +60,14 @@ #include "llfloaterdaycycle.h" #include "llfloaterenvsettings.h" + +// For notecard loading +#include "llvfile.h" +#include "llnotecard.h" +#include "llmemorystream.h" +#include "llnotify.h" +#include "llagent.h" + #include "curl/curl.h" LLWLParamManager * LLWLParamManager::sInstance = NULL; @@ -159,7 +167,7 @@ void LLWLParamManager::loadPresets(const std::string& file_name) } -bool LLWLParamManager::loadPresetXML(const std::string& name, std::istream& preset_stream, bool check_if_real /* = false */) +bool LLWLParamManager::loadPresetXML(const std::string& name, std::istream& preset_stream, bool propagate /* = false */, bool check_if_real /* = false */) { LLSD paramsData(LLSD::emptyMap()); @@ -216,9 +224,28 @@ bool LLWLParamManager::loadPresetXML(const std::string& name, std::istream& pres { setParamSet(name, paramsData); } + + if(propagate) + { + getParamSet(name, mCurParams); + propagateParameters(); + } return true; } - +void LLWLParamManager::loadPresetNotecard(const std::string& name, const LLUUID& asset_id, const LLUUID& inv_id) +{ + gAssetStorage->getInvItemAsset(LLHost::invalid, + gAgent.getID(), + gAgent.getSessionID(), + gAgent.getID(), + LLUUID::null, + inv_id, + asset_id, + LLAssetType::AT_NOTECARD, + &loadWindlightNotecard, + (void*)name.c_str()); +} + void LLWLParamManager::savePresets(const std::string & fileName) { //Nobody currently calls me, but if they did, then its reasonable to write the data out to the user's folder @@ -620,6 +647,31 @@ LLWLParamManager * LLWLParamManager::instance() return sInstance; } +void LLWLParamManager::loadWindlightNotecard(LLVFS *vfs, const LLUUID& asset_id, LLAssetType::EType asset_type, void *user_data, S32 status, LLExtStat ext_status) +{ + std::string name = std::string((char*)user_data); + if(LL_ERR_NOERR == status) + { + LLVFile file(vfs, asset_id, asset_type, LLVFile::READ); + S32 file_length = file.getSize(); + std::vector buffer(file_length + 1); + file.read((U8*)&buffer[0], file_length); + buffer[file_length] = 0; + LLNotecard notecard(LLNotecard::MAX_SIZE); + LLMemoryStream str((U8*)&buffer[0], file_length + 1); + notecard.importStream(str); + std::string settings = notecard.getText(); + LLMemoryStream settings_str((U8*)settings.c_str(), settings.length()); + bool is_real_setting = sInstance->loadPresetXML(name, settings_str, true, true); + if(!is_real_setting) + { + LLSD subs; + subs["NAME"] = name; + LLNotifications::getInstance()->add("KittyInvalidWindlightNotecard", subs); + } + } +} + // static void LLWLParamManager::addObserver(LLWLPresetsObserver* observer) { diff --git a/linden/indra/newview/llwlparammanager.h b/linden/indra/newview/llwlparammanager.h index 141af3c..c506c11 100644 --- a/linden/indra/newview/llwlparammanager.h +++ b/linden/indra/newview/llwlparammanager.h @@ -40,6 +40,9 @@ #include "llwldaycycle.h" #include "llviewercamera.h" +#include "llassettype.h" // Ugh. +class LLVFS; + class LLGLSLShader; class LLWLPresetsObserver @@ -143,11 +146,14 @@ public: void savePresets(const std::string & fileName); /// load an individual preset into the sky - void loadPreset(const std::string & name,bool propogate=true); + void loadPreset(const std::string & name, bool propogate=true); /// load an individual preset into the sky from an LLSD stream /// Returns whether the stream was actually reasonable XML to load from. - bool loadPresetXML(const std::string& name, std::istream& preset_stream, bool check_if_real=false); + bool loadPresetXML(const std::string& name, std::istream& preset_stream, bool propogate=false, bool check_if_real=false); + + /// Load an individual preset from a notecard. + void loadPresetNotecard(const std::string& name, const LLUUID& asset_id, const LLUUID& inv_id); /// save the parameter presets to file void savePreset(const std::string & name); @@ -274,6 +280,8 @@ private: static std::vector sObservers; + static void loadWindlightNotecard(LLVFS *vfs, const LLUUID& asset_id, LLAssetType::EType asset_type, void *user_data, S32 status, LLExtStat ext_status); + }; inline F32 LLWLParamManager::getDomeOffset(void) const diff --git a/linden/indra/newview/skins/default/xui/en-us/menu_inventory.xml b/linden/indra/newview/skins/default/xui/en-us/menu_inventory.xml index ad43c9d..8d5f1fe 100644 --- a/linden/indra/newview/skins/default/xui/en-us/menu_inventory.xml +++ b/linden/indra/newview/skins/default/xui/en-us/menu_inventory.xml @@ -141,6 +141,10 @@ name="Open" width="128"> + + + -- cgit v1.1