diff options
Diffstat (limited to 'indra')
-rw-r--r-- | indra/newview/llassetuploadresponders.cpp | 26 | ||||
-rw-r--r-- | indra/newview/llassetuploadresponders.h | 12 | ||||
-rw-r--r-- | indra/newview/llfloateranimpreview.cpp | 9 | ||||
-rw-r--r-- | indra/newview/llfloaternamedesc.cpp | 6 | ||||
-rw-r--r-- | indra/newview/llfloatersnapshot.cpp | 708 | ||||
-rw-r--r-- | indra/newview/llfloatersnapshot.h | 9 | ||||
-rw-r--r-- | indra/newview/llviewermenufile.cpp | 124 | ||||
-rw-r--r-- | indra/newview/llviewermenufile.h | 14 | ||||
-rw-r--r-- | indra/newview/skins/default/xui/en/floater_snapshot.xml | 517 | ||||
-rw-r--r-- | indra/newview/skins/default/xui/en/notifications.xml | 20 |
10 files changed, 834 insertions, 611 deletions
diff --git a/indra/newview/llassetuploadresponders.cpp b/indra/newview/llassetuploadresponders.cpp index 27dcb9f1c7..116c4cafc2 100644 --- a/indra/newview/llassetuploadresponders.cpp +++ b/indra/newview/llassetuploadresponders.cpp @@ -203,19 +203,13 @@ void LLAssetUploadResponder::uploadComplete(const LLSD& content) LLNewAgentInventoryResponder::LLNewAgentInventoryResponder(const LLSD& post_data, const LLUUID& vfile_id, - LLAssetType::EType asset_type, - boost::function<void(const LLUUID& uuid)> callback) -: LLAssetUploadResponder(post_data, vfile_id, asset_type), - mCallback(callback) + LLAssetType::EType asset_type) +: LLAssetUploadResponder(post_data, vfile_id, asset_type) { } -LLNewAgentInventoryResponder::LLNewAgentInventoryResponder(const LLSD& post_data, - const std::string& file_name, - LLAssetType::EType asset_type, - boost::function<void(const LLUUID& uuid)> callback) -: LLAssetUploadResponder(post_data, file_name, asset_type), - mCallback(callback) +LLNewAgentInventoryResponder::LLNewAgentInventoryResponder(const LLSD& post_data, const std::string& file_name, LLAssetType::EType asset_type) +: LLAssetUploadResponder(post_data, file_name, asset_type) { } @@ -293,12 +287,6 @@ void LLNewAgentInventoryResponder::uploadComplete(const LLSD& content) creation_date_now); gInventory.updateItem(item); gInventory.notifyObservers(); - - if (mCallback) - { - // call the callback with the new Asset UUID - mCallback(item->getAssetUUID()); - } // Show the preview panel for textures and sounds to let // user know that the image (or snapshot) arrived intact. @@ -346,11 +334,13 @@ void LLNewAgentInventoryResponder::uploadComplete(const LLSD& content) U32 group_perms = mPostData.has("group_mask") ? mPostData.get("group_mask" ).asInteger() : PERM_NONE; U32 next_owner_perms = mPostData.has("next_owner_mask") ? mPostData.get("next_owner_mask").asInteger() : PERM_NONE; std::string display_name = LLStringUtil::null; + LLAssetStorage::LLStoreAssetCallback callback = NULL; + void *userdata = NULL; upload_new_resource(next_file, asset_name, asset_name, - LLFolderType::FT_NONE, LLInventoryType::IT_NONE, + 0, LLFolderType::FT_NONE, LLInventoryType::IT_NONE, next_owner_perms, group_perms, everyone_perms, display_name, - NULL, expected_upload_cost); + callback, expected_upload_cost, userdata); } } diff --git a/indra/newview/llassetuploadresponders.h b/indra/newview/llassetuploadresponders.h index 2358aeb39d..91fb39916d 100644 --- a/indra/newview/llassetuploadresponders.h +++ b/indra/newview/llassetuploadresponders.h @@ -33,7 +33,6 @@ #ifndef LL_LLASSETUPLOADRESPONDER_H #define LL_LLASSETUPLOADRESPONDER_H -#include "llassetstorage.h" #include "llhttpclient.h" // Abstract class for supporting asset upload @@ -67,15 +66,10 @@ class LLNewAgentInventoryResponder : public LLAssetUploadResponder public: LLNewAgentInventoryResponder(const LLSD& post_data, const LLUUID& vfile_id, - LLAssetType::EType asset_type, - boost::function<void(const LLUUID& uuid)> callback = NULL); - LLNewAgentInventoryResponder(const LLSD& post_data, - const std::string& file_name, - LLAssetType::EType asset_type, - boost::function<void(const LLUUID& uuid)> callback = NULL); + LLAssetType::EType asset_type); + LLNewAgentInventoryResponder(const LLSD& post_data, const std::string& file_name, + LLAssetType::EType asset_type); virtual void uploadComplete(const LLSD& content); - - boost::function<void(const LLUUID& uuid)> mCallback; }; struct LLBakedUploadData; diff --git a/indra/newview/llfloateranimpreview.cpp b/indra/newview/llfloateranimpreview.cpp index 043f753e01..f14e64e3e4 100644 --- a/indra/newview/llfloateranimpreview.cpp +++ b/indra/newview/llfloateranimpreview.cpp @@ -1001,18 +1001,19 @@ void LLFloaterAnimPreview::onBtnOK(void* userdata) { std::string name = floaterp->childGetValue("name_form").asString(); std::string desc = floaterp->childGetValue("description_form").asString(); + LLAssetStorage::LLStoreAssetCallback callback = NULL; S32 expected_upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload(); + void *userdata = NULL; upload_new_resource(floaterp->mTransactionID, // tid LLAssetType::AT_ANIMATION, name, desc, + 0, LLFolderType::FT_NONE, LLInventoryType::IT_ANIMATION, - LLFloaterPerms::getNextOwnerPerms(), - LLFloaterPerms::getGroupPerms(), LLFloaterPerms::getEveryonePerms(), + LLFloaterPerms::getNextOwnerPerms(), LLFloaterPerms::getGroupPerms(), LLFloaterPerms::getEveryonePerms(), name, - NULL, - expected_upload_cost); + callback, expected_upload_cost, userdata); } else { diff --git a/indra/newview/llfloaternamedesc.cpp b/indra/newview/llfloaternamedesc.cpp index 5c343ecb22..159ce41b79 100644 --- a/indra/newview/llfloaternamedesc.cpp +++ b/indra/newview/llfloaternamedesc.cpp @@ -169,14 +169,16 @@ void LLFloaterNameDesc::onBtnOK( ) { childDisable("ok_btn"); // don't allow inadvertent extra uploads + LLAssetStorage::LLStoreAssetCallback callback = NULL; S32 expected_upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload(); // kinda hack - assumes that unsubclassed LLFloaterNameDesc is only used for uploading chargeable assets, which it is right now (it's only used unsubclassed for the sound upload dialog, and THAT should be a subclass). + void *nruserdata = NULL; std::string display_name = LLStringUtil::null; upload_new_resource(mFilenameAndPath, // file childGetValue("name_form").asString(), childGetValue("description_form").asString(), - LLFolderType::FT_NONE, LLInventoryType::IT_NONE, + 0, LLFolderType::FT_NONE, LLInventoryType::IT_NONE, LLFloaterPerms::getNextOwnerPerms(), LLFloaterPerms::getGroupPerms(), LLFloaterPerms::getEveryonePerms(), - display_name, NULL, expected_upload_cost); + display_name, callback, expected_upload_cost, nruserdata); closeFloater(false); } diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp index 129dd55e48..f3baa482a0 100644 --- a/indra/newview/llfloatersnapshot.cpp +++ b/indra/newview/llfloatersnapshot.cpp @@ -39,33 +39,28 @@ // Viewer includes #include "llagent.h" #include "llagentcamera.h" -#include "llagentui.h" -#include "llavatarpropertiesprocessor.h" -#include "llbottomtray.h" -#include "llbutton.h" #include "llcallbacklist.h" -#include "llcheckboxctrl.h" -#include "llcombobox.h" #include "llcriticaldamp.h" -#include "lleconomy.h" -#include "llfloaterpostcard.h" +#include "llui.h" #include "llfocusmgr.h" -#include "lllandmarkactions.h" -#include "llradiogroup.h" +#include "llbutton.h" +#include "llcombobox.h" +#include "lleconomy.h" #include "llsliderctrl.h" -#include "llslurl.h" #include "llspinctrl.h" -#include "lltoolfocus.h" -#include "lltoolmgr.h" -#include "llui.h" -#include "lluictrlfactory.h" -#include "llviewercamera.h" #include "llviewercontrol.h" -#include "llviewermenufile.h" // upload_new_resource() +#include "lluictrlfactory.h" #include "llviewerstats.h" +#include "llviewercamera.h" #include "llviewerwindow.h" -#include "llweb.h" +#include "llviewermenufile.h" // upload_new_resource() +#include "llfloaterpostcard.h" +#include "llcheckboxctrl.h" +#include "llradiogroup.h" +#include "lltoolfocus.h" +#include "lltoolmgr.h" #include "llworld.h" +#include "llagentui.h" // Linden library includes #include "llfontgl.h" @@ -91,6 +86,10 @@ ///---------------------------------------------------------------------------- /// Local function declarations, constants, enums, and typedefs ///---------------------------------------------------------------------------- +S32 LLFloaterSnapshot::sUIWinHeightLong = 526 ; +S32 LLFloaterSnapshot::sUIWinHeightShort = LLFloaterSnapshot::sUIWinHeightLong - 230 ; +S32 LLFloaterSnapshot::sUIWinWidth = 215 ; + LLSnapshotFloaterView* gSnapshotFloaterView = NULL; const F32 AUTO_SNAPSHOT_TIME_DELAY = 1.f; @@ -115,7 +114,6 @@ public: enum ESnapshotType { SNAPSHOT_POSTCARD, - SNAPSHOT_WEB, SNAPSHOT_TEXTURE, SNAPSHOT_LOCAL }; @@ -164,9 +162,8 @@ public: void setSnapshotBufferType(LLViewerWindow::ESnapshotType type) { mSnapshotBufferType = type; } void updateSnapshot(BOOL new_snapshot, BOOL new_thumbnail = FALSE, F32 delay = 0.f); LLFloaterPostcard* savePostcard(); - void saveTexture(bool set_as_profile_pic = false); + void saveTexture(); BOOL saveLocal(); - void saveWeb(std::string url); BOOL setThumbnailImageSize() ; void generateThumbnailImage(BOOL force_update = FALSE) ; @@ -175,9 +172,6 @@ public: // Returns TRUE when snapshot generated, FALSE otherwise. static BOOL onIdle( void* snapshot_preview ); - - // callback for region name resolve - void regionNameCallback(std::string url, LLSD body, const std::string& name, S32 x, S32 y, S32 z); private: LLColor4 mColor; @@ -299,7 +293,7 @@ F32 LLSnapshotLivePreview::getAspect() F32 image_aspect_ratio = ((F32)mWidth[mCurImageIndex]) / ((F32)mHeight[mCurImageIndex]); F32 window_aspect_ratio = ((F32)getRect().getWidth()) / ((F32)getRect().getHeight()); - if (!mKeepAspectRatio) + if (!mKeepAspectRatio)//gSavedSettings.getBOOL("KeepAspectForSnapshot")) { return image_aspect_ratio; } @@ -632,20 +626,20 @@ BOOL LLSnapshotLivePreview::setThumbnailImageSize() F32 window_aspect_ratio = ((F32)window_width) / ((F32)window_height); // UI size for thumbnail - LLFloater* floater = LLFloaterReg::getInstance("snapshot"); - mThumbnailWidth = floater->getChild<LLView>("thumbnail_placeholder")->getRect().getWidth(); - mThumbnailHeight = floater->getChild<LLView>("thumbnail_placeholder")->getRect().getHeight(); + S32 max_width = LLFloaterSnapshot::getUIWinWidth() - 20; + S32 max_height = 90; - - if (window_aspect_ratio > (F32)mThumbnailWidth / mThumbnailHeight) + if (window_aspect_ratio > (F32)max_width / max_height) { // image too wide, shrink to width - mThumbnailHeight = llround((F32)mThumbnailWidth / window_aspect_ratio); + mThumbnailWidth = max_width; + mThumbnailHeight = llround((F32)max_width / window_aspect_ratio); } else { // image too tall, shrink to height - mThumbnailWidth = llround((F32)mThumbnailHeight * window_aspect_ratio); + mThumbnailHeight = max_height; + mThumbnailWidth = llround((F32)max_height * window_aspect_ratio); } if(mThumbnailWidth > window_width || mThumbnailHeight > window_height) @@ -831,21 +825,10 @@ BOOL LLSnapshotLivePreview::onIdle( void* snapshot_preview ) { // delete any existing image previewp->mFormattedImage = NULL; - // now create the new one of the appropriate format. - // note: postcards and web hardcoded to use jpeg always. - LLFloaterSnapshot::ESnapshotFormat format; - - if (previewp->getSnapshotType() == SNAPSHOT_POSTCARD || - previewp->getSnapshotType() == SNAPSHOT_WEB) - { - format = LLFloaterSnapshot::SNAPSHOT_FORMAT_JPEG; - } - else - { - format = previewp->getSnapshotFormat(); - } - + // note: postcards hardcoded to use jpeg always. + LLFloaterSnapshot::ESnapshotFormat format = previewp->getSnapshotType() == SNAPSHOT_POSTCARD + ? LLFloaterSnapshot::SNAPSHOT_FORMAT_JPEG : previewp->getSnapshotFormat(); switch(format) { case LLFloaterSnapshot::SNAPSHOT_FORMAT_PNG: @@ -972,20 +955,13 @@ LLFloaterPostcard* LLSnapshotLivePreview::savePostcard() return floater; } -// Callback for asset upload -void profile_pic_upload_callback(const LLUUID& uuid) -{ - LLFloaterSnapshot* floater = LLFloaterReg::getTypedInstance<LLFloaterSnapshot>("snapshot"); - floater->setAsProfilePic(uuid); -} - -void LLSnapshotLivePreview::saveTexture(bool set_as_profile_pic) +void LLSnapshotLivePreview::saveTexture() { // gen a new uuid for this asset LLTransactionID tid; tid.generate(); LLAssetID new_asset_id = tid.makeAssetID(gAgent.getSecureSessionID()); - + LLPointer<LLImageJ2C> formatted = new LLImageJ2C; LLPointer<LLImageRaw> scaled = new LLImageRaw(mPreviewImage->getData(), mPreviewImage->getWidth(), @@ -996,30 +972,26 @@ void LLSnapshotLivePreview::saveTexture(bool set_as_profile_pic) if (formatted->encode(scaled, 0.0f)) { - boost::function<void(const LLUUID& uuid)> callback = NULL; - - if (set_as_profile_pic) - { - callback = profile_pic_upload_callback; - } - LLVFile::writeFile(formatted->getData(), formatted->getDataSize(), gVFS, new_asset_id, LLAssetType::AT_TEXTURE); std::string pos_string; LLAgentUI::buildLocationString(pos_string, LLAgentUI::LOCATION_FORMAT_FULL); std::string who_took_it; LLAgentUI::buildFullname(who_took_it); + LLAssetStorage::LLStoreAssetCallback callback = NULL; S32 expected_upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload(); + void *userdata = NULL; upload_new_resource(tid, // tid LLAssetType::AT_TEXTURE, "Snapshot : " + pos_string, "Taken by " + who_took_it + " at " + pos_string, + 0, LLFolderType::FT_SNAPSHOT_CATEGORY, LLInventoryType::IT_SNAPSHOT, PERM_ALL, // Note: Snapshots to inventory is a special case of content upload PERM_NONE, // that ignores the user's premissions preferences and continues to PERM_NONE, // always use these fairly permissive hard-coded initial perms. - MG "Snapshot : " + pos_string, - callback, expected_upload_cost); + callback, expected_upload_cost, userdata); gViewerWindow->playSnapshotAnimAndSound(); } else @@ -1049,81 +1021,6 @@ BOOL LLSnapshotLivePreview::saveLocal() return success; } - -class LLSendWebResponder : public LLHTTPClient::Responder -{ -public: - - virtual void error(U32 status, const std::string& reason) - { - llwarns << status << ": " << reason << llendl; - LLNotificationsUtil::add("ShareToWebFailed"); - } - - virtual void result(const LLSD& content) - { - std::string response_url = content["response_url"].asString(); - - if (!response_url.empty()) - { - LLWeb::loadURLExternal(response_url); - } - else - { - LLNotificationsUtil::add("ShareToWebFailed"); - } - } - -}; - -void LLSnapshotLivePreview::saveWeb(std::string url) -{ - if (url.empty()) - { - llwarns << "No share to web url" << llendl; - return; - } - - LLImageJPEG* jpg = dynamic_cast<LLImageJPEG*>(mFormattedImage.get()); - if(!jpg) - { - llwarns << "Formatted image not a JPEG" << llendl; - return; - } - -/* figure out if there's a better way to serialize */ - LLSD body; - std::vector<U8> binary_image; - U8* data = jpg->getData(); - for (int i = 0; i < jpg->getDataSize(); i++) - { - binary_image.push_back(data[i]); - } - - body["image"] = binary_image; - - body["description"] = getChild<LLLineEditor>("description")->getText(); - - std::string name; - LLAgentUI::buildFullname(name); - - body["avatar_name"] = name; - - LLLandmarkActions::getRegionNameAndCoordsFromPosGlobal(gAgentCamera.getCameraPositionGlobal(), - boost::bind(&LLSnapshotLivePreview::regionNameCallback, this, url, body, _1, _2, _3, _4)); - - gViewerWindow->playSnapshotAnimAndSound(); -} - - -void LLSnapshotLivePreview::regionNameCallback(std::string url, LLSD body, const std::string& name, S32 x, S32 y, S32 z) -{ - body["slurl"] = LLSLURL(name, LLVector3d(x, y, z)).getSLURLString(); - - LLHTTPClient::post(url, body, - new LLSendWebResponder()); -} - ///---------------------------------------------------------------------------- /// Class LLFloaterSnapshot::Impl ///---------------------------------------------------------------------------- @@ -1143,8 +1040,14 @@ 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); @@ -1154,14 +1057,9 @@ public: 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 onCommitSnapshotType(LLUICtrl* ctrl, void* data); static void onCommitSnapshotFormat(LLUICtrl* ctrl, void* data); static void onCommitCustomResolution(LLUICtrl *ctrl, void* data); - static void onCommitSnapshot(LLFloaterSnapshot* view, LLSnapshotLivePreview::ESnapshotType type); - static void confirmSavingTexture(LLFloaterSnapshot* view, bool set_as_profile_pic = false); - static void onSavingTextureConfirmed(const LLSD& notification, const LLSD& response, LLFloaterSnapshot* view, bool set_as_profile_pic); - static void checkCloseOnKeep(LLFloaterSnapshot* view); - static void onCommitProfilePic(LLFloaterSnapshot* view); - static void showAdvanced(LLFloaterSnapshot* view, const BOOL visible); static void resetSnapshotSizeOnUI(LLFloaterSnapshot *view, S32 width, S32 height) ; static BOOL checkImageSize(LLSnapshotLivePreview* previewp, S32& width, S32& height, BOOL isWidthChanged, S32 max_value); @@ -1169,8 +1067,10 @@ public: static void setResolution(LLFloaterSnapshot* floater, const std::string& comboname); static void updateControls(LLFloaterSnapshot* floater); static void updateLayout(LLFloaterSnapshot* floater); + static void updateResolutionTextEntry(LLFloaterSnapshot* floater); private: + static LLSnapshotLivePreview::ESnapshotType getTypeIndex(LLFloaterSnapshot* floater); static ESnapshotFormat getFormatIndex(LLFloaterSnapshot* floater); static LLViewerWindow::ESnapshotType getLayerType(LLFloaterSnapshot* floater); static void comboSetCustom(LLFloaterSnapshot *floater, const std::string& comboname); @@ -1193,6 +1093,22 @@ LLSnapshotLivePreview* LLFloaterSnapshot::Impl::getPreviewView(LLFloaterSnapshot } // static +LLSnapshotLivePreview::ESnapshotType LLFloaterSnapshot::Impl::getTypeIndex(LLFloaterSnapshot* floater) +{ + LLSnapshotLivePreview::ESnapshotType index = LLSnapshotLivePreview::SNAPSHOT_POSTCARD; + LLSD value = floater->childGetValue("snapshot_type_radio"); + const std::string id = value.asString(); + if (id == "postcard") + index = LLSnapshotLivePreview::SNAPSHOT_POSTCARD; + else if (id == "texture") + index = LLSnapshotLivePreview::SNAPSHOT_TEXTURE; + else if (id == "local") + index = LLSnapshotLivePreview::SNAPSHOT_LOCAL; + return index; +} + + +// static LLFloaterSnapshot::ESnapshotFormat LLFloaterSnapshot::Impl::getFormatIndex(LLFloaterSnapshot* floater) { ESnapshotFormat index = SNAPSHOT_FORMAT_PNG; @@ -1240,12 +1156,20 @@ void LLFloaterSnapshot::Impl::updateLayout(LLFloaterSnapshot* floaterp) { LLSnapshotLivePreview* previewp = getPreviewView(floaterp); + S32 delta_height = gSavedSettings.getBOOL("AdvanceSnapshot") ? 0 : floaterp->getUIWinHeightShort() - floaterp->getUIWinHeightLong() ; + if(!gSavedSettings.getBOOL("AdvanceSnapshot")) //set to original window resolution { previewp->mKeepAspectRatio = TRUE; - floaterp->getChild<LLComboBox>("snapshot_size_combo")->setCurrentByIndex(0); - gSavedSettings.setS32("SnapshotLastResolution", 0); + floaterp->getChild<LLComboBox>("postcard_size_combo")->setCurrentByIndex(0); + gSavedSettings.setS32("SnapshotPostcardLastResolution", 0); + + floaterp->getChild<LLComboBox>("texture_size_combo")->setCurrentByIndex(0); + gSavedSettings.setS32("SnapshotTextureLastResolution", 0); + + floaterp->getChild<LLComboBox>("local_size_combo")->setCurrentByIndex(0); + gSavedSettings.setS32("SnapshotLocalLastResolution", 0); LLSnapshotLivePreview* previewp = getPreviewView(floaterp); previewp->setSize(gViewerWindow->getWindowWidthRaw(), gViewerWindow->getWindowHeightRaw()); @@ -1258,6 +1182,9 @@ void LLFloaterSnapshot::Impl::updateLayout(LLFloaterSnapshot* floaterp) // stop all mouse events at fullscreen preview layer floaterp->getParent()->setMouseOpaque(TRUE); + // shrink to smaller layout + floaterp->reshape(floaterp->getRect().getWidth(), floaterp->getUIWinHeightLong() + delta_height); + // can see and interact with fullscreen preview now if (previewp) { @@ -1286,6 +1213,7 @@ 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); if (previewp) { previewp->setVisible(FALSE); @@ -1314,27 +1242,127 @@ void LLFloaterSnapshot::Impl::updateLayout(LLFloaterSnapshot* floaterp) // static void LLFloaterSnapshot::Impl::updateControls(LLFloaterSnapshot* floater) { + LLRadioGroup* snapshot_type_radio = floater->getChild<LLRadioGroup>("snapshot_type_radio"); + snapshot_type_radio->setSelectedIndex(gSavedSettings.getS32("LastSnapshotType")); + LLSnapshotLivePreview::ESnapshotType shot_type = getTypeIndex(floater); + ESnapshotFormat shot_format = (ESnapshotFormat)gSavedSettings.getS32("SnapshotFormat"); //getFormatIndex(floater); LLViewerWindow::ESnapshotType layer_type = getLayerType(floater); + LLViewerWindow::ESnapshotType layer_type = getLayerType(floater); + + floater->childSetVisible("postcard_size_combo", FALSE); + floater->childSetVisible("texture_size_combo", FALSE); + floater->childSetVisible("local_size_combo", FALSE); + + floater->getChild<LLComboBox>("postcard_size_combo")->selectNthItem(gSavedSettings.getS32("SnapshotPostcardLastResolution")); + floater->getChild<LLComboBox>("texture_size_combo")->selectNthItem(gSavedSettings.getS32("SnapshotTextureLastResolution")); + floater->getChild<LLComboBox>("local_size_combo")->selectNthItem(gSavedSettings.getS32("SnapshotLocalLastResolution")); + floater->getChild<LLComboBox>("local_format_combo")->selectNthItem(gSavedSettings.getS32("SnapshotFormat")); + + floater->childSetVisible("upload_btn", shot_type == LLSnapshotLivePreview::SNAPSHOT_TEXTURE); + floater->childSetVisible("send_btn", shot_type == LLSnapshotLivePreview::SNAPSHOT_POSTCARD); + floater->childSetVisible("save_btn", shot_type == LLSnapshotLivePreview::SNAPSHOT_LOCAL); + floater->childSetEnabled("keep_aspect_check", shot_type != LLSnapshotLivePreview::SNAPSHOT_TEXTURE && !floater->impl.mAspectRatioCheckOff); + floater->childSetEnabled("layer_types", shot_type == LLSnapshotLivePreview::SNAPSHOT_LOCAL); + + BOOL is_advance = gSavedSettings.getBOOL("AdvanceSnapshot"); + BOOL is_local = shot_type == LLSnapshotLivePreview::SNAPSHOT_LOCAL; + BOOL show_slider = + shot_type == LLSnapshotLivePreview::SNAPSHOT_POSTCARD + || (is_local && shot_format == LLFloaterSnapshot::SNAPSHOT_FORMAT_JPEG); + + floater->childSetVisible("more_btn", !is_advance); // the only item hidden in advanced mode + floater->childSetVisible("less_btn", is_advance); + floater->childSetVisible("type_label2", is_advance); + floater->childSetVisible("format_label", is_advance && is_local); + floater->childSetVisible("local_format_combo", is_advance && is_local); + floater->childSetVisible("layer_types", is_advance); + floater->childSetVisible("layer_type_label", is_advance); + floater->childSetVisible("snapshot_width", is_advance); + floater->childSetVisible("snapshot_height", is_advance); + floater->childSetVisible("keep_aspect_check", is_advance); + floater->childSetVisible("ui_check", is_advance); + floater->childSetVisible("hud_check", is_advance); + floater->childSetVisible("keep_open_check", is_advance); + floater->childSetVisible("freeze_frame_check", is_advance); + floater->childSetVisible("auto_snapshot_check", is_advance); + floater->childSetVisible("image_quality_slider", is_advance && show_slider); + LLSnapshotLivePreview* previewp = getPreviewView(floater); - if (NULL == previewp) - { - return; + BOOL got_bytes = previewp && previewp->getDataSize() > 0; + BOOL got_snap = previewp && previewp->getSnapshotUpToDate(); + + floater->childSetEnabled("send_btn", shot_type == LLSnapshotLivePreview::SNAPSHOT_POSTCARD && got_snap && previewp->getDataSize() <= MAX_POSTCARD_DATASIZE); + floater->childSetEnabled("upload_btn", shot_type == LLSnapshotLivePreview::SNAPSHOT_TEXTURE && got_snap); + floater->childSetEnabled("save_btn", shot_type == LLSnapshotLivePreview::SNAPSHOT_LOCAL && got_snap); + + LLLocale locale(LLLocale::USER_LOCALE); + std::string bytes_string; + if (got_snap) + { + LLResMgr::getInstance()->getIntegerString(bytes_string, (previewp->getDataSize()) >> 10 ); + } + S32 upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload(); + floater->childSetLabelArg("texture", "[AMOUNT]", llformat("%d",upload_cost)); + floater->childSetLabelArg("upload_btn", "[AMOUNT]", llformat("%d",upload_cost)); + floater->childSetTextArg("file_size_label", "[SIZE]", got_snap ? bytes_string : floater->getString("unknown")); + floater->childSetColor("file_size_label", + shot_type == LLSnapshotLivePreview::SNAPSHOT_POSTCARD + && got_bytes + && previewp->getDataSize() > MAX_POSTCARD_DATASIZE ? LLUIColor(LLColor4::red) : LLUIColorTable::instance().getColor( "LabelTextColor" )); + + switch(shot_type) + { + case LLSnapshotLivePreview::SNAPSHOT_POSTCARD: + layer_type = LLViewerWindow::SNAPSHOT_TYPE_COLOR; + floater->childSetValue("layer_types", "colors"); + if(is_advance) + { + setResolution(floater, "postcard_size_combo"); + } + break; + case LLSnapshotLivePreview::SNAPSHOT_TEXTURE: + layer_type = LLViewerWindow::SNAPSHOT_TYPE_COLOR; + floater->childSetValue("layer_types", "colors"); + if(is_advance) + { + setResolution(floater, "texture_size_combo"); + } + break; + case LLSnapshotLivePreview::SNAPSHOT_LOCAL: + if(is_advance) + { + setResolution(floater, "local_size_combo"); + } + break; + default: + break; } - // Disable buttons until Snapshot is ready. EXT-6534 - BOOL got_snap = previewp->getSnapshotUpToDate(); + updateResolutionTextEntry(floater); - // process Main buttons - floater->childSetEnabled("share", got_snap); - floater->childSetEnabled("save", got_snap); - floater->childSetEnabled("set_profile_pic", got_snap); + if (previewp) + { + previewp->setSnapshotType(shot_type); + previewp->setSnapshotFormat(shot_format); + previewp->setSnapshotBufferType(layer_type); + } +} - // process Share actions buttons - floater->childSetEnabled("share_to_web", got_snap); - floater->childSetEnabled("share_to_email", got_snap); +// static +void LLFloaterSnapshot::Impl::updateResolutionTextEntry(LLFloaterSnapshot* floater) +{ + LLSpinCtrl* width_spinner = floater->getChild<LLSpinCtrl>("snapshot_width"); + LLSpinCtrl* height_spinner = floater->getChild<LLSpinCtrl>("snapshot_height"); - // process Save actions buttons - floater->childSetEnabled("save_to_inventory", got_snap); - floater->childSetEnabled("save_to_computer", got_snap); + if(getTypeIndex(floater) == LLSnapshotLivePreview::SNAPSHOT_TEXTURE) + { + width_spinner->setAllowEdit(FALSE); + height_spinner->setAllowEdit(FALSE); + } + else + { + width_spinner->setAllowEdit(TRUE); + height_spinner->setAllowEdit(TRUE); + } } // static @@ -1348,6 +1376,70 @@ 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) + { + if (previewp->getSnapshotType() == 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); + } + } + else if (previewp->getSnapshotType() == LLSnapshotLivePreview::SNAPSHOT_TEXTURE) + { + previewp->saveTexture(); + } + else + { + previewp->saveLocal(); + } + + if (gSavedSettings.getBOOL("CloseSnapshotOnKeep")) + { + view->closeFloater(); + } + else + { + checkAutoSnapshot(previewp); + } + + updateControls(view); + } +} + +// static void LLFloaterSnapshot::Impl::onClickNewSnapshot(void* data) { LLSnapshotLivePreview* previewp = getPreviewView((LLFloaterSnapshot *)data); @@ -1372,6 +1464,41 @@ void LLFloaterSnapshot::Impl::onClickAutoSnap(LLUICtrl *ctrl, void* data) } } +void LLFloaterSnapshot::Impl::onClickMore(void* data) +{ + gSavedSettings.setBOOL( "AdvanceSnapshot", TRUE ); + + LLFloaterSnapshot *view = (LLFloaterSnapshot *)data; + if (view) + { + view->translate( 0, view->getUIWinHeightShort() - view->getUIWinHeightLong() ); + view->reshape(view->getRect().getWidth(), view->getUIWinHeightLong()); + 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) ; + if(getPreviewView(view)) + { + getPreviewView(view)->setThumbnailImageSize() ; + } + } +} + // static void LLFloaterSnapshot::Impl::onClickUICheck(LLUICtrl *ctrl, void* data) { @@ -1548,8 +1675,10 @@ void LLFloaterSnapshot::Impl::updateResolution(LLUICtrl* ctrl, void* data, BOOL } // save off all selected resolution values - gSavedSettings.setS32("SnapshotLastResolution", view->getChild<LLComboBox>("snapshot_size_combo")->getCurrentIndex()); - + gSavedSettings.setS32("SnapshotPostcardLastResolution", view->getChild<LLComboBox>("postcard_size_combo")->getCurrentIndex()); + gSavedSettings.setS32("SnapshotTextureLastResolution", view->getChild<LLComboBox>("texture_size_combo")->getCurrentIndex()); + gSavedSettings.setS32("SnapshotLocalLastResolution", view->getChild<LLComboBox>("local_size_combo")->getCurrentIndex()); + std::string sdstring = combobox->getSelectedValue(); LLSD sdres; std::stringstream sstream(sdstring); @@ -1629,149 +1758,17 @@ void LLFloaterSnapshot::Impl::onCommitLayerTypes(LLUICtrl* ctrl, void*data) } //static -void LLFloaterSnapshot::Impl::showAdvanced(LLFloaterSnapshot* view, const BOOL visible) -{ - LLPanel* advanced_panel = view->getChild<LLPanel>("snapshot_advanced"); - - if (advanced_panel->getVisible() != visible) - { - gSavedSettings.setBOOL("AdvanceSnapshot", visible); - - advanced_panel->setVisible(visible); - view->getChild<LLButton>("hide_advanced")->setVisible(visible); - view->getChild<LLButton>("show_advanced")->setVisible(!visible); - - if (visible) - { - // stretch the floater so it can accommodate the advanced panel - view->reshape(view->getRect().getWidth() + advanced_panel->getRect().getWidth(), view->getRect().getHeight()); - } - else - { - // shrink floater back to original size - view->reshape(view->getRect().getWidth() - advanced_panel->getRect().getWidth(), view->getRect().getHeight()); - } - } -} - -// This object represents a pending request for avatar properties information -class LLAvatarDataRequest : public LLAvatarPropertiesObserver -{ -public: - LLAvatarDataRequest(const LLUUID& avatar_id, const LLUUID& image_id, LLFloaterSnapshot* floater) - : mAvatarID(avatar_id), - mImageID(image_id), - mSnapshotFloater(floater) - - { - } - - ~LLAvatarDataRequest() - { - // remove ourselves as an observer - LLAvatarPropertiesProcessor::getInstance()-> - removeObserver(mAvatarID, this); - } - - void processProperties(void* data, EAvatarProcessorType type) - { - // route the data to the inspector - if (data - && type == APT_PROPERTIES) - { - - LLAvatarData* avatar_data = static_cast<LLAvatarData*>(data); - - LLAvatarData new_data(*avatar_data); - new_data.image_id = mImageID; - - LLAvatarPropertiesProcessor::getInstance()->sendAvatarPropertiesUpdate(&new_data); - - delete this; - } - } - - // Store avatar ID so we can un-register the observer on destruction - LLUUID mAvatarID; - LLUUID mImageID; - LLFloaterSnapshot* mSnapshotFloater; -}; - -void LLFloaterSnapshot::Impl::onCommitProfilePic(LLFloaterSnapshot* view) -{ - confirmSavingTexture(view, true); -} - -void LLFloaterSnapshot::Impl::onCommitSnapshot(LLFloaterSnapshot* view, LLSnapshotLivePreview::ESnapshotType type) -{ - LLSnapshotLivePreview* previewp = getPreviewView(view); - - if (previewp) - { - previewp->setSnapshotType(type); - - if (type == LLSnapshotLivePreview::SNAPSHOT_WEB) - { - previewp->saveWeb(view->getString("share_to_web_url")); - checkCloseOnKeep(view); - } - else if (type == LLSnapshotLivePreview::SNAPSHOT_LOCAL) - { - previewp->saveLocal(); - checkCloseOnKeep(view); - } - else if (type == LLSnapshotLivePreview::SNAPSHOT_TEXTURE) - { - // uploads and then calls checkCloseOnKeep() on confirmation from user - confirmSavingTexture(view); - } - else if (type == 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); - } - checkCloseOnKeep(view); - } - } -} - -void LLFloaterSnapshot::Impl::confirmSavingTexture(LLFloaterSnapshot* view, bool set_as_profile_pic) -{ - LLSD args; - args["AMOUNT"] = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload(); - LLNotificationsUtil::add("UploadConfirmation", args, LLSD(), - boost::bind(&onSavingTextureConfirmed, _1, _2, view, set_as_profile_pic)); -} - -void LLFloaterSnapshot::Impl::onSavingTextureConfirmed(const LLSD& notification, const LLSD& response, LLFloaterSnapshot* view, bool set_as_profile_pic) +void LLFloaterSnapshot::Impl::onCommitSnapshotType(LLUICtrl* ctrl, void* data) { - S32 option = LLNotificationsUtil::getSelectedOption(notification, response); - - if (option == 0) + LLFloaterSnapshot *view = (LLFloaterSnapshot *)data; + if (view) { - LLSnapshotLivePreview* previewp = getPreviewView(view); - previewp->saveTexture(set_as_profile_pic); - checkCloseOnKeep(view); + gSavedSettings.setS32("LastSnapshotType", getTypeIndex(view)); + getPreviewView(view)->updateSnapshot(TRUE); + updateControls(view); } } -void LLFloaterSnapshot::Impl::checkCloseOnKeep(LLFloaterSnapshot* view) -{ - if (gSavedSettings.getBOOL("CloseSnapshotOnKeep")) - { - view->closeFloater(); - } - else - { - checkAutoSnapshot(getPreviewView(view)); - } -} //static void LLFloaterSnapshot::Impl::onCommitSnapshotFormat(LLUICtrl* ctrl, void* data) @@ -1785,6 +1782,8 @@ void LLFloaterSnapshot::Impl::onCommitSnapshotFormat(LLUICtrl* ctrl, void* data) } } + + // Sets the named size combo to "custom" mode. // static void LLFloaterSnapshot::Impl::comboSetCustom(LLFloaterSnapshot* floater, const std::string& comboname) @@ -1793,11 +1792,24 @@ void LLFloaterSnapshot::Impl::comboSetCustom(LLFloaterSnapshot* floater, const s combo->setCurrentByIndex(combo->getItemCount() - 1); // "custom" is always the last index - gSavedSettings.setS32("SnapshotLastResolution", combo->getCurrentIndex()); + if(comboname == "postcard_size_combo") + { + gSavedSettings.setS32("SnapshotPostcardLastResolution", combo->getCurrentIndex()); + } + else if(comboname == "texture_size_combo") + { + gSavedSettings.setS32("SnapshotTextureLastResolution", combo->getCurrentIndex()); + } + else if(comboname == "local_size_combo") + { + gSavedSettings.setS32("SnapshotLocalLastResolution", combo->getCurrentIndex()); + } checkAspectRatio(floater, -1); // -1 means custom } + + //static BOOL LLFloaterSnapshot::Impl::checkImageSize(LLSnapshotLivePreview* previewp, S32& width, S32& height, BOOL isWidthChanged, S32 max_value) { @@ -1938,7 +1950,9 @@ void LLFloaterSnapshot::Impl::onCommitCustomResolution(LLUICtrl *ctrl, void* dat previewp->setSize(w,h); checkAutoSnapshot(previewp, FALSE); previewp->updateSnapshot(FALSE, TRUE); - comboSetCustom(view, "snapshot_size_combo"); + comboSetCustom(view, "postcard_size_combo"); + comboSetCustom(view, "texture_size_combo"); + comboSetCustom(view, "local_size_combo"); } } @@ -1955,15 +1969,10 @@ void LLFloaterSnapshot::Impl::onCommitCustomResolution(LLUICtrl *ctrl, void* dat // Default constructor LLFloaterSnapshot::LLFloaterSnapshot(const LLSD& key) - : LLTransientDockableFloater(NULL, true, key), + : LLFloater(key), impl (*(new Impl)) { //Called from floater reg: LLUICtrlFactory::getInstance()->buildFloater(this, "floater_snapshot.xml", FALSE); - - mCommitCallbackRegistrar.add("Snapshot.ShowButtons", boost::bind(&LLFloaterSnapshot::updateButtons, this, _2)); - mCommitCallbackRegistrar.add("Snapshot.ShowAdvanced", boost::bind(&Impl::showAdvanced, this, true)); - mCommitCallbackRegistrar.add("Snapshot.HideAdvanced", boost::bind(&Impl::showAdvanced, this, false)); - mCommitCallbackRegistrar.add("Snapshot.Refresh", boost::bind(&Impl::onClickNewSnapshot, this)); } // Destroys the object @@ -1985,14 +1994,19 @@ LLFloaterSnapshot::~LLFloaterSnapshot() BOOL LLFloaterSnapshot::postBuild() { - getChild<LLButton>("share_to_web")->setCommitCallback(boost::bind(&Impl::onCommitSnapshot, this, LLSnapshotLivePreview::SNAPSHOT_WEB)); - getChild<LLButton>("share_to_email")->setCommitCallback(boost::bind(&Impl::onCommitSnapshot, this, LLSnapshotLivePreview::SNAPSHOT_POSTCARD)); - getChild<LLButton>("save_to_inventory")->setCommitCallback(boost::bind(&Impl::onCommitSnapshot, this, LLSnapshotLivePreview::SNAPSHOT_TEXTURE)); - getChild<LLButton>("save_to_computer")->setCommitCallback(boost::bind(&Impl::onCommitSnapshot, this, LLSnapshotLivePreview::SNAPSHOT_LOCAL)); - getChild<LLButton>("set_profile_pic")->setCommitCallback(boost::bind(&Impl::onCommitProfilePic, this)); - + childSetCommitCallback("snapshot_type_radio", Impl::onCommitSnapshotType, this); childSetCommitCallback("local_format_combo", Impl::onCommitSnapshotFormat, this); + 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); childSetValue("image_quality_slider", gSavedSettings.getS32("SnapshotQuality")); @@ -2013,6 +2027,7 @@ BOOL LLFloaterSnapshot::postBuild() childSetCommitCallback("layer_types", Impl::onCommitLayerTypes, this); childSetValue("layer_types", "colors"); + childSetEnabled("layer_types", FALSE); childSetValue("snapshot_width", gSavedSettings.getS32(lastSnapshotWidthName())); childSetValue("snapshot_height", gSavedSettings.getS32(lastSnapshotHeightName())); @@ -2023,7 +2038,9 @@ BOOL LLFloaterSnapshot::postBuild() childSetValue("auto_snapshot_check", gSavedSettings.getBOOL("AutoSnapshot")); childSetCommitCallback("auto_snapshot_check", Impl::onClickAutoSnap, this); - childSetCommitCallback("snapshot_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); // create preview window LLRect full_screen_rect = getRootView()->getRect(); @@ -2044,15 +2061,8 @@ BOOL LLFloaterSnapshot::postBuild() impl.mPreviewHandle = previewp->getHandle(); impl.updateControls(this); impl.updateLayout(this); - impl.showAdvanced(this, gSavedSettings.getBOOL("AdvanceSnapshot")); - - //save off the refresh button's rectangle so we can apply offsets with thumbnail resize - mRefreshBtnRect = getChild<LLButton>("new_snapshot_btn")->getRect(); - - // make sure we share/hide the general buttons - updateButtons(LLSD("main")); - return LLDockableFloater::postBuild(); + return TRUE; } void LLFloaterSnapshot::draw() @@ -2065,19 +2075,15 @@ void LLFloaterSnapshot::draw() return; } - LLDockableFloater::draw(); - - LLButton* refresh_btn = getChild<LLButton>("new_snapshot_btn"); - // revert the refresh button to original intended position - LLRect refresh_rect = mRefreshBtnRect; + LLFloater::draw(); if (previewp) { if(previewp->getThumbnailImage()) { - LLRect thumbnail_rect = getChild<LLView>("thumbnail_placeholder")->getRect(); + LLRect thumbnail_rect = getChild<LLUICtrl>("thumbnail_placeholder")->getRect(); - S32 offset_x = (thumbnail_rect.getWidth() - previewp->getThumbnailWidth()) / 2 + thumbnail_rect.mLeft; + S32 offset_x = (getRect().getWidth() - previewp->getThumbnailWidth()) / 2 ; S32 offset_y = thumbnail_rect.mBottom + (thumbnail_rect.getHeight() - previewp->getThumbnailHeight()) / 2 ; glMatrixMode(GL_MODELVIEW); @@ -2086,14 +2092,8 @@ void LLFloaterSnapshot::draw() previewp->getThumbnailImage(), LLColor4::white); previewp->drawPreviewRect(offset_x, offset_y) ; - - refresh_rect.translate(offset_x - thumbnail_rect.mLeft, offset_y - thumbnail_rect.mBottom); } } - - refresh_btn->setRect(refresh_rect); - drawChild(refresh_btn); - } void LLFloaterSnapshot::onOpen(const LLSD& key) @@ -2107,12 +2107,6 @@ void LLFloaterSnapshot::onOpen(const LLSD& key) gSnapshotFloaterView->setEnabled(TRUE); gSnapshotFloaterView->setVisible(TRUE); gSnapshotFloaterView->adjustToFitScreen(this, FALSE); - - LLButton *snapshots = LLBottomTray::getInstance()->getChild<LLButton>("snapshots"); - - setDockControl(new LLDockControl( - snapshots, this, - getDockTongue(), LLDockControl::TOP)); } void LLFloaterSnapshot::onClose(bool app_quitting) @@ -2140,34 +2134,6 @@ void LLFloaterSnapshot::update() } } -bool LLFloaterSnapshot::updateButtons(const LLSD& mode) -{ - std::string button_mode = mode.asString(); - - bool mode_main("main" == button_mode); - bool mode_share("share" == button_mode); - bool mode_save("save" == button_mode); - - // Default to a known state if mode is invalid. - if (!mode_main && !mode_share && !mode_save) mode_main = true; - - childSetVisible("panel_snapshot_main", mode_main); - childSetVisible("panel_snapshot_share", mode_share); - childSetVisible("panel_snapshot_save", mode_save); - - return true; -} - -void LLFloaterSnapshot::setAsProfilePic(const LLUUID& image_id) -{ - LLAvatarDataRequest* avatar_data_request = new LLAvatarDataRequest(gAgent.getID(), image_id, this); - - LLAvatarPropertiesProcessor* processor = - LLAvatarPropertiesProcessor::getInstance(); - - processor->addObserver(gAgent.getID(), avatar_data_request); - processor->sendAvatarPropertiesRequest(gAgent.getID()); -} ///---------------------------------------------------------------------------- /// Class LLSnapshotFloaterView diff --git a/indra/newview/llfloatersnapshot.h b/indra/newview/llfloatersnapshot.h index 8c4373c35c..1333497bd2 100644 --- a/indra/newview/llfloatersnapshot.h +++ b/indra/newview/llfloatersnapshot.h @@ -34,10 +34,9 @@ #define LL_LLFLOATERSNAPSHOT_H #include "llfloater.h" -#include "lltransientdockablefloater.h" -class LLFloaterSnapshot : public LLTransientDockableFloater +class LLFloaterSnapshot : public LLFloater { public: typedef enum e_snapshot_format @@ -57,10 +56,6 @@ public: static void update(); - void setAsProfilePic(const LLUUID& image_id); - - bool updateButtons(const LLSD& mode); - static S32 getUIWinHeightLong() {return sUIWinHeightLong ;} static S32 getUIWinHeightShort() {return sUIWinHeightShort ;} static S32 getUIWinWidth() {return sUIWinWidth ;} @@ -72,8 +67,6 @@ private: static S32 sUIWinHeightLong ; static S32 sUIWinHeightShort ; static S32 sUIWinWidth ; - - LLRect mRefreshBtnRect; }; class LLSnapshotFloaterView : public LLFloaterView diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp index 5570fe5fec..f741e1bc10 100644 --- a/indra/newview/llviewermenufile.cpp +++ b/indra/newview/llviewermenufile.cpp @@ -318,11 +318,13 @@ class LLFileUploadBulk : public view_listener_t LLStringUtil::trim(asset_name); std::string display_name = LLStringUtil::null; + LLAssetStorage::LLStoreAssetCallback callback = NULL; S32 expected_upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload(); - upload_new_resource(filename, asset_name, asset_name, LLFolderType::FT_NONE, LLInventoryType::IT_NONE, + void *userdata = NULL; + upload_new_resource(filename, asset_name, asset_name, 0, LLFolderType::FT_NONE, LLInventoryType::IT_NONE, LLFloaterPerms::getNextOwnerPerms(), LLFloaterPerms::getGroupPerms(), LLFloaterPerms::getEveryonePerms(), display_name, - NULL, expected_upload_cost); + callback, expected_upload_cost, userdata); // *NOTE: Ew, we don't iterate over the file list here, // we handle the next files in upload_done_callback() @@ -478,15 +480,16 @@ void handle_compress_image(void*) } void upload_new_resource(const std::string& src_filename, std::string name, - std::string desc, + std::string desc, S32 compression_info, LLFolderType::EType destination_folder_type, LLInventoryType::EType inv_type, U32 next_owner_perms, U32 group_perms, U32 everyone_perms, const std::string& display_name, - boost::function<void(const LLUUID& uuid)> callback, - S32 expected_upload_cost) + LLAssetStorage::LLStoreAssetCallback callback, + S32 expected_upload_cost, + void *userdata) { // Generate the temporary UUID. std::string filename = gDirUtilp->getTempFilename(); @@ -768,9 +771,9 @@ void upload_new_resource(const std::string& src_filename, std::string name, { t_disp_name = src_filename; } - upload_new_resource(tid, asset_type, name, desc, + upload_new_resource(tid, asset_type, name, desc, compression_info, // tid destination_folder_type, inv_type, next_owner_perms, group_perms, everyone_perms, - display_name, callback, expected_upload_cost); + display_name, callback, expected_upload_cost, userdata); } else { @@ -889,28 +892,30 @@ void upload_done_callback(const LLUUID& uuid, void* user_data, S32 result, LLExt LLStringUtil::trim(asset_name); std::string display_name = LLStringUtil::null; + LLAssetStorage::LLStoreAssetCallback callback = NULL; + void *userdata = NULL; upload_new_resource(next_file, asset_name, asset_name, // file - LLFolderType::FT_NONE, LLInventoryType::IT_NONE, + 0, LLFolderType::FT_NONE, LLInventoryType::IT_NONE, PERM_NONE, PERM_NONE, PERM_NONE, display_name, - NULL, - expected_upload_cost); // assuming next in a group of uploads is of roughly the same type, i.e. same upload cost - + callback, + expected_upload_cost, // assuming next in a group of uploads is of roughly the same type, i.e. same upload cost + userdata); } } -void upload_new_resource(const LLTransactionID &tid, - LLAssetType::EType asset_type, +void upload_new_resource(const LLTransactionID &tid, LLAssetType::EType asset_type, std::string name, - std::string desc, + std::string desc, S32 compression_info, LLFolderType::EType destination_folder_type, LLInventoryType::EType inv_type, U32 next_owner_perms, U32 group_perms, U32 everyone_perms, const std::string& display_name, - boost::function<void(const LLUUID& uuid)> callback, - S32 expected_upload_cost) + LLAssetStorage::LLStoreAssetCallback callback, + S32 expected_upload_cost, + void *userdata) { if(gDisconnected) { @@ -954,26 +959,79 @@ void upload_new_resource(const LLTransactionID &tid, upload_message.append(display_name); LLUploadDialog::modalUploadDialog(upload_message); + llinfos << "*** Uploading: " << llendl; + llinfos << "Type: " << LLAssetType::lookup(asset_type) << llendl; + llinfos << "UUID: " << uuid << llendl; + llinfos << "Name: " << name << llendl; + llinfos << "Desc: " << desc << llendl; + llinfos << "Expected Upload Cost: " << expected_upload_cost << llendl; + lldebugs << "Folder: " << gInventory.findCategoryUUIDForType((destination_folder_type == LLFolderType::FT_NONE) ? LLFolderType::assetTypeToFolderType(asset_type) : destination_folder_type) << llendl; + lldebugs << "Asset Type: " << LLAssetType::lookup(asset_type) << llendl; std::string url = gAgent.getRegion()->getCapability("NewFileAgentInventory"); - - if (url.empty()) { - llwarns << "Could not get NewFileAgentInventory capability" << llendl; - return; - } + if (!url.empty()) + { + llinfos << "New Agent Inventory via capability" << llendl; + LLSD body; + body["folder_id"] = gInventory.findCategoryUUIDForType((destination_folder_type == LLFolderType::FT_NONE) ? LLFolderType::assetTypeToFolderType(asset_type) : destination_folder_type); + body["asset_type"] = LLAssetType::lookup(asset_type); + body["inventory_type"] = LLInventoryType::lookup(inv_type); + body["name"] = name; + body["description"] = desc; + body["next_owner_mask"] = LLSD::Integer(next_owner_perms); + body["group_mask"] = LLSD::Integer(group_perms); + body["everyone_mask"] = LLSD::Integer(everyone_perms); + body["expected_upload_cost"] = LLSD::Integer(expected_upload_cost); + + //std::ostringstream llsdxml; + //LLSDSerialize::toPrettyXML(body, llsdxml); + //llinfos << "posting body to capability: " << llsdxml.str() << llendl; - llinfos << "New Agent Inventory via capability" << llendl; - LLSD body; - body["folder_id"] = gInventory.findCategoryUUIDForType((destination_folder_type == LLFolderType::FT_NONE) ? LLFolderType::assetTypeToFolderType(asset_type) : destination_folder_type); - body["asset_type"] = LLAssetType::lookup(asset_type); - body["inventory_type"] = LLInventoryType::lookup(inv_type); - body["name"] = name; - body["description"] = desc; - body["next_owner_mask"] = LLSD::Integer(next_owner_perms); - body["group_mask"] = LLSD::Integer(group_perms); - body["everyone_mask"] = LLSD::Integer(everyone_perms); - body["expected_upload_cost"] = LLSD::Integer(expected_upload_cost); + LLHTTPClient::post(url, body, new LLNewAgentInventoryResponder(body, uuid, asset_type)); + } + else + { + llinfos << "NewAgentInventory capability not found, new agent inventory via asset system." << llendl; + // check for adequate funds + // TODO: do this check on the sim + if (LLAssetType::AT_SOUND == asset_type || + LLAssetType::AT_TEXTURE == asset_type || + LLAssetType::AT_ANIMATION == asset_type) + { + S32 balance = gStatusBar->getBalance(); + if (balance < expected_upload_cost) + { + LLStringUtil::format_map_t args; + args["NAME"] = name; + args["AMOUNT"] = llformat("%d", expected_upload_cost); + // insufficient funds, bail on this upload + LLBuyCurrencyHTML::openCurrencyFloater( LLTrans::getString("UploadingCosts", args), expected_upload_cost ); + return; + } + } - LLHTTPClient::post(url, body, new LLNewAgentInventoryResponder(body, uuid, asset_type, callback)); + LLResourceData* data = new LLResourceData; + data->mAssetInfo.mTransactionID = tid; + data->mAssetInfo.mUuid = uuid; + data->mAssetInfo.mType = asset_type; + data->mAssetInfo.mCreatorID = gAgentID; + data->mInventoryType = inv_type; + data->mNextOwnerPerm = next_owner_perms; + data->mExpectedUploadCost = expected_upload_cost; + data->mUserData = userdata; + data->mAssetInfo.setName(name); + data->mAssetInfo.setDescription(desc); + data->mPreferredLocation = destination_folder_type; + + LLAssetStorage::LLStoreAssetCallback asset_callback = &upload_done_callback; + if (callback) + { + asset_callback = callback; + } + gAssetStorage->storeAssetData(data->mAssetInfo.mTransactionID, data->mAssetInfo.mType, + asset_callback, + (void*)data, + FALSE); + } } void init_menu_file() diff --git a/indra/newview/llviewermenufile.h b/indra/newview/llviewermenufile.h index 33f8243ac0..1e6d13f1c6 100644 --- a/indra/newview/llviewermenufile.h +++ b/indra/newview/llviewermenufile.h @@ -34,35 +34,41 @@ #define LLVIEWERMENUFILE_H #include "llfoldertype.h" +#include "llassetstorage.h" #include "llinventorytype.h" class LLTransactionID; + void init_menu_file(); void upload_new_resource(const std::string& src_filename, std::string name, std::string desc, + S32 compression_info, LLFolderType::EType destination_folder_type, LLInventoryType::EType inv_type, U32 next_owner_perms, U32 group_perms, U32 everyone_perms, const std::string& display_name, - boost::function<void(const LLUUID& uuid)> callback, - S32 expected_upload_cost); + LLAssetStorage::LLStoreAssetCallback callback, + S32 expected_upload_cost, + void *userdata); void upload_new_resource(const LLTransactionID &tid, LLAssetType::EType type, std::string name, std::string desc, + S32 compression_info, LLFolderType::EType destination_folder_type, LLInventoryType::EType inv_type, U32 next_owner_perms, U32 group_perms, U32 everyone_perms, const std::string& display_name, - boost::function<void(const LLUUID& uuid)> callback, - S32 expected_upload_cost); + LLAssetStorage::LLStoreAssetCallback callback, + S32 expected_upload_cost, + void *userdata); #endif diff --git a/indra/newview/skins/default/xui/en/floater_snapshot.xml b/indra/newview/skins/default/xui/en/floater_snapshot.xml index 7d81c3e551..452b2ac664 100644 --- a/indra/newview/skins/default/xui/en/floater_snapshot.xml +++ b/indra/newview/skins/default/xui/en/floater_snapshot.xml @@ -1,166 +1,399 @@ <?xml version="1.0" encoding="utf-8" standalone="yes" ?> <floater legacy_header_height="18" - can_minimize="true" - can_close="false" + can_minimize="false" + can_close="true" follows="left|top" - height="340" + height="516" layout="topleft" name="Snapshot" help_topic="snapshot" save_rect="true" save_visibility="true" - can_dock="true" - title="Snapshot" - width="250"> - <floater.string - name="unknown"> - unknown - </floater.string> - <floater.string - name="share_to_web_url" translate="false"> - http://pdp36.lindenlab.com:12777/ - </floater.string> - <view - height="160" - width="230" + title="SNAPSHOT PREVIEW" + width="215"> + <floater.string + name="share_to_web_url" translate="false"> +http://pdp36.lindenlab.com:12777/ + </floater.string> + <floater.string + name="unknown"> + unknown + </floater.string> + <radio_group + height="58" + label="Snapshot type" + layout="topleft" + left="10" + name="snapshot_type_radio" + top="25" + width="205"> + <radio_item + bottom="19" + height="16" + label="Email" + layout="topleft" + name="postcard" /> + <radio_item + bottom="38" + height="16" + label="My inventory (L$[AMOUNT])" + layout="topleft" + name="texture" /> + <radio_item + bottom="57" + height="16" + label="Save to my computer" + layout="topleft" + name="local" /> + </radio_group> + <ui_ctrl + height="90" + width="125" layout="topleft" name="thumbnail_placeholder" - top_pad="30" + top_pad="6" follows="left|top" left="10" /> - <button - follows="left|top" - height="22" - image_overlay="Refresh_Off" - layout="topleft" - left="20" - top_pad="-30" - name="new_snapshot_btn" - width="23" - commit_callback.function="Snapshot.Refresh"/> - <line_editor - border_style="line" - border_thickness="1" - follows="left|top" - height="20" - layout="topleft" - left="10" - max_length="500" - name="description" - top_pad="15" - width="230" - label="Description"/> - <panel - top_pad="20" - left="10" - height="83" - name="panel_snapshot_main" - width="130"> - <button - label="Share Snapshot" - name="share" - top="0" - left="0" - width="130" - commit_callback.function="Snapshot.ShowButtons" - commit_callback.parameter="share"/> - <button - label="Save Snapshot" - name="save" - top_pad="7" + <text + type="string" + font="SansSerifSmall" + length="1" + follows="left|top" + height="14" + layout="topleft" + right="-5" left_delta="0" - width="130" - commit_callback.function="Snapshot.ShowButtons" - commit_callback.parameter="save"/> + halign="right" + name="file_size_label" + top_pad="10" + width="195"> + [SIZE] KB + </text> <button - label="Set As Profile Pic" - name="set_profile_pic" - top_pad="7" - left_delta="0" - width="130"/> - </panel> - <panel - top_delta="0" - left_delta="0" - height="83" - name="panel_snapshot_share" - width="130"> + follows="left|top" + height="22" + image_overlay="Refresh_Off" + layout="topleft" + left="10" + name="new_snapshot_btn" + width="23" /> <button - label="Share to Web" - name="share_to_web" - top="0" - left="0" - visible="false" - width="130"/> + follows="left|top" + height="23" + label="Send" + layout="topleft" + left_pad="5" + right="-5" + name="send_btn" + width="100" /> <button - label="Email Snapshot" - name="share_to_email" - top_pad="7" - left_delta="0" - width="130"/> + follows="left|top" + height="23" + label="Save (L$[AMOUNT])" + layout="topleft" + right="-5" + name="upload_btn" + top_delta="0" + width="100" /> + <flyout_button + follows="left|top" + height="23" + label="Save" + layout="topleft" + right="-5" + name="save_btn" + tool_tip="Save image to a file" + top_delta="0" + width="100"> + <flyout_button.item + label="Save" + name="save_item" + value="save" /> + <flyout_button.item + label="Save As..." + name="saveas_item" + value="save as" /> + </flyout_button> + <button + follows="left|top" + height="23" + label="More" + layout="topleft" + left="10" + name="more_btn" + tool_tip="Advanced options" + width="80" /> <button - label="Back" - name="cancel_share" - top_pad="7" + follows="left|top" + height="23" + label="Less" + layout="topleft" left_delta="0" - width="130" - commit_callback.function="Snapshot.ShowButtons" - commit_callback.parameter="main"/> - </panel> - <panel - top_delta="0" - left_delta="0" - height="83" - name="panel_snapshot_save" - width="130"> + name="less_btn" + tool_tip="Advanced options" + top_delta="0" + width="80" /> <button - label="Save to My Inventory" - name="save_to_inventory" - top="0" - left="0" - width="130"/> - <button - label="Save to My Computer" - name="save_to_computer" - top_pad="7" + follows="left|top" + height="23" + label="Cancel" + layout="topleft" + right="-5" + left_pad="5" + name="discard_btn" + width="100" /> + <text + type="string" + length="1" + follows="top|left" + height="12" + layout="topleft" + left="10" + name="type_label2" + top_pad="5" + width="127"> + Size + </text> + <text + type="string" + length="1" + follows="top|left" + height="12" + layout="topleft" + left_pad="5" + name="format_label" + top_delta="0" + width="70"> + Format + </text> + <combo_box + height="23" + label="Resolution" + layout="topleft" + left="10" + name="postcard_size_combo" + width="120"> + <combo_box.item + label="Current Window" + name="CurrentWindow" + value="[i0,i0]" /> + <combo_box.item + label="640x480" + name="640x480" + value="[i640,i480]" /> + <combo_box.item + label="800x600" + name="800x600" + value="[i800,i600]" /> + <combo_box.item + label="1024x768" + name="1024x768" + value="[i1024,i768]" /> + <combo_box.item + label="Custom" + name="Custom" + value="[i-1,i-1]" /> + </combo_box> + <combo_box + height="23" + label="Resolution" + layout="topleft" left_delta="0" - width="130"/> - <button - label="Back" - name="cancel_save" - top_pad="7" + name="texture_size_combo" + top_delta="0" + width="127"> + <combo_box.item + label="Current Window" + name="CurrentWindow" + value="[i0,i0]" /> + <combo_box.item + label="Small (128x128)" + name="Small(128x128)" + value="[i128,i128]" /> + <combo_box.item + label="Medium (256x256)" + name="Medium(256x256)" + value="[i256,i256]" /> + <combo_box.item + label="Large (512x512)" + name="Large(512x512)" + value="[i512,i512]" /> + <combo_box.item + label="Custom" + name="Custom" + value="[i-1,i-1]" /> + </combo_box> + <combo_box + height="23" + label="Resolution" + layout="topleft" + left_delta="0" + name="local_size_combo" + top_delta="0" + width="127"> + <combo_box.item + label="Current Window" + name="CurrentWindow" + value="[i0,i0]" /> + <combo_box.item + label="320x240" + name="320x240" + value="[i320,i240]" /> + <combo_box.item + label="640x480" + name="640x480" + value="[i640,i480]" /> + <combo_box.item + label="800x600" + name="800x600" + value="[i800,i600]" /> + <combo_box.item + label="1024x768" + name="1024x768" + value="[i1024,i768]" /> + <combo_box.item + label="1280x1024" + name="1280x1024" + value="[i1280,i1024]" /> + <combo_box.item + label="1600x1200" + name="1600x1200" + value="[i1600,i1200]" /> + <combo_box.item + label="Custom" + name="Custom" + value="[i-1,i-1]" /> + </combo_box> + <combo_box + height="23" + label="Format" + layout="topleft" + left_pad="5" + name="local_format_combo" + width="70"> + <combo_box.item + label="PNG" + name="PNG" /> + <combo_box.item + label="JPEG" + name="JPEG" /> + <combo_box.item + label="BMP" + name="BMP" /> + </combo_box> + <spinner + allow_text_entry="false" + decimal_digits="0" + follows="left|top" + height="20" + increment="32" + label="Width" + label_width="40" + layout="topleft" + left="10" + max_val="6016" + min_val="32" + name="snapshot_width" + top_pad="10" + width="95" /> + <spinner + allow_text_entry="false" + decimal_digits="0" + follows="left|top" + height="20" + increment="32" + label="Height" + label_width="40" + layout="topleft" + left_pad="5" + max_val="6016" + min_val="32" + name="snapshot_height" + top_delta="0" + width="95" /> + <check_box + bottom_delta="20" + label="Constrain proportions" + layout="topleft" + left="10" + name="keep_aspect_check" /> + <slider + decimal_digits="0" + follows="left|top" + height="15" + increment="1" + initial_value="75" + label="Image quality" + label_width="100" + layout="topleft" left_delta="0" - width="130" - commit_callback.function="Snapshot.ShowButtons" - commit_callback.parameter="main"/> - </panel> - <button - follows="left" - height="22" - layout="topleft" - left="210" - name="show_advanced" - image_overlay="TabIcon_Close_Off" - bottom_delta="0" - width="30" - commit_callback.function="Snapshot.ShowAdvanced"/> - <button - follows="left" - height="22" - layout="topleft" - left="210" - name="hide_advanced" - image_overlay="TabIcon_Open_Off" - top_delta="0" - visible="false" - width="30" - commit_callback.function="Snapshot.HideAdvanced"/> - <panel - visible="false" - left="250" - top="17" - name="snapshot_advanced" - filename="panel_snapshot_advanced.xml"/> + max_val="100" + name="image_quality_slider" + top_pad="5" + width="205" /> + <text + type="string" + length="1" + follows="left|top" + height="13" + layout="topleft" + left="10" + name="layer_type_label" + top_pad="5" + width="50"> + Capture: + </text> + <combo_box + height="23" + label="Image Layers" + layout="topleft" + left="30" + name="layer_types" + width="145"> + <combo_box.item + label="Colors" + name="Colors" + value="colors" /> + <combo_box.item + label="Depth" + name="Depth" + value="depth" /> + </combo_box> + <check_box + label="Interface" + layout="topleft" + left="30" + top_pad="10" + width="180" + name="ui_check" /> + <check_box + label="HUDs" + layout="topleft" + left="30" + top_pad="10" + width="180" + name="hud_check" /> + <check_box + label="Keep open after saving" + layout="topleft" + left="10" + top_pad="8" + width="180" + name="keep_open_check" /> + <check_box + label="Freeze frame (fullscreen)" + layout="topleft" + left="10" + top_pad="8" + width="180" + name="freeze_frame_check" /> + <check_box + label="Auto-refresh" + layout="topleft" + left="10" + top_pad="8" + width="180" + name="auto_snapshot_check" /> </floater> diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index cf3097cb06..20a2a7d954 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -4518,18 +4518,6 @@ Uploading in-world and web site snapshots... </notification> <notification - icon="alertmodal.tga" - name="UploadConfirmation" - type="alertmodal"> -Uploading costs L$[AMOUNT]. -Do you wish to proceed? - <usetemplate - name="okcancelbuttons" - notext="Cancel" - yestext="Upload"/> - </notification> - - <notification icon="notify.tga" name="UploadPayment" persist="true" @@ -5527,14 +5515,6 @@ Failed to find [TYPE] named [DESC] in database. <notification icon="notify.tga" - name="ShareToWebFailed" - persist="true" - type="notify"> - Failed to upload image to web. - </notification> - - <notification - icon="notify.tga" name="InvalidWearable" persist="true" type="notify"> |