QAR-565 search-milestone2-merge (more web tabs in search)

dataserver-is-deprecated
master
Steven Bennetts 2008-05-09 04:39:03 +00:00
parent 1bad68eb4b
commit dbe0176552
13 changed files with 187 additions and 105 deletions

View File

@ -4149,17 +4149,6 @@
<key>Value</key>
<integer>1</integer>
</map>
<key>MapShowPopular</key>
<map>
<key>Comment</key>
<string>Show popular places on world map</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
<key>MapShowTelehubs</key>
<map>
<key>Comment</key>

View File

@ -71,6 +71,9 @@
#include "llappviewer.h" // abortQuit()
const S32 MINIMUM_PRICE_FOR_LISTING = 50; // L$
const S32 MATURE_CONTENT = 1;
const S32 NON_MATURE_CONTENT = 2;
const S32 DECLINE_TO_STATE = 0;
//static
std::list<LLPanelClassified*> LLPanelClassified::sAllPanels;
@ -162,7 +165,7 @@ LLPanelClassified::LLPanelClassified(bool in_finder, bool from_search)
mDescEditor(NULL),
mLocationEditor(NULL),
mCategoryCombo(NULL),
mMatureCheck(NULL),
mMatureCombo(NULL),
mAutoRenewCheck(NULL),
mUpdateBtn(NULL),
mTeleportBtn(NULL),
@ -276,13 +279,15 @@ BOOL LLPanelClassified::postBuild()
mCategoryCombo->setCommitCallback(onCommitAny);
mCategoryCombo->setCallbackUserData(this);
mMatureCheck = getChild<LLCheckBoxCtrl>( "classified_mature_check");
mMatureCheck->setCommitCallback(onCommitAny);
mMatureCheck->setCallbackUserData(this);
mMatureCombo = getChild<LLComboBox>( "classified_mature_check");
mMatureCombo->setCurrentByIndex(0);
mMatureCombo->setCommitCallback(onCommitAny);
mMatureCombo->setCallbackUserData(this);
if (gAgent.isTeen())
{
// Teens don't get to set mature flag. JC
mMatureCheck->setVisible(FALSE);
mMatureCombo->setVisible(FALSE);
mMatureCombo->setCurrentByIndex(NON_MATURE_CONTENT);
}
if (!mInFinder)
@ -532,7 +537,7 @@ void LLPanelClassified::sendClassifiedInfoUpdate()
msg->addU32Fast(_PREHASH_ParentEstate, 0);
msg->addUUIDFast(_PREHASH_SnapshotID, mSnapshotCtrl->getImageAssetID());
msg->addVector3dFast(_PREHASH_PosGlobal, mPosGlobal);
BOOL mature = mMatureCheck->get();
BOOL mature = mMatureCombo->getCurrentIndex() == MATURE_CONTENT;
BOOL auto_renew = FALSE;
if (mAutoRenewCheck)
{
@ -656,7 +661,14 @@ void LLPanelClassified::processClassifiedInfoReply(LLMessageSystem *msg, void **
self->mLocationChanged = false;
self->mCategoryCombo->setCurrentByIndex(category - 1);
self->mMatureCheck->set(mature);
if(mature)
{
self->mMatureCombo->setCurrentByIndex(MATURE_CONTENT);
}
else
{
self->mMatureCombo->setCurrentByIndex(NON_MATURE_CONTENT);
}
if (self->mAutoRenewCheck)
{
self->mAutoRenewCheck->set(auto_renew);
@ -722,8 +734,8 @@ void LLPanelClassified::refresh()
mCategoryCombo->setEnabled(godlike);
mCategoryCombo->setVisible(godlike);
mMatureCheck->setEnabled(godlike);
mMatureCheck->setVisible(godlike);
mMatureCombo->setEnabled(godlike);
mMatureCombo->setVisible(godlike);
// Jesse (who is the only one who uses this, as far as we can tell
// Says that he does not want a set location button - he has used it
@ -742,7 +754,7 @@ void LLPanelClassified::refresh()
//mPriceEditor->setEnabled(is_self);
mCategoryCombo->setEnabled(is_self);
mMatureCheck->setEnabled(is_self);
mMatureCombo->setEnabled(is_self);
if (mAutoRenewCheck)
{
@ -775,15 +787,60 @@ void LLPanelClassified::onClickUpdate(void* data)
return;
};
// if already paid for, just do the update
if (self->mPaidFor)
// If user has not set mature, do not allow publish
if(self->mMatureCombo->getCurrentIndex() == DECLINE_TO_STATE)
{
callbackConfirmPublish(0, self);
LLString::format_map_t args;
gViewerWindow->alertXml("SetClassifiedMature", &callbackConfirmMature, self);
return;
}
// Mature content flag is set, proceed
self->gotMature();
}
// static
void LLPanelClassified::callbackConfirmMature(S32 option, void* data)
{
LLPanelClassified* self = (LLPanelClassified*)data;
self->confirmMature(option);
}
// invoked from callbackConfirmMature
void LLPanelClassified::confirmMature(S32 option)
{
// 0 == Yes
// 1 == No
// 2 == Cancel
switch(option)
{
case 0:
mMatureCombo->setCurrentByIndex(MATURE_CONTENT);
break;
case 1:
mMatureCombo->setCurrentByIndex(NON_MATURE_CONTENT);
break;
default:
return;
}
// If we got here it means they set a valid value
gotMature();
}
// Called after we have determined whether this classified has
// mature content or not.
void LLPanelClassified::gotMature()
{
// if already paid for, just do the update
if (mPaidFor)
{
callbackConfirmPublish(0, this);
}
else
{
// Ask the user how much they want to pay
LLFloaterPriceForListing::show( callbackGotPriceForListing, self );
LLFloaterPriceForListing::show( callbackGotPriceForListing, this );
}
}
@ -830,8 +887,8 @@ void LLPanelClassified::resetDirty()
mLocationChanged = false;
if (mCategoryCombo)
mCategoryCombo->resetDirty();
if (mMatureCheck)
mMatureCheck->resetDirty();
if (mMatureCombo)
mMatureCombo->resetDirty();
if (mAutoRenewCheck)
mAutoRenewCheck->resetDirty();
}
@ -948,7 +1005,7 @@ BOOL LLPanelClassified::checkDirty()
if ( mLocationEditor ) mDirty |= mLocationEditor->isDirty();
if ( mLocationChanged ) mDirty |= TRUE;
if ( mCategoryCombo ) mDirty |= mCategoryCombo->isDirty();
if ( mMatureCheck ) mDirty |= mMatureCheck->isDirty();
if ( mMatureCombo ) mDirty |= mMatureCombo->isDirty();
if ( mAutoRenewCheck ) mDirty |= mAutoRenewCheck->isDirty();
return mDirty;

View File

@ -96,12 +96,17 @@ public:
void sendClassifiedInfoRequest();
void sendClassifiedInfoUpdate();
void resetDirty();
void confirmPublish(S32 option);
static void processClassifiedInfoReply(LLMessageSystem* msg, void**);
// Confirmation dialogs flow in this order
static void callbackConfirmMature(S32 option, void* data);
void confirmMature(S32 option);
void gotMature();
static void callbackGotPriceForListing(S32 option, LLString text, void* data);
static void callbackConfirmPublish(S32 option, void* data);
void confirmPublish(S32 option);
void sendClassifiedClickMessage(const char* type);
protected:
@ -154,7 +159,7 @@ protected:
LLTextEditor* mDescEditor;
LLLineEditor* mLocationEditor;
LLComboBox* mCategoryCombo;
LLCheckBoxCtrl* mMatureCheck;
LLComboBox* mMatureCombo;
LLCheckBoxCtrl* mAutoRenewCheck;
LLButton* mUpdateBtn;

View File

@ -54,6 +54,11 @@
#include "lltexturectrl.h"
#include "llviewerwindow.h"
// consts
const S32 MATURE_CONTENT = 1;
const S32 NON_MATURE_CONTENT = 2;
const S32 DECLINE_TO_STATE = 0;
// static
void* LLPanelGroupGeneral::createTab(void* data)
{
@ -76,7 +81,7 @@ LLPanelGroupGeneral::LLPanelGroupGeneral(const std::string& name,
mBtnJoinGroup(NULL),
mListVisibleMembers(NULL),
mCtrlShowInGroupList(NULL),
mCtrlMature(NULL),
mComboMature(NULL),
mCtrlOpenEnrollment(NULL),
mCtrlEnrollmentFee(NULL),
mSpinEnrollmentFee(NULL),
@ -156,14 +161,19 @@ BOOL LLPanelGroupGeneral::postBuild()
mCtrlShowInGroupList->setCallbackUserData(this);
}
mCtrlMature = getChild<LLCheckBoxCtrl>("mature", recurse);
if (mCtrlMature)
mComboMature = getChild<LLComboBox>("group_mature_check", recurse);
if(mComboMature)
{
mCtrlMature->setCommitCallback(onCommitAny);
mCtrlMature->setCallbackUserData(this);
mCtrlMature->setVisible( !gAgent.isTeen() );
mComboMature->setCurrentByIndex(0);
mComboMature->setCommitCallback(onCommitAny);
mComboMature->setCallbackUserData(this);
if (gAgent.isTeen())
{
// Teens don't get to set mature flag. JC
mComboMature->setVisible(FALSE);
mComboMature->setCurrentByIndex(NON_MATURE_CONTENT);
}
}
mCtrlOpenEnrollment = getChild<LLCheckBoxCtrl>("open_enrollement", recurse);
if (mCtrlOpenEnrollment)
{
@ -231,7 +241,7 @@ BOOL LLPanelGroupGeneral::postBuild()
mEditCharter->setEnabled(TRUE);
mCtrlShowInGroupList->setEnabled(TRUE);
mCtrlMature->setEnabled(TRUE);
mComboMature->setEnabled(TRUE);
mCtrlOpenEnrollment->setEnabled(TRUE);
mCtrlEnrollmentFee->setEnabled(TRUE);
mSpinEnrollmentFee->setEnabled(TRUE);
@ -429,6 +439,16 @@ bool LLPanelGroupGeneral::apply(LLString& mesg)
if (has_power_in_group || mGroupID.isNull())
{
llinfos << "LLPanelGroupGeneral::apply" << llendl;
// Check to make sure mature has been set
if(mComboMature->getCurrentIndex() == DECLINE_TO_STATE)
{
LLString::format_map_t args;
gViewerWindow->alertXml("SetGroupMature", &callbackConfirmMatureApply,
new LLHandle<LLPanel>(getHandle()));
return false;
}
if (mGroupID.isNull())
{
// Validate the group name length.
@ -446,13 +466,12 @@ bool LLPanelGroupGeneral::apply(LLString& mesg)
LLString::format_map_t args;
args["[MESSAGE]"] = mConfirmGroupCreateStr;
gViewerWindow->alertXml("GenericAlertYesCancel", args,
createGroupCallback,new LLHandle<LLPanel>(getHandle()));
createGroupCallback, new LLHandle<LLPanel>(getHandle()) );
return false;
}
LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupID);
if (!gdatap)
{
mesg = "No group data found for group ";
@ -468,11 +487,12 @@ bool LLPanelGroupGeneral::apply(LLString& mesg)
{
if (mEditCharter) gdatap->mCharter = mEditCharter->getText();
if (mInsignia) gdatap->mInsigniaID = mInsignia->getImageAssetID();
if (mCtrlMature)
if (mComboMature)
{
if (!gAgent.isTeen())
{
gdatap->mMaturePublish = mCtrlMature->get();
gdatap->mMaturePublish =
mComboMature->getCurrentIndex() == MATURE_CONTENT;
}
else
{
@ -523,6 +543,42 @@ void LLPanelGroupGeneral::cancel()
notifyObservers();
}
// static
void LLPanelGroupGeneral::callbackConfirmMatureApply(S32 option, void* data)
{
LLHandle<LLPanel>* handlep = (LLHandle<LLPanel>*)data;
LLPanelGroupGeneral* self = dynamic_cast<LLPanelGroupGeneral*>(handlep->get());
delete handlep;
if (self)
{
self->confirmMatureApply(option);
}
}
// invoked from callbackConfirmMature
void LLPanelGroupGeneral::confirmMatureApply(S32 option)
{
// 0 == Yes
// 1 == No
// 2 == Cancel
switch(option)
{
case 0:
mComboMature->setCurrentByIndex(MATURE_CONTENT);
break;
case 1:
mComboMature->setCurrentByIndex(NON_MATURE_CONTENT);
break;
default:
return;
}
// If we got here it means they set a valid value
LLString mesg = "";
apply(mesg);
}
// static
void LLPanelGroupGeneral::createGroupCallback(S32 option, void* userdata)
{
@ -547,7 +603,7 @@ void LLPanelGroupGeneral::createGroupCallback(S32 option, void* userdata)
enrollment_fee,
self->mCtrlOpenEnrollment->get(),
false,
self->mCtrlMature->get());
self->mComboMature->getCurrentIndex() == MATURE_CONTENT);
}
break;
@ -632,11 +688,18 @@ void LLPanelGroupGeneral::update(LLGroupChange gc)
mCtrlShowInGroupList->set(gdatap->mShowInList);
mCtrlShowInGroupList->setEnabled(mAllowEdit && can_change_ident);
}
if (mCtrlMature)
if (mComboMature)
{
mCtrlMature->set(gdatap->mMaturePublish);
mCtrlMature->setEnabled(mAllowEdit && can_change_ident);
mCtrlMature->setVisible( !gAgent.isTeen() );
if(gdatap->mMaturePublish)
{
mComboMature->setCurrentByIndex(MATURE_CONTENT);
}
else
{
mComboMature->setCurrentByIndex(NON_MATURE_CONTENT);
}
mComboMature->setEnabled(mAllowEdit && can_change_ident);
mComboMature->setVisible( !gAgent.isTeen() );
}
if (mCtrlOpenEnrollment)
{
@ -820,7 +883,7 @@ void LLPanelGroupGeneral::updateChanged()
mInsignia,
mEditCharter,
mCtrlShowInGroupList,
mCtrlMature,
mComboMature,
mCtrlOpenEnrollment,
mCtrlEnrollmentFee,
mSpinEnrollmentFee,

View File

@ -58,6 +58,7 @@ public:
virtual bool apply(LLString& mesg);
virtual void cancel();
static void createGroupCallback(S32 option, void* user_data);
static void callbackConfirmMatureApply(S32 option, void* data);
virtual void update(LLGroupChange gc);
@ -80,6 +81,7 @@ private:
void updateMembers();
void updateChanged();
void confirmMatureApply(S32 option);
BOOL mPendingMemberUpdate;
BOOL mChanged;
@ -101,7 +103,6 @@ private:
// Options (include any updates in updateChanged)
LLCheckBoxCtrl *mCtrlShowInGroupList;
LLCheckBoxCtrl *mCtrlMature;
LLCheckBoxCtrl *mCtrlOpenEnrollment;
LLCheckBoxCtrl *mCtrlEnrollmentFee;
LLSpinCtrl *mSpinEnrollmentFee;
@ -109,6 +110,7 @@ private:
LLCheckBoxCtrl *mCtrlListGroup;
LLTextBox *mActiveTitleLabel;
LLComboBox *mComboActiveTitle;
LLComboBox *mComboMature;
LLGroupMgrGroupData::member_list_t::iterator mMemberProgress;
};

View File

@ -2983,7 +2983,7 @@ void register_viewer_callbacks(LLMessageSystem* msg)
//msg->setHandlerFunc("DirPicksReply", LLPanelDirBrowser::processDirPicksReply);
msg->setHandlerFunc("DirClassifiedReply", LLPanelDirBrowser::processDirClassifiedReply);
msg->setHandlerFunc("DirLandReply", LLPanelDirBrowser::processDirLandReply);
msg->setHandlerFunc("DirPopularReply",LLPanelDirBrowser::processDirPopularReply);
//msg->setHandlerFunc("DirPopularReply",LLPanelDirBrowser::processDirPopularReply);
msg->setHandlerFunc("AvatarPickerReply", LLFloaterAvatarPicker::processAvatarPickerReply);

View File

@ -515,7 +515,7 @@ public:
virtual void changed(U32 mask)
{
// JAMESDEBUG disabled for now - slows down client or causes crashes
// JC - Disabled for now - slows down client or causes crashes
// in inventory code.
//
// Also, this may not be faster than just rebuilding the menu each time.
@ -739,7 +739,7 @@ void init_menus()
// TomY TODO convert these two
LLMenuGL*menu;
// JAMESDEBUG - Maybe we don't want a global landmark menu
// JC - Maybe we don't want a global landmark menu
/*
menu = new LLMenuGL(LANDMARK_MENU_NAME);
// Defer init_landmark_menu() until inventory observer reports that we actually

View File

@ -53,6 +53,7 @@
#include "llfasttimerview.h"
#include "llviewerregion.h"
#include "llfloaterhtml.h"
#include "llviewerwindow.h" // *TODO: remove, only used for width/height
#include "llworld.h"
#include "llfeaturemanager.h"
#if LL_WINDOWS && LL_LCD_COMPILE
@ -748,7 +749,12 @@ void send_stats()
// If the current revision is recent, ping the previous author before overriding
LLSD &misc = body["stats"]["misc"];
// misc["string_1"] =
// Screen size so the UI team can figure out how big the widgets
// appear and use a "typical" size for end user tests.
S32 window_width = gViewerWindow->getWindowDisplayWidth();
S32 window_height = gViewerWindow->getWindowDisplayHeight();
misc["string_1"] = llformat("%.dx%d", window_width, window_height);
// misc["string_2"] =
misc["int_1"] = LLFloaterDirectory::sOldSearchCount; // Steve: 1.18.6
misc["int_2"] = LLFloaterDirectory::sNewSearchCount; // Steve: 1.18.6

View File

@ -114,12 +114,18 @@ public:
// ACCESSORS
//
LLView* getRootView() const { return mRootView; }
// Window in raw pixels as seen on screen.
const LLRect& getWindowRect() const { return mWindowRect; };
S32 getWindowDisplayHeight() const;
S32 getWindowDisplayWidth() const;
// Window in scaled pixels (via UI scale), use this for
// UI elements checking size.
const LLRect& getVirtualWindowRect() const { return mVirtualWindowRect; };
S32 getWindowHeight() const;
S32 getWindowWidth() const;
S32 getWindowDisplayHeight() const;
S32 getWindowDisplayWidth() const;
LLWindow* getWindow() const { return mWindow; }
void* getPlatformWindow() const { return mWindow->getPlatformWindow(); }
void focusClient() const { return mWindow->focusClient(); };

View File

@ -172,7 +172,6 @@ void LLWorldMap::eraseItems()
mInfohubs.clear();
mPGEvents.clear();
mMatureEvents.clear();
mPopular.clear();
mLandForSale.clear();
mClassifieds.clear();
}
@ -299,12 +298,6 @@ void LLWorldMap::setCurrentLayer(S32 layer, bool request_layer)
sendItemRequest(MAP_ITEM_MATURE_EVENT);
}
if (mPopular.size() == 0)
{
// Request for popular
sendItemRequest(MAP_ITEM_POPULAR);
}
if (mLandForSale.size() == 0)
{
// Request for Land For Sale
@ -763,12 +756,6 @@ void LLWorldMap::processMapItemReply(LLMessageSystem* msg, void**)
}
break;
}
case MAP_ITEM_POPULAR: // popular
{
new_item.mPosGlobal.mdV[VZ] = (F64)extra2;
LLWorldMap::getInstance()->mPopular.push_back(new_item);
break;
}
case MAP_ITEM_LAND_FOR_SALE: // land for sale
{
new_item.mToolTip = llformat("%d sq. m. L$%d", new_item.mExtra, new_item.mExtra2);

View File

@ -191,7 +191,6 @@ public:
item_info_list_t mInfohubs;
item_info_list_t mPGEvents;
item_info_list_t mMatureEvents;
item_info_list_t mPopular;
item_info_list_t mLandForSale;
item_info_list_t mClassifieds;

View File

@ -85,7 +85,6 @@ LLUIImagePtr LLWorldMapView::sTrackCircleImage = NULL;
LLUIImagePtr LLWorldMapView::sTrackArrowImage = NULL;
LLUIImagePtr LLWorldMapView::sClassifiedsImage = NULL;
LLUIImagePtr LLWorldMapView::sPopularImage = NULL;
LLUIImagePtr LLWorldMapView::sForSaleImage = NULL;
F32 LLWorldMapView::sThresholdA = 48.f;
@ -111,22 +110,21 @@ F32 CONE_SIZE = 0.6f;
void LLWorldMapView::initClass()
{
LLUUID image_id;
sAvatarYouSmallImage = LLUI::getUIImage("map_avatar_you_8.tga");
sAvatarSmallImage = LLUI::getUIImage("map_avatar_8.tga");
sAvatarLargeImage = LLUI::getUIImage("map_avatar_16.tga");
sAvatarAboveImage = LLUI::getUIImage("map_avatar_above_8.tga");
sAvatarBelowImage = LLUI::getUIImage("map_avatar_below_8.tga");
sHomeImage = LLUI::getUIImage("map_home.tga");
sTelehubImage = LLUI::getUIImage("map_telehub.tga");
sInfohubImage = LLUI::getUIImage("map_infohub.tga");
sEventImage = LLUI::getUIImage("map_event.tga");
sEventMatureImage = LLUI::getUIImage("map_event_mature.tga");
sTrackCircleImage = LLUI::getUIImage("map_track_16.tga");
sTrackArrowImage = LLUI::getUIImage("direction_arrow.tga");
sClassifiedsImage = LLUI::getUIImage("icon_top_pick.tga");
sPopularImage = LLUI::getUIImage("icon_popular.tga");
sForSaleImage = LLUI::getUIImage("icon_for_sale.tga");
}
@ -138,15 +136,16 @@ void LLWorldMapView::cleanupClass()
sAvatarLargeImage = NULL;
sAvatarAboveImage = NULL;
sAvatarBelowImage = NULL;
sTelehubImage = NULL;
sInfohubImage = NULL;
sHomeImage = NULL;
sEventImage = NULL;
sEventMatureImage = NULL;
sTrackCircleImage = NULL;
sTrackArrowImage = NULL;
sClassifiedsImage = NULL;
sPopularImage = NULL;
sForSaleImage = NULL;
}
@ -705,11 +704,6 @@ void LLWorldMapView::draw()
drawGenericItems(LLWorldMap::getInstance()->mClassifieds, sClassifiedsImage);
}
if (gSavedSettings.getBOOL("MapShowPopular"))
{
drawGenericItems(LLWorldMap::getInstance()->mPopular, sPopularImage);
}
if (gSavedSettings.getBOOL("MapShowEvents"))
{
drawEvents();
@ -1533,10 +1527,6 @@ void LLWorldMapView::handleClick(S32 x, S32 y, MASK mask,
{
(*it).mSelected = FALSE;
}
for (it = LLWorldMap::getInstance()->mPopular.begin(); it != LLWorldMap::getInstance()->mPopular.end(); ++it)
{
(*it).mSelected = FALSE;
}
for (it = LLWorldMap::getInstance()->mLandForSale.begin(); it != LLWorldMap::getInstance()->mLandForSale.end(); ++it)
{
(*it).mSelected = FALSE;
@ -1578,21 +1568,6 @@ void LLWorldMapView::handleClick(S32 x, S32 y, MASK mask,
}
}
if (gSavedSettings.getBOOL("MapShowPopular"))
{
for (it = LLWorldMap::getInstance()->mPopular.begin(); it != LLWorldMap::getInstance()->mPopular.end(); ++it)
{
LLItemInfo& popular = *it;
if (checkItemHit(x, y, popular, id, true))
{
*hit_type = MAP_ITEM_POPULAR;
mItemPicked = TRUE;
return;
}
}
}
if (gSavedSettings.getBOOL("MapShowLandForSale"))
{
for (it = LLWorldMap::getInstance()->mLandForSale.begin(); it != LLWorldMap::getInstance()->mLandForSale.end(); ++it)
@ -1796,12 +1771,6 @@ BOOL LLWorldMapView::handleDoubleClick( S32 x, S32 y, MASK mask )
LLFloaterDirectory::showEvents(event_id);
break;
}
case MAP_ITEM_POPULAR:
{
gFloaterWorldMap->close();
LLFloaterDirectory::showPopular(id);
break;
}
case MAP_ITEM_LAND_FOR_SALE:
{
gFloaterWorldMap->close();

View File

@ -149,7 +149,6 @@ public:
static LLUIImagePtr sTrackCircleImage;
static LLUIImagePtr sTrackArrowImage;
static LLUIImagePtr sClassifiedsImage;
static LLUIImagePtr sPopularImage;
static LLUIImagePtr sForSaleImage;
static F32 sThresholdA;