From e2552ec6737fe734ffd5b4768193c6a890d66f70 Mon Sep 17 00:00:00 2001 From: Vadim ProductEngine Date: Tue, 6 Sep 2011 17:45:47 +0300 Subject: STORM-1577 WIP Implemented translation via Microsoft Translator and Google Translate v2 APIs. --- indra/newview/app_settings/settings.xml | 33 ++++ indra/newview/lltranslate.cpp | 312 ++++++++++++++++++++++++++------ indra/newview/lltranslate.h | 87 ++------- indra/newview/llviewermessage.cpp | 7 +- 4 files changed, 316 insertions(+), 123 deletions(-) (limited to 'indra/newview') diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 0996f75fbb..2549538df2 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -10922,6 +10922,39 @@ Value 0 + TranslationService + + Comment + Translation API to use. (google_v1|google_v2|bing) + Persist + 1 + Type + String + Value + google_v1 + + GoogleTranslateAPIv2Key + + Comment + Google Translate API v2 key + Persist + 1 + Type + String + Value + + + BingTranslateAPIKey + + Comment + Bing AppID to use with the Microsoft Translator V2 API + Persist + 1 + Type + String + Value + + TutorialURL Comment diff --git a/indra/newview/lltranslate.cpp b/indra/newview/lltranslate.cpp index 2f60b6b90b..e29ea373ce 100644 --- a/indra/newview/lltranslate.cpp +++ b/indra/newview/lltranslate.cpp @@ -37,74 +37,263 @@ #include "reader.h" -// These two are concatenated with the language specifiers to form a complete Google Translate URL -const char* LLTranslate::m_GoogleURL = "http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&q="; -const char* LLTranslate::m_GoogleLangSpec = "&langpair="; -float LLTranslate::m_GoogleTimeout = 5; - -LLSD LLTranslate::m_Header; -// These constants are for the GET header. -const char* LLTranslate::m_AcceptHeader = "Accept"; -const char* LLTranslate::m_AcceptType = "text/plain"; -const char* LLTranslate::m_AgentHeader = "User-Agent"; - -// These constants are in the JSON returned from Google -const char* LLTranslate::m_GoogleData = "responseData"; -const char* LLTranslate::m_GoogleTranslation = "translatedText"; -const char* LLTranslate::m_GoogleLanguage = "detectedSourceLanguage"; +class LLTranslationAPIHandler +{ +public: + virtual void getTranslateURL( + std::string &url, + const std::string &from_lang, + const std::string &to_lang, + const std::string &text) const = 0; -//static -void LLTranslate::translateMessage(LLHTTPClient::ResponderPtr &result, const std::string &from_lang, const std::string &to_lang, const std::string &mesg) + virtual bool parseResponse( + int& status, + const std::string& body, + std::string& translation, + std::string& detected_lang, + std::string& err_msg) const = 0; + + virtual ~LLTranslationAPIHandler() {} + +protected: + static const int STATUS_OK = 200; +}; + +class LLGoogleV1Handler : public LLTranslationAPIHandler { - std::string url; - getTranslateUrl(url, from_lang, to_lang, mesg); + LOG_CLASS(LLGoogleV1Handler); + +public: + /*virtual*/ void getTranslateURL( + std::string &url, + const std::string &from_lang, + const std::string &to_lang, + const std::string &text) const + { + url = "http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&q=" + + LLURI::escape(text) + + "&langpair=" + from_lang + "%7C" + to_lang; + } + + /*virtual*/ bool parseResponse( + int& status, + const std::string& body, + std::string& translation, + std::string& detected_lang, + std::string& err_msg) const + { + Json::Value root; + Json::Reader reader; + + if (!reader.parse(body, root)) + { + err_msg = reader.getFormatedErrorMessages(); + return false; + } + + // This API doesn't return proper status in the HTTP response header, + // but it is in the body. + status = root["responseStatus"].asInt(); + if (status != STATUS_OK) + { + err_msg = root["responseDetails"].asString(); + return false; + } + + const Json::Value& response_data = root["responseData"]; + translation = response_data.get("translatedText", "").asString(); + detected_lang = response_data.get("detectedSourceLanguage", "").asString(); + return true; + } +}; + +class LLGoogleV2Handler : public LLTranslationAPIHandler +{ + LOG_CLASS(LLGoogleV2Handler); + +public: + /*virtual*/ void getTranslateURL( + std::string &url, + const std::string &from_lang, + const std::string &to_lang, + const std::string &text) const + { + url = std::string("https://www.googleapis.com/language/translate/v2?key=") + + getAPIKey() + "&q=" + LLURI::escape(text) + "&target=" + to_lang; + if (!from_lang.empty()) + { + url += "&source=" + from_lang; + } + } + + /*virtual*/ bool parseResponse( + int& status, + const std::string& body, + std::string& translation, + std::string& detected_lang, + std::string& err_msg) const + { + Json::Value root; + Json::Reader reader; + + if (!reader.parse(body, root)) + { + err_msg = reader.getFormatedErrorMessages(); + return false; + } + + if (status != STATUS_OK) + { + const Json::Value& error = root["error"]; + err_msg = error["message"].asString(); + status = error["code"].asInt(); + return false; + } + + const Json::Value& response_data = root["data"]["translations"][0U]; + translation = response_data["translatedText"].asString(); + detected_lang = response_data["detectedSourceLanguage"].asString(); + return true; + } + +private: + static std::string getAPIKey() + { + return gSavedSettings.getString("GoogleTranslateAPIv2Key"); + } +}; + +class LLBingHandler : public LLTranslationAPIHandler +{ + LOG_CLASS(LLBingHandler); - std::string user_agent = llformat("%s %d.%d.%d (%d)", - LLVersionInfo::getChannel().c_str(), - LLVersionInfo::getMajor(), - LLVersionInfo::getMinor(), - LLVersionInfo::getPatch(), - LLVersionInfo::getBuild()); +public: + /*virtual*/ void getTranslateURL( + std::string &url, + const std::string &from_lang, + const std::string &to_lang, + const std::string &text) const + { + url = std::string("http://api.microsofttranslator.com/v2/Http.svc/Translate?appId=") + + getAPIKey() + "&text=" + LLURI::escape(text) + "&to=" + to_lang; + if (!from_lang.empty()) + { + url += "&from=" + from_lang; + } + } - if (!m_Header.size()) + /*virtual*/ bool parseResponse( + int& status, + const std::string& body, + std::string& translation, + std::string& detected_lang, + std::string& err_msg) const { - m_Header.insert(m_AcceptHeader, LLSD(m_AcceptType)); - m_Header.insert(m_AgentHeader, LLSD(user_agent)); + if (status != STATUS_OK) + { + size_t begin = body.find("Message: "); + size_t end = body.find("

", begin); + err_msg = body.substr(begin, end-begin); + LLStringUtil::replaceString(err_msg, " ", ""); // strip CR + return false; + } + + // Sample response: Hola + size_t begin = body.find(">"); + if (begin == std::string::npos || begin >= (body.size() - 1)) + { + return false; + } + + size_t end = body.find("", ++begin); + if (end == std::string::npos || end < begin) + { + return false; + } + + detected_lang = ""; // unsupported by this API + translation = body.substr(begin, end-begin); + LLStringUtil::replaceString(translation, " ", ""); // strip CR + return true; } - LLHTTPClient::get(url, result, m_Header, m_GoogleTimeout); +private: + static std::string getAPIKey() + { + return gSavedSettings.getString("BingTranslateAPIKey"); + } +}; + +LLTranslate::TranslationReceiver::TranslationReceiver(const std::string& from_lang, const std::string& to_lang) +: mFromLang(from_lang) +, mToLang(to_lang) +, mHandler(LLTranslate::getPreferredHandler()) +{ } -//static -void LLTranslate::getTranslateUrl(std::string &translate_url, const std::string &from_lang, const std::string &to_lang, const std::string &mesg) +// virtual +void LLTranslate::TranslationReceiver::completedRaw( + U32 http_status, + const std::string& reason, + const LLChannelDescriptors& channels, + const LLIOPipe::buffer_ptr_t& buffer) { - char * curl_str = curl_escape(mesg.c_str(), mesg.size()); - std::string const escaped_mesg(curl_str); - curl_free(curl_str); - - translate_url = m_GoogleURL - + escaped_mesg + m_GoogleLangSpec - + from_lang // 'from' language; empty string for auto - + "%7C" // | - + to_lang; // 'to' language + LLBufferStream istr(channels, buffer.get()); + std::stringstream strstrm; + strstrm << istr.rdbuf(); + + const std::string body = strstrm.str(); + std::string translation, detected_lang, err_msg; + int status = http_status; + if (mHandler.parseResponse(status, body, translation, detected_lang, err_msg)) + { + // Fix up the response + LLStringUtil::replaceString(translation, "<", "<"); + LLStringUtil::replaceString(translation, ">",">"); + LLStringUtil::replaceString(translation, ""","\""); + LLStringUtil::replaceString(translation, "'","'"); + LLStringUtil::replaceString(translation, "&","&"); + LLStringUtil::replaceString(translation, "'","'"); + + handleResponse(translation, detected_lang); + } + else + { + llwarns << "Translation request failed: " << err_msg << llendl; + LL_DEBUGS("Translate") << "HTTP status: " << status << " " << reason << LL_ENDL; + LL_DEBUGS("Translate") << "Error response body: " << body << LL_ENDL; + handleFailure(status, err_msg); + } } //static -bool LLTranslate::parseGoogleTranslate(const std::string& body, std::string &translation, std::string &detected_language) +void LLTranslate::translateMessage( + TranslationReceiverPtr &receiver, + const std::string &from_lang, + const std::string &to_lang, + const std::string &mesg) { - Json::Value root; - Json::Reader reader; - - bool success = reader.parse(body, root); - if (!success) + std::string url; + receiver->mHandler.getTranslateURL(url, from_lang, to_lang, mesg); + + static const float REQUEST_TIMEOUT = 5; + static LLSD sHeader; + + if (!sHeader.size()) { - LL_WARNS("Translate") << "Non valid response from Google Translate API: '" << reader.getFormatedErrorMessages() << "'" << LL_ENDL; - return false; + std::string user_agent = llformat("%s %d.%d.%d (%d)", + LLVersionInfo::getChannel().c_str(), + LLVersionInfo::getMajor(), + LLVersionInfo::getMinor(), + LLVersionInfo::getPatch(), + LLVersionInfo::getBuild()); + + sHeader.insert("Accept", "text/plain"); + sHeader.insert("User-Agent", user_agent); } - - translation = root[m_GoogleData].get(m_GoogleTranslation, "").asString(); - detected_language = root[m_GoogleData].get(m_GoogleLanguage, "").asString(); - return true; + + LL_DEBUGS("Translate") << "Sending translation request: " << url << LL_ENDL; + LLHTTPClient::get(url, receiver, sHeader, REQUEST_TIMEOUT); } //static @@ -119,3 +308,22 @@ std::string LLTranslate::getTranslateLanguage() return language; } +// static +const LLTranslationAPIHandler& LLTranslate::getPreferredHandler() +{ + static LLGoogleV1Handler google_v1; + static LLGoogleV2Handler google_v2; + static LLBingHandler bing; + + std::string service = gSavedSettings.getString("TranslationService"); + if (service == "google_v2") + { + return google_v2; + } + else if (service == "google_v1") + { + return google_v1; + } + + return bing; +} diff --git a/indra/newview/lltranslate.h b/indra/newview/lltranslate.h index e85a42e878..1dee792f7b 100644 --- a/indra/newview/lltranslate.h +++ b/indra/newview/lltranslate.h @@ -30,89 +30,42 @@ #include "llhttpclient.h" #include "llbufferstream.h" +class LLTranslationAPIHandler; + class LLTranslate { LOG_CLASS(LLTranslate); + public : class TranslationReceiver: public LLHTTPClient::Responder { - protected: - TranslationReceiver(const std::string &from_lang, const std::string &to_lang) - : m_fromLang(from_lang), - m_toLang(to_lang) - { - } - - virtual void handleResponse(const std::string &translation, const std::string &recognized_lang) {}; - virtual void handleFailure() {}; - public: - ~TranslationReceiver() - { - } - - virtual void completedRaw( U32 status, - const std::string& reason, - const LLChannelDescriptors& channels, - const LLIOPipe::buffer_ptr_t& buffer) - { - if (200 <= status && status < 300) - { - LLBufferStream istr(channels, buffer.get()); - std::stringstream strstrm; - strstrm << istr.rdbuf(); + /*virtual*/ void completedRaw( + U32 http_status, + const std::string& reason, + const LLChannelDescriptors& channels, + const LLIOPipe::buffer_ptr_t& buffer); - const std::string result = strstrm.str(); - std::string translation; - std::string detected_language; + protected: + friend class LLTranslate; - if (!parseGoogleTranslate(result, translation, detected_language)) - { - handleFailure(); - return; - } - - // Fix up the response - LLStringUtil::replaceString(translation, "<", "<"); - LLStringUtil::replaceString(translation, ">",">"); - LLStringUtil::replaceString(translation, ""","\""); - LLStringUtil::replaceString(translation, "'","'"); - LLStringUtil::replaceString(translation, "&","&"); - LLStringUtil::replaceString(translation, "'","'"); + TranslationReceiver(const std::string& from_lang, const std::string& to_lang); - handleResponse(translation, detected_language); - } - else - { - LL_WARNS("Translate") << "HTTP request for Google Translate failed with status " << status << ", reason: " << reason << LL_ENDL; - handleFailure(); - } - } + virtual void handleResponse(const std::string &translation, const std::string &recognized_lang) = 0; + virtual void handleFailure(int status, const std::string& err_msg) = 0; - protected: - const std::string m_toLang; - const std::string m_fromLang; + std::string mFromLang; + std::string mToLang; + const LLTranslationAPIHandler& mHandler; }; - static void translateMessage(LLHTTPClient::ResponderPtr &result, const std::string &from_lang, const std::string &to_lang, const std::string &mesg); - static float m_GoogleTimeout; + typedef boost::intrusive_ptr TranslationReceiverPtr; + + static void translateMessage(TranslationReceiverPtr &receiver, const std::string &from_lang, const std::string &to_lang, const std::string &mesg); static std::string getTranslateLanguage(); private: - static void getTranslateUrl(std::string &translate_url, const std::string &from_lang, const std::string &to_lang, const std::string &text); - static bool parseGoogleTranslate(const std::string& body, std::string &translation, std::string &detected_language); - - static LLSD m_Header; - static const char* m_GoogleURL; - static const char* m_GoogleLangSpec; - static const char* m_AcceptHeader; - static const char* m_AcceptType; - static const char* m_AgentHeader; - static const char* m_UserAgent; - - static const char* m_GoogleData; - static const char* m_GoogleTranslation; - static const char* m_GoogleLanguage; + static const LLTranslationAPIHandler& getPreferredHandler(); }; #endif diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 68745d5aeb..ff02214194 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -3138,7 +3138,7 @@ protected: { // filter out non-interesting responeses if ( !translation.empty() - && (m_toLang != detected_language) + && (mToLang != detected_language) && (LLStringUtil::compareInsensitive(translation, m_origMesg) != 0) ) { m_chat.mText += " (" + translation + ")"; @@ -3147,9 +3147,8 @@ protected: LLNotificationsUI::LLNotificationManager::instance().onChat(m_chat, m_toastArgs); } - void handleFailure() + void handleFailure(int status, const std::string& err_msg) { - LLTranslate::TranslationReceiver::handleFailure(); m_chat.mText += " (?)"; LLNotificationsUI::LLNotificationManager::instance().onChat(m_chat, m_toastArgs); @@ -3388,7 +3387,7 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data) const std::string from_lang = ""; // leave empty to trigger autodetect const std::string to_lang = LLTranslate::getTranslateLanguage(); - LLHTTPClient::ResponderPtr result = ChatTranslationReceiver::build(from_lang, to_lang, mesg, chat, args); + LLTranslate::TranslationReceiverPtr result = ChatTranslationReceiver::build(from_lang, to_lang, mesg, chat, args); LLTranslate::translateMessage(result, from_lang, to_lang, mesg); } else -- cgit v1.2.3 From e23ecf311c729be7e6611ef2fe21badaf9f1c3ed Mon Sep 17 00:00:00 2001 From: Vadim ProductEngine Date: Wed, 7 Sep 2011 00:09:49 +0300 Subject: STORM-1577 WIP Implemented chat translation preferences management. --- indra/newview/CMakeLists.txt | 2 + indra/newview/llfloaterpreference.cpp | 9 + indra/newview/llfloaterpreference.h | 1 + indra/newview/llfloatertranslationsettings.cpp | 146 ++++++++++++++ indra/newview/llfloatertranslationsettings.h | 59 ++++++ indra/newview/llviewerfloaterreg.cpp | 2 + .../xui/en/floater_translation_settings.xml | 222 +++++++++++++++++++++ .../default/xui/en/panel_preferences_chat.xml | 12 ++ 8 files changed, 453 insertions(+) create mode 100644 indra/newview/llfloatertranslationsettings.cpp create mode 100644 indra/newview/llfloatertranslationsettings.h create mode 100644 indra/newview/skins/default/xui/en/floater_translation_settings.xml (limited to 'indra/newview') diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index a117d9a593..e7ca2a4294 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -237,6 +237,7 @@ set(viewer_SOURCE_FILES llfloatertools.cpp llfloatertopobjects.cpp llfloatertos.cpp + llfloatertranslationsettings.cpp llfloateruipreview.cpp llfloaterurlentry.cpp llfloatervoiceeffect.cpp @@ -799,6 +800,7 @@ set(viewer_HEADER_FILES llfloatertools.h llfloatertopobjects.h llfloatertos.h + llfloatertranslationsettings.h llfloateruipreview.h llfloaterurlentry.h llfloatervoiceeffect.h diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp index d65928e385..07c07d608a 100755 --- a/indra/newview/llfloaterpreference.cpp +++ b/indra/newview/llfloaterpreference.cpp @@ -345,6 +345,7 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key) mCommitCallbackRegistrar.add("Pref.MaturitySettings", boost::bind(&LLFloaterPreference::onChangeMaturity, this)); mCommitCallbackRegistrar.add("Pref.BlockList", boost::bind(&LLFloaterPreference::onClickBlockList, this)); mCommitCallbackRegistrar.add("Pref.Proxy", boost::bind(&LLFloaterPreference::onClickProxySettings, this)); + mCommitCallbackRegistrar.add("Pref.TranslationSettings", boost::bind(&LLFloaterPreference::onClickTranslationSettings, this)); sSkin = gSavedSettings.getString("SkinCurrent"); @@ -602,6 +603,9 @@ void LLFloaterPreference::cancel() } // hide joystick pref floater LLFloaterReg::hideInstance("pref_joystick"); + + // hide translation settings floater + LLFloaterReg::hideInstance("prefs_translation"); // cancel hardware menu LLFloaterHardwareSettings* hardware_settings = LLFloaterReg::getTypedInstance("prefs_hardware_settings"); @@ -1553,6 +1557,11 @@ void LLFloaterPreference::onClickProxySettings() LLFloaterReg::showInstance("prefs_proxy"); } +void LLFloaterPreference::onClickTranslationSettings() +{ + LLFloaterReg::showInstance("prefs_translation"); +} + void LLFloaterPreference::updateDoubleClickControls() { // check is one of double-click actions settings enabled diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h index ef9bc2dd53..ee6bb235be 100644 --- a/indra/newview/llfloaterpreference.h +++ b/indra/newview/llfloaterpreference.h @@ -157,6 +157,7 @@ public: void onChangeMaturity(); void onClickBlockList(); void onClickProxySettings(); + void onClickTranslationSettings(); void applyUIColor(LLUICtrl* ctrl, const LLSD& param); void getUIColor(LLUICtrl* ctrl, const LLSD& param); diff --git a/indra/newview/llfloatertranslationsettings.cpp b/indra/newview/llfloatertranslationsettings.cpp new file mode 100644 index 0000000000..56f101d149 --- /dev/null +++ b/indra/newview/llfloatertranslationsettings.cpp @@ -0,0 +1,146 @@ +/** + * @file llfloatertranslationsettings.cpp + * @brief Machine translation settings for chat + * + * $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 "llfloatertranslationsettings.h" + +// Viewer includes +#include "llviewercontrol.h" // for gSavedSettings + +// Linden library includes +#include "llbutton.h" +#include "llcheckboxctrl.h" +#include "llcombobox.h" +#include "llfloaterreg.h" +#include "lllineeditor.h" +#include "llnotificationsutil.h" +#include "llradiogroup.h" + +LLFloaterTranslationSettings::LLFloaterTranslationSettings(const LLSD& key) +: LLFloater(key) +, mMachineTranslationCB(NULL) +, mLanguageCombo(NULL) +, mTranslationServiceRadioGroup(NULL) +, mBingAPIKeyEditor(NULL) +, mGoogleAPIKeyEditor(NULL) +{ +} + +// virtual +BOOL LLFloaterTranslationSettings::postBuild() +{ + mMachineTranslationCB = getChild("translate_chat_checkbox"); + mLanguageCombo = getChild("translate_language_combo"); + mTranslationServiceRadioGroup = getChild("translation_service_rg"); + mBingAPIKeyEditor = getChild("bing_api_key"); + mGoogleAPIKeyEditor = getChild("google_api_key"); + + mMachineTranslationCB->setCommitCallback(boost::bind(&LLFloaterTranslationSettings::updateControlsEnabledState, this)); + mTranslationServiceRadioGroup->setCommitCallback(boost::bind(&LLFloaterTranslationSettings::updateControlsEnabledState, this)); + getChild("ok_btn")->setClickedCallback(boost::bind(&LLFloaterTranslationSettings::onBtnOK, this)); + getChild("cancel_btn")->setClickedCallback(boost::bind(&LLFloater::closeFloater, this, false)); + + center(); + return TRUE; +} + +// virtual +void LLFloaterTranslationSettings::onOpen(const LLSD& key) +{ + mMachineTranslationCB->setValue(gSavedSettings.getBOOL("TranslateChat")); + mLanguageCombo->setSelectedByValue(gSavedSettings.getString("TranslateLanguage"), TRUE); + mTranslationServiceRadioGroup->setSelectedByValue(gSavedSettings.getString("TranslationService"), TRUE); + mBingAPIKeyEditor->setText(gSavedSettings.getString("BingTranslateAPIKey")); + mGoogleAPIKeyEditor->setText(gSavedSettings.getString("GoogleTranslateAPIv2Key")); + + updateControlsEnabledState(); +} + +std::string LLFloaterTranslationSettings::getSelectedService() const +{ + return mTranslationServiceRadioGroup->getSelectedValue().asString(); +} + +void LLFloaterTranslationSettings::showError(const std::string& err_name) +{ + LLSD args; + args["MESSAGE"] = getString(err_name); + LLNotificationsUtil::add("GenericAlert", args); +} + +bool LLFloaterTranslationSettings::validate() +{ + bool translate_chat = mMachineTranslationCB->getValue().asBoolean(); + if (!translate_chat) return true; + + std::string service = getSelectedService(); + if (service == "bing" && mBingAPIKeyEditor->getText().empty()) + { + showError("no_bing_api_key"); + return false; + } + + if (service == "google_v2" && mGoogleAPIKeyEditor->getText().empty()) + { + showError("no_google_api_key"); + return false; + } + + return true; +} + +void LLFloaterTranslationSettings::updateControlsEnabledState() +{ + // Enable/disable controls based on the checkbox value. + bool on = mMachineTranslationCB->getValue().asBoolean(); + std::string service = getSelectedService(); + + mTranslationServiceRadioGroup->setEnabled(on); + mLanguageCombo->setEnabled(on); + + getChild("bing_api_key_label")->setEnabled(on); + mBingAPIKeyEditor->setEnabled(on); + + getChild("google_api_key_label")->setEnabled(on); + mGoogleAPIKeyEditor->setEnabled(on); + + mBingAPIKeyEditor->setEnabled(service == "bing"); + mGoogleAPIKeyEditor->setEnabled(service == "google_v2"); +} + +void LLFloaterTranslationSettings::onBtnOK() +{ + if (validate()) + { + gSavedSettings.setBOOL("TranslateChat", mMachineTranslationCB->getValue().asBoolean()); + gSavedSettings.setString("TranslateLanguage", mLanguageCombo->getSelectedValue().asString()); + gSavedSettings.setString("TranslationService", getSelectedService()); + gSavedSettings.setString("BingTranslateAPIKey", mBingAPIKeyEditor->getText()); + gSavedSettings.setString("GoogleTranslateAPIv2Key", mGoogleAPIKeyEditor->getText()); + closeFloater(false); + } +} diff --git a/indra/newview/llfloatertranslationsettings.h b/indra/newview/llfloatertranslationsettings.h new file mode 100644 index 0000000000..1c03b86f4d --- /dev/null +++ b/indra/newview/llfloatertranslationsettings.h @@ -0,0 +1,59 @@ +/** + * @file llfloatertranslationsettings.h + * @brief Machine translation settings for chat + * + * $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_LLFLOATERTRANSLATIONSETTINGS_H +#define LL_LLFLOATERTRANSLATIONSETTINGS_H + +#include "llfloater.h" + +class LLCheckBoxCtrl; +class LLComboBox; +class LLLineEditor; +class LLRadioGroup; + +class LLFloaterTranslationSettings : public LLFloater +{ +public: + LLFloaterTranslationSettings(const LLSD& key); + /*virtual*/ BOOL postBuild(); + /*virtual*/ void onOpen(const LLSD& key); + +private: + std::string getSelectedService() const; + void showError(const std::string& err_name); + bool validate(); + void updateControlsEnabledState(); + void onMachineTranslationToggle(); + void onBtnOK(); + + LLCheckBoxCtrl* mMachineTranslationCB; + LLComboBox* mLanguageCombo; + LLLineEditor* mBingAPIKeyEditor; + LLLineEditor* mGoogleAPIKeyEditor; + LLRadioGroup* mTranslationServiceRadioGroup; +}; + +#endif // LL_LLFLOATERTRANSLATIONSETTINGS_H diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp index fecc6d91bd..3be26d87e2 100644 --- a/indra/newview/llviewerfloaterreg.cpp +++ b/indra/newview/llviewerfloaterreg.cpp @@ -102,6 +102,7 @@ #include "llfloatertools.h" #include "llfloatertos.h" #include "llfloatertopobjects.h" +#include "llfloatertranslationsettings.h" #include "llfloateruipreview.h" #include "llfloatervoiceeffect.h" #include "llfloaterwhitelistentry.h" @@ -234,6 +235,7 @@ void LLViewerFloaterReg::registerFloaters() LLFloaterReg::add("preferences", "floater_preferences.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); LLFloaterReg::add("prefs_proxy", "floater_preferences_proxy.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); LLFloaterReg::add("prefs_hardware_settings", "floater_hardware_settings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); + LLFloaterReg::add("prefs_translation", "floater_translation_settings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); LLFloaterReg::add("perm_prefs", "floater_perm_prefs.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); LLFloaterReg::add("pref_joystick", "floater_joystick.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); LLFloaterReg::add("preview_anim", "floater_preview_animation.xml", (LLFloaterBuildFunc)&LLFloaterReg::build, "preview"); diff --git a/indra/newview/skins/default/xui/en/floater_translation_settings.xml b/indra/newview/skins/default/xui/en/floater_translation_settings.xml new file mode 100644 index 0000000000..40a176830c --- /dev/null +++ b/indra/newview/skins/default/xui/en/floater_translation_settings.xml @@ -0,0 +1,222 @@ + + + + Bing Translator requires and appID to function. + Google Translate requires an API key to function. + + + + Translate chat into: + + + + + + + + + + + + + + + + + + + + + + + + Choose translation service to use: + + + + + + + + + Bing [http://www.bing.com/developers/createapp.aspx AppID]: + + + + + Google [http://code.google.com/apis/language/translate/v2/pricing.html API key]: + + + + + ([http://code.google.com/apis/language/translate/v2/pricing.html pricing]) + + + \ No newline at end of file -- cgit v1.2.3 From 7975ab138b6ac54fc831613e4d3dfb913c5efbd2 Mon Sep 17 00:00:00 2001 From: Vadim ProductEngine Date: Wed, 7 Sep 2011 16:14:47 +0300 Subject: STORM-1577 Removed support for Google Translate v1 API. --- indra/newview/app_settings/settings.xml | 10 ++-- indra/newview/llfloatertranslationsettings.cpp | 8 +-- indra/newview/lltranslate.cpp | 67 +++------------------- .../xui/en/floater_translation_settings.xml | 4 +- 4 files changed, 18 insertions(+), 71 deletions(-) (limited to 'indra/newview') diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 2549538df2..2f1a2093b2 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -10925,18 +10925,18 @@ TranslationService Comment - Translation API to use. (google_v1|google_v2|bing) + Translation API to use. (google|bing) Persist 1 Type String Value - google_v1 + bing - GoogleTranslateAPIv2Key + GoogleTranslateAPIKey Comment - Google Translate API v2 key + Google Translate API key Persist 1 Type @@ -10947,7 +10947,7 @@ BingTranslateAPIKey Comment - Bing AppID to use with the Microsoft Translator V2 API + Bing AppID to use with the Microsoft Translator API Persist 1 Type diff --git a/indra/newview/llfloatertranslationsettings.cpp b/indra/newview/llfloatertranslationsettings.cpp index 56f101d149..107205aed3 100644 --- a/indra/newview/llfloatertranslationsettings.cpp +++ b/indra/newview/llfloatertranslationsettings.cpp @@ -75,7 +75,7 @@ void LLFloaterTranslationSettings::onOpen(const LLSD& key) mLanguageCombo->setSelectedByValue(gSavedSettings.getString("TranslateLanguage"), TRUE); mTranslationServiceRadioGroup->setSelectedByValue(gSavedSettings.getString("TranslationService"), TRUE); mBingAPIKeyEditor->setText(gSavedSettings.getString("BingTranslateAPIKey")); - mGoogleAPIKeyEditor->setText(gSavedSettings.getString("GoogleTranslateAPIv2Key")); + mGoogleAPIKeyEditor->setText(gSavedSettings.getString("GoogleTranslateAPIKey")); updateControlsEnabledState(); } @@ -104,7 +104,7 @@ bool LLFloaterTranslationSettings::validate() return false; } - if (service == "google_v2" && mGoogleAPIKeyEditor->getText().empty()) + if (service == "google" && mGoogleAPIKeyEditor->getText().empty()) { showError("no_google_api_key"); return false; @@ -129,7 +129,7 @@ void LLFloaterTranslationSettings::updateControlsEnabledState() mGoogleAPIKeyEditor->setEnabled(on); mBingAPIKeyEditor->setEnabled(service == "bing"); - mGoogleAPIKeyEditor->setEnabled(service == "google_v2"); + mGoogleAPIKeyEditor->setEnabled(service == "google"); } void LLFloaterTranslationSettings::onBtnOK() @@ -140,7 +140,7 @@ void LLFloaterTranslationSettings::onBtnOK() gSavedSettings.setString("TranslateLanguage", mLanguageCombo->getSelectedValue().asString()); gSavedSettings.setString("TranslationService", getSelectedService()); gSavedSettings.setString("BingTranslateAPIKey", mBingAPIKeyEditor->getText()); - gSavedSettings.setString("GoogleTranslateAPIv2Key", mGoogleAPIKeyEditor->getText()); + gSavedSettings.setString("GoogleTranslateAPIKey", mGoogleAPIKeyEditor->getText()); closeFloater(false); } } diff --git a/indra/newview/lltranslate.cpp b/indra/newview/lltranslate.cpp index e29ea373ce..6576cbbe64 100644 --- a/indra/newview/lltranslate.cpp +++ b/indra/newview/lltranslate.cpp @@ -59,57 +59,9 @@ protected: static const int STATUS_OK = 200; }; -class LLGoogleV1Handler : public LLTranslationAPIHandler +class LLGoogleHandler : public LLTranslationAPIHandler { - LOG_CLASS(LLGoogleV1Handler); - -public: - /*virtual*/ void getTranslateURL( - std::string &url, - const std::string &from_lang, - const std::string &to_lang, - const std::string &text) const - { - url = "http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&q=" - + LLURI::escape(text) - + "&langpair=" + from_lang + "%7C" + to_lang; - } - - /*virtual*/ bool parseResponse( - int& status, - const std::string& body, - std::string& translation, - std::string& detected_lang, - std::string& err_msg) const - { - Json::Value root; - Json::Reader reader; - - if (!reader.parse(body, root)) - { - err_msg = reader.getFormatedErrorMessages(); - return false; - } - - // This API doesn't return proper status in the HTTP response header, - // but it is in the body. - status = root["responseStatus"].asInt(); - if (status != STATUS_OK) - { - err_msg = root["responseDetails"].asString(); - return false; - } - - const Json::Value& response_data = root["responseData"]; - translation = response_data.get("translatedText", "").asString(); - detected_lang = response_data.get("detectedSourceLanguage", "").asString(); - return true; - } -}; - -class LLGoogleV2Handler : public LLTranslationAPIHandler -{ - LOG_CLASS(LLGoogleV2Handler); + LOG_CLASS(LLGoogleHandler); public: /*virtual*/ void getTranslateURL( @@ -159,7 +111,7 @@ public: private: static std::string getAPIKey() { - return gSavedSettings.getString("GoogleTranslateAPIv2Key"); + return gSavedSettings.getString("GoogleTranslateAPIKey"); } }; @@ -311,18 +263,13 @@ std::string LLTranslate::getTranslateLanguage() // static const LLTranslationAPIHandler& LLTranslate::getPreferredHandler() { - static LLGoogleV1Handler google_v1; - static LLGoogleV2Handler google_v2; - static LLBingHandler bing; + static LLGoogleHandler google; + static LLBingHandler bing; std::string service = gSavedSettings.getString("TranslationService"); - if (service == "google_v2") - { - return google_v2; - } - else if (service == "google_v1") + if (service == "google") { - return google_v1; + return google; } return bing; diff --git a/indra/newview/skins/default/xui/en/floater_translation_settings.xml b/indra/newview/skins/default/xui/en/floater_translation_settings.xml index 40a176830c..f21f64fcf6 100644 --- a/indra/newview/skins/default/xui/en/floater_translation_settings.xml +++ b/indra/newview/skins/default/xui/en/floater_translation_settings.xml @@ -137,10 +137,10 @@ layout="topleft" name="bing" /> -- cgit v1.2.3 From 1fad7d997d99715cc88b6e69ae325f28be413206 Mon Sep 17 00:00:00 2001 From: Vadim ProductEngine Date: Wed, 7 Sep 2011 19:12:35 +0300 Subject: STORM-1577 Made parsing translation responses more robust. JsonCpp is prone to aborting the program on failed assertions, so be super-careful and verify the response format. --- indra/newview/lltranslate.cpp | 72 +++++++++++++++++++++++--- indra/newview/skins/default/xui/en/strings.xml | 3 ++ 2 files changed, 67 insertions(+), 8 deletions(-) (limited to 'indra/newview') diff --git a/indra/newview/lltranslate.cpp b/indra/newview/lltranslate.cpp index 6576cbbe64..895d8f78eb 100644 --- a/indra/newview/lltranslate.cpp +++ b/indra/newview/lltranslate.cpp @@ -31,6 +31,7 @@ #include #include "llbufferstream.h" +#include "lltrans.h" #include "llui.h" #include "llversioninfo.h" #include "llviewercontrol.h" @@ -94,21 +95,66 @@ public: return false; } + if (!root.isObject()) // empty response? should not happen + { + return false; + } + if (status != STATUS_OK) { - const Json::Value& error = root["error"]; - err_msg = error["message"].asString(); - status = error["code"].asInt(); + // Request failed. Extract error message from the response. + parseErrorResponse(root, status, err_msg); return false; } - const Json::Value& response_data = root["data"]["translations"][0U]; - translation = response_data["translatedText"].asString(); - detected_lang = response_data["detectedSourceLanguage"].asString(); - return true; + // Request succeeded, extract translation from the response. + return parseTranslation(root, translation, detected_lang); } private: + static void parseErrorResponse( + const Json::Value& root, + int& status, + std::string& err_msg) + { + const Json::Value& error = root.get("error", 0); + if (!error.isObject() || !error.isMember("message") || !error.isMember("code")) + { + return; + } + + err_msg = error["message"].asString(); + status = error["code"].asInt(); + } + + static bool parseTranslation( + const Json::Value& root, + std::string& translation, + std::string& detected_lang) + { + const Json::Value& data = root.get("data", 0); + if (!data.isObject() || !data.isMember("translations")) + { + return false; + } + + const Json::Value& translations = data["translations"]; + if (!translations.isArray() || translations.size() == 0) + { + return false; + } + + const Json::Value& first = translations[0U]; + if (!first.isObject() || !first.isMember("translatedText")) + { + return false; + } + + translation = first["translatedText"].asString(); + detected_lang = first.get("detectedSourceLanguage", "").asString(); + return true; + } + static std::string getAPIKey() { return gSavedSettings.getString("GoogleTranslateAPIKey"); @@ -143,7 +189,12 @@ public: { if (status != STATUS_OK) { - size_t begin = body.find("Message: "); + static const std::string MSG_BEGIN_MARKER = "Message: "; + size_t begin = body.find(MSG_BEGIN_MARKER); + if (begin != std::string::npos) + { + begin += MSG_BEGIN_MARKER.size(); + } size_t end = body.find("

", begin); err_msg = body.substr(begin, end-begin); LLStringUtil::replaceString(err_msg, " ", ""); // strip CR @@ -211,6 +262,11 @@ void LLTranslate::TranslationReceiver::completedRaw( } else { + if (err_msg.empty()) + { + err_msg = LLTrans::getString("TranslationResponseParseError"); + } + llwarns << "Translation request failed: " << err_msg << llendl; LL_DEBUGS("Translate") << "HTTP status: " << status << " " << reason << LL_ENDL; LL_DEBUGS("Translate") << "Error response body: " << body << LL_ENDL; diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index 2094275bed..146665b47d 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -3502,6 +3502,9 @@ Try enclosing path to the editor with double quotes. Error parsing the external editor command. External editor failed to run. + + Error parsing translation response. + Esc Space -- cgit v1.2.3 From ef01821337a0dc428fd090ae94c8cc9d9a13bdb5 Mon Sep 17 00:00:00 2001 From: Vadim ProductEngine Date: Wed, 7 Sep 2011 19:29:57 +0300 Subject: STORM-1577 WIP Removed old translation settings controls. They are now superceded with a separate floater. --- .../default/xui/en/panel_preferences_chat.xml | 119 +-------------------- 1 file changed, 2 insertions(+), 117 deletions(-) (limited to 'indra/newview') diff --git a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml index 3fbf484ab2..28db34f4d4 100644 --- a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml @@ -204,129 +204,14 @@ name="nearby_toasts_fadingtime" top_pad="3" width="325" /> - - - - - Use machine translation while chatting (powered by Google) - - - Translate chat into: - - - - - - - - - - - - - - - - - - - - - -- cgit v1.2.3 From 56b2e4ac7c7cc4f27f08b4024ecbeace4c3a3e51 Mon Sep 17 00:00:00 2001 From: Vadim ProductEngine Date: Tue, 25 Oct 2011 16:36:27 +0200 Subject: STORM-1577 WIP Indented floater contents. --- .../default/xui/en/floater_translation_settings.xml | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) (limited to 'indra/newview') diff --git a/indra/newview/skins/default/xui/en/floater_translation_settings.xml b/indra/newview/skins/default/xui/en/floater_translation_settings.xml index 1eb75e40f3..40fdaaed66 100644 --- a/indra/newview/skins/default/xui/en/floater_translation_settings.xml +++ b/indra/newview/skins/default/xui/en/floater_translation_settings.xml @@ -7,7 +7,7 @@ help_topic="environment_editor_floater" save_rect="true" title="CHAT TRANSLATION SETTINGS" - width="480"> + width="485"> Bing appID not verified. Please try again. Google API key not verified. Please try again. @@ -27,7 +27,7 @@ height="20" follows="left|top" layout="topleft" - left="10" + left="40" name="translate_language_label" top_pad="20" width="130"> @@ -118,7 +118,7 @@ follows="top|left|right" height="15" layout="topleft" - left="10" + left="40" name="tip" top_pad="20" width="330" @@ -153,10 +153,10 @@ follows="top|right" height="20" layout="topleft" - left="40" + left="70" name="bing_api_key_label" top_pad="-55" - width="100"> + width="85"> Bing [http://www.bing.com/developers/createapp.aspx AppID]: + width="210" /> \ No newline at end of file diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index c4031de0f8..24cec13c4c 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -2183,6 +2183,8 @@ Returns a string with the requested data about the region Stomach Left Pec Right Pec + Neck + Avatar Center Invalid Attachment Point @@ -3529,6 +3531,10 @@ Try enclosing path to the editor with double quotes. Error parsing the external editor command. External editor failed to run. + + Translation failed: [REASON] + Error parsing translation response. + Esc Space diff --git a/indra/newview/skins/default/xui/pl/floater_about.xml b/indra/newview/skins/default/xui/pl/floater_about.xml index 637325ddd0..409429ffaa 100644 --- a/indra/newview/skins/default/xui/pl/floater_about.xml +++ b/indra/newview/skins/default/xui/pl/floater_about.xml @@ -10,7 +10,7 @@ Położenie [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] w [REGION] zlokalizowanym w <nolink>[HOSTNAME]</nolink> ([HOSTIP]) [SERVER_VERSION] -[[SERVER_RELEASE_NOTES_URL] [ReleaseNotes]] +[SERVER_RELEASE_NOTES_URL] Procesor: [CPU] diff --git a/indra/newview/skins/default/xui/ru/strings.xml b/indra/newview/skins/default/xui/ru/strings.xml index d52cee6b0d..0134298166 100644 --- a/indra/newview/skins/default/xui/ru/strings.xml +++ b/indra/newview/skins/default/xui/ru/strings.xml @@ -4252,7 +4252,7 @@ support@secondlife.com. Женщина – ух ты! - /поклониться + /поклон /хлопнуть diff --git a/indra/newview/skins/default/xui/zh/floater_about.xml b/indra/newview/skins/default/xui/zh/floater_about.xml index 0ac85d399e..7e19c124a1 100644 --- a/indra/newview/skins/default/xui/zh/floater_about.xml +++ b/indra/newview/skins/default/xui/zh/floater_about.xml @@ -10,7 +10,7 @@ You are at [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] in [REGION] located at <nolink>[HOSTNAME]</nolink> ([HOSTIP]) [SERVER_VERSION] -[[SERVER_RELEASE_NOTES_URL] [ReleaseNotes]] +[SERVER_RELEASE_NOTES_URL] CPU:[CPU] -- cgit v1.2.3 From 403cdb863d8ebc4ba059ebb07e689e16f963b443 Mon Sep 17 00:00:00 2001 From: Jonathan Yap Date: Fri, 28 Oct 2011 22:04:20 -0400 Subject: =?UTF-8?q?STORM-1222=20System=20message=20when=20trying=20to=20te?= =?UTF-8?q?leport=20back=20to=20Welcome=20Island=20isn=C2=B4t=20localized?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- indra/newview/skins/default/xui/da/teleport_strings.xml | 4 ++++ indra/newview/skins/default/xui/de/teleport_strings.xml | 4 ++++ indra/newview/skins/default/xui/en/teleport_strings.xml | 4 ++++ indra/newview/skins/default/xui/es/teleport_strings.xml | 4 ++++ indra/newview/skins/default/xui/fr/teleport_strings.xml | 4 ++++ indra/newview/skins/default/xui/it/teleport_strings.xml | 4 ++++ indra/newview/skins/default/xui/ja/teleport_strings.xml | 4 ++++ indra/newview/skins/default/xui/pl/teleport_strings.xml | 4 ++++ indra/newview/skins/default/xui/pt/teleport_strings.xml | 4 ++++ indra/newview/skins/default/xui/ru/teleport_strings.xml | 4 ++++ indra/newview/skins/default/xui/tr/teleport_strings.xml | 4 ++++ indra/newview/skins/default/xui/zh/teleport_strings.xml | 4 ++++ 12 files changed, 48 insertions(+) (limited to 'indra/newview') diff --git a/indra/newview/skins/default/xui/da/teleport_strings.xml b/indra/newview/skins/default/xui/da/teleport_strings.xml index 071aab46f4..0d89fae986 100644 --- a/indra/newview/skins/default/xui/da/teleport_strings.xml +++ b/indra/newview/skins/default/xui/da/teleport_strings.xml @@ -19,6 +19,10 @@ Hvis du stadig ikke kan teleporte, prøv venligst at logge ud og ligge ind for a Beklager, systemet kunne ikke fuldføre teleport forbindelse. Prøv igen om lidt. + + + Du kan ikke teleportere tilbage til Welcome Island. +Gå til 'Welcome Island Puclic' for at prøve tutorial igen. Beklager, du har ikke adgang til denne teleport destination. diff --git a/indra/newview/skins/default/xui/de/teleport_strings.xml b/indra/newview/skins/default/xui/de/teleport_strings.xml index 69c952c532..bbfc830688 100644 --- a/indra/newview/skins/default/xui/de/teleport_strings.xml +++ b/indra/newview/skins/default/xui/de/teleport_strings.xml @@ -19,6 +19,10 @@ Wenn der Teleport dann immer noch nicht funktioniert, melden Sie sich bitte ab u Das System konnte keine Teleport-Verbindung herstellen. Versuchen Sie es später noch einmal. + + + Sie können nicht zurück nach Welcome Island teleportieren. +Gehen Sie zu „Welcome Island Public“ und wiederholen sie das Tutorial. Sie haben leider keinen Zugang zu diesem Teleport-Ziel. diff --git a/indra/newview/skins/default/xui/en/teleport_strings.xml b/indra/newview/skins/default/xui/en/teleport_strings.xml index bae821d3b5..dce6b8dd6d 100644 --- a/indra/newview/skins/default/xui/en/teleport_strings.xml +++ b/indra/newview/skins/default/xui/en/teleport_strings.xml @@ -19,6 +19,10 @@ If you still cannot teleport, please log out and log back in to resolve the prob Sorry, but system was unable to complete the teleport connection. Try again in a moment. + + +You cannot teleport back to Welcome Island. +Go to 'Welcome Island Public' to repeat the tutorial. Sorry, you do not have access to that teleport destination. diff --git a/indra/newview/skins/default/xui/es/teleport_strings.xml b/indra/newview/skins/default/xui/es/teleport_strings.xml index e0e0061729..e785a7ac40 100644 --- a/indra/newview/skins/default/xui/es/teleport_strings.xml +++ b/indra/newview/skins/default/xui/es/teleport_strings.xml @@ -18,6 +18,10 @@ Si sigues recibiendo este mensaje, por favor, acude al [SUPPORT_SITE]. Lo sentimos, pero el sistema no ha podido completar el teleporte. Vuelva a intentarlo en un momento. + + + No puede teleportarse de vuelta a la Welcome Island ('Isla de Ayuda'). +Vaya a la 'Welcome Island Public' ('Isla Pública de Ayuda') para repetir el tutorial. Lo sentimos, pero no tienes acceso al destino de este teleporte. diff --git a/indra/newview/skins/default/xui/fr/teleport_strings.xml b/indra/newview/skins/default/xui/fr/teleport_strings.xml index 7c291c0984..401b272c81 100644 --- a/indra/newview/skins/default/xui/fr/teleport_strings.xml +++ b/indra/newview/skins/default/xui/fr/teleport_strings.xml @@ -19,6 +19,10 @@ Si vous ne parvenez toujours pas à être téléporté, déconnectez-vous puis r Désolé, la connexion vers votre lieu de téléportation n'a pas abouti. Veuillez réessayer dans un moment. + + + Vous ne pouvez pas retourner sur Welcome Island. +Pour répéter le didacticiel, veuillez aller sur Welcome Island Public. Désolé, vous n'avez pas accès à cette destination. diff --git a/indra/newview/skins/default/xui/it/teleport_strings.xml b/indra/newview/skins/default/xui/it/teleport_strings.xml index 7a1046abd3..a0b324d8fb 100644 --- a/indra/newview/skins/default/xui/it/teleport_strings.xml +++ b/indra/newview/skins/default/xui/it/teleport_strings.xml @@ -18,6 +18,10 @@ Se si continua a visualizzare questo messaggio, consulta la pagina [SUPPORT_SITE Spiacenti, il sistema non riesce a completare il teletrasporto. Riprova tra un attimo. + + Non è possibile per te ritornare all'Welcome Island. +Vai alla 'Welcome Island Public' per ripetere il tutorial. + Spiacenti, ma non hai accesso nel luogo di destinazione richiesto. diff --git a/indra/newview/skins/default/xui/ja/teleport_strings.xml b/indra/newview/skins/default/xui/ja/teleport_strings.xml index 2f67d43707..04ea1c2438 100644 --- a/indra/newview/skins/default/xui/ja/teleport_strings.xml +++ b/indra/newview/skins/default/xui/ja/teleport_strings.xml @@ -19,6 +19,10 @@ 申し訳ございませんが、システムはテレポートの接続を完了できませんでした。 もう少し後でやり直してください。 + + + Welcome Islandには戻ることができません。 +「Welcome Island Public」に行き、 残念ながら、そのテレポート目的地へのアクセスがありません。 diff --git a/indra/newview/skins/default/xui/pl/teleport_strings.xml b/indra/newview/skins/default/xui/pl/teleport_strings.xml index 57fb55bf4c..0366c3fdbc 100644 --- a/indra/newview/skins/default/xui/pl/teleport_strings.xml +++ b/indra/newview/skins/default/xui/pl/teleport_strings.xml @@ -19,6 +19,10 @@ Jeśli nadal nie możesz się teleportować wyloguj się i ponownie zaloguj. Przepraszamy, ale nie udało się przeprowadzić teleportacji. Spróbuj jeszcze raz. + + Brak możliwości ponownej teleportacji do Welcome Island. +Odwiedź 'Welcome Island Public' by powtórzyć szkolenie. + Przepraszamy, ale nie masz dostępu do miejsca docelowego. diff --git a/indra/newview/skins/default/xui/pt/teleport_strings.xml b/indra/newview/skins/default/xui/pt/teleport_strings.xml index 11ea0f4195..f8ded1ce69 100644 --- a/indra/newview/skins/default/xui/pt/teleport_strings.xml +++ b/indra/newview/skins/default/xui/pt/teleport_strings.xml @@ -18,6 +18,10 @@ Se você continuar a receber esta mensagem, por favor consulte o [SUPPORT_SITE]. Desculpe, não foi possível para o sistema executar o teletransporte. Tente novamente dentro de alguns instantes. + + Você não pode se tele-transportar de volta à Ilha de Welcome. +Vá para a Ilha de Welcome Pública para repetir este tutorial. + Desculpe, você não tem acesso ao destino deste teletransporte. diff --git a/indra/newview/skins/default/xui/ru/teleport_strings.xml b/indra/newview/skins/default/xui/ru/teleport_strings.xml index 6a7a181046..296562e6f1 100644 --- a/indra/newview/skins/default/xui/ru/teleport_strings.xml +++ b/indra/newview/skins/default/xui/ru/teleport_strings.xml @@ -19,6 +19,10 @@ Системе не удалось выполнить подключение телепорта. Повторите попытку позже. + + + Вы не можете телепортироваться обратно на Остров Помощи. +Телепортируйтесь на Общественный Остров Помощи, чтобы повторить обучение У вас нет доступа к точке назначения этого телепорта. diff --git a/indra/newview/skins/default/xui/tr/teleport_strings.xml b/indra/newview/skins/default/xui/tr/teleport_strings.xml index c0c4be1393..c506bb8a58 100644 --- a/indra/newview/skins/default/xui/tr/teleport_strings.xml +++ b/indra/newview/skins/default/xui/tr/teleport_strings.xml @@ -19,6 +19,10 @@ Hala ışınlanamıyorsanız, sorunu çözmek için lütfen çıkış yapıp otu Üzgünüz fakat sistem ışınlama bağlantısını tamamlayamadı. Bir dakika sonra tekrar deneyin. + + +You cannot teleport back to Welcome Island. +Go to 'Welcome Island Public' to repeat the tutorial. Üzgünüz, bu ışınlanma hedef konumuna erişim hakkına sahip değilsiniz. diff --git a/indra/newview/skins/default/xui/zh/teleport_strings.xml b/indra/newview/skins/default/xui/zh/teleport_strings.xml index ffb4c903bb..bfdb107810 100644 --- a/indra/newview/skins/default/xui/zh/teleport_strings.xml +++ b/indra/newview/skins/default/xui/zh/teleport_strings.xml @@ -19,6 +19,10 @@ 抱歉,不過系統無法完成瞬間傳送的聯接。 請稍後再試。 + + + 您不能瞬间转移回“援助岛”。 +去“公共援助岛”重复您的教程。 抱歉,你並沒有權限進入要瞬間傳送的目的地。 -- cgit v1.2.3 From f76143a74ebbd9faf84fdcdee7fbf81a4090aafc Mon Sep 17 00:00:00 2001 From: eli Date: Mon, 31 Oct 2011 16:25:34 -0700 Subject: sync with viewer-development --- .../skins/default/xui/en/floater_chat_bar.xml | 97 ++++++++++++---------- .../skins/default/xui/en/floater_outgoing_call.xml | 1 + .../skins/default/xui/en/floater_toybox.xml | 2 +- .../default/xui/en/floater_voice_controls.xml | 2 +- .../newview/skins/default/xui/en/menu_toolbars.xml | 2 +- indra/newview/skins/default/xui/en/menu_viewer.xml | 11 ++- .../skins/default/xui/en/panel_status_bar.xml | 7 +- .../skins/default/xui/en/panel_topinfo_bar.xml | 2 +- indra/newview/skins/default/xui/en/strings.xml | 6 +- .../skins/default/xui/en/widgets/toolbar.xml | 4 + 10 files changed, 78 insertions(+), 56 deletions(-) (limited to 'indra/newview') diff --git a/indra/newview/skins/default/xui/en/floater_chat_bar.xml b/indra/newview/skins/default/xui/en/floater_chat_bar.xml index 989b4a0580..87606c1a2a 100644 --- a/indra/newview/skins/default/xui/en/floater_chat_bar.xml +++ b/indra/newview/skins/default/xui/en/floater_chat_bar.xml @@ -15,6 +15,7 @@ min_height="60" min_width="150" can_resize="true" + default_tab_group="1" name="chat_bar" width="380"> - - - - + + + +
diff --git a/indra/newview/skins/default/xui/en/floater_outgoing_call.xml b/indra/newview/skins/default/xui/en/floater_outgoing_call.xml index 9db6568ee3..ffbb6aa28b 100644 --- a/indra/newview/skins/default/xui/en/floater_outgoing_call.xml +++ b/indra/newview/skins/default/xui/en/floater_outgoing_call.xml @@ -8,6 +8,7 @@ layout="topleft" name="outgoing call" help_topic="outgoing_call" + save_dock_state="true" title="CALLING" width="410"> - + - + + + + name="balance_bg"> [mthnum,datetime,utc]/[day,datetime,utc]/[year,datetime,utc] - + Balance Credits Debits @@ -3711,6 +3711,10 @@ Try enclosing path to the editor with double quotes. Changing camera angle Volume controls for calls and people near you in world + currently in your bottom toolbar + currently in your left toolbar + currently in your right toolbar + Retain% Detail diff --git a/indra/newview/skins/default/xui/en/widgets/toolbar.xml b/indra/newview/skins/default/xui/en/widgets/toolbar.xml index 7e7a9c61cf..0aa478ace9 100644 --- a/indra/newview/skins/default/xui/en/widgets/toolbar.xml +++ b/indra/newview/skins/default/xui/en/widgets/toolbar.xml @@ -30,6 +30,8 @@ image_overlay_alignment="left" use_ellipses="true" auto_resize="true" + button_flash_count="99999" + button_flash_rate="1.0" flash_color="EmphasisColor"/> -- cgit v1.2.3 From b4edfb1c1dea7940d10c7fd9a699f49562f3096e Mon Sep 17 00:00:00 2001 From: Vadim ProductEngine Date: Tue, 1 Nov 2011 16:32:00 +0200 Subject: STORM-1676 FIXED Removed "Powered by Google" label from the nearby chat floater. --- indra/newview/skins/default/xui/da/floater_nearby_chat.xml | 2 +- indra/newview/skins/default/xui/da/panel_preferences_chat.xml | 2 +- indra/newview/skins/default/xui/de/floater_nearby_chat.xml | 2 +- indra/newview/skins/default/xui/de/panel_nearby_chat.xml | 2 +- indra/newview/skins/default/xui/de/panel_preferences_chat.xml | 2 +- indra/newview/skins/default/xui/en/panel_nearby_chat.xml | 2 +- indra/newview/skins/default/xui/es/floater_nearby_chat.xml | 2 +- indra/newview/skins/default/xui/es/panel_nearby_chat.xml | 2 +- indra/newview/skins/default/xui/es/panel_preferences_chat.xml | 2 +- indra/newview/skins/default/xui/fr/floater_nearby_chat.xml | 2 +- indra/newview/skins/default/xui/fr/panel_nearby_chat.xml | 2 +- indra/newview/skins/default/xui/fr/panel_preferences_chat.xml | 2 +- indra/newview/skins/default/xui/it/floater_nearby_chat.xml | 2 +- indra/newview/skins/default/xui/it/panel_nearby_chat.xml | 2 +- indra/newview/skins/default/xui/it/panel_preferences_chat.xml | 4 ++-- indra/newview/skins/default/xui/ja/floater_nearby_chat.xml | 2 +- indra/newview/skins/default/xui/ja/panel_nearby_chat.xml | 2 +- indra/newview/skins/default/xui/ja/panel_preferences_chat.xml | 4 ++-- indra/newview/skins/default/xui/pl/floater_nearby_chat.xml | 2 +- indra/newview/skins/default/xui/pl/panel_preferences_chat.xml | 2 +- indra/newview/skins/default/xui/pt/floater_nearby_chat.xml | 2 +- indra/newview/skins/default/xui/pt/panel_nearby_chat.xml | 2 +- indra/newview/skins/default/xui/pt/panel_preferences_chat.xml | 2 +- indra/newview/skins/default/xui/ru/floater_nearby_chat.xml | 2 +- indra/newview/skins/default/xui/ru/panel_nearby_chat.xml | 2 +- indra/newview/skins/default/xui/ru/panel_preferences_chat.xml | 2 +- indra/newview/skins/default/xui/tr/floater_nearby_chat.xml | 2 +- indra/newview/skins/default/xui/tr/panel_nearby_chat.xml | 2 +- indra/newview/skins/default/xui/tr/panel_preferences_chat.xml | 2 +- indra/newview/skins/default/xui/zh/floater_nearby_chat.xml | 2 +- indra/newview/skins/default/xui/zh/panel_preferences_chat.xml | 2 +- 31 files changed, 33 insertions(+), 33 deletions(-) (limited to 'indra/newview') diff --git a/indra/newview/skins/default/xui/da/floater_nearby_chat.xml b/indra/newview/skins/default/xui/da/floater_nearby_chat.xml index bd17224259..76bc40edac 100644 --- a/indra/newview/skins/default/xui/da/floater_nearby_chat.xml +++ b/indra/newview/skins/default/xui/da/floater_nearby_chat.xml @@ -1,4 +1,4 @@ - + diff --git a/indra/newview/skins/default/xui/da/panel_preferences_chat.xml b/indra/newview/skins/default/xui/da/panel_preferences_chat.xml index f0f6242fff..890a3038ef 100644 --- a/indra/newview/skins/default/xui/da/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/da/panel_preferences_chat.xml @@ -31,7 +31,7 @@ - Benyt maskinel oversættelse ved chat (håndteret af Google) + Benyt maskinel oversættelse ved chat Oversæt chat til : diff --git a/indra/newview/skins/default/xui/de/floater_nearby_chat.xml b/indra/newview/skins/default/xui/de/floater_nearby_chat.xml index bbb4114200..2aabbb18f2 100644 --- a/indra/newview/skins/default/xui/de/floater_nearby_chat.xml +++ b/indra/newview/skins/default/xui/de/floater_nearby_chat.xml @@ -1,4 +1,4 @@ - + diff --git a/indra/newview/skins/default/xui/de/panel_nearby_chat.xml b/indra/newview/skins/default/xui/de/panel_nearby_chat.xml index c3ce42efa1..2068c39024 100644 --- a/indra/newview/skins/default/xui/de/panel_nearby_chat.xml +++ b/indra/newview/skins/default/xui/de/panel_nearby_chat.xml @@ -1,4 +1,4 @@ - + diff --git a/indra/newview/skins/default/xui/de/panel_preferences_chat.xml b/indra/newview/skins/default/xui/de/panel_preferences_chat.xml index 104f89b80c..04f6c27330 100644 --- a/indra/newview/skins/default/xui/de/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/de/panel_preferences_chat.xml @@ -31,7 +31,7 @@ - Beim Chatten Maschinenübersetzung verwenden (von Google bereitgestellt) + Beim Chatten Maschinenübersetzung verwenden Chat übersetzen in: diff --git a/indra/newview/skins/default/xui/en/panel_nearby_chat.xml b/indra/newview/skins/default/xui/en/panel_nearby_chat.xml index f766236b2e..d492f9bd68 100644 --- a/indra/newview/skins/default/xui/en/panel_nearby_chat.xml +++ b/indra/newview/skins/default/xui/en/panel_nearby_chat.xml @@ -11,7 +11,7 @@ control_name="TranslateChat" enabled="true" height="16" - label="Translate chat (powered by Google)" + label="Translate chat" layout="topleft" left="5" name="translate_chat_checkbox" diff --git a/indra/newview/skins/default/xui/es/floater_nearby_chat.xml b/indra/newview/skins/default/xui/es/floater_nearby_chat.xml index 1fee9ab056..b3b8cdcfff 100644 --- a/indra/newview/skins/default/xui/es/floater_nearby_chat.xml +++ b/indra/newview/skins/default/xui/es/floater_nearby_chat.xml @@ -1,4 +1,4 @@ - + diff --git a/indra/newview/skins/default/xui/es/panel_nearby_chat.xml b/indra/newview/skins/default/xui/es/panel_nearby_chat.xml index 95ce14c9a7..5a852a6711 100644 --- a/indra/newview/skins/default/xui/es/panel_nearby_chat.xml +++ b/indra/newview/skins/default/xui/es/panel_nearby_chat.xml @@ -1,4 +1,4 @@ - + diff --git a/indra/newview/skins/default/xui/es/panel_preferences_chat.xml b/indra/newview/skins/default/xui/es/panel_preferences_chat.xml index 4625075aa5..e822585566 100644 --- a/indra/newview/skins/default/xui/es/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/es/panel_preferences_chat.xml @@ -31,7 +31,7 @@ - Usar en el chat el traductor automático de Google + Usar en el chat el traductor automático Traducir el chat al: diff --git a/indra/newview/skins/default/xui/fr/floater_nearby_chat.xml b/indra/newview/skins/default/xui/fr/floater_nearby_chat.xml index 9b1b21c434..8bbd34baae 100644 --- a/indra/newview/skins/default/xui/fr/floater_nearby_chat.xml +++ b/indra/newview/skins/default/xui/fr/floater_nearby_chat.xml @@ -1,4 +1,4 @@ - + diff --git a/indra/newview/skins/default/xui/fr/panel_nearby_chat.xml b/indra/newview/skins/default/xui/fr/panel_nearby_chat.xml index 98eddf196b..31cb3308e3 100644 --- a/indra/newview/skins/default/xui/fr/panel_nearby_chat.xml +++ b/indra/newview/skins/default/xui/fr/panel_nearby_chat.xml @@ -1,4 +1,4 @@ - + diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml b/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml index 646f53704c..fa026d8106 100644 --- a/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml @@ -31,7 +31,7 @@ - Utiliser la traduction automatique lors des chats (fournie par Google) + Utiliser la traduction automatique lors des chats Traduire le chat en : diff --git a/indra/newview/skins/default/xui/it/floater_nearby_chat.xml b/indra/newview/skins/default/xui/it/floater_nearby_chat.xml index 4c41df8a62..9e81899880 100644 --- a/indra/newview/skins/default/xui/it/floater_nearby_chat.xml +++ b/indra/newview/skins/default/xui/it/floater_nearby_chat.xml @@ -1,4 +1,4 @@ - + diff --git a/indra/newview/skins/default/xui/it/panel_nearby_chat.xml b/indra/newview/skins/default/xui/it/panel_nearby_chat.xml index 7afc3cd7e7..1b529e2737 100644 --- a/indra/newview/skins/default/xui/it/panel_nearby_chat.xml +++ b/indra/newview/skins/default/xui/it/panel_nearby_chat.xml @@ -1,4 +1,4 @@ - + diff --git a/indra/newview/skins/default/xui/it/panel_preferences_chat.xml b/indra/newview/skins/default/xui/it/panel_preferences_chat.xml index 72e687b6d1..1a0a1d8434 100644 --- a/indra/newview/skins/default/xui/it/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/it/panel_preferences_chat.xml @@ -29,9 +29,9 @@ - + - Usa la traduzione meccanica durante le chat (tecnologia Google) + Usa la traduzione meccanica durante le chat Traduci chat in: diff --git a/indra/newview/skins/default/xui/ja/floater_nearby_chat.xml b/indra/newview/skins/default/xui/ja/floater_nearby_chat.xml index a29c6a0630..bcddcc6907 100644 --- a/indra/newview/skins/default/xui/ja/floater_nearby_chat.xml +++ b/indra/newview/skins/default/xui/ja/floater_nearby_chat.xml @@ -1,4 +1,4 @@ - + diff --git a/indra/newview/skins/default/xui/ja/panel_nearby_chat.xml b/indra/newview/skins/default/xui/ja/panel_nearby_chat.xml index 4334659557..aca055bb43 100644 --- a/indra/newview/skins/default/xui/ja/panel_nearby_chat.xml +++ b/indra/newview/skins/default/xui/ja/panel_nearby_chat.xml @@ -1,4 +1,4 @@ - + diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml b/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml index c8584ccaae..1502442a06 100644 --- a/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml @@ -29,9 +29,9 @@ - + - チャット中に内容を機械翻訳する(Google翻訳) + チャット中に内容を機械翻訳する 翻訳する言語: diff --git a/indra/newview/skins/default/xui/pl/floater_nearby_chat.xml b/indra/newview/skins/default/xui/pl/floater_nearby_chat.xml index 7dc3e1f22e..214d465f1c 100644 --- a/indra/newview/skins/default/xui/pl/floater_nearby_chat.xml +++ b/indra/newview/skins/default/xui/pl/floater_nearby_chat.xml @@ -1,4 +1,4 @@ - + diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_chat.xml b/indra/newview/skins/default/xui/pl/panel_preferences_chat.xml index be730eb73f..7fd1029e6a 100644 --- a/indra/newview/skins/default/xui/pl/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/pl/panel_preferences_chat.xml @@ -31,7 +31,7 @@ - Użyj translatora podczas rozmowy (wspierany przez Google) + Użyj translatora podczas rozmowy Przetłumacz czat na: diff --git a/indra/newview/skins/default/xui/pt/floater_nearby_chat.xml b/indra/newview/skins/default/xui/pt/floater_nearby_chat.xml index 60edfa505f..653861f7d8 100644 --- a/indra/newview/skins/default/xui/pt/floater_nearby_chat.xml +++ b/indra/newview/skins/default/xui/pt/floater_nearby_chat.xml @@ -1,4 +1,4 @@ - + diff --git a/indra/newview/skins/default/xui/pt/panel_nearby_chat.xml b/indra/newview/skins/default/xui/pt/panel_nearby_chat.xml index 9d44c7f62d..15470dc94a 100644 --- a/indra/newview/skins/default/xui/pt/panel_nearby_chat.xml +++ b/indra/newview/skins/default/xui/pt/panel_nearby_chat.xml @@ -1,4 +1,4 @@ - + diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml b/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml index e5aa42aae0..f98659aa73 100644 --- a/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml @@ -31,7 +31,7 @@ - Traduzir bate-papo automaticamente (via Google) + Traduzir bate-papo automaticamente Traduzir bate-papo para: diff --git a/indra/newview/skins/default/xui/ru/floater_nearby_chat.xml b/indra/newview/skins/default/xui/ru/floater_nearby_chat.xml index fd3c9f3512..184c753e40 100644 --- a/indra/newview/skins/default/xui/ru/floater_nearby_chat.xml +++ b/indra/newview/skins/default/xui/ru/floater_nearby_chat.xml @@ -1,4 +1,4 @@ - + diff --git a/indra/newview/skins/default/xui/ru/panel_nearby_chat.xml b/indra/newview/skins/default/xui/ru/panel_nearby_chat.xml index a371040b74..1d26eecf87 100644 --- a/indra/newview/skins/default/xui/ru/panel_nearby_chat.xml +++ b/indra/newview/skins/default/xui/ru/panel_nearby_chat.xml @@ -1,4 +1,4 @@ - + diff --git a/indra/newview/skins/default/xui/ru/panel_preferences_chat.xml b/indra/newview/skins/default/xui/ru/panel_preferences_chat.xml index 5e4130667f..f1095065a5 100644 --- a/indra/newview/skins/default/xui/ru/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/ru/panel_preferences_chat.xml @@ -30,7 +30,7 @@ - Использовать машинный перевод во время общения (используется Google) + Использовать машинный перевод во время общения Переводить чат на: diff --git a/indra/newview/skins/default/xui/tr/floater_nearby_chat.xml b/indra/newview/skins/default/xui/tr/floater_nearby_chat.xml index 6570c4379c..6b12ad0ef5 100644 --- a/indra/newview/skins/default/xui/tr/floater_nearby_chat.xml +++ b/indra/newview/skins/default/xui/tr/floater_nearby_chat.xml @@ -1,4 +1,4 @@ - + diff --git a/indra/newview/skins/default/xui/tr/panel_nearby_chat.xml b/indra/newview/skins/default/xui/tr/panel_nearby_chat.xml index 73da726cb2..c405105e00 100644 --- a/indra/newview/skins/default/xui/tr/panel_nearby_chat.xml +++ b/indra/newview/skins/default/xui/tr/panel_nearby_chat.xml @@ -1,4 +1,4 @@ - + diff --git a/indra/newview/skins/default/xui/tr/panel_preferences_chat.xml b/indra/newview/skins/default/xui/tr/panel_preferences_chat.xml index aeef737420..9c9e960715 100644 --- a/indra/newview/skins/default/xui/tr/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/tr/panel_preferences_chat.xml @@ -30,7 +30,7 @@ - Sohbet ederken makine çevirisi kullanılsın (Google tarafından desteklenir) + Sohbet ederken makine çevirisi kullanılsın Sohbeti şu dile çevir: diff --git a/indra/newview/skins/default/xui/zh/floater_nearby_chat.xml b/indra/newview/skins/default/xui/zh/floater_nearby_chat.xml index f0c34acb06..38a5dab523 100644 --- a/indra/newview/skins/default/xui/zh/floater_nearby_chat.xml +++ b/indra/newview/skins/default/xui/zh/floater_nearby_chat.xml @@ -1,4 +1,4 @@ - + diff --git a/indra/newview/skins/default/xui/zh/panel_preferences_chat.xml b/indra/newview/skins/default/xui/zh/panel_preferences_chat.xml index fc326c2ce2..738c77fd08 100644 --- a/indra/newview/skins/default/xui/zh/panel_preferences_chat.xml +++ b/indra/newview/skins/default/xui/zh/panel_preferences_chat.xml @@ -30,7 +30,7 @@ - 聊天時使用機器自動進行翻譯(由 Google 所提供) + 聊天時使用機器自動進行翻譯 聊天翻譯為: -- cgit v1.2.3 From 5b1f9f3c5e9176a971c942da7688d8b194b12ed3 Mon Sep 17 00:00:00 2001 From: Paul ProductEngine Date: Tue, 1 Nov 2011 18:11:21 +0200 Subject: EXP-1489 FIXED (Cannot build notifications not being shown when chat floater closed with chat log toggled open) - Need to check visibility of the floater itself, not only chat panel in it. So I added this check. --- indra/newview/llnotificationtiphandler.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'indra/newview') diff --git a/indra/newview/llnotificationtiphandler.cpp b/indra/newview/llnotificationtiphandler.cpp index 2a08a29842..aa009a76fa 100644 --- a/indra/newview/llnotificationtiphandler.cpp +++ b/indra/newview/llnotificationtiphandler.cpp @@ -29,6 +29,7 @@ #include "llfloaterreg.h" #include "llnearbychat.h" +#include "llnearbychatbar.h" #include "llnotificationhandler.h" #include "llnotifications.h" #include "lltoastnotifypanel.h" @@ -93,7 +94,8 @@ bool LLTipHandler::processNotification(const LLSD& notify) // don't show toast if Nearby Chat is opened LLNearbyChat* nearby_chat = LLNearbyChat::getInstance(); - if (nearby_chat->getVisible()) + LLNearbyChatBar* nearby_chat_bar = LLNearbyChatBar::getInstance(); + if (nearby_chat_bar->getVisible() && nearby_chat->getVisible()) { return false; } -- cgit v1.2.3 From ba2fa73aaab5415c38fd9f489c590d8cba05e24f Mon Sep 17 00:00:00 2001 From: Paul ProductEngine Date: Tue, 1 Nov 2011 18:54:21 +0200 Subject: EXP-1472 FIXED (More spillover list scrolls up after selecting any content menu item) - Saving last scroll position of menu --- indra/newview/llfavoritesbar.cpp | 2 ++ 1 file changed, 2 insertions(+) (limited to 'indra/newview') diff --git a/indra/newview/llfavoritesbar.cpp b/indra/newview/llfavoritesbar.cpp index 6c9058caf1..1f269fb666 100644 --- a/indra/newview/llfavoritesbar.cpp +++ b/indra/newview/llfavoritesbar.cpp @@ -1197,7 +1197,9 @@ void LLFavoritesBarCtrl::doToSelected(const LLSD& userdata) LLToggleableMenu* menu = (LLToggleableMenu*) mOverflowMenuHandle.get(); if (mRestoreOverflowMenu && menu && !menu->getVisible()) { + menu->resetScrollPositionOnShow(false); showDropDownMenu(); + menu->resetScrollPositionOnShow(true); } } -- cgit v1.2.3 From 3ae3d04e7e73f414a2e17c1be7cf7cca4f894c72 Mon Sep 17 00:00:00 2001 From: Paul ProductEngine Date: Tue, 1 Nov 2011 19:23:32 +0200 Subject: EXP-1452 FIXED (minimum height of NEARBY CHAT window can be circumvented by minimizing it.) Reason: visibility state of chat was always set to true when floater unminimized Solution: save visibility state of the chat to restore it after floater unminimized --- indra/newview/llnearbychatbar.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) (limited to 'indra/newview') diff --git a/indra/newview/llnearbychatbar.cpp b/indra/newview/llnearbychatbar.cpp index 4674c85324..6e22c7fea0 100644 --- a/indra/newview/llnearbychatbar.cpp +++ b/indra/newview/llnearbychatbar.cpp @@ -403,8 +403,16 @@ void LLNearbyChatBar::setMinimized(BOOL b) { if (b != LLFloater::isMinimized()) { + LLView* nearby_chat = getChildView("nearby_chat"); + + static bool is_visible = nearby_chat->getVisible(); + if (b) + { + is_visible = nearby_chat->getVisible(); + } + + nearby_chat->setVisible(b ? false : is_visible); LLFloater::setMinimized(b); - getChildView("nearby_chat")->setVisible(!b); } } -- cgit v1.2.3 From b6b463dd3927148d1bb20f0bb9aa624ddaed15c4 Mon Sep 17 00:00:00 2001 From: Richard Linden Date: Tue, 1 Nov 2011 15:30:54 -0700 Subject: EXP-1452 FIX minimum height of NEARBY CHAT window can be circumvented by minimizing it. --- indra/newview/llnearbychat.cpp | 25 +++++++++++++------------ indra/newview/llnearbychat.h | 6 +++--- indra/newview/llnearbychatbar.cpp | 9 ++++++--- 3 files changed, 22 insertions(+), 18 deletions(-) (limited to 'indra/newview') diff --git a/indra/newview/llnearbychat.cpp b/indra/newview/llnearbychat.cpp index 3418462192..a7303ad035 100644 --- a/indra/newview/llnearbychat.cpp +++ b/indra/newview/llnearbychat.cpp @@ -60,13 +60,9 @@ static const S32 RESIZE_BAR_THICKNESS = 3; static LLRegisterPanelClassWrapper t_panel_nearby_chat("panel_nearby_chat"); -LLNearbyChat::LLNearbyChat() - : LLPanel() - ,mChatHistory(NULL) -{ -} - -LLNearbyChat::~LLNearbyChat() +LLNearbyChat::LLNearbyChat(const LLNearbyChat::Params& p) +: LLPanel(p), + mChatHistory(NULL) { } @@ -178,15 +174,20 @@ bool LLNearbyChat::onNearbyChatCheckContextMenuItem(const LLSD& userdata) return false; } +void LLNearbyChat::removeScreenChat() +{ + LLNotificationsUI::LLScreenChannelBase* chat_channel = LLNotificationsUI::LLChannelManager::getInstance()->findChannelByID(LLUUID(gSavedSettings.getString("NearByChatChannelUUID"))); + if(chat_channel) + { + chat_channel->removeToastsFromChannel(); + } +} + void LLNearbyChat::setVisible(BOOL visible) { if(visible) { - LLNotificationsUI::LLScreenChannelBase* chat_channel = LLNotificationsUI::LLChannelManager::getInstance()->findChannelByID(LLUUID(gSavedSettings.getString("NearByChatChannelUUID"))); - if(chat_channel) - { - chat_channel->removeToastsFromChannel(); - } + removeScreenChat(); } LLPanel::setVisible(visible); diff --git a/indra/newview/llnearbychat.h b/indra/newview/llnearbychat.h index 5ef584c8ff..7c5975cbc5 100644 --- a/indra/newview/llnearbychat.h +++ b/indra/newview/llnearbychat.h @@ -37,8 +37,7 @@ class LLChatHistory; class LLNearbyChat: public LLPanel { public: - LLNearbyChat(); - ~LLNearbyChat(); + LLNearbyChat(const Params& p = LLPanel::getDefaultParams()); BOOL postBuild (); @@ -63,13 +62,14 @@ public: void loadHistory(); static LLNearbyChat* getInstance(); + void removeScreenChat(); private: void getAllowedRect (LLRect& rect); void onNearbySpeakers (); - + private: LLHandle mPopupMenuHandle; diff --git a/indra/newview/llnearbychatbar.cpp b/indra/newview/llnearbychatbar.cpp index 4674c85324..c612b14256 100644 --- a/indra/newview/llnearbychatbar.cpp +++ b/indra/newview/llnearbychatbar.cpp @@ -47,6 +47,7 @@ #include "llviewerwindow.h" #include "llrootview.h" #include "llviewerchat.h" +#include "llnearbychat.h" #include "llresizehandle.h" @@ -401,11 +402,13 @@ void LLNearbyChatBar::onToggleNearbyChatPanel() void LLNearbyChatBar::setMinimized(BOOL b) { - if (b != LLFloater::isMinimized()) + LLNearbyChat* nearby_chat = getChild("nearby_chat"); + // when unminimizing with nearby chat visible, go ahead and kill off screen chats + if (!b && nearby_chat->getVisible()) { - LLFloater::setMinimized(b); - getChildView("nearby_chat")->setVisible(!b); + nearby_chat->removeScreenChat(); } + LLFloater::setMinimized(b); } void LLNearbyChatBar::onChatBoxCommit() -- cgit v1.2.3 From e3287fbe4cbb3ababe9b1d1be691ff4b90b45dd8 Mon Sep 17 00:00:00 2001 From: Merov Linden Date: Tue, 1 Nov 2011 15:51:33 -0700 Subject: EXP-1500 : Hide the toolbars whenever the login box is shown. Also clean up some old FUI debug that is not necessary anymore --- indra/newview/app_settings/settings.xml | 11 ----------- indra/newview/llstartup.cpp | 8 +++++++- indra/newview/llviewerwindow.cpp | 18 +++++++----------- 3 files changed, 14 insertions(+), 23 deletions(-) (limited to 'indra/newview') diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 3771222455..8f660008e5 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -2630,17 +2630,6 @@ Value -1
- DebugToolbarFUI - - Comment - Turn on the FUI Toolbars - Persist - 1 - Type - Boolean - Value - 1 - DebugViews Comment diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index e62227fa3c..9d8d1be0f5 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -190,6 +190,7 @@ #include "lllogin.h" #include "llevents.h" #include "llstartuplistener.h" +#include "lltoolbarview.h" #if LL_WINDOWS #include "lldxhardware.h" @@ -2091,7 +2092,12 @@ void login_show() #else BOOL bUseDebugLogin = TRUE; #endif - + // Hide the toolbars: may happen to come back here if login fails after login agent but before login in region + if (gToolBarView) + { + gToolBarView->setVisible(FALSE); + } + LLPanelLogin::show( gViewerWindow->getWindowRectScaled(), bUseDebugLogin || gSavedSettings.getBOOL("SecondLifeEnterprise"), login_callback, NULL ); diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 6fcbc401af..e23ba0faf7 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -1789,17 +1789,13 @@ void LLViewerWindow::initBase() mLoginPanelHolder = main_view->getChild("login_panel_holder")->getHandle(); // Create the toolbar view - // *TODO: Eventually, suppress the existence of this debug setting and turn toolbar FUI on permanently - if (gSavedSettings.getBOOL("DebugToolbarFUI")) - { - // Get a pointer to the toolbar view holder - LLPanel* panel_holder = main_view->getChild("toolbar_view_holder"); - // Load the toolbar view from file - gToolBarView = LLUICtrlFactory::getInstance()->createFromFile("panel_toolbar_view.xml", panel_holder, LLDefaultChildRegistry::instance()); - gToolBarView->setShape(panel_holder->getLocalRect()); - // Hide the toolbars for the moment: we'll make them visible after logging in world (see LLViewerWindow::initWorldUI()) - gToolBarView->setVisible(FALSE); - } + // Get a pointer to the toolbar view holder + LLPanel* panel_holder = main_view->getChild("toolbar_view_holder"); + // Load the toolbar view from file + gToolBarView = LLUICtrlFactory::getInstance()->createFromFile("panel_toolbar_view.xml", panel_holder, LLDefaultChildRegistry::instance()); + gToolBarView->setShape(panel_holder->getLocalRect()); + // Hide the toolbars for the moment: we'll make them visible after logging in world (see LLViewerWindow::initWorldUI()) + gToolBarView->setVisible(FALSE); // Constrain floaters to inside the menu and status bar regions. gFloaterView = main_view->getChild("Floater View"); -- cgit v1.2.3 From 3ad6b8829bd45960d7f8d460a74d13d7d1562ef4 Mon Sep 17 00:00:00 2001 From: Leslie Linden Date: Tue, 1 Nov 2011 16:24:13 -0700 Subject: EXP-1480 FIX --- indra/newview/app_settings/settings_per_account.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indra/newview') diff --git a/indra/newview/app_settings/settings_per_account.xml b/indra/newview/app_settings/settings_per_account.xml index 6ed4480cb1..8cdd8ed838 100644 --- a/indra/newview/app_settings/settings_per_account.xml +++ b/indra/newview/app_settings/settings_per_account.xml @@ -36,7 +36,7 @@ DisplayDestinationsOnInitialRun Comment - Display the destinations guide when a user first launches FUI. + Display the destinations guide when a user first launches Second Life. Persist 1 Type -- cgit v1.2.3 From 65e144d9fec4bb441050e73136ed95b48e6e363c Mon Sep 17 00:00:00 2001 From: Vadim ProductEngine Date: Wed, 2 Nov 2011 19:05:13 +0200 Subject: STORM-1580 WIP Initial commit for PO review. --- indra/newview/CMakeLists.txt | 15 +- indra/newview/app_settings/settings.xml | 44 +- indra/newview/llfloaterpostcard.cpp | 384 --------- indra/newview/llfloaterpostcard.h | 79 -- indra/newview/llfloatersnapshot.cpp | 870 ++++++++++++++------- indra/newview/llfloatersnapshot.h | 29 +- indra/newview/llpanelpostprogress.cpp | 59 ++ indra/newview/llpanelpostresult.cpp | 90 +++ indra/newview/llpanelsnapshot.cpp | 109 +++ indra/newview/llpanelsnapshot.h | 58 ++ indra/newview/llpanelsnapshotinventory.cpp | 152 ++++ indra/newview/llpanelsnapshotlocal.cpp | 209 +++++ indra/newview/llpanelsnapshotoptions.cpp | 94 +++ indra/newview/llpanelsnapshotpostcard.cpp | 336 ++++++++ indra/newview/llpanelsnapshotprofile.cpp | 162 ++++ indra/newview/llpostcard.cpp | 160 ++++ indra/newview/llpostcard.h | 48 ++ indra/newview/llsidetraypanelcontainer.cpp | 7 + indra/newview/llsidetraypanelcontainer.h | 5 + indra/newview/llviewerfloaterreg.cpp | 2 - indra/newview/llviewermedia.cpp | 7 + indra/newview/llviewermenufile.cpp | 18 +- indra/newview/llviewermessage.cpp | 4 +- indra/newview/llviewerwindow.cpp | 6 +- indra/newview/llviewerwindow.h | 2 +- indra/newview/llwebprofile.cpp | 297 +++++++ indra/newview/llwebprofile.h | 69 ++ .../skins/default/textures/snapshot_download.png | Bin 0 -> 1621 bytes .../skins/default/textures/snapshot_email.png | Bin 0 -> 1391 bytes .../skins/default/textures/snapshot_inventory.png | Bin 0 -> 1371 bytes .../skins/default/textures/snapshot_profile.png | Bin 0 -> 1479 bytes indra/newview/skins/default/textures/textures.xml | 4 + .../skins/default/xui/en/floater_postcard.xml | 149 ---- .../skins/default/xui/en/floater_snapshot.xml | 602 ++++++-------- .../skins/default/xui/en/panel_post_progress.xml | 55 ++ .../skins/default/xui/en/panel_post_result.xml | 78 ++ .../default/xui/en/panel_postcard_message.xml | 137 ++++ .../default/xui/en/panel_postcard_settings.xml | 102 +++ .../default/xui/en/panel_snapshot_inventory.xml | 146 ++++ .../skins/default/xui/en/panel_snapshot_local.xml | 191 +++++ .../default/xui/en/panel_snapshot_options.xml | 80 ++ .../default/xui/en/panel_snapshot_postcard.xml | 107 +++ .../default/xui/en/panel_snapshot_profile.xml | 165 ++++ indra/newview/skins/default/xui/en/strings.xml | 8 + 44 files changed, 3811 insertions(+), 1328 deletions(-) delete mode 100644 indra/newview/llfloaterpostcard.cpp delete mode 100644 indra/newview/llfloaterpostcard.h create mode 100644 indra/newview/llpanelpostprogress.cpp create mode 100644 indra/newview/llpanelpostresult.cpp create mode 100644 indra/newview/llpanelsnapshot.cpp create mode 100644 indra/newview/llpanelsnapshot.h create mode 100644 indra/newview/llpanelsnapshotinventory.cpp create mode 100644 indra/newview/llpanelsnapshotlocal.cpp create mode 100644 indra/newview/llpanelsnapshotoptions.cpp create mode 100644 indra/newview/llpanelsnapshotpostcard.cpp create mode 100644 indra/newview/llpanelsnapshotprofile.cpp create mode 100644 indra/newview/llpostcard.cpp create mode 100644 indra/newview/llpostcard.h create mode 100644 indra/newview/llwebprofile.cpp create mode 100644 indra/newview/llwebprofile.h create mode 100644 indra/newview/skins/default/textures/snapshot_download.png create mode 100644 indra/newview/skins/default/textures/snapshot_email.png create mode 100644 indra/newview/skins/default/textures/snapshot_inventory.png create mode 100644 indra/newview/skins/default/textures/snapshot_profile.png delete mode 100644 indra/newview/skins/default/xui/en/floater_postcard.xml create mode 100644 indra/newview/skins/default/xui/en/panel_post_progress.xml create mode 100644 indra/newview/skins/default/xui/en/panel_post_result.xml create mode 100644 indra/newview/skins/default/xui/en/panel_postcard_message.xml create mode 100644 indra/newview/skins/default/xui/en/panel_postcard_settings.xml create mode 100644 indra/newview/skins/default/xui/en/panel_snapshot_inventory.xml create mode 100644 indra/newview/skins/default/xui/en/panel_snapshot_local.xml create mode 100644 indra/newview/skins/default/xui/en/panel_snapshot_options.xml create mode 100644 indra/newview/skins/default/xui/en/panel_snapshot_postcard.xml create mode 100644 indra/newview/skins/default/xui/en/panel_snapshot_profile.xml (limited to 'indra/newview') diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index bef775cdb8..63b05f5a1d 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -219,7 +219,6 @@ set(viewer_SOURCE_FILES llfloateropenobject.cpp llfloaterpay.cpp llfloaterperms.cpp - llfloaterpostcard.cpp llfloaterpostprocess.cpp llfloaterpreference.cpp llfloaterproperties.cpp @@ -393,9 +392,17 @@ set(viewer_SOURCE_FILES llpanelplaceprofile.cpp llpanelplaces.cpp llpanelplacestab.cpp + llpanelpostprogress.cpp + llpanelpostresult.cpp llpanelprimmediacontrols.cpp llpanelprofile.cpp llpanelprofileview.cpp + llpanelsnapshot.cpp + llpanelsnapshotinventory.cpp + llpanelsnapshotlocal.cpp + llpanelsnapshotoptions.cpp + llpanelsnapshotpostcard.cpp + llpanelsnapshotprofile.cpp llpanelteleporthistory.cpp llpaneltiptoast.cpp llpanelvoiceeffect.cpp @@ -414,6 +421,7 @@ set(viewer_SOURCE_FILES llpopupview.cpp llpolymesh.cpp llpolymorph.cpp + llpostcard.cpp llpreview.cpp llpreviewanim.cpp llpreviewgesture.cpp @@ -603,6 +611,7 @@ set(viewer_SOURCE_FILES llwearablelist.cpp llwearabletype.cpp llweb.cpp + llwebprofile.cpp llwebsharing.cpp llwind.cpp llwindowlistener.cpp @@ -786,7 +795,6 @@ set(viewer_HEADER_FILES llfloateropenobject.h llfloaterpay.h llfloaterperms.h - llfloaterpostcard.h llfloaterpostprocess.h llfloaterpreference.h llfloaterproperties.h @@ -957,6 +965,7 @@ set(viewer_HEADER_FILES llpanelprimmediacontrols.h llpanelprofile.h llpanelprofileview.h + llpanelsnapshot.h llpanelteleporthistory.h llpaneltiptoast.h llpanelvoicedevicesettings.h @@ -975,6 +984,7 @@ set(viewer_HEADER_FILES llpolymesh.h llpolymorph.h llpopupview.h + llpostcard.h llpreview.h llpreviewanim.h llpreviewgesture.h @@ -1164,6 +1174,7 @@ set(viewer_HEADER_FILES llwearablelist.h llwearabletype.h llweb.h + llwebprofile.h llwebsharing.h llwind.h llwindowlistener.h diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 5c0ea2f774..9812b2868f 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -4667,6 +4667,17 @@ 0.0.0 + LastSnapshotToProfileHeight + + Comment + The height of the last profile snapshot, in px + Persist + 1 + Type + S32 + Value + 768 + LastSnapshotToEmailHeight Comment @@ -4678,6 +4689,17 @@ Value 768 + LastSnapshotToProfileWidth + + Comment + The width of the last profile snapshot, in px + Persist + 1 + Type + S32 + Value + 1024 + LastSnapshotToEmailWidth Comment @@ -4733,17 +4755,6 @@ Value 512 - LastSnapshotType - - Comment - Select this as next type of snapshot to take (0 = postcard, 1 = texture, 2 = local image) - Persist - 1 - Type - S32 - Value - 0 - LeftClickShowMenu Comment @@ -10608,6 +10619,17 @@ Value 0 + SnapshotProfileLastResolution + + Comment + Take next profile snapshot at this resolution + Persist + 1 + Type + S32 + Value + 0 + SnapshotPostcardLastResolution Comment diff --git a/indra/newview/llfloaterpostcard.cpp b/indra/newview/llfloaterpostcard.cpp deleted file mode 100644 index 3bcbb987f7..0000000000 --- a/indra/newview/llfloaterpostcard.cpp +++ /dev/null @@ -1,384 +0,0 @@ -/** - * @file llfloaterpostcard.cpp - * @brief Postcard send floater, allows setting name, e-mail address, etc. - * - * $LicenseInfo:firstyear=2004&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, 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 "llfloaterpostcard.h" - -#include "llfontgl.h" -#include "llsys.h" -#include "llgl.h" -#include "v3dmath.h" -#include "lldir.h" - -#include "llagent.h" -#include "llui.h" -#include "lllineeditor.h" -#include "llbutton.h" -#include "lltexteditor.h" -#include "llfloaterreg.h" -#include "llnotificationsutil.h" -#include "llviewercontrol.h" -#include "llviewernetwork.h" -#include "lluictrlfactory.h" -#include "lluploaddialog.h" -#include "llviewerstats.h" -#include "llviewerwindow.h" -#include "llstatusbar.h" -#include "llviewerregion.h" -#include "lleconomy.h" -#include "message.h" - -#include "llimagejpeg.h" -#include "llimagej2c.h" -#include "llvfile.h" -#include "llvfs.h" -#include "llviewertexture.h" -#include "llassetuploadresponders.h" -#include "llagentui.h" - -#include //boost.regex lib - -///---------------------------------------------------------------------------- -/// Local function declarations, constants, enums, and typedefs -///---------------------------------------------------------------------------- - -///---------------------------------------------------------------------------- -/// Class LLFloaterPostcard -///---------------------------------------------------------------------------- - -LLFloaterPostcard::LLFloaterPostcard(const LLSD& key) -: LLFloater(key), - mJPEGImage(NULL), - mViewerImage(NULL), - mHasFirstMsgFocus(false) -{ -} - -// Destroys the object -LLFloaterPostcard::~LLFloaterPostcard() -{ - mJPEGImage = NULL; // deletes image -} - -BOOL LLFloaterPostcard::postBuild() -{ - // pick up the user's up-to-date email address - gAgent.sendAgentUserInfoRequest(); - - childSetAction("cancel_btn", onClickCancel, this); - childSetAction("send_btn", onClickSend, this); - - getChildView("from_form")->setEnabled(FALSE); - - std::string name_string; - LLAgentUI::buildFullname(name_string); - getChild("name_form")->setValue(LLSD(name_string)); - - // For the first time a user focusess to .the msg box, all text will be selected. - getChild("msg_form")->setFocusChangedCallback(boost::bind(onMsgFormFocusRecieved, _1, this)); - - getChild("to_form")->setFocus(TRUE); - - return TRUE; -} - -// static -LLFloaterPostcard* LLFloaterPostcard::showFromSnapshot(LLImageJPEG *jpeg, LLViewerTexture *img, const LLVector2 &image_scale, const LLVector3d& pos_taken_global) -{ - // Take the images from the caller - // It's now our job to clean them up - LLFloaterPostcard* instance = LLFloaterReg::showTypedInstance("postcard", LLSD(img->getID())); - - if (instance) // may be 0 if we're in mouselook mode - { - instance->mJPEGImage = jpeg; - instance->mViewerImage = img; - instance->mImageScale = image_scale; - instance->mPosTakenGlobal = pos_taken_global; - } - - return instance; -} - -void LLFloaterPostcard::draw() -{ - LLGLSUIDefault gls_ui; - LLFloater::draw(); - - if(!isMinimized() && mViewerImage.notNull() && mJPEGImage.notNull()) - { - // Force the texture to be 100% opaque when the floater is focused. - F32 alpha = getTransparencyType() == TT_ACTIVE ? 1.0f : getCurrentTransparency(); - LLRect rect(getRect()); - - // first set the max extents of our preview - rect.translate(-rect.mLeft, -rect.mBottom); - rect.mLeft += 320; - rect.mRight -= 10; - rect.mTop -= 27; - rect.mBottom = rect.mTop - 130; - - // then fix the aspect ratio - F32 ratio = (F32)mJPEGImage->getWidth() / (F32)mJPEGImage->getHeight(); - if ((F32)rect.getWidth() / (F32)rect.getHeight() >= ratio) - { - rect.mRight = LLRect::tCoordType((F32)rect.mLeft + ((F32)rect.getHeight() * ratio)); - } - else - { - rect.mBottom = LLRect::tCoordType((F32)rect.mTop - ((F32)rect.getWidth() / ratio)); - } - { - gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); - gl_rect_2d(rect, LLColor4(0.f, 0.f, 0.f, 1.f) % alpha); - rect.stretch(-1); - } - { - - glMatrixMode(GL_TEXTURE); - glPushMatrix(); - { - glScalef(mImageScale.mV[VX], mImageScale.mV[VY], 1.f); - glMatrixMode(GL_MODELVIEW); - gl_draw_scaled_image(rect.mLeft, - rect.mBottom, - rect.getWidth(), - rect.getHeight(), - mViewerImage.get(), - LLColor4::white % alpha); - } - glMatrixMode(GL_TEXTURE); - glPopMatrix(); - glMatrixMode(GL_MODELVIEW); - } - } -} - -// static -void LLFloaterPostcard::onClickCancel(void* data) -{ - if (data) - { - LLFloaterPostcard *self = (LLFloaterPostcard *)data; - - self->closeFloater(false); - } -} - -class LLSendPostcardResponder : public LLAssetUploadResponder -{ -public: - LLSendPostcardResponder(const LLSD &post_data, - const LLUUID& vfile_id, - LLAssetType::EType asset_type): - LLAssetUploadResponder(post_data, vfile_id, asset_type) - { - } - // *TODO define custom uploadFailed here so it's not such a generic message - void uploadComplete(const LLSD& content) - { - // we don't care about what the server returns from this post, just clean up the UI - LLUploadDialog::modalUploadFinished(); - } -}; - -// static -void LLFloaterPostcard::onClickSend(void* data) -{ - if (data) - { - LLFloaterPostcard *self = (LLFloaterPostcard *)data; - - std::string from(self->getChild("from_form")->getValue().asString()); - std::string to(self->getChild("to_form")->getValue().asString()); - - boost::regex emailFormat("[A-Za-z0-9.%+-_]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}(,[ \t]*[A-Za-z0-9.%+-_]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,})*"); - - if (to.empty() || !boost::regex_match(to, emailFormat)) - { - LLNotificationsUtil::add("PromptRecipientEmail"); - return; - } - - if (from.empty() || !boost::regex_match(from, emailFormat)) - { - LLNotificationsUtil::add("PromptSelfEmail"); - return; - } - - std::string subject(self->getChild("subject_form")->getValue().asString()); - if(subject.empty() || !self->mHasFirstMsgFocus) - { - LLNotificationsUtil::add("PromptMissingSubjMsg", LLSD(), LLSD(), boost::bind(&LLFloaterPostcard::missingSubjMsgAlertCallback, self, _1, _2)); - return; - } - - if (self->mJPEGImage.notNull()) - { - self->sendPostcard(); - } - else - { - LLNotificationsUtil::add("ErrorProcessingSnapshot"); - } - } -} - -// static -void LLFloaterPostcard::uploadCallback(const LLUUID& asset_id, void *user_data, S32 result, LLExtStat ext_status) // StoreAssetData callback (fixed) -{ - LLFloaterPostcard *self = (LLFloaterPostcard *)user_data; - - LLUploadDialog::modalUploadFinished(); - - if (result) - { - LLSD args; - args["REASON"] = std::string(LLAssetStorage::getErrorString(result)); - LLNotificationsUtil::add("ErrorUploadingPostcard", args); - } - else - { - // only create the postcard once the upload succeeds - - // request the postcard - LLMessageSystem* msg = gMessageSystem; - msg->newMessage("SendPostcard"); - msg->nextBlock("AgentData"); - msg->addUUID("AgentID", gAgent.getID()); - msg->addUUID("SessionID", gAgent.getSessionID()); - msg->addUUID("AssetID", self->mAssetID); - msg->addVector3d("PosGlobal", self->mPosTakenGlobal); - msg->addString("To", self->getChild("to_form")->getValue().asString()); - msg->addString("From", self->getChild("from_form")->getValue().asString()); - msg->addString("Name", self->getChild("name_form")->getValue().asString()); - msg->addString("Subject", self->getChild("subject_form")->getValue().asString()); - msg->addString("Msg", self->getChild("msg_form")->getValue().asString()); - msg->addBOOL("AllowPublish", FALSE); - msg->addBOOL("MaturePublish", FALSE); - gAgent.sendReliableMessage(); - } - - self->closeFloater(); -} - -// static -void LLFloaterPostcard::updateUserInfo(const std::string& email) -{ - LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("postcard"); - for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin(); - iter != inst_list.end(); ++iter) - { - LLFloater* instance = *iter; - const std::string& text = instance->getChild("from_form")->getValue().asString(); - if (text.empty()) - { - // there's no text in this field yet, pre-populate - instance->getChild("from_form")->setValue(LLSD(email)); - } - } -} - -void LLFloaterPostcard::onMsgFormFocusRecieved(LLFocusableElement* receiver, void* data) -{ - LLFloaterPostcard* self = (LLFloaterPostcard *)data; - if(self) - { - LLTextEditor* msgForm = self->getChild("msg_form"); - if(msgForm && msgForm == receiver && msgForm->hasFocus() && !(self->mHasFirstMsgFocus)) - { - self->mHasFirstMsgFocus = true; - msgForm->setText(LLStringUtil::null); - } - } -} - -bool LLFloaterPostcard::missingSubjMsgAlertCallback(const LLSD& notification, const LLSD& response) -{ - S32 option = LLNotificationsUtil::getSelectedOption(notification, response); - if(0 == option) - { - // User clicked OK - if((getChild("subject_form")->getValue().asString()).empty()) - { - // Stuff the subject back into the form. - getChild("subject_form")->setValue(getString("default_subject")); - } - - if(!mHasFirstMsgFocus) - { - // The user never switched focus to the messagee window. - // Using the default string. - getChild("msg_form")->setValue(getString("default_message")); - } - - sendPostcard(); - } - return false; -} - -void LLFloaterPostcard::sendPostcard() -{ - mTransactionID.generate(); - mAssetID = mTransactionID.makeAssetID(gAgent.getSecureSessionID()); - LLVFile::writeFile(mJPEGImage->getData(), mJPEGImage->getDataSize(), gVFS, mAssetID, LLAssetType::AT_IMAGE_JPEG); - - // upload the image - std::string url = gAgent.getRegion()->getCapability("SendPostcard"); - if(!url.empty()) - { - llinfos << "Send Postcard via capability" << llendl; - LLSD body = LLSD::emptyMap(); - // the capability already encodes: agent ID, region ID - body["pos-global"] = mPosTakenGlobal.getValue(); - body["to"] = getChild("to_form")->getValue().asString(); - body["from"] = getChild("from_form")->getValue().asString(); - body["name"] = getChild("name_form")->getValue().asString(); - body["subject"] = getChild("subject_form")->getValue().asString(); - body["msg"] = getChild("msg_form")->getValue().asString(); - LLHTTPClient::post(url, body, new LLSendPostcardResponder(body, mAssetID, LLAssetType::AT_IMAGE_JPEG)); - } - else - { - gAssetStorage->storeAssetData(mTransactionID, LLAssetType::AT_IMAGE_JPEG, &uploadCallback, (void *)this, FALSE); - } - - // give user feedback of the event - gViewerWindow->playSnapshotAnimAndSound(); - LLUploadDialog::modalUploadDialog(getString("upload_message")); - - // don't destroy the window until the upload is done - // this way we keep the information in the form - setVisible(FALSE); - - // also remove any dependency on another floater - // so that we can be sure to outlive it while we - // need to. - LLFloater* dependee = getDependee(); - if (dependee) - dependee->removeDependentFloater(this); -} diff --git a/indra/newview/llfloaterpostcard.h b/indra/newview/llfloaterpostcard.h deleted file mode 100644 index 472592154f..0000000000 --- a/indra/newview/llfloaterpostcard.h +++ /dev/null @@ -1,79 +0,0 @@ -/** - * @file llfloaterpostcard.h - * @brief Postcard send floater, allows setting name, e-mail address, etc. - * - * $LicenseInfo:firstyear=2004&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, 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_LLFLOATERPOSTCARD_H -#define LL_LLFLOATERPOSTCARD_H - -#include "llfloater.h" -#include "llcheckboxctrl.h" - -#include "llpointer.h" - -class LLTextEditor; -class LLLineEditor; -class LLButton; -class LLViewerTexture; -class LLImageJPEG; - -class LLFloaterPostcard -: public LLFloater -{ -public: - LLFloaterPostcard(const LLSD& key); - virtual ~LLFloaterPostcard(); - - virtual BOOL postBuild(); - virtual void draw(); - - static LLFloaterPostcard* showFromSnapshot(LLImageJPEG *jpeg, LLViewerTexture *img, const LLVector2& img_scale, const LLVector3d& pos_taken_global); - - static void onClickCancel(void* data); - static void onClickSend(void* data); - - static void uploadCallback(const LLUUID& asset_id, - void *user_data, - S32 result, LLExtStat ext_status); - - static void updateUserInfo(const std::string& email); - - static void onMsgFormFocusRecieved(LLFocusableElement* receiver, void* data); - bool missingSubjMsgAlertCallback(const LLSD& notification, const LLSD& response); - - void sendPostcard(); - -private: - - LLPointer mJPEGImage; - LLPointer mViewerImage; - LLTransactionID mTransactionID; - LLAssetID mAssetID; - LLVector2 mImageScale; - LLVector3d mPosTakenGlobal; - bool mHasFirstMsgFocus; -}; - - -#endif // LL_LLFLOATERPOSTCARD_H diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp index 8105844b0d..c8c66931a1 100644 --- a/indra/newview/llfloatersnapshot.cpp +++ b/indra/newview/llfloatersnapshot.cpp @@ -42,6 +42,8 @@ #include "llcombobox.h" #include "lleconomy.h" #include "lllandmarkactions.h" +#include "llpanelsnapshot.h" +#include "llsidetraypanelcontainer.h" #include "llsliderctrl.h" #include "llspinctrl.h" #include "llviewercontrol.h" @@ -50,9 +52,7 @@ #include "llviewercamera.h" #include "llviewerwindow.h" #include "llviewermenufile.h" // upload_new_resource() -#include "llfloaterpostcard.h" #include "llcheckboxctrl.h" -#include "llradiogroup.h" #include "llslurl.h" #include "lltoolfocus.h" #include "lltoolmgr.h" @@ -76,18 +76,17 @@ #include "llimagej2c.h" #include "lllocalcliprect.h" #include "llnotificationsutil.h" +#include "llpostcard.h" #include "llresmgr.h" // LLLocale #include "llvfile.h" #include "llvfs.h" +#include "llwebprofile.h" #include "llwindow.h" ///---------------------------------------------------------------------------- /// Local function declarations, constants, enums, and typedefs ///---------------------------------------------------------------------------- -S32 LLFloaterSnapshot::sUIWinHeightLong = 530 ; -S32 LLFloaterSnapshot::sUIWinHeightShort = LLFloaterSnapshot::sUIWinHeightLong - 240 ; -S32 LLFloaterSnapshot::sUIWinWidth = 215 ; - +LLRect LLFloaterSnapshot::sThumbnailPlaceholderRect; LLSnapshotFloaterView* gSnapshotFloaterView = NULL; const F32 AUTO_SNAPSHOT_TIME_DELAY = 1.f; @@ -101,6 +100,9 @@ S32 BORDER_WIDTH = 6; const S32 MAX_POSTCARD_DATASIZE = 1024 * 1024; // one megabyte const S32 MAX_TEXTURE_SIZE = 512 ; //max upload texture size 512 * 512 +static std::string lastSnapshotWidthName(S32 shot_type); +static std::string lastSnapshotHeightName(S32 shot_type); + static LLDefaultChildRegistry::Register r("snapshot_floater_view"); ///---------------------------------------------------------------------------- @@ -108,6 +110,7 @@ static LLDefaultChildRegistry::Register r("snapshot_float ///---------------------------------------------------------------------------- class LLSnapshotLivePreview : public LLView { + LOG_CLASS(LLSnapshotLivePreview); public: enum ESnapshotType { @@ -154,6 +157,7 @@ public: F32 getAspect() ; LLRect getImageRect(); BOOL isImageScaled(); + const LLVector3d& getPosTakenGlobal() const { return mPosTakenGlobal; } void setSnapshotType(ESnapshotType type) { mSnapshotType = type; } void setSnapshotFormat(LLFloaterSnapshot::ESnapshotFormat type) { mSnapshotFormat = type; } @@ -161,10 +165,12 @@ public: void setSnapshotBufferType(LLViewerWindow::ESnapshotType type) { mSnapshotBufferType = type; } void updateSnapshot(BOOL new_snapshot, BOOL new_thumbnail = FALSE, F32 delay = 0.f); void saveWeb(); - LLFloaterPostcard* savePostcard(); void saveTexture(); BOOL saveLocal(); + LLPointer getFormattedImage() const { return mFormattedImage; } + LLPointer getEncodedImage() const { return mPreviewImageEncoded; } + BOOL setThumbnailImageSize() ; void generateThumbnailImage(BOOL force_update = FALSE) ; void resetThumbnailImage() { mThumbnailImage = NULL ; } @@ -327,7 +333,8 @@ BOOL LLSnapshotLivePreview::isImageScaled() } void LLSnapshotLivePreview::updateSnapshot(BOOL new_snapshot, BOOL new_thumbnail, F32 delay) -{ +{ + lldebugs << "updateSnapshot: mSnapshotUpToDate = " << mSnapshotUpToDate << llendl; if (mSnapshotUpToDate) { S32 old_image_index = mCurImageIndex; @@ -367,6 +374,7 @@ void LLSnapshotLivePreview::updateSnapshot(BOOL new_snapshot, BOOL new_thumbnail { mSnapshotDelayTimer.start(); mSnapshotDelayTimer.setTimerExpirySec(delay); + LLFloaterSnapshot::preUpdate(); } if(new_thumbnail) { @@ -629,8 +637,10 @@ BOOL LLSnapshotLivePreview::setThumbnailImageSize() F32 window_aspect_ratio = ((F32)window_width) / ((F32)window_height); // UI size for thumbnail - S32 max_width = LLFloaterSnapshot::getUIWinWidth() - 20; - S32 max_height = 90; + // *FIXME: the rect does not change, so maybe there's no need to recalculate max w/h. + const LLRect& thumbnail_rect = LLFloaterSnapshot::getThumbnailPlaceholderRect(); + S32 max_width = thumbnail_rect.getWidth(); + S32 max_height = thumbnail_rect.getHeight(); if (window_aspect_ratio > (F32)max_width / max_height) { @@ -746,7 +756,15 @@ void LLSnapshotLivePreview::generateThumbnailImage(BOOL force_update) //static BOOL LLSnapshotLivePreview::onIdle( void* snapshot_preview ) { - LLSnapshotLivePreview* previewp = (LLSnapshotLivePreview*)snapshot_preview; + LLSnapshotLivePreview* previewp = (LLSnapshotLivePreview*)snapshot_preview; + +#if 1 // XXX tmp + if (previewp->mWidth[previewp->mCurImageIndex] == 0 || previewp->mHeight[previewp->mCurImageIndex] == 0) + { + llwarns << "Incorrect dimensions: " << previewp->mWidth[previewp->mCurImageIndex] << "x" << previewp->mHeight[previewp->mCurImageIndex] << llendl; + return FALSE; + } +#endif LLVector3 new_camera_pos = LLViewerCamera::getInstance()->getOrigin(); LLQuaternion new_camera_rot = LLViewerCamera::getInstance()->getQuaternion(); @@ -774,6 +792,7 @@ BOOL LLSnapshotLivePreview::onIdle( void* snapshot_preview ) // time to produce a snapshot + lldebugs << "producing snapshot" << llendl; if (!previewp->mPreviewImage) { previewp->mPreviewImage = new LLImageRaw; @@ -809,6 +828,7 @@ BOOL LLSnapshotLivePreview::onIdle( void* snapshot_preview ) if(previewp->getSnapshotType() == SNAPSHOT_TEXTURE) { + lldebugs << "Encoding new image of format J2C" << llendl; LLPointer formatted = new LLImageJ2C; LLPointer scaled = new LLImageRaw( previewp->mPreviewImage->getData(), @@ -841,6 +861,7 @@ BOOL LLSnapshotLivePreview::onIdle( void* snapshot_preview ) { format = previewp->getSnapshotFormat(); } + lldebugs << "Encoding new image of format " << format << llendl; switch(format) { @@ -920,12 +941,15 @@ BOOL LLSnapshotLivePreview::onIdle( void* snapshot_preview ) { previewp->generateThumbnailImage() ; } + lldebugs << "done creating snapshot" << llendl; + LLFloaterSnapshot::postUpdate(); return TRUE; } void LLSnapshotLivePreview::setSize(S32 w, S32 h) { + lldebugs << "setSize(" << w << ", " << h << ")" << llendl; mWidth[mCurImageIndex] = w; mHeight[mCurImageIndex] = h; } @@ -936,40 +960,9 @@ void LLSnapshotLivePreview::getSize(S32& w, S32& h) const h = mHeight[mCurImageIndex]; } -LLFloaterPostcard* LLSnapshotLivePreview::savePostcard() -{ - if(mViewerImage[mCurImageIndex].isNull()) - { - //this should never happen!! - llwarns << "The snapshot image has not been generated!" << llendl ; - return NULL ; - } - - // calculate and pass in image scale in case image data only use portion - // of viewerimage buffer - LLVector2 image_scale(1.f, 1.f); - if (!isImageScaled()) - { - image_scale.setVec(llmin(1.f, (F32)mWidth[mCurImageIndex] / (F32)getCurrentImage()->getWidth()), llmin(1.f, (F32)mHeight[mCurImageIndex] / (F32)getCurrentImage()->getHeight())); - } - - LLImageJPEG* jpg = dynamic_cast(mFormattedImage.get()); - if(!jpg) - { - llwarns << "Formatted image not a JPEG" << llendl; - return NULL; - } - LLFloaterPostcard* floater = LLFloaterPostcard::showFromSnapshot(jpg, mViewerImage[mCurImageIndex], image_scale, mPosTakenGlobal); - // relinquish lifetime of jpeg image to postcard floater - mFormattedImage = NULL; - mDataSize = 0; - updateSnapshot(FALSE, FALSE); - - return floater; -} - void LLSnapshotLivePreview::saveTexture() { + lldebugs << "saving texture: " << mPreviewImage->getWidth() << "x" << mPreviewImage->getHeight() << llendl; // gen a new uuid for this asset LLTransactionID tid; tid.generate(); @@ -982,6 +975,7 @@ void LLSnapshotLivePreview::saveTexture() mPreviewImage->getComponents()); scaled->biasedScaleToPowerOfTwo(512); + lldebugs << "scaled texture to " << scaled->getWidth() << "x" << scaled->getHeight() << llendl; if (formatted->encode(scaled, 0.0f)) { @@ -1020,9 +1014,10 @@ void LLSnapshotLivePreview::saveTexture() BOOL LLSnapshotLivePreview::saveLocal() { - BOOL success = gViewerWindow->saveImageNumbered(mFormattedImage); + BOOL success = gViewerWindow->saveImageNumbered(mFormattedImage, true); // Relinquish image memory. Save button will be disabled as a side-effect. + lldebugs << "resetting formatted image after saving to disk" << llendl; mFormattedImage = NULL; mDataSize = 0; updateSnapshot(FALSE, FALSE); @@ -1080,29 +1075,40 @@ public: mAvatarPauseHandles.clear(); } - static void onClickDiscard(void* data); - static void onClickKeep(void* data); - static void onCommitSave(LLUICtrl* ctrl, void* data); static void onClickNewSnapshot(void* data); static void onClickAutoSnap(LLUICtrl *ctrl, void* data); //static void onClickAdvanceSnap(LLUICtrl *ctrl, void* data); - static void onClickLess(void* data) ; static void onClickMore(void* data) ; static void onClickUICheck(LLUICtrl *ctrl, void* data); static void onClickHUDCheck(LLUICtrl *ctrl, void* data); static void onClickKeepOpenCheck(LLUICtrl *ctrl, void* data); +#if 0 static void onClickKeepAspectCheck(LLUICtrl *ctrl, void* data); - static void onCommitQuality(LLUICtrl* ctrl, void* data); +#endif + static void applyKeepAspectCheck(LLFloaterSnapshot* view, BOOL checked); static void onCommitResolution(LLUICtrl* ctrl, void* data) { updateResolution(ctrl, data); } static void updateResolution(LLUICtrl* ctrl, void* data, BOOL do_update = TRUE); static void onCommitFreezeFrame(LLUICtrl* ctrl, void* data); static void onCommitLayerTypes(LLUICtrl* ctrl, void*data); + static void onImageQualityChange(LLFloaterSnapshot* view, S32 quality_val); + static void onImageFormatChange(LLFloaterSnapshot* view); +#if 0 static void onCommitSnapshotType(LLUICtrl* ctrl, void* data); - static void onCommitSnapshotFormat(LLUICtrl* ctrl, void* data); static void onCommitCustomResolution(LLUICtrl *ctrl, void* data); +#endif + static void applyCustomResolution(LLFloaterSnapshot* view, S32 w, S32 h); + static void onSnapshotUploadFinished(LLSideTrayPanelContainer* panel_container, bool status); + static void onSendingPostcardFinished(LLSideTrayPanelContainer* panel_container, bool status); static void resetSnapshotSizeOnUI(LLFloaterSnapshot *view, S32 width, S32 height) ; static BOOL checkImageSize(LLSnapshotLivePreview* previewp, S32& width, S32& height, BOOL isWidthChanged, S32 max_value); + static LLPanelSnapshot* getActivePanel(LLFloaterSnapshot* floater, bool ok_if_not_found = true); + static LLSnapshotLivePreview::ESnapshotType getActiveSnapshotType(LLFloaterSnapshot* floater); + static LLFloaterSnapshot::ESnapshotFormat getImageFormat(LLFloaterSnapshot* floater); + static LLSpinCtrl* getWidthSpinner(LLFloaterSnapshot* floater); + static LLSpinCtrl* getHeightSpinner(LLFloaterSnapshot* floater); + static void enableAspectRatioCheckbox(LLFloaterSnapshot* floater, BOOL enable); + static LLSnapshotLivePreview* getPreviewView(LLFloaterSnapshot *floater); static void setResolution(LLFloaterSnapshot* floater, const std::string& comboname); static void updateControls(LLFloaterSnapshot* floater); @@ -1110,9 +1116,8 @@ public: static void updateResolutionTextEntry(LLFloaterSnapshot* floater); private: - static LLSnapshotLivePreview::ESnapshotType getTypeIndex(LLFloaterSnapshot* floater); + static LLSnapshotLivePreview::ESnapshotType getTypeIndex(const std::string& id); static LLSD getTypeName(LLSnapshotLivePreview::ESnapshotType index); - static ESnapshotFormat getFormatIndex(LLFloaterSnapshot* floater); static LLViewerWindow::ESnapshotType getLayerType(LLFloaterSnapshot* floater); static void comboSetCustom(LLFloaterSnapshot *floater, const std::string& comboname); static void checkAutoSnapshot(LLSnapshotLivePreview* floater, BOOL update_thumbnail = FALSE); @@ -1126,6 +1131,77 @@ public: bool mAspectRatioCheckOff ; }; +// static +LLPanelSnapshot* LLFloaterSnapshot::Impl::getActivePanel(LLFloaterSnapshot* floater, bool ok_if_not_found) +{ + LLSideTrayPanelContainer* panel_container = floater->getChild("panel_container"); + LLPanelSnapshot* active_panel = dynamic_cast(panel_container->getCurrentPanel()); + if (!ok_if_not_found) + { + llassert_always(active_panel != NULL); + } + return active_panel; +} + +// static +LLSnapshotLivePreview::ESnapshotType LLFloaterSnapshot::Impl::getActiveSnapshotType(LLFloaterSnapshot* floater) +{ + LLSnapshotLivePreview::ESnapshotType type = LLSnapshotLivePreview::SNAPSHOT_WEB; + std::string name; + LLPanelSnapshot* spanel = getActivePanel(floater); + + if (spanel) + { + name = spanel->getName(); + } + + if (name == "panel_snapshot_postcard") + { + type = LLSnapshotLivePreview::SNAPSHOT_POSTCARD; + } + else if (name == "panel_snapshot_inventory") + { + type = LLSnapshotLivePreview::SNAPSHOT_TEXTURE; + } + else if (name == "panel_snapshot_local") + { + type = LLSnapshotLivePreview::SNAPSHOT_LOCAL; + } + + return type; +} + +// static +LLFloaterSnapshot::ESnapshotFormat LLFloaterSnapshot::Impl::getImageFormat(LLFloaterSnapshot* floater) +{ + LLPanelSnapshot* active_panel = getActivePanel(floater); + return active_panel ? active_panel->getImageFormat() : LLFloaterSnapshot::SNAPSHOT_FORMAT_JPEG; +} + +// static +LLSpinCtrl* LLFloaterSnapshot::Impl::getWidthSpinner(LLFloaterSnapshot* floater) +{ + LLPanelSnapshot* active_panel = getActivePanel(floater); + return active_panel ? active_panel->getWidthSpinner() : floater->getChild("snapshot_width"); +} + +// static +LLSpinCtrl* LLFloaterSnapshot::Impl::getHeightSpinner(LLFloaterSnapshot* floater) +{ + LLPanelSnapshot* active_panel = getActivePanel(floater); + return active_panel ? active_panel->getHeightSpinner() : floater->getChild("snapshot_height"); +} + +// static +void LLFloaterSnapshot::Impl::enableAspectRatioCheckbox(LLFloaterSnapshot* floater, BOOL enable) +{ + LLPanelSnapshot* active_panel = getActivePanel(floater); + if (active_panel) + { + active_panel->enableAspectRatioCheckbox(enable); + } +} + // static LLSnapshotLivePreview* LLFloaterSnapshot::Impl::getPreviewView(LLFloaterSnapshot *floater) { @@ -1134,12 +1210,10 @@ LLSnapshotLivePreview* LLFloaterSnapshot::Impl::getPreviewView(LLFloaterSnapshot } // static -LLSnapshotLivePreview::ESnapshotType LLFloaterSnapshot::Impl::getTypeIndex(LLFloaterSnapshot* floater) +LLSnapshotLivePreview::ESnapshotType LLFloaterSnapshot::Impl::getTypeIndex(const std::string& id) { LLSnapshotLivePreview::ESnapshotType index = LLSnapshotLivePreview::SNAPSHOT_POSTCARD; - LLSD value = floater->getChild("snapshot_type_radio")->getValue(); - const std::string id = value.asString(); if (id == "postcard") { index = LLSnapshotLivePreview::SNAPSHOT_POSTCARD; @@ -1183,26 +1257,6 @@ LLSD LLFloaterSnapshot::Impl::getTypeName(LLSnapshotLivePreview::ESnapshotType i return LLSD(id); } -// static -LLFloaterSnapshot::ESnapshotFormat LLFloaterSnapshot::Impl::getFormatIndex(LLFloaterSnapshot* floater) -{ - ESnapshotFormat index = SNAPSHOT_FORMAT_PNG; - if(floater->hasChild("local_format_combo")) - { - LLComboBox* local_format_combo = floater->findChild("local_format_combo"); - const std::string id = local_format_combo->getSelectedItemLabel(); - if (id == "PNG") - index = SNAPSHOT_FORMAT_PNG; - else if (id == "JPEG") - index = SNAPSHOT_FORMAT_JPEG; - else if (id == "BMP") - index = SNAPSHOT_FORMAT_BMP; - } - return index; -} - - - // static LLViewerWindow::ESnapshotType LLFloaterSnapshot::Impl::getLayerType(LLFloaterSnapshot* floater) { @@ -1229,12 +1283,27 @@ void LLFloaterSnapshot::Impl::updateLayout(LLFloaterSnapshot* floaterp) { LLSnapshotLivePreview* previewp = getPreviewView(floaterp); - S32 delta_height = gSavedSettings.getBOOL("AdvanceSnapshot") ? 0 : floaterp->getUIWinHeightShort() - floaterp->getUIWinHeightLong() ; + bool advanced = gSavedSettings.getBOOL("AdvanceSnapshot"); + + // Show/hide advanced options. + LLPanel* advanced_options_panel = floaterp->getChild("advanced_options_panel"); + floaterp->getChild("advanced_options_btn")->setToggleState(advanced); + if (advanced != advanced_options_panel->getVisible()) + { + S32 panel_width = advanced_options_panel->getRect().getWidth(); + floaterp->getChild("advanced_options_panel")->setVisible(advanced); + S32 floater_width = floaterp->getRect().getWidth(); + floater_width += (advanced ? panel_width : -panel_width); + floaterp->reshape(floater_width, floaterp->getRect().getHeight()); + } - if(!gSavedSettings.getBOOL("AdvanceSnapshot")) //set to original window resolution + if(!advanced) //set to original window resolution { previewp->mKeepAspectRatio = TRUE; + floaterp->getChild("profile_size_combo")->setCurrentByIndex(0); + gSavedSettings.setS32("SnapshotProfileLastResolution", 0); + floaterp->getChild("postcard_size_combo")->setCurrentByIndex(0); gSavedSettings.setS32("SnapshotPostcardLastResolution", 0); @@ -1256,7 +1325,8 @@ void LLFloaterSnapshot::Impl::updateLayout(LLFloaterSnapshot* floaterp) floaterp->getParent()->setMouseOpaque(TRUE); // shrink to smaller layout - floaterp->reshape(floaterp->getRect().getWidth(), floaterp->getUIWinHeightLong() + delta_height); + // *TODO: unneeded? + floaterp->reshape(floaterp->getRect().getWidth(), floaterp->getRect().getHeight()); // can see and interact with fullscreen preview now if (previewp) @@ -1286,7 +1356,8 @@ void LLFloaterSnapshot::Impl::updateLayout(LLFloaterSnapshot* floaterp) else // turning off freeze frame mode { floaterp->getParent()->setMouseOpaque(FALSE); - floaterp->reshape(floaterp->getRect().getWidth(), floaterp->getUIWinHeightLong() + delta_height); + // *TODO: unneeded? + floaterp->reshape(floaterp->getRect().getWidth(), floaterp->getRect().getHeight()); if (previewp) { previewp->setVisible(FALSE); @@ -1315,43 +1386,39 @@ void LLFloaterSnapshot::Impl::updateLayout(LLFloaterSnapshot* floaterp) // static void LLFloaterSnapshot::Impl::updateControls(LLFloaterSnapshot* floater) { - LLRadioGroup* snapshot_type_radio = floater->getChild("snapshot_type_radio"); - LLSnapshotLivePreview::ESnapshotType shot_type = (LLSnapshotLivePreview::ESnapshotType)gSavedSettings.getS32("LastSnapshotType"); - snapshot_type_radio->setSelectedByValue(getTypeName(shot_type), true); - + LLSnapshotLivePreview::ESnapshotType shot_type = getActiveSnapshotType(floater); ESnapshotFormat shot_format = (ESnapshotFormat)gSavedSettings.getS32("SnapshotFormat"); LLViewerWindow::ESnapshotType layer_type = getLayerType(floater); +#if 0 floater->getChildView("share_to_web")->setVisible( gSavedSettings.getBOOL("SnapshotSharingEnabled")); +#endif +#if 0 floater->getChildView("postcard_size_combo")->setVisible( FALSE); floater->getChildView("texture_size_combo")->setVisible( FALSE); floater->getChildView("local_size_combo")->setVisible( FALSE); +#endif + floater->getChild("profile_size_combo")->selectNthItem(gSavedSettings.getS32("SnapshotProfileLastResolution")); floater->getChild("postcard_size_combo")->selectNthItem(gSavedSettings.getS32("SnapshotPostcardLastResolution")); floater->getChild("texture_size_combo")->selectNthItem(gSavedSettings.getS32("SnapshotTextureLastResolution")); floater->getChild("local_size_combo")->selectNthItem(gSavedSettings.getS32("SnapshotLocalLastResolution")); +#if 0 floater->getChild("local_format_combo")->selectNthItem(gSavedSettings.getS32("SnapshotFormat")); +#endif // *TODO: Separate settings for Web images from postcards - floater->getChildView("send_btn")->setVisible( shot_type == LLSnapshotLivePreview::SNAPSHOT_POSTCARD || - shot_type == LLSnapshotLivePreview::SNAPSHOT_WEB); - floater->getChildView("upload_btn")->setVisible(shot_type == LLSnapshotLivePreview::SNAPSHOT_TEXTURE); - floater->getChildView("save_btn")->setVisible( shot_type == LLSnapshotLivePreview::SNAPSHOT_LOCAL); - floater->getChildView("keep_aspect_check")->setEnabled(shot_type != LLSnapshotLivePreview::SNAPSHOT_TEXTURE && !floater->impl.mAspectRatioCheckOff); + enableAspectRatioCheckbox(floater, shot_type != LLSnapshotLivePreview::SNAPSHOT_TEXTURE && !floater->impl.mAspectRatioCheckOff); floater->getChildView("layer_types")->setEnabled(shot_type == LLSnapshotLivePreview::SNAPSHOT_LOCAL); +#if 0 BOOL is_advance = gSavedSettings.getBOOL("AdvanceSnapshot"); BOOL is_local = shot_type == LLSnapshotLivePreview::SNAPSHOT_LOCAL; BOOL show_slider = (shot_type == LLSnapshotLivePreview::SNAPSHOT_POSTCARD || shot_type == LLSnapshotLivePreview::SNAPSHOT_WEB || (is_local && shot_format == LLFloaterSnapshot::SNAPSHOT_FORMAT_JPEG)); - floater->getChildView("more_btn")->setVisible( !is_advance); // the only item hidden in advanced mode - floater->getChildView("less_btn")->setVisible( is_advance); - floater->getChildView("type_label2")->setVisible( is_advance); - floater->getChildView("format_label")->setVisible( is_advance && is_local); - floater->getChildView("local_format_combo")->setVisible( is_advance && is_local); floater->getChildView("layer_types")->setVisible( is_advance); floater->getChildView("layer_type_label")->setVisible( is_advance); floater->getChildView("snapshot_width")->setVisible( is_advance); @@ -1363,47 +1430,59 @@ void LLFloaterSnapshot::Impl::updateControls(LLFloaterSnapshot* floater) floater->getChildView("freeze_frame_check")->setVisible( is_advance); floater->getChildView("auto_snapshot_check")->setVisible( is_advance); floater->getChildView("image_quality_slider")->setVisible( is_advance && show_slider); +#endif + + LLPanelSnapshot* active_panel = getActivePanel(floater); + if (active_panel) + { + LLSpinCtrl* width_ctrl = getWidthSpinner(floater); + LLSpinCtrl* height_ctrl = getHeightSpinner(floater); - if (gSavedSettings.getBOOL("RenderUIInSnapshot") || gSavedSettings.getBOOL("RenderHUDInSnapshot")) - { //clamp snapshot resolution to window size when showing UI or HUD in snapshot + // Initialize spinners. + if (width_ctrl->getValue().asInteger() == 0) + { + S32 w = gSavedSettings.getS32(lastSnapshotWidthName(shot_type)); + lldebugs << "Initializing width spinner (" << width_ctrl->getName() << "): " << w << llendl; + width_ctrl->setValue(w); + } + if (height_ctrl->getValue().asInteger() == 0) + { + S32 h = gSavedSettings.getS32(lastSnapshotHeightName(shot_type)); + lldebugs << "Initializing height spinner (" << height_ctrl->getName() << "): " << h << llendl; + height_ctrl->setValue(h); + } - LLSpinCtrl* width_ctrl = floater->getChild("snapshot_width"); - LLSpinCtrl* height_ctrl = floater->getChild("snapshot_height"); + if (gSavedSettings.getBOOL("RenderUIInSnapshot") || gSavedSettings.getBOOL("RenderHUDInSnapshot")) + { //clamp snapshot resolution to window size when showing UI or HUD in snapshot + S32 width = gViewerWindow->getWindowWidthRaw(); + S32 height = gViewerWindow->getWindowHeightRaw(); - S32 width = gViewerWindow->getWindowWidthRaw(); - S32 height = gViewerWindow->getWindowHeightRaw(); + width_ctrl->setMaxValue(width); - width_ctrl->setMaxValue(width); - - height_ctrl->setMaxValue(height); + height_ctrl->setMaxValue(height); - if (width_ctrl->getValue().asInteger() > width) - { - width_ctrl->forceSetValue(width); + if (width_ctrl->getValue().asInteger() > width) + { + width_ctrl->forceSetValue(width); + } + if (height_ctrl->getValue().asInteger() > height) + { + height_ctrl->forceSetValue(height); + } } - if (height_ctrl->getValue().asInteger() > height) + else { - height_ctrl->forceSetValue(height); + width_ctrl->setMaxValue(6016); + height_ctrl->setMaxValue(6016); } } - else - { - LLSpinCtrl* width = floater->getChild("snapshot_width"); - width->setMaxValue(6016); - LLSpinCtrl* height = floater->getChild("snapshot_height"); - height->setMaxValue(6016); - } LLSnapshotLivePreview* previewp = getPreviewView(floater); BOOL got_bytes = previewp && previewp->getDataSize() > 0; BOOL got_snap = previewp && previewp->getSnapshotUpToDate(); // *TODO: Separate maximum size for Web images from postcards - floater->getChildView("send_btn")->setEnabled((shot_type == LLSnapshotLivePreview::SNAPSHOT_POSTCARD || - shot_type == LLSnapshotLivePreview::SNAPSHOT_WEB) && - got_snap && previewp->getDataSize() <= MAX_POSTCARD_DATASIZE); - floater->getChildView("upload_btn")->setEnabled(shot_type == LLSnapshotLivePreview::SNAPSHOT_TEXTURE && got_snap); - floater->getChildView("save_btn")->setEnabled(shot_type == LLSnapshotLivePreview::SNAPSHOT_LOCAL && got_snap); + //lldebugs << "Is snapshot up-to-date? " << got_snap << llendl; LLLocale locale(LLLocale::USER_LOCALE); std::string bytes_string; @@ -1411,9 +1490,25 @@ void LLFloaterSnapshot::Impl::updateControls(LLFloaterSnapshot* floater) { LLResMgr::getInstance()->getIntegerString(bytes_string, (previewp->getDataSize()) >> 10 ); } + + // FIXME: move this to the panel code S32 upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload(); - floater->getChild("texture")->setLabelArg("[AMOUNT]", llformat("%d",upload_cost)); - floater->getChild("upload_btn")->setLabelArg("[AMOUNT]", llformat("%d",upload_cost)); + floater->getChild("save_to_inventory_btn")->setLabelArg("[AMOUNT]", llformat("%d",upload_cost)); + + // Update displayed image resolution. + LLTextBox* image_res_tb = floater->getChild("image_res_text"); + image_res_tb->setVisible(got_snap); + if (got_snap) + { +#if 1 + LLPointer img = previewp->getEncodedImage(); +#else + LLPointer fimg = previewp->getFormattedImage(); +#endif + image_res_tb->setTextArg("[WIDTH]", llformat("%d", img->getWidth())); + image_res_tb->setTextArg("[HEIGHT]", llformat("%d", img->getHeight())); + } + floater->getChild("file_size_label")->setTextArg("[SIZE]", got_snap ? bytes_string : floater->getString("unknown")); floater->getChild("file_size_label")->setColor( shot_type == LLSnapshotLivePreview::SNAPSHOT_POSTCARD @@ -1422,29 +1517,23 @@ void LLFloaterSnapshot::Impl::updateControls(LLFloaterSnapshot* floater) switch(shot_type) { - // *TODO: Separate settings for Web images from postcards case LLSnapshotLivePreview::SNAPSHOT_WEB: + layer_type = LLViewerWindow::SNAPSHOT_TYPE_COLOR; + floater->getChild("layer_types")->setValue("colors"); + setResolution(floater, "profile_size_combo"); + break; case LLSnapshotLivePreview::SNAPSHOT_POSTCARD: layer_type = LLViewerWindow::SNAPSHOT_TYPE_COLOR; floater->getChild("layer_types")->setValue("colors"); - if(is_advance) - { - setResolution(floater, "postcard_size_combo"); - } + setResolution(floater, "postcard_size_combo"); break; case LLSnapshotLivePreview::SNAPSHOT_TEXTURE: layer_type = LLViewerWindow::SNAPSHOT_TYPE_COLOR; floater->getChild("layer_types")->setValue("colors"); - if(is_advance) - { - setResolution(floater, "texture_size_combo"); - } + setResolution(floater, "texture_size_combo"); break; case LLSnapshotLivePreview::SNAPSHOT_LOCAL: - if(is_advance) - { - setResolution(floater, "local_size_combo"); - } + setResolution(floater, "local_size_combo"); break; default: break; @@ -1458,15 +1547,23 @@ void LLFloaterSnapshot::Impl::updateControls(LLFloaterSnapshot* floater) previewp->setSnapshotFormat(shot_format); previewp->setSnapshotBufferType(layer_type); } + + LLPanelSnapshot* current_panel = Impl::getActivePanel(floater); + if (current_panel) + { + LLSD info; + info["have-snapshot"] = got_snap; + current_panel->updateControls(info); + } } // static void LLFloaterSnapshot::Impl::updateResolutionTextEntry(LLFloaterSnapshot* floater) { - LLSpinCtrl* width_spinner = floater->getChild("snapshot_width"); - LLSpinCtrl* height_spinner = floater->getChild("snapshot_height"); + LLSpinCtrl* width_spinner = getWidthSpinner(floater); + LLSpinCtrl* height_spinner = getHeightSpinner(floater); - if(getTypeIndex(floater) == LLSnapshotLivePreview::SNAPSHOT_TEXTURE) + if(getActiveSnapshotType(floater) == LLSnapshotLivePreview::SNAPSHOT_TEXTURE) { width_spinner->setAllowEdit(FALSE); height_spinner->setAllowEdit(FALSE); @@ -1488,81 +1585,6 @@ void LLFloaterSnapshot::Impl::checkAutoSnapshot(LLSnapshotLivePreview* previewp, } } -// static -void LLFloaterSnapshot::Impl::onClickDiscard(void* data) -{ - LLFloaterSnapshot *view = (LLFloaterSnapshot *)data; - - if (view) - { - view->closeFloater(); - } -} - - -// static -void LLFloaterSnapshot::Impl::onCommitSave(LLUICtrl* ctrl, void* data) -{ - if (ctrl->getValue().asString() == "save as") - { - gViewerWindow->resetSnapshotLoc(); - } - onClickKeep(data); -} - -// static -void LLFloaterSnapshot::Impl::onClickKeep(void* data) -{ - LLFloaterSnapshot *view = (LLFloaterSnapshot *)data; - LLSnapshotLivePreview* previewp = getPreviewView(view); - - if (previewp) - { - switch (previewp->getSnapshotType()) - { - case LLSnapshotLivePreview::SNAPSHOT_WEB: - previewp->saveWeb(); - break; - - case LLSnapshotLivePreview::SNAPSHOT_POSTCARD: - { - LLFloaterPostcard* floater = previewp->savePostcard(); - // if still in snapshot mode, put postcard floater in snapshot floaterview - // and link it to snapshot floater - if (floater && !gSavedSettings.getBOOL("CloseSnapshotOnKeep")) - { - gFloaterView->removeChild(floater); - gSnapshotFloaterView->addChild(floater); - view->addDependentFloater(floater, FALSE); - } - } - break; - - case LLSnapshotLivePreview::SNAPSHOT_TEXTURE: - previewp->saveTexture(); - break; - - case LLSnapshotLivePreview::SNAPSHOT_LOCAL: - previewp->saveLocal(); - break; - - default: - break; - } - - if (gSavedSettings.getBOOL("CloseSnapshotOnKeep")) - { - view->closeFloater(); - } - else - { - checkAutoSnapshot(previewp); - } - - updateControls(view); - } -} - // static void LLFloaterSnapshot::Impl::onClickNewSnapshot(void* data) { @@ -1590,32 +1612,19 @@ void LLFloaterSnapshot::Impl::onClickAutoSnap(LLUICtrl *ctrl, void* data) void LLFloaterSnapshot::Impl::onClickMore(void* data) { - gSavedSettings.setBOOL( "AdvanceSnapshot", TRUE ); + BOOL visible = gSavedSettings.getBOOL("AdvanceSnapshot"); - LLFloaterSnapshot *view = (LLFloaterSnapshot *)data; + LLFloaterSnapshot *view = (LLFloaterSnapshot *)data; if (view) { + gSavedSettings.setBOOL("AdvanceSnapshot", !visible); +#if 0 view->translate( 0, view->getUIWinHeightShort() - view->getUIWinHeightLong() ); view->reshape(view->getRect().getWidth(), view->getUIWinHeightLong()); +#endif updateControls(view) ; updateLayout(view) ; - if(getPreviewView(view)) - { - getPreviewView(view)->setThumbnailImageSize() ; - } - } -} -void LLFloaterSnapshot::Impl::onClickLess(void* data) -{ - gSavedSettings.setBOOL( "AdvanceSnapshot", FALSE ); - - LLFloaterSnapshot *view = (LLFloaterSnapshot *)data; - if (view) - { - view->translate( 0, view->getUIWinHeightLong() - view->getUIWinHeightShort() ); - view->reshape(view->getRect().getWidth(), view->getUIWinHeightShort()); - updateControls(view) ; - updateLayout(view) ; + // *TODO: redundant? if(getPreviewView(view)) { getPreviewView(view)->setThumbnailImageSize() ; @@ -1655,17 +1664,24 @@ void LLFloaterSnapshot::Impl::onClickHUDCheck(LLUICtrl *ctrl, void* data) void LLFloaterSnapshot::Impl::onClickKeepOpenCheck(LLUICtrl* ctrl, void* data) { LLCheckBoxCtrl *check = (LLCheckBoxCtrl *)ctrl; - gSavedSettings.setBOOL( "CloseSnapshotOnKeep", !check->get() ); } +#if 0 // static void LLFloaterSnapshot::Impl::onClickKeepAspectCheck(LLUICtrl* ctrl, void* data) { LLCheckBoxCtrl *check = (LLCheckBoxCtrl *)ctrl; - gSavedSettings.setBOOL( "KeepAspectForSnapshot", check->get() ); - LLFloaterSnapshot *view = (LLFloaterSnapshot *)data; + applyKeepAspectCheck(view, check->get()); +} +#endif + +// static +void LLFloaterSnapshot::Impl::applyKeepAspectCheck(LLFloaterSnapshot* view, BOOL checked) +{ + gSavedSettings.setBOOL("KeepAspectForSnapshot", checked); + if (view) { LLSnapshotLivePreview* previewp = getPreviewView(view) ; @@ -1687,20 +1703,6 @@ void LLFloaterSnapshot::Impl::onClickKeepAspectCheck(LLUICtrl* ctrl, void* data) } } -// static -void LLFloaterSnapshot::Impl::onCommitQuality(LLUICtrl* ctrl, void* data) -{ - LLSliderCtrl* slider = (LLSliderCtrl*)ctrl; - S32 quality_val = llfloor((F32)slider->getValue().asReal()); - - LLSnapshotLivePreview* previewp = getPreviewView((LLFloaterSnapshot *)data); - if (previewp) - { - previewp->setSnapshotQuality(quality_val); - } - checkAutoSnapshot(previewp, TRUE); -} - // static void LLFloaterSnapshot::Impl::onCommitFreezeFrame(LLUICtrl* ctrl, void* data) { @@ -1723,18 +1725,16 @@ void LLFloaterSnapshot::Impl::checkAspectRatio(LLFloaterSnapshot *view, S32 inde LLSnapshotLivePreview *previewp = getPreviewView(view) ; // Don't round texture sizes; textures are commonly stretched in world, profiles, etc and need to be "squashed" during upload, not cropped here -#if 0 - if(LLSnapshotLivePreview::SNAPSHOT_TEXTURE == getTypeIndex(view)) + if(LLSnapshotLivePreview::SNAPSHOT_TEXTURE == getActiveSnapshotType(view)) { previewp->mKeepAspectRatio = FALSE ; return ; } -#endif if(0 == index) //current window size { view->impl.mAspectRatioCheckOff = true ; - view->getChildView("keep_aspect_check")->setEnabled(FALSE) ; + enableAspectRatioCheckbox(view, FALSE); if(previewp) { @@ -1744,9 +1744,11 @@ void LLFloaterSnapshot::Impl::checkAspectRatio(LLFloaterSnapshot *view, S32 inde else if(-1 == index) //custom { view->impl.mAspectRatioCheckOff = false ; +#if 0 //if(LLSnapshotLivePreview::SNAPSHOT_TEXTURE != gSavedSettings.getS32("LastSnapshotType")) +#endif { - view->getChildView("keep_aspect_check")->setEnabled(TRUE) ; + enableAspectRatioCheckbox(view, TRUE); if(previewp) { @@ -1757,7 +1759,7 @@ void LLFloaterSnapshot::Impl::checkAspectRatio(LLFloaterSnapshot *view, S32 inde else { view->impl.mAspectRatioCheckOff = true ; - view->getChildView("keep_aspect_check")->setEnabled(FALSE) ; + enableAspectRatioCheckbox(view, FALSE); if(previewp) { @@ -1768,23 +1770,21 @@ void LLFloaterSnapshot::Impl::checkAspectRatio(LLFloaterSnapshot *view, S32 inde return ; } -static std::string lastSnapshotWidthName() +static std::string lastSnapshotWidthName(S32 shot_type) { - switch(gSavedSettings.getS32("LastSnapshotType")) + switch (shot_type) { - // *TODO: Separate settings for Web snapshots and postcards - case LLSnapshotLivePreview::SNAPSHOT_WEB: return "LastSnapshotToEmailWidth"; + case LLSnapshotLivePreview::SNAPSHOT_WEB: return "LastSnapshotToProfileWidth"; case LLSnapshotLivePreview::SNAPSHOT_POSTCARD: return "LastSnapshotToEmailWidth"; case LLSnapshotLivePreview::SNAPSHOT_TEXTURE: return "LastSnapshotToInventoryWidth"; default: return "LastSnapshotToDiskWidth"; } } -static std::string lastSnapshotHeightName() +static std::string lastSnapshotHeightName(S32 shot_type) { - switch(gSavedSettings.getS32("LastSnapshotType")) + switch (shot_type) { - // *TODO: Separate settings for Web snapshots and postcards - case LLSnapshotLivePreview::SNAPSHOT_WEB: return "LastSnapshotToEmailHeight"; + case LLSnapshotLivePreview::SNAPSHOT_WEB: return "LastSnapshotToProfileHeight"; case LLSnapshotLivePreview::SNAPSHOT_POSTCARD: return "LastSnapshotToEmailHeight"; case LLSnapshotLivePreview::SNAPSHOT_TEXTURE: return "LastSnapshotToInventoryHeight"; default: return "LastSnapshotToDiskHeight"; @@ -1799,10 +1799,12 @@ void LLFloaterSnapshot::Impl::updateResolution(LLUICtrl* ctrl, void* data, BOOL if (!view || !combobox) { + llassert(view && combobox); return; } // save off all selected resolution values + gSavedSettings.setS32("SnapshotProfileLastResolution", view->getChild("profile_size_combo")->getCurrentIndex()); gSavedSettings.setS32("SnapshotPostcardLastResolution", view->getChild("postcard_size_combo")->getCurrentIndex()); gSavedSettings.setS32("SnapshotTextureLastResolution", view->getChild("texture_size_combo")->getCurrentIndex()); gSavedSettings.setS32("SnapshotLocalLastResolution", view->getChild("local_size_combo")->getCurrentIndex()); @@ -1824,16 +1826,44 @@ void LLFloaterSnapshot::Impl::updateResolution(LLUICtrl* ctrl, void* data, BOOL if (width == 0 || height == 0) { // take resolution from current window size + lldebugs << "Setting preview res from window: " << gViewerWindow->getWindowWidthRaw() << "x" << gViewerWindow->getWindowHeightRaw() << llendl; previewp->setSize(gViewerWindow->getWindowWidthRaw(), gViewerWindow->getWindowHeightRaw()); } else if (width == -1 || height == -1) { // load last custom value - previewp->setSize(gSavedSettings.getS32(lastSnapshotWidthName()), gSavedSettings.getS32(lastSnapshotHeightName())); +#if 1 + LLPanelSnapshot* spanel = getActivePanel(view); + if (spanel) + { + lldebugs << "Loading typed res from panel " << spanel->getName() << llendl; + width = spanel->getTypedPreviewWidth(); + height = spanel->getTypedPreviewWidth(); + } + else + { + const S32 shot_type = getActiveSnapshotType(view); + lldebugs << "Loading saved res for shot_type " << shot_type << llendl; + width = gSavedSettings.getS32(lastSnapshotWidthName(shot_type)); + height = gSavedSettings.getS32(lastSnapshotHeightName(shot_type)); + } + + llassert(width > 0 && height > 0); + previewp->setSize(width, height); +#else + LLPanelSnapshot* spanel = getActivePanel(view); + if (spanel) + { + lldebugs << "Setting custom preview res : " << spanel->getTypedPreviewWidth() << "x" << spanel->getTypedPreviewHeight() << llendl; + previewp->setSize(spanel->getTypedPreviewWidth(), spanel->getTypedPreviewHeight()); + } + //previewp->setSize(gSavedSettings.getS32(lastSnapshotWidthName()), gSavedSettings.getS32(lastSnapshotHeightName())); +#endif } else { // use the resolution from the selected pre-canned drop-down choice + lldebugs << "Setting preview res selected from combo: " << width << "x" << height << llendl; previewp->setSize(width, height); } @@ -1853,10 +1883,10 @@ void LLFloaterSnapshot::Impl::updateResolution(LLUICtrl* ctrl, void* data, BOOL resetSnapshotSizeOnUI(view, width, height) ; } - if(view->getChild("snapshot_width")->getValue().asInteger() != width || view->getChild("snapshot_height")->getValue().asInteger() != height) + if(getWidthSpinner(view)->getValue().asInteger() != width || getHeightSpinner(view)->getValue().asInteger() != height) { - view->getChild("snapshot_width")->setValue(width); - view->getChild("snapshot_height")->setValue(height); + getWidthSpinner(view)->setValue(width); + getHeightSpinner(view)->setValue(height); } if(original_width != width || original_height != height) @@ -1892,6 +1922,29 @@ void LLFloaterSnapshot::Impl::onCommitLayerTypes(LLUICtrl* ctrl, void*data) } } +// static +void LLFloaterSnapshot::Impl::onImageQualityChange(LLFloaterSnapshot* view, S32 quality_val) +{ + LLSnapshotLivePreview* previewp = getPreviewView(view); + if (previewp) + { + previewp->setSnapshotQuality(quality_val); + } + checkAutoSnapshot(previewp, TRUE); +} + +// static +void LLFloaterSnapshot::Impl::onImageFormatChange(LLFloaterSnapshot* view) +{ + if (view) + { + gSavedSettings.setS32("SnapshotFormat", getImageFormat(view)); + getPreviewView(view)->updateSnapshot(TRUE); + updateControls(view); + } +} + +#if 0 //static void LLFloaterSnapshot::Impl::onCommitSnapshotType(LLUICtrl* ctrl, void* data) { @@ -1903,9 +1956,10 @@ void LLFloaterSnapshot::Impl::onCommitSnapshotType(LLUICtrl* ctrl, void* data) updateControls(view); } } +#endif - -//static +#if 0 +//static. void LLFloaterSnapshot::Impl::onCommitSnapshotFormat(LLUICtrl* ctrl, void* data) { LLFloaterSnapshot *view = (LLFloaterSnapshot *)data; @@ -1916,8 +1970,7 @@ void LLFloaterSnapshot::Impl::onCommitSnapshotFormat(LLUICtrl* ctrl, void* data) updateControls(view); } } - - +#endif // Sets the named size combo to "custom" mode. // static @@ -1931,6 +1984,10 @@ void LLFloaterSnapshot::Impl::comboSetCustom(LLFloaterSnapshot* floater, const s { gSavedSettings.setS32("SnapshotPostcardLastResolution", combo->getCurrentIndex()); } + else if(comboname == "profile_size_combo") + { + gSavedSettings.setS32("SnapshotProfileLastResolution", combo->getCurrentIndex()); + } else if(comboname == "texture_size_combo") { gSavedSettings.setS32("SnapshotTextureLastResolution", combo->getCurrentIndex()); @@ -2027,21 +2084,29 @@ BOOL LLFloaterSnapshot::Impl::checkImageSize(LLSnapshotLivePreview* previewp, S3 //static void LLFloaterSnapshot::Impl::resetSnapshotSizeOnUI(LLFloaterSnapshot *view, S32 width, S32 height) { - view->getChild("snapshot_width")->forceSetValue(width); - view->getChild("snapshot_height")->forceSetValue(height); - gSavedSettings.setS32(lastSnapshotWidthName(), width); - gSavedSettings.setS32(lastSnapshotHeightName(), height); + getWidthSpinner(view)->forceSetValue(width); + getHeightSpinner(view)->forceSetValue(height); + gSavedSettings.setS32(lastSnapshotWidthName(getActiveSnapshotType(view)), width); + gSavedSettings.setS32(lastSnapshotHeightName(getActiveSnapshotType(view)), height); } +#if 0 //static void LLFloaterSnapshot::Impl::onCommitCustomResolution(LLUICtrl *ctrl, void* data) { - LLFloaterSnapshot *view = (LLFloaterSnapshot *)data; + LLFloaterSnapshot *view = (LLFloaterSnapshot *)data; + S32 w = llfloor((F32)getWidthSpinner(view)->getValue().asReal()); + S32 h = llfloor((F32)getHeightSpinner(view)->getValue().asReal()); + applyCustomResolution(view, w, h); +} +#endif + +// static +void LLFloaterSnapshot::Impl::applyCustomResolution(LLFloaterSnapshot* view, S32 w, S32 h) +{ + lldebugs << "applyCustomResolution(" << w << ", " << h << ")" << llendl; if (view) { - S32 w = llfloor((F32)view->getChild("snapshot_width")->getValue().asReal()); - S32 h = llfloor((F32)view->getChild("snapshot_height")->getValue().asReal()); - LLSnapshotLivePreview* previewp = getPreviewView(view); if (previewp) { @@ -2073,7 +2138,7 @@ void LLFloaterSnapshot::Impl::onCommitCustomResolution(LLUICtrl *ctrl, void* dat } } #endif - previewp->setMaxImageSize((S32)((LLSpinCtrl *)ctrl)->getMaxValue()) ; + previewp->setMaxImageSize(getWidthSpinner(view)->getMaxValue()) ; // Check image size changes the value of height and width if(checkImageSize(previewp, w, h, w != curw, previewp->getMaxImageSize()) @@ -2085,19 +2150,33 @@ void LLFloaterSnapshot::Impl::onCommitCustomResolution(LLUICtrl *ctrl, void* dat previewp->setSize(w,h); checkAutoSnapshot(previewp, FALSE); previewp->updateSnapshot(FALSE, TRUE); + comboSetCustom(view, "profile_size_combo"); comboSetCustom(view, "postcard_size_combo"); comboSetCustom(view, "texture_size_combo"); comboSetCustom(view, "local_size_combo"); } } - gSavedSettings.setS32(lastSnapshotWidthName(), w); - gSavedSettings.setS32(lastSnapshotHeightName(), h); + gSavedSettings.setS32(lastSnapshotWidthName(getActiveSnapshotType(view)), w); + gSavedSettings.setS32(lastSnapshotHeightName(getActiveSnapshotType(view)), h); updateControls(view); } } +// static +void LLFloaterSnapshot::Impl::onSnapshotUploadFinished(LLSideTrayPanelContainer* panel_container, bool status) +{ + panel_container->openPanel("panel_post_result", LLSD().with("post-result", status).with("post-type", "profile")); +} + + +// static +void LLFloaterSnapshot::Impl::onSendingPostcardFinished(LLSideTrayPanelContainer* panel_container, bool status) +{ + panel_container->openPanel("panel_post_result", LLSD().with("post-result", status).with("post-type", "postcard")); +} + ///---------------------------------------------------------------------------- /// Class LLFloaterSnapshot ///---------------------------------------------------------------------------- @@ -2134,24 +2213,19 @@ BOOL LLFloaterSnapshot::postBuild() LLWebSharing::instance().init(); } +#if 0 childSetCommitCallback("snapshot_type_radio", Impl::onCommitSnapshotType, this); childSetCommitCallback("local_format_combo", Impl::onCommitSnapshotFormat, this); +#endif childSetAction("new_snapshot_btn", Impl::onClickNewSnapshot, this); - childSetAction("more_btn", Impl::onClickMore, this); - childSetAction("less_btn", Impl::onClickLess, this); - - childSetAction("upload_btn", Impl::onClickKeep, this); - childSetAction("send_btn", Impl::onClickKeep, this); - childSetCommitCallback("save_btn", Impl::onCommitSave, this); - childSetAction("discard_btn", Impl::onClickDiscard, this); - - childSetCommitCallback("image_quality_slider", Impl::onCommitQuality, this); - getChild("image_quality_slider")->setValue(gSavedSettings.getS32("SnapshotQuality")); + childSetAction("advanced_options_btn", Impl::onClickMore, this); +#if 0 childSetCommitCallback("snapshot_width", Impl::onCommitCustomResolution, this); childSetCommitCallback("snapshot_height", Impl::onCommitCustomResolution, this); +#endif childSetCommitCallback("ui_check", Impl::onClickUICheck, this); getChild("ui_check")->setValue(gSavedSettings.getBOOL("RenderUIInSnapshot")); @@ -2162,15 +2236,19 @@ BOOL LLFloaterSnapshot::postBuild() childSetCommitCallback("keep_open_check", Impl::onClickKeepOpenCheck, this); getChild("keep_open_check")->setValue(!gSavedSettings.getBOOL("CloseSnapshotOnKeep")); +#if 0 childSetCommitCallback("keep_aspect_check", Impl::onClickKeepAspectCheck, this); - getChild("keep_aspect_check")->setValue(gSavedSettings.getBOOL("KeepAspectForSnapshot")); +#endif + impl.enableAspectRatioCheckbox(this, gSavedSettings.getBOOL("KeepAspectForSnapshot")); childSetCommitCallback("layer_types", Impl::onCommitLayerTypes, this); getChild("layer_types")->setValue("colors"); getChildView("layer_types")->setEnabled(FALSE); - getChild("snapshot_width")->setValue(gSavedSettings.getS32(lastSnapshotWidthName())); - getChild("snapshot_height")->setValue(gSavedSettings.getS32(lastSnapshotHeightName())); +#if 0 // leads to crash later if one of the settings values is 0 + impl.getWidthSpinner(this)->setValue(gSavedSettings.getS32(lastSnapshotWidthName())); + impl.getHeightSpinner(this)->setValue(gSavedSettings.getS32(lastSnapshotHeightName())); +#endif getChild("freeze_frame_check")->setValue(gSavedSettings.getBOOL("UseFreezeFrame")); childSetCommitCallback("freeze_frame_check", Impl::onCommitFreezeFrame, this); @@ -2178,10 +2256,18 @@ BOOL LLFloaterSnapshot::postBuild() getChild("auto_snapshot_check")->setValue(gSavedSettings.getBOOL("AutoSnapshot")); childSetCommitCallback("auto_snapshot_check", Impl::onClickAutoSnap, this); + childSetCommitCallback("profile_size_combo", Impl::onCommitResolution, this); childSetCommitCallback("postcard_size_combo", Impl::onCommitResolution, this); childSetCommitCallback("texture_size_combo", Impl::onCommitResolution, this); childSetCommitCallback("local_size_combo", Impl::onCommitResolution, this); + LLSideTrayPanelContainer* panel_container = getChild("panel_container"); + LLWebProfile::setImageUploadResultCallback(boost::bind(&LLFloaterSnapshot::Impl::onSnapshotUploadFinished, panel_container, _1)); + LLPostCard::setPostResultCallback(boost::bind(&LLFloaterSnapshot::Impl::onSendingPostcardFinished, panel_container, _1)); + + // remember preview rect + sThumbnailPlaceholderRect = getChild("thumbnail_placeholder")->getRect(); + // create preview window LLRect full_screen_rect = getRootView()->getRect(); LLSnapshotLivePreview::Params p; @@ -2221,9 +2307,8 @@ void LLFloaterSnapshot::draw() { if(previewp->getThumbnailImage()) { - LLRect thumbnail_rect = getChild("thumbnail_placeholder")->getRect(); - - S32 offset_x = (getRect().getWidth() - previewp->getThumbnailWidth()) / 2 ; + LLRect& thumbnail_rect = sThumbnailPlaceholderRect; + S32 offset_x = thumbnail_rect.mLeft + (thumbnail_rect.getWidth() - previewp->getThumbnailWidth()) / 2 ; S32 offset_y = thumbnail_rect.mBottom + (thumbnail_rect.getHeight() - previewp->getThumbnailHeight()) / 2 ; glMatrixMode(GL_MODELVIEW); @@ -2256,6 +2341,44 @@ void LLFloaterSnapshot::onClose(bool app_quitting) getParent()->setMouseOpaque(FALSE); } +// virtual +S32 LLFloaterSnapshot::notify(const LLSD& info) +{ + // A child panel wants to change snapshot resolution. + if (info.has("combo-res-change")) + { + std::string combo_name = info["combo-res-change"]["control-name"].asString(); + impl.updateResolution(getChild(combo_name), this); + return 1; + } + + if (info.has("custom-res-change")) + { + LLSD res = info["custom-res-change"]; + impl.applyCustomResolution(this, res["w"].asInteger(), res["h"].asInteger()); + return 1; + } + + if (info.has("keep-aspect-change")) + { + impl.applyKeepAspectCheck(this, info["keep-aspect-change"].asBoolean()); + return 1; + } + + if (info.has("image-quality-change")) + { + impl.onImageQualityChange(this, info["image-quality-change"].asInteger()); + return 1; + } + + if (info.has("image-format-change")) + { + impl.onImageFormatChange(this); + return 1; + } + + return 0; +} //static void LLFloaterSnapshot::update() @@ -2276,6 +2399,159 @@ void LLFloaterSnapshot::update() } } +// static +LLFloaterSnapshot* LLFloaterSnapshot::getInstance() +{ + return LLFloaterReg::getTypedInstance("snapshot"); +} + +// static +void LLFloaterSnapshot::saveTexture() +{ + lldebugs << "saveTexture" << llendl; + + // FIXME: duplicated code + LLFloaterSnapshot* instance = LLFloaterReg::findTypedInstance("snapshot"); + if (!instance) + { + llassert(instance != NULL); + return; + } + LLSnapshotLivePreview* previewp = Impl::getPreviewView(instance); + if (!previewp) + { + llassert(previewp != NULL); + return; + } + + previewp->saveTexture(); + instance->postSave(); +} + +// static +void LLFloaterSnapshot::saveLocal() +{ + lldebugs << "saveLocal" << llendl; + // FIXME: duplicated code + LLFloaterSnapshot* instance = LLFloaterReg::findTypedInstance("snapshot"); + if (!instance) + { + llassert(instance != NULL); + return; + } + LLSnapshotLivePreview* previewp = Impl::getPreviewView(instance); + if (!previewp) + { + llassert(previewp != NULL); + return; + } + + previewp->saveLocal(); + instance->postSave(); +} + +// static +void LLFloaterSnapshot::preUpdate() +{ + // FIXME: duplicated code + LLFloaterSnapshot* instance = LLFloaterReg::findTypedInstance("snapshot"); + if (instance) + { + instance->getChildView("refresh_icon")->setVisible(TRUE); // indicate refresh + } +} + +// static +void LLFloaterSnapshot::postUpdate() +{ + // FIXME: duplicated code + LLFloaterSnapshot* instance = LLFloaterReg::findTypedInstance("snapshot"); + if (instance) + { + instance->getChildView("refresh_icon")->setVisible(FALSE); + } +} + +// static +void LLFloaterSnapshot::postSave() +{ + LLFloaterSnapshot* instance = LLFloaterReg::findTypedInstance("snapshot"); + if (!instance) + { + llassert(instance != NULL); + return; + } + + instance->impl.updateControls(instance); +} + +// static +void LLFloaterSnapshot::postPanelSwitch() +{ + LLFloaterSnapshot* instance = getInstance(); + instance->impl.updateControls(instance); +} + +// static +LLPointer LLFloaterSnapshot::getImageData() +{ + // FIXME: May not work for textures. + + LLFloaterSnapshot* instance = LLFloaterReg::findTypedInstance("snapshot"); + if (!instance) + { + llassert(instance != NULL); + return NULL; + } + + LLSnapshotLivePreview* previewp = Impl::getPreviewView(instance); + if (!previewp) + { + llassert(previewp != NULL); + return NULL; + } + + LLPointer img = previewp->getFormattedImage(); + if (!img.get()) + { + llwarns << "Empty snapshot image data" << llendl; + llassert(img.get() != NULL); + } + + return img; +} + +// static +const LLVector3d& LLFloaterSnapshot::getPosTakenGlobal() +{ + LLFloaterSnapshot* instance = LLFloaterReg::findTypedInstance("snapshot"); + if (!instance) + { + llassert(instance != NULL); + return LLVector3d::zero; + } + + LLSnapshotLivePreview* previewp = Impl::getPreviewView(instance); + if (!previewp) + { + llassert(previewp != NULL); + return LLVector3d::zero; + } + + return previewp->getPosTakenGlobal(); +} + +// static +void LLFloaterSnapshot::setAgentEmail(const std::string& email) +{ + LLFloaterSnapshot* instance = LLFloaterReg::findTypedInstance("snapshot"); + if (instance) + { + LLSideTrayPanelContainer* panel_container = instance->getChild("panel_container"); + LLPanel* postcard_panel = panel_container->getPanelByName("panel_snapshot_postcard"); + postcard_panel->notify(LLSD().with("agent-email", email)); + } +} ///---------------------------------------------------------------------------- /// Class LLSnapshotFloaterView diff --git a/indra/newview/llfloatersnapshot.h b/indra/newview/llfloatersnapshot.h index c92d9efde5..de69824ad0 100644 --- a/indra/newview/llfloatersnapshot.h +++ b/indra/newview/llfloatersnapshot.h @@ -27,11 +27,15 @@ #ifndef LL_LLFLOATERSNAPSHOT_H #define LL_LLFLOATERSNAPSHOT_H +#include "llimage.h" #include "llfloater.h" +class LLSpinCtrl; class LLFloaterSnapshot : public LLFloater { + LOG_CLASS(LLFloaterSnapshot); + public: typedef enum e_snapshot_format { @@ -47,20 +51,29 @@ public: /*virtual*/ void draw(); /*virtual*/ void onOpen(const LLSD& key); /*virtual*/ void onClose(bool app_quitting); + /*virtual*/ S32 notify(const LLSD& info); static void update(); - - static S32 getUIWinHeightLong() {return sUIWinHeightLong ;} - static S32 getUIWinHeightShort() {return sUIWinHeightShort ;} - static S32 getUIWinWidth() {return sUIWinWidth ;} + + // TODO: create a snapshot model instead + static LLFloaterSnapshot* getInstance(); + static void saveTexture(); + static void saveLocal(); + static void preUpdate(); + static void postUpdate(); + static void postSave(); + static void postPanelSwitch(); + static LLPointer getImageData(); + static const LLVector3d& getPosTakenGlobal(); + static void setAgentEmail(const std::string& email); + + static const LLRect& getThumbnailPlaceholderRect() { return sThumbnailPlaceholderRect; } private: + static LLRect sThumbnailPlaceholderRect; + class Impl; Impl& impl; - - static S32 sUIWinHeightLong ; - static S32 sUIWinHeightShort ; - static S32 sUIWinWidth ; }; class LLSnapshotFloaterView : public LLFloaterView diff --git a/indra/newview/llpanelpostprogress.cpp b/indra/newview/llpanelpostprogress.cpp new file mode 100644 index 0000000000..9b7de2cb23 --- /dev/null +++ b/indra/newview/llpanelpostprogress.cpp @@ -0,0 +1,59 @@ +/** + * @file llpanelpostprogress.cpp + * @brief Displays progress of publishing a snapshot. + * + * $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 termsllpanelpostprogress 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 "llfloaterreg.h" +#include "llpanel.h" +#include "llsidetraypanelcontainer.h" + +/** + * Displays progress of publishing a snapshot. + */ +class LLPanelPostProgress +: public LLPanel +{ + LOG_CLASS(LLPanelPostProgress); + +public: + /*virtual*/ void onOpen(const LLSD& key); +}; + +static LLRegisterPanelClassWrapper panel_class("llpanelpostprogress"); + +// virtual +void LLPanelPostProgress::onOpen(const LLSD& key) +{ + if (key.has("post-type")) + { + std::string progress_text = getString(key["post-type"].asString() + "_" + "progress_str"); + getChild("progress_lbl")->setText(progress_text); + } + else + { + llwarns << "Invalid key" << llendl; + } +} diff --git a/indra/newview/llpanelpostresult.cpp b/indra/newview/llpanelpostresult.cpp new file mode 100644 index 0000000000..2b937d83b9 --- /dev/null +++ b/indra/newview/llpanelpostresult.cpp @@ -0,0 +1,90 @@ +/** + * @file llpanelpostresult.cpp + * @brief Result of publishing a snapshot (success/failure). + * + * $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 "llfloaterreg.h" +#include "llpanel.h" +#include "llsidetraypanelcontainer.h" + +/** + * Displays snapshot publishing result. + */ +class LLPanelPostResult +: public LLPanel +{ + LOG_CLASS(LLPanelPostResult); + +public: + LLPanelPostResult(); + + /*virtual*/ void onOpen(const LLSD& key); +private: + void onBack(); + void onClose(); +}; + +static LLRegisterPanelClassWrapper panel_class("llpanelpostresult"); + +LLPanelPostResult::LLPanelPostResult() +{ + mCommitCallbackRegistrar.add("Snapshot.Result.Back", boost::bind(&LLPanelPostResult::onBack, this)); + mCommitCallbackRegistrar.add("Snapshot.Result.Close", boost::bind(&LLPanelPostResult::onClose, this)); +} + + +// virtual +void LLPanelPostResult::onOpen(const LLSD& key) +{ + if (key.isMap() && key.has("post-result") && key.has("post-type")) + { + bool ok = key["post-result"].asBoolean(); + std::string type = key["post-type"].asString(); + std::string result_text = getString(type + "_" + (ok ? "succeeded_str" : "failed_str")); + getChild("result_lbl")->setText(result_text); + } + else + { + llwarns << "Invalid key" << llendl; + } +} + +void LLPanelPostResult::onBack() +{ + LLSideTrayPanelContainer* parent = dynamic_cast(getParent()); + if (!parent) + { + llwarns << "Cannot find panel container" << llendl; + return; + } + + parent->openPreviousPanel(); +} + +void LLPanelPostResult::onClose() +{ + LLFloaterReg::hideInstance("snapshot"); +} diff --git a/indra/newview/llpanelsnapshot.cpp b/indra/newview/llpanelsnapshot.cpp new file mode 100644 index 0000000000..e89e62c750 --- /dev/null +++ b/indra/newview/llpanelsnapshot.cpp @@ -0,0 +1,109 @@ +/** + * @file llpanelsnapshot.cpp + * @brief Snapshot panel base class + * + * $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 "llpanelsnapshot.h" + +// libs +#include "llsliderctrl.h" +#include "llspinctrl.h" +#include "lltrans.h" + +// newview +#include "llsidetraypanelcontainer.h" + +LLFloaterSnapshot::ESnapshotFormat LLPanelSnapshot::getImageFormat() const +{ + return LLFloaterSnapshot::SNAPSHOT_FORMAT_JPEG; +} + +LLSpinCtrl* LLPanelSnapshot::getWidthSpinner() +{ + return getChild(getWidthSpinnerName()); +} + +LLSpinCtrl* LLPanelSnapshot::getHeightSpinner() +{ + return getChild(getHeightSpinnerName()); +} + +S32 LLPanelSnapshot::getTypedPreviewWidth() const +{ + return getChild(getWidthSpinnerName())->getValue().asInteger(); +} + +S32 LLPanelSnapshot::getTypedPreviewHeight() const +{ + return getChild(getHeightSpinnerName())->getValue().asInteger(); +} + +void LLPanelSnapshot::enableAspectRatioCheckbox(BOOL enable) +{ + getChild(getAspectRatioCBName())->setEnabled(enable); +} + +LLSideTrayPanelContainer* LLPanelSnapshot::getParentContainer() +{ + LLSideTrayPanelContainer* parent = dynamic_cast(getParent()); + if (!parent) + { + llwarns << "Cannot find panel container" << llendl; + return NULL; + } + + return parent; +} + +void LLPanelSnapshot::updateImageQualityLevel() +{ + LLSliderCtrl* quality_slider = getChild("image_quality_slider"); + S32 quality_val = llfloor((F32) quality_slider->getValue().asReal()); + + std::string quality_lvl; + + if (quality_val < 20) + { + quality_lvl = LLTrans::getString("snapshot_quality_very_low"); + } + else if (quality_val < 40) + { + quality_lvl = LLTrans::getString("snapshot_quality_low"); + } + else if (quality_val < 60) + { + quality_lvl = LLTrans::getString("snapshot_quality_medium"); + } + else if (quality_val < 80) + { + quality_lvl = LLTrans::getString("snapshot_quality_high"); + } + else + { + quality_lvl = LLTrans::getString("snapshot_quality_very_high"); + } + + getChild("image_quality_level")->setTextArg("[QLVL]", quality_lvl); +} diff --git a/indra/newview/llpanelsnapshot.h b/indra/newview/llpanelsnapshot.h new file mode 100644 index 0000000000..a227317d2f --- /dev/null +++ b/indra/newview/llpanelsnapshot.h @@ -0,0 +1,58 @@ +/** + * @file llpanelsnapshot.h + * @brief Snapshot panel base class + * + * $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_LLPANELSNAPSHOT_H +#define LL_LLPANELSNAPSHOT_H + +#include "llfloatersnapshot.h" + +class LLSideTrayPanelContainer; + +/** + * Snapshot panel base class. + */ +class LLPanelSnapshot: public LLPanel +{ +public: + virtual std::string getWidthSpinnerName() const = 0; + virtual std::string getHeightSpinnerName() const = 0; + virtual std::string getAspectRatioCBName() const = 0; + virtual std::string getImageSizeComboName() const = 0; + + virtual S32 getTypedPreviewWidth() const; + virtual S32 getTypedPreviewHeight() const; + virtual LLSpinCtrl* getWidthSpinner(); + virtual LLSpinCtrl* getHeightSpinner(); + virtual void enableAspectRatioCheckbox(BOOL enable); + virtual LLFloaterSnapshot::ESnapshotFormat getImageFormat() const; + virtual void updateControls(const LLSD& info) {} ///< Update controls from saved settings + +protected: + LLSideTrayPanelContainer* getParentContainer(); + void updateImageQualityLevel(); +}; + +#endif // LL_LLPANELSNAPSHOT_H diff --git a/indra/newview/llpanelsnapshotinventory.cpp b/indra/newview/llpanelsnapshotinventory.cpp new file mode 100644 index 0000000000..6419c37494 --- /dev/null +++ b/indra/newview/llpanelsnapshotinventory.cpp @@ -0,0 +1,152 @@ +/** + * @file llpanelsnapshotinventory.cpp + * @brief The panel provides UI for saving snapshot as an inventory texture. + * + * $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 "llcombobox.h" +#include "llsidetraypanelcontainer.h" +#include "llspinctrl.h" + +#include "llfloatersnapshot.h" // FIXME: replace with a snapshot storage model +#include "llpanelsnapshot.h" +#include "llviewercontrol.h" // gSavedSettings + +/** + * The panel provides UI for saving snapshot as an inventory texture. + */ +class LLPanelSnapshotInventory +: public LLPanelSnapshot +{ + LOG_CLASS(LLPanelSnapshotInventory); + +public: + LLPanelSnapshotInventory(); + /*virtual*/ BOOL postBuild(); + /*virtual*/ void onOpen(const LLSD& key); + +private: + void updateCustomResControls(); ///< Show/hide custom resolution controls (spinners and checkbox) + + /*virtual*/ std::string getWidthSpinnerName() const { return "inventory_snapshot_width"; } + /*virtual*/ std::string getHeightSpinnerName() const { return "inventory_snapshot_height"; } + /*virtual*/ std::string getAspectRatioCBName() const { return "inventory_keep_aspect_check"; } + /*virtual*/ std::string getImageSizeComboName() const { return "texture_size_combo"; } + /*virtual*/ void updateControls(const LLSD& info); + + void onResolutionComboCommit(LLUICtrl* ctrl); + void onCustomResolutionCommit(LLUICtrl* ctrl); + void onKeepAspectRatioCommit(LLUICtrl* ctrl); + void onSend(); + void onCancel(); +}; + +static LLRegisterPanelClassWrapper panel_class("llpanelsnapshotinventory"); + +LLPanelSnapshotInventory::LLPanelSnapshotInventory() +{ + mCommitCallbackRegistrar.add("Inventory.Save", boost::bind(&LLPanelSnapshotInventory::onSend, this)); + mCommitCallbackRegistrar.add("Inventory.Cancel", boost::bind(&LLPanelSnapshotInventory::onCancel, this)); +} + +// virtual +BOOL LLPanelSnapshotInventory::postBuild() +{ + getChild(getImageSizeComboName())->setCommitCallback(boost::bind(&LLPanelSnapshotInventory::onResolutionComboCommit, this, _1)); + getChild(getWidthSpinnerName())->setCommitCallback(boost::bind(&LLPanelSnapshotInventory::onCustomResolutionCommit, this, _1)); + getChild(getHeightSpinnerName())->setCommitCallback(boost::bind(&LLPanelSnapshotInventory::onCustomResolutionCommit, this, _1)); + getChild(getAspectRatioCBName())->setCommitCallback(boost::bind(&LLPanelSnapshotInventory::onKeepAspectRatioCommit, this, _1)); + return TRUE; +} + +// virtual +void LLPanelSnapshotInventory::onOpen(const LLSD& key) +{ +#if 0 + getChild(getImageSizeComboName())->selectNthItem(0); // FIXME? has no effect +#endif + updateCustomResControls(); +} + +void LLPanelSnapshotInventory::updateCustomResControls() +{ + LLComboBox* combo = getChild(getImageSizeComboName()); + S32 selected_idx = combo->getFirstSelectedIndex(); + bool show = selected_idx == 0 || selected_idx == (combo->getItemCount() - 1); // Current Window or Custom selected + + getChild(getWidthSpinnerName())->setVisible(show); + getChild(getHeightSpinnerName())->setVisible(show); + getChild(getAspectRatioCBName())->setVisible(show); +} + +// virtual +void LLPanelSnapshotInventory::updateControls(const LLSD& info) +{ + const bool have_snapshot = info.has("have-snapshot") ? info["have-snapshot"].asBoolean() : true; + getChild("save_btn")->setEnabled(have_snapshot); +} + +void LLPanelSnapshotInventory::onResolutionComboCommit(LLUICtrl* ctrl) +{ + updateCustomResControls(); + + LLSD info; + info["combo-res-change"]["control-name"] = ctrl->getName(); + LLFloaterSnapshot::getInstance()->notify(info); +} + +void LLPanelSnapshotInventory::onCustomResolutionCommit(LLUICtrl* ctrl) +{ + LLSD info; + info["w"] = getChild(getWidthSpinnerName())->getValue().asInteger();; + info["h"] = getChild(getHeightSpinnerName())->getValue().asInteger();; + LLFloaterSnapshot::getInstance()->notify(LLSD().with("custom-res-change", info)); +} + +void LLPanelSnapshotInventory::onKeepAspectRatioCommit(LLUICtrl* ctrl) +{ + LLFloaterSnapshot::getInstance()->notify(LLSD().with("keep-aspect-change", ctrl->getValue().asBoolean())); +} + +void LLPanelSnapshotInventory::onSend() +{ + // Switch to upload progress display. + LLSideTrayPanelContainer* parent = getParentContainer(); + if (parent) + { + parent->openPanel("panel_post_progress", LLSD().with("post-type", "inventory")); + } + + LLFloaterSnapshot::saveTexture(); +} + +void LLPanelSnapshotInventory::onCancel() +{ + LLSideTrayPanelContainer* parent = getParentContainer(); + if (parent) + { + parent->openPreviousPanel(); + } +} diff --git a/indra/newview/llpanelsnapshotlocal.cpp b/indra/newview/llpanelsnapshotlocal.cpp new file mode 100644 index 0000000000..5dc32d228f --- /dev/null +++ b/indra/newview/llpanelsnapshotlocal.cpp @@ -0,0 +1,209 @@ +/** + * @file llpanelsnapshotlocal.cpp + * @brief The panel provides UI for saving snapshot to a local folder. + * + * $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 "llcombobox.h" +#include "llsidetraypanelcontainer.h" +#include "llsliderctrl.h" +#include "llspinctrl.h" + +#include "llfloatersnapshot.h" // FIXME: replace with a snapshot storage model +#include "llpanelsnapshot.h" +#include "llviewercontrol.h" // gSavedSettings + +/** + * The panel provides UI for saving snapshot to a local folder. + */ +class LLPanelSnapshotLocal +: public LLPanelSnapshot +{ + LOG_CLASS(LLPanelSnapshotLocal); + +public: + LLPanelSnapshotLocal(); + /*virtual*/ BOOL postBuild(); + /*virtual*/ void onOpen(const LLSD& key); + +private: + /*virtual*/ std::string getWidthSpinnerName() const { return "local_snapshot_width"; } + /*virtual*/ std::string getHeightSpinnerName() const { return "local_snapshot_height"; } + /*virtual*/ std::string getAspectRatioCBName() const { return "local_keep_aspect_check"; } + /*virtual*/ std::string getImageSizeComboName() const { return "local_size_combo"; } + /*virtual*/ LLFloaterSnapshot::ESnapshotFormat getImageFormat() const; + /*virtual*/ void updateControls(const LLSD& info); + + void updateCustomResControls(); ///< Show/hide custom resolution controls (spinners and checkbox) + + void onFormatComboCommit(LLUICtrl* ctrl); + void onResolutionComboCommit(LLUICtrl* ctrl); + void onCustomResolutionCommit(LLUICtrl* ctrl); + void onKeepAspectRatioCommit(LLUICtrl* ctrl); + void onQualitySliderCommit(LLUICtrl* ctrl); + void onSend(); + void onCancel(); +}; + +static LLRegisterPanelClassWrapper panel_class("llpanelsnapshotlocal"); + +LLPanelSnapshotLocal::LLPanelSnapshotLocal() +{ + mCommitCallbackRegistrar.add("Local.Save", boost::bind(&LLPanelSnapshotLocal::onSend, this)); + mCommitCallbackRegistrar.add("Local.Cancel", boost::bind(&LLPanelSnapshotLocal::onCancel, this)); +} + +// virtual +BOOL LLPanelSnapshotLocal::postBuild() +{ + getChild(getImageSizeComboName())->setCommitCallback(boost::bind(&LLPanelSnapshotLocal::onResolutionComboCommit, this, _1)); + getChild(getWidthSpinnerName())->setCommitCallback(boost::bind(&LLPanelSnapshotLocal::onCustomResolutionCommit, this, _1)); + getChild(getHeightSpinnerName())->setCommitCallback(boost::bind(&LLPanelSnapshotLocal::onCustomResolutionCommit, this, _1)); + getChild(getAspectRatioCBName())->setCommitCallback(boost::bind(&LLPanelSnapshotLocal::onKeepAspectRatioCommit, this, _1)); + getChild("image_quality_slider")->setCommitCallback(boost::bind(&LLPanelSnapshotLocal::onQualitySliderCommit, this, _1)); + getChild("local_format_combo")->setCommitCallback(boost::bind(&LLPanelSnapshotLocal::onFormatComboCommit, this, _1)); + + updateControls(LLSD()); + + return TRUE; +} + +// virtual +void LLPanelSnapshotLocal::onOpen(const LLSD& key) +{ + updateCustomResControls(); +} + +// virtual +LLFloaterSnapshot::ESnapshotFormat LLPanelSnapshotLocal::getImageFormat() const +{ + LLFloaterSnapshot::ESnapshotFormat fmt = LLFloaterSnapshot::SNAPSHOT_FORMAT_PNG; + + LLComboBox* local_format_combo = getChild("local_format_combo"); + const std::string id = local_format_combo->getSelectedItemLabel(); + if (id == "PNG") + { + fmt = LLFloaterSnapshot::SNAPSHOT_FORMAT_PNG; + } + else if (id == "JPEG") + { + fmt = LLFloaterSnapshot::SNAPSHOT_FORMAT_JPEG; + } + else if (id == "BMP") + { + fmt = LLFloaterSnapshot::SNAPSHOT_FORMAT_BMP; + } + + return fmt; +} + +// virtual +void LLPanelSnapshotLocal::updateControls(const LLSD& info) +{ + LLFloaterSnapshot::ESnapshotFormat fmt = + (LLFloaterSnapshot::ESnapshotFormat) gSavedSettings.getS32("SnapshotFormat"); + getChild("local_format_combo")->selectNthItem((S32) fmt); + + const bool show_quality_ctrls = (fmt == LLFloaterSnapshot::SNAPSHOT_FORMAT_JPEG); + getChild("image_quality_slider")->setVisible(show_quality_ctrls); + getChild("image_quality_level")->setVisible(show_quality_ctrls); + + getChild("image_quality_slider")->setValue(gSavedSettings.getS32("SnapshotQuality")); + updateImageQualityLevel(); + + const bool have_snapshot = info.has("have-snapshot") ? info["have-snapshot"].asBoolean() : true; + getChild("save_btn")->setEnabled(have_snapshot); +} + +void LLPanelSnapshotLocal::updateCustomResControls() +{ + LLComboBox* combo = getChild(getImageSizeComboName()); + S32 selected_idx = combo->getFirstSelectedIndex(); + bool enable = selected_idx == 0 || selected_idx == (combo->getItemCount() - 1); // Current Window or Custom selected + + getChild(getWidthSpinnerName())->setEnabled(enable); + getChild(getWidthSpinnerName())->setAllowEdit(enable); + getChild(getHeightSpinnerName())->setEnabled(enable); + getChild(getHeightSpinnerName())->setAllowEdit(enable); + getChild(getAspectRatioCBName())->setEnabled(enable); +} + +void LLPanelSnapshotLocal::onFormatComboCommit(LLUICtrl* ctrl) +{ +#if 0 // redundant? + gSavedSettings.setS32("SnapshotFormat", ctrl->getValue().asInteger()); +#endif + + // will call updateControls() + LLFloaterSnapshot::getInstance()->notify(LLSD().with("image-format-change", true)); +} + +void LLPanelSnapshotLocal::onResolutionComboCommit(LLUICtrl* ctrl) +{ + updateCustomResControls(); + + LLSD info; + info["combo-res-change"]["control-name"] = ctrl->getName(); + LLFloaterSnapshot::getInstance()->notify(info); +} + +void LLPanelSnapshotLocal::onCustomResolutionCommit(LLUICtrl* ctrl) +{ + LLSD info; + info["w"] = getChild(getWidthSpinnerName())->getValue().asInteger(); + info["h"] = getChild(getHeightSpinnerName())->getValue().asInteger(); + LLFloaterSnapshot::getInstance()->notify(LLSD().with("custom-res-change", info)); +} + +void LLPanelSnapshotLocal::onKeepAspectRatioCommit(LLUICtrl* ctrl) +{ + LLFloaterSnapshot::getInstance()->notify(LLSD().with("keep-aspect-change", ctrl->getValue().asBoolean())); +} + +void LLPanelSnapshotLocal::onQualitySliderCommit(LLUICtrl* ctrl) +{ + updateImageQualityLevel(); + + LLSliderCtrl* slider = (LLSliderCtrl*)ctrl; + S32 quality_val = llfloor((F32)slider->getValue().asReal()); + LLSD info; + info["image-quality-change"] = quality_val; + LLFloaterSnapshot::getInstance()->notify(info); +} + +void LLPanelSnapshotLocal::onSend() +{ + LLFloaterSnapshot::saveLocal(); + onCancel(); +} + +void LLPanelSnapshotLocal::onCancel() +{ + LLSideTrayPanelContainer* parent = getParentContainer(); + if (parent) + { + parent->openPreviousPanel(); + } +} diff --git a/indra/newview/llpanelsnapshotoptions.cpp b/indra/newview/llpanelsnapshotoptions.cpp new file mode 100644 index 0000000000..8e5ff282b3 --- /dev/null +++ b/indra/newview/llpanelsnapshotoptions.cpp @@ -0,0 +1,94 @@ +/** + * @file llpanelsnapshotoptions.cpp + * @brief Snapshot posting options panel. + * + * $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 "llpanel.h" +#include "llsidetraypanelcontainer.h" + +#include "llfloatersnapshot.h" // FIXME: create a snapshot model + +/** + * Provides several ways to save a snapshot. + */ +class LLPanelSnapshotOptions +: public LLPanel +{ + LOG_CLASS(LLPanelSnapshotOptions); + +public: + LLPanelSnapshotOptions(); + +private: + void openPanel(const std::string& panel_name); + void onSaveToProfile(); + void onSaveToEmail(); + void onSaveToInventory(); + void onSaveToComputer(); +}; + +static LLRegisterPanelClassWrapper panel_class("llpanelsnapshotoptions"); + +LLPanelSnapshotOptions::LLPanelSnapshotOptions() +{ + mCommitCallbackRegistrar.add("Snapshot.SaveToProfile", boost::bind(&LLPanelSnapshotOptions::onSaveToProfile, this)); + mCommitCallbackRegistrar.add("Snapshot.SaveToEmail", boost::bind(&LLPanelSnapshotOptions::onSaveToEmail, this)); + mCommitCallbackRegistrar.add("Snapshot.SaveToInventory", boost::bind(&LLPanelSnapshotOptions::onSaveToInventory, this)); + mCommitCallbackRegistrar.add("Snapshot.SaveToComputer", boost::bind(&LLPanelSnapshotOptions::onSaveToComputer, this)); +} + +void LLPanelSnapshotOptions::openPanel(const std::string& panel_name) +{ + LLSideTrayPanelContainer* parent = dynamic_cast(getParent()); + if (!parent) + { + llwarns << "Cannot find panel container" << llendl; + return; + } + + parent->openPanel(panel_name); + LLFloaterSnapshot::postPanelSwitch(); +} + +void LLPanelSnapshotOptions::onSaveToProfile() +{ + openPanel("panel_snapshot_profile"); +} + +void LLPanelSnapshotOptions::onSaveToEmail() +{ + openPanel("panel_snapshot_postcard"); +} + +void LLPanelSnapshotOptions::onSaveToInventory() +{ + openPanel("panel_snapshot_inventory"); +} + +void LLPanelSnapshotOptions::onSaveToComputer() +{ + openPanel("panel_snapshot_local"); +} diff --git a/indra/newview/llpanelsnapshotpostcard.cpp b/indra/newview/llpanelsnapshotpostcard.cpp new file mode 100644 index 0000000000..c2b83d5c19 --- /dev/null +++ b/indra/newview/llpanelsnapshotpostcard.cpp @@ -0,0 +1,336 @@ +/** + * @file llpanelsnapshotpostcard.cpp + * @brief Postcard sending panel. + * + * $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 "llcombobox.h" +#include "llnotificationsutil.h" +#include "llsidetraypanelcontainer.h" +#include "llsliderctrl.h" +#include "llspinctrl.h" +#include "lltexteditor.h" + +#include "llagent.h" +#include "llagentui.h" +#include "llfloatersnapshot.h" // FIXME: replace with a snapshot storage model +#include "llpanelsnapshot.h" +#include "llpostcard.h" +#include "llviewercontrol.h" // gSavedSettings +#include "llviewerwindow.h" + +#include + +/** + * Sends postcard via email. + */ +class LLPanelSnapshotPostcard +: public LLPanelSnapshot +{ + LOG_CLASS(LLPanelSnapshotPostcard); + +public: + LLPanelSnapshotPostcard(); + /*virtual*/ BOOL postBuild(); + /*virtual*/ void onOpen(const LLSD& key); + /*virtual*/ S32 notify(const LLSD& info); + +private: + /*virtual*/ std::string getWidthSpinnerName() const { return "postcard_snapshot_width"; } + /*virtual*/ std::string getHeightSpinnerName() const { return "postcard_snapshot_height"; } + /*virtual*/ std::string getAspectRatioCBName() const { return "postcard_keep_aspect_check"; } + /*virtual*/ std::string getImageSizeComboName() const { return "postcard_size_combo"; } + /*virtual*/ void updateControls(const LLSD& info); + + void updateCustomResControls(); ///< Enable/disable custom resolution controls (spinners and checkbox) + bool missingSubjMsgAlertCallback(const LLSD& notification, const LLSD& response); + void sendPostcard(); + + void onMsgFormFocusRecieved(); + void onFormatComboCommit(LLUICtrl* ctrl); + void onResolutionComboCommit(LLUICtrl* ctrl); + void onCustomResolutionCommit(LLUICtrl* ctrl); + void onKeepAspectRatioCommit(LLUICtrl* ctrl); + void onQualitySliderCommit(LLUICtrl* ctrl); + void onTabButtonPress(S32 btn_idx); + void onSend(); + void onCancel(); + + bool mHasFirstMsgFocus; +}; + +static LLRegisterPanelClassWrapper panel_class("llpanelsnapshotpostcard"); + +LLPanelSnapshotPostcard::LLPanelSnapshotPostcard() +: mHasFirstMsgFocus(false) +{ + mCommitCallbackRegistrar.add("Postcard.Send", boost::bind(&LLPanelSnapshotPostcard::onSend, this)); + mCommitCallbackRegistrar.add("Postcard.Cancel", boost::bind(&LLPanelSnapshotPostcard::onCancel, this)); + mCommitCallbackRegistrar.add("Postcard.Message", boost::bind(&LLPanelSnapshotPostcard::onTabButtonPress, this, 0)); + mCommitCallbackRegistrar.add("Postcard.Settings", boost::bind(&LLPanelSnapshotPostcard::onTabButtonPress, this, 1)); + +} + +// virtual +BOOL LLPanelSnapshotPostcard::postBuild() +{ + // pick up the user's up-to-date email address + gAgent.sendAgentUserInfoRequest(); + + getChildView("from_form")->setEnabled(FALSE); + + std::string name_string; + LLAgentUI::buildFullname(name_string); + getChild("name_form")->setValue(LLSD(name_string)); + + // For the first time a user focuses to .the msg box, all text will be selected. + getChild("msg_form")->setFocusChangedCallback(boost::bind(&LLPanelSnapshotPostcard::onMsgFormFocusRecieved, this)); + + getChild("to_form")->setFocus(TRUE); + + getChild(getImageSizeComboName())->setCommitCallback(boost::bind(&LLPanelSnapshotPostcard::onResolutionComboCommit, this, _1)); + getChild(getWidthSpinnerName())->setCommitCallback(boost::bind(&LLPanelSnapshotPostcard::onCustomResolutionCommit, this, _1)); + getChild(getHeightSpinnerName())->setCommitCallback(boost::bind(&LLPanelSnapshotPostcard::onCustomResolutionCommit, this, _1)); + getChild(getAspectRatioCBName())->setCommitCallback(boost::bind(&LLPanelSnapshotPostcard::onKeepAspectRatioCommit, this, _1)); + getChild("image_quality_slider")->setCommitCallback(boost::bind(&LLPanelSnapshotPostcard::onQualitySliderCommit, this, _1)); + + getChild("message_btn")->setToggleState(TRUE); + + updateControls(LLSD()); + + return TRUE; +} + +// virtual +void LLPanelSnapshotPostcard::onOpen(const LLSD& key) +{ + gSavedSettings.setS32("SnapshotFormat", getImageFormat()); + updateCustomResControls(); +} + +// virtual +S32 LLPanelSnapshotPostcard::notify(const LLSD& info) +{ + if (!info.has("agent-email")) + { + llassert(info.has("agent-email")); + return 0; + } + + LLUICtrl* from_input = getChild("from_form"); + const std::string& text = from_input->getValue().asString(); + if (text.empty()) + { + // there's no text in this field yet, pre-populate + from_input->setValue(info["agent-email"]); + } + + return 1; +} + +// virtual +void LLPanelSnapshotPostcard::updateControls(const LLSD& info) +{ + getChild("image_quality_slider")->setValue(gSavedSettings.getS32("SnapshotQuality")); + updateImageQualityLevel(); + + const bool have_snapshot = info.has("have-snapshot") ? info["have-snapshot"].asBoolean() : true; + getChild("send_btn")->setEnabled(have_snapshot); +} + +void LLPanelSnapshotPostcard::updateCustomResControls() +{ + LLComboBox* combo = getChild(getImageSizeComboName()); + S32 selected_idx = combo->getFirstSelectedIndex(); + bool enable = selected_idx == 0 || selected_idx == (combo->getItemCount() - 1); // Current Window or Custom selected + + getChild(getWidthSpinnerName())->setEnabled(enable); + getChild(getWidthSpinnerName())->setAllowEdit(enable); + getChild(getHeightSpinnerName())->setEnabled(enable); + getChild(getHeightSpinnerName())->setAllowEdit(enable); + getChild(getAspectRatioCBName())->setEnabled(enable); +} + +bool LLPanelSnapshotPostcard::missingSubjMsgAlertCallback(const LLSD& notification, const LLSD& response) +{ + S32 option = LLNotificationsUtil::getSelectedOption(notification, response); + if(0 == option) + { + // User clicked OK + if((getChild("subject_form")->getValue().asString()).empty()) + { + // Stuff the subject back into the form. + getChild("subject_form")->setValue(getString("default_subject")); + } + + if (!mHasFirstMsgFocus) + { + // The user never switched focus to the message window. + // Using the default string. + getChild("msg_form")->setValue(getString("default_message")); + } + + sendPostcard(); + } + return false; +} + + +void LLPanelSnapshotPostcard::sendPostcard() +{ + std::string from(getChild("from_form")->getValue().asString()); + std::string to(getChild("to_form")->getValue().asString()); + std::string subject(getChild("subject_form")->getValue().asString()); + + LLSD postcard = LLSD::emptyMap(); + postcard["pos-global"] = LLFloaterSnapshot::getPosTakenGlobal().getValue(); + postcard["to"] = to; + postcard["from"] = from; + postcard["name"] = getChild("name_form")->getValue().asString(); + postcard["subject"] = subject; + postcard["msg"] = getChild("msg_form")->getValue().asString(); + LLPostCard::send(LLFloaterSnapshot::getImageData(), postcard); + LLFloaterSnapshot::postSave(); + + // Give user feedback of the event. + gViewerWindow->playSnapshotAnimAndSound(); + + // Switch to upload progress display. + LLSideTrayPanelContainer* parent = getParentContainer(); + if (parent) + { + parent->openPanel("panel_post_progress", LLSD().with("post-type", "postcard")); + } +} + +void LLPanelSnapshotPostcard::onMsgFormFocusRecieved() +{ + LLTextEditor* msg_form = getChild("msg_form"); + if (msg_form->hasFocus() && !mHasFirstMsgFocus) + { + mHasFirstMsgFocus = true; + msg_form->setText(LLStringUtil::null); + } +} + +void LLPanelSnapshotPostcard::onFormatComboCommit(LLUICtrl* ctrl) +{ + // will call updateControls() + LLFloaterSnapshot::getInstance()->notify(LLSD().with("image-format-change", true)); +} + +void LLPanelSnapshotPostcard::onResolutionComboCommit(LLUICtrl* ctrl) +{ + updateCustomResControls(); + + LLSD info; + info["combo-res-change"]["control-name"] = ctrl->getName(); + LLFloaterSnapshot::getInstance()->notify(info); +} + +void LLPanelSnapshotPostcard::onCustomResolutionCommit(LLUICtrl* ctrl) +{ + LLSD info; + info["w"] = getChild(getWidthSpinnerName())->getValue().asInteger(); + info["h"] = getChild(getHeightSpinnerName())->getValue().asInteger(); + LLFloaterSnapshot::getInstance()->notify(LLSD().with("custom-res-change", info)); +} + +void LLPanelSnapshotPostcard::onKeepAspectRatioCommit(LLUICtrl* ctrl) +{ + LLFloaterSnapshot::getInstance()->notify(LLSD().with("keep-aspect-change", ctrl->getValue().asBoolean())); +} + +void LLPanelSnapshotPostcard::onQualitySliderCommit(LLUICtrl* ctrl) +{ + updateImageQualityLevel(); + + LLSliderCtrl* slider = (LLSliderCtrl*)ctrl; + S32 quality_val = llfloor((F32)slider->getValue().asReal()); + LLSD info; + info["image-quality-change"] = quality_val; + LLFloaterSnapshot::getInstance()->notify(info); // updates the "SnapshotQuality" setting +} + +void LLPanelSnapshotPostcard::onTabButtonPress(S32 btn_idx) +{ + static LLButton* sButtons[2] = { + getChild("message_btn"), + getChild("settings_btn"), + }; + + // Switch between Message and Settings tabs. + LLButton* clicked_btn = sButtons[btn_idx]; + LLButton* other_btn = sButtons[!btn_idx]; + LLSideTrayPanelContainer* container = + getChild("postcard_panel_container"); + + container->selectTab(clicked_btn->getToggleState() ? btn_idx : !btn_idx); + //clicked_btn->setEnabled(FALSE); + other_btn->toggleState(); + //other_btn->setEnabled(TRUE); + + lldebugs << "Button #" << btn_idx << " (" << clicked_btn->getName() << ") clicked" << llendl; +} + +void LLPanelSnapshotPostcard::onSend() +{ + // Validate input. + std::string from(getChild("from_form")->getValue().asString()); + std::string to(getChild("to_form")->getValue().asString()); + + boost::regex email_format("[A-Za-z0-9.%+-_]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}(,[ \t]*[A-Za-z0-9.%+-_]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,})*"); + + if (to.empty() || !boost::regex_match(to, email_format)) + { + LLNotificationsUtil::add("PromptRecipientEmail"); + return; + } + + if (from.empty() || !boost::regex_match(from, email_format)) + { + LLNotificationsUtil::add("PromptSelfEmail"); + return; + } + + std::string subject(getChild("subject_form")->getValue().asString()); + if(subject.empty() || !mHasFirstMsgFocus) + { + LLNotificationsUtil::add("PromptMissingSubjMsg", LLSD(), LLSD(), boost::bind(&LLPanelSnapshotPostcard::missingSubjMsgAlertCallback, this, _1, _2)); + return; + } + + // Send postcard. + sendPostcard(); +} + +void LLPanelSnapshotPostcard::onCancel() +{ + LLSideTrayPanelContainer* parent = getParentContainer(); + if (parent) + { + parent->openPreviousPanel(); + } +} diff --git a/indra/newview/llpanelsnapshotprofile.cpp b/indra/newview/llpanelsnapshotprofile.cpp new file mode 100644 index 0000000000..80a379a5a0 --- /dev/null +++ b/indra/newview/llpanelsnapshotprofile.cpp @@ -0,0 +1,162 @@ +/** + * @file llpanelsnapshotprofile.cpp + * @brief Posts a snapshot to My Profile feed. + * + * $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" + +// libs +#include "llcombobox.h" +#include "llfloaterreg.h" +#include "llpanel.h" +#include "llspinctrl.h" + +// newview +#include "llfloatersnapshot.h" +#include "llpanelsnapshot.h" +#include "llsidetraypanelcontainer.h" +#include "llwebprofile.h" + +/** + * Posts a snapshot to My Profile feed. + */ +class LLPanelSnapshotProfile +: public LLPanelSnapshot +{ + LOG_CLASS(LLPanelSnapshotProfile); + +public: + LLPanelSnapshotProfile(); + + /*virtual*/ BOOL postBuild(); + /*virtual*/ void onOpen(const LLSD& key); + +private: + /*virtual*/ std::string getWidthSpinnerName() const { return "profile_snapshot_width"; } + /*virtual*/ std::string getHeightSpinnerName() const { return "profile_snapshot_height"; } + /*virtual*/ std::string getAspectRatioCBName() const { return "profile_keep_aspect_check"; } + /*virtual*/ std::string getImageSizeComboName() const { return "profile_size_combo"; } + /*virtual*/ void updateControls(const LLSD& info); + + void updateCustomResControls(); ///< Enable/disable custom resolution controls (spinners and checkbox) + + void onSend(); + void onCancel(); + void onResolutionComboCommit(LLUICtrl* ctrl); + void onCustomResolutionCommit(LLUICtrl* ctrl); + void onKeepAspectRatioCommit(LLUICtrl* ctrl); +}; + +static LLRegisterPanelClassWrapper panel_class("llpanelsnapshotprofile"); + +LLPanelSnapshotProfile::LLPanelSnapshotProfile() +{ + mCommitCallbackRegistrar.add("PostToProfile.Send", boost::bind(&LLPanelSnapshotProfile::onSend, this)); + mCommitCallbackRegistrar.add("PostToProfile.Cancel", boost::bind(&LLPanelSnapshotProfile::onCancel, this)); +} + +// virtual +BOOL LLPanelSnapshotProfile::postBuild() +{ + getChild(getImageSizeComboName())->setCommitCallback(boost::bind(&LLPanelSnapshotProfile::onResolutionComboCommit, this, _1)); + getChild(getWidthSpinnerName())->setCommitCallback(boost::bind(&LLPanelSnapshotProfile::onCustomResolutionCommit, this, _1)); + getChild(getHeightSpinnerName())->setCommitCallback(boost::bind(&LLPanelSnapshotProfile::onCustomResolutionCommit, this, _1)); + getChild(getAspectRatioCBName())->setCommitCallback(boost::bind(&LLPanelSnapshotProfile::onKeepAspectRatioCommit, this, _1)); + return TRUE; +} + +// virtual +void LLPanelSnapshotProfile::onOpen(const LLSD& key) +{ + updateCustomResControls(); +} + +// virtual +void LLPanelSnapshotProfile::updateControls(const LLSD& info) +{ + const bool have_snapshot = info.has("have-snapshot") ? info["have-snapshot"].asBoolean() : true; + getChild("post_btn")->setEnabled(have_snapshot); +} + +void LLPanelSnapshotProfile::updateCustomResControls() ///< Enable/disable custom resolution controls (spinners and checkbox) +{ + LLComboBox* combo = getChild(getImageSizeComboName()); + S32 selected_idx = combo->getFirstSelectedIndex(); + bool enable = selected_idx == 0 || selected_idx == (combo->getItemCount() - 1); // Current Window or Custom selected + + getChild(getWidthSpinnerName())->setEnabled(enable); + getChild(getWidthSpinnerName())->setAllowEdit(enable); + getChild(getHeightSpinnerName())->setEnabled(enable); + getChild(getHeightSpinnerName())->setAllowEdit(enable); + getChild(getAspectRatioCBName())->setEnabled(enable); +} + +void LLPanelSnapshotProfile::onSend() +{ + std::string caption = getChild("caption")->getValue().asString(); + bool add_location = getChild("add_location_cb")->getValue().asBoolean(); + + LLWebProfile::uploadImage(LLFloaterSnapshot::getImageData(), caption, add_location); + LLFloaterSnapshot::postSave(); + + // Switch to upload progress display. + LLSideTrayPanelContainer* parent = getParentContainer(); + if (parent) + { + parent->openPanel("panel_post_progress", LLSD().with("post-type", "profile")); + } +} + +void LLPanelSnapshotProfile::onCancel() +{ + LLSideTrayPanelContainer* parent = getParentContainer(); + if (parent) + { + parent->openPreviousPanel(); + } +} + +void LLPanelSnapshotProfile::onResolutionComboCommit(LLUICtrl* ctrl) +{ + updateCustomResControls(); + + LLSD info; + info["combo-res-change"]["control-name"] = ctrl->getName(); + LLFloaterSnapshot::getInstance()->notify(info); +} + +void LLPanelSnapshotProfile::onCustomResolutionCommit(LLUICtrl* ctrl) +{ + S32 w = getChild(getWidthSpinnerName())->getValue().asInteger(); + S32 h = getChild(getHeightSpinnerName())->getValue().asInteger(); + LLSD info; + info["w"] = w; + info["h"] = h; + LLFloaterSnapshot::getInstance()->notify(LLSD().with("custom-res-change", info)); +} + +void LLPanelSnapshotProfile::onKeepAspectRatioCommit(LLUICtrl* ctrl) +{ + LLFloaterSnapshot::getInstance()->notify(LLSD().with("keep-aspect-change", ctrl->getValue().asBoolean())); +} diff --git a/indra/newview/llpostcard.cpp b/indra/newview/llpostcard.cpp new file mode 100644 index 0000000000..5f57f3a856 --- /dev/null +++ b/indra/newview/llpostcard.cpp @@ -0,0 +1,160 @@ +/** + * @file llpostcard.cpp + * @brief Sending postcards. + * + * $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 "llpostcard.h" + +#include "llvfile.h" +#include "llvfs.h" +#include "llviewerregion.h" + +#include "message.h" + +#include "llagent.h" +#include "llassetuploadresponders.h" + +/////////////////////////////////////////////////////////////////////////////// +// misc + +static void postcard_upload_callback(const LLUUID& asset_id, void *user_data, S32 result, LLExtStat ext_status) +{ + LLSD* postcard_data = (LLSD*)user_data; + + if (result) + { + // TODO: display the error messages in UI + llwarns << "Failed to send postcard: " << LLAssetStorage::getErrorString(result) << llendl; + LLPostCard::reportPostResult(false); + } + else + { + // only create the postcard once the upload succeeds + + // request the postcard + const LLSD& data = *postcard_data; + LLMessageSystem* msg = gMessageSystem; + msg->newMessage("SendPostcard"); + msg->nextBlock("AgentData"); + msg->addUUID("AgentID", gAgent.getID()); + msg->addUUID("SessionID", gAgent.getSessionID()); + msg->addUUID("AssetID", data["asset-id"].asUUID()); + msg->addVector3d("PosGlobal", LLVector3d(data["pos-global"])); + msg->addString("To", data["to"]); + msg->addString("From", data["from"]); + msg->addString("Name", data["name"]); + msg->addString("Subject", data["subject"]); + msg->addString("Msg", data["msg"]); + msg->addBOOL("AllowPublish", FALSE); + msg->addBOOL("MaturePublish", FALSE); + gAgent.sendReliableMessage(); + + LLPostCard::reportPostResult(true); + } + + delete postcard_data; +} + + +/////////////////////////////////////////////////////////////////////////////// +// LLPostcardSendResponder + +class LLPostcardSendResponder : public LLAssetUploadResponder +{ + LOG_CLASS(LLPostcardSendResponder); + +public: + LLPostcardSendResponder(const LLSD &post_data, + const LLUUID& vfile_id, + LLAssetType::EType asset_type): + LLAssetUploadResponder(post_data, vfile_id, asset_type) + { + } + + /*virtual*/ void uploadComplete(const LLSD& content) + { + llinfos << "Postcard sent" << llendl; + LL_DEBUGS("Snapshots") << "content: " << content << llendl; + LLPostCard::reportPostResult(true); + } + + /*virtual*/ void uploadFailure(const LLSD& content) + { + llwarns << "Sending postcard failed: " << content << llendl; + LLPostCard::reportPostResult(false); + } +}; + +/////////////////////////////////////////////////////////////////////////////// +// LLPostCard + +LLPostCard::result_callback_t LLPostCard::mResultCallback; + +// static +void LLPostCard::send(LLPointer image, const LLSD& postcard_data) +{ +#if 0 + static LLTransactionID transaction_id; + static LLAssetID asset_id; +#else + LLTransactionID transaction_id; + LLAssetID asset_id; +#endif + + transaction_id.generate(); + asset_id = transaction_id.makeAssetID(gAgent.getSecureSessionID()); + LLVFile::writeFile(image->getData(), image->getDataSize(), gVFS, asset_id, LLAssetType::AT_IMAGE_JPEG); + + // upload the image + std::string url = gAgent.getRegion()->getCapability("SendPostcard"); + if (!url.empty()) + { + llinfos << "Sending postcard via capability" << llendl; + // the capability already encodes: agent ID, region ID + LL_DEBUGS("Snapshots") << "url: " << url << llendl; + LL_DEBUGS("Snapshots") << "body: " << postcard_data << llendl; + LL_DEBUGS("Snapshots") << "data size: " << image->getDataSize() << llendl; + LLHTTPClient::post(url, postcard_data, + new LLPostcardSendResponder(postcard_data, asset_id, LLAssetType::AT_IMAGE_JPEG)); + } + else + { + llinfos << "Sending postcard" << llendl; + LLSD* data = new LLSD(postcard_data); + (*data)["asset-id"] = asset_id; + gAssetStorage->storeAssetData(transaction_id, LLAssetType::AT_IMAGE_JPEG, + &postcard_upload_callback, (void *)data, FALSE); + } +} + +// static +void LLPostCard::reportPostResult(bool ok) +{ + if (mResultCallback) + { + mResultCallback(ok); + } +} diff --git a/indra/newview/llpostcard.h b/indra/newview/llpostcard.h new file mode 100644 index 0000000000..0eb118b906 --- /dev/null +++ b/indra/newview/llpostcard.h @@ -0,0 +1,48 @@ +/** + * @file llpostcard.h + * @brief Sending postcards. + * + * $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_LLPOSTCARD_H +#define LL_LLPOSTCARD_H + +#include "llimage.h" +#include "lluuid.h" + +class LLPostCard +{ + LOG_CLASS(LLPostCard); + +public: + typedef boost::function result_callback_t; + + static void send(LLPointer image, const LLSD& postcard_data); + static void setPostResultCallback(result_callback_t cb) { mResultCallback = cb; } + static void reportPostResult(bool ok); + +private: + static result_callback_t mResultCallback; +}; + +#endif // LL_LLPOSTCARD_H diff --git a/indra/newview/llsidetraypanelcontainer.cpp b/indra/newview/llsidetraypanelcontainer.cpp index 95a12c7c23..e340333c2c 100644 --- a/indra/newview/llsidetraypanelcontainer.cpp +++ b/indra/newview/llsidetraypanelcontainer.cpp @@ -62,6 +62,13 @@ void LLSideTrayPanelContainer::onOpen(const LLSD& key) getCurrentPanel()->onOpen(key); } +void LLSideTrayPanelContainer::openPanel(const std::string& panel_name, const LLSD& key) +{ + LLSD combined_key = key; + combined_key[PARAM_SUB_PANEL_NAME] = panel_name; + onOpen(combined_key); +} + void LLSideTrayPanelContainer::openPreviousPanel() { if(!mDefaultPanelName.empty()) diff --git a/indra/newview/llsidetraypanelcontainer.h b/indra/newview/llsidetraypanelcontainer.h index 14269b002b..93a85ed374 100644 --- a/indra/newview/llsidetraypanelcontainer.h +++ b/indra/newview/llsidetraypanelcontainer.h @@ -56,6 +56,11 @@ public: */ /*virtual*/ void onOpen(const LLSD& key); + /** + * Opens given subpanel. + */ + void openPanel(const std::string& panel_name, const LLSD& key = LLSD::emptyMap()); + /** * Opens previous panel from panel navigation history. */ diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp index c761969fcf..74c4f6d2dc 100644 --- a/indra/newview/llviewerfloaterreg.cpp +++ b/indra/newview/llviewerfloaterreg.cpp @@ -85,7 +85,6 @@ #include "llfloateropenobject.h" #include "llfloaterpay.h" #include "llfloaterperms.h" -#include "llfloaterpostcard.h" #include "llfloaterpostprocess.h" #include "llfloaterpreference.h" #include "llfloaterproperties.h" @@ -245,7 +244,6 @@ void LLViewerFloaterReg::registerFloaters() LLFloaterReg::add("people", "floater_people.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); LLFloaterReg::add("places", "floater_places.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); - LLFloaterReg::add("postcard", "floater_postcard.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); LLFloaterReg::add("preferences", "floater_preferences.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); LLFloaterReg::add("prefs_proxy", "floater_preferences_proxy.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); LLFloaterReg::add("prefs_hardware_settings", "floater_hardware_settings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build); diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp index 41b4dc01e8..5afd481dda 100644 --- a/indra/newview/llviewermedia.cpp +++ b/indra/newview/llviewermedia.cpp @@ -50,6 +50,7 @@ #include "llvoavatar.h" #include "llvoavatarself.h" #include "llviewerregion.h" +#include "llwebprofile.h" #include "llwebsharing.h" // For LLWebSharing::setOpenIDCookie(), *TODO: find a better way to do this! #include "llfilepicker.h" #include "llnotifications.h" @@ -319,6 +320,10 @@ public: std::string cookie = content["set-cookie"].asString(); LLViewerMedia::getCookieStore()->setCookiesFromHost(cookie, mHost); + + // Set cookie for snapshot publishing. + std::string auth_cookie = cookie.substr(0, cookie.find(";")); // strip path + LLWebProfile::setAuthCookie(auth_cookie); } void completedRaw( @@ -1484,6 +1489,8 @@ void LLViewerMedia::setOpenIDCookie() std::string profile_url = getProfileURL(""); LLURL raw_profile_url( profile_url.c_str() ); + LL_DEBUGS("MediaAuth") << "Requesting " << profile_url << llendl; + LL_DEBUGS("MediaAuth") << "sOpenIDCookie = [" << sOpenIDCookie << "]" << llendl; LLHTTPClient::get(profile_url, new LLViewerMediaWebProfileResponder(raw_profile_url.getAuthority()), headers); diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp index b9293b3b31..7e830e14bf 100644 --- a/indra/newview/llviewermenufile.cpp +++ b/indra/newview/llviewermenufile.cpp @@ -528,23 +528,7 @@ class LLFileTakeSnapshotToDisk : public view_listener_t { gViewerWindow->playSnapshotAnimAndSound(); - LLPointer formatted; - switch(LLFloaterSnapshot::ESnapshotFormat(gSavedSettings.getS32("SnapshotFormat"))) - { - case LLFloaterSnapshot::SNAPSHOT_FORMAT_JPEG: - formatted = new LLImageJPEG(gSavedSettings.getS32("SnapshotQuality")); - break; - case LLFloaterSnapshot::SNAPSHOT_FORMAT_PNG: - formatted = new LLImagePNG; - break; - case LLFloaterSnapshot::SNAPSHOT_FORMAT_BMP: - formatted = new LLImageBMP; - break; - default: - llwarns << "Unknown Local Snapshot format" << llendl; - return true; - } - + LLPointer formatted = new LLImagePNG; formatted->enableOverSize() ; formatted->encode(raw, 0); formatted->disableOverSize() ; diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index a9ca70fd26..7cae19a1d2 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -59,9 +59,9 @@ #include "llfloaterland.h" #include "llfloaterregioninfo.h" #include "llfloaterlandholdings.h" -#include "llfloaterpostcard.h" #include "llfloaterpreference.h" #include "llfloatersidepanelcontainer.h" +#include "llfloatersnapshot.h" #include "llhudeffecttrail.h" #include "llhudmanager.h" #include "llinventoryfunctions.h" @@ -6470,7 +6470,7 @@ void process_user_info_reply(LLMessageSystem* msg, void**) msg->getString( "UserData", "DirectoryVisibility", dir_visibility); LLFloaterPreference::updateUserInfo(dir_visibility, im_via_email, email); - LLFloaterPostcard::updateUserInfo(email); + LLFloaterSnapshot::setAgentEmail(email); } diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 6fcbc401af..c20bc5f02f 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -4020,10 +4020,11 @@ BOOL LLViewerWindow::mousePointOnLandGlobal(const S32 x, const S32 y, LLVector3d } // Saves an image to the harddrive as "SnapshotX" where X >= 1. -BOOL LLViewerWindow::saveImageNumbered(LLImageFormatted *image) +BOOL LLViewerWindow::saveImageNumbered(LLImageFormatted *image, bool force_picker) { if (!image) { + llwarns << "No image to save" << llendl; return FALSE; } @@ -4043,7 +4044,7 @@ BOOL LLViewerWindow::saveImageNumbered(LLImageFormatted *image) pick_type = LLFilePicker::FFSAVE_ALL; // ??? // Get a base file location if needed. - if ( ! isSnapshotLocSet()) + if (force_picker || !isSnapshotLocSet()) { std::string proposed_name( sSnapshotBaseName ); @@ -4083,6 +4084,7 @@ BOOL LLViewerWindow::saveImageNumbered(LLImageFormatted *image) } while( -1 != err ); // search until the file is not found (i.e., stat() gives an error). + llinfos << "Saving snapshot to " << filepath << llendl; return image->save(filepath); } diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h index d10b06f121..0cb7f82b58 100644 --- a/indra/newview/llviewerwindow.h +++ b/indra/newview/llviewerwindow.h @@ -324,7 +324,7 @@ public: BOOL thumbnailSnapshot(LLImageRaw *raw, S32 preview_width, S32 preview_height, BOOL show_ui, BOOL do_rebuild, ESnapshotType type) ; BOOL isSnapshotLocSet() const { return ! sSnapshotDir.empty(); } void resetSnapshotLoc() const { sSnapshotDir.clear(); } - BOOL saveImageNumbered(LLImageFormatted *image); + BOOL saveImageNumbered(LLImageFormatted *image, bool force_picker = false); // Reset the directory where snapshots are saved. // Client will open directory picker on next snapshot save. diff --git a/indra/newview/llwebprofile.cpp b/indra/newview/llwebprofile.cpp new file mode 100644 index 0000000000..bb8a9a491b --- /dev/null +++ b/indra/newview/llwebprofile.cpp @@ -0,0 +1,297 @@ +/** + * @file llwebprofile.cpp + * @brief Web profile access. + * + * $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 "llwebprofile.h" + +// libs +#include "llbufferstream.h" +#include "llhttpclient.h" +#include "llplugincookiestore.h" + +// newview +#include "llpanelprofile.h" // for getProfileURL(). FIXME: move the method to LLAvatarActions +#include "llviewermedia.h" // FIXME: don't use LLViewerMedia internals + +// third-party +#include "reader.h" // JSON + +/* + * Workflow: + * 1. LLViewerMedia::setOpenIDCookie() + * -> GET https://my-demo.secondlife.com/ via LLViewerMediaWebProfileResponder + * -> LLWebProfile::setAuthCookie() + * 2. LLWebProfile::uploadImage() + * -> GET "https://my-demo.secondlife.com/snapshots/s3_upload_config" via ConfigResponder + * 3. LLWebProfile::post() + * -> POST via PostImageResponder + * -> redirect + * -> GET via PostImageRedirectResponder + */ + +/////////////////////////////////////////////////////////////////////////////// +// LLWebProfileResponders::ConfigResponder + +class LLWebProfileResponders::ConfigResponder : public LLHTTPClient::Responder +{ + LOG_CLASS(LLWebProfileResponders::ConfigResponder); + +public: + ConfigResponder(LLPointer imagep) + : mImagep(imagep) + { + } + + /*virtual*/ void completedRaw( + U32 status, + const std::string& reason, + const LLChannelDescriptors& channels, + const LLIOPipe::buffer_ptr_t& buffer) + { + LLBufferStream istr(channels, buffer.get()); + std::stringstream strstrm; + strstrm << istr.rdbuf(); + const std::string body = strstrm.str(); + + if (status != 200) + { + llwarns << "Failed to get upload config (" << status << ")" << llendl; + LLWebProfile::reportImageUploadStatus(false); + return; + } + + Json::Value root; + Json::Reader reader; + if (!reader.parse(body, root)) + { + llwarns << "Failed to parse upload config: " << reader.getFormatedErrorMessages() << llendl; + LLWebProfile::reportImageUploadStatus(false); + return; + } + + // *TODO: 404 = not supported by the grid + // *TODO: increase timeout or handle 499 Expired + + // Convert config to LLSD. + const Json::Value data = root["data"]; + const std::string upload_url = root["url"].asString(); + LLSD config; + config["acl"] = data["acl"].asString(); + config["AWSAccessKeyId"] = data["AWSAccessKeyId"].asString(); + config["Content-Type"] = data["Content-Type"].asString(); + config["key"] = data["key"].asString(); + config["policy"] = data["policy"].asString(); + config["success_action_redirect"] = data["success_action_redirect"].asString(); + config["signature"] = data["signature"].asString(); + config["add_loc"] = data.get("add_loc", "0").asString(); + config["caption"] = data.get("caption", "").asString(); + + // Do the actual image upload using the configuration. + LL_DEBUGS("Snapshots") << "Got upload config, POSTing image to " << upload_url << ", config=[" << config << "]" << llendl; + LLWebProfile::post(mImagep, config, upload_url); + } + +private: + LLPointer mImagep; +}; + +/////////////////////////////////////////////////////////////////////////////// +// LLWebProfilePostImageRedirectResponder +class LLWebProfileResponders::PostImageRedirectResponder : public LLHTTPClient::Responder +{ + LOG_CLASS(LLWebProfileResponders::PostImageRedirectResponder); + +public: + /*virtual*/ void completedRaw( + U32 status, + const std::string& reason, + const LLChannelDescriptors& channels, + const LLIOPipe::buffer_ptr_t& buffer) + { + if (status != 200) + { + llwarns << "Failed to upload image: " << status << " " << reason << llendl; + LLWebProfile::reportImageUploadStatus(false); + return; + } + + LLBufferStream istr(channels, buffer.get()); + std::stringstream strstrm; + strstrm << istr.rdbuf(); + const std::string body = strstrm.str(); + llinfos << "Image uploaded." << llendl; + LL_DEBUGS("Snapshots") << "Uploading image succeeded. Response: [" << body << "]" << llendl; + LLWebProfile::reportImageUploadStatus(true); + } + +private: + LLPointer mImagep; +}; + + +/////////////////////////////////////////////////////////////////////////////// +// LLWebProfileResponders::PostImageResponder +class LLWebProfileResponders::PostImageResponder : public LLHTTPClient::Responder +{ + LOG_CLASS(LLWebProfileResponders::PostImageResponder); + +public: + /*virtual*/ void completedHeader(U32 status, const std::string& reason, const LLSD& content) + { + // Viewer seems to fail to follow a 303 redirect on POST request + // (URLRequest Error: 65, Send failed since rewinding of the data stream failed). + // Handle it manually. + if (status == 303) + { + LLSD headers = LLViewerMedia::getHeaders(); + headers["Cookie"] = LLWebProfile::getAuthCookie(); + const std::string& redir_url = content["location"]; + LL_DEBUGS("Snapshots") << "Got redirection URL: " << redir_url << llendl; + LLHTTPClient::get(redir_url, new LLWebProfileResponders::PostImageRedirectResponder, headers); + } + else + { + llwarns << "Unexpected POST status: " << status << " " << reason << llendl; + LL_DEBUGS("Snapshots") << "headers: [" << content << "]" << llendl; + LLWebProfile::reportImageUploadStatus(false); + } + } + + // Override just to suppress warnings. + /*virtual*/ void completedRaw(U32 status, const std::string& reason, + const LLChannelDescriptors& channels, + const LLIOPipe::buffer_ptr_t& buffer) + { + } +}; + +/////////////////////////////////////////////////////////////////////////////// +// LLWebProfile + +std::string LLWebProfile::sAuthCookie; +LLWebProfile::status_callback_t LLWebProfile::mStatusCallback; + +// static +void LLWebProfile::uploadImage(LLPointer image, const std::string& caption, bool add_location) +{ + // Get upload configuration data. + std::string config_url(getProfileURL(LLStringUtil::null) + "snapshots/s3_upload_config"); + config_url += "?caption=" + LLURI::escape(caption); + config_url += "&add_loc=" + std::string(add_location ? "1" : "0"); + + LL_DEBUGS("Snapshots") << "Requesting " << config_url << llendl; + LLSD headers = LLViewerMedia::getHeaders(); + headers["Cookie"] = getAuthCookie(); + LLHTTPClient::get(config_url, new LLWebProfileResponders::ConfigResponder(image), headers); +} + +// static +void LLWebProfile::setAuthCookie(const std::string& cookie) +{ + LL_DEBUGS("Snapshots") << "Setting auth cookie: " << cookie << llendl; + sAuthCookie = cookie; +} + +// static +void LLWebProfile::post(LLPointer image, const LLSD& config, const std::string& url) +{ + // *TODO: make sure it's a jpeg? + + const std::string boundary = "----------------------------0123abcdefab"; + + LLSD headers = LLViewerMedia::getHeaders(); + headers["Cookie"] = getAuthCookie(); + headers["Content-Type"] = "multipart/form-data; boundary=" + boundary; + + std::ostringstream body; + + // *NOTE: The order seems to matter. + body << "--" << boundary << "\r\n" + << "Content-Disposition: form-data; name=\"key\"\r\n\r\n" + << config["key"].asString() << "\r\n"; + + body << "--" << boundary << "\r\n" + << "Content-Disposition: form-data; name=\"AWSAccessKeyId\"\r\n\r\n" + << config["AWSAccessKeyId"].asString() << "\r\n"; + + body << "--" << boundary << "\r\n" + << "Content-Disposition: form-data; name=\"acl\"\r\n\r\n" + << config["acl"].asString() << "\r\n"; + + body << "--" << boundary << "\r\n" + << "Content-Disposition: form-data; name=\"Content-Type\"\r\n\r\n" + << config["Content-Type"].asString() << "\r\n"; + + body << "--" << boundary << "\r\n" + << "Content-Disposition: form-data; name=\"policy\"\r\n\r\n" + << config["policy"].asString() << "\r\n"; + + body << "--" << boundary << "\r\n" + << "Content-Disposition: form-data; name=\"signature\"\r\n\r\n" + << config["signature"].asString() << "\r\n"; + + body << "--" << boundary << "\r\n" + << "Content-Disposition: form-data; name=\"success_action_redirect\"\r\n\r\n" + << config["success_action_redirect"].asString() << "\r\n"; + + body << "--" << boundary << "\r\n" + << "Content-Disposition: form-data; name=\"file\"; filename=\"snapshot.jpg\"\r\n" + << "Content-Type: image/jpeg\r\n\r\n"; + + // Insert the image data. + // *FIX: Treating this as a string will probably screw it up ... + U8* image_data = image->getData(); + for (S32 i = 0; i < image->getDataSize(); ++i) + { + body << image_data[i]; + } + + body << "\r\n--" << boundary << "--\r\n"; + + // postRaw() takes ownership of the buffer and releases it later. + size_t size = body.str().size(); + U8 *data = new U8[size]; + memcpy(data, body.str().data(), size); + + // Send request, successful upload will trigger posting metadata. + LLHTTPClient::postRaw(url, data, size, new LLWebProfileResponders::PostImageResponder(), headers); +} + +// static +void LLWebProfile::reportImageUploadStatus(bool ok) +{ + if (mStatusCallback) + { + mStatusCallback(ok); + } +} + +// static +std::string LLWebProfile::getAuthCookie() +{ + return sAuthCookie; +} diff --git a/indra/newview/llwebprofile.h b/indra/newview/llwebprofile.h new file mode 100644 index 0000000000..10279bffac --- /dev/null +++ b/indra/newview/llwebprofile.h @@ -0,0 +1,69 @@ +/** + * @file llwebprofile.h + * @brief Web profile access. + * + * $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_LLWEBPROFILE_H +#define LL_LLWEBPROFILE_H + +#include "llimage.h" + +namespace LLWebProfileResponders +{ + class ConfigResponder; + class PostImageResponder; + class PostImageRedirectResponder; +}; + +/** + * @class LLWebProfile + * + * Manages interaction with, a web service allowing the upload of snapshot images + * taken within the viewer. + */ +class LLWebProfile +{ + LOG_CLASS(LLWebProfile); + +public: + typedef boost::function status_callback_t; + + static void uploadImage(LLPointer image, const std::string& caption, bool add_location); + static void setAuthCookie(const std::string& cookie); + static void setImageUploadResultCallback(status_callback_t cb) { mStatusCallback = cb; } + +private: + friend class LLWebProfileResponders::ConfigResponder; + friend class LLWebProfileResponders::PostImageResponder; + friend class LLWebProfileResponders::PostImageRedirectResponder; + + static void post(LLPointer image, const LLSD& config, const std::string& url); + static void reportImageUploadStatus(bool ok); + static std::string getAuthCookie(); + + static std::string sAuthCookie; + static status_callback_t mStatusCallback; +}; + +#endif // LL_LLWEBPROFILE_H diff --git a/indra/newview/skins/default/textures/snapshot_download.png b/indra/newview/skins/default/textures/snapshot_download.png new file mode 100644 index 0000000000..c8c6236c96 Binary files /dev/null and b/indra/newview/skins/default/textures/snapshot_download.png differ diff --git a/indra/newview/skins/default/textures/snapshot_email.png b/indra/newview/skins/default/textures/snapshot_email.png new file mode 100644 index 0000000000..8a1a9bcde9 Binary files /dev/null and b/indra/newview/skins/default/textures/snapshot_email.png differ diff --git a/indra/newview/skins/default/textures/snapshot_inventory.png b/indra/newview/skins/default/textures/snapshot_inventory.png new file mode 100644 index 0000000000..56487ec443 Binary files /dev/null and b/indra/newview/skins/default/textures/snapshot_inventory.png differ diff --git a/indra/newview/skins/default/textures/snapshot_profile.png b/indra/newview/skins/default/textures/snapshot_profile.png new file mode 100644 index 0000000000..c8b90fb40b Binary files /dev/null and b/indra/newview/skins/default/textures/snapshot_profile.png differ diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml index bb91d32c6c..0e1f711627 100644 --- a/indra/newview/skins/default/textures/textures.xml +++ b/indra/newview/skins/default/textures/textures.xml @@ -547,6 +547,10 @@ with the same filename but different name + + + + diff --git a/indra/newview/skins/default/xui/en/floater_postcard.xml b/indra/newview/skins/default/xui/en/floater_postcard.xml deleted file mode 100644 index adc2433105..0000000000 --- a/indra/newview/skins/default/xui/en/floater_postcard.xml +++ /dev/null @@ -1,149 +0,0 @@ - - - - Postcard from [SECOND_LIFE]. - - - Check this out! - - - Sending... - - - Recipient's Email: - - - - Your Email: - - - - Your Name: - - - - Subject: - - - - Message: - - - Type your message here. - - + + diff --git a/indra/newview/skins/default/xui/en/panel_postcard_message.xml b/indra/newview/skins/default/xui/en/panel_postcard_message.xml new file mode 100644 index 0000000000..c2a3c70b6e --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_postcard_message.xml @@ -0,0 +1,137 @@ + + + + Recipient's Email: + + + + Your Email: + + + + Your Name: + + + + Subject: + + + + Message: + + + Type your message here. + + + + diff --git a/indra/newview/skins/default/xui/en/panel_postcard_settings.xml b/indra/newview/skins/default/xui/en/panel_postcard_settings.xml new file mode 100644 index 0000000000..84e3593798 --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_postcard_settings.xml @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + ([QLVL]) + + diff --git a/indra/newview/skins/default/xui/en/panel_snapshot_inventory.xml b/indra/newview/skins/default/xui/en/panel_snapshot_inventory.xml new file mode 100644 index 0000000000..cb243fbc5b --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_snapshot_inventory.xml @@ -0,0 +1,146 @@ + + + + + Save to My Inventory + + + + Saving an image to your inventory costs L$TBD. To save your image as a texture select one of the square formats. + + + + + + + + + + + + + + diff --git a/indra/newview/skins/default/xui/en/panel_snapshot_local.xml b/indra/newview/skins/default/xui/en/panel_snapshot_local.xml new file mode 100644 index 0000000000..fd2c735df7 --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_snapshot_local.xml @@ -0,0 +1,191 @@ + + + + + Save to My Computer + + + + + + + + + + + + + + + + + + + + + + + ([QLVL]) + + + + diff --git a/indra/newview/skins/default/xui/en/panel_snapshot_options.xml b/indra/newview/skins/default/xui/en/panel_snapshot_options.xml new file mode 100644 index 0000000000..e6324f8923 --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_snapshot_options.xml @@ -0,0 +1,80 @@ + + + + + + + diff --git a/indra/newview/skins/default/xui/en/panel_snapshot_postcard.xml b/indra/newview/skins/default/xui/en/panel_snapshot_postcard.xml new file mode 100644 index 0000000000..fc041e07bd --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_snapshot_postcard.xml @@ -0,0 +1,107 @@ + + + + Postcard from [SECOND_LIFE]. + + + Check this out! + + + Sending... + + + Postcard from [SECOND_LIFE]. + + + Check this out! + + + + Email + + + + + + + + + diff --git a/indra/newview/skins/default/xui/en/panel_snapshot_profile.xml b/indra/newview/skins/default/xui/en/panel_snapshot_profile.xml new file mode 100644 index 0000000000..e03508f5cc --- /dev/null +++ b/indra/newview/skins/default/xui/en/panel_snapshot_profile.xml @@ -0,0 +1,165 @@ + + + + + Post to My Profile Feed + + + + + + + + + + + + + + Caption: + + + + + + + diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index ec230773cc..befcc5dd87 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -3724,4 +3724,12 @@ Try enclosing path to the editor with double quotes. Wrap Preview Normal + + + Very Low + Low + Medium + High + Very High + -- cgit v1.2.3 From 2da4d944a71d3d7bd599baaedb5128cf873fc551 Mon Sep 17 00:00:00 2001 From: Leyla Farazha Date: Wed, 2 Nov 2011 10:40:02 -0700 Subject: EXP-1492 Avatar picker floater should be 4.5 thumbnails wide --- indra/newview/skins/default/xui/en/floater_avatar.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'indra/newview') diff --git a/indra/newview/skins/default/xui/en/floater_avatar.xml b/indra/newview/skins/default/xui/en/floater_avatar.xml index 2d973e7d90..6009821f7f 100644 --- a/indra/newview/skins/default/xui/en/floater_avatar.xml +++ b/indra/newview/skins/default/xui/en/floater_avatar.xml @@ -16,11 +16,11 @@ save_rect="true" save_visibility="true" title="AVATAR PICKER" - width="635"> + width="700"> -- cgit v1.2.3 From a900701f55ee0acea8ce6e44002c509d9f03b756 Mon Sep 17 00:00:00 2001 From: Leslie Linden Date: Wed, 2 Nov 2011 11:03:38 -0700 Subject: EXP-1474 FIX -- Create Classified does not work from Search Window * The code now opens the "picks" window and starts the "create new classified" action on it directly. Reviewed by Richard. --- indra/newview/llpanelpicks.cpp | 11 +++++------ indra/newview/llpanelpicks.h | 6 +++--- 2 files changed, 8 insertions(+), 9 deletions(-) (limited to 'indra/newview') diff --git a/indra/newview/llpanelpicks.cpp b/indra/newview/llpanelpicks.cpp index 72c6be4c79..360197ce55 100755 --- a/indra/newview/llpanelpicks.cpp +++ b/indra/newview/llpanelpicks.cpp @@ -247,12 +247,11 @@ public: void createClassified() { - // open the new classified panel on the Me > Picks sidetray - LLSD params; - params["id"] = gAgent.getID(); - params["open_tab_name"] = "panel_picks"; - params["show_tab_panel"] = "create_classified"; - LLFloaterSidePanelContainer::showPanel("my_profile", params); + // open the new classified panel on the Picks floater + LLFloater* picks_floater = LLFloaterReg::showInstance("picks"); + + LLPanelPicks* picks = picks_floater->findChild("panel_picks"); + picks->createNewClassified(); } void openClassified(LLAvatarClassifiedInfo* c_info) diff --git a/indra/newview/llpanelpicks.h b/indra/newview/llpanelpicks.h index 29db110523..3bb7413ac3 100755 --- a/indra/newview/llpanelpicks.h +++ b/indra/newview/llpanelpicks.h @@ -82,6 +82,9 @@ public: // parent panels failed to work (picks related code was in my profile panel) void setProfilePanel(LLPanelProfile* profile_panel); + void createNewPick(); + void createNewClassified(); + protected: /*virtual*/void updateButtons(); @@ -115,9 +118,6 @@ private: bool onEnableMenuItem(const LLSD& user_data); - void createNewPick(); - void createNewClassified(); - void openPickInfo(); void openClassifiedInfo(); void openClassifiedInfo(const LLSD& params); -- cgit v1.2.3 From 7661f809ece7ea853bd1cf3d654d1321d28826c0 Mon Sep 17 00:00:00 2001 From: Richard Linden Date: Wed, 2 Nov 2011 11:32:28 -0700 Subject: removed deprecated minimal skin stuff --- indra/newview/skins/minimal/xui/ru/menu_script_chiclet.xml | 4 ---- indra/newview/skins/minimal/xui/tr/menu_script_chiclet.xml | 4 ---- indra/newview/skins/minimal/xui/zh/menu_script_chiclet.xml | 4 ---- 3 files changed, 12 deletions(-) delete mode 100644 indra/newview/skins/minimal/xui/ru/menu_script_chiclet.xml delete mode 100644 indra/newview/skins/minimal/xui/tr/menu_script_chiclet.xml delete mode 100644 indra/newview/skins/minimal/xui/zh/menu_script_chiclet.xml (limited to 'indra/newview') diff --git a/indra/newview/skins/minimal/xui/ru/menu_script_chiclet.xml b/indra/newview/skins/minimal/xui/ru/menu_script_chiclet.xml deleted file mode 100644 index f95913ef2b..0000000000 --- a/indra/newview/skins/minimal/xui/ru/menu_script_chiclet.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/indra/newview/skins/minimal/xui/tr/menu_script_chiclet.xml b/indra/newview/skins/minimal/xui/tr/menu_script_chiclet.xml deleted file mode 100644 index 2efe6d7e71..0000000000 --- a/indra/newview/skins/minimal/xui/tr/menu_script_chiclet.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/indra/newview/skins/minimal/xui/zh/menu_script_chiclet.xml b/indra/newview/skins/minimal/xui/zh/menu_script_chiclet.xml deleted file mode 100644 index a0a8520650..0000000000 --- a/indra/newview/skins/minimal/xui/zh/menu_script_chiclet.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - -- cgit v1.2.3 From 334d8f4076b4045e8fd4ede5fd9d31f0b185ded4 Mon Sep 17 00:00:00 2001 From: Leslie Linden Date: Wed, 2 Nov 2011 11:42:41 -0700 Subject: Updating 'createPick' behavior to mirror new 'createClassified' behavior --- indra/newview/llpanelpicks.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'indra/newview') diff --git a/indra/newview/llpanelpicks.cpp b/indra/newview/llpanelpicks.cpp index 360197ce55..04e78e04e3 100755 --- a/indra/newview/llpanelpicks.cpp +++ b/indra/newview/llpanelpicks.cpp @@ -130,11 +130,11 @@ public: void createPick() { - LLSD params; - params["id"] = gAgent.getID(); - params["open_tab_name"] = "panel_picks"; - params["show_tab_panel"] = "create_pick"; - LLFloaterSidePanelContainer::showPanel("my_profile", params); + // open the new pick panel on the Picks floater + LLFloater* picks_floater = LLFloaterReg::showInstance("picks"); + + LLPanelPicks* picks = picks_floater->findChild("panel_picks"); + picks->createNewPick(); } void editPick(LLPickData* pick_info) -- cgit v1.2.3 From 8485199c650680881b0a50341440fc5f66fcbffe Mon Sep 17 00:00:00 2001 From: Richard Linden Date: Wed, 2 Nov 2011 11:51:27 -0700 Subject: removed some unused texture references --- indra/newview/skins/default/textures/textures.xml | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) (limited to 'indra/newview') diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml index 0f3769f0f8..362248c3c5 100644 --- a/indra/newview/skins/default/textures/textures.xml +++ b/indra/newview/skins/default/textures/textures.xml @@ -157,7 +157,6 @@ with the same filename but different name - @@ -572,21 +571,14 @@ with the same filename but different name - - - - - - - @@ -650,6 +642,12 @@ with the same filename but different name + + + + + + @@ -682,9 +680,6 @@ with the same filename but different name - - - @@ -718,7 +713,6 @@ with the same filename but different name - @@ -735,7 +729,6 @@ with the same filename but different name - -- cgit v1.2.3 From 6cd39ec82afa41f7d7d4ad992bda9c1ba5d55913 Mon Sep 17 00:00:00 2001 From: Richard Linden Date: Wed, 2 Nov 2011 11:52:02 -0700 Subject: EXP-1390 WIP Cannot see full sound icon when in IM call when background is a dark color voice icons with dark background --- .../default/textures/bottomtray/VoicePTT_Lvl1_Dark.png | Bin 0 -> 1394 bytes .../default/textures/bottomtray/VoicePTT_Lvl2_Dark.png | Bin 0 -> 1453 bytes .../default/textures/bottomtray/VoicePTT_Lvl3_Dark.png | Bin 0 -> 1426 bytes .../default/textures/bottomtray/VoicePTT_Off_Dark.png | Bin 0 -> 1353 bytes .../default/textures/bottomtray/VoicePTT_On_Dark.png | Bin 0 -> 1342 bytes 5 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl1_Dark.png create mode 100644 indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl2_Dark.png create mode 100644 indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl3_Dark.png create mode 100644 indra/newview/skins/default/textures/bottomtray/VoicePTT_Off_Dark.png create mode 100644 indra/newview/skins/default/textures/bottomtray/VoicePTT_On_Dark.png (limited to 'indra/newview') diff --git a/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl1_Dark.png b/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl1_Dark.png new file mode 100644 index 0000000000..9ef5465dd3 Binary files /dev/null and b/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl1_Dark.png differ diff --git a/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl2_Dark.png b/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl2_Dark.png new file mode 100644 index 0000000000..38918b9bed Binary files /dev/null and b/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl2_Dark.png differ diff --git a/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl3_Dark.png b/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl3_Dark.png new file mode 100644 index 0000000000..180385e29e Binary files /dev/null and b/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl3_Dark.png differ diff --git a/indra/newview/skins/default/textures/bottomtray/VoicePTT_Off_Dark.png b/indra/newview/skins/default/textures/bottomtray/VoicePTT_Off_Dark.png new file mode 100644 index 0000000000..42fed4183b Binary files /dev/null and b/indra/newview/skins/default/textures/bottomtray/VoicePTT_Off_Dark.png differ diff --git a/indra/newview/skins/default/textures/bottomtray/VoicePTT_On_Dark.png b/indra/newview/skins/default/textures/bottomtray/VoicePTT_On_Dark.png new file mode 100644 index 0000000000..fa09006d1f Binary files /dev/null and b/indra/newview/skins/default/textures/bottomtray/VoicePTT_On_Dark.png differ -- cgit v1.2.3 From 7e0444cbe7643b119c9630e365002f4c46987fd7 Mon Sep 17 00:00:00 2001 From: Siana Gearz Date: Wed, 2 Nov 2011 11:59:33 -0700 Subject: STORM-1678: Correct map display when For Sale is enabled --- indra/newview/llworldmapview.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indra/newview') diff --git a/indra/newview/llworldmapview.cpp b/indra/newview/llworldmapview.cpp index 265d5dc801..e99657cd22 100644 --- a/indra/newview/llworldmapview.cpp +++ b/indra/newview/llworldmapview.cpp @@ -422,7 +422,7 @@ void LLWorldMapView::draw() // Draw something whenever we have enough info if (overlayimage->hasGLTexture()) { - gGL.blendFunc(LLRender::BF_DEST_ALPHA, LLRender::BF_ZERO); + gGL.blendFunc(LLRender::BF_SOURCE_ALPHA, LLRender::BF_ONE_MINUS_SOURCE_ALPHA); gGL.getTexUnit(0)->bind(overlayimage); gGL.color4f(1.f, 1.f, 1.f, 1.f); gGL.begin(LLRender::QUADS); -- cgit v1.2.3 From 6c9227df13facff681adb95b9715c35cc3077531 Mon Sep 17 00:00:00 2001 From: Xiaohong Bao Date: Wed, 2 Nov 2011 13:31:51 -0600 Subject: fix for SH-2559: [crashhunters] crash in LLPluginMessage::generate() discussed and reviewed by callum. --- indra/newview/llviewermedia.cpp | 70 ++++++++++++++++++++++++----------------- 1 file changed, 42 insertions(+), 28 deletions(-) (limited to 'indra/newview') diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp index 41b4dc01e8..21f5f23652 100644 --- a/indra/newview/llviewermedia.cpp +++ b/indra/newview/llviewermedia.cpp @@ -2450,44 +2450,58 @@ BOOL LLViewerMediaImpl::handleMouseUp(S32 x, S32 y, MASK mask) ////////////////////////////////////////////////////////////////////////////////////////// void LLViewerMediaImpl::updateJavascriptObject() { + static LLFrameTimer timer ; + if ( mMediaSource ) { // flag to expose this information to internal browser or not. bool enable = gSavedSettings.getBOOL("BrowserEnableJSObject"); + + if(!enable) + { + return ; //no need to go further. + } + + if(timer.getElapsedTimeF32() < 1.0f) + { + return ; //do not update more than once per second. + } + timer.reset() ; + mMediaSource->jsEnableObject( enable ); // these values are only menaingful after login so don't set them before bool logged_in = LLLoginInstance::getInstance()->authSuccess(); if ( logged_in ) { - // current location within a region - LLVector3 agent_pos = gAgent.getPositionAgent(); - double x = agent_pos.mV[ VX ]; - double y = agent_pos.mV[ VY ]; - double z = agent_pos.mV[ VZ ]; - mMediaSource->jsAgentLocationEvent( x, y, z ); - - // current location within the grid - LLVector3d agent_pos_global = gAgent.getLastPositionGlobal(); - double global_x = agent_pos_global.mdV[ VX ]; - double global_y = agent_pos_global.mdV[ VY ]; - double global_z = agent_pos_global.mdV[ VZ ]; - mMediaSource->jsAgentGlobalLocationEvent( global_x, global_y, global_z ); - - // current agent orientation - double rotation = atan2( gAgent.getAtAxis().mV[VX], gAgent.getAtAxis().mV[VY] ); - double angle = rotation * RAD_TO_DEG; - if ( angle < 0.0f ) angle = 360.0f + angle; // TODO: has to be a better way to get orientation! - mMediaSource->jsAgentOrientationEvent( angle ); - - // current region agent is in - std::string region_name(""); - LLViewerRegion* region = gAgent.getRegion(); - if ( region ) - { - region_name = region->getName(); - }; - mMediaSource->jsAgentRegionEvent( region_name ); + // current location within a region + LLVector3 agent_pos = gAgent.getPositionAgent(); + double x = agent_pos.mV[ VX ]; + double y = agent_pos.mV[ VY ]; + double z = agent_pos.mV[ VZ ]; + mMediaSource->jsAgentLocationEvent( x, y, z ); + + // current location within the grid + LLVector3d agent_pos_global = gAgent.getLastPositionGlobal(); + double global_x = agent_pos_global.mdV[ VX ]; + double global_y = agent_pos_global.mdV[ VY ]; + double global_z = agent_pos_global.mdV[ VZ ]; + mMediaSource->jsAgentGlobalLocationEvent( global_x, global_y, global_z ); + + // current agent orientation + double rotation = atan2( gAgent.getAtAxis().mV[VX], gAgent.getAtAxis().mV[VY] ); + double angle = rotation * RAD_TO_DEG; + if ( angle < 0.0f ) angle = 360.0f + angle; // TODO: has to be a better way to get orientation! + mMediaSource->jsAgentOrientationEvent( angle ); + + // current region agent is in + std::string region_name(""); + LLViewerRegion* region = gAgent.getRegion(); + if ( region ) + { + region_name = region->getName(); + }; + mMediaSource->jsAgentRegionEvent( region_name ); } // language code the viewer is set to -- cgit v1.2.3 From a9b5e3830ba27b6332194ce983ae6eb2ad78c8fd Mon Sep 17 00:00:00 2001 From: Vadim ProductEngine Date: Wed, 2 Nov 2011 22:23:25 +0200 Subject: STORM-1580 WIP Fixed build. --- indra/newview/llfloatersnapshot.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indra/newview') diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp index c8c66931a1..9171f222e5 100644 --- a/indra/newview/llfloatersnapshot.cpp +++ b/indra/newview/llfloatersnapshot.cpp @@ -2138,7 +2138,7 @@ void LLFloaterSnapshot::Impl::applyCustomResolution(LLFloaterSnapshot* view, S32 } } #endif - previewp->setMaxImageSize(getWidthSpinner(view)->getMaxValue()) ; + previewp->setMaxImageSize((S32) getWidthSpinner(view)->getMaxValue()) ; // Check image size changes the value of height and width if(checkImageSize(previewp, w, h, w != curw, previewp->getMaxImageSize()) -- cgit v1.2.3 From 139c13bdc0387f50d9f3a71737a95a4585bc471c Mon Sep 17 00:00:00 2001 From: Merov Linden Date: Wed, 2 Nov 2011 13:43:14 -0700 Subject: EXP-1473 : FIX. Added an onOpen key to open directly on the Landmarks list. Used this from the favorites toolbar Open Landmark. Also fixed the ugly stretching of the overflow button in edit landmark panel. --- indra/newview/llfavoritesbar.cpp | 4 +- indra/newview/llpanelplaces.cpp | 154 ++++++++++++--------- .../newview/skins/default/xui/en/panel_places.xml | 4 +- 3 files changed, 95 insertions(+), 67 deletions(-) (limited to 'indra/newview') diff --git a/indra/newview/llfavoritesbar.cpp b/indra/newview/llfavoritesbar.cpp index 6c9058caf1..f254ec8c52 100644 --- a/indra/newview/llfavoritesbar.cpp +++ b/indra/newview/llfavoritesbar.cpp @@ -1016,7 +1016,9 @@ void LLFavoritesBarCtrl::addOpenLandmarksMenuItem(LLToggleableMenu* menu) LLMenuItemCallGL::Params item_params; item_params.name("open_my_landmarks"); item_params.label(translated ? label_transl: label_untrans); - item_params.on_click.function(boost::bind(&LLFloaterSidePanelContainer::showPanel, "places", LLSD())); + LLSD key; + key["type"] = "open_landmark_tab"; + item_params.on_click.function(boost::bind(&LLFloaterSidePanelContainer::showPanel, "places", key)); LLMenuItemCallGL* menu_item = LLUICtrlFactory::create(item_params); fitLabelWidth(menu_item); diff --git a/indra/newview/llpanelplaces.cpp b/indra/newview/llpanelplaces.cpp index 7f8f9b29af..6d321d4716 100644 --- a/indra/newview/llpanelplaces.cpp +++ b/indra/newview/llpanelplaces.cpp @@ -82,6 +82,7 @@ static const std::string CREATE_LANDMARK_INFO_TYPE = "create_landmark"; static const std::string LANDMARK_INFO_TYPE = "landmark"; static const std::string REMOTE_PLACE_INFO_TYPE = "remote_place"; static const std::string TELEPORT_HISTORY_INFO_TYPE = "teleport_history"; +static const std::string LANDMARK_TAB_INFO_TYPE = "open_landmark_tab"; // Support for secondlife:///app/parcel/{UUID}/about SLapps class LLParcelHandler : public LLCommandHandler @@ -365,83 +366,104 @@ void LLPanelPlaces::onOpen(const LLSD& key) if (key.size() != 0) { - mFilterEditor->clear(); - onFilterEdit("", false); - - mPlaceInfoType = key["type"].asString(); - mPosGlobal.setZero(); - mItem = NULL; - isLandmarkEditModeOn = false; - togglePlaceInfoPanel(TRUE); - - if (mPlaceInfoType == AGENT_INFO_TYPE) + std::string key_type = key["type"].asString(); + if (key_type == LANDMARK_TAB_INFO_TYPE) { - mPlaceProfile->setInfoType(LLPanelPlaceInfo::AGENT); + // Small hack: We need to toggle twice. The first toggle moves from the Landmark + // or Teleport History info panel to the Landmark or Teleport History list panel. + // For this first toggle, the mPlaceInfoType should be the one previously used so + // that the state can be corretly set. + // The second toggle forces the list to be set to Landmark. + // This avoids extracting and duplicating all the state logic from togglePlaceInfoPanel() + // here or some specific private method + togglePlaceInfoPanel(FALSE); + mPlaceInfoType = key_type; + togglePlaceInfoPanel(FALSE); + // Update the active tab + onTabSelected(); + // Update the buttons at the bottom of the panel + updateVerbs(); } - else if (mPlaceInfoType == CREATE_LANDMARK_INFO_TYPE) + else { - mLandmarkInfo->setInfoType(LLPanelPlaceInfo::CREATE_LANDMARK); + mFilterEditor->clear(); + onFilterEdit("", false); - if (key.has("x") && key.has("y") && key.has("z")) + mPlaceInfoType = key_type; + mPosGlobal.setZero(); + mItem = NULL; + isLandmarkEditModeOn = false; + togglePlaceInfoPanel(TRUE); + + if (mPlaceInfoType == AGENT_INFO_TYPE) { - mPosGlobal = LLVector3d(key["x"].asReal(), - key["y"].asReal(), - key["z"].asReal()); + mPlaceProfile->setInfoType(LLPanelPlaceInfo::AGENT); } - else + else if (mPlaceInfoType == CREATE_LANDMARK_INFO_TYPE) { - mPosGlobal = gAgent.getPositionGlobal(); + mLandmarkInfo->setInfoType(LLPanelPlaceInfo::CREATE_LANDMARK); + + if (key.has("x") && key.has("y") && key.has("z")) + { + mPosGlobal = LLVector3d(key["x"].asReal(), + key["y"].asReal(), + key["z"].asReal()); + } + else + { + mPosGlobal = gAgent.getPositionGlobal(); + } + + mLandmarkInfo->displayParcelInfo(LLUUID(), mPosGlobal); + + mSaveBtn->setEnabled(FALSE); } - - mLandmarkInfo->displayParcelInfo(LLUUID(), mPosGlobal); - - mSaveBtn->setEnabled(FALSE); - } - else if (mPlaceInfoType == LANDMARK_INFO_TYPE) - { - mLandmarkInfo->setInfoType(LLPanelPlaceInfo::LANDMARK); - - LLInventoryItem* item = gInventory.getItem(key["id"].asUUID()); - if (!item) - return; - - setItem(item); - } - else if (mPlaceInfoType == REMOTE_PLACE_INFO_TYPE) - { - if (key.has("id")) + else if (mPlaceInfoType == LANDMARK_INFO_TYPE) { - LLUUID parcel_id = key["id"].asUUID(); - mPlaceProfile->setParcelID(parcel_id); + mLandmarkInfo->setInfoType(LLPanelPlaceInfo::LANDMARK); - // query the server to get the global 3D position of this - // parcel - we need this for teleport/mapping functions. - mRemoteParcelObserver->setParcelID(parcel_id); + LLInventoryItem* item = gInventory.getItem(key["id"].asUUID()); + if (!item) + return; + + setItem(item); } - else + else if (mPlaceInfoType == REMOTE_PLACE_INFO_TYPE) { - mPosGlobal = LLVector3d(key["x"].asReal(), - key["y"].asReal(), - key["z"].asReal()); - mPlaceProfile->displayParcelInfo(LLUUID(), mPosGlobal); + if (key.has("id")) + { + LLUUID parcel_id = key["id"].asUUID(); + mPlaceProfile->setParcelID(parcel_id); + + // query the server to get the global 3D position of this + // parcel - we need this for teleport/mapping functions. + mRemoteParcelObserver->setParcelID(parcel_id); + } + else + { + mPosGlobal = LLVector3d(key["x"].asReal(), + key["y"].asReal(), + key["z"].asReal()); + mPlaceProfile->displayParcelInfo(LLUUID(), mPosGlobal); + } + + mPlaceProfile->setInfoType(LLPanelPlaceInfo::PLACE); } + else if (mPlaceInfoType == TELEPORT_HISTORY_INFO_TYPE) + { + S32 index = key["id"].asInteger(); - mPlaceProfile->setInfoType(LLPanelPlaceInfo::PLACE); - } - else if (mPlaceInfoType == TELEPORT_HISTORY_INFO_TYPE) - { - S32 index = key["id"].asInteger(); + const LLTeleportHistoryStorage::slurl_list_t& hist_items = + LLTeleportHistoryStorage::getInstance()->getItems(); - const LLTeleportHistoryStorage::slurl_list_t& hist_items = - LLTeleportHistoryStorage::getInstance()->getItems(); + mPosGlobal = hist_items[index].mGlobalPos; - mPosGlobal = hist_items[index].mGlobalPos; + mPlaceProfile->setInfoType(LLPanelPlaceInfo::TELEPORT_HISTORY); + mPlaceProfile->displayParcelInfo(LLUUID(), mPosGlobal); + } - mPlaceProfile->setInfoType(LLPanelPlaceInfo::TELEPORT_HISTORY); - mPlaceProfile->displayParcelInfo(LLUUID(), mPosGlobal); + updateVerbs(); } - - updateVerbs(); } LLViewerParcelMgr* parcel_mgr = LLViewerParcelMgr::getInstance(); @@ -942,7 +964,8 @@ void LLPanelPlaces::togglePlaceInfoPanel(BOOL visible) } } else if (mPlaceInfoType == CREATE_LANDMARK_INFO_TYPE || - mPlaceInfoType == LANDMARK_INFO_TYPE) + mPlaceInfoType == LANDMARK_INFO_TYPE || + mPlaceInfoType == LANDMARK_TAB_INFO_TYPE) { mLandmarkInfo->setVisible(visible); @@ -960,13 +983,15 @@ void LLPanelPlaces::togglePlaceInfoPanel(BOOL visible) { LLLandmarksPanel* landmarks_panel = dynamic_cast(mTabContainer->getPanelByName("Landmarks")); - if (landmarks_panel && mItem.notNull()) + if (landmarks_panel) { // If a landmark info is being closed we open the landmarks tab // and set this landmark selected. mTabContainer->selectTabPanel(landmarks_panel); - - landmarks_panel->setItemSelected(mItem->getUUID(), TRUE); + if (mItem.notNull()) + { + landmarks_panel->setItemSelected(mItem->getUUID(), TRUE); + } } } } @@ -1163,7 +1188,8 @@ LLPanelPlaceInfo* LLPanelPlaces::getCurrentInfoPanel() return mPlaceProfile; } else if (mPlaceInfoType == CREATE_LANDMARK_INFO_TYPE || - mPlaceInfoType == LANDMARK_INFO_TYPE) + mPlaceInfoType == LANDMARK_INFO_TYPE || + mPlaceInfoType == LANDMARK_TAB_INFO_TYPE) { return mLandmarkInfo; } diff --git a/indra/newview/skins/default/xui/en/panel_places.xml b/indra/newview/skins/default/xui/en/panel_places.xml index 5d7334f780..670aa47313 100644 --- a/indra/newview/skins/default/xui/en/panel_places.xml +++ b/indra/newview/skins/default/xui/en/panel_places.xml @@ -202,7 +202,7 @@ background_visible="true" Date: Wed, 2 Nov 2011 23:37:55 +0200 Subject: STORM-1580 WIP Another build fix. --- indra/newview/llfloatersnapshot.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indra/newview') diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp index 9171f222e5..08ca1e8cea 100644 --- a/indra/newview/llfloatersnapshot.cpp +++ b/indra/newview/llfloatersnapshot.cpp @@ -1283,7 +1283,7 @@ void LLFloaterSnapshot::Impl::updateLayout(LLFloaterSnapshot* floaterp) { LLSnapshotLivePreview* previewp = getPreviewView(floaterp); - bool advanced = gSavedSettings.getBOOL("AdvanceSnapshot"); + BOOL advanced = gSavedSettings.getBOOL("AdvanceSnapshot"); // Show/hide advanced options. LLPanel* advanced_options_panel = floaterp->getChild("advanced_options_panel"); -- cgit v1.2.3 From c7a146e23f0d1c4b0eb782519dccd6c23470cbfa Mon Sep 17 00:00:00 2001 From: Richard Linden Date: Wed, 2 Nov 2011 15:17:16 -0700 Subject: removed unused textures --- indra/newview/skins/default/textures/arrow_keys.png | Bin 6558 -> 0 bytes .../skins/default/textures/bottomtray/Cam_Pan_Over.png | Bin 275 -> 0 bytes .../default/textures/bottomtray/CameraView_Press.png | Bin 489 -> 0 bytes .../default/textures/bottomtray/PanOrbit_Disabled.png | Bin 50975 -> 0 bytes .../skins/default/textures/bottomtray/PanOrbit_Over.png | Bin 54713 -> 0 bytes .../default/textures/bottomtray/PanOrbit_Press.png | Bin 51053 -> 0 bytes .../default/textures/checkerboard_transparency_bg.png | Bin 1110 -> 0 bytes indra/newview/skins/default/textures/circle.tga | Bin 1068 -> 0 bytes .../textures/containers/Accordion_ArrowClosed_Over.png | Bin 170 -> 0 bytes .../textures/containers/Accordion_ArrowOpened_Over.png | Bin 162 -> 0 bytes .../default/textures/containers/TabTop_Left_Over.png | Bin 337 -> 0 bytes .../default/textures/containers/TabTop_Middle_Over.png | Bin 285 -> 0 bytes .../default/textures/containers/TabTop_Right_Over.png | Bin 362 -> 0 bytes indra/newview/skins/default/textures/icn_label_web.tga | Bin 4140 -> 0 bytes indra/newview/skins/default/textures/icn_media.tga | Bin 4140 -> 0 bytes .../skins/default/textures/icn_voice-groupfocus.tga | Bin 1068 -> 0 bytes .../skins/default/textures/icn_voice-localchat.tga | Bin 1068 -> 0 bytes .../skins/default/textures/icn_voice-pvtfocus.tga | Bin 1068 -> 0 bytes indra/newview/skins/default/textures/icon_day_cycle.tga | Bin 25682 -> 0 bytes .../newview/skins/default/textures/icon_event_adult.tga | Bin 1006 -> 0 bytes indra/newview/skins/default/textures/icon_lock.tga | Bin 1030 -> 0 bytes .../skins/default/textures/icons/AddItem_Over.png | Bin 165 -> 0 bytes .../skins/default/textures/icons/BackArrow_Over.png | Bin 214 -> 0 bytes .../newview/skins/default/textures/icons/DragHandle.png | Bin 163 -> 0 bytes .../skins/default/textures/icons/Generic_Object.png | Bin 366 -> 0 bytes indra/newview/skins/default/textures/icons/Inv_Gift.png | Bin 1335 -> 0 bytes .../skins/default/textures/icons/OptionsMenu_Over.png | Bin 277 -> 0 bytes .../default/textures/icons/OutboxPush_On_Selected.png | Bin 1912 -> 0 bytes .../default/textures/icons/Parcel_Damage_Light_Alt.png | Bin 285 -> 0 bytes .../default/textures/icons/Parcel_NoScripts_Light.png | Bin 620 -> 0 bytes .../skins/default/textures/icons/Sync_Progress_1.png | Bin 1149 -> 0 bytes .../skins/default/textures/icons/Sync_Progress_2.png | Bin 1147 -> 0 bytes .../skins/default/textures/icons/Sync_Progress_3.png | Bin 1211 -> 0 bytes .../skins/default/textures/icons/Sync_Progress_4.png | Bin 1205 -> 0 bytes .../skins/default/textures/icons/Sync_Progress_5.png | Bin 1137 -> 0 bytes .../skins/default/textures/icons/Sync_Progress_6.png | Bin 1164 -> 0 bytes .../skins/default/textures/icons/TrashItem_Over.png | Bin 201 -> 0 bytes .../skins/default/textures/icons/parcel_color_EVRY.png | Bin 393 -> 0 bytes .../skins/default/textures/icons/parcel_color_EXP.png | Bin 272 -> 0 bytes .../skins/default/textures/icons/parcel_color_M.png | Bin 306 -> 0 bytes .../newview/skins/default/textures/image_edit_icon.tga | Bin 3116 -> 0 bytes .../skins/default/textures/inv_folder_animation.tga | Bin 1068 -> 0 bytes .../newview/skins/default/textures/inv_folder_inbox.tga | Bin 2085 -> 0 bytes .../skins/default/textures/map_avatar_above_8.tga | Bin 300 -> 0 bytes .../skins/default/textures/map_avatar_below_8.tga | Bin 300 -> 0 bytes .../newview/skins/default/textures/map_event_adult.tga | Bin 1006 -> 0 bytes .../newview/skins/default/textures/map_event_mature.tga | Bin 1068 -> 0 bytes indra/newview/skins/default/textures/map_track_8.tga | Bin 300 -> 0 bytes indra/newview/skins/default/textures/menu_separator.png | Bin 2831 -> 0 bytes .../default/textures/model_wizard/divider_line.png | Bin 2815 -> 0 bytes indra/newview/skins/default/textures/mute_icon.tga | Bin 1042 -> 0 bytes .../skins/default/textures/navbar/Arrow_Left_Over.png | Bin 381 -> 0 bytes .../skins/default/textures/navbar/Arrow_Right_Over.png | Bin 379 -> 0 bytes .../newview/skins/default/textures/navbar/Help_Over.png | Bin 348 -> 0 bytes .../newview/skins/default/textures/navbar/Home_Over.png | Bin 330 -> 0 bytes .../skins/default/textures/places_rating_adult.tga | Bin 648 -> 0 bytes .../skins/default/textures/places_rating_mature.tga | Bin 1068 -> 0 bytes .../newview/skins/default/textures/places_rating_pg.tga | Bin 1068 -> 0 bytes indra/newview/skins/default/textures/propertyline.tga | Bin 2092 -> 0 bytes .../default/textures/quick_tips/avatar_free_mode.png | Bin 1447 -> 0 bytes .../default/textures/quick_tips/camera_free_mode.png | Bin 2267 -> 0 bytes .../default/textures/quick_tips/camera_orbit_mode.png | Bin 2381 -> 0 bytes .../default/textures/quick_tips/camera_pan_mode.png | Bin 2418 -> 0 bytes .../textures/quick_tips/camera_preset_front_view.png | Bin 2365 -> 0 bytes .../textures/quick_tips/camera_preset_group_view.png | Bin 2595 -> 0 bytes .../textures/quick_tips/camera_preset_rear_view.png | Bin 2221 -> 0 bytes .../default/textures/quick_tips/move_fly_first.png | Bin 1528 -> 0 bytes .../default/textures/quick_tips/move_fly_second.png | Bin 2128 -> 0 bytes .../default/textures/quick_tips/move_run_first.png | Bin 1554 -> 0 bytes .../default/textures/quick_tips/move_run_second.png | Bin 2534 -> 0 bytes .../default/textures/quick_tips/move_walk_first.png | Bin 2106 -> 0 bytes .../default/textures/quick_tips/move_walk_second.png | Bin 3108 -> 0 bytes indra/newview/skins/default/textures/show_btn.tga | Bin 3884 -> 0 bytes .../skins/default/textures/show_btn_selected.tga | Bin 3884 -> 0 bytes indra/newview/skins/default/textures/smicon_warn.tga | Bin 1068 -> 0 bytes indra/newview/skins/default/textures/spacer35.tga | Bin 3404 -> 0 bytes .../skins/default/textures/square_btn_32x128.tga | Bin 6292 -> 0 bytes .../default/textures/square_btn_selected_32x128.tga | Bin 6983 -> 0 bytes indra/newview/skins/default/textures/startup_logo.j2c | Bin 69118 -> 0 bytes indra/newview/skins/default/textures/status_busy.tga | Bin 4140 -> 0 bytes .../textures/taskpanel/TabIcon_Appearance_Off.png | Bin 273 -> 0 bytes .../textures/taskpanel/TabIcon_Appearance_Selected.png | Bin 349 -> 0 bytes .../default/textures/taskpanel/TabIcon_Home_Off.png | Bin 749 -> 0 bytes .../default/textures/taskpanel/TabIcon_Me_Selected.png | Bin 359 -> 0 bytes .../textures/taskpanel/TabIcon_People_Selected.png | Bin 536 -> 0 bytes .../default/textures/taskpanel/TabIcon_Places_Large.png | Bin 709 -> 0 bytes .../textures/taskpanel/TabIcon_Places_Selected.png | Bin 653 -> 0 bytes .../textures/taskpanel/TabIcon_Things_Selected.png | Bin 297 -> 0 bytes .../skins/default/textures/toolbar_icons/mini_map.png | Bin 1766 -> 0 bytes .../skins/default/textures/widgets/Checkbox_On_Over.png | Bin 547 -> 0 bytes .../skins/default/textures/widgets/Checkbox_Over.png | Bin 318 -> 0 bytes .../textures/widgets/ComboButton_Up_On_Selected.png | Bin 482 -> 0 bytes .../textures/widgets/DisclosureArrow_Closed_Over.png | Bin 164 -> 0 bytes .../textures/widgets/DisclosureArrow_Opened_Over.png | Bin 165 -> 0 bytes .../default/textures/widgets/PushButton_On_Over.png | Bin 498 -> 0 bytes .../textures/widgets/PushButton_Selected_Over.png | Bin 498 -> 0 bytes .../default/textures/widgets/RadioButton_On_Over.png | Bin 635 -> 0 bytes .../skins/default/textures/widgets/RadioButton_Over.png | Bin 575 -> 0 bytes .../skins/default/textures/widgets/ScrollArrow_Down.png | Bin 239 -> 0 bytes .../default/textures/widgets/ScrollArrow_Down_Over.png | Bin 257 -> 0 bytes .../default/textures/widgets/ScrollArrow_Left_Over.png | Bin 295 -> 0 bytes .../default/textures/widgets/ScrollArrow_Right_Over.png | Bin 283 -> 0 bytes .../skins/default/textures/widgets/ScrollArrow_Up.png | Bin 262 -> 0 bytes .../default/textures/widgets/ScrollArrow_Up_Over.png | Bin 276 -> 0 bytes .../default/textures/widgets/ScrollThumb_Horiz_Over.png | Bin 311 -> 0 bytes .../default/textures/widgets/ScrollThumb_Vert_Over.png | Bin 311 -> 0 bytes .../default/textures/widgets/SegmentedBtn_Left_On.png | Bin 404 -> 0 bytes .../textures/widgets/SegmentedBtn_Left_On_Disabled.png | Bin 404 -> 0 bytes .../textures/widgets/SegmentedBtn_Left_On_Over.png | Bin 394 -> 0 bytes .../textures/widgets/SegmentedBtn_Left_On_Selected.png | Bin 495 -> 0 bytes .../default/textures/widgets/SegmentedBtn_Middle_On.png | Bin 308 -> 0 bytes .../textures/widgets/SegmentedBtn_Middle_On_Over.png | Bin 300 -> 0 bytes .../textures/widgets/SegmentedBtn_Middle_On_Press.png | Bin 393 -> 0 bytes .../textures/widgets/SegmentedBtn_Middle_Over.png | Bin 286 -> 0 bytes .../widgets/SegmentedBtn_Middle_Selected_Over.png | Bin 300 -> 0 bytes .../default/textures/widgets/SegmentedBtn_Right_On.png | Bin 420 -> 0 bytes .../textures/widgets/SegmentedBtn_Right_On_Over.png | Bin 416 -> 0 bytes .../textures/widgets/SegmentedBtn_Right_On_Selected.png | Bin 502 -> 0 bytes .../widgets/SegmentedBtn_Right_Selected_Over.png | Bin 416 -> 0 bytes .../skins/default/textures/widgets/SliderThumb_Over.png | Bin 482 -> 0 bytes .../default/textures/widgets/Stepper_Down_Over.png | Bin 310 -> 0 bytes .../skins/default/textures/widgets/Stepper_Up_Over.png | Bin 314 -> 0 bytes indra/newview/skins/default/textures/windows/Flyout.png | Bin 820 -> 0 bytes .../default/textures/windows/Flyout_Pointer_Up.png | Bin 260 -> 0 bytes .../skins/default/textures/windows/Icon_Gear_Over.png | Bin 293 -> 0 bytes .../skins/default/textures/windows/Icon_Help_Press.png | Bin 3062 -> 0 bytes .../default/textures/windows/Icon_Undock_Foreground.png | Bin 268 -> 0 bytes .../default/textures/windows/Icon_Undock_Press.png | Bin 267 -> 0 bytes .../skins/default/textures/windows/hint_arrow_down.png | Bin 3170 -> 0 bytes .../skins/default/textures/windows/hint_arrow_up.png | Bin 3219 -> 0 bytes 130 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 indra/newview/skins/default/textures/arrow_keys.png delete mode 100644 indra/newview/skins/default/textures/bottomtray/Cam_Pan_Over.png delete mode 100644 indra/newview/skins/default/textures/bottomtray/CameraView_Press.png delete mode 100644 indra/newview/skins/default/textures/bottomtray/PanOrbit_Disabled.png delete mode 100644 indra/newview/skins/default/textures/bottomtray/PanOrbit_Over.png delete mode 100644 indra/newview/skins/default/textures/bottomtray/PanOrbit_Press.png delete mode 100644 indra/newview/skins/default/textures/checkerboard_transparency_bg.png delete mode 100644 indra/newview/skins/default/textures/circle.tga delete mode 100644 indra/newview/skins/default/textures/containers/Accordion_ArrowClosed_Over.png delete mode 100644 indra/newview/skins/default/textures/containers/Accordion_ArrowOpened_Over.png delete mode 100644 indra/newview/skins/default/textures/containers/TabTop_Left_Over.png delete mode 100644 indra/newview/skins/default/textures/containers/TabTop_Middle_Over.png delete mode 100644 indra/newview/skins/default/textures/containers/TabTop_Right_Over.png delete mode 100644 indra/newview/skins/default/textures/icn_label_web.tga delete mode 100644 indra/newview/skins/default/textures/icn_media.tga delete mode 100644 indra/newview/skins/default/textures/icn_voice-groupfocus.tga delete mode 100644 indra/newview/skins/default/textures/icn_voice-localchat.tga delete mode 100644 indra/newview/skins/default/textures/icn_voice-pvtfocus.tga delete mode 100644 indra/newview/skins/default/textures/icon_day_cycle.tga delete mode 100644 indra/newview/skins/default/textures/icon_event_adult.tga delete mode 100644 indra/newview/skins/default/textures/icon_lock.tga delete mode 100644 indra/newview/skins/default/textures/icons/AddItem_Over.png delete mode 100644 indra/newview/skins/default/textures/icons/BackArrow_Over.png delete mode 100644 indra/newview/skins/default/textures/icons/DragHandle.png delete mode 100644 indra/newview/skins/default/textures/icons/Generic_Object.png delete mode 100644 indra/newview/skins/default/textures/icons/Inv_Gift.png delete mode 100644 indra/newview/skins/default/textures/icons/OptionsMenu_Over.png delete mode 100644 indra/newview/skins/default/textures/icons/OutboxPush_On_Selected.png delete mode 100644 indra/newview/skins/default/textures/icons/Parcel_Damage_Light_Alt.png delete mode 100644 indra/newview/skins/default/textures/icons/Parcel_NoScripts_Light.png delete mode 100644 indra/newview/skins/default/textures/icons/Sync_Progress_1.png delete mode 100644 indra/newview/skins/default/textures/icons/Sync_Progress_2.png delete mode 100644 indra/newview/skins/default/textures/icons/Sync_Progress_3.png delete mode 100644 indra/newview/skins/default/textures/icons/Sync_Progress_4.png delete mode 100644 indra/newview/skins/default/textures/icons/Sync_Progress_5.png delete mode 100644 indra/newview/skins/default/textures/icons/Sync_Progress_6.png delete mode 100644 indra/newview/skins/default/textures/icons/TrashItem_Over.png delete mode 100644 indra/newview/skins/default/textures/icons/parcel_color_EVRY.png delete mode 100644 indra/newview/skins/default/textures/icons/parcel_color_EXP.png delete mode 100644 indra/newview/skins/default/textures/icons/parcel_color_M.png delete mode 100644 indra/newview/skins/default/textures/image_edit_icon.tga delete mode 100644 indra/newview/skins/default/textures/inv_folder_animation.tga delete mode 100644 indra/newview/skins/default/textures/inv_folder_inbox.tga delete mode 100644 indra/newview/skins/default/textures/map_avatar_above_8.tga delete mode 100644 indra/newview/skins/default/textures/map_avatar_below_8.tga delete mode 100644 indra/newview/skins/default/textures/map_event_adult.tga delete mode 100644 indra/newview/skins/default/textures/map_event_mature.tga delete mode 100644 indra/newview/skins/default/textures/map_track_8.tga delete mode 100644 indra/newview/skins/default/textures/menu_separator.png delete mode 100644 indra/newview/skins/default/textures/model_wizard/divider_line.png delete mode 100644 indra/newview/skins/default/textures/mute_icon.tga delete mode 100644 indra/newview/skins/default/textures/navbar/Arrow_Left_Over.png delete mode 100644 indra/newview/skins/default/textures/navbar/Arrow_Right_Over.png delete mode 100644 indra/newview/skins/default/textures/navbar/Help_Over.png delete mode 100644 indra/newview/skins/default/textures/navbar/Home_Over.png delete mode 100644 indra/newview/skins/default/textures/places_rating_adult.tga delete mode 100644 indra/newview/skins/default/textures/places_rating_mature.tga delete mode 100644 indra/newview/skins/default/textures/places_rating_pg.tga delete mode 100644 indra/newview/skins/default/textures/propertyline.tga delete mode 100644 indra/newview/skins/default/textures/quick_tips/avatar_free_mode.png delete mode 100644 indra/newview/skins/default/textures/quick_tips/camera_free_mode.png delete mode 100644 indra/newview/skins/default/textures/quick_tips/camera_orbit_mode.png delete mode 100644 indra/newview/skins/default/textures/quick_tips/camera_pan_mode.png delete mode 100644 indra/newview/skins/default/textures/quick_tips/camera_preset_front_view.png delete mode 100644 indra/newview/skins/default/textures/quick_tips/camera_preset_group_view.png delete mode 100644 indra/newview/skins/default/textures/quick_tips/camera_preset_rear_view.png delete mode 100644 indra/newview/skins/default/textures/quick_tips/move_fly_first.png delete mode 100644 indra/newview/skins/default/textures/quick_tips/move_fly_second.png delete mode 100644 indra/newview/skins/default/textures/quick_tips/move_run_first.png delete mode 100644 indra/newview/skins/default/textures/quick_tips/move_run_second.png delete mode 100644 indra/newview/skins/default/textures/quick_tips/move_walk_first.png delete mode 100644 indra/newview/skins/default/textures/quick_tips/move_walk_second.png delete mode 100644 indra/newview/skins/default/textures/show_btn.tga delete mode 100644 indra/newview/skins/default/textures/show_btn_selected.tga delete mode 100644 indra/newview/skins/default/textures/smicon_warn.tga delete mode 100644 indra/newview/skins/default/textures/spacer35.tga delete mode 100644 indra/newview/skins/default/textures/square_btn_32x128.tga delete mode 100644 indra/newview/skins/default/textures/square_btn_selected_32x128.tga delete mode 100644 indra/newview/skins/default/textures/startup_logo.j2c delete mode 100644 indra/newview/skins/default/textures/status_busy.tga delete mode 100644 indra/newview/skins/default/textures/taskpanel/TabIcon_Appearance_Off.png delete mode 100644 indra/newview/skins/default/textures/taskpanel/TabIcon_Appearance_Selected.png delete mode 100644 indra/newview/skins/default/textures/taskpanel/TabIcon_Home_Off.png delete mode 100644 indra/newview/skins/default/textures/taskpanel/TabIcon_Me_Selected.png delete mode 100644 indra/newview/skins/default/textures/taskpanel/TabIcon_People_Selected.png delete mode 100644 indra/newview/skins/default/textures/taskpanel/TabIcon_Places_Large.png delete mode 100644 indra/newview/skins/default/textures/taskpanel/TabIcon_Places_Selected.png delete mode 100644 indra/newview/skins/default/textures/taskpanel/TabIcon_Things_Selected.png delete mode 100644 indra/newview/skins/default/textures/toolbar_icons/mini_map.png delete mode 100644 indra/newview/skins/default/textures/widgets/Checkbox_On_Over.png delete mode 100644 indra/newview/skins/default/textures/widgets/Checkbox_Over.png delete mode 100644 indra/newview/skins/default/textures/widgets/ComboButton_Up_On_Selected.png delete mode 100644 indra/newview/skins/default/textures/widgets/DisclosureArrow_Closed_Over.png delete mode 100644 indra/newview/skins/default/textures/widgets/DisclosureArrow_Opened_Over.png delete mode 100644 indra/newview/skins/default/textures/widgets/PushButton_On_Over.png delete mode 100644 indra/newview/skins/default/textures/widgets/PushButton_Selected_Over.png delete mode 100644 indra/newview/skins/default/textures/widgets/RadioButton_On_Over.png delete mode 100644 indra/newview/skins/default/textures/widgets/RadioButton_Over.png delete mode 100644 indra/newview/skins/default/textures/widgets/ScrollArrow_Down.png delete mode 100644 indra/newview/skins/default/textures/widgets/ScrollArrow_Down_Over.png delete mode 100644 indra/newview/skins/default/textures/widgets/ScrollArrow_Left_Over.png delete mode 100644 indra/newview/skins/default/textures/widgets/ScrollArrow_Right_Over.png delete mode 100644 indra/newview/skins/default/textures/widgets/ScrollArrow_Up.png delete mode 100644 indra/newview/skins/default/textures/widgets/ScrollArrow_Up_Over.png delete mode 100644 indra/newview/skins/default/textures/widgets/ScrollThumb_Horiz_Over.png delete mode 100644 indra/newview/skins/default/textures/widgets/ScrollThumb_Vert_Over.png delete mode 100644 indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_On.png delete mode 100644 indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_On_Disabled.png delete mode 100644 indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_On_Over.png delete mode 100644 indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_On_Selected.png delete mode 100644 indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_On.png delete mode 100644 indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_On_Over.png delete mode 100644 indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_On_Press.png delete mode 100644 indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Over.png delete mode 100644 indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Selected_Over.png delete mode 100644 indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_On.png delete mode 100644 indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_On_Over.png delete mode 100644 indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_On_Selected.png delete mode 100644 indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_Selected_Over.png delete mode 100644 indra/newview/skins/default/textures/widgets/SliderThumb_Over.png delete mode 100644 indra/newview/skins/default/textures/widgets/Stepper_Down_Over.png delete mode 100644 indra/newview/skins/default/textures/widgets/Stepper_Up_Over.png delete mode 100644 indra/newview/skins/default/textures/windows/Flyout.png delete mode 100644 indra/newview/skins/default/textures/windows/Flyout_Pointer_Up.png delete mode 100644 indra/newview/skins/default/textures/windows/Icon_Gear_Over.png delete mode 100644 indra/newview/skins/default/textures/windows/Icon_Help_Press.png delete mode 100644 indra/newview/skins/default/textures/windows/Icon_Undock_Foreground.png delete mode 100644 indra/newview/skins/default/textures/windows/Icon_Undock_Press.png delete mode 100644 indra/newview/skins/default/textures/windows/hint_arrow_down.png delete mode 100644 indra/newview/skins/default/textures/windows/hint_arrow_up.png (limited to 'indra/newview') diff --git a/indra/newview/skins/default/textures/arrow_keys.png b/indra/newview/skins/default/textures/arrow_keys.png deleted file mode 100644 index f19af59251..0000000000 Binary files a/indra/newview/skins/default/textures/arrow_keys.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/bottomtray/Cam_Pan_Over.png b/indra/newview/skins/default/textures/bottomtray/Cam_Pan_Over.png deleted file mode 100644 index b5781718ec..0000000000 Binary files a/indra/newview/skins/default/textures/bottomtray/Cam_Pan_Over.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/bottomtray/CameraView_Press.png b/indra/newview/skins/default/textures/bottomtray/CameraView_Press.png deleted file mode 100644 index 5a9346fd39..0000000000 Binary files a/indra/newview/skins/default/textures/bottomtray/CameraView_Press.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/bottomtray/PanOrbit_Disabled.png b/indra/newview/skins/default/textures/bottomtray/PanOrbit_Disabled.png deleted file mode 100644 index 20fa40e127..0000000000 Binary files a/indra/newview/skins/default/textures/bottomtray/PanOrbit_Disabled.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/bottomtray/PanOrbit_Over.png b/indra/newview/skins/default/textures/bottomtray/PanOrbit_Over.png deleted file mode 100644 index f1420e0002..0000000000 Binary files a/indra/newview/skins/default/textures/bottomtray/PanOrbit_Over.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/bottomtray/PanOrbit_Press.png b/indra/newview/skins/default/textures/bottomtray/PanOrbit_Press.png deleted file mode 100644 index 89a6269edc..0000000000 Binary files a/indra/newview/skins/default/textures/bottomtray/PanOrbit_Press.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/checkerboard_transparency_bg.png b/indra/newview/skins/default/textures/checkerboard_transparency_bg.png deleted file mode 100644 index 9a16935204..0000000000 Binary files a/indra/newview/skins/default/textures/checkerboard_transparency_bg.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/circle.tga b/indra/newview/skins/default/textures/circle.tga deleted file mode 100644 index d7097e3a35..0000000000 Binary files a/indra/newview/skins/default/textures/circle.tga and /dev/null differ diff --git a/indra/newview/skins/default/textures/containers/Accordion_ArrowClosed_Over.png b/indra/newview/skins/default/textures/containers/Accordion_ArrowClosed_Over.png deleted file mode 100644 index e47f913db1..0000000000 Binary files a/indra/newview/skins/default/textures/containers/Accordion_ArrowClosed_Over.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/containers/Accordion_ArrowOpened_Over.png b/indra/newview/skins/default/textures/containers/Accordion_ArrowOpened_Over.png deleted file mode 100644 index e2c67de9c0..0000000000 Binary files a/indra/newview/skins/default/textures/containers/Accordion_ArrowOpened_Over.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/containers/TabTop_Left_Over.png b/indra/newview/skins/default/textures/containers/TabTop_Left_Over.png deleted file mode 100644 index 295cd89a57..0000000000 Binary files a/indra/newview/skins/default/textures/containers/TabTop_Left_Over.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/containers/TabTop_Middle_Over.png b/indra/newview/skins/default/textures/containers/TabTop_Middle_Over.png deleted file mode 100644 index 0758cbcf0d..0000000000 Binary files a/indra/newview/skins/default/textures/containers/TabTop_Middle_Over.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/containers/TabTop_Right_Over.png b/indra/newview/skins/default/textures/containers/TabTop_Right_Over.png deleted file mode 100644 index c2cbc2b1e5..0000000000 Binary files a/indra/newview/skins/default/textures/containers/TabTop_Right_Over.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/icn_label_web.tga b/indra/newview/skins/default/textures/icn_label_web.tga deleted file mode 100644 index 7c9131dfff..0000000000 Binary files a/indra/newview/skins/default/textures/icn_label_web.tga and /dev/null differ diff --git a/indra/newview/skins/default/textures/icn_media.tga b/indra/newview/skins/default/textures/icn_media.tga deleted file mode 100644 index 43dd342c9d..0000000000 Binary files a/indra/newview/skins/default/textures/icn_media.tga and /dev/null differ diff --git a/indra/newview/skins/default/textures/icn_voice-groupfocus.tga b/indra/newview/skins/default/textures/icn_voice-groupfocus.tga deleted file mode 100644 index 9f48d4609d..0000000000 Binary files a/indra/newview/skins/default/textures/icn_voice-groupfocus.tga and /dev/null differ diff --git a/indra/newview/skins/default/textures/icn_voice-localchat.tga b/indra/newview/skins/default/textures/icn_voice-localchat.tga deleted file mode 100644 index 7cf267eaf5..0000000000 Binary files a/indra/newview/skins/default/textures/icn_voice-localchat.tga and /dev/null differ diff --git a/indra/newview/skins/default/textures/icn_voice-pvtfocus.tga b/indra/newview/skins/default/textures/icn_voice-pvtfocus.tga deleted file mode 100644 index abadb09aaf..0000000000 Binary files a/indra/newview/skins/default/textures/icn_voice-pvtfocus.tga and /dev/null differ diff --git a/indra/newview/skins/default/textures/icon_day_cycle.tga b/indra/newview/skins/default/textures/icon_day_cycle.tga deleted file mode 100644 index 2d5dee1e94..0000000000 Binary files a/indra/newview/skins/default/textures/icon_day_cycle.tga and /dev/null differ diff --git a/indra/newview/skins/default/textures/icon_event_adult.tga b/indra/newview/skins/default/textures/icon_event_adult.tga deleted file mode 100644 index f548126e5a..0000000000 Binary files a/indra/newview/skins/default/textures/icon_event_adult.tga and /dev/null differ diff --git a/indra/newview/skins/default/textures/icon_lock.tga b/indra/newview/skins/default/textures/icon_lock.tga deleted file mode 100644 index 23521aa113..0000000000 Binary files a/indra/newview/skins/default/textures/icon_lock.tga and /dev/null differ diff --git a/indra/newview/skins/default/textures/icons/AddItem_Over.png b/indra/newview/skins/default/textures/icons/AddItem_Over.png deleted file mode 100644 index cad6e8d52f..0000000000 Binary files a/indra/newview/skins/default/textures/icons/AddItem_Over.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/icons/BackArrow_Over.png b/indra/newview/skins/default/textures/icons/BackArrow_Over.png deleted file mode 100644 index b36e03a8cf..0000000000 Binary files a/indra/newview/skins/default/textures/icons/BackArrow_Over.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/icons/DragHandle.png b/indra/newview/skins/default/textures/icons/DragHandle.png deleted file mode 100644 index c3cbc07a33..0000000000 Binary files a/indra/newview/skins/default/textures/icons/DragHandle.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/icons/Generic_Object.png b/indra/newview/skins/default/textures/icons/Generic_Object.png deleted file mode 100644 index e3a80b2aef..0000000000 Binary files a/indra/newview/skins/default/textures/icons/Generic_Object.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/icons/Inv_Gift.png b/indra/newview/skins/default/textures/icons/Inv_Gift.png deleted file mode 100644 index 5afe85d72d..0000000000 Binary files a/indra/newview/skins/default/textures/icons/Inv_Gift.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/icons/OptionsMenu_Over.png b/indra/newview/skins/default/textures/icons/OptionsMenu_Over.png deleted file mode 100644 index fcabd4c6d3..0000000000 Binary files a/indra/newview/skins/default/textures/icons/OptionsMenu_Over.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/icons/OutboxPush_On_Selected.png b/indra/newview/skins/default/textures/icons/OutboxPush_On_Selected.png deleted file mode 100644 index 0e60b417b0..0000000000 Binary files a/indra/newview/skins/default/textures/icons/OutboxPush_On_Selected.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/icons/Parcel_Damage_Light_Alt.png b/indra/newview/skins/default/textures/icons/Parcel_Damage_Light_Alt.png deleted file mode 100644 index d72f02f708..0000000000 Binary files a/indra/newview/skins/default/textures/icons/Parcel_Damage_Light_Alt.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/icons/Parcel_NoScripts_Light.png b/indra/newview/skins/default/textures/icons/Parcel_NoScripts_Light.png deleted file mode 100644 index f82354959e..0000000000 Binary files a/indra/newview/skins/default/textures/icons/Parcel_NoScripts_Light.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/icons/Sync_Progress_1.png b/indra/newview/skins/default/textures/icons/Sync_Progress_1.png deleted file mode 100644 index 624e556376..0000000000 Binary files a/indra/newview/skins/default/textures/icons/Sync_Progress_1.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/icons/Sync_Progress_2.png b/indra/newview/skins/default/textures/icons/Sync_Progress_2.png deleted file mode 100644 index 5769803b3f..0000000000 Binary files a/indra/newview/skins/default/textures/icons/Sync_Progress_2.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/icons/Sync_Progress_3.png b/indra/newview/skins/default/textures/icons/Sync_Progress_3.png deleted file mode 100644 index 92d4bfb020..0000000000 Binary files a/indra/newview/skins/default/textures/icons/Sync_Progress_3.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/icons/Sync_Progress_4.png b/indra/newview/skins/default/textures/icons/Sync_Progress_4.png deleted file mode 100644 index 6d43eb3a9f..0000000000 Binary files a/indra/newview/skins/default/textures/icons/Sync_Progress_4.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/icons/Sync_Progress_5.png b/indra/newview/skins/default/textures/icons/Sync_Progress_5.png deleted file mode 100644 index 766d063c99..0000000000 Binary files a/indra/newview/skins/default/textures/icons/Sync_Progress_5.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/icons/Sync_Progress_6.png b/indra/newview/skins/default/textures/icons/Sync_Progress_6.png deleted file mode 100644 index dfe7f68b72..0000000000 Binary files a/indra/newview/skins/default/textures/icons/Sync_Progress_6.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/icons/TrashItem_Over.png b/indra/newview/skins/default/textures/icons/TrashItem_Over.png deleted file mode 100644 index 1a0eea6c67..0000000000 Binary files a/indra/newview/skins/default/textures/icons/TrashItem_Over.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/icons/parcel_color_EVRY.png b/indra/newview/skins/default/textures/icons/parcel_color_EVRY.png deleted file mode 100644 index b5508423eb..0000000000 Binary files a/indra/newview/skins/default/textures/icons/parcel_color_EVRY.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/icons/parcel_color_EXP.png b/indra/newview/skins/default/textures/icons/parcel_color_EXP.png deleted file mode 100644 index 4813d37198..0000000000 Binary files a/indra/newview/skins/default/textures/icons/parcel_color_EXP.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/icons/parcel_color_M.png b/indra/newview/skins/default/textures/icons/parcel_color_M.png deleted file mode 100644 index 41984c43e4..0000000000 Binary files a/indra/newview/skins/default/textures/icons/parcel_color_M.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/image_edit_icon.tga b/indra/newview/skins/default/textures/image_edit_icon.tga deleted file mode 100644 index 8666f0bbe6..0000000000 Binary files a/indra/newview/skins/default/textures/image_edit_icon.tga and /dev/null differ diff --git a/indra/newview/skins/default/textures/inv_folder_animation.tga b/indra/newview/skins/default/textures/inv_folder_animation.tga deleted file mode 100644 index 1b4df7a2d8..0000000000 Binary files a/indra/newview/skins/default/textures/inv_folder_animation.tga and /dev/null differ diff --git a/indra/newview/skins/default/textures/inv_folder_inbox.tga b/indra/newview/skins/default/textures/inv_folder_inbox.tga deleted file mode 100644 index 04539c2cc4..0000000000 Binary files a/indra/newview/skins/default/textures/inv_folder_inbox.tga and /dev/null differ diff --git a/indra/newview/skins/default/textures/map_avatar_above_8.tga b/indra/newview/skins/default/textures/map_avatar_above_8.tga deleted file mode 100644 index 193428e530..0000000000 Binary files a/indra/newview/skins/default/textures/map_avatar_above_8.tga and /dev/null differ diff --git a/indra/newview/skins/default/textures/map_avatar_below_8.tga b/indra/newview/skins/default/textures/map_avatar_below_8.tga deleted file mode 100644 index 9e14bfab90..0000000000 Binary files a/indra/newview/skins/default/textures/map_avatar_below_8.tga and /dev/null differ diff --git a/indra/newview/skins/default/textures/map_event_adult.tga b/indra/newview/skins/default/textures/map_event_adult.tga deleted file mode 100644 index f548126e5a..0000000000 Binary files a/indra/newview/skins/default/textures/map_event_adult.tga and /dev/null differ diff --git a/indra/newview/skins/default/textures/map_event_mature.tga b/indra/newview/skins/default/textures/map_event_mature.tga deleted file mode 100644 index 71067c0dfd..0000000000 Binary files a/indra/newview/skins/default/textures/map_event_mature.tga and /dev/null differ diff --git a/indra/newview/skins/default/textures/map_track_8.tga b/indra/newview/skins/default/textures/map_track_8.tga deleted file mode 100644 index 53425ff45b..0000000000 Binary files a/indra/newview/skins/default/textures/map_track_8.tga and /dev/null differ diff --git a/indra/newview/skins/default/textures/menu_separator.png b/indra/newview/skins/default/textures/menu_separator.png deleted file mode 100644 index 89dcdcdff5..0000000000 Binary files a/indra/newview/skins/default/textures/menu_separator.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/model_wizard/divider_line.png b/indra/newview/skins/default/textures/model_wizard/divider_line.png deleted file mode 100644 index 76c9e68767..0000000000 Binary files a/indra/newview/skins/default/textures/model_wizard/divider_line.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/mute_icon.tga b/indra/newview/skins/default/textures/mute_icon.tga deleted file mode 100644 index 879b9e6188..0000000000 Binary files a/indra/newview/skins/default/textures/mute_icon.tga and /dev/null differ diff --git a/indra/newview/skins/default/textures/navbar/Arrow_Left_Over.png b/indra/newview/skins/default/textures/navbar/Arrow_Left_Over.png deleted file mode 100644 index a91b74819f..0000000000 Binary files a/indra/newview/skins/default/textures/navbar/Arrow_Left_Over.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/navbar/Arrow_Right_Over.png b/indra/newview/skins/default/textures/navbar/Arrow_Right_Over.png deleted file mode 100644 index a2caf227a7..0000000000 Binary files a/indra/newview/skins/default/textures/navbar/Arrow_Right_Over.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/navbar/Help_Over.png b/indra/newview/skins/default/textures/navbar/Help_Over.png deleted file mode 100644 index b9bc0d0f87..0000000000 Binary files a/indra/newview/skins/default/textures/navbar/Help_Over.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/navbar/Home_Over.png b/indra/newview/skins/default/textures/navbar/Home_Over.png deleted file mode 100644 index d9c6b3842e..0000000000 Binary files a/indra/newview/skins/default/textures/navbar/Home_Over.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/places_rating_adult.tga b/indra/newview/skins/default/textures/places_rating_adult.tga deleted file mode 100644 index c344fb1e78..0000000000 Binary files a/indra/newview/skins/default/textures/places_rating_adult.tga and /dev/null differ diff --git a/indra/newview/skins/default/textures/places_rating_mature.tga b/indra/newview/skins/default/textures/places_rating_mature.tga deleted file mode 100644 index 61c879bc92..0000000000 Binary files a/indra/newview/skins/default/textures/places_rating_mature.tga and /dev/null differ diff --git a/indra/newview/skins/default/textures/places_rating_pg.tga b/indra/newview/skins/default/textures/places_rating_pg.tga deleted file mode 100644 index 7805dbce60..0000000000 Binary files a/indra/newview/skins/default/textures/places_rating_pg.tga and /dev/null differ diff --git a/indra/newview/skins/default/textures/propertyline.tga b/indra/newview/skins/default/textures/propertyline.tga deleted file mode 100644 index 0c504eea71..0000000000 Binary files a/indra/newview/skins/default/textures/propertyline.tga and /dev/null differ diff --git a/indra/newview/skins/default/textures/quick_tips/avatar_free_mode.png b/indra/newview/skins/default/textures/quick_tips/avatar_free_mode.png deleted file mode 100644 index be7c87efb6..0000000000 Binary files a/indra/newview/skins/default/textures/quick_tips/avatar_free_mode.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/quick_tips/camera_free_mode.png b/indra/newview/skins/default/textures/quick_tips/camera_free_mode.png deleted file mode 100644 index 9a3f3703b2..0000000000 Binary files a/indra/newview/skins/default/textures/quick_tips/camera_free_mode.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/quick_tips/camera_orbit_mode.png b/indra/newview/skins/default/textures/quick_tips/camera_orbit_mode.png deleted file mode 100644 index dd72cc0162..0000000000 Binary files a/indra/newview/skins/default/textures/quick_tips/camera_orbit_mode.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/quick_tips/camera_pan_mode.png b/indra/newview/skins/default/textures/quick_tips/camera_pan_mode.png deleted file mode 100644 index b537dcbe46..0000000000 Binary files a/indra/newview/skins/default/textures/quick_tips/camera_pan_mode.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/quick_tips/camera_preset_front_view.png b/indra/newview/skins/default/textures/quick_tips/camera_preset_front_view.png deleted file mode 100644 index 7674a75ac3..0000000000 Binary files a/indra/newview/skins/default/textures/quick_tips/camera_preset_front_view.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/quick_tips/camera_preset_group_view.png b/indra/newview/skins/default/textures/quick_tips/camera_preset_group_view.png deleted file mode 100644 index 9c9b923a5a..0000000000 Binary files a/indra/newview/skins/default/textures/quick_tips/camera_preset_group_view.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/quick_tips/camera_preset_rear_view.png b/indra/newview/skins/default/textures/quick_tips/camera_preset_rear_view.png deleted file mode 100644 index 15c3053491..0000000000 Binary files a/indra/newview/skins/default/textures/quick_tips/camera_preset_rear_view.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/quick_tips/move_fly_first.png b/indra/newview/skins/default/textures/quick_tips/move_fly_first.png deleted file mode 100644 index b6e2ce60e4..0000000000 Binary files a/indra/newview/skins/default/textures/quick_tips/move_fly_first.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/quick_tips/move_fly_second.png b/indra/newview/skins/default/textures/quick_tips/move_fly_second.png deleted file mode 100644 index 84b63cc338..0000000000 Binary files a/indra/newview/skins/default/textures/quick_tips/move_fly_second.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/quick_tips/move_run_first.png b/indra/newview/skins/default/textures/quick_tips/move_run_first.png deleted file mode 100644 index 16093dc683..0000000000 Binary files a/indra/newview/skins/default/textures/quick_tips/move_run_first.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/quick_tips/move_run_second.png b/indra/newview/skins/default/textures/quick_tips/move_run_second.png deleted file mode 100644 index 19fa43ec32..0000000000 Binary files a/indra/newview/skins/default/textures/quick_tips/move_run_second.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/quick_tips/move_walk_first.png b/indra/newview/skins/default/textures/quick_tips/move_walk_first.png deleted file mode 100644 index 92d120d53e..0000000000 Binary files a/indra/newview/skins/default/textures/quick_tips/move_walk_first.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/quick_tips/move_walk_second.png b/indra/newview/skins/default/textures/quick_tips/move_walk_second.png deleted file mode 100644 index f8e28722be..0000000000 Binary files a/indra/newview/skins/default/textures/quick_tips/move_walk_second.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/show_btn.tga b/indra/newview/skins/default/textures/show_btn.tga deleted file mode 100644 index 5f05f377e3..0000000000 Binary files a/indra/newview/skins/default/textures/show_btn.tga and /dev/null differ diff --git a/indra/newview/skins/default/textures/show_btn_selected.tga b/indra/newview/skins/default/textures/show_btn_selected.tga deleted file mode 100644 index 00a2f34a37..0000000000 Binary files a/indra/newview/skins/default/textures/show_btn_selected.tga and /dev/null differ diff --git a/indra/newview/skins/default/textures/smicon_warn.tga b/indra/newview/skins/default/textures/smicon_warn.tga deleted file mode 100644 index 90ccaa07e5..0000000000 Binary files a/indra/newview/skins/default/textures/smicon_warn.tga and /dev/null differ diff --git a/indra/newview/skins/default/textures/spacer35.tga b/indra/newview/skins/default/textures/spacer35.tga deleted file mode 100644 index b88bc6680a..0000000000 Binary files a/indra/newview/skins/default/textures/spacer35.tga and /dev/null differ diff --git a/indra/newview/skins/default/textures/square_btn_32x128.tga b/indra/newview/skins/default/textures/square_btn_32x128.tga deleted file mode 100644 index d7ce58dac3..0000000000 Binary files a/indra/newview/skins/default/textures/square_btn_32x128.tga and /dev/null differ diff --git a/indra/newview/skins/default/textures/square_btn_selected_32x128.tga b/indra/newview/skins/default/textures/square_btn_selected_32x128.tga deleted file mode 100644 index 59ca365aa4..0000000000 Binary files a/indra/newview/skins/default/textures/square_btn_selected_32x128.tga and /dev/null differ diff --git a/indra/newview/skins/default/textures/startup_logo.j2c b/indra/newview/skins/default/textures/startup_logo.j2c deleted file mode 100644 index d1b991f17f..0000000000 Binary files a/indra/newview/skins/default/textures/startup_logo.j2c and /dev/null differ diff --git a/indra/newview/skins/default/textures/status_busy.tga b/indra/newview/skins/default/textures/status_busy.tga deleted file mode 100644 index 7743d9c7bb..0000000000 Binary files a/indra/newview/skins/default/textures/status_busy.tga and /dev/null differ diff --git a/indra/newview/skins/default/textures/taskpanel/TabIcon_Appearance_Off.png b/indra/newview/skins/default/textures/taskpanel/TabIcon_Appearance_Off.png deleted file mode 100644 index 0b91abfb0d..0000000000 Binary files a/indra/newview/skins/default/textures/taskpanel/TabIcon_Appearance_Off.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/taskpanel/TabIcon_Appearance_Selected.png b/indra/newview/skins/default/textures/taskpanel/TabIcon_Appearance_Selected.png deleted file mode 100644 index 33a47236a5..0000000000 Binary files a/indra/newview/skins/default/textures/taskpanel/TabIcon_Appearance_Selected.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/taskpanel/TabIcon_Home_Off.png b/indra/newview/skins/default/textures/taskpanel/TabIcon_Home_Off.png deleted file mode 100644 index 421f5e1705..0000000000 Binary files a/indra/newview/skins/default/textures/taskpanel/TabIcon_Home_Off.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/taskpanel/TabIcon_Me_Selected.png b/indra/newview/skins/default/textures/taskpanel/TabIcon_Me_Selected.png deleted file mode 100644 index 905d4c973e..0000000000 Binary files a/indra/newview/skins/default/textures/taskpanel/TabIcon_Me_Selected.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/taskpanel/TabIcon_People_Selected.png b/indra/newview/skins/default/textures/taskpanel/TabIcon_People_Selected.png deleted file mode 100644 index 909f0d0a47..0000000000 Binary files a/indra/newview/skins/default/textures/taskpanel/TabIcon_People_Selected.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/taskpanel/TabIcon_Places_Large.png b/indra/newview/skins/default/textures/taskpanel/TabIcon_Places_Large.png deleted file mode 100644 index cc505c4a30..0000000000 Binary files a/indra/newview/skins/default/textures/taskpanel/TabIcon_Places_Large.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/taskpanel/TabIcon_Places_Selected.png b/indra/newview/skins/default/textures/taskpanel/TabIcon_Places_Selected.png deleted file mode 100644 index 8e0fb9661e..0000000000 Binary files a/indra/newview/skins/default/textures/taskpanel/TabIcon_Places_Selected.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/taskpanel/TabIcon_Things_Selected.png b/indra/newview/skins/default/textures/taskpanel/TabIcon_Things_Selected.png deleted file mode 100644 index d4ac451c8e..0000000000 Binary files a/indra/newview/skins/default/textures/taskpanel/TabIcon_Things_Selected.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/toolbar_icons/mini_map.png b/indra/newview/skins/default/textures/toolbar_icons/mini_map.png deleted file mode 100644 index ab0a654056..0000000000 Binary files a/indra/newview/skins/default/textures/toolbar_icons/mini_map.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/widgets/Checkbox_On_Over.png b/indra/newview/skins/default/textures/widgets/Checkbox_On_Over.png deleted file mode 100644 index bc504d130e..0000000000 Binary files a/indra/newview/skins/default/textures/widgets/Checkbox_On_Over.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/widgets/Checkbox_Over.png b/indra/newview/skins/default/textures/widgets/Checkbox_Over.png deleted file mode 100644 index 5a7162addf..0000000000 Binary files a/indra/newview/skins/default/textures/widgets/Checkbox_Over.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/widgets/ComboButton_Up_On_Selected.png b/indra/newview/skins/default/textures/widgets/ComboButton_Up_On_Selected.png deleted file mode 100644 index fd1d11dd0b..0000000000 Binary files a/indra/newview/skins/default/textures/widgets/ComboButton_Up_On_Selected.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/widgets/DisclosureArrow_Closed_Over.png b/indra/newview/skins/default/textures/widgets/DisclosureArrow_Closed_Over.png deleted file mode 100644 index 45bcb0464e..0000000000 Binary files a/indra/newview/skins/default/textures/widgets/DisclosureArrow_Closed_Over.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/widgets/DisclosureArrow_Opened_Over.png b/indra/newview/skins/default/textures/widgets/DisclosureArrow_Opened_Over.png deleted file mode 100644 index dabbd85b34..0000000000 Binary files a/indra/newview/skins/default/textures/widgets/DisclosureArrow_Opened_Over.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/widgets/PushButton_On_Over.png b/indra/newview/skins/default/textures/widgets/PushButton_On_Over.png deleted file mode 100644 index 064a4c4f7f..0000000000 Binary files a/indra/newview/skins/default/textures/widgets/PushButton_On_Over.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/widgets/PushButton_Selected_Over.png b/indra/newview/skins/default/textures/widgets/PushButton_Selected_Over.png deleted file mode 100644 index 064a4c4f7f..0000000000 Binary files a/indra/newview/skins/default/textures/widgets/PushButton_Selected_Over.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/widgets/RadioButton_On_Over.png b/indra/newview/skins/default/textures/widgets/RadioButton_On_Over.png deleted file mode 100644 index 3e7d803a28..0000000000 Binary files a/indra/newview/skins/default/textures/widgets/RadioButton_On_Over.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/widgets/RadioButton_Over.png b/indra/newview/skins/default/textures/widgets/RadioButton_Over.png deleted file mode 100644 index a5c8cbe293..0000000000 Binary files a/indra/newview/skins/default/textures/widgets/RadioButton_Over.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/widgets/ScrollArrow_Down.png b/indra/newview/skins/default/textures/widgets/ScrollArrow_Down.png deleted file mode 100644 index 186822da43..0000000000 Binary files a/indra/newview/skins/default/textures/widgets/ScrollArrow_Down.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/widgets/ScrollArrow_Down_Over.png b/indra/newview/skins/default/textures/widgets/ScrollArrow_Down_Over.png deleted file mode 100644 index 605d159eaa..0000000000 Binary files a/indra/newview/skins/default/textures/widgets/ScrollArrow_Down_Over.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/widgets/ScrollArrow_Left_Over.png b/indra/newview/skins/default/textures/widgets/ScrollArrow_Left_Over.png deleted file mode 100644 index c79547dffd..0000000000 Binary files a/indra/newview/skins/default/textures/widgets/ScrollArrow_Left_Over.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/widgets/ScrollArrow_Right_Over.png b/indra/newview/skins/default/textures/widgets/ScrollArrow_Right_Over.png deleted file mode 100644 index e353542ad9..0000000000 Binary files a/indra/newview/skins/default/textures/widgets/ScrollArrow_Right_Over.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/widgets/ScrollArrow_Up.png b/indra/newview/skins/default/textures/widgets/ScrollArrow_Up.png deleted file mode 100644 index 4d245eb57a..0000000000 Binary files a/indra/newview/skins/default/textures/widgets/ScrollArrow_Up.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/widgets/ScrollArrow_Up_Over.png b/indra/newview/skins/default/textures/widgets/ScrollArrow_Up_Over.png deleted file mode 100644 index dd2fceb716..0000000000 Binary files a/indra/newview/skins/default/textures/widgets/ScrollArrow_Up_Over.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/widgets/ScrollThumb_Horiz_Over.png b/indra/newview/skins/default/textures/widgets/ScrollThumb_Horiz_Over.png deleted file mode 100644 index cf78ea3924..0000000000 Binary files a/indra/newview/skins/default/textures/widgets/ScrollThumb_Horiz_Over.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/widgets/ScrollThumb_Vert_Over.png b/indra/newview/skins/default/textures/widgets/ScrollThumb_Vert_Over.png deleted file mode 100644 index 53587197da..0000000000 Binary files a/indra/newview/skins/default/textures/widgets/ScrollThumb_Vert_Over.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_On.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_On.png deleted file mode 100644 index 7afb9c99c3..0000000000 Binary files a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_On.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_On_Disabled.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_On_Disabled.png deleted file mode 100644 index 77c4224539..0000000000 Binary files a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_On_Disabled.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_On_Over.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_On_Over.png deleted file mode 100644 index 8b93dd551e..0000000000 Binary files a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_On_Over.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_On_Selected.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_On_Selected.png deleted file mode 100644 index 3f207cbea2..0000000000 Binary files a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Left_On_Selected.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_On.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_On.png deleted file mode 100644 index 220df9db25..0000000000 Binary files a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_On.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_On_Over.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_On_Over.png deleted file mode 100644 index 5bbcdcb0b4..0000000000 Binary files a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_On_Over.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_On_Press.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_On_Press.png deleted file mode 100644 index dde367f05e..0000000000 Binary files a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_On_Press.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Over.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Over.png deleted file mode 100644 index d4f30b9adb..0000000000 Binary files a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Over.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Selected_Over.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Selected_Over.png deleted file mode 100644 index 5bbcdcb0b4..0000000000 Binary files a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Middle_Selected_Over.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_On.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_On.png deleted file mode 100644 index 467c43fc90..0000000000 Binary files a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_On.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_On_Over.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_On_Over.png deleted file mode 100644 index 2049736897..0000000000 Binary files a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_On_Over.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_On_Selected.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_On_Selected.png deleted file mode 100644 index 1574f48b28..0000000000 Binary files a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_On_Selected.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_Selected_Over.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_Selected_Over.png deleted file mode 100644 index 2049736897..0000000000 Binary files a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_Selected_Over.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/widgets/SliderThumb_Over.png b/indra/newview/skins/default/textures/widgets/SliderThumb_Over.png deleted file mode 100644 index b6f900d3bd..0000000000 Binary files a/indra/newview/skins/default/textures/widgets/SliderThumb_Over.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/widgets/Stepper_Down_Over.png b/indra/newview/skins/default/textures/widgets/Stepper_Down_Over.png deleted file mode 100644 index 01e0a2d9f1..0000000000 Binary files a/indra/newview/skins/default/textures/widgets/Stepper_Down_Over.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/widgets/Stepper_Up_Over.png b/indra/newview/skins/default/textures/widgets/Stepper_Up_Over.png deleted file mode 100644 index 2ce84ea5be..0000000000 Binary files a/indra/newview/skins/default/textures/widgets/Stepper_Up_Over.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/windows/Flyout.png b/indra/newview/skins/default/textures/windows/Flyout.png deleted file mode 100644 index 5596b194c9..0000000000 Binary files a/indra/newview/skins/default/textures/windows/Flyout.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/windows/Flyout_Pointer_Up.png b/indra/newview/skins/default/textures/windows/Flyout_Pointer_Up.png deleted file mode 100644 index 361fab59e0..0000000000 Binary files a/indra/newview/skins/default/textures/windows/Flyout_Pointer_Up.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/windows/Icon_Gear_Over.png b/indra/newview/skins/default/textures/windows/Icon_Gear_Over.png deleted file mode 100644 index 67bd399358..0000000000 Binary files a/indra/newview/skins/default/textures/windows/Icon_Gear_Over.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/windows/Icon_Help_Press.png b/indra/newview/skins/default/textures/windows/Icon_Help_Press.png deleted file mode 100644 index 7478644b6a..0000000000 Binary files a/indra/newview/skins/default/textures/windows/Icon_Help_Press.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/windows/Icon_Undock_Foreground.png b/indra/newview/skins/default/textures/windows/Icon_Undock_Foreground.png deleted file mode 100644 index 9a71d16a3f..0000000000 Binary files a/indra/newview/skins/default/textures/windows/Icon_Undock_Foreground.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/windows/Icon_Undock_Press.png b/indra/newview/skins/default/textures/windows/Icon_Undock_Press.png deleted file mode 100644 index 3ab8c3666a..0000000000 Binary files a/indra/newview/skins/default/textures/windows/Icon_Undock_Press.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/windows/hint_arrow_down.png b/indra/newview/skins/default/textures/windows/hint_arrow_down.png deleted file mode 100644 index ddadef0978..0000000000 Binary files a/indra/newview/skins/default/textures/windows/hint_arrow_down.png and /dev/null differ diff --git a/indra/newview/skins/default/textures/windows/hint_arrow_up.png b/indra/newview/skins/default/textures/windows/hint_arrow_up.png deleted file mode 100644 index bb3e1c07fa..0000000000 Binary files a/indra/newview/skins/default/textures/windows/hint_arrow_up.png and /dev/null differ -- cgit v1.2.3 From 8db1be0d9834b9572b137a820551bdd9c56668b0 Mon Sep 17 00:00:00 2001 From: Richard Linden Date: Wed, 2 Nov 2011 15:26:32 -0700 Subject: restored missing minimap icon --- .../skins/default/textures/toolbar_icons/mini_map.png | Bin 0 -> 1766 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 indra/newview/skins/default/textures/toolbar_icons/mini_map.png (limited to 'indra/newview') diff --git a/indra/newview/skins/default/textures/toolbar_icons/mini_map.png b/indra/newview/skins/default/textures/toolbar_icons/mini_map.png new file mode 100644 index 0000000000..ab0a654056 Binary files /dev/null and b/indra/newview/skins/default/textures/toolbar_icons/mini_map.png differ -- cgit v1.2.3 From 86927066473a912a8f65b03c60776a99debc70b8 Mon Sep 17 00:00:00 2001 From: Leslie Linden Date: Wed, 2 Nov 2011 15:39:42 -0700 Subject: EXP-1178 FIX -- Places floater sorted weird and landmark folders inside are open --- indra/newview/llpanellandmarks.cpp | 4 ---- 1 file changed, 4 deletions(-) (limited to 'indra/newview') diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp index a65631b8d8..c7454e85a9 100644 --- a/indra/newview/llpanellandmarks.cpp +++ b/indra/newview/llpanellandmarks.cpp @@ -1399,10 +1399,6 @@ static void filter_list(LLPlacesInventoryPanel* inventory_list, const std::strin inventory_list->restoreFolderState(); } - // Open the immediate children of the root folder, since those - // are invisible in the UI and thus must always be open. - inventory_list->getRootFolder()->openTopLevelFolders(); - if (inventory_list->getFilterSubString().empty() && string.empty()) { // current filter and new filter empty, do nothing -- cgit v1.2.3 From 424d100f7d96cd11eabd6dfd56241d3b84cfd976 Mon Sep 17 00:00:00 2001 From: Richard Linden Date: Wed, 2 Nov 2011 15:44:26 -0700 Subject: restored final set of referenced images --- .../skins/default/textures/icons/Sync_Progress_1.png | Bin 0 -> 1149 bytes .../skins/default/textures/icons/Sync_Progress_2.png | Bin 0 -> 1147 bytes .../skins/default/textures/icons/Sync_Progress_3.png | Bin 0 -> 1211 bytes .../skins/default/textures/icons/Sync_Progress_4.png | Bin 0 -> 1205 bytes .../skins/default/textures/icons/Sync_Progress_5.png | Bin 0 -> 1137 bytes .../skins/default/textures/icons/Sync_Progress_6.png | Bin 0 -> 1164 bytes indra/newview/skins/default/textures/menu_separator.png | Bin 0 -> 2831 bytes .../skins/default/textures/widgets/ScrollArrow_Down.png | Bin 0 -> 239 bytes .../skins/default/textures/widgets/ScrollArrow_Up.png | Bin 0 -> 262 bytes .../textures/widgets/SegmentedBtn_Right_On_Selected.png | Bin 0 -> 502 bytes .../skins/default/textures/windows/Icon_Help_Press.png | Bin 0 -> 3062 bytes .../default/textures/windows/Icon_Undock_Foreground.png | Bin 0 -> 268 bytes .../skins/default/textures/windows/hint_arrow_down.png | Bin 0 -> 3170 bytes .../skins/default/textures/windows/hint_arrow_up.png | Bin 0 -> 3219 bytes 14 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 indra/newview/skins/default/textures/icons/Sync_Progress_1.png create mode 100644 indra/newview/skins/default/textures/icons/Sync_Progress_2.png create mode 100644 indra/newview/skins/default/textures/icons/Sync_Progress_3.png create mode 100644 indra/newview/skins/default/textures/icons/Sync_Progress_4.png create mode 100644 indra/newview/skins/default/textures/icons/Sync_Progress_5.png create mode 100644 indra/newview/skins/default/textures/icons/Sync_Progress_6.png create mode 100644 indra/newview/skins/default/textures/menu_separator.png create mode 100644 indra/newview/skins/default/textures/widgets/ScrollArrow_Down.png create mode 100644 indra/newview/skins/default/textures/widgets/ScrollArrow_Up.png create mode 100644 indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_On_Selected.png create mode 100644 indra/newview/skins/default/textures/windows/Icon_Help_Press.png create mode 100644 indra/newview/skins/default/textures/windows/Icon_Undock_Foreground.png create mode 100644 indra/newview/skins/default/textures/windows/hint_arrow_down.png create mode 100644 indra/newview/skins/default/textures/windows/hint_arrow_up.png (limited to 'indra/newview') diff --git a/indra/newview/skins/default/textures/icons/Sync_Progress_1.png b/indra/newview/skins/default/textures/icons/Sync_Progress_1.png new file mode 100644 index 0000000000..624e556376 Binary files /dev/null and b/indra/newview/skins/default/textures/icons/Sync_Progress_1.png differ diff --git a/indra/newview/skins/default/textures/icons/Sync_Progress_2.png b/indra/newview/skins/default/textures/icons/Sync_Progress_2.png new file mode 100644 index 0000000000..5769803b3f Binary files /dev/null and b/indra/newview/skins/default/textures/icons/Sync_Progress_2.png differ diff --git a/indra/newview/skins/default/textures/icons/Sync_Progress_3.png b/indra/newview/skins/default/textures/icons/Sync_Progress_3.png new file mode 100644 index 0000000000..92d4bfb020 Binary files /dev/null and b/indra/newview/skins/default/textures/icons/Sync_Progress_3.png differ diff --git a/indra/newview/skins/default/textures/icons/Sync_Progress_4.png b/indra/newview/skins/default/textures/icons/Sync_Progress_4.png new file mode 100644 index 0000000000..6d43eb3a9f Binary files /dev/null and b/indra/newview/skins/default/textures/icons/Sync_Progress_4.png differ diff --git a/indra/newview/skins/default/textures/icons/Sync_Progress_5.png b/indra/newview/skins/default/textures/icons/Sync_Progress_5.png new file mode 100644 index 0000000000..766d063c99 Binary files /dev/null and b/indra/newview/skins/default/textures/icons/Sync_Progress_5.png differ diff --git a/indra/newview/skins/default/textures/icons/Sync_Progress_6.png b/indra/newview/skins/default/textures/icons/Sync_Progress_6.png new file mode 100644 index 0000000000..dfe7f68b72 Binary files /dev/null and b/indra/newview/skins/default/textures/icons/Sync_Progress_6.png differ diff --git a/indra/newview/skins/default/textures/menu_separator.png b/indra/newview/skins/default/textures/menu_separator.png new file mode 100644 index 0000000000..89dcdcdff5 Binary files /dev/null and b/indra/newview/skins/default/textures/menu_separator.png differ diff --git a/indra/newview/skins/default/textures/widgets/ScrollArrow_Down.png b/indra/newview/skins/default/textures/widgets/ScrollArrow_Down.png new file mode 100644 index 0000000000..186822da43 Binary files /dev/null and b/indra/newview/skins/default/textures/widgets/ScrollArrow_Down.png differ diff --git a/indra/newview/skins/default/textures/widgets/ScrollArrow_Up.png b/indra/newview/skins/default/textures/widgets/ScrollArrow_Up.png new file mode 100644 index 0000000000..4d245eb57a Binary files /dev/null and b/indra/newview/skins/default/textures/widgets/ScrollArrow_Up.png differ diff --git a/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_On_Selected.png b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_On_Selected.png new file mode 100644 index 0000000000..1574f48b28 Binary files /dev/null and b/indra/newview/skins/default/textures/widgets/SegmentedBtn_Right_On_Selected.png differ diff --git a/indra/newview/skins/default/textures/windows/Icon_Help_Press.png b/indra/newview/skins/default/textures/windows/Icon_Help_Press.png new file mode 100644 index 0000000000..7478644b6a Binary files /dev/null and b/indra/newview/skins/default/textures/windows/Icon_Help_Press.png differ diff --git a/indra/newview/skins/default/textures/windows/Icon_Undock_Foreground.png b/indra/newview/skins/default/textures/windows/Icon_Undock_Foreground.png new file mode 100644 index 0000000000..9a71d16a3f Binary files /dev/null and b/indra/newview/skins/default/textures/windows/Icon_Undock_Foreground.png differ diff --git a/indra/newview/skins/default/textures/windows/hint_arrow_down.png b/indra/newview/skins/default/textures/windows/hint_arrow_down.png new file mode 100644 index 0000000000..ddadef0978 Binary files /dev/null and b/indra/newview/skins/default/textures/windows/hint_arrow_down.png differ diff --git a/indra/newview/skins/default/textures/windows/hint_arrow_up.png b/indra/newview/skins/default/textures/windows/hint_arrow_up.png new file mode 100644 index 0000000000..bb3e1c07fa Binary files /dev/null and b/indra/newview/skins/default/textures/windows/hint_arrow_up.png differ -- cgit v1.2.3 From 57eaa1d6f1b197022bd8e16462454306665ccda7 Mon Sep 17 00:00:00 2001 From: Richard Linden Date: Wed, 2 Nov 2011 15:45:41 -0700 Subject: minor syntactical cleanup --- indra/newview/skins/default/textures/textures.xml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) (limited to 'indra/newview') diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml index 362248c3c5..c93f106418 100644 --- a/indra/newview/skins/default/textures/textures.xml +++ b/indra/newview/skins/default/textures/textures.xml @@ -39,7 +39,7 @@ with the same filename but different name - + @@ -48,9 +48,6 @@ with the same filename but different name - - -- cgit v1.2.3 From 1806b59e85e82eaddbd10e56213aba7ec8e3ce85 Mon Sep 17 00:00:00 2001 From: Richard Linden Date: Wed, 2 Nov 2011 18:45:10 -0700 Subject: EXP-1390 FIX Cannot see full sound icon when in IM call when background is a dark co --- .../textures/bottomtray/VoicePTT_Lvl1_Dark.png | Bin 1394 -> 602 bytes .../textures/bottomtray/VoicePTT_Lvl2_Dark.png | Bin 1453 -> 669 bytes .../textures/bottomtray/VoicePTT_Lvl3_Dark.png | Bin 1426 -> 639 bytes .../textures/bottomtray/VoicePTT_Off_Dark.png | Bin 1353 -> 547 bytes .../textures/bottomtray/VoicePTT_On_Dark.png | Bin 1342 -> 526 bytes indra/newview/skins/default/textures/textures.xml | 1 - .../default/xui/en/widgets/chiclet_im_adhoc.xml | 20 +++++++++++++------- .../default/xui/en/widgets/chiclet_im_group.xml | 20 +++++++++++++------- .../skins/default/xui/en/widgets/chiclet_im_p2p.xml | 20 +++++++++++++------- 9 files changed, 39 insertions(+), 22 deletions(-) (limited to 'indra/newview') diff --git a/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl1_Dark.png b/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl1_Dark.png index 9ef5465dd3..857fa1e047 100644 Binary files a/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl1_Dark.png and b/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl1_Dark.png differ diff --git a/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl2_Dark.png b/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl2_Dark.png index 38918b9bed..453bb53673 100644 Binary files a/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl2_Dark.png and b/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl2_Dark.png differ diff --git a/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl3_Dark.png b/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl3_Dark.png index 180385e29e..135a66ca0d 100644 Binary files a/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl3_Dark.png and b/indra/newview/skins/default/textures/bottomtray/VoicePTT_Lvl3_Dark.png differ diff --git a/indra/newview/skins/default/textures/bottomtray/VoicePTT_Off_Dark.png b/indra/newview/skins/default/textures/bottomtray/VoicePTT_Off_Dark.png index 42fed4183b..a63aec5e6d 100644 Binary files a/indra/newview/skins/default/textures/bottomtray/VoicePTT_Off_Dark.png and b/indra/newview/skins/default/textures/bottomtray/VoicePTT_Off_Dark.png differ diff --git a/indra/newview/skins/default/textures/bottomtray/VoicePTT_On_Dark.png b/indra/newview/skins/default/textures/bottomtray/VoicePTT_On_Dark.png index fa09006d1f..1719eb3e84 100644 Binary files a/indra/newview/skins/default/textures/bottomtray/VoicePTT_On_Dark.png and b/indra/newview/skins/default/textures/bottomtray/VoicePTT_On_Dark.png differ diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml index c93f106418..d2c5f6af3e 100644 --- a/indra/newview/skins/default/textures/textures.xml +++ b/indra/newview/skins/default/textures/textures.xml @@ -569,7 +569,6 @@ with the same filename but different name - diff --git a/indra/newview/skins/default/xui/en/widgets/chiclet_im_adhoc.xml b/indra/newview/skins/default/xui/en/widgets/chiclet_im_adhoc.xml index 413ca1d1ef..f47e9874b4 100644 --- a/indra/newview/skins/default/xui/en/widgets/chiclet_im_adhoc.xml +++ b/indra/newview/skins/default/xui/en/widgets/chiclet_im_adhoc.xml @@ -12,13 +12,19 @@ tab_stop="false" width="25" /> + image_mute="Parcel_VoiceNo_Light" + image_off="VoicePTT_Off_Dark" + image_on="VoicePTT_On_Dark" + image_level_1="VoicePTT_Lvl1_Dark" + image_level_2="VoicePTT_Lvl2_Dark" + image_level_3="VoicePTT_Lvl3_Dark" + auto_update="true" + draw_border="false" + height="24" + left="25" + name="speaker" + visible="false" + width="20" /> + image_mute="Parcel_VoiceNo_Light" + image_off="VoicePTT_Off_Dark" + image_on="VoicePTT_On_Dark" + image_level_1="VoicePTT_Lvl1_Dark" + image_level_2="VoicePTT_Lvl2_Dark" + image_level_3="VoicePTT_Lvl3_Dark" + auto_update="true" + draw_border="false" + height="24" + left="25" + name="speaker" + visible="false" + width="20" /> + image_mute="Parcel_VoiceNo_Light" + image_off="VoicePTT_Off_Dark" + image_on="VoicePTT_On_Dark" + image_level_1="VoicePTT_Lvl1_Dark" + image_level_2="VoicePTT_Lvl2_Dark" + image_level_3="VoicePTT_Lvl3_Dark" + auto_update="true" + draw_border="false" + height="24" + left="25" + name="speaker" + visible="false" + width="20" /> Date: Thu, 3 Nov 2011 15:39:12 +0200 Subject: STORM-1580 WIP Implemented new "Working" and "Success/Failure" screens. --- indra/newview/CMakeLists.txt | 2 - indra/newview/llfloatersnapshot.cpp | 127 +++++++++++++++++++-- indra/newview/llfloatersnapshot.h | 4 +- indra/newview/llpanelpostprogress.cpp | 59 ---------- indra/newview/llpanelpostresult.cpp | 90 --------------- indra/newview/llpanelsnapshot.cpp | 28 +++++ indra/newview/llpanelsnapshot.h | 7 +- indra/newview/llpanelsnapshotinventory.cpp | 23 +--- indra/newview/llpanelsnapshotlocal.cpp | 24 ++-- indra/newview/llpanelsnapshotpostcard.cpp | 25 +--- indra/newview/llpanelsnapshotprofile.cpp | 23 +--- .../skins/default/xui/en/floater_snapshot.xml | 90 ++++++++++++--- .../skins/default/xui/en/panel_post_progress.xml | 55 --------- .../skins/default/xui/en/panel_post_result.xml | 78 ------------- .../default/xui/en/panel_snapshot_options.xml | 64 +++++++++++ 15 files changed, 314 insertions(+), 385 deletions(-) delete mode 100644 indra/newview/llpanelpostprogress.cpp delete mode 100644 indra/newview/llpanelpostresult.cpp delete mode 100644 indra/newview/skins/default/xui/en/panel_post_progress.xml delete mode 100644 indra/newview/skins/default/xui/en/panel_post_result.xml (limited to 'indra/newview') diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 63b05f5a1d..ff9cf3199e 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -392,8 +392,6 @@ set(viewer_SOURCE_FILES llpanelplaceprofile.cpp llpanelplaces.cpp llpanelplacestab.cpp - llpanelpostprogress.cpp - llpanelpostresult.cpp llpanelprimmediacontrols.cpp llpanelprofile.cpp llpanelprofileview.cpp diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp index 08ca1e8cea..3df715e24b 100644 --- a/indra/newview/llfloatersnapshot.cpp +++ b/indra/newview/llfloatersnapshot.cpp @@ -86,7 +86,7 @@ ///---------------------------------------------------------------------------- /// Local function declarations, constants, enums, and typedefs ///---------------------------------------------------------------------------- -LLRect LLFloaterSnapshot::sThumbnailPlaceholderRect; +LLUICtrl* LLFloaterSnapshot::sThumbnailPlaceholder = NULL; LLSnapshotFloaterView* gSnapshotFloaterView = NULL; const F32 AUTO_SNAPSHOT_TIME_DELAY = 1.f; @@ -1063,10 +1063,18 @@ void LLSnapshotLivePreview::regionNameCallback(LLImageJPEG* snapshot, LLSD& meta class LLFloaterSnapshot::Impl { public: + typedef enum e_status + { + STATUS_READY, + STATUS_WORKING, + STATUS_FINISHED + } EStatus; + Impl() : mAvatarPauseHandles(), mLastToolset(NULL), - mAspectRatioCheckOff(false) + mAspectRatioCheckOff(false), + mStatus(STATUS_READY) { } ~Impl() @@ -1114,6 +1122,8 @@ public: static void updateControls(LLFloaterSnapshot* floater); static void updateLayout(LLFloaterSnapshot* floater); static void updateResolutionTextEntry(LLFloaterSnapshot* floater); + static void setStatus(EStatus status, bool ok = true, const std::string& msg = LLStringUtil::null); + EStatus getStatus() const { return mStatus; } private: static LLSnapshotLivePreview::ESnapshotType getTypeIndex(const std::string& id); @@ -1122,6 +1132,9 @@ private: static void comboSetCustom(LLFloaterSnapshot *floater, const std::string& comboname); static void checkAutoSnapshot(LLSnapshotLivePreview* floater, BOOL update_thumbnail = FALSE); static void checkAspectRatio(LLFloaterSnapshot *view, S32 index) ; + static void setWorking(LLFloaterSnapshot* floater, bool working); + static void setFinished(LLFloaterSnapshot* floater, bool finished, bool ok = true, const std::string& msg = LLStringUtil::null); + public: std::vector mAvatarPauseHandles; @@ -1129,6 +1142,7 @@ public: LLToolset* mLastToolset; LLHandle mPreviewHandle; bool mAspectRatioCheckOff ; + EStatus mStatus; }; // static @@ -1575,6 +1589,29 @@ void LLFloaterSnapshot::Impl::updateResolutionTextEntry(LLFloaterSnapshot* float } } +// static +void LLFloaterSnapshot::Impl::setStatus(EStatus status, bool ok, const std::string& msg) +{ + LLFloaterSnapshot* floater = LLFloaterSnapshot::getInstance(); + switch (status) + { + case STATUS_READY: + setWorking(floater, false); + setFinished(floater, false); + break; + case STATUS_WORKING: + setWorking(floater, true); + setFinished(floater, false); + break; + case STATUS_FINISHED: + setWorking(floater, false); + setFinished(floater, true, ok, msg); + break; + } + + floater->impl.mStatus = status; +} + // static void LLFloaterSnapshot::Impl::checkAutoSnapshot(LLSnapshotLivePreview* previewp, BOOL update_thumbnail) { @@ -1770,6 +1807,44 @@ void LLFloaterSnapshot::Impl::checkAspectRatio(LLFloaterSnapshot *view, S32 inde return ; } +// static +void LLFloaterSnapshot::Impl::setWorking(LLFloaterSnapshot* floater, bool working) +{ + LLUICtrl* working_lbl = floater->getChild("working_lbl"); + working_lbl->setVisible(working); + floater->getChild("working_indicator")->setVisible(working); + + if (working) + { + const std::string panel_name = getActivePanel(floater, false)->getName(); + const std::string prefix = panel_name.substr(std::string("panel_snapshot_").size()); + std::string progress_text = floater->getString(prefix + "_" + "progress_str"); + working_lbl->setValue(progress_text); + } + + // All controls should be disable while posting. + floater->setCtrlsEnabled(!working); + LLPanelSnapshot* active_panel = getActivePanel(floater); + if (active_panel) + { + active_panel->setCtrlsEnabled(!working); + } +} + +// static +void LLFloaterSnapshot::Impl::setFinished(LLFloaterSnapshot* floater, bool finished, bool ok, const std::string& msg) +{ + floater->getChild("succeeded_panel")->setVisible(finished && ok); + floater->getChild("failed_panel")->setVisible(finished && !ok); + + if (finished) + { + LLUICtrl* finished_lbl = floater->getChild(ok ? "succeeded_lbl" : "failed_lbl"); + std::string result_text = floater->getString(msg + "_" + (ok ? "succeeded_str" : "failed_str")); + finished_lbl->setValue(result_text); + } +} + static std::string lastSnapshotWidthName(S32 shot_type) { switch (shot_type) @@ -2167,14 +2242,16 @@ void LLFloaterSnapshot::Impl::applyCustomResolution(LLFloaterSnapshot* view, S32 // static void LLFloaterSnapshot::Impl::onSnapshotUploadFinished(LLSideTrayPanelContainer* panel_container, bool status) { - panel_container->openPanel("panel_post_result", LLSD().with("post-result", status).with("post-type", "profile")); + panel_container->openPreviousPanel(); + setStatus(STATUS_FINISHED, status, "profile"); } // static void LLFloaterSnapshot::Impl::onSendingPostcardFinished(LLSideTrayPanelContainer* panel_container, bool status) { - panel_container->openPanel("panel_post_result", LLSD().with("post-result", status).with("post-type", "postcard")); + panel_container->openPreviousPanel(); + setStatus(STATUS_FINISHED, status, "postcard"); } ///---------------------------------------------------------------------------- @@ -2265,8 +2342,7 @@ BOOL LLFloaterSnapshot::postBuild() LLWebProfile::setImageUploadResultCallback(boost::bind(&LLFloaterSnapshot::Impl::onSnapshotUploadFinished, panel_container, _1)); LLPostCard::setPostResultCallback(boost::bind(&LLFloaterSnapshot::Impl::onSendingPostcardFinished, panel_container, _1)); - // remember preview rect - sThumbnailPlaceholderRect = getChild("thumbnail_placeholder")->getRect(); + sThumbnailPlaceholder = getChild("thumbnail_placeholder"); // create preview window LLRect full_screen_rect = getRootView()->getRect(); @@ -2307,18 +2383,32 @@ void LLFloaterSnapshot::draw() { if(previewp->getThumbnailImage()) { - LLRect& thumbnail_rect = sThumbnailPlaceholderRect; + bool working = impl.getStatus() == Impl::STATUS_WORKING; + const LLRect& thumbnail_rect = getThumbnailPlaceholderRect(); S32 offset_x = thumbnail_rect.mLeft + (thumbnail_rect.getWidth() - previewp->getThumbnailWidth()) / 2 ; S32 offset_y = thumbnail_rect.mBottom + (thumbnail_rect.getHeight() - previewp->getThumbnailHeight()) / 2 ; glMatrixMode(GL_MODELVIEW); // Apply floater transparency to the texture unless the floater is focused. F32 alpha = getTransparencyType() == TT_ACTIVE ? 1.0f : getCurrentTransparency(); + LLColor4 color = working ? LLColor4::grey4 : LLColor4::white; gl_draw_scaled_image(offset_x, offset_y, previewp->getThumbnailWidth(), previewp->getThumbnailHeight(), - previewp->getThumbnailImage(), LLColor4::white % alpha); + previewp->getThumbnailImage(), color % alpha); previewp->drawPreviewRect(offset_x, offset_y) ; + + if (working) + { + gGL.pushUIMatrix(); + { + const LLRect& r = getThumbnailPlaceholderRect(); + //gGL.translateUI((F32) r.mLeft, (F32) r.mBottom, 0.f); + LLUI::translate((F32) r.mLeft, (F32) r.mBottom); + sThumbnailPlaceholder->draw(); + } + gGL.popUIMatrix(); + } } } } @@ -2377,6 +2467,24 @@ S32 LLFloaterSnapshot::notify(const LLSD& info) return 1; } + if (info.has("set-ready")) + { + impl.setStatus(Impl::STATUS_READY); + return 1; + } + + if (info.has("set-working")) + { + impl.setStatus(Impl::STATUS_WORKING); + return 1; + } + + if (info.has("set-finished")) + { + LLSD data = info["set-finished"]; + impl.setStatus(Impl::STATUS_FINISHED, data["ok"].asBoolean(), data["msg"].asString()); + return 1; + } return 0; } @@ -2425,7 +2533,6 @@ void LLFloaterSnapshot::saveTexture() } previewp->saveTexture(); - instance->postSave(); } // static @@ -2447,7 +2554,6 @@ void LLFloaterSnapshot::saveLocal() } previewp->saveLocal(); - instance->postSave(); } // static @@ -2483,6 +2589,7 @@ void LLFloaterSnapshot::postSave() } instance->impl.updateControls(instance); + instance->impl.setStatus(Impl::STATUS_WORKING); } // static diff --git a/indra/newview/llfloatersnapshot.h b/indra/newview/llfloatersnapshot.h index de69824ad0..2c79c749d6 100644 --- a/indra/newview/llfloatersnapshot.h +++ b/indra/newview/llfloatersnapshot.h @@ -67,10 +67,10 @@ public: static const LLVector3d& getPosTakenGlobal(); static void setAgentEmail(const std::string& email); - static const LLRect& getThumbnailPlaceholderRect() { return sThumbnailPlaceholderRect; } + static const LLRect& getThumbnailPlaceholderRect() { return sThumbnailPlaceholder->getRect(); } private: - static LLRect sThumbnailPlaceholderRect; + static LLUICtrl* sThumbnailPlaceholder; class Impl; Impl& impl; diff --git a/indra/newview/llpanelpostprogress.cpp b/indra/newview/llpanelpostprogress.cpp deleted file mode 100644 index 9b7de2cb23..0000000000 --- a/indra/newview/llpanelpostprogress.cpp +++ /dev/null @@ -1,59 +0,0 @@ -/** - * @file llpanelpostprogress.cpp - * @brief Displays progress of publishing a snapshot. - * - * $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 termsllpanelpostprogress 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 "llfloaterreg.h" -#include "llpanel.h" -#include "llsidetraypanelcontainer.h" - -/** - * Displays progress of publishing a snapshot. - */ -class LLPanelPostProgress -: public LLPanel -{ - LOG_CLASS(LLPanelPostProgress); - -public: - /*virtual*/ void onOpen(const LLSD& key); -}; - -static LLRegisterPanelClassWrapper panel_class("llpanelpostprogress"); - -// virtual -void LLPanelPostProgress::onOpen(const LLSD& key) -{ - if (key.has("post-type")) - { - std::string progress_text = getString(key["post-type"].asString() + "_" + "progress_str"); - getChild("progress_lbl")->setText(progress_text); - } - else - { - llwarns << "Invalid key" << llendl; - } -} diff --git a/indra/newview/llpanelpostresult.cpp b/indra/newview/llpanelpostresult.cpp deleted file mode 100644 index 2b937d83b9..0000000000 --- a/indra/newview/llpanelpostresult.cpp +++ /dev/null @@ -1,90 +0,0 @@ -/** - * @file llpanelpostresult.cpp - * @brief Result of publishing a snapshot (success/failure). - * - * $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 "llfloaterreg.h" -#include "llpanel.h" -#include "llsidetraypanelcontainer.h" - -/** - * Displays snapshot publishing result. - */ -class LLPanelPostResult -: public LLPanel -{ - LOG_CLASS(LLPanelPostResult); - -public: - LLPanelPostResult(); - - /*virtual*/ void onOpen(const LLSD& key); -private: - void onBack(); - void onClose(); -}; - -static LLRegisterPanelClassWrapper panel_class("llpanelpostresult"); - -LLPanelPostResult::LLPanelPostResult() -{ - mCommitCallbackRegistrar.add("Snapshot.Result.Back", boost::bind(&LLPanelPostResult::onBack, this)); - mCommitCallbackRegistrar.add("Snapshot.Result.Close", boost::bind(&LLPanelPostResult::onClose, this)); -} - - -// virtual -void LLPanelPostResult::onOpen(const LLSD& key) -{ - if (key.isMap() && key.has("post-result") && key.has("post-type")) - { - bool ok = key["post-result"].asBoolean(); - std::string type = key["post-type"].asString(); - std::string result_text = getString(type + "_" + (ok ? "succeeded_str" : "failed_str")); - getChild("result_lbl")->setText(result_text); - } - else - { - llwarns << "Invalid key" << llendl; - } -} - -void LLPanelPostResult::onBack() -{ - LLSideTrayPanelContainer* parent = dynamic_cast(getParent()); - if (!parent) - { - llwarns << "Cannot find panel container" << llendl; - return; - } - - parent->openPreviousPanel(); -} - -void LLPanelPostResult::onClose() -{ - LLFloaterReg::hideInstance("snapshot"); -} diff --git a/indra/newview/llpanelsnapshot.cpp b/indra/newview/llpanelsnapshot.cpp index e89e62c750..893f1ca43c 100644 --- a/indra/newview/llpanelsnapshot.cpp +++ b/indra/newview/llpanelsnapshot.cpp @@ -35,6 +35,19 @@ // newview #include "llsidetraypanelcontainer.h" +// virtual +BOOL LLPanelSnapshot::postBuild() +{ + updateControls(LLSD()); + return TRUE; +} + +// virtual +void LLPanelSnapshot::onOpen(const LLSD& key) +{ + setCtrlsEnabled(true); +} + LLFloaterSnapshot::ESnapshotFormat LLPanelSnapshot::getImageFormat() const { return LLFloaterSnapshot::SNAPSHOT_FORMAT_JPEG; @@ -107,3 +120,18 @@ void LLPanelSnapshot::updateImageQualityLevel() getChild("image_quality_level")->setTextArg("[QLVL]", quality_lvl); } + +void LLPanelSnapshot::goBack() +{ + LLSideTrayPanelContainer* parent = getParentContainer(); + if (parent) + { + parent->openPreviousPanel(); + } +} + +void LLPanelSnapshot::cancel() +{ + goBack(); + LLFloaterSnapshot::getInstance()->notify(LLSD().with("set-ready", true)); +} diff --git a/indra/newview/llpanelsnapshot.h b/indra/newview/llpanelsnapshot.h index a227317d2f..eaa0bc42c6 100644 --- a/indra/newview/llpanelsnapshot.h +++ b/indra/newview/llpanelsnapshot.h @@ -37,6 +37,9 @@ class LLSideTrayPanelContainer; class LLPanelSnapshot: public LLPanel { public: + /*virtual*/ BOOL postBuild(); + /*virtual*/ void onOpen(const LLSD& key); + virtual std::string getWidthSpinnerName() const = 0; virtual std::string getHeightSpinnerName() const = 0; virtual std::string getAspectRatioCBName() const = 0; @@ -48,11 +51,13 @@ public: virtual LLSpinCtrl* getHeightSpinner(); virtual void enableAspectRatioCheckbox(BOOL enable); virtual LLFloaterSnapshot::ESnapshotFormat getImageFormat() const; - virtual void updateControls(const LLSD& info) {} ///< Update controls from saved settings + virtual void updateControls(const LLSD& info) = 0; ///< Update controls from saved settings protected: LLSideTrayPanelContainer* getParentContainer(); void updateImageQualityLevel(); + void goBack(); ///< Switch to the default (Snapshot Options) panel + void cancel(); }; #endif // LL_LLPANELSNAPSHOT_H diff --git a/indra/newview/llpanelsnapshotinventory.cpp b/indra/newview/llpanelsnapshotinventory.cpp index 6419c37494..c781138f88 100644 --- a/indra/newview/llpanelsnapshotinventory.cpp +++ b/indra/newview/llpanelsnapshotinventory.cpp @@ -60,7 +60,6 @@ private: void onCustomResolutionCommit(LLUICtrl* ctrl); void onKeepAspectRatioCommit(LLUICtrl* ctrl); void onSend(); - void onCancel(); }; static LLRegisterPanelClassWrapper panel_class("llpanelsnapshotinventory"); @@ -68,7 +67,7 @@ static LLRegisterPanelClassWrapper panel_class("llpane LLPanelSnapshotInventory::LLPanelSnapshotInventory() { mCommitCallbackRegistrar.add("Inventory.Save", boost::bind(&LLPanelSnapshotInventory::onSend, this)); - mCommitCallbackRegistrar.add("Inventory.Cancel", boost::bind(&LLPanelSnapshotInventory::onCancel, this)); + mCommitCallbackRegistrar.add("Inventory.Cancel", boost::bind(&LLPanelSnapshotInventory::cancel, this)); } // virtual @@ -78,7 +77,7 @@ BOOL LLPanelSnapshotInventory::postBuild() getChild(getWidthSpinnerName())->setCommitCallback(boost::bind(&LLPanelSnapshotInventory::onCustomResolutionCommit, this, _1)); getChild(getHeightSpinnerName())->setCommitCallback(boost::bind(&LLPanelSnapshotInventory::onCustomResolutionCommit, this, _1)); getChild(getAspectRatioCBName())->setCommitCallback(boost::bind(&LLPanelSnapshotInventory::onKeepAspectRatioCommit, this, _1)); - return TRUE; + return LLPanelSnapshot::postBuild(); } // virtual @@ -88,6 +87,7 @@ void LLPanelSnapshotInventory::onOpen(const LLSD& key) getChild(getImageSizeComboName())->selectNthItem(0); // FIXME? has no effect #endif updateCustomResControls(); + LLPanelSnapshot::onOpen(key); } void LLPanelSnapshotInventory::updateCustomResControls() @@ -132,21 +132,6 @@ void LLPanelSnapshotInventory::onKeepAspectRatioCommit(LLUICtrl* ctrl) void LLPanelSnapshotInventory::onSend() { - // Switch to upload progress display. - LLSideTrayPanelContainer* parent = getParentContainer(); - if (parent) - { - parent->openPanel("panel_post_progress", LLSD().with("post-type", "inventory")); - } - LLFloaterSnapshot::saveTexture(); -} - -void LLPanelSnapshotInventory::onCancel() -{ - LLSideTrayPanelContainer* parent = getParentContainer(); - if (parent) - { - parent->openPreviousPanel(); - } + LLFloaterSnapshot::postSave(); } diff --git a/indra/newview/llpanelsnapshotlocal.cpp b/indra/newview/llpanelsnapshotlocal.cpp index 5dc32d228f..b67c4ec673 100644 --- a/indra/newview/llpanelsnapshotlocal.cpp +++ b/indra/newview/llpanelsnapshotlocal.cpp @@ -64,7 +64,6 @@ private: void onKeepAspectRatioCommit(LLUICtrl* ctrl); void onQualitySliderCommit(LLUICtrl* ctrl); void onSend(); - void onCancel(); }; static LLRegisterPanelClassWrapper panel_class("llpanelsnapshotlocal"); @@ -72,7 +71,7 @@ static LLRegisterPanelClassWrapper panel_class("llpanelsna LLPanelSnapshotLocal::LLPanelSnapshotLocal() { mCommitCallbackRegistrar.add("Local.Save", boost::bind(&LLPanelSnapshotLocal::onSend, this)); - mCommitCallbackRegistrar.add("Local.Cancel", boost::bind(&LLPanelSnapshotLocal::onCancel, this)); + mCommitCallbackRegistrar.add("Local.Cancel", boost::bind(&LLPanelSnapshotLocal::cancel, this)); } // virtual @@ -85,15 +84,14 @@ BOOL LLPanelSnapshotLocal::postBuild() getChild("image_quality_slider")->setCommitCallback(boost::bind(&LLPanelSnapshotLocal::onQualitySliderCommit, this, _1)); getChild("local_format_combo")->setCommitCallback(boost::bind(&LLPanelSnapshotLocal::onFormatComboCommit, this, _1)); - updateControls(LLSD()); - - return TRUE; + return LLPanelSnapshot::postBuild(); } // virtual void LLPanelSnapshotLocal::onOpen(const LLSD& key) { updateCustomResControls(); + LLPanelSnapshot::onOpen(key); } // virtual @@ -195,15 +193,11 @@ void LLPanelSnapshotLocal::onQualitySliderCommit(LLUICtrl* ctrl) void LLPanelSnapshotLocal::onSend() { - LLFloaterSnapshot::saveLocal(); - onCancel(); -} + LLFloaterSnapshot* floater = LLFloaterSnapshot::getInstance(); -void LLPanelSnapshotLocal::onCancel() -{ - LLSideTrayPanelContainer* parent = getParentContainer(); - if (parent) - { - parent->openPreviousPanel(); - } + floater->notify(LLSD().with("set-working", true)); + LLFloaterSnapshot::saveLocal(); + LLFloaterSnapshot::postSave(); + goBack(); + floater->notify(LLSD().with("set-finished", LLSD().with("ok", true).with("msg", "local"))); } diff --git a/indra/newview/llpanelsnapshotpostcard.cpp b/indra/newview/llpanelsnapshotpostcard.cpp index c2b83d5c19..9f3f6d7cb6 100644 --- a/indra/newview/llpanelsnapshotpostcard.cpp +++ b/indra/newview/llpanelsnapshotpostcard.cpp @@ -76,7 +76,6 @@ private: void onQualitySliderCommit(LLUICtrl* ctrl); void onTabButtonPress(S32 btn_idx); void onSend(); - void onCancel(); bool mHasFirstMsgFocus; }; @@ -87,7 +86,7 @@ LLPanelSnapshotPostcard::LLPanelSnapshotPostcard() : mHasFirstMsgFocus(false) { mCommitCallbackRegistrar.add("Postcard.Send", boost::bind(&LLPanelSnapshotPostcard::onSend, this)); - mCommitCallbackRegistrar.add("Postcard.Cancel", boost::bind(&LLPanelSnapshotPostcard::onCancel, this)); + mCommitCallbackRegistrar.add("Postcard.Cancel", boost::bind(&LLPanelSnapshotPostcard::cancel, this)); mCommitCallbackRegistrar.add("Postcard.Message", boost::bind(&LLPanelSnapshotPostcard::onTabButtonPress, this, 0)); mCommitCallbackRegistrar.add("Postcard.Settings", boost::bind(&LLPanelSnapshotPostcard::onTabButtonPress, this, 1)); @@ -118,9 +117,7 @@ BOOL LLPanelSnapshotPostcard::postBuild() getChild("message_btn")->setToggleState(TRUE); - updateControls(LLSD()); - - return TRUE; + return LLPanelSnapshot::postBuild(); } // virtual @@ -128,6 +125,7 @@ void LLPanelSnapshotPostcard::onOpen(const LLSD& key) { gSavedSettings.setS32("SnapshotFormat", getImageFormat()); updateCustomResControls(); + LLPanelSnapshot::onOpen(key); } // virtual @@ -212,17 +210,11 @@ void LLPanelSnapshotPostcard::sendPostcard() postcard["subject"] = subject; postcard["msg"] = getChild("msg_form")->getValue().asString(); LLPostCard::send(LLFloaterSnapshot::getImageData(), postcard); - LLFloaterSnapshot::postSave(); // Give user feedback of the event. gViewerWindow->playSnapshotAnimAndSound(); - // Switch to upload progress display. - LLSideTrayPanelContainer* parent = getParentContainer(); - if (parent) - { - parent->openPanel("panel_post_progress", LLSD().with("post-type", "postcard")); - } + LLFloaterSnapshot::postSave(); } void LLPanelSnapshotPostcard::onMsgFormFocusRecieved() @@ -325,12 +317,3 @@ void LLPanelSnapshotPostcard::onSend() // Send postcard. sendPostcard(); } - -void LLPanelSnapshotPostcard::onCancel() -{ - LLSideTrayPanelContainer* parent = getParentContainer(); - if (parent) - { - parent->openPreviousPanel(); - } -} diff --git a/indra/newview/llpanelsnapshotprofile.cpp b/indra/newview/llpanelsnapshotprofile.cpp index 80a379a5a0..33237fd84f 100644 --- a/indra/newview/llpanelsnapshotprofile.cpp +++ b/indra/newview/llpanelsnapshotprofile.cpp @@ -62,7 +62,6 @@ private: void updateCustomResControls(); ///< Enable/disable custom resolution controls (spinners and checkbox) void onSend(); - void onCancel(); void onResolutionComboCommit(LLUICtrl* ctrl); void onCustomResolutionCommit(LLUICtrl* ctrl); void onKeepAspectRatioCommit(LLUICtrl* ctrl); @@ -73,7 +72,7 @@ static LLRegisterPanelClassWrapper panel_class("llpanels LLPanelSnapshotProfile::LLPanelSnapshotProfile() { mCommitCallbackRegistrar.add("PostToProfile.Send", boost::bind(&LLPanelSnapshotProfile::onSend, this)); - mCommitCallbackRegistrar.add("PostToProfile.Cancel", boost::bind(&LLPanelSnapshotProfile::onCancel, this)); + mCommitCallbackRegistrar.add("PostToProfile.Cancel", boost::bind(&LLPanelSnapshotProfile::cancel, this)); } // virtual @@ -83,13 +82,15 @@ BOOL LLPanelSnapshotProfile::postBuild() getChild(getWidthSpinnerName())->setCommitCallback(boost::bind(&LLPanelSnapshotProfile::onCustomResolutionCommit, this, _1)); getChild(getHeightSpinnerName())->setCommitCallback(boost::bind(&LLPanelSnapshotProfile::onCustomResolutionCommit, this, _1)); getChild(getAspectRatioCBName())->setCommitCallback(boost::bind(&LLPanelSnapshotProfile::onKeepAspectRatioCommit, this, _1)); - return TRUE; + + return LLPanelSnapshot::postBuild(); } // virtual void LLPanelSnapshotProfile::onOpen(const LLSD& key) { updateCustomResControls(); + LLPanelSnapshot::onOpen(key); } // virtual @@ -119,22 +120,6 @@ void LLPanelSnapshotProfile::onSend() LLWebProfile::uploadImage(LLFloaterSnapshot::getImageData(), caption, add_location); LLFloaterSnapshot::postSave(); - - // Switch to upload progress display. - LLSideTrayPanelContainer* parent = getParentContainer(); - if (parent) - { - parent->openPanel("panel_post_progress", LLSD().with("post-type", "profile")); - } -} - -void LLPanelSnapshotProfile::onCancel() -{ - LLSideTrayPanelContainer* parent = getParentContainer(); - if (parent) - { - parent->openPreviousPanel(); - } } void LLPanelSnapshotProfile::onResolutionComboCommit(LLUICtrl* ctrl) diff --git a/indra/newview/skins/default/xui/en/floater_snapshot.xml b/indra/newview/skins/default/xui/en/floater_snapshot.xml index bc48561196..22d6ba5bdb 100644 --- a/indra/newview/skins/default/xui/en/floater_snapshot.xml +++ b/indra/newview/skins/default/xui/en/floater_snapshot.xml @@ -17,6 +17,54 @@ name="unknown"> unknown + + Sending Email + + + Posting + + + Saving to Inventory + + + Saving to Computer + + + Your Profile Feed has been updated! + + + Email Sent! + + + Saved to Inventory! + + + Saved to Computer! + + + Failed to update your Profile Feed. + + + Failed to send email. + + + Failed to save to inventory. + + + Failed to save to computer. + + left="10"> + + + Working + + - - - - - Sending Email - - - Posting - - - Saving to Inventory - - - Saving to Computer - - - - - Working - - diff --git a/indra/newview/skins/default/xui/en/panel_post_result.xml b/indra/newview/skins/default/xui/en/panel_post_result.xml deleted file mode 100644 index 4a64b8469b..0000000000 --- a/indra/newview/skins/default/xui/en/panel_post_result.xml +++ /dev/null @@ -1,78 +0,0 @@ - - - - Your Profile Feed has been updated! - - - Email Sent! - - - Saved to Inventory! - - - Saved to Computer! - - - Failed to update your Profile Feed. - - - Failed to send email. - - - Failed to save to inventory. - - - Failed to save to computer. - - - Result - - - - diff --git a/indra/newview/skins/default/xui/en/panel_snapshot_options.xml b/indra/newview/skins/default/xui/en/panel_snapshot_options.xml index e6324f8923..6fb17ed6a6 100644 --- a/indra/newview/skins/default/xui/en/panel_snapshot_options.xml +++ b/indra/newview/skins/default/xui/en/panel_snapshot_options.xml @@ -77,4 +77,68 @@ + + + Succeeded + + + + + Failed + + -- cgit v1.2.3 From 41e6455f7404b001696f8fe54e4353c80059c6e5 Mon Sep 17 00:00:00 2001 From: Vadim ProductEngine Date: Thu, 3 Nov 2011 18:03:36 +0200 Subject: STORM-1580 WIP Updated texture upload progress according to the spec. By the way, fixed displaying upload cost. --- indra/newview/llassetuploadresponders.cpp | 10 ++++++ indra/newview/llfloatersnapshot.cpp | 36 ++++++++++------------ indra/newview/llpanelsnapshot.cpp | 1 + indra/newview/llpanelsnapshotinventory.cpp | 2 ++ indra/newview/llpanelsnapshotoptions.cpp | 10 ++++++ .../default/xui/en/panel_snapshot_inventory.xml | 2 +- 6 files changed, 41 insertions(+), 20 deletions(-) (limited to 'indra/newview') diff --git a/indra/newview/llassetuploadresponders.cpp b/indra/newview/llassetuploadresponders.cpp index 966f5b941e..40a4d665f8 100644 --- a/indra/newview/llassetuploadresponders.cpp +++ b/indra/newview/llassetuploadresponders.cpp @@ -78,6 +78,8 @@ void on_new_single_inventory_upload_complete( const LLSD& server_response, S32 upload_price) { + bool success = false; + if ( upload_price > 0 ) { // this upload costed us L$, update our balance @@ -152,6 +154,7 @@ void on_new_single_inventory_upload_complete( gInventory.updateItem(item); gInventory.notifyObservers(); + success = true; // Show the preview panel for textures and sounds to let // user know that the image (or snapshot) arrived intact. @@ -175,6 +178,13 @@ void on_new_single_inventory_upload_complete( // remove the "Uploading..." message LLUploadDialog::modalUploadFinished(); + + // Let the Snapshot floater know we have finished uploading a snapshot to inventory. + LLFloater* floater_snapshot = LLFloaterReg::findInstance("snapshot"); + if (asset_type == LLAssetType::AT_TEXTURE && floater_snapshot) + { + floater_snapshot->notify(LLSD().with("set-finished", LLSD().with("ok", success).with("msg", "inventory"))); + } } LLAssetUploadResponder::LLAssetUploadResponder(const LLSD &post_data, diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp index 3df715e24b..128d50a061 100644 --- a/indra/newview/llfloatersnapshot.cpp +++ b/indra/newview/llfloatersnapshot.cpp @@ -1105,8 +1105,8 @@ public: static void onCommitCustomResolution(LLUICtrl *ctrl, void* data); #endif static void applyCustomResolution(LLFloaterSnapshot* view, S32 w, S32 h); - static void onSnapshotUploadFinished(LLSideTrayPanelContainer* panel_container, bool status); - static void onSendingPostcardFinished(LLSideTrayPanelContainer* panel_container, bool status); + static void onSnapshotUploadFinished(bool status); + static void onSendingPostcardFinished(bool status); static void resetSnapshotSizeOnUI(LLFloaterSnapshot *view, S32 width, S32 height) ; static BOOL checkImageSize(LLSnapshotLivePreview* previewp, S32& width, S32& height, BOOL isWidthChanged, S32 max_value); @@ -1505,10 +1505,6 @@ void LLFloaterSnapshot::Impl::updateControls(LLFloaterSnapshot* floater) LLResMgr::getInstance()->getIntegerString(bytes_string, (previewp->getDataSize()) >> 10 ); } - // FIXME: move this to the panel code - S32 upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload(); - floater->getChild("save_to_inventory_btn")->setLabelArg("[AMOUNT]", llformat("%d",upload_cost)); - // Update displayed image resolution. LLTextBox* image_res_tb = floater->getChild("image_res_text"); image_res_tb->setVisible(got_snap); @@ -1842,6 +1838,10 @@ void LLFloaterSnapshot::Impl::setFinished(LLFloaterSnapshot* floater, bool finis LLUICtrl* finished_lbl = floater->getChild(ok ? "succeeded_lbl" : "failed_lbl"); std::string result_text = floater->getString(msg + "_" + (ok ? "succeeded_str" : "failed_str")); finished_lbl->setValue(result_text); + + LLSideTrayPanelContainer* panel_container = floater->getChild("panel_container"); + panel_container->openPreviousPanel(); + panel_container->getCurrentPanel()->onOpen(LLSD()); } } @@ -2240,17 +2240,15 @@ void LLFloaterSnapshot::Impl::applyCustomResolution(LLFloaterSnapshot* view, S32 } // static -void LLFloaterSnapshot::Impl::onSnapshotUploadFinished(LLSideTrayPanelContainer* panel_container, bool status) +void LLFloaterSnapshot::Impl::onSnapshotUploadFinished(bool status) { - panel_container->openPreviousPanel(); setStatus(STATUS_FINISHED, status, "profile"); } // static -void LLFloaterSnapshot::Impl::onSendingPostcardFinished(LLSideTrayPanelContainer* panel_container, bool status) +void LLFloaterSnapshot::Impl::onSendingPostcardFinished(bool status) { - panel_container->openPreviousPanel(); setStatus(STATUS_FINISHED, status, "postcard"); } @@ -2338,9 +2336,8 @@ BOOL LLFloaterSnapshot::postBuild() childSetCommitCallback("texture_size_combo", Impl::onCommitResolution, this); childSetCommitCallback("local_size_combo", Impl::onCommitResolution, this); - LLSideTrayPanelContainer* panel_container = getChild("panel_container"); - LLWebProfile::setImageUploadResultCallback(boost::bind(&LLFloaterSnapshot::Impl::onSnapshotUploadFinished, panel_container, _1)); - LLPostCard::setPostResultCallback(boost::bind(&LLFloaterSnapshot::Impl::onSendingPostcardFinished, panel_container, _1)); + LLWebProfile::setImageUploadResultCallback(boost::bind(&LLFloaterSnapshot::Impl::onSnapshotUploadFinished, _1)); + LLPostCard::setPostResultCallback(boost::bind(&LLFloaterSnapshot::Impl::onSendingPostcardFinished, _1)); sThumbnailPlaceholder = getChild("thumbnail_placeholder"); @@ -2398,15 +2395,13 @@ void LLFloaterSnapshot::draw() previewp->drawPreviewRect(offset_x, offset_y) ; + // Draw progress indicators on top of the preview. if (working) { gGL.pushUIMatrix(); - { - const LLRect& r = getThumbnailPlaceholderRect(); - //gGL.translateUI((F32) r.mLeft, (F32) r.mBottom, 0.f); - LLUI::translate((F32) r.mLeft, (F32) r.mBottom); - sThumbnailPlaceholder->draw(); - } + const LLRect& r = getThumbnailPlaceholderRect(); + LLUI::translate((F32) r.mLeft, (F32) r.mBottom); + sThumbnailPlaceholder->draw(); gGL.popUIMatrix(); } } @@ -2424,6 +2419,9 @@ void LLFloaterSnapshot::onOpen(const LLSD& key) gSnapshotFloaterView->setEnabled(TRUE); gSnapshotFloaterView->setVisible(TRUE); gSnapshotFloaterView->adjustToFitScreen(this, FALSE); + + // Initialize default tab. + getChild("panel_container")->getCurrentPanel()->onOpen(LLSD()); } void LLFloaterSnapshot::onClose(bool app_quitting) diff --git a/indra/newview/llpanelsnapshot.cpp b/indra/newview/llpanelsnapshot.cpp index 893f1ca43c..35627ababe 100644 --- a/indra/newview/llpanelsnapshot.cpp +++ b/indra/newview/llpanelsnapshot.cpp @@ -127,6 +127,7 @@ void LLPanelSnapshot::goBack() if (parent) { parent->openPreviousPanel(); + parent->getCurrentPanel()->onOpen(LLSD()); } } diff --git a/indra/newview/llpanelsnapshotinventory.cpp b/indra/newview/llpanelsnapshotinventory.cpp index c781138f88..d517d3811d 100644 --- a/indra/newview/llpanelsnapshotinventory.cpp +++ b/indra/newview/llpanelsnapshotinventory.cpp @@ -27,6 +27,7 @@ #include "llviewerprecompiledheaders.h" #include "llcombobox.h" +#include "lleconomy.h" #include "llsidetraypanelcontainer.h" #include "llspinctrl.h" @@ -86,6 +87,7 @@ void LLPanelSnapshotInventory::onOpen(const LLSD& key) #if 0 getChild(getImageSizeComboName())->selectNthItem(0); // FIXME? has no effect #endif + getChild("hint_lbl")->setTextArg("[UPLOAD_COST]", llformat("%d", LLGlobalEconomy::Singleton::getInstance()->getPriceUpload())); updateCustomResControls(); LLPanelSnapshot::onOpen(key); } diff --git a/indra/newview/llpanelsnapshotoptions.cpp b/indra/newview/llpanelsnapshotoptions.cpp index 8e5ff282b3..df904b6836 100644 --- a/indra/newview/llpanelsnapshotoptions.cpp +++ b/indra/newview/llpanelsnapshotoptions.cpp @@ -26,6 +26,7 @@ #include "llviewerprecompiledheaders.h" +#include "lleconomy.h" #include "llpanel.h" #include "llsidetraypanelcontainer.h" @@ -41,6 +42,7 @@ class LLPanelSnapshotOptions public: LLPanelSnapshotOptions(); + /*virtual*/ void onOpen(const LLSD& key); private: void openPanel(const std::string& panel_name); @@ -60,6 +62,13 @@ LLPanelSnapshotOptions::LLPanelSnapshotOptions() mCommitCallbackRegistrar.add("Snapshot.SaveToComputer", boost::bind(&LLPanelSnapshotOptions::onSaveToComputer, this)); } +// virtual +void LLPanelSnapshotOptions::onOpen(const LLSD& key) +{ + S32 upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload(); + getChild("save_to_inventory_btn")->setLabelArg("[AMOUNT]", llformat("%d", upload_cost)); +} + void LLPanelSnapshotOptions::openPanel(const std::string& panel_name) { LLSideTrayPanelContainer* parent = dynamic_cast(getParent()); @@ -70,6 +79,7 @@ void LLPanelSnapshotOptions::openPanel(const std::string& panel_name) } parent->openPanel(panel_name); + parent->getCurrentPanel()->onOpen(LLSD()); LLFloaterSnapshot::postPanelSwitch(); } diff --git a/indra/newview/skins/default/xui/en/panel_snapshot_inventory.xml b/indra/newview/skins/default/xui/en/panel_snapshot_inventory.xml index cb243fbc5b..5db9587de6 100644 --- a/indra/newview/skins/default/xui/en/panel_snapshot_inventory.xml +++ b/indra/newview/skins/default/xui/en/panel_snapshot_inventory.xml @@ -50,7 +50,7 @@ top_pad="10" type="string" word_wrap="true"> - Saving an image to your inventory costs L$TBD. To save your image as a texture select one of the square formats. + Saving an image to your inventory costs L$[UPLOAD_COST]. To save your image as a texture select one of the square formats. Date: Thu, 3 Nov 2011 21:26:42 +0200 Subject: STORM-1580 WIP Removed the "Keep open after saving" checkbox that makes no sense anymore. --- indra/newview/app_settings/settings.xml | 11 -------- indra/newview/llfloatersnapshot.cpp | 31 ---------------------- .../skins/default/xui/en/floater_snapshot.xml | 7 ----- 3 files changed, 49 deletions(-) (limited to 'indra/newview') diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 9812b2868f..55e28cd60e 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -1605,17 +1605,6 @@ Value 0 - CloseSnapshotOnKeep - - Comment - Close snapshot window after saving snapshot - Persist - 1 - Type - Boolean - Value - 1 - CmdLineDisableVoice Comment diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp index 128d50a061..49da41dc0c 100644 --- a/indra/newview/llfloatersnapshot.cpp +++ b/indra/newview/llfloatersnapshot.cpp @@ -1089,7 +1089,6 @@ public: static void onClickMore(void* data) ; static void onClickUICheck(LLUICtrl *ctrl, void* data); static void onClickHUDCheck(LLUICtrl *ctrl, void* data); - static void onClickKeepOpenCheck(LLUICtrl *ctrl, void* data); #if 0 static void onClickKeepAspectCheck(LLUICtrl *ctrl, void* data); #endif @@ -1426,26 +1425,6 @@ void LLFloaterSnapshot::Impl::updateControls(LLFloaterSnapshot* floater) enableAspectRatioCheckbox(floater, shot_type != LLSnapshotLivePreview::SNAPSHOT_TEXTURE && !floater->impl.mAspectRatioCheckOff); floater->getChildView("layer_types")->setEnabled(shot_type == LLSnapshotLivePreview::SNAPSHOT_LOCAL); -#if 0 - BOOL is_advance = gSavedSettings.getBOOL("AdvanceSnapshot"); - BOOL is_local = shot_type == LLSnapshotLivePreview::SNAPSHOT_LOCAL; - BOOL show_slider = (shot_type == LLSnapshotLivePreview::SNAPSHOT_POSTCARD || - shot_type == LLSnapshotLivePreview::SNAPSHOT_WEB || - (is_local && shot_format == LLFloaterSnapshot::SNAPSHOT_FORMAT_JPEG)); - - floater->getChildView("layer_types")->setVisible( is_advance); - floater->getChildView("layer_type_label")->setVisible( is_advance); - floater->getChildView("snapshot_width")->setVisible( is_advance); - floater->getChildView("snapshot_height")->setVisible( is_advance); - floater->getChildView("keep_aspect_check")->setVisible( is_advance); - floater->getChildView("ui_check")->setVisible( is_advance); - floater->getChildView("hud_check")->setVisible( is_advance); - floater->getChildView("keep_open_check")->setVisible( is_advance); - floater->getChildView("freeze_frame_check")->setVisible( is_advance); - floater->getChildView("auto_snapshot_check")->setVisible( is_advance); - floater->getChildView("image_quality_slider")->setVisible( is_advance && show_slider); -#endif - LLPanelSnapshot* active_panel = getActivePanel(floater); if (active_panel) { @@ -1693,13 +1672,6 @@ void LLFloaterSnapshot::Impl::onClickHUDCheck(LLUICtrl *ctrl, void* data) } } -// static -void LLFloaterSnapshot::Impl::onClickKeepOpenCheck(LLUICtrl* ctrl, void* data) -{ - LLCheckBoxCtrl *check = (LLCheckBoxCtrl *)ctrl; - gSavedSettings.setBOOL( "CloseSnapshotOnKeep", !check->get() ); -} - #if 0 // static void LLFloaterSnapshot::Impl::onClickKeepAspectCheck(LLUICtrl* ctrl, void* data) @@ -2308,9 +2280,6 @@ BOOL LLFloaterSnapshot::postBuild() childSetCommitCallback("hud_check", Impl::onClickHUDCheck, this); getChild("hud_check")->setValue(gSavedSettings.getBOOL("RenderHUDInSnapshot")); - childSetCommitCallback("keep_open_check", Impl::onClickKeepOpenCheck, this); - getChild("keep_open_check")->setValue(!gSavedSettings.getBOOL("CloseSnapshotOnKeep")); - #if 0 childSetCommitCallback("keep_aspect_check", Impl::onClickKeepAspectCheck, this); #endif diff --git a/indra/newview/skins/default/xui/en/floater_snapshot.xml b/indra/newview/skins/default/xui/en/floater_snapshot.xml index 22d6ba5bdb..9719ee464e 100644 --- a/indra/newview/skins/default/xui/en/floater_snapshot.xml +++ b/indra/newview/skins/default/xui/en/floater_snapshot.xml @@ -295,13 +295,6 @@ top_pad="10" width="180" name="hud_check" /> - Date: Thu, 3 Nov 2011 14:36:40 -0700 Subject: EXP-1533 FIX -- As a FUI user, I'd like to be able to remove toolbar buttons without having to drag them anywhere * Added "Remove this button" option to the toolbar context menu * Added code to track the right mouse click and execute the action to remove the appropriate button on the toolbar. Reviewed by surly leyla --- indra/newview/skins/default/xui/en/menu_toolbars.xml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'indra/newview') diff --git a/indra/newview/skins/default/xui/en/menu_toolbars.xml b/indra/newview/skins/default/xui/en/menu_toolbars.xml index 7384114d7d..fbe40a7244 100644 --- a/indra/newview/skins/default/xui/en/menu_toolbars.xml +++ b/indra/newview/skins/default/xui/en/menu_toolbars.xml @@ -3,9 +3,15 @@ layout="topleft" name="Toolbars Popup" visible="false"> + + + + + name="Choose Buttons"> -- cgit v1.2.3 From 5d2d22322527bf303d24c15fde15025c045b7654 Mon Sep 17 00:00:00 2001 From: Leslie Linden Date: Thu, 3 Nov 2011 15:11:29 -0700 Subject: EXP-1538 FIX -- New tags shown for items in subfolders in received items panel which remain after minimizing parent folder * "new" tag determination for LLInboxFolderViewItem is now done on "addToFolder" rather than at construction time to avoid computing "new" for items not directly in the top level folder. --- indra/newview/llpanelmarketplaceinboxinventory.cpp | 26 +++++++++++++--------- indra/newview/llpanelmarketplaceinboxinventory.h | 5 ++--- 2 files changed, 17 insertions(+), 14 deletions(-) (limited to 'indra/newview') diff --git a/indra/newview/llpanelmarketplaceinboxinventory.cpp b/indra/newview/llpanelmarketplaceinboxinventory.cpp index b9fb5b8c55..df89adb8da 100644 --- a/indra/newview/llpanelmarketplaceinboxinventory.cpp +++ b/indra/newview/llpanelmarketplaceinboxinventory.cpp @@ -249,12 +249,25 @@ LLInboxFolderViewItem::LLInboxFolderViewItem(const Params& p) , mFresh(false) { #if SUPPORTING_FRESH_ITEM_COUNT - computeFreshness(); - initBadgeParams(p.new_badge()); #endif } +BOOL LLInboxFolderViewItem::addToFolder(LLFolderViewFolder* folder, LLFolderView* root) +{ + BOOL retval = LLFolderViewItem::addToFolder(folder, root); + +#if SUPPORTING_FRESH_ITEM_COUNT + // Compute freshness if our parent is the root folder for the inbox + if (mParentFolder == mRoot) + { + computeFreshness(); + } +#endif + + return retval; +} + BOOL LLInboxFolderViewItem::handleDoubleClick(S32 x, S32 y, MASK mask) { return TRUE; @@ -310,14 +323,5 @@ void LLInboxFolderViewItem::deFreshify() gSavedPerAccountSettings.setU32("LastInventoryInboxActivity", time_corrected()); } -void LLInboxFolderViewItem::setCreationDate(time_t creation_date_utc) -{ - mCreationDate = creation_date_utc; - - if (mParentFolder == mRoot) - { - computeFreshness(); - } -} // eof diff --git a/indra/newview/llpanelmarketplaceinboxinventory.h b/indra/newview/llpanelmarketplaceinboxinventory.h index 09b14ec547..d6b827ee3e 100644 --- a/indra/newview/llpanelmarketplaceinboxinventory.h +++ b/indra/newview/llpanelmarketplaceinboxinventory.h @@ -69,7 +69,7 @@ public: }; LLInboxFolderViewFolder(const Params& p); - + void draw(); void selectItem(); @@ -102,6 +102,7 @@ public: LLInboxFolderViewItem(const Params& p); + BOOL addToFolder(LLFolderViewFolder* folder, LLFolderView* root); BOOL handleDoubleClick(S32 x, S32 y, MASK mask); void draw(); @@ -114,8 +115,6 @@ public: bool isFresh() const { return mFresh; } protected: - void setCreationDate(time_t creation_date_utc); - bool mFresh; }; -- cgit v1.2.3 From 94678c2f7fbab0676ebf5c664e2d4cb8643b535f Mon Sep 17 00:00:00 2001 From: Leslie Linden Date: Fri, 4 Nov 2011 11:26:50 -0700 Subject: EXP-1541 update -- Route inventory items sent in a Notecard to correct locations rather than auto-sorting by asset type * New code specifies explicit destination for "copy from notecard" or null, indicating the sim should determine the placement. Reviewed by Stone. --- indra/newview/llfavoritesbar.cpp | 6 +++++- indra/newview/llinventorybridge.cpp | 8 +++++--- indra/newview/llpreview.cpp | 6 ++++-- indra/newview/llviewerinventory.cpp | 20 ++++++++++++++++++-- indra/newview/llviewerinventory.h | 5 ++++- indra/newview/llviewertexteditor.cpp | 19 +++++++++++++------ 6 files changed, 49 insertions(+), 15 deletions(-) (limited to 'indra/newview') diff --git a/indra/newview/llfavoritesbar.cpp b/indra/newview/llfavoritesbar.cpp index f577ef7fd0..4f2fd47488 100644 --- a/indra/newview/llfavoritesbar.cpp +++ b/indra/newview/llfavoritesbar.cpp @@ -599,7 +599,11 @@ void LLFavoritesBarCtrl::handleNewFavoriteDragAndDrop(LLInventoryItem *item, con if (tool_dad->getSource() == LLToolDragAndDrop::SOURCE_NOTECARD) { viewer_item->setType(LLAssetType::AT_LANDMARK); - copy_inventory_from_notecard(tool_dad->getObjectID(), tool_dad->getSourceID(), viewer_item.get(), gInventoryCallbacks.registerCB(cb)); + copy_inventory_from_notecard(favorites_id, + tool_dad->getObjectID(), + tool_dad->getSourceID(), + viewer_item.get(), + gInventoryCallbacks.registerCB(cb)); } else { diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index 0e27bd81be..9188603b7a 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -3544,10 +3544,12 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item, // because they must contain only links to wearable items. accept = !(move_is_into_current_outfit || move_is_into_outfit); - if(drop) + if(accept && drop) { - copy_inventory_from_notecard(LLToolDragAndDrop::getInstance()->getObjectID(), - LLToolDragAndDrop::getInstance()->getSourceID(), inv_item); + copy_inventory_from_notecard(mUUID, // Drop to the chosen destination folder + LLToolDragAndDrop::getInstance()->getObjectID(), + LLToolDragAndDrop::getInstance()->getSourceID(), + inv_item); } } else if(LLToolDragAndDrop::SOURCE_LIBRARY == source) diff --git a/indra/newview/llpreview.cpp b/indra/newview/llpreview.cpp index 119fc95cf0..18626e3273 100644 --- a/indra/newview/llpreview.cpp +++ b/indra/newview/llpreview.cpp @@ -363,8 +363,10 @@ void LLPreview::onBtnCopyToInv(void* userdata) // Copy to inventory if (self->mNotecardInventoryID.notNull()) { - copy_inventory_from_notecard(self->mNotecardObjectID, - self->mNotecardInventoryID, item); + copy_inventory_from_notecard(LLUUID::null, + self->mNotecardObjectID, + self->mNotecardInventoryID, + item); } else { diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp index 519d4fe7f8..163581ea7f 100644 --- a/indra/newview/llviewerinventory.cpp +++ b/indra/newview/llviewerinventory.cpp @@ -1209,7 +1209,23 @@ void move_inventory_item( gAgent.sendReliableMessage(); } -void copy_inventory_from_notecard(const LLUUID& object_id, const LLUUID& notecard_inv_id, const LLInventoryItem *src, U32 callback_id) +const LLUUID get_folder_by_itemtype(const LLInventoryItem *src) +{ + LLUUID retval = LLUUID::null; + + if (src) + { + retval = gInventory.findCategoryUUIDForType(LLFolderType::assetTypeToFolderType(src->getType())); + } + + return retval; +} + +void copy_inventory_from_notecard(const LLUUID& destination_id, + const LLUUID& object_id, + const LLUUID& notecard_inv_id, + const LLInventoryItem *src, + U32 callback_id) { if (NULL == src) { @@ -1255,7 +1271,7 @@ void copy_inventory_from_notecard(const LLUUID& object_id, const LLUUID& notecar body["notecard-id"] = notecard_inv_id; body["object-id"] = object_id; body["item-id"] = src->getUUID(); - body["folder-id"] = gInventory.findCategoryUUIDForType(LLFolderType::assetTypeToFolderType(src->getType())); + body["folder-id"] = destination_id; body["callback-id"] = (LLSD::Integer)callback_id; request["message"] = "CopyInventoryFromNotecard"; diff --git a/indra/newview/llviewerinventory.h b/indra/newview/llviewerinventory.h index 41542a4e0f..7822ef4da6 100644 --- a/indra/newview/llviewerinventory.h +++ b/indra/newview/llviewerinventory.h @@ -363,7 +363,10 @@ void move_inventory_item( const std::string& new_name, LLPointer cb); -void copy_inventory_from_notecard(const LLUUID& object_id, +const LLUUID get_folder_by_itemtype(const LLInventoryItem *src); + +void copy_inventory_from_notecard(const LLUUID& destination_id, + const LLUUID& object_id, const LLUUID& notecard_inv_id, const LLInventoryItem *src, U32 callback_id = 0); diff --git a/indra/newview/llviewertexteditor.cpp b/indra/newview/llviewertexteditor.cpp index 0a9fae68a6..b41ed00f17 100644 --- a/indra/newview/llviewertexteditor.cpp +++ b/indra/newview/llviewertexteditor.cpp @@ -88,12 +88,12 @@ public: { LLVector3d global_pos; landmark->getGlobalPos(global_pos); - LLViewerInventoryItem* agent_lanmark = + LLViewerInventoryItem* agent_landmark = LLLandmarkActions::findLandmarkForGlobalPos(global_pos); - if (agent_lanmark) + if (agent_landmark) { - showInfo(agent_lanmark->getUUID()); + showInfo(agent_landmark->getUUID()); } else { @@ -104,8 +104,13 @@ public: } else { + LLInventoryItem* item = item_ptr.get(); LLPointer cb = new LLEmbeddedLandmarkCopied(); - copy_inventory_from_notecard(object_id, notecard_inventory_id, item_ptr.get(), gInventoryCallbacks.registerCB(cb)); + copy_inventory_from_notecard(get_folder_by_itemtype(item), + object_id, + notecard_inventory_id, + item, + gInventoryCallbacks.registerCB(cb)); } } } @@ -1266,9 +1271,11 @@ bool LLViewerTextEditor::importStream(std::istream& str) void LLViewerTextEditor::copyInventory(const LLInventoryItem* item, U32 callback_id) { - copy_inventory_from_notecard(mObjectID, + copy_inventory_from_notecard(LLUUID::null, // Don't specify a destination -- let the sim do that + mObjectID, mNotecardInventoryID, - item, callback_id); + item, + callback_id); } bool LLViewerTextEditor::hasEmbeddedInventory() -- cgit v1.2.3 From 652aa15ccdc5047f98424fdf07c2fc6728681a62 Mon Sep 17 00:00:00 2001 From: Merov Linden Date: Fri, 4 Nov 2011 11:46:38 -0700 Subject: EXP-1505 : FIX. Dropping a folder in current outfit would result in broken links and lost inventory. --- indra/newview/llinventorybridge.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indra/newview') diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index 9188603b7a..0c092e9a56 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -2027,7 +2027,7 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat, #endif } } - if (move_is_into_outbox && !move_is_from_outbox) + else if (move_is_into_outbox && !move_is_from_outbox) { dropFolderToOutbox(inv_cat); } -- cgit v1.2.3 From 2d24ed6ec5a8a26099065bc259f6738d5464db33 Mon Sep 17 00:00:00 2001 From: eli Date: Fri, 4 Nov 2011 13:45:14 -0700 Subject: WIP INTL-82 LQA changes for Turkish; remove obsolete files --- .../default/xui/ru/floater_day_cycle_options.xml | 95 ---------------------- .../skins/default/xui/tr/floater_camera.xml | 2 +- .../default/xui/tr/floater_day_cycle_options.xml | 95 ---------------------- .../default/xui/tr/floater_edit_day_cycle.xml | 20 ++--- .../default/xui/tr/floater_edit_sky_preset.xml | 12 +-- .../newview/skins/default/xui/tr/floater_picks.xml | 2 +- .../default/xui/tr/floater_preview_texture.xml | 2 +- .../skins/default/xui/tr/floater_texture_ctrl.xml | 4 +- .../newview/skins/default/xui/tr/floater_tools.xml | 2 +- .../default/xui/tr/floater_windlight_options.xml | 2 +- .../skins/default/xui/tr/menu_gesture_gear.xml | 2 +- .../skins/default/xui/tr/menu_hide_navbar.xml | 4 +- .../newview/skins/default/xui/tr/menu_landmark.xml | 4 +- .../skins/default/xui/tr/menu_picks_plus.xml | 2 +- indra/newview/skins/default/xui/tr/menu_place.xml | 2 +- .../default/xui/tr/menu_places_gear_landmark.xml | 2 +- indra/newview/skins/default/xui/tr/menu_slurl.xml | 2 +- indra/newview/skins/default/xui/tr/menu_viewer.xml | 2 +- .../newview/skins/default/xui/tr/notifications.xml | 46 +++++------ .../skins/default/xui/tr/panel_edit_pick.xml | 4 +- .../skins/default/xui/tr/panel_landmarks.xml | 2 +- indra/newview/skins/default/xui/tr/panel_me.xml | 2 +- .../skins/default/xui/tr/panel_navigation_bar.xml | 4 +- .../skins/default/xui/tr/panel_outfit_edit.xml | 4 +- .../skins/default/xui/tr/panel_outfits_list.xml | 2 +- .../newview/skins/default/xui/tr/panel_people.xml | 2 +- indra/newview/skins/default/xui/tr/panel_picks.xml | 8 +- .../default/xui/tr/panel_preferences_privacy.xml | 2 +- .../skins/default/xui/tr/panel_profile_view.xml | 2 +- .../newview/skins/default/xui/tr/role_actions.xml | 8 +- .../skins/default/xui/tr/sidepanel_appearance.xml | 12 +-- indra/newview/skins/default/xui/tr/strings.xml | 20 ++--- .../default/xui/zh/floater_day_cycle_options.xml | 95 ---------------------- 33 files changed, 92 insertions(+), 377 deletions(-) delete mode 100644 indra/newview/skins/default/xui/ru/floater_day_cycle_options.xml delete mode 100644 indra/newview/skins/default/xui/tr/floater_day_cycle_options.xml delete mode 100644 indra/newview/skins/default/xui/zh/floater_day_cycle_options.xml (limited to 'indra/newview') diff --git a/indra/newview/skins/default/xui/ru/floater_day_cycle_options.xml b/indra/newview/skins/default/xui/ru/floater_day_cycle_options.xml deleted file mode 100644 index 7c702f246d..0000000000 --- a/indra/newview/skins/default/xui/ru/floater_day_cycle_options.xml +++ /dev/null @@ -1,95 +0,0 @@ - - - - - - - - 00:00 - - - 03:00 - - - 06:00 - - - 09:00 - - - 12:00 - - - 15:00 - - - 18:00 - - - 21:00 - - - 00:00 - - - | - - - I - - - | - - - I - - - | - - - I - - - | - - - I - - - | - -