diff options
Diffstat (limited to 'indra/newview/llpreviewtexture.cpp')
-rw-r--r-- | indra/newview/llpreviewtexture.cpp | 990 |
1 files changed, 495 insertions, 495 deletions
diff --git a/indra/newview/llpreviewtexture.cpp b/indra/newview/llpreviewtexture.cpp index ea7d4800e0..5e19d770a6 100644 --- a/indra/newview/llpreviewtexture.cpp +++ b/indra/newview/llpreviewtexture.cpp @@ -1,25 +1,25 @@ -/** +/** * @file llpreviewtexture.cpp * @brief LLPreviewTexture class implementation * * $LicenseInfo:firstyear=2002&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$ */ @@ -65,89 +65,89 @@ const F32 PREVIEW_TEXTURE_MIN_ASPECT = 0.005f; LLPreviewTexture::LLPreviewTexture(const LLSD& key) - : LLPreview(key), - mLoadingFullImage( FALSE ), - mShowKeepDiscard(FALSE), - mCopyToInv(FALSE), - mIsCopyable(FALSE), - mIsFullPerm(FALSE), - mUpdateDimensions(TRUE), - mLastHeight(0), - mLastWidth(0), - mAspectRatio(0.f), - mPreviewToSave(FALSE), - mImage(NULL), - mImageOldBoostLevel(LLGLTexture::BOOST_NONE) + : LLPreview(key), + mLoadingFullImage( FALSE ), + mShowKeepDiscard(FALSE), + mCopyToInv(FALSE), + mIsCopyable(FALSE), + mIsFullPerm(FALSE), + mUpdateDimensions(TRUE), + mLastHeight(0), + mLastWidth(0), + mAspectRatio(0.f), + mPreviewToSave(FALSE), + mImage(NULL), + mImageOldBoostLevel(LLGLTexture::BOOST_NONE) { - updateImageID(); - if (key.has("save_as")) - { - mPreviewToSave = TRUE; - } + updateImageID(); + if (key.has("save_as")) + { + mPreviewToSave = TRUE; + } } LLPreviewTexture::~LLPreviewTexture() { - LLLoadedCallbackEntry::cleanUpCallbackList(&mCallbackTextureList) ; - - if( mLoadingFullImage ) - { - getWindow()->decBusyCount(); - } - - if (mImage.notNull()) - { - mImage->setBoostLevel(mImageOldBoostLevel); - mImage = NULL; - } + LLLoadedCallbackEntry::cleanUpCallbackList(&mCallbackTextureList) ; + + if( mLoadingFullImage ) + { + getWindow()->decBusyCount(); + } + + if (mImage.notNull()) + { + mImage->setBoostLevel(mImageOldBoostLevel); + mImage = NULL; + } } void LLPreviewTexture::populateRatioList() { - // Fill in ratios list with common aspect ratio values - mRatiosList.clear(); - mRatiosList.push_back(LLTrans::getString("Unconstrained")); - mRatiosList.push_back("1:1"); - mRatiosList.push_back("4:3"); - mRatiosList.push_back("10:7"); - mRatiosList.push_back("3:2"); - mRatiosList.push_back("16:10"); - mRatiosList.push_back("16:9"); - mRatiosList.push_back("2:1"); - - // Now fill combo box with provided list - LLComboBox* combo = getChild<LLComboBox>("combo_aspect_ratio"); - combo->removeall(); - - for (std::vector<std::string>::const_iterator it = mRatiosList.begin(); it != mRatiosList.end(); ++it) - { - combo->add(*it); - } + // Fill in ratios list with common aspect ratio values + mRatiosList.clear(); + mRatiosList.push_back(LLTrans::getString("Unconstrained")); + mRatiosList.push_back("1:1"); + mRatiosList.push_back("4:3"); + mRatiosList.push_back("10:7"); + mRatiosList.push_back("3:2"); + mRatiosList.push_back("16:10"); + mRatiosList.push_back("16:9"); + mRatiosList.push_back("2:1"); + + // Now fill combo box with provided list + LLComboBox* combo = getChild<LLComboBox>("combo_aspect_ratio"); + combo->removeall(); + + for (std::vector<std::string>::const_iterator it = mRatiosList.begin(); it != mRatiosList.end(); ++it) + { + combo->add(*it); + } } // virtual BOOL LLPreviewTexture::postBuild() { - if (mCopyToInv) - { - getChild<LLButton>("Keep")->setLabel(getString("Copy")); - childSetAction("Keep",LLPreview::onBtnCopyToInv,this); - getChildView("Discard")->setVisible( false); - } - else if (mShowKeepDiscard) - { - childSetAction("Keep",onKeepBtn,this); - childSetAction("Discard",onDiscardBtn,this); - } - else - { - getChildView("Keep")->setVisible( false); - getChildView("Discard")->setVisible( false); - } - - childSetAction("save_tex_btn", LLPreviewTexture::onSaveAsBtn, this); - getChildView("save_tex_btn")->setVisible( true); - getChildView("save_tex_btn")->setEnabled(canSaveAs()); + if (mCopyToInv) + { + getChild<LLButton>("Keep")->setLabel(getString("Copy")); + childSetAction("Keep",LLPreview::onBtnCopyToInv,this); + getChildView("Discard")->setVisible( false); + } + else if (mShowKeepDiscard) + { + childSetAction("Keep",onKeepBtn,this); + childSetAction("Discard",onDiscardBtn,this); + } + else + { + getChildView("Keep")->setVisible( false); + getChildView("Discard")->setVisible( false); + } + + childSetAction("save_tex_btn", LLPreviewTexture::onSaveAsBtn, this); + getChildView("save_tex_btn")->setVisible( true); + getChildView("save_tex_btn")->setEnabled(canSaveAs()); const LLInventoryItem* item = getItem(); if (item) @@ -165,119 +165,119 @@ BOOL LLPreviewTexture::postBuild() } } - // Fill in ratios list and combo box with common aspect ratio values - populateRatioList(); + // Fill in ratios list and combo box with common aspect ratio values + populateRatioList(); - childSetCommitCallback("combo_aspect_ratio", onAspectRatioCommit, this); + childSetCommitCallback("combo_aspect_ratio", onAspectRatioCommit, this); - LLComboBox* combo = getChild<LLComboBox>("combo_aspect_ratio"); - combo->setCurrentByIndex(0); - - return LLPreview::postBuild(); + LLComboBox* combo = getChild<LLComboBox>("combo_aspect_ratio"); + combo->setCurrentByIndex(0); + + return LLPreview::postBuild(); } // static void LLPreviewTexture::onSaveAsBtn(void* data) { - LLPreviewTexture* self = (LLPreviewTexture*)data; - self->saveAs(); + LLPreviewTexture* self = (LLPreviewTexture*)data; + self->saveAs(); } void LLPreviewTexture::draw() { - updateDimensions(); - - LLPreview::draw(); - - if (!isMinimized()) - { - LLGLSUIDefault gls_ui; - gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); - - const LLRect& border = mClientRect; - LLRect interior = mClientRect; - interior.stretch( -PREVIEW_BORDER_WIDTH ); - - // ...border - gl_rect_2d( border, LLColor4(0.f, 0.f, 0.f, 1.f)); - gl_rect_2d_checkerboard( interior ); - - if ( mImage.notNull() ) - { - // Draw the texture - gGL.diffuseColor3f( 1.f, 1.f, 1.f ); - gl_draw_scaled_image(interior.mLeft, - interior.mBottom, - interior.getWidth(), - interior.getHeight(), - mImage); - - // Pump the texture priority - F32 pixel_area = mLoadingFullImage ? (F32)MAX_IMAGE_AREA : (F32)(interior.getWidth() * interior.getHeight() ); - mImage->addTextureStats( pixel_area ); - - // Don't bother decoding more than we can display, unless - // we're loading the full image. - if (!mLoadingFullImage) - { - S32 int_width = interior.getWidth(); - S32 int_height = interior.getHeight(); - mImage->setKnownDrawSize(int_width, int_height); - } - else - { - // Don't use this feature - mImage->setKnownDrawSize(0, 0); - } - - if( mLoadingFullImage ) - { - LLFontGL::getFontSansSerif()->renderUTF8(LLTrans::getString("Receiving"), 0, - interior.mLeft + 4, - interior.mBottom + 4, - LLColor4::white, LLFontGL::LEFT, LLFontGL::BOTTOM, - LLFontGL::NORMAL, - LLFontGL::DROP_SHADOW); - - F32 data_progress = mImage->getDownloadProgress() ; - - // Draw the progress bar. - const S32 BAR_HEIGHT = 12; - const S32 BAR_LEFT_PAD = 80; - S32 left = interior.mLeft + 4 + BAR_LEFT_PAD; - S32 bar_width = getRect().getWidth() - left - RESIZE_HANDLE_WIDTH - 2; - S32 top = interior.mBottom + 4 + BAR_HEIGHT; - S32 right = left + bar_width; - S32 bottom = top - BAR_HEIGHT; - - LLColor4 background_color(0.f, 0.f, 0.f, 0.75f); - LLColor4 decoded_color(0.f, 1.f, 0.f, 1.0f); - LLColor4 downloaded_color(0.f, 0.5f, 0.f, 1.0f); - - gl_rect_2d(left, top, right, bottom, background_color); - - if (data_progress > 0.0f) - { - // Downloaded bytes - right = left + llfloor(data_progress * (F32)bar_width); - if (right > left) - { - gl_rect_2d(left, top, right, bottom, downloaded_color); - } - } - } - else - if( !mSavedFileTimer.hasExpired() ) - { - LLFontGL::getFontSansSerif()->renderUTF8(LLTrans::getString("FileSaved"), 0, - interior.mLeft + 4, - interior.mBottom + 4, - LLColor4::white, LLFontGL::LEFT, LLFontGL::BOTTOM, - LLFontGL::NORMAL, - LLFontGL::DROP_SHADOW); - } - } - } + updateDimensions(); + + LLPreview::draw(); + + if (!isMinimized()) + { + LLGLSUIDefault gls_ui; + gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); + + const LLRect& border = mClientRect; + LLRect interior = mClientRect; + interior.stretch( -PREVIEW_BORDER_WIDTH ); + + // ...border + gl_rect_2d( border, LLColor4(0.f, 0.f, 0.f, 1.f)); + gl_rect_2d_checkerboard( interior ); + + if ( mImage.notNull() ) + { + // Draw the texture + gGL.diffuseColor3f( 1.f, 1.f, 1.f ); + gl_draw_scaled_image(interior.mLeft, + interior.mBottom, + interior.getWidth(), + interior.getHeight(), + mImage); + + // Pump the texture priority + F32 pixel_area = mLoadingFullImage ? (F32)MAX_IMAGE_AREA : (F32)(interior.getWidth() * interior.getHeight() ); + mImage->addTextureStats( pixel_area ); + + // Don't bother decoding more than we can display, unless + // we're loading the full image. + if (!mLoadingFullImage) + { + S32 int_width = interior.getWidth(); + S32 int_height = interior.getHeight(); + mImage->setKnownDrawSize(int_width, int_height); + } + else + { + // Don't use this feature + mImage->setKnownDrawSize(0, 0); + } + + if( mLoadingFullImage ) + { + LLFontGL::getFontSansSerif()->renderUTF8(LLTrans::getString("Receiving"), 0, + interior.mLeft + 4, + interior.mBottom + 4, + LLColor4::white, LLFontGL::LEFT, LLFontGL::BOTTOM, + LLFontGL::NORMAL, + LLFontGL::DROP_SHADOW); + + F32 data_progress = mImage->getDownloadProgress() ; + + // Draw the progress bar. + const S32 BAR_HEIGHT = 12; + const S32 BAR_LEFT_PAD = 80; + S32 left = interior.mLeft + 4 + BAR_LEFT_PAD; + S32 bar_width = getRect().getWidth() - left - RESIZE_HANDLE_WIDTH - 2; + S32 top = interior.mBottom + 4 + BAR_HEIGHT; + S32 right = left + bar_width; + S32 bottom = top - BAR_HEIGHT; + + LLColor4 background_color(0.f, 0.f, 0.f, 0.75f); + LLColor4 decoded_color(0.f, 1.f, 0.f, 1.0f); + LLColor4 downloaded_color(0.f, 0.5f, 0.f, 1.0f); + + gl_rect_2d(left, top, right, bottom, background_color); + + if (data_progress > 0.0f) + { + // Downloaded bytes + right = left + llfloor(data_progress * (F32)bar_width); + if (right > left) + { + gl_rect_2d(left, top, right, bottom, downloaded_color); + } + } + } + else + if( !mSavedFileTimer.hasExpired() ) + { + LLFontGL::getFontSansSerif()->renderUTF8(LLTrans::getString("FileSaved"), 0, + interior.mLeft + 4, + interior.mBottom + 4, + LLColor4::white, LLFontGL::LEFT, LLFontGL::BOTTOM, + LLFontGL::NORMAL, + LLFontGL::DROP_SHADOW); + } + } + } } @@ -285,45 +285,45 @@ void LLPreviewTexture::draw() // virtual BOOL LLPreviewTexture::canSaveAs() const { - return mIsFullPerm && !mLoadingFullImage && mImage.notNull() && !mImage->isMissingAsset(); + return mIsFullPerm && !mLoadingFullImage && mImage.notNull() && !mImage->isMissingAsset(); } // virtual void LLPreviewTexture::saveAs() { - if( mLoadingFullImage ) - return; + if( mLoadingFullImage ) + return; - std::string filename = getItem() ? LLDir::getScrubbedFileName(getItem()->getName()) : LLStringUtil::null; - LLFilePickerReplyThread::startPicker(boost::bind(&LLPreviewTexture::saveTextureToFile, this, _1), LLFilePicker::FFSAVE_TGAPNG, filename); + std::string filename = getItem() ? LLDir::getScrubbedFileName(getItem()->getName()) : LLStringUtil::null; + LLFilePickerReplyThread::startPicker(boost::bind(&LLPreviewTexture::saveTextureToFile, this, _1), LLFilePicker::FFSAVE_TGAPNG, filename); } void LLPreviewTexture::saveTextureToFile(const std::vector<std::string>& filenames) { - const LLInventoryItem* item = getItem(); - if (item && mPreviewToSave) - { - mPreviewToSave = FALSE; - LLFloaterReg::showTypedInstance<LLPreviewTexture>("preview_texture", item->getUUID()); - } - - // remember the user-approved/edited file name. - mSaveFileName = filenames[0]; - mLoadingFullImage = TRUE; - getWindow()->incBusyCount(); - - mImage->forceToSaveRawImage(0);//re-fetch the raw image if the old one is removed. - mImage->setLoadedCallback(LLPreviewTexture::onFileLoadedForSave, - 0, TRUE, FALSE, new LLUUID(mItemUUID), &mCallbackTextureList); + const LLInventoryItem* item = getItem(); + if (item && mPreviewToSave) + { + mPreviewToSave = FALSE; + LLFloaterReg::showTypedInstance<LLPreviewTexture>("preview_texture", item->getUUID()); + } + + // remember the user-approved/edited file name. + mSaveFileName = filenames[0]; + mLoadingFullImage = TRUE; + getWindow()->incBusyCount(); + + mImage->forceToSaveRawImage(0);//re-fetch the raw image if the old one is removed. + mImage->setLoadedCallback(LLPreviewTexture::onFileLoadedForSave, + 0, TRUE, FALSE, new LLUUID(mItemUUID), &mCallbackTextureList); } void LLPreviewTexture::saveMultipleToFile(const std::string& file_name) { - std::string texture_location(gSavedSettings.getString("TextureSaveLocation")); + std::string texture_location(gSavedSettings.getString("TextureSaveLocation")); std::string texture_name = file_name.empty() ? getItem()->getName() : file_name; - + std::string filepath; S32 i = 0; S32 err = 0; @@ -345,8 +345,8 @@ void LLPreviewTexture::saveMultipleToFile(const std::string& file_name) err = LLFile::stat( filepath, &stat_info ); i++; } while (-1 != err); // Search until the file is not found (i.e., stat() gives an error). - - + + mSaveFileName = filepath; mLoadingFullImage = TRUE; getWindow()->incBusyCount(); @@ -359,137 +359,137 @@ void LLPreviewTexture::saveMultipleToFile(const std::string& file_name) // virtual void LLPreviewTexture::reshape(S32 width, S32 height, BOOL called_from_parent) { - LLPreview::reshape(width, height, called_from_parent); - - LLRect dim_rect(getChildView("dimensions")->getRect()); - - S32 horiz_pad = 2 * (LLPANEL_BORDER_WIDTH + PREVIEW_PAD) + PREVIEW_RESIZE_HANDLE_SIZE; - - // add space for dimensions and aspect ratio - S32 info_height = dim_rect.mTop + CLIENT_RECT_VPAD; - if (getChild<LLLayoutPanel>("buttons_panel")->getVisible()) - { - info_height += getChild<LLLayoutPanel>("buttons_panel")->getRect().getHeight(); - } - LLRect client_rect(horiz_pad, getRect().getHeight(), getRect().getWidth() - horiz_pad, 0); - client_rect.mTop -= (PREVIEW_HEADER_SIZE + CLIENT_RECT_VPAD); - client_rect.mBottom += PREVIEW_BORDER + CLIENT_RECT_VPAD + info_height ; - - S32 client_width = client_rect.getWidth(); - S32 client_height = client_rect.getHeight(); - - if (mAspectRatio > 0.f) - { - if(mAspectRatio > 1.f) - { - client_height = llceil((F32)client_width / mAspectRatio); - if(client_height > client_rect.getHeight()) - { - client_height = client_rect.getHeight(); - client_width = llceil((F32)client_height * mAspectRatio); - } - } - else//mAspectRatio < 1.f - { - client_width = llceil((F32)client_height * mAspectRatio); - if(client_width > client_rect.getWidth()) - { - client_width = client_rect.getWidth(); - client_height = llceil((F32)client_width / mAspectRatio); - } - } - } - - mClientRect.setLeftTopAndSize(client_rect.getCenterX() - (client_width / 2), client_rect.getCenterY() + (client_height / 2), client_width, client_height); + LLPreview::reshape(width, height, called_from_parent); + + LLRect dim_rect(getChildView("dimensions")->getRect()); + + S32 horiz_pad = 2 * (LLPANEL_BORDER_WIDTH + PREVIEW_PAD) + PREVIEW_RESIZE_HANDLE_SIZE; + + // add space for dimensions and aspect ratio + S32 info_height = dim_rect.mTop + CLIENT_RECT_VPAD; + if (getChild<LLLayoutPanel>("buttons_panel")->getVisible()) + { + info_height += getChild<LLLayoutPanel>("buttons_panel")->getRect().getHeight(); + } + LLRect client_rect(horiz_pad, getRect().getHeight(), getRect().getWidth() - horiz_pad, 0); + client_rect.mTop -= (PREVIEW_HEADER_SIZE + CLIENT_RECT_VPAD); + client_rect.mBottom += PREVIEW_BORDER + CLIENT_RECT_VPAD + info_height ; + + S32 client_width = client_rect.getWidth(); + S32 client_height = client_rect.getHeight(); + + if (mAspectRatio > 0.f) + { + if(mAspectRatio > 1.f) + { + client_height = llceil((F32)client_width / mAspectRatio); + if(client_height > client_rect.getHeight()) + { + client_height = client_rect.getHeight(); + client_width = llceil((F32)client_height * mAspectRatio); + } + } + else//mAspectRatio < 1.f + { + client_width = llceil((F32)client_height * mAspectRatio); + if(client_width > client_rect.getWidth()) + { + client_width = client_rect.getWidth(); + client_height = llceil((F32)client_width / mAspectRatio); + } + } + } + + mClientRect.setLeftTopAndSize(client_rect.getCenterX() - (client_width / 2), client_rect.getCenterY() + (client_height / 2), client_width, client_height); } // virtual void LLPreviewTexture::onFocusReceived() { - LLPreview::onFocusReceived(); + LLPreview::onFocusReceived(); } void LLPreviewTexture::openToSave() { - mPreviewToSave = TRUE; + mPreviewToSave = TRUE; } void LLPreviewTexture::hideCtrlButtons() { - getChildView("desc txt")->setVisible(false); - getChildView("desc")->setVisible(false); - getChild<LLLayoutStack>("preview_stack")->collapsePanel(getChild<LLLayoutPanel>("buttons_panel"), true); - getChild<LLLayoutPanel>("buttons_panel")->setVisible(false); - getChild<LLComboBox>("combo_aspect_ratio")->setCurrentByIndex(0); //unconstrained - reshape(getRect().getWidth(), getRect().getHeight()); + getChildView("desc txt")->setVisible(false); + getChildView("desc")->setVisible(false); + getChild<LLLayoutStack>("preview_stack")->collapsePanel(getChild<LLLayoutPanel>("buttons_panel"), true); + getChild<LLLayoutPanel>("buttons_panel")->setVisible(false); + getChild<LLComboBox>("combo_aspect_ratio")->setCurrentByIndex(0); //unconstrained + reshape(getRect().getWidth(), getRect().getHeight()); } // static -void LLPreviewTexture::onFileLoadedForSave(BOOL success, - LLViewerFetchedTexture *src_vi, - LLImageRaw* src, - LLImageRaw* aux_src, - S32 discard_level, - BOOL final, - void* userdata) +void LLPreviewTexture::onFileLoadedForSave(BOOL success, + LLViewerFetchedTexture *src_vi, + LLImageRaw* src, + LLImageRaw* aux_src, + S32 discard_level, + BOOL final, + void* userdata) { - LLUUID* item_uuid = (LLUUID*) userdata; - - LLPreviewTexture* self = LLFloaterReg::findTypedInstance<LLPreviewTexture>("preview_texture", *item_uuid); - - if( final || !success ) - { - delete item_uuid; - - if( self ) - { - self->getWindow()->decBusyCount(); - self->mLoadingFullImage = FALSE; - } - } - - if( self && final && success ) - { - const U32 ext_length = 3; - std::string extension = self->mSaveFileName.substr( self->mSaveFileName.length() - ext_length); - LLStringUtil::toLower(extension); - // We only support saving in PNG or TGA format - LLPointer<LLImageFormatted> image; - if(extension == "png") - { - image = new LLImagePNG; - } - else if(extension == "tga") - { - image = new LLImageTGA; - } - - if( image && !image->encode( src, 0 ) ) - { - LLSD args; - args["FILE"] = self->mSaveFileName; - LLNotificationsUtil::add("CannotEncodeFile", args); - } - else if( image && !image->save( self->mSaveFileName ) ) - { - LLSD args; - args["FILE"] = self->mSaveFileName; - LLNotificationsUtil::add("CannotWriteFile", args); - } - else - { - self->mSavedFileTimer.reset(); - self->mSavedFileTimer.setTimerExpirySec( SECONDS_TO_SHOW_FILE_SAVED_MSG ); - } - - self->mSaveFileName.clear(); - } - - if( self && !success ) - { - LLNotificationsUtil::add("CannotDownloadFile"); - } + LLUUID* item_uuid = (LLUUID*) userdata; + + LLPreviewTexture* self = LLFloaterReg::findTypedInstance<LLPreviewTexture>("preview_texture", *item_uuid); + + if( final || !success ) + { + delete item_uuid; + + if( self ) + { + self->getWindow()->decBusyCount(); + self->mLoadingFullImage = FALSE; + } + } + + if( self && final && success ) + { + const U32 ext_length = 3; + std::string extension = self->mSaveFileName.substr( self->mSaveFileName.length() - ext_length); + LLStringUtil::toLower(extension); + // We only support saving in PNG or TGA format + LLPointer<LLImageFormatted> image; + if(extension == "png") + { + image = new LLImagePNG; + } + else if(extension == "tga") + { + image = new LLImageTGA; + } + + if( image && !image->encode( src, 0 ) ) + { + LLSD args; + args["FILE"] = self->mSaveFileName; + LLNotificationsUtil::add("CannotEncodeFile", args); + } + else if( image && !image->save( self->mSaveFileName ) ) + { + LLSD args; + args["FILE"] = self->mSaveFileName; + LLNotificationsUtil::add("CannotWriteFile", args); + } + else + { + self->mSavedFileTimer.reset(); + self->mSavedFileTimer.setTimerExpirySec( SECONDS_TO_SHOW_FILE_SAVED_MSG ); + } + + self->mSaveFileName.clear(); + } + + if( self && !success ) + { + LLNotificationsUtil::add("CannotDownloadFile"); + } } @@ -498,229 +498,229 @@ void LLPreviewTexture::onFileLoadedForSave(BOOL success, // When we receive it, reshape the window accordingly. void LLPreviewTexture::updateDimensions() { - if (!mImage) - { - return; - } - if ((mImage->getFullWidth() * mImage->getFullHeight()) == 0) - { - return; - } - - S32 img_width = mImage->getFullWidth(); - S32 img_height = mImage->getFullHeight(); - - if (mAssetStatus != PREVIEW_ASSET_LOADED - || mLastWidth != img_width - || mLastHeight != img_height) - { - mAssetStatus = PREVIEW_ASSET_LOADED; - // Asset has been fully loaded, adjust aspect ratio - adjustAspectRatio(); - } - - - // Update the width/height display every time - getChild<LLUICtrl>("dimensions")->setTextArg("[WIDTH]", llformat("%d", img_width)); - getChild<LLUICtrl>("dimensions")->setTextArg("[HEIGHT]", llformat("%d", img_height)); - - mLastHeight = img_height; - mLastWidth = img_width; - - // Reshape the floater only when required - if (mUpdateDimensions) - { - mUpdateDimensions = FALSE; - - //reshape floater - reshape(getRect().getWidth(), getRect().getHeight()); - - gFloaterView->adjustToFitScreen(this, FALSE); - - LLRect dim_rect(getChildView("dimensions")->getRect()); - LLRect aspect_label_rect(getChildView("aspect_ratio")->getRect()); - getChildView("aspect_ratio")->setVisible( dim_rect.mRight < aspect_label_rect.mLeft); - } + if (!mImage) + { + return; + } + if ((mImage->getFullWidth() * mImage->getFullHeight()) == 0) + { + return; + } + + S32 img_width = mImage->getFullWidth(); + S32 img_height = mImage->getFullHeight(); + + if (mAssetStatus != PREVIEW_ASSET_LOADED + || mLastWidth != img_width + || mLastHeight != img_height) + { + mAssetStatus = PREVIEW_ASSET_LOADED; + // Asset has been fully loaded, adjust aspect ratio + adjustAspectRatio(); + } + + + // Update the width/height display every time + getChild<LLUICtrl>("dimensions")->setTextArg("[WIDTH]", llformat("%d", img_width)); + getChild<LLUICtrl>("dimensions")->setTextArg("[HEIGHT]", llformat("%d", img_height)); + + mLastHeight = img_height; + mLastWidth = img_width; + + // Reshape the floater only when required + if (mUpdateDimensions) + { + mUpdateDimensions = FALSE; + + //reshape floater + reshape(getRect().getWidth(), getRect().getHeight()); + + gFloaterView->adjustToFitScreen(this, FALSE); + + LLRect dim_rect(getChildView("dimensions")->getRect()); + LLRect aspect_label_rect(getChildView("aspect_ratio")->getRect()); + getChildView("aspect_ratio")->setVisible( dim_rect.mRight < aspect_label_rect.mLeft); + } } // Return true if everything went fine, false if we somewhat modified the ratio as we bumped on border values bool LLPreviewTexture::setAspectRatio(const F32 width, const F32 height) { - mUpdateDimensions = TRUE; - - // We don't allow negative width or height. Also, if height is positive but too small, we reset to default - // A default 0.f value for mAspectRatio means "unconstrained" in the rest of the code - if ((width <= 0.f) || (height <= F_APPROXIMATELY_ZERO)) - { - mAspectRatio = 0.f; - return false; - } - - // Compute and store the ratio - F32 ratio = width / height; - mAspectRatio = llclamp(ratio, PREVIEW_TEXTURE_MIN_ASPECT, PREVIEW_TEXTURE_MAX_ASPECT); - - // Return false if we clamped the value, true otherwise - return (ratio == mAspectRatio); + mUpdateDimensions = TRUE; + + // We don't allow negative width or height. Also, if height is positive but too small, we reset to default + // A default 0.f value for mAspectRatio means "unconstrained" in the rest of the code + if ((width <= 0.f) || (height <= F_APPROXIMATELY_ZERO)) + { + mAspectRatio = 0.f; + return false; + } + + // Compute and store the ratio + F32 ratio = width / height; + mAspectRatio = llclamp(ratio, PREVIEW_TEXTURE_MIN_ASPECT, PREVIEW_TEXTURE_MAX_ASPECT); + + // Return false if we clamped the value, true otherwise + return (ratio == mAspectRatio); } void LLPreviewTexture::onAspectRatioCommit(LLUICtrl* ctrl, void* userdata) -{ - LLPreviewTexture* self = (LLPreviewTexture*) userdata; - - std::string ratio(ctrl->getValue().asString()); - std::string::size_type separator(ratio.find_first_of(":/\\")); - - if (std::string::npos == separator) { - // If there's no separator assume we want an unconstrained ratio - self->setAspectRatio( 0.f, 0.f ); - return; - } - - F32 width, height; - std::istringstream numerator(ratio.substr(0, separator)); - std::istringstream denominator(ratio.substr(separator + 1)); - numerator >> width; - denominator >> height; - - self->setAspectRatio( width, height ); +{ + LLPreviewTexture* self = (LLPreviewTexture*) userdata; + + std::string ratio(ctrl->getValue().asString()); + std::string::size_type separator(ratio.find_first_of(":/\\")); + + if (std::string::npos == separator) { + // If there's no separator assume we want an unconstrained ratio + self->setAspectRatio( 0.f, 0.f ); + return; + } + + F32 width, height; + std::istringstream numerator(ratio.substr(0, separator)); + std::istringstream denominator(ratio.substr(separator + 1)); + numerator >> width; + denominator >> height; + + self->setAspectRatio( width, height ); } void LLPreviewTexture::loadAsset() { - mImage = LLViewerTextureManager::getFetchedTexture(mImageID, FTT_DEFAULT, MIPMAP_TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); - mImageOldBoostLevel = mImage->getBoostLevel(); - mImage->setBoostLevel(LLGLTexture::BOOST_PREVIEW); - mImage->forceToSaveRawImage(0) ; - mAssetStatus = PREVIEW_ASSET_LOADING; - mUpdateDimensions = TRUE; - updateDimensions(); - getChildView("save_tex_btn")->setEnabled(canSaveAs()); - if (mObjectUUID.notNull()) - { - // check that we can copy inworld items into inventory - getChildView("Keep")->setEnabled(mIsCopyable); - } - else - { - // check that we can remove item - BOOL source_library = gInventory.isObjectDescendentOf(mItemUUID, gInventory.getLibraryRootFolderID()); - if (source_library) - { - getChildView("Discard")->setEnabled(false); - } - } + mImage = LLViewerTextureManager::getFetchedTexture(mImageID, FTT_DEFAULT, MIPMAP_TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); + mImageOldBoostLevel = mImage->getBoostLevel(); + mImage->setBoostLevel(LLGLTexture::BOOST_PREVIEW); + mImage->forceToSaveRawImage(0) ; + mAssetStatus = PREVIEW_ASSET_LOADING; + mUpdateDimensions = TRUE; + updateDimensions(); + getChildView("save_tex_btn")->setEnabled(canSaveAs()); + if (mObjectUUID.notNull()) + { + // check that we can copy inworld items into inventory + getChildView("Keep")->setEnabled(mIsCopyable); + } + else + { + // check that we can remove item + BOOL source_library = gInventory.isObjectDescendentOf(mItemUUID, gInventory.getLibraryRootFolderID()); + if (source_library) + { + getChildView("Discard")->setEnabled(false); + } + } } LLPreview::EAssetStatus LLPreviewTexture::getAssetStatus() { - if (mImage.notNull() && (mImage->getFullWidth() * mImage->getFullHeight() > 0)) - { - mAssetStatus = PREVIEW_ASSET_LOADED; - } - return mAssetStatus; + if (mImage.notNull() && (mImage->getFullWidth() * mImage->getFullHeight() > 0)) + { + mAssetStatus = PREVIEW_ASSET_LOADED; + } + return mAssetStatus; } void LLPreviewTexture::adjustAspectRatio() { - S32 w = mImage->getFullWidth(); + S32 w = mImage->getFullWidth(); S32 h = mImage->getFullHeight(); - // Determine aspect ratio of the image - S32 tmp; + // Determine aspect ratio of the image + S32 tmp; while (h != 0) { tmp = w % h; w = h; h = tmp; } - S32 divisor = w; - S32 num = mImage->getFullWidth() / divisor; - S32 denom = mImage->getFullHeight() / divisor; - - if (setAspectRatio(num, denom)) - { - // Select corresponding ratio entry in the combo list - LLComboBox* combo = getChild<LLComboBox>("combo_aspect_ratio"); - if (combo) - { - std::ostringstream ratio; - ratio << num << ":" << denom; - std::vector<std::string>::const_iterator found = std::find(mRatiosList.begin(), mRatiosList.end(), ratio.str()); - if (found == mRatiosList.end()) - { - // No existing ratio found, create an element that will show image at original ratio - populateRatioList(); // makes sure previous custom ratio is cleared - std::string ratio = std::to_string(num)+":" + std::to_string(denom); - mRatiosList.push_back(ratio); - combo->add(ratio); - combo->setCurrentByIndex(mRatiosList.size()- 1); - } - else - { - combo->setCurrentByIndex(found - mRatiosList.begin()); - } - } - } - else - { - // Aspect ratio was set to unconstrained or was clamped - LLComboBox* combo = getChild<LLComboBox>("combo_aspect_ratio"); - if (combo) - { - combo->setCurrentByIndex(0); //unconstrained - } - } - - mUpdateDimensions = TRUE; + S32 divisor = w; + S32 num = mImage->getFullWidth() / divisor; + S32 denom = mImage->getFullHeight() / divisor; + + if (setAspectRatio(num, denom)) + { + // Select corresponding ratio entry in the combo list + LLComboBox* combo = getChild<LLComboBox>("combo_aspect_ratio"); + if (combo) + { + std::ostringstream ratio; + ratio << num << ":" << denom; + std::vector<std::string>::const_iterator found = std::find(mRatiosList.begin(), mRatiosList.end(), ratio.str()); + if (found == mRatiosList.end()) + { + // No existing ratio found, create an element that will show image at original ratio + populateRatioList(); // makes sure previous custom ratio is cleared + std::string ratio = std::to_string(num)+":" + std::to_string(denom); + mRatiosList.push_back(ratio); + combo->add(ratio); + combo->setCurrentByIndex(mRatiosList.size()- 1); + } + else + { + combo->setCurrentByIndex(found - mRatiosList.begin()); + } + } + } + else + { + // Aspect ratio was set to unconstrained or was clamped + LLComboBox* combo = getChild<LLComboBox>("combo_aspect_ratio"); + if (combo) + { + combo->setCurrentByIndex(0); //unconstrained + } + } + + mUpdateDimensions = TRUE; } void LLPreviewTexture::updateImageID() { - const LLViewerInventoryItem *item = static_cast<const LLViewerInventoryItem*>(getItem()); - if(item) - { - mImageID = item->getAssetUUID(); - - // here's the old logic... - //mShowKeepDiscard = item->getPermissions().getCreator() != gAgent.getID(); - // here's the new logic... 'cos we hate disappearing buttons. - mShowKeepDiscard = TRUE; - - mCopyToInv = FALSE; - LLPermissions perm(item->getPermissions()); - mIsCopyable = perm.allowCopyBy(gAgent.getID(), gAgent.getGroupID()) && perm.allowTransferTo(gAgent.getID()); - mIsFullPerm = item->checkPermissionsSet(PERM_ITEM_UNRESTRICTED); - } - else // not an item, assume it's an asset id - { - mImageID = mItemUUID; - mShowKeepDiscard = FALSE; - mCopyToInv = TRUE; - mIsCopyable = TRUE; - mIsFullPerm = TRUE; - } + const LLViewerInventoryItem *item = static_cast<const LLViewerInventoryItem*>(getItem()); + if(item) + { + mImageID = item->getAssetUUID(); + + // here's the old logic... + //mShowKeepDiscard = item->getPermissions().getCreator() != gAgent.getID(); + // here's the new logic... 'cos we hate disappearing buttons. + mShowKeepDiscard = TRUE; + + mCopyToInv = FALSE; + LLPermissions perm(item->getPermissions()); + mIsCopyable = perm.allowCopyBy(gAgent.getID(), gAgent.getGroupID()) && perm.allowTransferTo(gAgent.getID()); + mIsFullPerm = item->checkPermissionsSet(PERM_ITEM_UNRESTRICTED); + } + else // not an item, assume it's an asset id + { + mImageID = mItemUUID; + mShowKeepDiscard = FALSE; + mCopyToInv = TRUE; + mIsCopyable = TRUE; + mIsFullPerm = TRUE; + } } /* virtual */ void LLPreviewTexture::setObjectID(const LLUUID& object_id) { - mObjectUUID = object_id; + mObjectUUID = object_id; - const LLUUID old_image_id = mImageID; + const LLUUID old_image_id = mImageID; - // Update what image we're pointing to, such as if we just specified the mObjectID - // that this mItemID is part of. - updateImageID(); + // Update what image we're pointing to, such as if we just specified the mObjectID + // that this mItemID is part of. + updateImageID(); - // If the imageID has changed, start over and reload the new image. - if (mImageID != old_image_id) - { - mAssetStatus = PREVIEW_ASSET_UNLOADED; - loadAsset(); - } - refreshFromItem(); + // If the imageID has changed, start over and reload the new image. + if (mImageID != old_image_id) + { + mAssetStatus = PREVIEW_ASSET_UNLOADED; + loadAsset(); + } + refreshFromItem(); } |