SL-19928 Make thumbnail selection failures more user friendly

master
Andrey Kleshchev 2023-06-29 02:33:58 +03:00
parent 8eade6f074
commit 7c100d54dd
5 changed files with 114 additions and 34 deletions

View File

@ -710,7 +710,9 @@ void LLFloaterChangeItemThumbnail::showTexturePicker(const LLUUID &thumbnail_id)
texture_floaterp->setLocalTextureEnabled(FALSE);
texture_floaterp->setBakeTextureEnabled(FALSE);
texture_floaterp->setCanApplyImmediately(false);
texture_floaterp->setCanApply(false, true);
texture_floaterp->setCanApply(false, true, false /*Hide 'preview disabled'*/);
texture_floaterp->setDimentionsLimits(LLFloaterSimpleSnapshot::THUMBNAIL_SNAPSHOT_DIM_MAX,
LLFloaterSimpleSnapshot::THUMBNAIL_SNAPSHOT_DIM_MIN);
addDependentFloater(texture_floaterp);
}

View File

@ -1923,7 +1923,7 @@ void LLPanelProfileSecondLife::onShowTexturePicker()
});
texture_floaterp->setLocalTextureEnabled(FALSE);
texture_floaterp->setBakeTextureEnabled(FALSE);
texture_floaterp->setCanApply(false, true);
texture_floaterp->setCanApply(false, true, false);
parent_floater->addDependentFloater(mFloaterTexturePickerHandle);
@ -2263,7 +2263,7 @@ void LLPanelProfileFirstLife::onChangePhoto()
}
});
texture_floaterp->setLocalTextureEnabled(FALSE);
texture_floaterp->setCanApply(false, true);
texture_floaterp->setCanApply(false, true, false);
parent_floater->addDependentFloater(mFloaterTexturePickerHandle);

View File

@ -176,6 +176,8 @@ LLFloaterTexturePicker::LLFloaterTexturePicker(
mSelectedItemPinned( FALSE ),
mCanApply(true),
mCanPreview(true),
mMaxDim(S32_MAX),
mMinDim(0),
mPreviewSettingChanged(false),
mOnFloaterCommitCallback(NULL),
mOnFloaterCloseCallback(NULL),
@ -270,19 +272,36 @@ void LLFloaterTexturePicker::stopUsingPipette()
}
}
void LLFloaterTexturePicker::updateImageStats()
bool LLFloaterTexturePicker::updateImageStats()
{
bool result = true;
if (mTexturep.notNull())
{
//RN: have we received header data for this image?
if (mTexturep->getFullWidth() > 0 && mTexturep->getFullHeight() > 0)
S32 width = mTexturep->getFullWidth();
S32 height = mTexturep->getFullHeight();
if (width > 0 && height > 0)
{
std::string formatted_dims = llformat("%d x %d", mTexturep->getFullWidth(),mTexturep->getFullHeight());
mResolutionLabel->setTextArg("[DIMENSIONS]", formatted_dims);
if (mOnUpdateImageStatsCallback)
{
mOnUpdateImageStatsCallback(mTexturep);
}
if (width < mMinDim
|| width > mMaxDim
|| height < mMinDim
|| height > mMaxDim
)
{
std::string formatted_dims = llformat("%d x %d", width, height);
mResolutionWarning->setTextArg("[TEXDIM]", formatted_dims);
result = false;
}
else
{
std::string formatted_dims = llformat("%d x %d", width, height);
mResolutionLabel->setTextArg("[DIMENSIONS]", formatted_dims);
}
if (mOnUpdateImageStatsCallback)
{
mOnUpdateImageStatsCallback(mTexturep);
}
}
else
{
@ -293,6 +312,21 @@ void LLFloaterTexturePicker::updateImageStats()
{
mResolutionLabel->setTextArg("[DIMENSIONS]", std::string(""));
}
mResolutionLabel->setVisible(result);
mResolutionWarning->setVisible(!result);
// Hide buttons and pipete to make space for mResolutionWarning
// Hiding buttons is suboptimal, but at the moment limited to inventory thumbnails
// may be this should be an info/warning icon with a tooltip?
S32 index = mModeSelector->getValue().asInteger();
if (index == 0)
{
mDefaultBtn->setVisible(result);
mNoneBtn->setVisible(result);
mBlankBtn->setVisible(result);
mPipetteBtn->setVisible(result);
}
return result;
}
// virtual
@ -410,11 +444,22 @@ BOOL LLFloaterTexturePicker::postBuild()
mTentativeLabel = getChild<LLTextBox>("Multiple");
mResolutionLabel = getChild<LLTextBox>("size_lbl");
mResolutionWarning = getChild<LLTextBox>("over_limit_lbl");
childSetAction("Default",LLFloaterTexturePicker::onBtnSetToDefault,this);
childSetAction("None", LLFloaterTexturePicker::onBtnNone,this);
childSetAction("Blank", LLFloaterTexturePicker::onBtnBlank,this);
mDefaultBtn = getChild<LLButton>("Default");
mNoneBtn = getChild<LLButton>("None");
mBlankBtn = getChild<LLButton>("Blank");
mPipetteBtn = getChild<LLButton>("Pipette");
mSelectBtn = getChild<LLButton>("Select");
mCancelBtn = getChild<LLButton>("Cancel");
mDefaultBtn->setClickedCallback(boost::bind(LLFloaterTexturePicker::onBtnSetToDefault,this));
mNoneBtn->setClickedCallback(boost::bind(LLFloaterTexturePicker::onBtnNone, this));
mBlankBtn->setClickedCallback(boost::bind(LLFloaterTexturePicker::onBtnBlank, this));
mPipetteBtn->setCommitCallback(boost::bind(&LLFloaterTexturePicker::onBtnPipette, this));
mSelectBtn->setClickedCallback(boost::bind(LLFloaterTexturePicker::onBtnSelect, this));
mCancelBtn->setClickedCallback(boost::bind(LLFloaterTexturePicker::onBtnCancel, this));
childSetCommitCallback("show_folders_check", onShowFolders, this);
@ -481,10 +526,6 @@ BOOL LLFloaterTexturePicker::postBuild()
getChildView("show_folders_check")->setEnabled(FALSE);
}
getChild<LLUICtrl>("Pipette")->setCommitCallback( boost::bind(&LLFloaterTexturePicker::onBtnPipette, this));
childSetAction("Cancel", LLFloaterTexturePicker::onBtnCancel,this);
childSetAction("Select", LLFloaterTexturePicker::onBtnSelect,this);
// update permission filter once UI is fully initialized
updateFilterPermMask();
mSavedFolderState.setApply(FALSE);
@ -504,13 +545,13 @@ void LLFloaterTexturePicker::draw()
static LLCachedControl<F32> max_opacity(gSavedSettings, "PickerContextOpacity", 0.4f);
drawConeToOwner(mContextConeOpacity, max_opacity, mOwner);
updateImageStats();
bool valid_dims = updateImageStats();
// if we're inactive, gray out "apply immediate" checkbox
getChildView("show_folders_check")->setEnabled(mActive && mCanApplyImmediately && !mNoCopyTextureSelected);
getChildView("Select")->setEnabled(mActive && mCanApply);
getChildView("Pipette")->setEnabled(mActive);
getChild<LLUICtrl>("Pipette")->setValue(LLToolMgr::getInstance()->getCurrentTool() == LLToolPipette::getInstance());
mSelectBtn->setEnabled(mActive && mCanApply && valid_dims);
mPipetteBtn->setEnabled(mActive);
mPipetteBtn->setValue(LLToolMgr::getInstance()->getCurrentTool() == LLToolPipette::getInstance());
//BOOL allow_copy = FALSE;
if( mOwner )
@ -544,9 +585,9 @@ void LLFloaterTexturePicker::draw()
mTentativeLabel->setVisible( FALSE );
}
getChildView("Default")->setEnabled(mImageAssetID != mDefaultImageAssetID || mTentative);
getChildView("Blank")->setEnabled(mImageAssetID != mBlankImageAssetID || mTentative);
getChildView("None")->setEnabled(mAllowNoTexture && (!mImageAssetID.isNull() || mTentative));
mDefaultBtn->setEnabled(mImageAssetID != mDefaultImageAssetID || mTentative);
mBlankBtn->setEnabled(mImageAssetID != mBlankImageAssetID || mTentative);
mNoneBtn->setEnabled(mAllowNoTexture && (!mImageAssetID.isNull() || mTentative));
LLFloater::draw();
@ -820,10 +861,10 @@ void LLFloaterTexturePicker::onModeSelect(LLUICtrl* ctrl, void *userdata)
LLFloaterTexturePicker* self = (LLFloaterTexturePicker*) userdata;
int index = self->mModeSelector->getValue().asInteger();
self->getChild<LLButton>("Default")->setVisible(index == 0 ? TRUE : FALSE);
self->getChild<LLButton>("Blank")->setVisible(index == 0 ? TRUE : FALSE);
self->getChild<LLButton>("None")->setVisible(index == 0 ? TRUE : FALSE);
self->getChild<LLButton>("Pipette")->setVisible(index == 0 ? TRUE : FALSE);
self->mDefaultBtn->setVisible(index == 0 ? TRUE : FALSE);
self->mBlankBtn->setVisible(index == 0 ? TRUE : FALSE);
self->mNoneBtn->setVisible(index == 0 ? TRUE : FALSE);
self->mPipetteBtn->setVisible(index == 0 ? TRUE : FALSE);
self->getChild<LLFilterEditor>("inventory search editor")->setVisible(index == 0 ? TRUE : FALSE);
self->getChild<LLInventoryPanel>("inventory panel")->setVisible(index == 0 ? TRUE : FALSE);
@ -1098,10 +1139,10 @@ void LLFloaterTexturePicker::updateFilterPermMask()
//mInventoryPanel->setFilterPermMask( getFilterPermMask() ); Commented out due to no-copy texture loss.
}
void LLFloaterTexturePicker::setCanApply(bool can_preview, bool can_apply)
void LLFloaterTexturePicker::setCanApply(bool can_preview, bool can_apply, bool inworld_image)
{
getChildRef<LLUICtrl>("Select").setEnabled(can_apply);
getChildRef<LLUICtrl>("preview_disabled").setVisible(!can_preview);
mSelectBtn->setEnabled(can_apply);
getChildRef<LLUICtrl>("preview_disabled").setVisible(!can_preview && inworld_image);
getChildRef<LLUICtrl>("apply_immediate_check").setVisible(can_preview);
mCanApply = can_apply;
@ -1109,6 +1150,17 @@ void LLFloaterTexturePicker::setCanApply(bool can_preview, bool can_apply)
mPreviewSettingChanged = true;
}
void LLFloaterTexturePicker::setDimentionsLimits(S32 max_dim, S32 min_dim)
{
mMaxDim = max_dim;
mMinDim = min_dim;
std::string formatted_dims = llformat("%d x %d", mMinDim, mMinDim);
mResolutionWarning->setTextArg("[MINTEXDIM]", formatted_dims);
formatted_dims = llformat("%d x %d", mMaxDim, mMaxDim);
mResolutionWarning->setTextArg("[MAXTEXDIM]", formatted_dims);
}
void LLFloaterTexturePicker::onFilterEdit(const std::string& search_string )
{
std::string upper_case_search_string = search_string;

View File

@ -295,7 +295,7 @@ public:
// New functions
void setImageID(const LLUUID& image_asset_id, bool set_selection = true);
void updateImageStats();
bool updateImageStats(); // true if within limits
const LLUUID& getAssetID() { return mImageAssetID; }
const LLUUID& findItemID(const LLUUID& asset_id, BOOL copyable_only, BOOL ignore_library = FALSE);
void setCanApplyImmediately(BOOL b);
@ -313,7 +313,8 @@ public:
void onFilterEdit(const std::string& search_string);
void setCanApply(bool can_preview, bool can_apply);
void setCanApply(bool can_preview, bool can_apply, bool inworld_image = true);
void setDimentionsLimits(S32 max_dim, S32 min_dim);
void setTextureSelectedCallback(const texture_selected_callback& cb) { mTextureSelectedCallback = cb; }
void setOnFloaterCloseCallback(const floater_close_callback& cb) { mOnFloaterCloseCallback = cb; }
void setOnFloaterCommitCallback(const floater_commit_callback& cb) { mOnFloaterCommitCallback = cb; }
@ -364,6 +365,7 @@ protected:
LLTextBox* mTentativeLabel;
LLTextBox* mResolutionLabel;
LLTextBox* mResolutionWarning;
std::string mPendingName;
BOOL mActive;
@ -381,11 +383,19 @@ protected:
LLComboBox* mModeSelector;
LLScrollListCtrl* mLocalScrollCtrl;
LLButton* mDefaultBtn;
LLButton* mNoneBtn;
LLButton* mBlankBtn;
LLButton* mPipetteBtn;
LLButton* mSelectBtn;
LLButton* mCancelBtn;
private:
bool mCanApply;
bool mCanPreview;
bool mPreviewSettingChanged;
S32 mMaxDim;
S32 mMinDim;
texture_selected_callback mTextureSelectedCallback;

View File

@ -83,6 +83,22 @@
top_pad="4">
[DIMENSIONS]
</text>
<text
type="string"
text_color="Yellow"
length="1"
word_wrap="true"
follows="left|top"
height="56"
width="164"
layout="topleft"
left="8"
name="over_limit_lbl"
visible="false"
top_delta="0">
Selected texture is [TEXDIM], inventory image must be square, between [MINTEXDIM] and [MAXTEXDIM].
</text>
<!-- middle: inventory mode -->
<button